home · contact · privacy
Add SWITCH_PLAYER debugging command for switching player.
[plomrogue2-experiments] / server_ / game.py
index 968d30146a6b516fa4331631ccd1de9b0317b3fc..5ba3ab23ba4a39b04267807c8c3c535e5d4f103d 100644 (file)
@@ -83,10 +83,12 @@ class Task:
                 direction = self.kwargs['direction']
             test_pos = self.thing.world.map_.move(self.thing.position, direction)
             if self.thing.world.map_[test_pos] != '.':
-                raise GameError('would move into illegal terrain')
+                raise GameError(str(self.thing.id_) +
+                                ' would move into illegal terrain')
             for t in self.thing.world.things:
                 if t.position == test_pos:
-                    raise GameError('would move into other thing')
+                    raise GameError(str(self.thing.id_) +
+                                    ' would move into other thing')
 
 
 class Thing(game_common.Thing):
@@ -104,16 +106,7 @@ class Thing(game_common.Thing):
         self.position = self.world.map_.move(self.position, direction)
         return 'success'
 
-    def decide_task(self):
-        visible_things = self.get_visible_things()
-        target = None
-        for t in visible_things:
-            if t.type_ == 'human':
-                target = t.position
-                break
-        if target is None:
-            self.set_task('wait')
-            return
+    def move_towards_target(self, target):
         dijkstra_map = type(self.world.map_)(self.world.map_.size)
         n_max = 256
         dijkstra_map.terrain = [n_max for i in range(dijkstra_map.size_i)]
@@ -162,8 +155,21 @@ class Thing(game_common.Thing):
         if direction:
             self.set_task('move', direction=direction)
             #self.world.game.io.send('would move ' + direction)
-        else:
-            self.set_task('wait')
+
+    def decide_task(self):
+        visible_things = self.get_visible_things()
+        target = None
+        for t in visible_things:
+            if t.type_ == 'human':
+                target = t.position
+                break
+        if target is not None:
+            try:
+                self.move_towards_target(target)
+                return
+            except GameError:
+                pass
+        self.set_task('wait')
 
 
     def set_task(self, task_name, *args, **kwargs):
@@ -189,7 +195,10 @@ class Thing(game_common.Thing):
             self.task = None
             self.last_task_result = e
             if is_AI:
-                self.decide_task()
+                try:
+                    self.decide_task()
+                except GameError:
+                    self.set_task('wait')
             return
         self.task.todo -= 1
         if self.task.todo <= 0:
@@ -197,7 +206,10 @@ class Thing(game_common.Thing):
             self.last_task_result = task(*self.task.args, **self.task.kwargs)
             self.task = None
         if is_AI and self.task is None:
-            self.decide_task()
+            try:
+                self.decide_task()
+            except GameError:
+                self.set_task('wait')
 
     def get_stencil(self):
         if self._stencil is not None:
@@ -323,6 +335,17 @@ class Game(game_common.CommonCommandsMixin):
         self.proceed()
     cmd_MOVE.argtypes = 'string'
 
+    def cmd_SWITCH_PLAYER(self):
+        player = self.world.get_player()
+        player.set_task('wait')
+        thing_ids = [t.id_ for t in self.world.things]
+        player_index = thing_ids.index(player.id_)
+        if player_index == len(thing_ids) - 1:
+            self.world.player_id = thing_ids[0]
+        else:
+            self.world.player_id = thing_ids[player_index + 1]
+        self.proceed()
+
     def cmd_WAIT(self):
         """Set player task to 'wait', finish player turn."""
         self.world.get_player().set_task('wait')