-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathreplay.py
79 lines (67 loc) · 2.38 KB
/
replay.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
from enum import Enum
import struct, json
class Team(Enum):
Red = 0
Blue = 1
class State(Enum):
Menu = 0
Pause = 1
Warmup = 2
Game = 3
Goal = 4
class Input(Enum):
Up = 1
Down = 2
Left = 4
Right = 8
Kick = 16
def test(self, input_):
return input_ & self.value == self.value
class Disc:
def __init__(self, x, y, vx, vy):
self.x, self.y, self.vx, self.vy = x, y, vx, vy
class Player:
def __init__(self, id_, input_, kick, team, disc):
self.id, self.input, self.kick, self.team, self.disc = id_, input_, kick, team, disc
self.input = [bool(input_ & (1 << n)) for n in range(5)]
class Game:
def __init__(self, replayTime, state, gameTime, score, overtime, players, ball):
self.replayTime, self.state, self.gameTime, self.score, self.overtime, self.players, self.ball = replayTime, state, gameTime, score, overtime, players, ball
def unpack2(struct_, buffer, offset):
return struct_.unpack_from(buffer, offset), offset + struct_.size
_Disc_s = struct.Struct('>dddd')
def _Disc(buffer, offset):
(x, y, vx, vy), offset = unpack2(_Disc_s, buffer, offset)
return Disc(x, y, vx, vy), offset
_Player_s = struct.Struct('>BBBB')
def _Player(buffer, offset):
(id_, input_, kick_, team_), offset = unpack2(_Player_s, buffer, offset)
disc, offset = _Disc(buffer, offset)
return Player(id_, input_, bool(kick_), Team(team_), disc), offset
_Game_s1 = struct.Struct('>dB')
_Game_s2 = struct.Struct('>dBBBB')
def _Game(buffer, offset):
(replayTime, state_), offset = unpack2(_Game_s1, buffer, offset)
state = State(state_)
if state == State.Menu:
gameTime, score, overtime, ball, players = None, None, None, None, None
else:
(gameTime, redScore, blueScore, overtime_, playersCount), offset = unpack2(_Game_s2, buffer, offset)
overtime = bool(overtime_)
score = (redScore, blueScore)
players = []
for _ in range(playersCount):
player, offset = _Player(buffer, offset)
players.append(player)
ball, offset = _Disc(buffer, offset)
return Game(replayTime, state, gameTime, score, overtime, players, ball), offset
def Replay(buffer):
separator = b'\r\n\r\n'
offset = buffer.find(separator)
names = {int(k): v for k, v in json.loads(buffer[:offset].decode('utf8')).items()}
offset += len(separator)
games = []
while offset < len(buffer):
game, offset = _Game(buffer, offset)
games.append(game)
return names, games