(self, raw: bytes, players=None)
| 76 | DRAW_JS = DRAW_JS |
| 77 | |
| 78 | def parse(self, raw: bytes, players=None) -> ReplayData: |
| 79 | log = json.loads(raw.decode(errors="replace")) |
| 80 | size = log.get("board_size", 15) |
| 81 | moves = log.get("moves", []) |
| 82 | |
| 83 | # Resolve the engine's internal "player1"/"player2" tokens to real bot names. |
| 84 | # The engine writes those tokens as the black/white names; the tournament's own |
| 85 | # player list gives us the human-facing names (player1 == players[0]). |
| 86 | token_name = {} |
| 87 | if players: |
| 88 | if len(players) > 0: |
| 89 | token_name["player1"] = players[0].get("name", "player1") |
| 90 | if len(players) > 1: |
| 91 | token_name["player2"] = players[1].get("name", "player2") |
| 92 | pl = log.get("players", {}) |
| 93 | black_token = pl.get("black", {}).get("name", "player1") |
| 94 | white_token = pl.get("white", {}).get("name", "player2") |
| 95 | black_name = token_name.get(black_token, black_token) |
| 96 | white_name = token_name.get(white_token, white_token) |
| 97 | |
| 98 | # frame 0 = empty board, then one frame per placed stone |
| 99 | board: list[list[int]] = [] |
| 100 | black_count = white_count = 0 |
| 101 | frames = [ |
| 102 | { |
| 103 | "turn": 0, |
| 104 | "board": [], |
| 105 | "last": None, |
| 106 | "next": "Black", |
| 107 | "blackCount": 0, |
| 108 | "whiteCount": 0, |
| 109 | } |
| 110 | ] |
| 111 | for mv in moves: |
| 112 | x, y = mv["x"], mv["y"] |
| 113 | stone = 1 if mv["player"] == "black" else 2 |
| 114 | board.append([x, y, stone]) |
| 115 | if stone == 1: |
| 116 | black_count += 1 |
| 117 | else: |
| 118 | white_count += 1 |
| 119 | frames.append( |
| 120 | { |
| 121 | "turn": mv.get("move_number", len(board)), |
| 122 | "board": [c[:] for c in board], |
| 123 | "last": [x, y], |
| 124 | "next": "White" if mv["player"] == "black" else "Black", |
| 125 | "blackCount": black_count, |
| 126 | "whiteCount": white_count, |
| 127 | } |
| 128 | ) |
| 129 | |
| 130 | result = log.get("winner") |
| 131 | if result in ("draw", None): |
| 132 | winner, draw = None, result == "draw" |
| 133 | elif result in ("player1", "player2"): |
| 134 | winner, draw = token_name.get(result, result), False |
| 135 | else: |
nothing calls this directly
no test coverage detected