-from naja.constants import BITS, MOVES, CHESS_PIECES
+from naja.constants import BITS, MOVES
class PlayerBits(object):
for bit in bits:
self.toggle_bit(bit)
+ def shift_bits_left(self, shift):
+ wrap = self.bits >> (8 - shift)
+ self.bits = (self.bits << shift & 0xff | wrap)
+
+ def shift_bits_right(self, shift):
+ wrap = self.bits << (8 - shift) & 0xff
+ self.bits = (self.bits >> shift | wrap)
+
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):
- return cls(definition['bits'], tuple(definition['position']), definition['movement_mode'])
+ def import_player(cls, definition, gameboard=None):
+ return cls(
+ definition['bits'],
+ tuple(definition['position']),
+ definition['movement_mode'],
+ gameboard=gameboard)
def export(self):
return {
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,
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