Ability to move player with location.
[naja.git] / naja / player.py
index b471c625135d4aea0d58af975a86e0a59e81c2a8..d47e82682cce298a57424eaae1918d3f100e9615 100644 (file)
@@ -50,10 +50,12 @@ class PlayerBits(object):
             self.toggle_bit(bit)
 
     def shift_bits_left(self, shift):
-        self.bits <<= shift
+        wrap = self.bits >> (8 - shift)
+        self.bits = (self.bits << shift & 0xff | wrap)
 
     def shift_bits_right(self, shift):
-        self.bits >>= shift
+        wrap = self.bits << (8 - shift) & 0xff
+        self.bits = (self.bits >> shift | wrap)
 
 
 class Player(object):
@@ -61,17 +63,19 @@ class Player(object):
     A representation of the player.
     """
 
-    def __init__(self, bits, position, movement_mode=None):
+    def __init__(self, bits, position, movement_mode=None, gameboard=None):
         self.bits = PlayerBits(bits)
         self.position = position
         self.movement_mode = movement_mode if movement_mode else MOVES.ADJACENT
+        self.gameboard = gameboard
 
     @classmethod
-    def import_player(cls, definition):
+    def import_player(cls, definition, gameboard=None):
         return cls(
             definition['bits'],
             tuple(definition['position']),
-            definition['movement_mode'])
+            definition['movement_mode'],
+            gameboard=gameboard)
 
     def export(self):
         return {
@@ -147,6 +151,26 @@ class Player(object):
             return True
         return False
 
+    def force_position(self, pos, delta=True):
+        if delta:
+            pos = (self.position[0] + pos[0],
+                   self.position[1] + pos[1])
+        if (0 <= pos[0] < 5 and 0 <= pos[1] < 5):
+            self.position = pos
+
+    def set_gameboard(self, gameboard):
+        self.gameboard = gameboard
+
+    def pos_has_action(self, pos):
+        card = self.gameboard.board_locations[pos]
+        for action in card.actions:
+            if self.bits.check_bits(action.required_bits):
+                return True
+        return False
+
+    def filter_moves_with_no_actions(self, positions):
+        return [pos for pos in positions if self.pos_has_action(pos)]
+
     def legal_moves(self):
         POSITION_FUNCTION = {
             MOVES.ADJACENT: self.get_adjacent_positions,
@@ -154,7 +178,8 @@ class Player(object):
             MOVES.BISHOP: self.get_bishop_positions,
             MOVES.CASTLE: self.get_castle_positions,
         }
-        return POSITION_FUNCTION[self.movement_mode]()
+        positions = POSITION_FUNCTION[self.movement_mode]()
+        return self.filter_moves_with_no_actions(positions)
 
     def allow_chess_move(self, chesspiece):
         self.movement_mode = chesspiece