1
0
Fork 0
mirror of https://github.com/zeldaret/oot.git synced 2025-05-11 19:43:44 +00:00

dmadata file names no longer hardcoded for gc-eu-mq-dbg

This commit is contained in:
Dragorn421 2025-02-06 20:44:16 +01:00
parent e8e15eca9f
commit 8aaaca4fe0
No known key found for this signature in database
GPG key ID: 381AEBAF3D429335
5 changed files with 32 additions and 1574 deletions

View file

@ -238,14 +238,18 @@ class MemoryContext:
maps offsets to data
"""
def __init__(self):
def __init__(self, dmadata_table_rom_file_name_by_vrom):
self.memory_map = MemoryMap()
self.dmadata_table_rom_file_name_by_vrom = dmadata_table_rom_file_name_by_vrom
def copy(self):
other = MemoryContext()
other = MemoryContext(self.dmadata_table_rom_file_name_by_vrom)
other.memory_map = self.memory_map.copy()
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):
segment_num = get_segment_num(address)
if segment_num != 0:

View file

@ -119,11 +119,13 @@ class ObjectListResource(CDataArrayNamedLengthResource):
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)
vromStart = v["vromStart"]
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
)
f.write(line_prefix)

View file

@ -267,9 +267,10 @@ def process_pool_wrapped(extraction_ctx, pd):
def main():
import argparse
import re
# TODO cleanup, command-line argument for version
from tools import version_config
from tools import dmadata
parser = argparse.ArgumentParser()
parser.add_argument(
@ -285,13 +286,23 @@ def main():
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("-s", dest="single", default=None)
parser.add_argument("-r", dest="single_is_regex", default=None, action="store_true")
args = parser.parse_args()
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)
version_memctx_base = MemoryContext()
version_memctx_base = MemoryContext(dmadata_table_rom_file_name_by_vrom)
from .extase_oot64.dlist_resources import MtxResource, TextureResource
from ..n64 import G_IM_FMT, G_IM_SIZ
@ -326,19 +337,23 @@ def main():
do_process_pool = False
for coll in pool_desc.collections:
if isinstance(coll.backing_memory, BaseromFileBackingMemory):
if args.single_is_regex:
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:
process_pool(extraction_ctx, pool_desc)
any_do_process_pool = True
if any_do_process_pool:
print("OK")
print("Done!")
else:
print("Not found:", args.single)
elif not args.use_multiprocessing: # everything on one process
for pool_desc in pools_desc:
process_pool(extraction_ctx, pool_desc)
print("all OK!!!")
print("All done!")
else: # multiprocessing
import multiprocessing
@ -347,7 +362,7 @@ def main():
process_pool_wrapped,
zip([extraction_ctx] * len(pools_desc), pools_desc),
)
print("all OK!?")
print("All done!")
except Exception as e:
import traceback
import sys

View file

@ -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]
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

File diff suppressed because it is too large Load diff