changeset 250:8d7edd77bfbf

Start hooking up NPC interactions.
author Simon Cross <hodgestar@gmail.com>
date Thu, 07 Apr 2011 23:57:22 +0200
parents 30ae3c681507
children 432f6997d306
files skaapsteker/engine.py skaapsteker/levelscene.py skaapsteker/sprites/base.py
diffstat 3 files changed, 60 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/skaapsteker/engine.py	Thu Apr 07 22:20:58 2011 +0200
+++ b/skaapsteker/engine.py	Thu Apr 07 23:57:22 2011 +0200
@@ -5,11 +5,12 @@
 import pygame.event
 from pygame.locals import QUIT, USEREVENT
 
-from .gamestate import GameState
 
 class Engine(object):
 
     def __init__(self):
+        # avoid circular imports
+        from .gamestate import GameState
         self._framerate = 60
         self._current_scene = None
         self._fpss = [self._framerate] * 100
@@ -105,3 +106,45 @@
     @classmethod
     def post(cls):
         super(PlayerDied, cls).post()
+
+class OpenDialog(UserEvent):
+
+    utype = "OPEN_DIALOG"
+
+    @classmethod
+    def post(cls, npc):
+        # request to open dialog box for given NPC sprite
+        # will do nothing if the NPC's current state has
+        # no text
+        super(OpenDialog, cls).post(npc=npc)
+
+class CloseDialog(UserEvent):
+
+    utype = "CLOSE_DIALOG"
+
+    @classmethod
+    def post(cls, npc):
+        # close dialog box for given NPC sprite
+        # will do nothing if the sprite has no dialog open
+        super(CloseDialog, cls).post(npc=npc)
+
+class NpcEvent(UserEvent): # TODO: Needed?
+
+    utype = "NPC_EVENT"
+
+    @classmethod
+    def post(cls, npc, ev):
+        """npc is an NPC sprite.
+           ev is a DsmEvent for that sprite.
+           """
+        super(NpcEvent, cls).post(npc=npc, ev=ev)
+
+class GlobalNpcEvent(UserEvent): # TODO: Needed?
+
+    utype = "GLOBAL_NPC_EVENT"
+
+    @classmethod
+    def post(cls, ev):
+        """Send a DsmEvent event to all NPCs.
+           """
+        super(GlobalNpcEvent, cls).post(ev=ev)
--- a/skaapsteker/levelscene.py	Thu Apr 07 22:20:58 2011 +0200
+++ b/skaapsteker/levelscene.py	Thu Apr 07 23:57:22 2011 +0200
@@ -86,6 +86,13 @@
             self._world.freeze()
             self._paused = True
 
+    def _open_dialog(self, npc):
+        print npc.dsm.get_state().text
+        engine.CloseDialog.post(npc)
+
+    def _close_dialog(self, npc):
+        pass
+
     def leave(self):
         """Freeze the scene, for serialization"""
         self._world.freeze()
@@ -133,11 +140,8 @@
         cr.center = self._player.collide_rect.move(0, -level.TILE_SIZE[0]).midbottom
         cr.clamp_ip(lr)
 
-
     def dispatch(self, ev):
-        if engine.PlayerDied.matches(ev):
-            self._player_dead = True
-        elif ev.type is KEYDOWN:
+        if ev.type is KEYDOWN:
             if self._player_dead:
                 if ev.key in self._restart_keys:
                     self._restart()
@@ -152,3 +156,9 @@
         elif ev.type is KEYUP:
             if ev.key in self._fast_key_map:
                 self._fast_keys_down.discard(ev.key)
+        elif engine.PlayerDied.matches(ev):
+            self._player_dead = True
+        elif engine.OpenDialog.matches(ev):
+            self._open_dialog(ev.npc)
+        elif engine.CloseDialog.matches(ev):
+            self._close_dialog(ev.npc)
--- a/skaapsteker/sprites/base.py	Thu Apr 07 22:20:58 2011 +0200
+++ b/skaapsteker/sprites/base.py	Thu Apr 07 23:57:22 2011 +0200
@@ -7,6 +7,7 @@
 
 from ..physics import Sprite
 from ..constants import Layers
+from ..engine import OpenDialog
 from .. import data
 from .. import dialogue
 
@@ -199,9 +200,8 @@
     def setup(self, name, world, dsm, state):
         self.dsm = dialogue.DSM(name, world, dsm, state)
 
-
     def collided_player(self, player):
-        print "%s is ignoring player" % self
+        OpenDialog.post(self)
 
 
 class Projectile(GameSprite):