From: Jeremy Thurgood Date: Fri, 16 May 2014 11:28:12 +0000 (+0200) Subject: Prototype tile glyphs. X-Git-Tag: 0.1~229 X-Git-Url: https://git.ctpug.org.za/?a=commitdiff_plain;h=2e8c585ed020f0d1bfec43077714aa72384dc683;p=naja.git Prototype tile glyphs. --- diff --git a/naja/actions.py b/naja/actions.py index 35f4342..17cb432 100644 --- a/naja/actions.py +++ b/naja/actions.py @@ -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: diff --git a/naja/constants.py b/naja/constants.py index c941401..dfc9e50 100644 --- a/naja/constants.py +++ b/naja/constants.py @@ -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, +}) diff --git a/naja/widgets/tile.py b/naja/widgets/tile.py index acbc28d..291dc3a 100644 --- a/naja/widgets/tile.py +++ b/naja/widgets/tile.py @@ -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