home · contact · privacy
Add door keys and door locking.
[plomrogue2] / plomrogue / tasks.py
index 4cf8700b1f5b93473fabb70c3acedf471167667d..6ee273164f19dd33422c99c21d708f71cab21dc8 100644 (file)
@@ -190,9 +190,19 @@ class Task_DOOR(Task):
     def check(self):
         action_radius = list(self.thing.game.map_geometry.
                              get_neighbors_yxyx(self.thing.position).values())
-        if len([t for t in self.thing.game.things if
-                  t.type_ == 'Door' and t.position in action_radius]) == 0:
+        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.
@@ -203,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')