changeset 290:c68f2f3efc7f

Item dropping and swapping.
author Jeremy Thurgood <firxen@gmail.com>
date Fri, 08 Apr 2011 21:58:48 +0200
parents 16ffe6f5dbb8
children 04be4219742b
files skaapsteker/engine.py skaapsteker/levelscene.py skaapsteker/sprites/player.py
diffstat 3 files changed, 39 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/skaapsteker/engine.py	Fri Apr 08 21:44:39 2011 +0200
+++ b/skaapsteker/engine.py	Fri Apr 08 21:58:48 2011 +0200
@@ -151,3 +151,14 @@
         """Send a DsmEvent event to all NPCs.
            """
         super(GlobalNpcEvent, cls).post(ev=ev)
+
+
+class ItemRepopulationEvent(UserEvent): # TODO: Needed?
+
+    utype = "ITEM_REPOPULATION_EVENT"
+
+    @classmethod
+    def post(cls, item):
+        """Put a Sprite back in the world.
+           """
+        super(ItemRepopulationEvent, cls).post(item=item)
--- a/skaapsteker/levelscene.py	Fri Apr 08 21:44:39 2011 +0200
+++ b/skaapsteker/levelscene.py	Fri Apr 08 21:58:48 2011 +0200
@@ -52,7 +52,6 @@
         self._player.set_pos(doorway._starting_tile_pos)
 
         # Double tap stuff
-        self._last_keys_down = []
         self._last_keydown_time = None
         self._last_keyup_time = None
 
@@ -66,11 +65,11 @@
             K_LEFT: action('left'),
             K_RIGHT: action('right'),
             K_UP: action('up'),
-            K_DOWN: action('down'),
         }
         self._fast_keys_down = set()
 
         self._slow_key_map = {
+            K_DOWN: action('down'),
             K_ESCAPE: self._quit,
             K_p: self._toggle_pause,
         }
@@ -85,7 +84,7 @@
         self._key_tap_map = {
                 (K_LEFT, K_LEFT) : action('double_left'),
                 (K_RIGHT, K_RIGHT) : action('double_right'),
-                (K_DOWN, K_DOWN) : action('double_down'),
+                (K_UP, K_UP) : action('double_up'),
                 }
 
     def _quit(self, pause=True):
@@ -240,3 +239,5 @@
             self._open_dialogue(ev.npc)
         elif engine.CloseDialog.matches(ev):
             self._close_dialogue()
+        elif engine.ItemRepopulationEvent.matches(ev):
+            self._world.add(ev.item)
--- a/skaapsteker/sprites/player.py	Fri Apr 08 21:44:39 2011 +0200
+++ b/skaapsteker/sprites/player.py	Fri Apr 08 21:58:48 2011 +0200
@@ -3,11 +3,11 @@
 import pygame.transform
 import time
 
-from ..sprites.base import TILE_SIZE, PC_LAYER, MONSTER_LAYER
+from ..sprites.base import find_sprite, TILE_SIZE, PC_LAYER, MONSTER_LAYER
 from ..physics import Sprite
 from ..constants import Layers
 from ..data import get_files, load_image
-from ..engine import PlayerDied
+from ..engine import PlayerDied, ItemRepopulationEvent
 
 
 class Player(Sprite):
@@ -200,15 +200,15 @@
         self.sprinting = 2
         self._sprint_start_time = time.time()
 
-    def action_double_down(self):
-        print 'double down tap'
-
     def action_double_right(self):
         if self.sprinting > 0:
             return
         self.sprinting =  2
         self._sprint_start_time = time.time()
 
+    def action_double_up(self):
+        pass
+
     def action_right(self):
         if self.facing != 'right':
             self.facing = 'right'
@@ -227,8 +227,10 @@
 
     def action_down(self):
         print self._touching_actionables
-        for actionable in self._touching_actionables[:1]:
-            actionable.player_action(self)
+        if self._touching_actionables:
+            self._touching_actionables[0].player_action(self)
+        elif self.the_world.fox.item is not None:
+            self.drop_item()
 
 
     def action_fire1(self):
@@ -291,11 +293,23 @@
                             self._image_dict[sprint_key].append(sprint_image)
 
 
-    def take_item(self, item):
+    def drop_item(self):
         my_item = self.the_world.fox.item
-        if my_item is not None:
-            print "I already have", my_item
+        if my_item is None:
             return
+        self.the_world.fox.item = None
+        world_item = getattr(self.the_world.items, my_item)
+        world_item.level = self.the_world.fox.level
+        world_item.pos = [a/b for a, b in zip(self.rect.center, TILE_SIZE)]
+        sprite_dict = world_item.copy()
+        sprite_dict.pop('level')
+        sprite_dict['name'] = my_item
+        sprite_dict['world'] = self.the_world
+        ItemRepopulationEvent.post(find_sprite(sprite_dict, 'items'))
+
+
+    def take_item(self, item):
+        self.drop_item()
         getattr(self.the_world.items, item.name).level = "_limbo"
         self.the_world.fox.item = item.name
         item.kill()