# HG changeset patch # User Adrianna PiƄska # Date 1302283128 -7200 # Node ID bcdfd2be2eb4cda467dfb154695ce1b42990b564 # Parent e006ec7b3d8f17b8919c6f4252992ef2b2634974# Parent 95e2ef31e714a7e5ff8fe534280f103211dcc8b3 Merged changes, I hope. diff -r e006ec7b3d8f -r bcdfd2be2eb4 data/levels/temple.json diff -r e006ec7b3d8f -r bcdfd2be2eb4 skaapsteker/levelscene.py --- a/skaapsteker/levelscene.py Fri Apr 08 19:12:44 2011 +0200 +++ b/skaapsteker/levelscene.py Fri Apr 08 19:18:48 2011 +0200 @@ -42,6 +42,7 @@ self._world.add(self._player) self._build_action_map() + self._key_sequence = [] def setup_player(self): doorway = self._level.doorways[self.game_state.world.player.doorway] @@ -181,8 +182,6 @@ self._key_sequence = [] return False - print ev - if ev.type is KEYUP: if (not self._key_sequence or ev.key != self._key_sequence[-1] diff -r e006ec7b3d8f -r bcdfd2be2eb4 skaapsteker/physics.py --- a/skaapsteker/physics.py Fri Apr 08 19:12:44 2011 +0200 +++ b/skaapsteker/physics.py Fri Apr 08 19:18:48 2011 +0200 @@ -174,6 +174,8 @@ self._mobiles = pygame.sprite.Group() self._gravitators = pygame.sprite.Group() self._updaters = pygame.sprite.Group() + self._actionables = pygame.sprite.Group() + self._actors = pygame.sprite.Group() self._collision_groups = { None: pygame.sprite.Group() } self._last_time = None @@ -199,6 +201,10 @@ if sprite.wants_updates: self._updaters.add(sprite) sprite.collision_group = self._collision_groups[sprite.collision_layer] + if getattr(sprite, 'player_action', None) is not None: + self._actionables.add(sprite) + if getattr(sprite, 'add_actionable', None) is not None: + self._actors.add(sprite) def _add_collision_group(self, layer): if layer in self._collision_groups: @@ -287,6 +293,14 @@ # call update methods self._updaters.update() + # Action stuff. + # Happens after updates, because we only want it for the next frame. + for sprite in self._actors: + for other in self._actionables: + if sprite.collide_rect.colliderect(other.collide_rect): + sprite.add_actionable(other) + + def draw(self, surface): self._all.draw(surface) if options['debug_rects']: diff -r e006ec7b3d8f -r bcdfd2be2eb4 skaapsteker/sprites/base.py --- a/skaapsteker/sprites/base.py Fri Apr 08 19:12:44 2011 +0200 +++ b/skaapsteker/sprites/base.py Fri Apr 08 19:18:48 2011 +0200 @@ -192,30 +192,22 @@ class NPC(AnimatedGameSprite): collision_layer = NPC_LAYER - collides_with = set([PC_LAYER]) debug_color = (240, 240, 240) bounce_factor = (0, 0) # NPC's don't bounce by default block = False + actionable = True 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): - if self._ticks_before_interact == 0: - self._ticks_before_interact = 120 - OpenDialog.post(self) - - def update(self): - super(NPC, self).update() - if self._ticks_before_interact > 0: - self._ticks_before_interact -= 1 + def player_action(self, player): + OpenDialog.post(self) class Projectile(GameSprite): @@ -226,10 +218,10 @@ mobile = False gravitates = False - collision_layer = MONSTER_LAYER - collides_with = set([PC_LAYER]) + collision_layer = NPC_LAYER portable = True + actionable = True def __init__(self, pos, **opts): GameSprite.__init__(self, pos, **opts) @@ -247,7 +239,7 @@ return (0, 0, 240) - def collided_player(self, player): + def player_action(self, player): print "Player touched %s" % self player.take_item(self) @@ -258,6 +250,7 @@ gravitates = False collides_with = set([PC_LAYER, MONSTER_LAYER, NPC_LAYER]) is_ground = True + actionable = False bounce_factor = (0.0, 0.0) def __init__(self, pos, image): @@ -282,19 +275,12 @@ class Doorway(GameSprite): mobile = False gravitates = False - collides_with = set([PC_LAYER]) - wants_updates = True blocks = False + actionable = True image_file = 'torii.png' - debug_color = (120, 240, 120) - - def __init__(self, pos, **opts): - GameSprite.__init__(self, pos, **opts) - self._ticks_before_interact = 120 - def setup_image_data(self, pos): super(Doorway, self).setup_image_data(pos) @@ -309,16 +295,7 @@ print leadsto - def update(self): - super(Doorway, self).update() - if self._ticks_before_interact > 0: - self._ticks_before_interact -= 1 - - - def collided_player(self, player): - if self._ticks_before_interact != 0: - return - self._ticks_before_interact = 120 + def player_action(self, player): print "Player touched %s" % self from .. import engine, levelscene engine.ChangeScene.post((levelscene.LevelScene, self.leadsto)) @@ -326,7 +303,7 @@ class StartingDoorway(Doorway): - collides_with = set() + actionable = False def setup_image_data(self, pos): self.image = pygame.Surface((0, 0)) @@ -338,12 +315,6 @@ Doorway.setup(self, facing, None) - def collided_player(self, player): - print "Player touched %s" % self - from .. import engine, levelscene - engine.ChangeScene.post((levelscene.LevelScene, self.leadsto)) - - def find_sprite(descr, mod_name=None): """Create a sprite object from a dictionary describing it.""" diff -r e006ec7b3d8f -r bcdfd2be2eb4 skaapsteker/sprites/player.py --- a/skaapsteker/sprites/player.py Fri Apr 08 19:12:44 2011 +0200 +++ b/skaapsteker/sprites/player.py Fri Apr 08 19:18:48 2011 +0200 @@ -71,6 +71,7 @@ self.init_pos() def update(self): + self._touching_actionables = [] v_x, v_y = self.velocity # Never animate slower than !7 fps, never faster than ~15 fps if self.attacking > 0: @@ -225,7 +226,10 @@ self.on_solid = False def action_down(self): - self.deltav((0.0, 100.0)) + print self._touching_actionables + for actionable in self._touching_actionables[:1]: + actionable.player_action(self) + def action_fire1(self): # FIXME: Use the correct tail properties for this @@ -296,3 +300,7 @@ self.the_world.fox.item = item.name item.kill() print "took", item + + + def add_actionable(self, actionable): + self._touching_actionables.append(actionable)