From 5985d1d868c00ea7cfd737978b84be1b0931f339 Mon Sep 17 00:00:00 2001 From: Mc-muffin <8714476+Mc-muffin@users.noreply.github.com> Date: Thu, 5 Dec 2024 19:54:30 -0500 Subject: [PATCH] Fmv subs generation --- Tales_Exe.py | 15 ++++-- pythonlib/formats/rebirth/fmv_to_hdr.py | 67 +++++++++++++++++++++++++ pythonlib/games/ToolsTOR.py | 25 ++++++++- 3 files changed, 102 insertions(+), 5 deletions(-) create mode 100644 pythonlib/formats/rebirth/fmv_to_hdr.py diff --git a/Tales_Exe.py b/Tales_Exe.py index f5376b9..284ba35 100644 --- a/Tales_Exe.py +++ b/Tales_Exe.py @@ -132,8 +132,16 @@ def get_arguments(argv=None): sp_insert.add_argument( "--update-battle-subs", required=False, + dest="update_subs", action="store_true", - help="(Optional) - Update Battle Subs header from google sheet", + help="(Deprecated)", + ) + + sp_insert.add_argument( + "--update-subs", + required=False, + action="store_true", + help="(Optional) - Update Battle and Fmv Subs", ) sp_insert.add_argument( @@ -163,7 +171,7 @@ def getTalesInstance(args, game_name): args.project.resolve(), insert_mask, args.only_changed ) talesInstance.single_build = args.single_build - talesInstance.make_btl_subs = args.update_battle_subs + talesInstance.make_btl_subs = args.update_subs elif game_name == "NDX": talesInstance = ToolsNDX.ToolsNDX("TBL_All.json") else: @@ -180,7 +188,8 @@ if __name__ == "__main__": if args.action == "insert": - if args.update_battle_subs: + if args.update_subs: + tales_instance.create_fmv_subs() tales_instance.create_btl_subs() if args.file_type == "Main": diff --git a/pythonlib/formats/rebirth/fmv_to_hdr.py b/pythonlib/formats/rebirth/fmv_to_hdr.py new file mode 100644 index 0000000..2ef356c --- /dev/null +++ b/pythonlib/formats/rebirth/fmv_to_hdr.py @@ -0,0 +1,67 @@ +from pathlib import Path +from .. import srt +from .text_util import text_to_cstr, indent_lines + + +def subs_to_lines(subs: list[srt.SrtSub], name: str) -> list[str]: + content = list() + inner_content = list() + + content.append(f"const fmv_sub fmv_{name}[{len(subs) * 2}] = {{") + for sub in subs: + start = sub.start + start_text = f"TS_TO_FRAMES({start.minutes}, {start.seconds}, {start.milis})" + + ts_end = sub.end + end_text = f"TS_TO_FRAMES({ts_end.minutes}, {ts_end.seconds}, {ts_end.milis})" + + text = text_to_cstr(sub.content.replace('"', '\\"')) + + inner_content.append("{") + inner_content.append(f" {start_text},") + inner_content.extend(indent_lines(text.split("\n"), 1)) + inner_content.append("},") + inner_content.append("{") + inner_content.append(f" {end_text},") + inner_content.append(" (char*)NULL") + inner_content.append("},") + inner_content[-1] = inner_content[-1][:-1] # remove trailing comma + content.extend(indent_lines(inner_content, 1)) + content.append("};") + return content + + +def generate_header_lines(files: list[Path]) -> list[str]: + file_subs = list() + for file in files: + file_subs.append((file.stem, srt.get_subs(file))) + + # Start creating the header file content + hdr = [ + "/* This file is autogenerated*/", + "#ifndef __FMV_SUBS_H__", + "#define __FMV_SUBS_H__", + "", + '#include "types.h"', + '#include "fmv_subs.h"', + '#include "rebirth_text.h"', + "", + ] + + for name, subs in file_subs: + hdr.extend(subs_to_lines(subs, name)) + hdr.append("") + + hdr.append(f"const fmv_entry fmv_table[{len(file_subs)}] = {{") + for name, subs in file_subs: + hdr.append(" {") + hdr.append(f" ARRAY_COUNT(fmv_{name}),") + hdr.append(f" fmv_{name}") + hdr.append(" },") + hdr[-1] = hdr[-1][:-1] # remove trailing comma + hdr.append("};") + hdr.append("") + hdr.append("#endif /* __FMV_SUBS_H__ */") + hdr.append("") + + return hdr diff --git a/pythonlib/games/ToolsTOR.py b/pythonlib/games/ToolsTOR.py index 2ada3fd..0c06c59 100644 --- a/pythonlib/games/ToolsTOR.py +++ b/pythonlib/games/ToolsTOR.py @@ -17,6 +17,7 @@ import pyjson5 as json from tqdm import tqdm import pythonlib.formats.rebirth.btlsub_to_hdr as btl_maker +import pythonlib.formats.rebirth.fmv_to_hdr as fmv_maker import pythonlib.formats.rebirth.pak2 as pak2lib import pythonlib.utils.comptolib as comptolib from pythonlib.formats.FileIO import FileIO @@ -120,6 +121,23 @@ class ToolsTOR(ToolsTales): print("Done!") + def create_fmv_subs(self): + if not self.make_btl_subs: + return + + print("Updating FMV sub data...") + + srt_path = self.paths["translated_files"] / "fmv" + srts = list(srt_path.glob("*.srt")) + + lines = fmv_maker.generate_header_lines(srts) + + h_file = self.paths["tools"] / "hacks/src/fmv_subs_text.h" + with h_file.open("w", encoding="utf8") as f: + f.write("\n".join(lines)) + print("Done!") + + def get_build_name(self) -> str: if self.single_build: return "TalesOfRebirth_latest" @@ -447,8 +465,11 @@ class ToolsTOR(ToolsTales): return finalText def read_xml(self, xml_path: Path) -> etree._Element: - with xml_path.open("r", encoding='utf-8') as xml_file: - xml_str = xml_file.read().replace("", "") + try: + with xml_path.open("r", encoding='utf-8') as xml_file: + xml_str = xml_file.read().replace("", "") + except FileNotFoundError: + xml_str = "" root = etree.fromstring(xml_str, parser=etree.XMLParser(recover=True)) return root