From 4dc58f6d0e4d38ab354a831347ecaf376ad30ca5 Mon Sep 17 00:00:00 2001 From: Markus Eger Date: Wed, 9 Apr 2014 16:35:10 -0400 Subject: [PATCH] allow parsing of replays made after january 29 (replay takeover) --- skadi/demo.py | 80 +++++++++++++++++++++------------------ skadi/io/protobuf/demo.py | 2 +- skadi/io/unpacker/prop.py | 9 ++++- 3 files changed, 51 insertions(+), 40 deletions(-) diff --git a/skadi/demo.py b/skadi/demo.py index b929830..2bab5bd 100644 --- a/skadi/demo.py +++ b/skadi/demo.py @@ -35,20 +35,25 @@ def scan(prologue, demo_io, tick=None): try: p, m = next(iter_bootstrap) - item = (p, d_io.parse(p.kind, p.compressed, m)) + if m: + item = (p, d_io.parse(p.kind, p.compressed, m)) while True: - if p.kind == pb_d.DEM_FullPacket: - full_packets.append(item) - remaining_packets = [] - else: - remaining_packets.append(item) + if item: + if p.kind == pb_d.DEM_FullPacket: + full_packets.append(item) + remaining_packets = [] + else: + remaining_packets.append(item) if p.tick >= tick: break p, m = next(iter_bootstrap) - item = (p, d_io.parse(p.kind, p.compressed, m)) + if m: + item = (p, d_io.parse(p.kind, p.compressed, m)) + else: + item = None except StopIteration: raise EOFError() @@ -126,45 +131,46 @@ def __iter__(self): while True: peek, message = next(iter_entries) - - if peek.kind == pb_d.DEM_FullPacket: - continue - elif peek.kind == pb_d.DEM_Stop: - raise StopIteration() - else: - pbmsg = d_io.parse(peek.kind, peek.compressed, message) - self.advance(peek.tick, pbmsg) - - t = self.tick - um, ge = self.user_messages, self.game_events - w, m = self.world, self.modifiers - yield [t, um, ge, w, m] + if message: + if peek.kind == pb_d.DEM_FullPacket: + continue + elif peek.kind == pb_d.DEM_Stop: + raise StopIteration() + else: + pbmsg = d_io.parse(peek.kind, peek.compressed, message) + self.advance(peek.tick, pbmsg) + + t = self.tick + um, ge = self.user_messages, self.game_events + w, m = self.world, self.modifiers + yield [t, um, ge, w, m] def iterfullticks(self): iter_entries = iter(self.demo_io) while True: peek, message = next(iter_entries) - - if peek.kind == pb_d.DEM_Stop: - raise StopIteration() - elif peek.kind != pb_d.DEM_FullPacket: - continue - - pro = self.prologue - - full_packet = (peek, d_io.parse(peek.kind, peek.compressed, message)) - self.world, self.modifiers, self.string_tables = reconstitute( - [full_packet], pro.class_bits, pro.recv_tables, self.string_tables) - self.tick = peek.tick - self.user_messages = [] - self.game_events = [] - yield [self.tick, self.user_messages, self.game_events, self.world, - self.modifiers] + if message: + if peek.kind == pb_d.DEM_Stop: + raise StopIteration() + elif peek.kind != pb_d.DEM_FullPacket: + continue + + pro = self.prologue + + full_packet = (peek, d_io.parse(peek.kind, peek.compressed, message)) + self.world, self.modifiers, self.string_tables = reconstitute( + [full_packet], pro.class_bits, pro.recv_tables, self.string_tables) + self.tick = peek.tick + self.user_messages = [] + self.game_events = [] + yield [self.tick, self.user_messages, self.game_events, self.world, + self.modifiers] def advance(self, tick, pbmsg): self.tick = tick - + if not hasattr(pbmsg, "data"): + return packet = ie_packet.construct(p_io.construct(pbmsg.data)) am_entries = [] diff --git a/skadi/io/protobuf/demo.py b/skadi/io/protobuf/demo.py index fda36c6..8525565 100644 --- a/skadi/io/protobuf/demo.py +++ b/skadi/io/protobuf/demo.py @@ -54,7 +54,7 @@ def read(self): message = self.io.read(size) else: # TODO: log here. - print 'unknown kind {}'.format(kind) + #print 'unknown kind {}'.format(kind) message = None self.io.read(size) diff --git a/skadi/io/unpacker/prop.py b/skadi/io/unpacker/prop.py index 00ff0f4..6040832 100644 --- a/skadi/io/unpacker/prop.py +++ b/skadi/io/unpacker/prop.py @@ -155,9 +155,14 @@ def _unpack_array(self, num_elements, array_prop): return elements def _unpack_int64(self, flags, num_bits): + #if flags & Flag.EncodedAgainstTickcount: + #raise NotImplementedError('int64 cant be encoded against tickcount') if flags & Flag.EncodedAgainstTickcount: - raise NotImplementedError('int64 cant be encoded against tickcount') - + if flags & Flag.Unsigned: + return self.bitstream.read_varint() + else: + value = self.bitstream.read_varint() + return (-(value & 1)) ^ (value >> 1) negate = False second_bits = num_bits - 32