from typing import List, Dict, Tuple from hanabi.hanab_game import Action, ActionType from hanabi.live.hanab_live import HanabLiveInstance, parse_json_game, HanabLiveGameState def analyze_game(instance: HanabLiveInstance, actions: List[Action]) -> Tuple[List[int], str]: bdrs = [] termination = '' game = HanabLiveGameState(instance) for action in actions: if action.type == ActionType.Discard or (action.type == ActionType.Play and not game.is_playable(instance.deck[action.target])): discard = instance.deck[action.target] if not game.is_trash(discard): if game.is_critical(discard): termination = 'Discard crit' if action.type == ActionType.Discard else 'Bomb crit' break if discard.rank != 1: if discard in game.deck[game.progress:]: bdrs.append(game.draw_pile_size) else: if game.deck[game.progress:].count(discard) == 2: bdrs.append(game.draw_pile_size) if action.type == ActionType.Play: play = instance.deck[action.target] if (not game.is_playable(play)) and game.is_critical(play): termination = 'Bomb crit' game.make_action(action) if termination == '': if game.strikes == 3: termination = 'Strikeout' elif actions[-1].type in [ActionType.EndGame, ActionType.VoteTerminate]: termination = 'VTK' elif game.score < 25: termination = 'Lost Endgame' return bdrs, termination def describe_game(game_json: Dict) -> Tuple[List[int], str]: instance, actions = parse_json_game(game_json) bdrs, termination = analyze_game(instance, actions) return bdrs, termination