Mercurial > skaapsteker
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):