mirror of
https://github.com/zeldaret/oot.git
synced 2025-05-12 03:53:47 +00:00
dmadata file names no longer hardcoded for gc-eu-mq-dbg
This commit is contained in:
parent
e8e15eca9f
commit
8aaaca4fe0
5 changed files with 32 additions and 1574 deletions
|
@ -238,14 +238,18 @@ class MemoryContext:
|
||||||
maps offsets to data
|
maps offsets to data
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self, dmadata_table_rom_file_name_by_vrom):
|
||||||
self.memory_map = MemoryMap()
|
self.memory_map = MemoryMap()
|
||||||
|
self.dmadata_table_rom_file_name_by_vrom = dmadata_table_rom_file_name_by_vrom
|
||||||
|
|
||||||
def copy(self):
|
def copy(self):
|
||||||
other = MemoryContext()
|
other = MemoryContext(self.dmadata_table_rom_file_name_by_vrom)
|
||||||
other.memory_map = self.memory_map.copy()
|
other.memory_map = self.memory_map.copy()
|
||||||
return other
|
return other
|
||||||
|
|
||||||
|
def get_dmadata_table_rom_file_name_from_vrom(self, vromStart, vromEnd):
|
||||||
|
return self.dmadata_table_rom_file_name_by_vrom[(vromStart, vromEnd)]
|
||||||
|
|
||||||
def _direct_address_to_offset(self, address: int):
|
def _direct_address_to_offset(self, address: int):
|
||||||
segment_num = get_segment_num(address)
|
segment_num = get_segment_num(address)
|
||||||
if segment_num != 0:
|
if segment_num != 0:
|
||||||
|
|
|
@ -119,11 +119,13 @@ class ObjectListResource(CDataArrayNamedLengthResource):
|
||||||
return f"s16 {self.symbol_name}[{self.length_name}]"
|
return f"s16 {self.symbol_name}[{self.length_name}]"
|
||||||
|
|
||||||
|
|
||||||
def write_RomFile(resource, memory_context, v, f: io.TextIOBase, line_prefix: str):
|
def write_RomFile(
|
||||||
|
resource, memory_context: "MemoryContext", v, f: io.TextIOBase, line_prefix: str
|
||||||
|
):
|
||||||
assert isinstance(v, dict)
|
assert isinstance(v, dict)
|
||||||
vromStart = v["vromStart"]
|
vromStart = v["vromStart"]
|
||||||
vromEnd = v["vromEnd"]
|
vromEnd = v["vromEnd"]
|
||||||
rom_file_name = oot64_data.get_dmadata_table_rom_file_name_from_vrom(
|
rom_file_name = memory_context.get_dmadata_table_rom_file_name_from_vrom(
|
||||||
vromStart, vromEnd
|
vromStart, vromEnd
|
||||||
)
|
)
|
||||||
f.write(line_prefix)
|
f.write(line_prefix)
|
||||||
|
|
|
@ -267,9 +267,10 @@ def process_pool_wrapped(extraction_ctx, pd):
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
import argparse
|
import argparse
|
||||||
|
import re
|
||||||
|
|
||||||
# TODO cleanup, command-line argument for version
|
|
||||||
from tools import version_config
|
from tools import version_config
|
||||||
|
from tools import dmadata
|
||||||
|
|
||||||
parser = argparse.ArgumentParser()
|
parser = argparse.ArgumentParser()
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
|
@ -285,13 +286,23 @@ def main():
|
||||||
parser.add_argument("-v", dest="oot_version", default="gc-eu-mq-dbg")
|
parser.add_argument("-v", dest="oot_version", default="gc-eu-mq-dbg")
|
||||||
parser.add_argument("-j", dest="use_multiprocessing", action="store_true")
|
parser.add_argument("-j", dest="use_multiprocessing", action="store_true")
|
||||||
parser.add_argument("-s", dest="single", default=None)
|
parser.add_argument("-s", dest="single", default=None)
|
||||||
|
parser.add_argument("-r", dest="single_is_regex", default=None, action="store_true")
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
vc = version_config.load_version_config(args.oot_version)
|
vc = version_config.load_version_config(args.oot_version)
|
||||||
|
|
||||||
|
dma_entries = dmadata.read_dmadata(
|
||||||
|
memoryview((args.baserom_segments_dir / "dmadata").read_bytes()), 0
|
||||||
|
)
|
||||||
|
dmadata_table_rom_file_name_by_vrom = dict()
|
||||||
|
for dma_entry, name in zip(dma_entries, vc.dmadata_segments.keys()):
|
||||||
|
dmadata_table_rom_file_name_by_vrom[
|
||||||
|
(dma_entry.vrom_start, dma_entry.vrom_end)
|
||||||
|
] = name
|
||||||
|
|
||||||
pools_desc = get_resources_desc(vc)
|
pools_desc = get_resources_desc(vc)
|
||||||
|
|
||||||
version_memctx_base = MemoryContext()
|
version_memctx_base = MemoryContext(dmadata_table_rom_file_name_by_vrom)
|
||||||
|
|
||||||
from .extase_oot64.dlist_resources import MtxResource, TextureResource
|
from .extase_oot64.dlist_resources import MtxResource, TextureResource
|
||||||
from ..n64 import G_IM_FMT, G_IM_SIZ
|
from ..n64 import G_IM_FMT, G_IM_SIZ
|
||||||
|
@ -326,19 +337,23 @@ def main():
|
||||||
do_process_pool = False
|
do_process_pool = False
|
||||||
for coll in pool_desc.collections:
|
for coll in pool_desc.collections:
|
||||||
if isinstance(coll.backing_memory, BaseromFileBackingMemory):
|
if isinstance(coll.backing_memory, BaseromFileBackingMemory):
|
||||||
if coll.backing_memory.name == args.single:
|
if args.single_is_regex:
|
||||||
do_process_pool = True
|
if re.fullmatch(args.single, coll.backing_memory.name):
|
||||||
|
do_process_pool = True
|
||||||
|
else:
|
||||||
|
if coll.backing_memory.name == args.single:
|
||||||
|
do_process_pool = True
|
||||||
if do_process_pool:
|
if do_process_pool:
|
||||||
process_pool(extraction_ctx, pool_desc)
|
process_pool(extraction_ctx, pool_desc)
|
||||||
any_do_process_pool = True
|
any_do_process_pool = True
|
||||||
if any_do_process_pool:
|
if any_do_process_pool:
|
||||||
print("OK")
|
print("Done!")
|
||||||
else:
|
else:
|
||||||
print("Not found:", args.single)
|
print("Not found:", args.single)
|
||||||
elif not args.use_multiprocessing: # everything on one process
|
elif not args.use_multiprocessing: # everything on one process
|
||||||
for pool_desc in pools_desc:
|
for pool_desc in pools_desc:
|
||||||
process_pool(extraction_ctx, pool_desc)
|
process_pool(extraction_ctx, pool_desc)
|
||||||
print("all OK!!!")
|
print("All done!")
|
||||||
else: # multiprocessing
|
else: # multiprocessing
|
||||||
import multiprocessing
|
import multiprocessing
|
||||||
|
|
||||||
|
@ -347,7 +362,7 @@ def main():
|
||||||
process_pool_wrapped,
|
process_pool_wrapped,
|
||||||
zip([extraction_ctx] * len(pools_desc), pools_desc),
|
zip([extraction_ctx] * len(pools_desc), pools_desc),
|
||||||
)
|
)
|
||||||
print("all OK!?")
|
print("All done!")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
import traceback
|
import traceback
|
||||||
import sys
|
import sys
|
||||||
|
|
|
@ -76,33 +76,6 @@ def get_scene_id_from_rom_file_name(rom_file_name: str) -> int:
|
||||||
return scene_id_by_rom_file_name[rom_file_name]
|
return scene_id_by_rom_file_name[rom_file_name]
|
||||||
|
|
||||||
|
|
||||||
from . import dmadata_table
|
|
||||||
|
|
||||||
|
|
||||||
def get_dmadata_table_rom_file_names() -> Sequence[str]:
|
|
||||||
return dmadata_table.DATA
|
|
||||||
|
|
||||||
|
|
||||||
dmadata = None
|
|
||||||
|
|
||||||
|
|
||||||
def get_dmadata_table_rom_file_name_from_vrom(vromStart: int, vromEnd: int) -> str:
|
|
||||||
global dmadata
|
|
||||||
if dmadata is None:
|
|
||||||
import struct
|
|
||||||
|
|
||||||
# FIXME handle multiversion
|
|
||||||
with open("extracted/gc-eu-mq-dbg/baserom/dmadata", "rb") as f:
|
|
||||||
bytes = f.read()
|
|
||||||
dmadata = list(struct.iter_unpack(">IIII", bytes))
|
|
||||||
for i, (e_vromStart, e_vromEnd, e_romStart, e_romEnd) in enumerate(dmadata):
|
|
||||||
if e_vromStart == vromStart and e_vromEnd == vromEnd:
|
|
||||||
break
|
|
||||||
if i >= len(dmadata_table.DATA):
|
|
||||||
raise ValueError("Can't find rom file", hex(vromStart), hex(vromEnd))
|
|
||||||
return dmadata_table.DATA[i]
|
|
||||||
|
|
||||||
|
|
||||||
from . import audio_ids
|
from . import audio_ids
|
||||||
|
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load diff
Loading…
Add table
Reference in a new issue