add method to parse game from json
This commit is contained in:
parent
c65489655d
commit
cd94f6fa68
1 changed files with 47 additions and 1 deletions
|
@ -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 hanab_game
|
||||||
from hanabi import constants
|
from hanabi import constants
|
||||||
from hanabi.live import variants
|
from hanabi.live import variants
|
||||||
|
@ -26,6 +27,7 @@ class HanabLiveInstance(hanab_game.HanabiInstance):
|
||||||
self.variant_id = variant_id
|
self.variant_id = variant_id
|
||||||
self.variant = variants.Variant.from_db(self.variant_id)
|
self.variant = variants.Variant.from_db(self.variant_id)
|
||||||
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def select_standard_variant_id(instance: hanab_game.HanabiInstance):
|
def select_standard_variant_id(instance: hanab_game.HanabiInstance):
|
||||||
err_msg = "Hanabi instance not supported by hanab.live, cannot convert to HanabLiveInstance: "
|
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]
|
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):
|
class HanabLiveGameState(hanab_game.GameState):
|
||||||
def __init__(self, instance: HanabLiveInstance):
|
def __init__(self, instance: HanabLiveInstance):
|
||||||
super().__init__(instance)
|
super().__init__(instance)
|
||||||
|
|
Loading…
Reference in a new issue