mirror of
https://github.com/snesrev/zelda3.git
synced 2025-12-23 21:04:51 -05:00
Add some code to be able to read inputs from a text file
This commit is contained in:
48
other/extract_snapshot_log.py
Normal file
48
other/extract_snapshot_log.py
Normal file
@@ -0,0 +1,48 @@
|
||||
import struct
|
||||
import sys
|
||||
|
||||
data = open(sys.argv[1], 'rb').read()
|
||||
|
||||
ver, total_frames, log_size, last_inputs = struct.unpack_from('IIII', data)
|
||||
|
||||
log = data[32:32+log_size]
|
||||
|
||||
KEYS = "AXsSUDLRBY"
|
||||
|
||||
keys_memo = {}
|
||||
def get_keys(i):
|
||||
if i not in keys_memo:
|
||||
keys_memo[i] = "".join(k for j, k in enumerate(KEYS) if i & (1 << j))
|
||||
return keys_memo[i]
|
||||
|
||||
frame_ctr = 0
|
||||
bb = iter(log)
|
||||
|
||||
try:
|
||||
while True:
|
||||
cmd = bb.__next__()
|
||||
mask = 0xf if cmd < 0xc0 else 1
|
||||
frames = cmd & mask
|
||||
if frames == mask:
|
||||
while True:
|
||||
t = bb.__next__()
|
||||
frames += t
|
||||
if t != 255:
|
||||
break
|
||||
frame_ctr += frames
|
||||
if cmd < 0xc0:
|
||||
last_inputs ^= 1 << (cmd >> 4)
|
||||
print('%d: %s' % (frame_ctr, get_keys(last_inputs)))
|
||||
elif cmd < 0xd0:
|
||||
nb = 1 + ((cmd >> 2) & 3)
|
||||
addr = ((cmd >> 1) & 1) << 16
|
||||
addr |= bb.__next__() << 8
|
||||
addr |= bb.__next__()
|
||||
for i in range(nb):
|
||||
bb.__next__()
|
||||
print('%d: patchbytes(0x%x)' % (frame_ctr, addr))
|
||||
else:
|
||||
assert 0
|
||||
except StopIteration:
|
||||
pass
|
||||
|
||||
Reference in New Issue
Block a user