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