Fix skip_player implementation.
[naja.git] / naja / gameboard.py
index 7d9dfafe1c44b30b160da7d1ba276858ebfa5504..894f2b31f052b1464a6cdb1876187a5aefc8d55c 100644 (file)
@@ -56,6 +56,8 @@ class GameBoard(object):
         if wins_required is None:
             wins_required = defaults['wins_required']
 
+        assert wins_required + max_health == 8
+
         # Overriden by command line
         if options.initial_bits:
             initial_bits = options.initial_bits
@@ -186,7 +188,7 @@ class GameBoard(object):
         # Find which cards are at their maximum and exclude them from
         # the choice list
         counts = {}
-        choices = {card['card_name']: card for card in cards}
+        choices = dict((card['card_name'], card) for card in cards)
         for pos, card in board_locations:
             if pos == position:
                 # skip the card we're replacing if appropriate
@@ -204,30 +206,34 @@ class GameBoard(object):
                     del choices[key]
         return choice(choices.values())
 
-    def shift_location_row(self, change, is_vertical):
+    def shift_location_row(self, change, is_vertical, skip_player=True):
         px, py = self.player.position
         shifted_locations = {}
         mkpos = lambda i: (px, i) if is_vertical else (i, py)
 
         for i in range(5):
-            if (px, py) == mkpos(i):
+            if skip_player and (px, py) == mkpos(i):
                 continue
             new_i = (i + change) % 5
-            if (px, py) == mkpos(new_i):
+            if skip_player and (px, py) == mkpos(new_i):
                 new_i = (new_i + change) % 5
             shifted_locations[mkpos(new_i)] = self.board_locations[mkpos(i)]
 
         self.board_locations.update(shifted_locations)
 
-    def shift_locations(self, direction):
+    def shift_locations(self, direction, skip_player=True):
         if BITS[direction] == BITS.NORTH:
-            self.shift_location_row(-1, is_vertical=True)
+            self.shift_location_row(-1, is_vertical=True,
+                                    skip_player=skip_player)
         elif BITS[direction] == BITS.SOUTH:
-            self.shift_location_row(1, is_vertical=True)
+            self.shift_location_row(1, is_vertical=True,
+                                    skip_player=skip_player)
         elif BITS[direction] == BITS.EAST:
-            self.shift_location_row(1, is_vertical=False)
+            self.shift_location_row(1, is_vertical=False,
+                                    skip_player=skip_player)
         elif BITS[direction] == BITS.WEST:
-            self.shift_location_row(-1, is_vertical=False)
+            self.shift_location_row(-1, is_vertical=False,
+                                    skip_player=skip_player)
 
     def rotate_locations(self, direction):
         px, py = self.player.position
@@ -303,6 +309,9 @@ class LocationCard(object):
         self.actions = location_actions
         self.max_number = max_number
         self.replacement_time = replacement_time
+        if options.debug:
+            for action in self.actions:
+                action.sanity_check(self)
 
     @classmethod
     def import_location(cls, state):