Use more macros

This commit is contained in:
octorock
2021-11-01 16:38:19 +01:00
parent 9c3ac2ecbf
commit 1a0f416bac
31 changed files with 6134 additions and 3407 deletions
-20
View File
@@ -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)
+6 -2
View File
@@ -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)
+24 -10
View File
@@ -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)
-31
View File
@@ -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)