From ccd34a079eeaa1909e62742af2776748113a04c6 Mon Sep 17 00:00:00 2001 From: Fred Shih Date: Mon, 1 Apr 2013 18:04:06 -0700 Subject: [PATCH] Implemented current phase asset --- risk/game_master.py | 31 ++++++++++++++++++++----------- risk/graphics/assets/image.py | 21 +++++++++++++++++++++ risk/graphics/graphics.py | 23 ++++++++++++++++++++++- 3 files changed, 63 insertions(+), 12 deletions(-) diff --git a/risk/game_master.py b/risk/game_master.py index fdce814..736df51 100644 --- a/risk/game_master.py +++ b/risk/game_master.py @@ -12,10 +12,10 @@ from risk.errors.battle import * from risk.player import HumonRiskPlayer -REINFORCE_PHASE = 0 -ATTACK_PHASE = 1 -FORTIFY_PHASE = 2 -UNDEFINED_PHASE = 3 +REINFORCE = 'reinforce' +ATTACK = 'attack' +FORTIFY = 'fortify' +UNDEFINED = 'undefined' class GameMaster(object): _RISK_RULE_STARTING_RESERVES = 40 @@ -29,7 +29,7 @@ def __init__(self, board, settings, num_players=6): num_players) self.board = board - self.phase = UNDEFINED_PHASE + self.phase = UNDEFINED # need to setup with settings later self.ended = False self.end_turn_callbacks = [] @@ -43,6 +43,7 @@ def __init__(self, board, settings, num_players=6): 'start_turn': [], 'end_action': [], 'end_turn': [], + 'end_phase': [], 'end_game': [], } self.add_end_action_callback(GameMaster.check_player_elimination) @@ -98,6 +99,9 @@ def add_start_turn_callback(self, callback): def add_end_action_callback(self, callback): self.callbacks['end_action'].append(callback) + def add_end_phase_callback(self, callback): + self.callbacks['end_phase'].append(callback) + def generate_players(self, number_of_human_players, cli=False): risk.logger.debug("Generating %s human players" % \ number_of_human_players) @@ -170,7 +174,6 @@ def check_player_elimination(self, function, result, args): self._recalculate_current_player_index( args[_PLAYER_ARG_INDEX]) - # TODO fix select next player bug def eliminate_player(self, player): self.players.remove(player) for _ in xrange(10): @@ -181,6 +184,12 @@ def eliminate_player(self, player): print "%s WINS!!!!" % self.current_player().name self.end_game() + def set_phase(self, new_phase): + previous = self.phase + self.phase = new_phase + for callback in self.callbacks['end_phase']: + callback(self, previous, new_phase) + ########################################################################### ## Game state queries # @@ -211,16 +220,16 @@ def _recalculate_current_player_index(self, current_player): #@event_action def player_take_turn(self): self.call_start_turn_callbacks() - self.phase = UNDEFINED_PHASE + self.set_phase(UNDEFINED) player = self._get_player_with_index(self._current_player) player.reserves += len(self.player_territories(player)) - self.phase = REINFORCE_PHASE + self.set_phase(REINFORCE) player.reinforce(self) - self.phase = ATTACK_PHASE + self.set_phase(ATTACK) player.attack(self) - self.phase = FORTIFY_PHASE + self.set_phase(FORTIFY) player.fortify(self) - self.phase = UNDEFINED_PHASE + self.set_phase(UNDEFINED) #@event_action def player_territories(self, player): diff --git a/risk/graphics/assets/image.py b/risk/graphics/assets/image.py index 9848a39..e27d189 100644 --- a/risk/graphics/assets/image.py +++ b/risk/graphics/assets/image.py @@ -3,6 +3,9 @@ import risk from risk.graphics.assets.base import PicassoAsset +ON=True +OFF=False + class ImageAsset(PicassoAsset): def __init__(self, x, y, path, scale_x=1.0, scale_y=1.0): self.path = path @@ -12,3 +15,21 @@ def __init__(self, x, y, path, scale_x=1.0, scale_y=1.0): (int(self.surface.get_width() * scale_x), int(self.surface.get_height() * scale_y))) PicassoAsset.__init__(self, self.surface, x, y) + +class ToggleImageAsset(ImageAsset): + def __init__(self, x, y, path, start_state=ON): + ImageAsset.__init__(self, x, y, path) + self.state = start_state + self.blank = pygame.Surface((0, 0), pygame.SRCALPHA, 32) + + def draw(self): + if self.state == ON: + return self.surface + else: + return self.blank + + def toggle(self): + self.state = not self.state + + def set_state(self, state): + self.state = state diff --git a/risk/graphics/graphics.py b/risk/graphics/graphics.py index 49defc0..289d6f8 100644 --- a/risk/graphics/graphics.py +++ b/risk/graphics/graphics.py @@ -15,6 +15,7 @@ import risk.graphics.assets.gameplay from risk.logger import * +from risk.game_master import UNDEFINED, REINFORCE, ATTACK, FORTIFY from risk.graphics import assets from risk.graphics.event import wait_for_event, get_events from risk.graphics.datastore import Datastore @@ -119,6 +120,7 @@ def add_graphic_hooks(game_master): game_master.add_end_action_callback(release_control) game_master.add_start_turn_callback(update_game_info_panel) game_master.add_end_action_callback(update_game_info_panel) + game_master.add_end_phase_callback(update_current_phase) #game_master.add_end_action_callback(delay) def initialize_territories(picasso, game_master): @@ -148,7 +150,22 @@ def initialize_other_graphic_assets(picasso, game_master): game_info_asset = assets.gameplay.PlayersAsset(30, 550, game_master) picasso.add_asset('999_ontop', game_info_asset) datastore.add_entry('game_info', game_info_asset) - + add_state_indicators(picasso, game_master) + +def add_state_indicators(picasso, game_master): + datastore = Datastore() + pos_x = 867 + state_indicators = { + 'reinforce': (pos_x, 548), + 'attack': (pos_x, 600), + 'fortify': (pos_x, 652), + } + for state, coordinate in state_indicators.iteritems(): + asset = assets.image.ToggleImageAsset(coordinate[0], coordinate[1], + "assets/art/gui/button_%s_highlight.png" % state) + datastore.add_entry(state, asset, 'states') + picasso.add_asset('999_ontop', asset) + def add_buttons(picasso): datastore = Datastore() #next_button = assets.clickable.ClickableAsset( @@ -202,6 +219,10 @@ def check_gui_quit_event(game_master): def update_game_info_panel(*args): Datastore().get_entry('game_info').update() +def update_current_phase(game_master, previous, current): + for state, asset in Datastore().get_storage('states').iteritems(): + asset.set_state(state == current) + def release_control(game_master, *args): # release CPU for faster screen update time.sleep(0)