X-Git-Url: https://git.ctpug.org.za/?a=blobdiff_plain;f=naja%2Fwidgets%2Finfo_area.py;h=1ff6bbbd92168e52ec12c4a489cf6f54638f95a7;hb=d26dffb73ba125fc76931375365b10060cf5d892;hp=a122b6fdef08c4dfa1b782590b9584218b4f9d61;hpb=d9e309863a094fb56d21308396b635adf78e4684;p=naja.git diff --git a/naja/widgets/info_area.py b/naja/widgets/info_area.py index a122b6f..1ff6bbb 100644 --- a/naja/widgets/info_area.py +++ b/naja/widgets/info_area.py @@ -6,7 +6,8 @@ import pygame.locals as pgl from naja.constants import ( INFO_SIZE, ACT, KEYS, EXAMINE, PALETTE, - ACTION_TEXT_OFFSET, INFO_LEFT_PADDING) + ACTION_TEXT_OFFSET, INFO_LEFT_PADDING, + INFO_RIGHT_PADDING, BIT_SIZE, BITS) from naja.events import finish_event from naja.resources import resources from naja.resources.mutators import EIGHT_BIT, blender @@ -16,19 +17,20 @@ from naja.utils import bit_glyphs from naja.widgets.base import Widget from naja.widgets.tile import BIT_MAP from naja.widgets.text import TextBoxWidget, TextWidget +from naja import constants HINTS = { - ACT: ("Choose an action using the Up/Down keys.\n" - "Press Return to execute the action."), - EXAMINE: "Select a card to examine using the arrow keys.", + ACT: "Choose an action using {NORTH,SOUTH} keys.\n" + "Press {RETURN} to execute it.", + EXAMINE: "Browse the tiles with {NORTH,SOUTH,EAST,WEST} keys.", } -HINT_LEGAL_MOVE = "\nPress Return to move to this card." +HINT_LEGAL_MOVE = "\nPress {RETURN} to move to this tile." TITLES = { ACT: "Choose an Action", - EXAMINE: "Select a Card", + EXAMINE: "Select a Tile", } @@ -42,51 +44,79 @@ class InfoAreaWidget(Widget): self.chosen = None self.card_position = state.player.position self.set_position(state.player.position) + self.flash_count = 0 + self.flash_light = True def prepare(self): if self.state.gameboard.player_mode == ACT: self.set_position(self.state.player.position) self.surface = pygame.surface.Surface(INFO_SIZE) self.surface.fill((0, 0, 0)) - # Extract actions and such from the card - title = TextWidget( - (INFO_LEFT_PADDING, 0), TITLES[self.state.gameboard.player_mode], - colour=PALETTE.WHITE) - title.render(self.surface) - y_offset = title.surface.get_rect().height - 4 - - # TODO: Make this better. + + box_width = INFO_SIZE[0] - INFO_LEFT_PADDING - INFO_RIGHT_PADDING + y_offset = 0 + pos = lambda: (INFO_LEFT_PADDING, y_offset) + + # Bits + y_offset += 12 bits_text = ''.join('1' if bit in self.card.bitwise_operand else '0' for bit in reversed(range(8))) if self.card.bitwise_operand: bits_text = '%s %s' % ( bits_text, bit_glyphs(self.card.bitwise_operand)) - card_bits = TextBoxWidget((INFO_LEFT_PADDING, y_offset), bits_text, - box_width=(INFO_SIZE[0] - INFO_LEFT_PADDING), - colour=PALETTE.LIGHT_TURQUOISE, - bg_colour=PALETTE.BLACK) - card_bits.render(self.surface) - y_offset += card_bits.surface.get_rect().height + 4 - + card_bits = TextBoxWidget( + (0, 0), bits_text, padding=4, centre=True, + colour=PALETTE.WHITE, border=2, + bg_colour=PALETTE.BLACK, border_colour=PALETTE.BLUE, + box_width=box_width) + card_bits.prepare() + self.surface.blit(card_bits.surface, pos()) + y_offset += card_bits.surface.get_rect().height + 12 + + # Actions for choice, action in enumerate(self.card.actions): - y_offset = self.prepare_action(choice, action, y_offset) - # We cheat horribly for layout reasons + y_offset = self.prepare_action(choice, action, y_offset, box_width) + + # Hint text hint_text = HINTS[self.state.gameboard.player_mode] if self.state.gameboard.player_mode == EXAMINE: if self.card_position in self.state.player.legal_moves(): hint_text += HINT_LEGAL_MOVE - hint = TextBoxWidget((0, 0), hint_text, padding=4, - box_width=(INFO_SIZE[0] - INFO_LEFT_PADDING - 8)) + hint = TextBoxWidget( + (0, 0), hint_text, padding=4, + colour=PALETTE.WHITE, border=2, + bg_colour=PALETTE.BLACK, border_colour=PALETTE.BLUE, + box_width=box_width) hint.prepare() - y_offset = ( - INFO_SIZE[1] - hint.surface.get_rect().height - INFO_LEFT_PADDING - - 2) - self.surface.blit(hint.surface, (INFO_LEFT_PADDING, y_offset)) - - def prepare_action(self, choice, action, y_offset): + y_offset = (INFO_SIZE[1] - hint.surface.get_rect().height + - BIT_SIZE[1] - 2) + self.surface.blit(hint.surface, pos()) + + # Game mode (puzzle, easy, standard, hard, etc ...) + game_mode = TextBoxWidget( + (0, 0), self.mode_hint(), padding=4, centre=True, + colour=PALETTE.WHITE, border=2, + bg_colour=PALETTE.BLACK, border_colour=PALETTE.BLUE, + box_width=box_width) + game_mode.prepare() + + y_offset = (INFO_SIZE[1] - BIT_SIZE[1] + 12) + self.surface.blit(game_mode.surface, pos()) + + def mode_hint(self): + gameboard = self.state.gameboard + if gameboard.puzzle: + return "PUZZLE" + return { + 0: "DEATH", 1: "LUDICROUS", + 2: "RAMBO", 3: "HARD", + 4: "STANDARD", 5: "EASY", + }.get(gameboard.max_health, "UNKNOWN") + + def prepare_action(self, choice, action, y_offset, box_width): x_offset = INFO_LEFT_PADDING - glyphs_x_offset = 0 + glyphs_x_offset = 2 glyphs_y_offset = y_offset y_offset += ACTION_TEXT_OFFSET action_viable = action.check_available(self.state.player) @@ -94,13 +124,20 @@ class InfoAreaWidget(Widget): text = TextBoxWidget( (x_offset, y_offset), action.get_text(self.card), - box_width=(INFO_SIZE[0] - INFO_LEFT_PADDING - 8), - fontsize=28, colour=text_colour) + box_width=box_width, + fontsize=28, colour=text_colour, + border=2, border_colour=PALETTE.GREY) text.render(self.surface) border_colour = None if choice == self.chosen: - border_colour = PALETTE.GREEN if action_viable else PALETTE.ORANGE + if self.flash_light: + border_colour = (PALETTE.GREEN if action_viable else + PALETTE.ORANGE) + else: + border_colour = (PALETTE.DARK_GREEN if action_viable else + PALETTE.DARK_RED) + if border_colour: bottom = y_offset + text.surface.get_rect().height right = text.surface.get_rect().width + x_offset @@ -108,8 +145,10 @@ class InfoAreaWidget(Widget): [(x_offset, y_offset), (right, y_offset), (right, bottom), (x_offset, bottom)], 4) - if action.required_bits: - img_name = BIT_MAP[action.required_bits].replace( + required_keys = action.required_bits & frozenset([ + BITS.RED, BITS.GREEN, BITS.BLUE]) + if required_keys in BIT_MAP: + img_name = BIT_MAP[required_keys].replace( '.png', '_small.png') img = resources.get_image(img_name, transforms=(EIGHT_BIT,)) @@ -118,14 +157,22 @@ class InfoAreaWidget(Widget): else: glyphs_x_offset = INFO_LEFT_PADDING - for glyph in action.GLYPHS: + if BITS.MSB in action.required_bits: + msb = resources.get_image('board/msb_lock_decoration.png', + transforms=(EIGHT_BIT,)) + msb_rect = msb.get_rect() + self.surface.blit( + msb, (glyphs_x_offset - msb_rect.width - 4, glyphs_y_offset) + ) + + for glyph in action.get_glyphs(): img = resources.get_image( glyph, transforms=(EIGHT_BIT, blender(PALETTE.GREY))) self.surface.blit(img, (glyphs_x_offset, glyphs_y_offset - 4)) glyphs_x_offset += img.get_width() - if action.MSB_GLYPH is not None: + if action.get_msb_glyph() is not None: img = resources.get_image( - action.MSB_GLYPH, + action.get_msb_glyph(), transforms=(EIGHT_BIT, blender(PALETTE.LIGHT_VIOLET))) self.surface.blit(img, (glyphs_x_offset, glyphs_y_offset - 4)) @@ -141,6 +188,11 @@ class InfoAreaWidget(Widget): self.chosen = None def draw(self, surface): + self.flash_count += 1 + if self.flash_count >= (constants.FPS // 2): + self.flash_light = not self.flash_light + self.flash_count = 0 + self.prepare() surface.blit(self.surface, self.pos) def next_action(self, viable_only=False, step=1):