From b0521bedc67dfee438acc26645e1339f0caafbe2 Mon Sep 17 00:00:00 2001 From: notoraptor Date: Tue, 27 Aug 2019 21:04:36 -0400 Subject: Make sure to clear all orders before setting a new game state. --- diplomacy/client/network_game.py | 23 ----------------------- diplomacy/engine/game.py | 14 +++++++++++--- 2 files changed, 11 insertions(+), 26 deletions(-) (limited to 'diplomacy') diff --git a/diplomacy/client/network_game.py b/diplomacy/client/network_game.py index e75687f..368d1d2 100644 --- a/diplomacy/client/network_game.py +++ b/diplomacy/client/network_game.py @@ -21,7 +21,6 @@ from diplomacy.client.channel import Channel from diplomacy.communication import notifications from diplomacy.engine.game import Game from diplomacy.utils.exceptions import DiplomacyException -from diplomacy.utils.game_phase_data import GamePhaseData LOGGER = logging.getLogger(__name__) @@ -175,25 +174,3 @@ class NetworkGame(Game): """ Notify game with given notification (call associated callbacks if defined). """ for callback in self.notification_callbacks.get(type(notification), ()): callback(self, notification) - - def set_phase_data(self, phase_data, clear_history=True): - """ Overwrite base method to prevent call to channel methods. """ - if not phase_data: - return - if isinstance(phase_data, GamePhaseData): - phase_data = [phase_data] - elif not isinstance(phase_data, list): - phase_data = list(phase_data) - - if clear_history: - self._clear_history() - - for game_phase_data in phase_data[:-1]: # type: GamePhaseData - Game.extend_phase_history(self, game_phase_data) - - current_phase_data = phase_data[-1] # type: GamePhaseData - Game.set_state(self, current_phase_data.state, clear_history=clear_history) - for power_name, power_orders in current_phase_data.orders.items(): - Game.set_orders(self, power_name, power_orders) - self.messages = current_phase_data.messages.copy() - # We ignore 'results' for current phase data. diff --git a/diplomacy/engine/game.py b/diplomacy/engine/game.py index 4c87362..8da3480 100644 --- a/diplomacy/engine/game.py +++ b/diplomacy/engine/game.py @@ -1448,6 +1448,10 @@ class Game(Jsonable): Previous phase data in given list will replace current game history. :param clear_history: Indicate if we must clear game history fields before update. """ + # In the following code, we use Game.method instead of self.method to make sure + # game internal state is correctly set without calling any asynchronous + # overriden method from a derived class (especially NetworkGame class). + if not phase_data: return if isinstance(phase_data, GamePhaseData): @@ -1457,15 +1461,19 @@ class Game(Jsonable): if clear_history: self._clear_history() + else: + # Clear orders and vote - Messages will be totally overwritten below. + Game.clear_vote(self) + Game.clear_orders(self) for game_phase_data in phase_data[:-1]: # type: GamePhaseData - self.extend_phase_history(game_phase_data) + Game.extend_phase_history(self, game_phase_data) current_phase_data = phase_data[-1] # type: GamePhaseData - self.set_state(current_phase_data.state, clear_history=False) + Game.set_state(self, current_phase_data.state, clear_history=False) for power_name, power_orders in current_phase_data.orders.items(): if power_orders is not None: - self.set_orders(power_name, power_orders) + Game.set_orders(self, power_name, power_orders) self.messages = current_phase_data.messages.copy() # We ignore 'results' for current phase data. -- cgit v1.2.3