From f2cb5ecb2f7c174d69c61ab1dfa6f7784050014e Mon Sep 17 00:00:00 2001 From: Dragorn421 Date: Sun, 22 Feb 2026 18:48:27 +0100 Subject: [PATCH] Assets system: format extracted actor params (and EnDoor params) (#2698) * Assets system: format extracted actor params (and EnDoor params) * and actor list too... * and actor list required inclues too... * ENDOOR_PARAMS_GENERAL, ENDOOR_PARAMS -> ENDOOR_PARAMS, ENDOOR_PARAMS_NODATA --- src/overlays/actors/ovl_En_Door/z_en_door.h | 6 +++ .../extract/extase_oot64/actor_params.py | 50 +++++++++++++++++++ .../extase_oot64/scene_rooms_resources.py | 43 +++++++++++++--- 3 files changed, 93 insertions(+), 6 deletions(-) create mode 100644 tools/assets/extract/extase_oot64/actor_params.py diff --git a/src/overlays/actors/ovl_En_Door/z_en_door.h b/src/overlays/actors/ovl_En_Door/z_en_door.h index 60ed932eac..c02cd8eca1 100644 --- a/src/overlays/actors/ovl_En_Door/z_en_door.h +++ b/src/overlays/actors/ovl_En_Door/z_en_door.h @@ -33,6 +33,12 @@ #define ENDOOR_GET_CHECKABLE_TEXT_ID(thisx) PARAMS_GET_U((thisx)->params, 0, 6) +#define ENDOOR_PARAMS(type, isDoubleDoor, data) (((type) << 7) | (((isDoubleDoor) ? 1 : 0) << 6) | (data)) +#define ENDOOR_PARAMS_NODATA(type, isDoubleDoor) (ENDOOR_PARAMS(type, isDoubleDoor, 0x3F)) +#define ENDOOR_PARAMS_LOCKED(isDoubleDoor, switchFlag) (ENDOOR_PARAMS(DOOR_LOCKED, isDoubleDoor, switchFlag)) +#define ENDOOR_PARAMS_CHECKABLE(isDoubleDoor, textIdMinus0x0200) (ENDOOR_PARAMS(DOOR_CHECKABLE, isDoubleDoor, textIdMinus0x0200)) +#define ENDOOR_PARAMS_EVENING(isDoubleDoor, textIdMinus0x0200) (ENDOOR_PARAMS(DOOR_EVENING, isDoubleDoor, textIdMinus0x0200)) + typedef enum EnDoorType { /* 0x00 */ DOOR_ROOMLOAD, // loads rooms /* 0x01 */ DOOR_LOCKED, // small key locked door diff --git a/tools/assets/extract/extase_oot64/actor_params.py b/tools/assets/extract/extase_oot64/actor_params.py new file mode 100644 index 0000000000..9d3df572f4 --- /dev/null +++ b/tools/assets/extract/extase_oot64/actor_params.py @@ -0,0 +1,50 @@ +def bits(p: int, s: int, n: int): + return (p >> s) & ((1 << n) - 1) + + +def cbool(b: bool): + return "true" if b else "false" + + +def params_en_door(params: int): + unused_mask = 0b1111_1100_0011_1111 + type = bits(params, 7, 3) + type_name = [ + "DOOR_ROOMLOAD", + "DOOR_LOCKED", + "DOOR_ROOMLOAD2", + "DOOR_SCENEEXIT", + "DOOR_AJAR", + "DOOR_CHECKABLE", + "DOOR_EVENING", + "DOOR_ROOMLOAD7", + ][type] + isDoubleDoor = bits(params, 6, 1) != 0 + if type_name == "DOOR_LOCKED": + unused_mask &= ~0b0011_1111 + switchFlag = bits(params, 0, 6) + params_str = f"ENDOOR_PARAMS_LOCKED({cbool(isDoubleDoor)}, {switchFlag})" + elif type_name == "DOOR_CHECKABLE": + unused_mask &= ~0b0011_1111 + textIdMinux0x0200 = bits(params, 0, 6) + params_str = f"ENDOOR_PARAMS_CHECKABLE({cbool(isDoubleDoor)}, {textIdMinux0x0200})" + elif type_name == "DOOR_EVENING": + unused_mask &= ~0b0011_1111 + textIdMinux0x0200 = bits(params, 0, 6) + params_str = f"ENDOOR_PARAMS_EVENING({cbool(isDoubleDoor)}, {textIdMinux0x0200})" + else: + unused_mask &= ~0b0011_1111 + data = bits(params, 0, 6) + assert data == 0x3F + params_str = f"ENDOOR_PARAMS_NODATA({type_name}, {cbool(isDoubleDoor)})" + assert (params & unused_mask) == 0, (f"{params:#06X}", params_str) + return params_str + + +PARAMS_FMT = { + "ACTOR_EN_DOOR": params_en_door, +} + +INCLUDES = { + "ACTOR_EN_DOOR": ["src/overlays/actors/ovl_En_Door/z_en_door.h"], +} diff --git a/tools/assets/extract/extase_oot64/scene_rooms_resources.py b/tools/assets/extract/extase_oot64/scene_rooms_resources.py index 3b632604cd..4c65ad8af4 100644 --- a/tools/assets/extract/extase_oot64/scene_rooms_resources.py +++ b/tools/assets/extract/extase_oot64/scene_rooms_resources.py @@ -24,6 +24,7 @@ from ..extase.cdata_resources import ( ) from .. import oot64_data +from . import actor_params VERBOSE_SPAWN_LIST_LENGTH_GUESSING = False @@ -37,7 +38,8 @@ class ActorEntryListResource(CDataArrayNamedLengthResource): f.write("{\n") f.write(wctx.line_prefix + INDENT) - f.write(oot64_data.get_actor_id_name(v["id"])) + actor_id_name = oot64_data.get_actor_id_name(v["id"]) + f.write(actor_id_name) f.write(",\n") f.write(wctx.line_prefix + INDENT) @@ -52,9 +54,16 @@ class ActorEntryListResource(CDataArrayNamedLengthResource): f.write(wctx.line_prefix + INDENT) params = v["params"] - f.write(fmt_hex_s(params, 4)) if params < 0: params_u16 = params + 0x1_0000 + else: + params_u16 = params + fmt_params = actor_params.PARAMS_FMT.get(actor_id_name) + if fmt_params is None: + f.write(fmt_hex_s(params, 4)) + else: + f.write(fmt_params(params_u16)) + if params < 0 or fmt_params is not None: f.write(f" /* 0x{params_u16:04X} */") f.write(", // params\n") @@ -76,7 +85,14 @@ class ActorEntryListResource(CDataArrayNamedLengthResource): return f"ActorEntry {self.symbol_name}[{self.length_name}]" def get_c_includes(self): - return ("actor.h",) + includes = ["actor.h"] + for elem in self.cdata_unpacked: + actor_id = elem["id"] + actor_id_name = oot64_data.get_actor_id_name(actor_id) + actor_params_includes = actor_params.INCLUDES.get(actor_id_name) + if actor_params_includes is not None: + includes.extend(actor_params_includes) + return includes def get_h_includes(self): return ("scene.h",) @@ -344,7 +360,8 @@ class TransitionActorEntryListResource(CDataArrayNamedLengthResource): f.write("}, // sides\n") f.write(wctx.line_prefix + INDENT) - f.write(oot64_data.get_actor_id_name(v["id"])) + actor_id_name = oot64_data.get_actor_id_name(v["id"]) + f.write(actor_id_name) f.write(",\n") f.write(wctx.line_prefix + INDENT) @@ -358,9 +375,16 @@ class TransitionActorEntryListResource(CDataArrayNamedLengthResource): f.write(wctx.line_prefix + INDENT) params = v["params"] - f.write(fmt_hex_s(params, 4)) if params < 0: params_u16 = params + 0x1_0000 + else: + params_u16 = params + fmt_params = actor_params.PARAMS_FMT.get(actor_id_name) + if fmt_params is None: + f.write(fmt_hex_s(params, 4)) + else: + f.write(fmt_params(params_u16)) + if params < 0 or fmt_params is not None: f.write(f" /* 0x{params_u16:04X} */") f.write(", // params\n") @@ -394,7 +418,14 @@ class TransitionActorEntryListResource(CDataArrayNamedLengthResource): return f"TransitionActorEntry {self.symbol_name}[{self.length_name}]" def get_c_includes(self): - return ("actor.h",) + includes = ["actor.h"] + for elem in self.cdata_unpacked: + actor_id = elem["id"] + actor_id_name = oot64_data.get_actor_id_name(actor_id) + actor_params_includes = actor_params.INCLUDES.get(actor_id_name) + if actor_params_includes is not None: + includes.extend(actor_params_includes) + return includes def get_h_includes(self): return ("scene.h",)