MCPcopy Create free account
hub / github.com/CodeClash-ai/CodeClash / parse

Method parse

codeclash/arenas/gomoku/replay.py:78–147  ·  view source on GitHub ↗
(self, raw: bytes, players=None)

Source from the content-addressed store, hash-verified

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:

Callers

nothing calls this directly

Calls 2

ReplayDataClass · 0.90
getMethod · 0.80

Tested by

no test coverage detected