Generation improvements
Hera Lobby fix Added gauntlet 3 to cut carpet
This commit is contained in:
196
Utils.py
196
Utils.py
@@ -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])
|
||||
|
||||
|
||||
Reference in New Issue
Block a user