home · contact · privacy
Add crates.
[plomrogue2] / plomrogue / tasks.py
index 14ea820bd153e20f016af575d59d74c110023826..95945055e0f7e15923bc34780a985c2b3a5ea556 100644 (file)
@@ -75,6 +75,9 @@ class Task_MOVE(Task):
             self.thing.game.record_change(self.thing.position, 'fov')
         if self.thing.carrying:
             self.thing.carrying.position = self.thing.position
+            if self.thing.carrying.type_ == 'Crate':
+                for t in self.thing.carrying.content:
+                    t.position = self.thing.position
 
 
 
@@ -139,6 +142,11 @@ class Task_PICK_UP(Task):
         to_pick_up.position = self.thing.position[:]
         self.thing.carrying = to_pick_up
         to_pick_up.carried = True
+        for t in [t for t in self.thing.game.things
+                  if t.type_ == 'Crate' and to_pick_up in t.content]:
+            t.remove_from_crate(to_pick_up)
+            self.thing.send_msg('CHAT "You take the item out of the crate."')
+            break
         self.thing.game.record_change(self.thing.position, 'other')
 
 
@@ -150,42 +158,43 @@ class Task_DROP(Task):
         if not self.thing.carrying:
             raise PlayError('nothing to drop')
         target_position = self._get_move_target()
-        if self.thing.carrying.type_ == 'Bottle' and self.thing.carrying.full:
-            for t in [t for t in self.thing.game.things
-                      if t.type_ == 'BottleDeposit'
-                      and t.position == target_position]:
-                raise PlayError('cannot drop full bottle into bottle deposit')
-        for t in [t for t in self.thing.game.things
-                  if t.type_ == 'CookieSpawner'
-                  and t.position == target_position]:
-            if not self.thing.carrying.cookable:
+        targets = [t for t in self.thing.game.things
+                   if t.position == target_position
+                   and not t == self.thing.carrying]
+        for target in targets:
+            if target.type_ == 'CookieSpawner' and\
+               not self.thing.carrying.cookable:
                 raise PlayError('cannot cook items of this type')
-            break
+            elif target.type_ == 'BottleDeposit':
+                if not self.thing.carrying.type_ == 'Bottle':
+                    raise PlayError('cannot only put bottle into bottle deposit')
+                if self.thing.carrying.full:
+                    raise PlayError('cannot drop full '
+                                    'bottle into bottle deposit')
+            elif target.type_ == 'Crate' and\
+                 self.thing.carrying.type_ == 'Crate':
+                raise PlayError('cannot put crate into crate')
 
     def do(self):
         target_position = self._get_move_target()
         dropped = self.thing.uncarry()
         dropped.position = target_position
-        over_cookie_spawner = None
-        for t in [t for t in self.thing.game.things
-                  if t.type_ == 'CookieSpawner'
-                  and t.position == dropped.position]:
-            over_cookie_spawner = t
-            break
-        if over_cookie_spawner:
-            over_cookie_spawner.accept(dropped)
-            self.thing.game.remove_thing(dropped)
-        elif dropped.type_ == 'Bottle' and not dropped.full:
-            for t in [t for t in self.thing.game.things
-                      if t.type_ == 'BottleDeposit'
-                      and t.position == dropped.position]:
-                t.accept()
+        targets = [t for t in self.thing.game.things
+                   if t.position == dropped.position and not t == dropped]
+        for target in targets:
+            if target.type_ == 'CookieSpawner':
+                target.accept(dropped)
                 self.thing.game.remove_thing(dropped)
                 break
-        elif dropped.type_ == 'Hat':
-            for t in [t for t in self.thing.game.things
-                      if t.type_ == 'HatRemixer'
-                      and t.position == dropped.position]:
+            elif target.type_ == 'BottleDeposit':
+                target.accept()
+                self.thing.game.remove_thing(dropped)
+                break
+            elif target.type_ == 'Crate':
+                target.accept(dropped)
+                self.thing.send_msg('CHAT "You put the item into the crate."')
+                break
+            elif target.type_ == 'HatRemixer':
                 t.accept(dropped)
                 break
         self.thing.game.record_change(self.thing.position, 'other')