Action to gain health.
authorJeremy Thurgood <firxen@gmail.com>
Wed, 14 May 2014 11:31:59 +0000 (13:31 +0200)
committerJeremy Thurgood <firxen@gmail.com>
Wed, 14 May 2014 11:31:59 +0000 (13:31 +0200)
data/location_decks/test.yaml
naja/actions.py
naja/gameboard.py
naja/tests/test_actions.py
naja/tests/test_gameboard.py

index b0b0b111fe19245ac557abd70da2831173c6b164..e64c10d16c35eee87f6517d8aeb0b277f249a3b2 100644 (file)
@@ -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
index 354d88097bd8c624e37f17b8762f7e9dd69cccf9..f62b4637174621c3a29e541d4c445e4ece66f715 100644 (file)
@@ -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)
index ae80b8c887e926ceaa27af72b76f25ab3ad6a832..b03a2092ab9dfe48fe1b7cbbe9a8f416c074a3f2 100644 (file)
@@ -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
index a8d9201206425be0840bbad3a947965c858d8179..d903648cc626914e96aab9940ae7cbf57441e892 100644 (file)
@@ -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'])
index 07c872c611916a821c1191e33950c13129915124..bbc51284cfcb9847b6cfe8e8e194d482f126c802 100644 (file)
@@ -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):