From 93c727f8bdfdecad09fe068d500e43195fb00cdc Mon Sep 17 00:00:00 2001 From: Simon Cross Date: Thu, 15 May 2014 21:11:45 +0200 Subject: [PATCH] Only move to viable actions and softer beeping (also beeping centralized to easier to remove / comment out if desired). --- naja/widgets/info_area.py | 52 ++++++++++++++++++++++++--------------- 1 file changed, 32 insertions(+), 20 deletions(-) diff --git a/naja/widgets/info_area.py b/naja/widgets/info_area.py index 85f4bda..1f656fe 100644 --- a/naja/widgets/info_area.py +++ b/naja/widgets/info_area.py @@ -110,36 +110,48 @@ class InfoAreaWidget(Widget): 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) -- 2.34.1