Generation improvements

Hera Lobby fix
Added gauntlet 3 to cut carpet
This commit is contained in:
aerinon
2020-10-07 16:33:43 -06:00
parent 0ff0a1cf76
commit 38be9e6ec0
9 changed files with 345 additions and 52 deletions

196
Utils.py
View File

@@ -457,7 +457,201 @@ def print_graph(world):
ET.dump(root)
def extract_data_from_us_rom(rom):
with open(rom, 'rb') as stream:
rom_data = bytearray(stream.read())
rooms = [0x9a, 0x69, 0x78, 0x79, 0x7a, 0x88, 0x8a, 0xad]
for room in rooms:
b2idx = room*2
b3idx = room*3
headerptr = 0x110000 + b2idx # zscream specific
headerloc = rom_data[headerptr] + rom_data[headerptr+1]*0x100 + 0x108000 # zscream specific
header, objectdata, spritedata, secretdata = [], [], [], []
for i in range(0, 14):
header.append(rom_data[headerloc+i])
objectptr = 0xF8000 + b3idx
objectloc = rom_data[objectptr] + rom_data[objectptr+1]*0x100 + rom_data[objectptr+2]*0x10000
objectloc -= 0x100000
stop, idx = False, 0
ffcnt = 0
mode = 0
while ffcnt < 2:
b1 = rom_data[objectloc+idx]
b2 = rom_data[objectloc+idx+1]
b3 = rom_data[objectloc+idx+2]
objectdata.append(b1)
objectdata.append(b2)
if b1 == 0xff and b2 == 0xff:
ffcnt += 1
mode = 0
if b1 == 0xf0 and b2 == 0xff:
mode = 1
if not mode and ffcnt < 2:
objectdata.append(b3)
idx += 3
else:
idx += 2
spriteptr = 0x4d62e + b2idx
spriteloc = rom_data[spriteptr] + rom_data[spriteptr+1]*0x100 + 0x40000
done, idx = False, 0
while not done:
b1 = rom_data[spriteloc+idx]
spritedata.append(b1)
if b1 == 0xff:
done = True
idx += 1
secretptr = 0xdb69 + b2idx
secretloc = rom_data[secretptr] + rom_data[secretptr+1]*0x100
done, idx = False, 0
while not done:
b1 = rom_data[secretloc+idx]
b2 = rom_data[secretloc+idx+1]
b3 = rom_data[secretloc+idx+2]
secretdata.append(b1)
secretdata.append(b2)
if b1 == 0xff and b2 == 0xff:
done = True
else:
secretdata.append(b3)
idx += 3
print(f'Room {room:02x}')
print(f'db {",".join([f"${x:02x}" for x in header])}')
print(f'Obj Length: {len(objectdata)}')
print_data_block(objectdata)
print('Sprites')
print_data_block(spritedata)
print('Secrets')
print_data_block(secretdata)
blockdata, torchdata = [], []
blockloc = 0x271de
for i in range(0, 128):
idx = i*4
b1 = rom_data[blockloc+idx]
b2 = rom_data[blockloc+idx+1]
room_idx = b1 + b2*0x100
if room_idx in rooms:
blockdata.append(b1)
blockdata.append(b2)
blockdata.append(rom_data[blockloc+idx+2])
blockdata.append(rom_data[blockloc+idx+3])
torchloc = 0x2736A
nomatch = False
append = False
for i in range(0, 192):
idx = i*2
b1 = rom_data[torchloc+idx]
b2 = rom_data[torchloc+idx+1]
if nomatch:
if b1 == 0xff and b2 == 0xff:
nomatch = False
elif not append:
room_idx = b1 + b2*0x100
if room_idx in rooms:
append = True
else:
nomatch = True
if append:
torchdata.append(b1)
torchdata.append(b2)
if b1 == 0xff and b2 == 0xff:
append = False
print('Blocks')
print_data_block(blockdata)
print('Torches')
print_data_block(torchdata)
print()
def print_data_block(block):
for i in range(0, len(block)//16 + 1):
slice = block[i*16:i*16+16]
print(f'db {",".join([f"${x:02x}" for x in slice])}')
def extract_data_from_jp_rom(rom):
with open(rom, 'rb') as stream:
rom_data = bytearray(stream.read())
rooms = [0x7b, 0x7c, 0x7d, 0x8b, 0x8c, 0x8d, 0x9b, 0x9c, 0x9d]
for room in rooms:
b2idx = room*2
b3idx = room*3
headerptr = 0x271e2 + b2idx
headerloc = rom_data[headerptr] + rom_data[headerptr+1]*0x100 + 0x18000
header, objectdata, spritedata, secretdata = [], [], [], []
for i in range(0, 14):
header.append(rom_data[headerloc+i])
objectptr = 0xF8000 + b3idx
objectloc = rom_data[objectptr] + rom_data[objectptr+1]*0x100 + rom_data[objectptr+2]*0x10000
objectloc -= 0x100000
stop, idx = False, 0
ffcnt = 0
mode = 0
while ffcnt < 2:
b1 = rom_data[objectloc+idx]
b2 = rom_data[objectloc+idx+1]
b3 = rom_data[objectloc+idx+2]
objectdata.append(b1)
objectdata.append(b2)
if b1 == 0xff and b2 == 0xff:
ffcnt += 1
mode = 0
if b1 == 0xf0 and b2 == 0xff:
mode = 1
if not mode and ffcnt < 2:
objectdata.append(b3)
idx += 3
else:
idx += 2
spriteptr = 0x4d62e + b2idx
spriteloc = rom_data[spriteptr] + rom_data[spriteptr+1]*0x100 + 0x40000
secretptr = 0xdb67 + b2idx
secretloc = rom_data[secretptr] + rom_data[secretptr+1]*0x100
done, idx = False, 0
while not done:
b1 = rom_data[spriteloc+idx]
spritedata.append(b1)
if b1 == 0xff:
done = True
idx += 1
done, idx = False, 0
while not done:
b1 = rom_data[secretloc+idx]
b2 = rom_data[secretloc+idx+1]
b3 = rom_data[secretloc+idx+2]
secretdata.append(b1)
secretdata.append(b2)
if b1 == 0xff and b2 == 0xff:
done = True
else:
secretdata.append(b3)
idx += 3
print(f'Room {room:02x}')
print(f'HeaderPtr {headerptr:06x}')
print(f'HeaderLoc {headerloc:06x}')
print(f'db {",".join([f"${x:02x}" for x in header])}')
print(f'Obj Length: {len(objectdata)}')
print(f'ObjectPtr {objectptr:06x}')
print(f'ObjectLoc {objectloc:06x}')
for i in range(0, len(objectdata)//16 + 1):
slice = objectdata[i*16:i*16+16]
print(f'db {",".join([f"${x:02x}" for x in slice])}')
print(f'SpritePtr {spriteptr:06x}')
print(f'SpriteLoc {spriteloc:06x}')
print_data_block(spritedata)
print(f'SecretPtr {secretptr:06x}')
print(f'SecretLoc {secretloc:06x}')
print_data_block(secretdata)
print()
if __name__ == '__main__':
# make_new_base2current()
# read_entrance_data(old_rom=sys.argv[1])
room_palette_data(old_rom=sys.argv[1])
# room_palette_data(old_rom=sys.argv[1])
extract_data_from_us_rom(sys.argv[1])
# extract_data_from_jp_rom(sys.argv[1])