mirror of
https://github.com/zeldaret/oot.git
synced 2025-05-10 19:13:42 +00:00
51 lines
1.5 KiB
Python
51 lines
1.5 KiB
Python
from __future__ import annotations
|
|
import struct
|
|
|
|
from ..extase import (
|
|
RESOURCE_PARSE_SUCCESS,
|
|
File,
|
|
Resource,
|
|
)
|
|
|
|
from tools import csdis
|
|
|
|
|
|
class CutsceneResource(Resource, can_size_be_unknown=True):
|
|
|
|
def __init__(self, file: File, range_start: int, name: str):
|
|
super().__init__(file, range_start, None, name)
|
|
|
|
def try_parse_data(self, memory_context):
|
|
assert self.range_start % 4 == 0
|
|
data = self.file.data[self.range_start :]
|
|
num_bytes = len(data)
|
|
if num_bytes % 4 != 0:
|
|
data = data[: -(num_bytes % 4)]
|
|
data_words = [unpacked[0] for unpacked in struct.iter_unpack(">I", data)]
|
|
size_words, cs_source = csdis.disassemble_cutscene(data_words)
|
|
self.range_end = self.range_start + 4 * size_words
|
|
self.cs_source = cs_source
|
|
return RESOURCE_PARSE_SUCCESS
|
|
|
|
def get_c_reference(self, resource_offset: int):
|
|
if resource_offset == 0:
|
|
return self.symbol_name
|
|
else:
|
|
raise ValueError
|
|
|
|
extracted_path_suffix = ".inc.c"
|
|
|
|
def get_filename_stem(self):
|
|
return f"{self.name}.csdata"
|
|
|
|
def write_extracted(self, memory_context):
|
|
with self.extract_to_path.open("w") as f:
|
|
f.write('#include "z64cutscene_commands.h"\n')
|
|
if not self.braces_in_source:
|
|
f.write("{\n")
|
|
f.write(self.cs_source)
|
|
if not self.braces_in_source:
|
|
f.write("}\n")
|
|
|
|
def get_c_declaration_base(self):
|
|
return f"CutsceneData {self.symbol_name}[]"
|