Usage: python secrets.py <savefile00.sav>
Output: (level) (x,y coordinate) (secret type) (secret name) for each secret you haven't found yet.
Code: Select all
#!/usr/bin/env python
import struct
import sys
import zlib
secret_items = [
'ancient_apparatus',
'golden_chalice',
'golden_crown',
'golden_dragon',
'golden_figure',
'golden_goromorg',
'golden_orb',
'note',
'skull'
]
def enty(raw):
offset = 0
(a,b) = struct.unpack('<II', raw[offset:offset+8])
offset += 8
name = raw[offset:offset+b]
offset += b
(a,b) = struct.unpack('<II', raw[offset:offset+8])
offset += 8
type = raw[offset:offset+b]
offset += b
(a, level, b, x, c, y, d, facing) = struct.unpack('<IdIdIdId', raw[offset:offset+48])
offset += 48
level = int(level)
x = int(x)
y = int(y)
assert(a == 1 and b == 1 and c == 1 and d == 1)
unfound = False
if type == 'secret':
if ord(raw[-1]) == 0:
unfound = True
elif type in secret_items:
(a,b) = struct.unpack('<II', raw[offset:offset+8])
offset += 8
where = raw[offset:offset+b]
offset += b
if type == 'note':
if ord(raw[offset+0xa6]) == 0x30:
unfound = True
else:
if ord(raw[offset+0xa6]) == 0x00:
unfound = True
if unfound:
print 'Level:', level, '('+str(x)+', '+str(y)+')', type, name if type == 'secret' else ''
def save(filename):
data = open(filename).read()
(magic, version, size) = struct.unpack('<4sII', data[:12])
assert(magic == 'GRIM')
assert(version == 6)
raw = zlib.decompress(data[12:])
assert(size == len(raw))
offset = 0
while offset < size:
(type,csize) = struct.unpack('<4sI', raw[offset:offset+8])
offset += 8
data = raw[offset:offset+csize]
offset += csize
if type == 'ENTY':
enty(data)
save(sys.argv[1])
SpoilerShow
Level: 1 (2, 10) secret entranceSecret
Level: 2 (20, 2) skull
Level: 2 (23, 6) golden_chalice
Level: 3 (1, 17) note
Level: 2 (20, 2) skull
Level: 2 (23, 6) golden_chalice
Level: 3 (1, 17) note