From 4c5f45d39c034c4fc78de5f5a75e16e6ad918b95 Mon Sep 17 00:00:00 2001 From: Jeremy Thurgood Date: Wed, 14 May 2014 13:31:59 +0200 Subject: [PATCH] Action to gain health. --- data/location_decks/test.yaml | 8 ++++++- naja/actions.py | 10 +++++++++ naja/gameboard.py | 4 ++++ naja/tests/test_actions.py | 26 ++++++++++++++++++++++ naja/tests/test_gameboard.py | 42 +++++++++++++++++++++++++++++++---- 5 files changed, 85 insertions(+), 5 deletions(-) diff --git a/data/location_decks/test.yaml b/data/location_decks/test.yaml index b0b0b11..e64c10d 100644 --- a/data/location_decks/test.yaml +++ b/data/location_decks/test.yaml @@ -3,9 +3,12 @@ description: "Test location deck." # 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: [] @@ -34,3 +37,6 @@ cards: - actions: - *BAD-DEFAULT - *ACQUIRE-WIN-TOKEN + - actions: + - *GAIN-HEALTH-DEFAULT + - *TOGGLE-BITS-C \ No newline at end of file diff --git a/naja/actions.py b/naja/actions.py index 354d880..f62b463 100644 --- a/naja/actions.py +++ b/naja/actions.py @@ -86,3 +86,13 @@ class AcquireWinToken(LocationAction): 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) diff --git a/naja/gameboard.py b/naja/gameboard.py index ae80b8c..b03a209 100644 --- a/naja/gameboard.py +++ b/naja/gameboard.py @@ -90,6 +90,10 @@ class GameBoard(object): 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 diff --git a/naja/tests/test_actions.py b/naja/tests/test_actions.py index a8d9201..d903648 100644 --- a/naja/tests/test_actions.py +++ b/naja/tests/test_actions.py @@ -138,3 +138,29 @@ class TestActions(TestCase): 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']) diff --git a/naja/tests/test_gameboard.py b/naja/tests/test_gameboard.py index 07c872c..bbc5128 100644 --- a/naja/tests/test_gameboard.py +++ b/naja/tests/test_gameboard.py @@ -6,6 +6,20 @@ from naja import actions 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', @@ -46,10 +60,30 @@ class TestGameBoard(TestCase): 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): -- 2.34.1