X-Git-Url: https://git.ctpug.org.za/?a=blobdiff_plain;f=naja%2Fwidgets%2Finfo_area.py;h=317dfc631cf34ce52ce8d4aa0b7bf3f12be43d5e;hb=800a800c45456f185c2e5445ed9caaa8a0ac5504;hp=906e9d57d39d850e254f4e32bfb1e0c1f918d211;hpb=6cb822e79f40bf9708d0034d0816e8310e423431;p=naja.git diff --git a/naja/widgets/info_area.py b/naja/widgets/info_area.py index 906e9d5..317dfc6 100644 --- a/naja/widgets/info_area.py +++ b/naja/widgets/info_area.py @@ -2,14 +2,28 @@ Widget for the game board information area. """ import pygame +import pygame.locals as pgl -from naja.constants import INFO_SIZE, EIGHT_BIT_SCALE +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 +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): @@ -20,6 +34,7 @@ class InfoAreaWidget(Widget): super(InfoAreaWidget, self).__init__(pos, INFO_SIZE) self.card = None self.state = state + self.chosen = 0 def prepare(self): self.surface = pygame.surface.Surface(INFO_SIZE) @@ -27,8 +42,11 @@ class InfoAreaWidget(Widget): # Quick hack for testing self.card = self.state.board_locations[self.state.player.position] # Extract actions and such from the card - y_offset = 0 - for action in self.card.actions: + 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, @@ -36,14 +54,48 @@ class InfoAreaWidget(Widget): 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, padding = 4) + 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): 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)