changeset 251:432f6997d306

More hooking up of interacting with NPCs.
author Simon Cross <hodgestar@gmail.com>
date Fri, 08 Apr 2011 00:40:34 +0200
parents 8d7edd77bfbf
children ecd26fafbe70
files skaapsteker/dialogue.py skaapsteker/levelscene.py skaapsteker/sprites/base.py
diffstat 3 files changed, 35 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/skaapsteker/dialogue.py	Thu Apr 07 23:57:22 2011 +0200
+++ b/skaapsteker/dialogue.py	Fri Apr 08 00:40:34 2011 +0200
@@ -28,6 +28,9 @@
     def get_state(self):
         return self.states[self.state]
 
+    def has_text(self):
+        return bool(self.states[self.state].text)
+
     def event(self, ev):
         my_locals = {
             "state": self.states,
--- a/skaapsteker/levelscene.py	Thu Apr 07 23:57:22 2011 +0200
+++ b/skaapsteker/levelscene.py	Fri Apr 08 00:40:34 2011 +0200
@@ -11,6 +11,7 @@
 from . import physics
 from .sprites import player
 from .widgets.text import Text
+from .widgets.bubble import DialogueWidget
 
 
 class LevelScene(engine.Scene):
@@ -22,6 +23,7 @@
         self._level = level.Level(leveldef, self._player)
         self._leveldef = leveldef
         self._player_dead = False
+        self._dialogue = None
 
         self._level_surface = self._level.get_surface()
         self._clip_rect = None
@@ -86,12 +88,20 @@
             self._world.freeze()
             self._paused = True
 
-    def _open_dialog(self, npc):
-        print npc.dsm.get_state().text
-        engine.CloseDialog.post(npc)
+    def _open_dialogue(self, npc):
+        if npc.dsm.has_text():
+            if self._dialogue is not None:
+                self._dialogue.close()
+            self._world.freeze()
+            self._dialogue = DialogueWidget(npc)
+        else:
+            self._close_dialogue()
 
-    def _close_dialog(self, npc):
-        pass
+    def _close_dialogue(self):
+        if self._dialogue is not None:
+            self._world.thaw()
+            self._dialogue.close()
+            self._dialogue = None
 
     def leave(self):
         """Freeze the scene, for serialization"""
@@ -107,7 +117,7 @@
         if self._clip_rect is None:
             self._clip_rect = pygame.Rect((0, 0), screen_surface.get_size())
 
-        if not self._paused:
+        if not self._paused and not self._dialogue:
             for key in self._fast_keys_down:
                 self._fast_key_map[key]()
             self._world.update()
@@ -117,6 +127,8 @@
         self._level_surface.set_clip(self._clip_rect)
         self._level.draw(self._level_surface)
         self._world.draw(self._level_surface)
+        if self._dialogue:
+            self._dialogue.draw(self._level_surface)
 
         fps_text_pos = self._clip_rect.left + 10, self._clip_rect.top + 10
         fps_text = Text('FPS: %.1f' % engine.get_fps(), fps_text_pos, shadow='white')
@@ -148,6 +160,9 @@
                 elif ev.key in self._quit_keys:
                     self._quit(False)
                 return
+            if self._dialogue:
+                self._dialogue.dispatch(ev)
+                return
             if ev.key in self._fast_key_map:
                 self._fast_keys_down.add(ev.key)
             action = self._slow_key_map.get(ev.key)
@@ -159,6 +174,6 @@
         elif engine.PlayerDied.matches(ev):
             self._player_dead = True
         elif engine.OpenDialog.matches(ev):
-            self._open_dialog(ev.npc)
+            self._open_dialogue(ev.npc)
         elif engine.CloseDialog.matches(ev):
-            self._close_dialog(ev.npc)
+            self._close_dialogue()
--- a/skaapsteker/sprites/base.py	Thu Apr 07 23:57:22 2011 +0200
+++ b/skaapsteker/sprites/base.py	Fri Apr 08 00:40:34 2011 +0200
@@ -196,12 +196,20 @@
     def __init__(self, pos, **opts):
         AnimatedGameSprite.__init__(self, pos, **opts)
         self._layer = Layers.PLAYER
+        self._ticks_before_interact = 0
 
     def setup(self, name, world, dsm, state):
         self.dsm = dialogue.DSM(name, world, dsm, state)
 
     def collided_player(self, player):
-        OpenDialog.post(self)
+        if self._ticks_before_interact == 0:
+            self._ticks_before_interact = 60
+            OpenDialog.post(self)
+
+    def update(self):
+        super(NPC, self).update()
+        if self._ticks_before_interact > 0:
+            self._ticks_before_interact -= 1
 
 
 class Projectile(GameSprite):