Prototype tile glyphs.
authorJeremy Thurgood <firxen@gmail.com>
Fri, 16 May 2014 11:28:12 +0000 (13:28 +0200)
committerJeremy Thurgood <firxen@gmail.com>
Fri, 16 May 2014 11:28:12 +0000 (13:28 +0200)
naja/actions.py
naja/constants.py
naja/widgets/tile.py

index 35f4342a3afc40c74196ce516473599d0ab68ec2..17cb43215bbcc8289d0cdcae11d910f185674faa 100644 (file)
@@ -1,4 +1,4 @@
-from naja.constants import BITS, CHESS_PIECES
+from naja.constants import ACTION_GLYPHS, BITS, CHESS_PIECES
 from naja.utils import bit_glyphs, move_glyph
 
 
@@ -8,7 +8,7 @@ class LocationAction(object):
     """
 
     TEXT = None
-    USES_MSB = False
+    GLYPHS = None
 
     def __init__(self, required_bits, **data):
         self.required_bits = required_bits
@@ -60,6 +60,7 @@ class LocationAction(object):
 
 class DoNothing(LocationAction):
     TEXT = "No effect."
+    GLYPHS = (ACTION_GLYPHS.NOTHING,)
 
     def perform_action(self, board, location):
         pass
@@ -67,7 +68,7 @@ class DoNothing(LocationAction):
 
 class LoseHealthOrMSB(LocationAction):
     TEXT = "Lose {HEALTH} or {MSB}."
-    USES_MSB = True
+    GLYPHS = (ACTION_GLYPHS.MSB, ACTION_GLYPHS.DAMAGE)
 
     def perform_action(self, board, location):
         if not self.check_and_clear_MSB(board.player):
@@ -76,6 +77,7 @@ class LoseHealthOrMSB(LocationAction):
 
 class SetBits(LocationAction):
     TEXT = "Set %(location_bits)s."
+    GLYPHS = (ACTION_GLYPHS.SET_BITS,)
 
     def perform_action(self, board, location):
         board.player.bits.set_bits(location.bitwise_operand)
@@ -83,6 +85,7 @@ class SetBits(LocationAction):
 
 class ToggleBits(LocationAction):
     TEXT = "Toggle %(location_bits)s."
+    GLYPHS = (ACTION_GLYPHS.TOGGLE_BITS,)
 
     def perform_action(self, board, location):
         board.player.bits.toggle_bits(location.bitwise_operand)
@@ -90,7 +93,7 @@ class ToggleBits(LocationAction):
 
 class LoseHealthOrMSBAndSetBits(LocationAction):
     TEXT = "Lose {HEALTH} or {MSB}, then set %(location_bits)s."
-    USES_MSB = True
+    GLYPHS = (ACTION_GLYPHS.SET_BITS, ACTION_GLYPHS.MSB, ACTION_GLYPHS.DAMAGE)
 
     def perform_action(self, board, location):
         if not self.check_and_clear_MSB(board.player):
@@ -100,6 +103,7 @@ class LoseHealthOrMSBAndSetBits(LocationAction):
 
 class AcquireWinToken(LocationAction):
     TEXT = "Gain {WINTOKEN}, then clear {RED,GREEN,BLUE}."
+    GLYPHS = (ACTION_GLYPHS.WINTOKEN,)
 
     def perform_action(self, board, location):
         board.acquire_win_token()
@@ -110,7 +114,7 @@ class AcquireWinToken(LocationAction):
 
 class GainHealthAndClearBitsOrMSB(LocationAction):
     TEXT = "Gain {HEALTH}, then clear %(location_bits)s or {MSB}."
-    USES_MSB = True
+    GLYPHS = (ACTION_GLYPHS.HEAL, ACTION_GLYPHS.MSB, ACTION_GLYPHS.CLEAR_BITS)
 
     def perform_action(self, board, location):
         board.gain_health()
@@ -120,6 +124,7 @@ class GainHealthAndClearBitsOrMSB(LocationAction):
 
 class ShiftLocations(LocationAction):
     TEXT = "Shift current %(rowcol)s %(direction)s."
+    GLYPHS = (ACTION_GLYPHS.CHANGE_BOARD,)
 
     def perform_action(self, board, location):
         board.shift_locations(self.data['direction'])
@@ -127,6 +132,7 @@ class ShiftLocations(LocationAction):
 
 class AllowChessMove(LocationAction):
     TEXT = "Move like a %(chesspiece_name)s for one turn."
+    GLYPHS = (ACTION_GLYPHS.MOVEMENT,)
 
     def perform_action(self, board, location):
         if self.data['chesspiece'] in CHESS_PIECES:
index c941401d9c6541c7a1a8e87c7709df87efebe47c..dfc9e505fc55299402451f97162f103df1f7e1e6 100644 (file)
@@ -61,7 +61,8 @@ PLAYER_DEFAULTS = AttrDict({
 
 # Game size constants
 TILE_SIZE = (96, 96)
-LOCK_HEIGHT = 48
+# LOCK_HEIGHT = 48
+LOCK_HEIGHT = 32
 BOARD_SIZE = (5 * TILE_SIZE[0], 5 * TILE_SIZE[1])
 BIT_SIZE = (5 * TILE_SIZE[0], (SCREEN[1] - 5 * TILE_SIZE[1]) // 2)
 INFO_SIZE = (SCREEN[0] - 5 * TILE_SIZE[0], SCREEN[1])
@@ -102,3 +103,16 @@ PALETTE = AttrDict({
     'LIGHT_TURQUOISE': (147, 214, 191),
     'WHITE': (255, 255, 255),
 })
+
+ACTION_GLYPHS = AttrDict({
+    'CLEAR_BITS': 0,
+    'TOGGLE_BITS': 1,
+    'SET_BITS': 2,
+    'CHANGE_BOARD': 3,
+    'DAMAGE': 4,
+    'HEAL': 5,
+    'MOVEMENT': 6,
+    'WINTOKEN': 7,
+    'MSB': 8,
+    'NOTHING': 9,
+})
index acbc28df7cf3b7fbf2d95907d4f61f62a01f9efe..291dc3a9d45da33879a2f00b559f57d8746335b1 100644 (file)
@@ -1,7 +1,7 @@
 # These will probably need to go away when we have images
 import pygame
 
-from naja.constants import TILE_SIZE, BITS, LOCK_HEIGHT, EXAMINE
+from naja.constants import TILE_SIZE, BITS, LOCK_HEIGHT, EXAMINE, ACTION_GLYPHS
 from naja.resources import resources
 from naja.resources.mutators import EIGHT_BIT
 from naja.widgets.base import Widget
@@ -19,6 +19,20 @@ BIT_MAP = {
 }
 
 
+GLYPH_MAP = {
+    ACTION_GLYPHS.CLEAR_BITS: 'glyphs/bits_clear.png',
+    ACTION_GLYPHS.TOGGLE_BITS: 'glyphs/bits_toggle.png',
+    ACTION_GLYPHS.SET_BITS: 'glyphs/bits_set.png',
+    ACTION_GLYPHS.CHANGE_BOARD: 'glyphs/board.png',
+    ACTION_GLYPHS.DAMAGE: 'glyphs/damage.png',
+    ACTION_GLYPHS.HEAL: 'glyphs/health.png',
+    ACTION_GLYPHS.MOVEMENT: 'glyphs/move.png',
+    ACTION_GLYPHS.WINTOKEN: 'glyphs/win.png',
+    ACTION_GLYPHS.MSB: 'glyphs/msb.png',
+    ACTION_GLYPHS.NOTHING: 'glyphs/do_nothing.png',
+}
+
+
 class TileWidget(Widget):
     """Widget which holds a tile on the game board."""
     def __init__(self, pos, state=None, board_pos=None):
@@ -54,32 +68,38 @@ class TileWidget(Widget):
             self.surface.blit(overlay, (0, 0))
         # Look up the required bits on the board location
         card = self.state.board_locations[self.board_pos]
-        player_pos = self.state.player.position
-        bits = []
+        y_offset = TILE_SIZE[1] - LOCK_HEIGHT * len(card.actions)
         for action in card.actions:
-            if action.required_bits:
-                bits.append(action.required_bits)
-        # Sort so we have longer lists of bits later
-        self.size = self.surface.get_rect().size
-        if bits:
-            bits.sort(key=lambda x: len(x))
-            y_offset = TILE_SIZE[1] - LOCK_HEIGHT * len(bits)
-            for pattern in bits:
-                if self.board_pos != player_pos:
-                    img_name = BIT_MAP[pattern]
-                    x_offset = 0
-                else:
-                    img_name = BIT_MAP[pattern].replace('.png', '_small.png')
-                    x_offset = 4
-                    if y_offset >= TILE_SIZE[1] // 2:
-                        # FIXME: Hack'ish
-                        # Bump the lock down by some hand-tuned factor
-                        # to not overlap with the robot
-                        y_offset += LOCK_HEIGHT // 2 - 4
-                img = resources.get_image(img_name,
-                                          transforms=(EIGHT_BIT,))
-                self.surface.blit(img, (x_offset, y_offset))
-                y_offset += LOCK_HEIGHT
+            y_offset = self._prepare_action(action, y_offset)
+
+    def _prepare_lock(self, action, y_offset):
+        if not action.required_bits:
+            return 4
+
+        img_name = BIT_MAP[action.required_bits]
+        if self.board_pos != self.state.player.position:
+            x_offset = 0
+        else:
+            img_name = img_name.replace('.png', '_small.png')
+            x_offset = 4
+            if y_offset >= TILE_SIZE[1] // 2:
+                # FIXME: Hack'ish
+                # Bump the lock down by some hand-tuned factor
+                # to not overlap with the robot
+                y_offset += LOCK_HEIGHT // 2 - 4
+        img = resources.get_image(img_name, transforms=(EIGHT_BIT,))
+        self.surface.blit(img, (x_offset, y_offset))
+        return x_offset + img.get_width() + 2
+
+    def _prepare_action(self, action, y_offset):
+        x_offset = self._prepare_lock(action, y_offset)
+        if self.board_pos != self.state.player.position:
+            for glyph in action.GLYPHS:
+                img = resources.get_image(
+                    GLYPH_MAP[glyph], transforms=(EIGHT_BIT,))
+                self.surface.blit(img, (x_offset, y_offset + 4))
+                x_offset += img.get_width()
+        return y_offset + LOCK_HEIGHT
 
     def set_highlight(self, pos):
         self.highlighted = False