rotation action
authoradrianna <adrianna.pinska@gmail.com>
Fri, 16 May 2014 15:47:44 +0000 (17:47 +0200)
committeradrianna <adrianna.pinska@gmail.com>
Fri, 16 May 2014 15:47:54 +0000 (17:47 +0200)
data/images/glyphs/anticlockwise.png [new file with mode: 0644]
data/images/glyphs/clockwise.png [new file with mode: 0644]
data/location_decks/standard.yaml
naja/actions.py
naja/gameboard.py
naja/tests/test_gameboard.py
naja/widgets/text.py
sources/images/glyph.xcf

diff --git a/data/images/glyphs/anticlockwise.png b/data/images/glyphs/anticlockwise.png
new file mode 100644 (file)
index 0000000..b8f93e9
Binary files /dev/null and b/data/images/glyphs/anticlockwise.png differ
diff --git a/data/images/glyphs/clockwise.png b/data/images/glyphs/clockwise.png
new file mode 100644 (file)
index 0000000..bc6f077
Binary files /dev/null and b/data/images/glyphs/clockwise.png differ
index 31d0af5e1ca83f1dc150bc3e2e998a724bf7706f..d0d4056a04f957f9d2d7fc90e6b01792edd523fc 100644 (file)
@@ -45,6 +45,15 @@ _action_definitions:
     required_bits: [GREEN]
     data: {'direction': WEST}
 
+  - &ROT-CW
+    action_class: 'RotateLocations'
+    required_bits: [RED]
+    data: {'rot_direction': CLOCKWISE}
+  - &ROT-CCW
+    action_class: 'RotateLocations'
+    required_bits: [RED]
+    data: {'rot_direction': ANTICLOCKWISE}
+
   # Two-colour actions.
   - &KNIGHT-MOVE
     action_class: 'AllowChessMove'
@@ -140,6 +149,18 @@ _card_definitions:
       - *SHIFT-W
       - *HEAL-RB
 
+  - &ROT-CW-AND-SET
+    actions:
+      - *TOGGLE-BITS-DEFAULT
+      - *ROT-CW
+      - *SET-BITS-B
+
+  - &ROT-CCW-AND-SET
+    actions:
+      - *TOGGLE-BITS-DEFAULT
+      - *ROT-CCW
+      - *SET-BITS-G
+
 cards:
   - *WIN-CARD-1
   - *WIN-CARD-2
@@ -153,3 +174,5 @@ cards:
   - *SHIFT-S-AND-HEAL
   - *SHIFT-E-AND-HEAL
   - *SHIFT-W-AND-HEAL
+  - *ROT-CW-AND-SET
+  - *ROT-CCW-AND-SET
index cfa1011cd2d4b76d27322b039b6bf36533d96732..ca472d3a75a7b50a79f84d406dca1267eaf17b9c 100644 (file)
@@ -31,6 +31,9 @@ class LocationAction(object):
             substitutions['chesspiece_name'] = move_glyph(
                 self.data['chesspiece'])
 
+        if 'rot_direction' in self.data:
+            substitutions['rot_direction_name'] = '{%s}' % (substitutions['rot_direction'],)
+
         if location is None:
             substitutions['location_bits'] = 'bits specified by this location'
         else:
@@ -141,7 +144,7 @@ class ShiftLocations(LocationAction):
 
 
 class RotateLocations(LocationAction):
-    TEXT = "Rotate adjacent locations %(rot_direction)s."
+    TEXT = "Rotate adjacent locations %(rot_direction_name)s."
     GLYPHS = (ACTION_GLYPHS.CHANGE_BOARD,)
 
     def perform_action(self, board, location):
index 2d138b2dbe74fceb3bf313fca5eaf05755b2f22b..2cce169544823e843c86e82f2577c3a634f99e5e 100644 (file)
@@ -138,20 +138,20 @@ class GameBoard(object):
             for i in range(max(0, px -1), min(5, px + 2)):
                 locations_to_rotate.append((i, py - 1))
 
-        if px > 0:
-            locations_to_rotate.append((px - 1, py))
-
         if px < 4:
             locations_to_rotate.append((px + 1, py))
 
         if py < 4:
-            for i in range(max(0, px -1), min(5, px + 2)):
+            for i in reversed(range(max(0, px -1), min(5, px + 2))):
                 locations_to_rotate.append((i, py + 1))
 
-        if direction == ROTATION.CLOCKWISE:
-            new_positions = locations_to_rotate[1:] + locations_to_rotate[0]
-        elif direction == ROTATION.ANTICLOCKWISE:
-            new_positions = locations_to_rotate[-1] + locations_to_rotate[:-1]
+        if px > 0:
+            locations_to_rotate.append((px - 1, py))
+
+        if ROTATION[direction] == ROTATION.CLOCKWISE:
+            new_positions = locations_to_rotate[1:] + [locations_to_rotate[0]]
+        elif ROTATION[direction] == ROTATION.ANTICLOCKWISE:
+            new_positions = [locations_to_rotate[-1]] + locations_to_rotate[:-1]
 
         for old, new in zip(locations_to_rotate, new_positions):
             rotated_locations[old] = self.board_locations[new]
