From cd94f6fa68331e84ee4df407c4b68cb421080f60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maximilian=20Ke=C3=9Fler?= Date: Tue, 8 Aug 2023 12:12:16 +0200 Subject: [PATCH] add method to parse game from json --- src/hanabi/live/hanab_live.py | 48 ++++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/src/hanabi/live/hanab_live.py b/src/hanabi/live/hanab_live.py index e1e2904..c0b7b8f 100644 --- a/src/hanabi/live/hanab_live.py +++ b/src/hanabi/live/hanab_live.py @@ -1,5 +1,6 @@ -from typing import List +from typing import List, Dict, Tuple +from hanab_game import Action, ParseError from hanabi import hanab_game from hanabi import constants from hanabi.live import variants @@ -26,6 +27,7 @@ class HanabLiveInstance(hanab_game.HanabiInstance): self.variant_id = variant_id self.variant = variants.Variant.from_db(self.variant_id) + @staticmethod def select_standard_variant_id(instance: hanab_game.HanabiInstance): err_msg = "Hanabi instance not supported by hanab.live, cannot convert to HanabLiveInstance: " @@ -40,6 +42,50 @@ class HanabLiveInstance(hanab_game.HanabiInstance): return constants.VARIANT_IDS_STANDARD_DISTRIBUTIONS[instance.num_suits][instance.num_dark_suits] +def parse_json_game(game_json: Dict) -> Tuple[HanabLiveInstance, List[Action]]: + game_id = game_json.get('id', None) + players = game_json.get('players', []) + num_players = len(players) + if num_players < 2 or num_players > 6: + raise ParseError(num_players) + + seed = game_json.get('seed', None) + if type(seed) != str: + raise ParseError("Unexpected seed, expected string, got {}".format(seed)) + + options = game_json.get('options', {}) + var_id = variants.variant_id(options.get('variant', 'No Variant')) + deck_plays = options.get('deckPlays', False) + one_extra_card = options.get('oneExtraCard', False) + one_less_card = options.get('oneLessCard', False) + all_or_nothing = options.get('allOrNothing', False) + starting_player = options.get('startingPlayer', 0) + detrimental_characters = options.get('detrimentalCharacters', False) + + try: + actions = [hanab_game.Action.from_json(action) for action in game_json.get('actions', [])] + except hanab_game.ParseError as e: + raise ParseError("Failed to parse actions") from e + + try: + deck = [hanab_game.DeckCard.from_json(card) for card in game_json.get('deck', None)] + except hanab_game.ParseError as e: + raise ParseError("Failed to parse deck") from e + + if detrimental_characters: + raise NotImplementedError( + "detrimental characters not supported, cannot determine score of game {}".format(game_id) + ) + return HanabLiveInstance( + deck, num_players, var_id, + deck_plays=deck_plays, + one_less_card=one_less_card, + one_extra_card=one_extra_card, + all_or_nothing=all_or_nothing, + starting_player=starting_player + ), actions + + class HanabLiveGameState(hanab_game.GameState): def __init__(self, instance: HanabLiveInstance): super().__init__(instance)