X-Git-Url: https://git.ctpug.org.za/?a=blobdiff_plain;f=naja%2Fwidgets%2Finfo_area.py;h=317dfc631cf34ce52ce8d4aa0b7bf3f12be43d5e;hb=800a800c45456f185c2e5445ed9caaa8a0ac5504;hp=ee9fccfdb5abd6d422f3855c549718ea4af9e6fe;hpb=85cfc03ea79f3d3de4210c76b32bd61d810c7f92;p=naja.git diff --git a/naja/widgets/info_area.py b/naja/widgets/info_area.py index ee9fccf..317dfc6 100644 --- a/naja/widgets/info_area.py +++ b/naja/widgets/info_area.py @@ -1,22 +1,101 @@ """ Widget for the game board information area. """ +import pygame +import pygame.locals as pgl -from naja.constants import INFO_SIZE +from naja.constants import INFO_SIZE, EIGHT_BIT_SCALE, MOVE, ACT +from naja.events import InvalidateTheWorld +from naja.resources import resources +from naja.resources.mutators import EIGHT_BIT from naja.widgets.base import Widget +from naja.widgets.tile import BIT_MAP +from naja.widgets.text import TextBoxWidget, TextWidget + + +HINTS = { + MOVE: "Move using the arrow keys.\nPress SPACE to stay in place", + ACT: "Choose an action using the Up/Down keys.\n" + "Press Return to execute the action.", + } + +TITLES = { + MOVE: "Move the Robot", + ACT: "Choose an Action", + } class InfoAreaWidget(Widget): """ Widget for the game board information area. """ - def __init__(self, pos, image=None): + def __init__(self, pos, state): super(InfoAreaWidget, self).__init__(pos, INFO_SIZE) + self.card = None + self.state = state + self.chosen = 0 def prepare(self): - pass + self.surface = pygame.surface.Surface(INFO_SIZE) + self.surface.fill((0, 0, 0)) + # Quick hack for testing + self.card = self.state.board_locations[self.state.player.position] + # Extract actions and such from the card + title = TextWidget((0, 0), TITLES[self.state.gameboard.player_mode], + colour=(255, 255, 255)) + title.render(self.surface) + y_offset = title.surface.get_rect().height + 8 + for choice, action in enumerate(self.card.actions): + if action.required_bits: + img_name = BIT_MAP[action.required_bits].replace('.png', '_small.png') + img = resources.get_image(img_name, + transforms=(EIGHT_BIT,)) + self.surface.blit(img, (0, y_offset)) + y_offset += 8 + text = TextBoxWidget((12, y_offset), action.TEXT, + box_width=(INFO_SIZE[0] - 12) // EIGHT_BIT_SCALE, + fontsize=28) + text.render(self.surface) + if choice == self.chosen: + colour = (255, 255, 0, 128) + bottom = y_offset + text.surface.get_rect().height + right = text.surface.get_rect().width + 12 + pygame.draw.lines(self.surface, colour, True, + [(12, y_offset), (right, y_offset), + (right, bottom), (12, bottom)], 4) + y_offset += text.surface.get_rect().height + 16 + # We cheat horribly for layout reasons + hint = TextBoxWidget((0, 0), HINTS[self.state.gameboard.player_mode], + box_width = INFO_SIZE[0] // EIGHT_BIT_SCALE) + hint.prepare() + y_offset = INFO_SIZE[1] - hint.surface.get_rect().height + self.surface.blit(hint.surface, (0, y_offset)) + + def set_card(self, card): + self.card = card def draw(self, surface): - pass - #surface.blit(self.surface, self.pos) + surface.blit(self.surface, self.pos) + + def handle_event(self, ev): + if self.state.gameboard.player_mode == MOVE: + return super(InfoAreaWidget, self).handle_event(ev) + if ev.type == pgl.KEYDOWN: + if ev.key in (pgl.K_RETURN, pgl.K_KP_ENTER): + self.state.gameboard.change_mode() + self.card.actions[self.chosen].perform_action( + self.state.gameboard, self.card) + InvalidateTheWorld.post() + return True + if ev.key in (pgl.K_UP, pgl.K_w): + if self.chosen > 0: + self.chosen -= 1 + InvalidateTheWorld.post() + return True + if ev.key in (pgl.K_DOWN, pgl.K_s): + if self.chosen + 1 < len(self.card.actions): + self.chosen += 1 + InvalidateTheWorld.post() + return True + return super(InfoAreaWidget, self).handle_event(ev)