X-Git-Url: https://git.ctpug.org.za/?a=blobdiff_plain;f=naja%2Fwidgets%2Finfo_area.py;h=a2956a0d139a4d1d1cd369fed03cccddf6769228;hb=23bc655a89f4ac16e2b17a5f359192d1d9268648;hp=906e9d57d39d850e254f4e32bfb1e0c1f918d211;hpb=6cb822e79f40bf9708d0034d0816e8310e423431;p=naja.git diff --git a/naja/widgets/info_area.py b/naja/widgets/info_area.py index 906e9d5..a2956a0 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, KEYS +from naja.events import InvalidateTheWorld, PlayerMoved 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): @@ -18,17 +32,18 @@ class InfoAreaWidget(Widget): """ def __init__(self, pos, state): super(InfoAreaWidget, self).__init__(pos, INFO_SIZE) - self.card = None self.state = state + self.set_position(state.player.position) def prepare(self): 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 - 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 +51,56 @@ 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 set_position(self, position): + self.card = self.state.board_locations[position] + self.chosen = 0 def draw(self, surface): surface.blit(self.surface, self.pos) + + def handle_event(self, ev): + if PlayerMoved.matches(ev): + self.set_position(self.state.player.position) + return False + + if self.state.gameboard.player_mode == MOVE: + return super(InfoAreaWidget, self).handle_event(ev) + if ev.type == pgl.KEYDOWN: + if ev.key in KEYS.SELECT: + action = self.card.actions[self.chosen] + if not action.check_available(self.state.gameboard.player): + print "BEEP!" + return True + action.perform_action(self.state.gameboard, self.card) + self.state.gameboard.change_mode() + InvalidateTheWorld.post() + return True + if ev.key in KEYS.UP: + if self.chosen > 0: + self.chosen -= 1 + InvalidateTheWorld.post() + return True + if ev.key in KEYS.DOWN: + if self.chosen + 1 < len(self.card.actions): + self.chosen += 1 + InvalidateTheWorld.post() + return True + return super(InfoAreaWidget, self).handle_event(ev)