index 6231ac7750f96941d1bd40529890465ceb740772..d843c7e9fc86e2cee5e913551c08946f3f9f8d31 100644 (file)
@@ -124,21 +124,66 @@ class TestGameBoard(TestCase):
             (0, 2): '12', (1, 2): '32', (3, 2): '42', (4, 2): '02',
         }))
 
-    def test_allow_chess_move_knight(self):
+    def test_rotate_locations_clockwise(self):
         board = GameBoard.new_game([{'actions': []}])
         board.board_locations = self.generate_locations()
+        board.rotate_locations('CLOCKWISE')
+        self.assertEqual(board.board_locations, self.generate_locations({
+            (1, 1): '21', (2, 1): '31', (3, 1): '32',
+            (1, 2): '11',               (3, 2): '33',
+            (1, 3): '12', (2, 3): '13', (3, 3): '23',
+        }))
+
+    def test_rotate_locations_clockwise_top(self):
+        board = GameBoard.new_game([{'actions': []}], initial_pos=(2, 0))
+        board.board_locations = self.generate_locations()
+        board.rotate_locations('CLOCKWISE')
+        self.assertEqual(board.board_locations, self.generate_locations({
+            (1, 0): '30',               (3, 0): '31',
+            (1, 1): '10', (2, 1): '11', (3, 1): '21',
+        }))
+
+    def test_rotate_locations_clockwise_right(self):
+        board = GameBoard.new_game([{'actions': []}], initial_pos=(0, 2))
+        board.board_locations = self.generate_locations()
+        board.rotate_locations('CLOCKWISE')
+        self.assertEqual(board.board_locations, self.generate_locations({
+            (0, 1): '11', (1, 1): '12',
+                          (1, 2): '13',
+            (0, 3): '01', (1, 3): '03',
+        }))
+
+    def test_rotate_locations_clockwise_corner(self):
+        board = GameBoard.new_game([{'actions': []}], initial_pos=(0, 4))
+        board.board_locations = self.generate_locations()
+        board.rotate_locations('CLOCKWISE')
+        self.assertEqual(board.board_locations, self.generate_locations({
+            (0, 3): '13', (1, 3): '14',
+                          (1, 4): '03',
+        }))
+
+    def test_rotate_locations_anticlockwise(self):
+        board = GameBoard.new_game([{'actions': []}])
+        board.board_locations = self.generate_locations()
+        board.rotate_locations('ANTICLOCKWISE')
+        self.assertEqual(board.board_locations, self.generate_locations({
+            (1, 1): '12', (2, 1): '11', (3, 1): '21',
+            (1, 2): '13',               (3, 2): '31',
+            (1, 3): '23', (2, 3): '33', (3, 3): '32',
+        }))
+
+    def test_allow_chess_move_knight(self):
+        board = GameBoard.new_game([{'actions': []}])
         board.allow_chess_move(MOVES.KNIGHT)
         self.assertEqual(board.player.movement_mode, MOVES.KNIGHT)
 
     def test_allow_chess_move_bishop(self):
         board = GameBoard.new_game([{'actions': []}])
-        board.board_locations = self.generate_locations()
         board.allow_chess_move(MOVES.BISHOP)
         self.assertEqual(board.player.movement_mode, MOVES.BISHOP)
 
     def test_allow_chess_move_castle(self):
         board = GameBoard.new_game([{'actions': []}])
-        board.board_locations = self.generate_locations()
         board.allow_chess_move(MOVES.CASTLE)
         self.assertEqual(board.player.movement_mode, MOVES.CASTLE)
 
index d8d2d47e51726c7ac58b3ed77cf7d3b6f5a582d8..e4eecaacad57e2f53ffdf07a9b8419a43896166f 100644 (file)
@@ -19,6 +19,8 @@ MARKUP_MAP = {
     'RED': ('glyphs/key.png', PALETTE.ORANGE),
     'GREEN': ('glyphs/key.png', PALETTE.GREEN),
     'BLUE': ('glyphs/key.png', PALETTE.BLUE),
+    'CLOCKWISE': ('glyphs/clockwise.png', None),
+    'ANTICLOCKWISE': ('glyphs/anticlockwise.png', None),
 }
 
 
index 596119b1285d1464c7b2e17dd5424ca87b943398..003c7eaea7de7861be462943f00d7ea401b96f7a 100644 (file)
Binary files a/sources/images/glyph.xcf and b/sources/images/glyph.xcf differ