def on_cleared_orders(game, notification): """ Manage notification ClearedOrders. :param game: a Network game :param notification: notification received :type game: diplomacy.client.network_game.NetworkGame :type notification: diplomacy.communication.notifications.ClearedOrders """ Game.clear_orders(game, notification.power_name)
def on_clear_orders(context, response): """ Manage response for request ClearOrders. :param context: request context :param response: response received :return: None :type context: RequestFutureContext """ request = context.request # type: requests.ClearOrders Game.clear_orders(context.game, request.power_name)
def test_clear_orders(): """ Test - Clear orders""" game = Game() game.clear_units() game.set_units('ITALY', 'A VEN') game.set_units('AUSTRIA', 'A VIE') game.set_orders('ITALY', 'A VEN - TYR') game.set_orders('AUSTRIA', 'A VIE - TYR') game.clear_orders() game.process() results = game.get_order_status() assert results['ITALY']['A VEN'] == [] assert results['AUSTRIA']['A VIE'] == []
def is_valid_saved_game(saved_game): """ Checks if the saved game is valid. This is an expensive operation because it replays the game. :param saved_game: The saved game (from to_saved_game_format) :return: A boolean that indicates if the game is valid """ # pylint: disable=too-many-return-statements, too-many-nested-blocks, too-many-branches nb_forced_phases = 0 max_nb_forced_phases = 1 if 'DIFFERENT_ADJUDICATION' in saved_game.get('rules', []) else 0 # Validating default fields if 'id' not in saved_game or not saved_game['id']: return False if 'map' not in saved_game: return False map_object = Map(saved_game['map']) if map_object.name != saved_game['map']: return False if 'rules' not in saved_game: return False if 'phases' not in saved_game: return False # Validating each phase nb_messages = 0 nb_phases = len(saved_game['phases']) last_time_sent = -1 for phase_ix in range(nb_phases): current_phase = saved_game['phases'][phase_ix] state = current_phase['state'] phase_orders = current_phase['orders'] previous_phase_name = 'FORMING' if phase_ix == 0 else saved_game['phases'][phase_ix - 1]['name'] next_phase_name = 'COMPLETED' if phase_ix == nb_phases - 1 else saved_game['phases'][phase_ix + 1]['name'] power_names = list(state['units'].keys()) # Validating messages for message in saved_game['phases'][phase_ix]['messages']: nb_messages += 1 if map_object.compare_phases(previous_phase_name, message['phase']) >= 0: return False if map_object.compare_phases(message['phase'], next_phase_name) > 0: return False if message['sender'] not in power_names + ['SYSTEM']: return False if message['recipient'] not in power_names + ['GLOBAL']: return False if message['time_sent'] < last_time_sent: return False last_time_sent = message['time_sent'] # Validating phase if phase_ix < (nb_phases - 1): is_forced_phase = False # Setting game state game = Game(saved_game['id'], map_name=saved_game['map'], rules=['SOLITAIRE'] + saved_game['rules']) game.set_phase_data(GamePhaseData.from_dict(current_phase)) # Determining what phase we should expect from the dataset. next_state = saved_game['phases'][phase_ix + 1]['state'] # Setting orders game.clear_orders() for power_name in phase_orders: game.set_orders(power_name, phase_orders[power_name]) # Validating orders orders = game.get_orders() possible_orders = game.get_all_possible_orders() for power_name in orders: if sorted(orders[power_name]) != sorted(current_phase['orders'][power_name]): return False if 'NO_CHECK' not in game.rules: for order in orders[power_name]: loc = order.split()[1] if order not in possible_orders[loc]: return False # Validating resulting state game.process() # Checking phase name if game.get_current_phase() != next_state['name']: is_forced_phase = True # Checking zobrist hash if game.get_hash() != next_state['zobrist_hash']: is_forced_phase = True # Checking units units = game.get_units() for power_name in units: if sorted(units[power_name]) != sorted(next_state['units'][power_name]): is_forced_phase = True # Checking centers centers = game.get_centers() for power_name in centers: if sorted(centers[power_name]) != sorted(next_state['centers'][power_name]): is_forced_phase = True # Allowing 1 forced phase if DIFFERENT_ADJUDICATION is in rule if is_forced_phase: nb_forced_phases += 1 if nb_forced_phases > max_nb_forced_phases: return False # Making sure NO_PRESS is not set if 'NO_PRESS' in saved_game['rules'] and nb_messages > 0: return False # The data is valid return True