summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDragorn421 <Dragorn421@users.noreply.github.com>2026-02-22 18:48:27 +0100
committerGitHub <noreply@github.com>2026-02-22 18:48:27 +0100
commitf2cb5ecb2f7c174d69c61ab1dfa6f7784050014e (patch)
treee4a694cc74cfd7022e0feba68f64709ff0d9c083
parent8b30a773460b8dce1bccc1faee9ab02ed15b6d46 (diff)
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
-rw-r--r--src/overlays/actors/ovl_En_Door/z_en_door.h6
-rw-r--r--tools/assets/extract/extase_oot64/actor_params.py50
-rw-r--r--tools/assets/extract/extase_oot64/scene_rooms_resources.py43
3 files changed, 93 insertions, 6 deletions
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 60ed932ea..c02cd8eca 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 000000000..9d3df572f
--- /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 3b632604c..4c65ad8af 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",)