import demo, message, pprint from block import Block d = demo.Demo("fp/credits.dem") updatecounts = {} positions = {} outd = [] spawns = {} print repr(d.cdtrack) for block in d: for msg in block: if isinstance(msg, message.SpawnBaseline): spawns[msg.entity] = [msg, False] elif isinstance(msg, message.UpdateEntity): if msg.entity in spawns and not spawns[msg.entity][1]: spawns[msg.entity][1] = True spawn = spawns[msg.entity][0] for i, c in enumerate(msg.origin): if c is not None: spawn.default_origin[i] = c for i, c in enumerate(msg.angles): if c is not None: spawn.default_angles[i] = c for attr in ('modelindex', 'frame', 'skin', 'colormap'): v = getattr(msg, attr) if v is not None: setattr(spawn, 'default_' + attr, v) updatecounts[msg.entity] = updatecounts.get(msg.entity, 0) + 1 positions.setdefault(msg.entity, {})[tuple(msg.origin)] = 1 elif isinstance(msg, message.TempEntity): print "argh!" stills = [e for (e,p) in positions.iteritems() if len(p) == 1] moving = [e for (e,p) in positions.iteritems() if len(p) != 1] unseen = [m[0].entity for m in spawns.itervalues() if not m[1]] print sorted(stills) print sorted(moving) print sorted(unseen) d = demo.Demo("fp/credits.dem") outf = open('outfoo.dem', 'wb') outf.write(d.cdtrack) angles = block.angles for block in d: outb = Block.new() outb.angles = angles for msg in block: if isinstance(msg, message.SpawnBaseline): if msg.entity == 0: outb.push(chr(msg.opcode) + msg._data_) elif msg.entity not in unseen: outb.push(spawns[msg.entity][0].serialize()) elif isinstance(msg, message.UpdateEntity): outb.push('\x80'+chr(msg.entity)) else: outb.push(chr(msg.opcode) + msg._data_) outf.write(outb.serialize()) outf.close()