mirror of
https://github.com/zeldaret/tmc
synced 2026-09-02 18:12:46 -04:00
Use more macros
This commit is contained in:
@@ -5,14 +5,9 @@ import subprocess
|
||||
from distutils.util import strtobool
|
||||
import json
|
||||
|
||||
from assets.palette_group import PaletteGroup
|
||||
from assets.gfx_group import GfxGroup
|
||||
from assets.fixed_type_gfx import FixedTypeGfx
|
||||
from assets.frame_obj_lists import FrameObjLists
|
||||
from assets.extra_frame_offsets import ExtraFrameOffsets
|
||||
from assets.animation import Animation
|
||||
from assets.exit_list import ExitList
|
||||
from assets.entity_list import EntityList
|
||||
from assets.sprite_frame import SpriteFrame
|
||||
|
||||
verbose = False
|
||||
@@ -120,30 +115,15 @@ def extract_assets(variant, assets_folder):
|
||||
extract_midi(path, baserom_path, start, options)
|
||||
elif mode == 'aif':
|
||||
extract_aif(path, options)
|
||||
elif mode == 'palette_group':
|
||||
palette_group = PaletteGroup(path, start, size, options)
|
||||
palette_group.extract_binary(baserom)
|
||||
elif mode == 'gfx_group':
|
||||
gfx_group = GfxGroup(path, start, size, options)
|
||||
gfx_group.extract_binary(baserom)
|
||||
elif mode == 'fixed_type_gfx':
|
||||
fixed_type_gfx = FixedTypeGfx(path, start, size, options)
|
||||
fixed_type_gfx.extract_binary(baserom)
|
||||
elif mode == 'frame_obj_lists':
|
||||
frame_obj_lists = FrameObjLists(path, start, size, options)
|
||||
frame_obj_lists.extract_binary(baserom)
|
||||
elif mode == 'extra_frame_offsets':
|
||||
extra_frame_offsets = ExtraFrameOffsets(path, start, size, options)
|
||||
extra_frame_offsets.extract_binary(baserom)
|
||||
elif mode == 'animation':
|
||||
animation = Animation(path, start, size, options)
|
||||
animation.extract_binary(baserom)
|
||||
elif mode == 'exit_list':
|
||||
exit_list = ExitList(path, start, size, options)
|
||||
exit_list.extract_binary(baserom)
|
||||
elif mode == 'entity_list':
|
||||
entity_list = EntityList(path, start, size, options)
|
||||
entity_list.extract_binary(baserom)
|
||||
elif mode == 'sprite_frames':
|
||||
sprite_frames = SpriteFrame(path, start, size, options)
|
||||
sprite_frames.extract_binary(baserom)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
from assets.base import BaseAsset, Reader
|
||||
from assets.base import BaseAsset, Reader, opt_param
|
||||
|
||||
class Animation(BaseAsset):
|
||||
def __init__(self, path: str, addr: int, size: int, options: any) -> None:
|
||||
@@ -15,7 +15,11 @@ class Animation(BaseAsset):
|
||||
bitfield2 = reader.read_u8()
|
||||
|
||||
end_of_animation = bitfield2 & 0x80 != 0
|
||||
lines.append(f'\t.byte {frame_index}, {keyframe_duration}, {hex(bitfield)}, {hex(bitfield2)}\n')
|
||||
line = f'\tkeyframe frame_index={frame_index}'
|
||||
line += opt_param('duration', '0', str(keyframe_duration))
|
||||
line += opt_param('bitfield', '0x0', hex(bitfield))
|
||||
line += opt_param('bitfield2', '0x0', hex(bitfield2))
|
||||
lines.append(line + '\n')
|
||||
if not end_of_animation:
|
||||
lines.append('@ TODO why no terminator?\n')
|
||||
while reader.cursor < self.size:
|
||||
|
||||
@@ -1,39 +0,0 @@
|
||||
from assets.base import BaseAsset, Reader
|
||||
|
||||
class EntityList(BaseAsset):
|
||||
def __init__(self, path: str, addr: int, size: int, options: any) -> None:
|
||||
super().__init__(path, addr, size, options)
|
||||
|
||||
def extract_binary(self, rom: bytearray) -> None:
|
||||
reader = Reader(rom[self.addr:self.addr+self.size])
|
||||
|
||||
lines = []
|
||||
while reader.cursor + 15 < self.size:
|
||||
type_and_unknowns = reader.read_u8()
|
||||
|
||||
type = type_and_unknowns & 0x0F
|
||||
unknown_1 = (type_and_unknowns & 0xF0) >> 4
|
||||
unknowns = reader.read_u8()
|
||||
unknown_2 = unknowns & 0x0F
|
||||
unknown_3 = (unknowns & 0xF0) >> 4
|
||||
subtype = reader.read_u8()
|
||||
params_a = reader.read_u8()
|
||||
params_b = reader.read_u32()
|
||||
params_c = reader.read_u32()
|
||||
params_d = reader.read_u32()
|
||||
if type_and_unknowns == 0xff: # End of list
|
||||
lines.append(f'\t.4byte 0xff, 0, 0, 0 @terminator\n')
|
||||
break
|
||||
lines.append(f'\t.byte {type_and_unknowns}, {unknowns}, {subtype}, {params_a}\n')
|
||||
lines.append(f'\t.4byte {params_b}, {params_c}, {params_d}\n')
|
||||
# TODO resolve pointers in here
|
||||
|
||||
if reader.cursor < self.size:
|
||||
lines.append(f'@ unaccounted bytes\n')
|
||||
while reader.cursor < self.size:
|
||||
lines.append(f'.byte {reader.read_u8()}\n')
|
||||
|
||||
assert(self.path.endswith('.bin'))
|
||||
path = self.path[0:-4] + '.s'
|
||||
with open(path, 'w') as file:
|
||||
file.writelines(lines)
|
||||
@@ -1,4 +1,4 @@
|
||||
from assets.base import BaseAsset, Reader
|
||||
from assets.base import BaseAsset, Reader, opt_param
|
||||
|
||||
class ExitList(BaseAsset):
|
||||
def __init__(self, path: str, addr: int, size: int, options: any) -> None:
|
||||
@@ -24,16 +24,30 @@ class ExitList(BaseAsset):
|
||||
unknown_5 = reader.read_u16()
|
||||
padding_1 = reader.read_u16()
|
||||
if transition_type == 0xffff:
|
||||
lines.append(f'\t.4byte 0xffff, 0,0,0,0 @ terminator\n')
|
||||
lines.append(f'\texit_list_end\n')
|
||||
break
|
||||
lines.append(f'\t.2byte {transition_type} @ transition_type\n')
|
||||
lines.append(f'\t.2byte {x_pos}, {y_pos} @ pos\n')
|
||||
lines.append(f'\t.2byte {dest_x}, {dest_y} @ dest\n')
|
||||
lines.append(f'\t.byte {screen_edge} @ screen edge\n')
|
||||
lines.append(f'\t.byte {dest_area} @ screen edge\n')
|
||||
lines.append(f'\t.byte {dest_room} @ screen edge\n')
|
||||
lines.append(f'\t.byte {unknown_2}, {unknown_3}, {unknown_4} @ unknown\n')
|
||||
lines.append(f'\t.2byte {unknown_5}, {padding_1} @ unknown\n')
|
||||
# lines.append(f'\t.2byte {transition_type} @ transition_type\n')
|
||||
# lines.append(f'\t.2byte {x_pos}, {y_pos} @ pos\n')
|
||||
# lines.append(f'\t.2byte {dest_x}, {dest_y} @ dest\n')
|
||||
# lines.append(f'\t.byte {screen_edge} @ screen edge\n')
|
||||
# lines.append(f'\t.byte {dest_area} @ screen edge\n')
|
||||
# lines.append(f'\t.byte {dest_room} @ screen edge\n')
|
||||
# lines.append(f'\t.byte {unknown_2}, {unknown_3}, {unknown_4} @ unknown\n')
|
||||
# lines.append(f'\t.2byte {unknown_5}, {padding_1} @ unknown\n')
|
||||
line = f'\texit transition={transition_type}'
|
||||
line += opt_param('x', '0x0', hex(x_pos))
|
||||
line += opt_param('y', '0x0', hex(y_pos))
|
||||
line += opt_param('destX', '0x0', hex(dest_x))
|
||||
line += opt_param('destY', '0x0', hex(dest_y))
|
||||
line += opt_param('screenEdge', '0x0', hex(screen_edge))
|
||||
line += opt_param('destArea', '0x0', hex(dest_area))
|
||||
line += opt_param('destRoom', '0x0', hex(dest_room))
|
||||
line += opt_param('unknown', '0x0', hex(unknown_2))
|
||||
line += opt_param('unknown2', '0x0', hex(unknown_3))
|
||||
line += opt_param('unknown3', '0x0', hex(unknown_4))
|
||||
line += opt_param('unknown4', '0x0', hex(unknown_5))
|
||||
line += opt_param('padding', '0x0', hex(padding_1))
|
||||
lines.append(line + '\n')
|
||||
|
||||
assert(self.path.endswith('.bin'))
|
||||
path = self.path[0:-4] + '.s'
|
||||
|
||||
@@ -1,76 +0,0 @@
|
||||
from assets.base import BaseAsset, Reader
|
||||
|
||||
class ExtraFrameOffsets(BaseAsset):
|
||||
def __init__(self, path: str, addr: int, size: int, options: any) -> None:
|
||||
super().__init__(path, addr, size, options)
|
||||
|
||||
def extract_binary(self, rom: bytearray) -> None:
|
||||
reader = Reader(rom[self.addr:self.addr+self.size])
|
||||
|
||||
first_level = []
|
||||
second_level = []
|
||||
|
||||
lines = []
|
||||
bytes = []
|
||||
for i in range(0x10):
|
||||
bytes.append(reader.read_u8())
|
||||
lines.append('\t.byte ' + ', '.join(str(x) for x in bytes) + '\n')
|
||||
|
||||
lines.append('@ First level of offsets\n')
|
||||
|
||||
while True:
|
||||
if reader.cursor in first_level:
|
||||
#print(f'first_level up to: {reader.cursor}')
|
||||
break
|
||||
pointer = reader.read_u16()
|
||||
first_level.append(pointer)
|
||||
lines.append(f'\t.2byte {hex(pointer)}\n')
|
||||
|
||||
#print(first_level)
|
||||
#print(first_level)
|
||||
lines.append('\n@ Second level of offsets\n')
|
||||
while True:
|
||||
#print(reader.cursor)
|
||||
#if reader.cursor >= 24372:
|
||||
#print(f'>< second_level up to: {reader.cursor}')
|
||||
#
|
||||
# break
|
||||
if reader.cursor >= 0xD00:
|
||||
#print(f'second_level up to: {reader.cursor}')
|
||||
break
|
||||
pointer = reader.read_u8()
|
||||
second_level.append(pointer)
|
||||
lines.append(f'\t.byte {hex(pointer)}\n')
|
||||
obj_lists = []
|
||||
lines.append('\n@ Extra frame offsets\n')
|
||||
while True:
|
||||
#print('WH')
|
||||
if (reader.cursor-0xD00)/4 not in second_level:
|
||||
#print(f'{reader.cursor} not in second_level')
|
||||
break
|
||||
next = -1
|
||||
for i in second_level:
|
||||
if i > reader.cursor:
|
||||
if next == -1 or i < next:
|
||||
next = i
|
||||
|
||||
diff = next-reader.cursor
|
||||
print(f'Skipping forward to {next} (+{diff})')
|
||||
lines.append(f'@ Skipping {diff} bytes\n')
|
||||
bytes = []
|
||||
for i in range(diff):
|
||||
bytes.append(reader.read_u8())
|
||||
lines.append('\t.byte ' + ', '.join(str(x) for x in bytes) + '\n')
|
||||
|
||||
extra_x_off = reader.read_s8()
|
||||
extra_y_off = reader.read_s8()
|
||||
lines.append(f'\t.byte {extra_x_off}, {extra_y_off}\n')
|
||||
|
||||
extra_x_off = reader.read_s8()
|
||||
extra_y_off = reader.read_s8()
|
||||
lines.append(f'\t.byte {extra_x_off}, {extra_y_off}\n')
|
||||
|
||||
assert(self.path.endswith('.bin'))
|
||||
path = self.path[0:-4] + '.s'
|
||||
with open(path, 'w') as file:
|
||||
file.writelines(lines)
|
||||
@@ -1,26 +0,0 @@
|
||||
from assets.base import BaseAsset, Reader
|
||||
|
||||
class FixedTypeGfx(BaseAsset):
|
||||
def __init__(self, path: str, addr: int, size: int, options: any) -> None:
|
||||
super().__init__(path, addr, size, options)
|
||||
|
||||
def extract_binary(self, rom: bytearray) -> None:
|
||||
reader = Reader(rom[self.addr:self.addr+self.size])
|
||||
lines = []
|
||||
|
||||
index = 0
|
||||
while reader.cursor < self.size:
|
||||
pointer = reader.read_u32()
|
||||
gfx_data_ptr = pointer& 0x00FFFFFC
|
||||
compressed = pointer& 0x00000001
|
||||
|
||||
maybe_size = ((pointer >> 0x10) & 0x7f00) >> 4
|
||||
|
||||
gfx_data_len = ((pointer & 0x7F000000)>>24) * 0x200
|
||||
lines.append(f'\t.4byte {hex(gfx_data_ptr)} + {compressed} + {hex((gfx_data_len//0x200))}<<24 @{index}\n')
|
||||
index += 1
|
||||
|
||||
assert(self.path.endswith('.bin'))
|
||||
path = self.path[0:-4] + '.s'
|
||||
with open(path, 'w') as file:
|
||||
file.writelines(lines)
|
||||
@@ -1,4 +1,4 @@
|
||||
from assets.base import BaseAsset, Reader
|
||||
from assets.base import BaseAsset, Reader, opt_param
|
||||
|
||||
class FrameObjLists(BaseAsset):
|
||||
def __init__(self, path: str, addr: int, size: int, options: any) -> None:
|
||||
@@ -59,7 +59,7 @@ class FrameObjLists(BaseAsset):
|
||||
bytes.append(reader.read_u8())
|
||||
lines.append('\t.byte ' + ', '.join(str(x) for x in bytes) + '\n')
|
||||
num_objects = reader.read_u8()
|
||||
lines.append(f'\t.byte {num_objects}\n')
|
||||
lines.append(f'\t.byte {num_objects} @ num_objs\n')
|
||||
if num_objects > 200:
|
||||
#print(f'num_objects: {num_objects} @{reader.cursor}/{last_second_level}')
|
||||
break
|
||||
@@ -71,8 +71,8 @@ class FrameObjLists(BaseAsset):
|
||||
bitfield = reader.read_u8()
|
||||
bitfield2 = reader.read_u16()
|
||||
|
||||
lines.append(f'\t.byte {x_offset}, {y_offset}, {hex(bitfield)}\n')
|
||||
lines.append(f'\t.2byte {hex(bitfield2)}\n')
|
||||
# lines.append(f'\t.byte {x_offset}, {y_offset}, {hex(bitfield)}\n')
|
||||
# lines.append(f'\t.2byte {hex(bitfield2)}\n')
|
||||
|
||||
# bitfield
|
||||
override_entity_palette_index = (bitfield & 0x01) != 0
|
||||
@@ -91,6 +91,10 @@ class FrameObjLists(BaseAsset):
|
||||
# print(x_offset, y_offset, bitfield, bitfield2)
|
||||
# print(override_entity_palette_index, h_flip, v_flip, size, shape)
|
||||
# print(first_gfx_tile_offset, priority, palette_index)
|
||||
line = f'\tobj x={hex(x_offset)}, y={hex(y_offset)}'
|
||||
line += opt_param('bitfield', '0x0', hex(bitfield))
|
||||
line += opt_param('bitfield2', '0x0', hex(bitfield2))
|
||||
lines.append(line + '\n')
|
||||
list.append({})
|
||||
# print()
|
||||
obj_lists.append(list)
|
||||
|
||||
@@ -1,31 +0,0 @@
|
||||
from assets.base import BaseAsset, Reader
|
||||
|
||||
class GfxGroup(BaseAsset):
|
||||
def __init__(self, path: str, addr: int, size: int, options: any) -> None:
|
||||
super().__init__(path, addr, size, options)
|
||||
|
||||
def extract_binary(self, rom: bytearray) -> None:
|
||||
reader = Reader(rom[self.addr:self.addr+self.size])
|
||||
gfx_index = 0
|
||||
lines = []
|
||||
while reader.cursor < self.size:
|
||||
unk0 = reader.read_u32()
|
||||
gfx_offset = unk0 & 0xFFFFFF
|
||||
dest = reader.read_u32()
|
||||
unk8 = reader.read_u32()
|
||||
size = unk8 & 0xFFFFFF
|
||||
terminator = unk0 & 0x80000000
|
||||
|
||||
compressed = unk8 & 0x80000000
|
||||
uncompressed_size = size
|
||||
|
||||
|
||||
lines.append(f'\t.4byte {hex(gfx_offset)}+{hex(terminator)}+{hex(unk0 & 0xF000000)}, {hex(dest)}, {hex(uncompressed_size)} + {hex(compressed)} @ {gfx_index}\n')
|
||||
if not terminator:
|
||||
break
|
||||
gfx_index += 1
|
||||
|
||||
assert(self.path.endswith('.bin'))
|
||||
path = self.path[0:-4] + '.s'
|
||||
with open(path, 'w') as file:
|
||||
file.writelines(lines)
|
||||
@@ -1,36 +0,0 @@
|
||||
from assets.base import ROM_OFFSET, BaseAsset, Reader
|
||||
|
||||
class PaletteGroup(BaseAsset):
|
||||
def __init__(self, path: str, addr: int, size: int, options: any) -> None:
|
||||
super().__init__(path, addr, size, options)
|
||||
|
||||
def extract_binary(self, rom: bytearray) -> None:
|
||||
self.extract_palette_group(rom, self.addr, self.size)
|
||||
#self.extract_palette_groups(rom)
|
||||
|
||||
def extract_palette_group(self, rom: bytearray, address: int, size: int) -> tuple[list[str], list[int]]:
|
||||
lines: list[str] = []
|
||||
palette_indices: list[int] = []
|
||||
|
||||
assert(self.path.endswith('.bin'))
|
||||
path = self.path[0:-4] + '.s'
|
||||
|
||||
reader = Reader(rom[address:address+size])
|
||||
continue_loading_palette_sets = True
|
||||
while continue_loading_palette_sets:
|
||||
global_palette_index = reader.read_u16()
|
||||
palette_load_offset = reader.read_u8()
|
||||
bitfield = reader.read_u8()
|
||||
|
||||
num_palettes = bitfield & 0x0F
|
||||
if num_palettes == 0:
|
||||
num_palettes = 0x10
|
||||
continue_loading_palette_sets = (bitfield & 0x80 == 0x80)
|
||||
lines.append(f'\t.2byte {global_palette_index} @ palette index\n')
|
||||
lines.append(f'\t.byte {palette_load_offset} @ palette offset\n')
|
||||
lines.append(f'\t.byte {num_palettes if num_palettes < 0x10 else 0} + {continue_loading_palette_sets*0x80} @ num_palettes, continue_loading\n\n')
|
||||
for i in range(num_palettes):
|
||||
palette_indices.append(global_palette_index + i)
|
||||
|
||||
with open(path, 'w') as file:
|
||||
file.writelines(lines)
|
||||
Reference in New Issue
Block a user