def draw(self, surface):
surface.blit(self.surface, self.pos)
+ def next_viable_action(self, step=1):
+ num_actions = len(self.card.actions)
+ if num_actions == 0:
+ return
+ player = self.state.player
+ chosen = self.chosen
+ for i in range(num_actions - 1):
+ # loop through each action at most once.
+ chosen = (chosen + step) % num_actions
+ action = self.card.actions[chosen]
+ if action.check_available(player):
+ sound.play_sound('change_action.ogg', volume=0.05)
+ self.chosen = chosen
+
+ def prev_viable_action(self):
+ return self.next_viable_action(step=-1)
+
+ def try_perform_action(self):
+ player = self.state.player
+ action = self.card.actions[self.chosen]
+ if not action.check_available(player):
+ sound.play_sound('error.ogg')
+ else:
+ action.perform_action(self.state.gameboard, self.card)
+ self.state.gameboard.replace_card(player.position)
+ self.state.gameboard.change_mode(EXAMINE)
+ self.set_position(player.position)
+
def handle_event(self, ev):
if self.state.gameboard.player_mode == EXAMINE:
return super(InfoAreaWidget, self).handle_event(ev)
if ev.type == pgl.KEYDOWN:
if ev.key in KEYS.SELECT:
- player = self.state.player
- action = self.card.actions[self.chosen]
- if not action.check_available(player):
- sound.play_sound('error.ogg')
- else:
- action.perform_action(self.state.gameboard, self.card)
- self.state.gameboard.replace_card(player.position)
- self.state.gameboard.change_mode(EXAMINE)
- self.set_position(player.position)
+ self.try_perform_action()
return finish_event()
if ev.key in KEYS.UP:
- if self.chosen > 0:
- self.chosen -= 1
- sound.play_sound('change_action.ogg')
+ self.next_viable_action()
return finish_event()
if ev.key in KEYS.DOWN:
- if self.chosen + 1 < len(self.card.actions):
- sound.play_sound('change_action.ogg')
- self.chosen += 1
+ self.prev_viable_action()
return finish_event()
if ev.key in KEYS.SWITCH:
- sound.play_sound('change_action.ogg')
- if self.chosen + 1 < len(self.card.actions):
- self.chosen += 1
- else:
- self.chosen = 0
+ self.next_viable_action()
return finish_event()
return super(InfoAreaWidget, self).handle_event(ev)