home · contact · privacy
Add door keys and door locking.
[plomrogue2] / plomrogue / tasks.py
index fced65036f94fa122afd07b9d634a76931c6535a..6ee273164f19dd33422c99c21d708f71cab21dc8 100644 (file)
@@ -187,6 +187,23 @@ class Task_DROP(Task):
 
 class Task_DOOR(Task):
 
+    def check(self):
+        action_radius = list(self.thing.game.map_geometry.
+                             get_neighbors_yxyx(self.thing.position).values())
+        reachable_doors = [t for t in self.thing.game.things if
+                           t.type_ == 'Door' and t.position in action_radius]
+        if len(reachable_doors) == 0:
+            raise PlayError('not standing next to a door to open/close')
+        for door in reachable_doors:
+            if not door.blocks_movement:
+                return
+            if not door.locked:
+                return
+            if self.thing.carrying and self.thing.carrying.type_ == 'DoorKey'\
+               and self.thing.carrying.door == door:
+                return
+        raise PlayError('cannot open locked door without its key')
+
     def do(self):
         action_radius = list(self.thing.game.map_geometry.
                              get_neighbors_yxyx(self.thing.position).values())
@@ -196,6 +213,11 @@ class Task_DOOR(Task):
                 t.open()
             else:
                 t.close()
+                if self.thing.carrying and\
+                   self.thing.carrying.type_ == 'DoorKey' and\
+                   self.thing.carrying.door == t:
+                    self.thing.send_msg('CHAT "You lock the door."')
+                    t.lock()
             self.thing.game.record_change(t.position, 'other')
             self.thing.game.record_change(t.position, 'fov')