diff --git a/bdr.py b/bdr.py index 8d57e0b..b01cbef 100644 --- a/bdr.py +++ b/bdr.py @@ -13,7 +13,7 @@ def analyze_game(instance: HanabLiveInstance, actions: List[Action]) -> Tuple[Li discard = instance.deck[action.target] if not game.is_trash(discard): if game.is_critical(discard): - termination = 'Discard crit' + termination = 'Discard crit' if action.type == ActionType.Discard else 'Bomb crit' break if discard.rank != 1: if discard in game.deck[game.progress:]: diff --git a/get_sheet.py b/get_sheet.py index 46c50af..c410da8 100644 --- a/get_sheet.py +++ b/get_sheet.py @@ -3,7 +3,7 @@ import requests_cache import json import csv import pandas -from typing import List, Optional +from typing import List, Optional, Dict from pathlib import Path from hanabi.database import global_db_connection_manager @@ -73,7 +73,7 @@ def get_player_games(player: str): return json.loads(r.text) -def collect_player_games(): +def collect_player_games() -> Dict[int, Entry]: global_games = {} for player in player_mapping.keys(): print('Parsing games for player {}'.format(player)) @@ -201,9 +201,7 @@ def make_endgame_tables(ids: List[int], strategy: Optional[str] = None): x.to_html(Path(filename).with_suffix('.html'), escape=False) -def make_results_table(games): - analysis = analyze_games(games) - +def make_results_table(games, analysis): streaks = {} fieldnames = ['Game ID', 'Seed', 'Player #', 'Result', 'BDR'] fieldnames += sort_players_by_num_games(games) @@ -243,6 +241,51 @@ def make_results_table(games): a.to_html("out/games.html", escape=False) +def make_team_table(games, analysis): + stats = {3: {}, 4: {}, 5: {}} + for game_id, entry in games.items(): + normalized_players = sorted(map(lambda player: player_mapping.get(player, 'Other'), entry.players)) + if 'Other' in normalized_players: + continue + + num_p = len(normalized_players) + + key = ", ".join(normalized_players) + + bdr, termination = analysis[game_id] + + if key not in stats[num_p]: + stats[num_p][key] = { + 'Games': 0, + 'BDR': 0, + 'Win': 0, + 'Discard crit': 0, + 'Bomb crit': 0, + 'Strikeout': 0, + 'VTK': 0, + 'Lost Endgame': 0 + } + + stats[num_p][key]['Games'] += 1 + stats[num_p][key]['BDR'] += len(bdr) + if entry.won: + stats[num_p][key]['Win'] += 1 + else: + stats[num_p][key][termination] += 1 + + for num_p in range(3, 6): + filename = Path('out/teams_{}.csv'.format(num_p)) + with open(filename, 'w') as f: + writer = csv.DictWriter(f, fieldnames=['Team', 'Games', 'Win', 'BDR', 'Discard crit', 'Bomb crit', 'Strikeout', 'VTK', 'Lost Endgame']) + writer.writeheader() + for team, row in sorted(stats[num_p].items(), key=lambda item: -item[1]['Games']): + row['Team'] = team + writer.writerow(row) + + x = pandas.read_csv(filename) + x.to_html(filename.with_suffix('.html')) + + def create_replay_links(ids: List[int], strategy: str): outfile = Path('out/{}_links.csv'.format(strategy)) with open(outfile, 'w') as f: @@ -263,10 +306,14 @@ def create_replay_links(ids: List[int], strategy: str): def main(): games = collect_player_games() + analysis = analyze_games(games) game_ids = sorted(int(key) for key in games.keys()) # This is the main table, tracking streaks, loss reasons, BDRs - make_results_table(games) + make_results_table(games, analysis) + + # This tracks team statistics + make_team_table(games, analysis) # Additional endgame analysis stats: # For the real games