# This field is ignored, but it's a useful place to put some action definitions
# we can reference later.
_standard_actions:
- bad_default: &SET-BITS-DEFAULT
+ set_bits_default: &SET-BITS-DEFAULT
action_class: 'LoseHealthOrMSBAndSetBits'
required_bits: []
+ gain_health_default: &GAIN-HEALTH-DEFAULT
+ action_class: 'GainHealthAndClearBitsOrMSB'
+ required_bits: []
bad_default: &BAD-DEFAULT
action_class: 'LoseHealthOrMSB'
required_bits: []
- actions:
- *BAD-DEFAULT
- *ACQUIRE-WIN-TOKEN
+ - actions:
+ - *GAIN-HEALTH-DEFAULT
+ - *TOGGLE-BITS-C
\ No newline at end of file
board.player.bits.clear_bits(set([
BITS.CYAN, BITS.MAGENTA, BITS.YELLOW,
]))
+
+
+class GainHealthAndClearBitsOrMSB(LocationAction):
+ TEXT = "Gain health, then clear bits specified by this location or MSB."
+ USES_MSB = True
+
+ def perform_action(self, board, location):
+ board.gain_health()
+ if not self.check_and_clear_MSB(board.player):
+ board.player.bits.clear_bits(location.bitwise_operand)
self.health -= 1
# TODO: Check win/lose
+ def gain_health(self):
+ if self.health < self.max_health:
+ self.health += 1
+
def acquire_win_token(self):
self.wins += 1
# TODO: Check win/lose
self.assert_state(
state_before, state_after, exclude=['wins'],
player_exclude=['bits'])
+
+ def test_GainHealthAndClearBitsOrMSB_MSB_clear(self):
+ board = self.make_board(player_bits=[BITS.NORTH])
+ board.lose_health()
+ state_before = board.export()
+ card = LocationCard(set([BITS.CYAN, BITS.NORTH]), [])
+ actions.GainHealthAndClearBitsOrMSB(set()).perform_action(board, card)
+ state_after = board.export()
+ self.assertEqual(state_after['health'], state_before['health'] + 1)
+ self.assert_player_bits(board)
+ self.assert_state(
+ state_before, state_after, exclude=['health'],
+ player_exclude=['bits'])
+
+ def test_GainHealthAndClearBitsOrMSB_MSB_set(self):
+ board = self.make_board(player_bits=[BITS.MSB, BITS.NORTH])
+ board.lose_health()
+ state_before = board.export()
+ card = LocationCard(set([BITS.CYAN, BITS.NORTH]), [])
+ actions.GainHealthAndClearBitsOrMSB(set()).perform_action(board, card)
+ state_after = board.export()
+ self.assertEqual(state_after['health'], state_before['health'] + 1)
+ self.assert_player_bits(board, BITS.NORTH)
+ self.assert_state(
+ state_before, state_after, exclude=['health'],
+ player_exclude=['bits'])
class TestGameBoard(TestCase):
+ def assert_state(self, state1, state2, exclude=(), player_exclude=()):
+ def filter_dict(source, exclude_keys):
+ return dict((k, v) for k, v in source.items()
+ if k not in exclude_keys)
+
+ state1 = filter_dict(state1, exclude)
+ if 'player' in state1:
+ state1['player'] = filter_dict(state1['player'], player_exclude)
+ state2 = filter_dict(state2, exclude)
+ if 'player' in state2:
+ state2['player'] = filter_dict(state2['player'], player_exclude)
+
+ self.assertEqual(state1, state2)
+
def test_export_new_board(self):
board = GameBoard.new_game([{'actions': [{
'action_class': 'LoseHealthOrMSB',
self.assertEqual(board.health, 3)
state_2 = board.export()
- # Make sure nothing else has changed.
- state_1.pop('health')
- state_2.pop('health')
- self.assertEqual(state_1, state_2)
+ self.assert_state(state_1, state_2, exclude=['health'])
+
+ def test_gain_health(self):
+ board = GameBoard.new_game([{'actions': []}])
+ board.health = 2
+ self.assertEqual(board.health, 2)
+ state_1 = board.export()
+
+ board.gain_health()
+ self.assertEqual(board.health, 3)
+ state_2 = board.export()
+
+ self.assert_state(state_1, state_2, exclude=['health'])
+
+ def test_gain_health_at_max(self):
+ board = GameBoard.new_game([{'actions': []}])
+ self.assertEqual(board.health, 4)
+ state_1 = board.export()
+
+ board.gain_health()
+ self.assertEqual(board.health, 4)
+ state_2 = board.export()
+
+ self.assert_state(state_1, state_2)
class TestLocationCard(TestCase):