From a7257f407ddcf8d31f4d6d15ce1ba00af46f5919 Mon Sep 17 00:00:00 2001 From: Yanis <35189056+Yanis42@users.noreply.github.com> Date: Wed, 22 May 2024 20:47:12 +0200 Subject: [PATCH] fix cs import issues (#343) --- fast64_internal/oot/cutscene/classes.py | 9 ++++++--- .../oot/cutscene/importer/classes.py | 19 ++++++++++++++----- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/fast64_internal/oot/cutscene/classes.py b/fast64_internal/oot/cutscene/classes.py index 9efd0ecc8..72739a8cd 100644 --- a/fast64_internal/oot/cutscene/classes.py +++ b/fast64_internal/oot/cutscene/classes.py @@ -59,7 +59,7 @@ def __post_init__(self): class CutsceneCmdActorCue(CutsceneCmdBase): """This class contains a single Actor Cue command data""" - actionID: Optional[int] = None + actionID: Optional[int | str] = None rot: list[str] = field(default_factory=list) startPos: list[int] = field(default_factory=list) endPos: list[int] = field(default_factory=list) @@ -69,7 +69,10 @@ def __post_init__(self): if self.params is not None: self.startFrame = getInteger(self.params[1]) self.endFrame = getInteger(self.params[2]) - self.actionID = getInteger(self.params[0]) + try: + self.actionID = getInteger(self.params[0]) + except ValueError: + self.actionID = self.params[0] self.rot = [getRotation(self.params[3]), getRotation(self.params[4]), getRotation(self.params[5])] self.startPos = [getInteger(self.params[6]), getInteger(self.params[7]), getInteger(self.params[8])] self.endPos = [getInteger(self.params[9]), getInteger(self.params[10]), getInteger(self.params[11])] @@ -302,7 +305,7 @@ class CutsceneCmdLightSetting(CutsceneCmdBase): isLegacy: Optional[bool] = None lightSetting: Optional[int] = None - paramNumber: int = 11 + paramNumber: int = 14 def __post_init__(self): if self.params is not None: diff --git a/fast64_internal/oot/cutscene/importer/classes.py b/fast64_internal/oot/cutscene/importer/classes.py index 066494895..121338b11 100644 --- a/fast64_internal/oot/cutscene/importer/classes.py +++ b/fast64_internal/oot/cutscene/importer/classes.py @@ -1,4 +1,5 @@ import bpy +import re from dataclasses import dataclass from typing import TYPE_CHECKING @@ -53,7 +54,11 @@ def getCmdParams(self, data: str, cmdName: str, paramNumber: int): """Returns the list of every parameter of the given command""" parenthesis = "(" if not cmdName.endswith("(") else "" - params = data.strip().removeprefix(f"{cmdName}{parenthesis}").replace(" ", "").removesuffix(")").split(",") + data = data.strip().removeprefix(f"{cmdName}{parenthesis}").replace(" ", "").removesuffix(")") + if "CS_FLOAT" in data: + data = re.sub(r"CS_FLOAT\([a-fA-F0-9x]*,([0-9e+-.f]*)\)", r"\1", data, re.DOTALL) + data = re.sub(r"CS_FLOAT\([a-fA-F0-9x]*,([0-9e+-.f]*)", r"\1", data, re.DOTALL) + params = data.split(",") validTimeCmd = cmdName == "CS_TIME" and len(params) == 6 and paramNumber == 5 if len(params) != paramNumber and not validTimeCmd: raise PluginError( @@ -86,8 +91,11 @@ def getParsedCutscenes(self): for oldName in oldNames: fileData = fileData.replace(f"{oldName}(", f"{ootCSLegacyToNewCmdNames[oldName]}(") + fileLines: list[str] = [] + for line in fileData.split("\n"): + fileLines.append(line.strip()) + # parse cutscenes - fileLines = fileData.split("\n") csData = [] cutsceneList: list[list[str]] = [] foundCutscene = False @@ -98,10 +106,11 @@ def getParsedCutscenes(self): if foundCutscene: sLine = line.strip() - if not sLine.endswith("),") and sLine.endswith(","): - line += fileLines[fileLines.index(line) + 1].strip() + csCmd = sLine.split("(")[0] + if "CutsceneData " not in line and "};" not in line and csCmd not in ootCutsceneCommandsC: + csData[-1] += line - if len(csData) == 0 or "CS_" in line: + if len(csData) == 0 or sLine.startswith("CS_") and not sLine.startswith("CS_FLOAT"): csData.append(line) if "};" in line: