From: adrianna Date: Fri, 16 May 2014 15:47:44 +0000 (+0200) Subject: rotation action X-Git-Tag: 0.1~215 X-Git-Url: https://git.ctpug.org.za/?a=commitdiff_plain;h=ee2a1f7e16272d19eb5a2dc03355ce8b851a441e;p=naja.git rotation action --- diff --git a/data/images/glyphs/anticlockwise.png b/data/images/glyphs/anticlockwise.png new file mode 100644 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 index 0000000..bc6f077 Binary files /dev/null and b/data/images/glyphs/clockwise.png differ diff --git a/data/location_decks/standard.yaml b/data/location_decks/standard.yaml index 31d0af5..d0d4056 100644 --- a/data/location_decks/standard.yaml +++ b/data/location_decks/standard.yaml @@ -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 diff --git a/naja/actions.py b/naja/actions.py index cfa1011..ca472d3 100644 --- a/naja/actions.py +++ b/naja/actions.py @@ -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): diff --git a/naja/gameboard.py b/naja/gameboard.py index 2d138b2..2cce169 100644 --- a/naja/gameboard.py +++ b/naja/gameboard.py @@ -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] diff --git a/naja/tests/test_gameboard.py b/naja/tests/test_gameboard.py index 6231ac7..d843c7e 100644 --- a/naja/tests/test_gameboard.py +++ b/naja/tests/test_gameboard.py @@ -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) diff --git a/naja/widgets/text.py b/naja/widgets/text.py index d8d2d47..e4eecaa 100644 --- a/naja/widgets/text.py +++ b/naja/widgets/text.py @@ -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), } diff --git a/sources/images/glyph.xcf b/sources/images/glyph.xcf index 596119b..003c7ea 100644 Binary files a/sources/images/glyph.xcf and b/sources/images/glyph.xcf differ