From 55cdfccdd90f96538274bb8fe6854d1d33fa87e9 Mon Sep 17 00:00:00 2001 From: Dragorn421 Date: Fri, 24 Apr 2026 22:31:44 +0200 Subject: [PATCH] Format extracted params: ObjSwitch (#2722) * ObjSwitch params macros * format extracted ObjSwitch params --- .../actors/ovl_Obj_Switch/z_obj_switch.c | 7 --- .../actors/ovl_Obj_Switch/z_obj_switch.h | 12 +++++ .../extract/extase_oot64/actor_params.py | 47 ++++++++++++++++++- 3 files changed, 57 insertions(+), 9 deletions(-) diff --git a/src/overlays/actors/ovl_Obj_Switch/z_obj_switch.c b/src/overlays/actors/ovl_Obj_Switch/z_obj_switch.c index 328e6ea205..a4fa682627 100644 --- a/src/overlays/actors/ovl_Obj_Switch/z_obj_switch.c +++ b/src/overlays/actors/ovl_Obj_Switch/z_obj_switch.c @@ -26,13 +26,6 @@ #define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED -#define OBJSWITCH_TYPE(thisx) PARAMS_GET_U((thisx)->params, 0, 3) -#define OBJSWITCH_SUBTYPE(thisx) PARAMS_GET_U((thisx)->params, 4, 3) -#define OBJSWITCH_SWITCH_FLAG(thisx) PARAMS_GET_U((thisx)->params, 8, 6) -#define OBJSWITCH_FROZEN(thisx) PARAMS_GET_U((thisx)->params, 7, 1) - -#define OBJSWITCH_FROZEN_FLAG (1 << 7) - void ObjSwitch_Init(Actor* thisx, PlayState* play); void ObjSwitch_Destroy(Actor* thisx, PlayState* play); void ObjSwitch_Update(Actor* thisx, PlayState* play); diff --git a/src/overlays/actors/ovl_Obj_Switch/z_obj_switch.h b/src/overlays/actors/ovl_Obj_Switch/z_obj_switch.h index 328f6389c0..95206eea13 100644 --- a/src/overlays/actors/ovl_Obj_Switch/z_obj_switch.h +++ b/src/overlays/actors/ovl_Obj_Switch/z_obj_switch.h @@ -4,6 +4,18 @@ #include "ultra64.h" #include "actor.h" +#define OBJSWITCH_TYPE(thisx) PARAMS_GET_U((thisx)->params, 0, 3) +#define OBJSWITCH_SUBTYPE(thisx) PARAMS_GET_U((thisx)->params, 4, 3) +#define OBJSWITCH_SWITCH_FLAG(thisx) PARAMS_GET_U((thisx)->params, 8, 6) +#define OBJSWITCH_FROZEN(thisx) PARAMS_GET_U((thisx)->params, 7, 1) + +#define OBJSWITCH_FROZEN_FLAG (1 << 7) + +#define OBJSWITCH_PARAMS(type, subType, switchFlag) ((type) | ((subType) << 4) | ((switchFlag) << 8)) +// Same as OBJSWITCH_PARAMS but also sets two unused bits +#define OBJSWITCH_PARAMS_ALT(type, subType, switchFlag) (OBJSWITCH_PARAMS(type, subType, switchFlag) | (0xC000)) +#define OBJSWITCH_PARAMS_EYE(subType, switchFlag, isFrozen) (OBJSWITCH_PARAMS(OBJSWITCH_TYPE_EYE, subType, switchFlag) | ((isFrozen) ? OBJSWITCH_FROZEN_FLAG : 0)) + struct ObjSwitch; typedef void (*ObjSwitchActionFunc)(struct ObjSwitch*, struct PlayState*); diff --git a/tools/assets/extract/extase_oot64/actor_params.py b/tools/assets/extract/extase_oot64/actor_params.py index 9d3df572f4..5a1cf26ed1 100644 --- a/tools/assets/extract/extase_oot64/actor_params.py +++ b/tools/assets/extract/extase_oot64/actor_params.py @@ -27,11 +27,15 @@ def params_en_door(params: int): elif type_name == "DOOR_CHECKABLE": unused_mask &= ~0b0011_1111 textIdMinux0x0200 = bits(params, 0, 6) - params_str = f"ENDOOR_PARAMS_CHECKABLE({cbool(isDoubleDoor)}, {textIdMinux0x0200})" + 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})" + params_str = ( + f"ENDOOR_PARAMS_EVENING({cbool(isDoubleDoor)}, {textIdMinux0x0200})" + ) else: unused_mask &= ~0b0011_1111 data = bits(params, 0, 6) @@ -41,10 +45,49 @@ def params_en_door(params: int): return params_str +def params_obj_switch(params: int): + unused_mask = 0b0000_0000_1000_1000 + type = bits(params, 0, 3) + subType = bits(params, 4, 3) + switchFlag = bits(params, 8, 6) + unused_bits = bits(params, 14, 2) + type_name = [ + "OBJSWITCH_TYPE_FLOOR", + "OBJSWITCH_TYPE_FLOOR_RUSTY", + "OBJSWITCH_TYPE_EYE", + "OBJSWITCH_TYPE_CRYSTAL", + "OBJSWITCH_TYPE_CRYSTAL_TARGETABLE", + ][type] + subType_name = [ + "OBJSWITCH_SUBTYPE_ONCE", + "OBJSWITCH_SUBTYPE_TOGGLE", + "OBJSWITCH_SUBTYPE_HOLD", + "OBJSWITCH_SUBTYPE_HOLD_INVERTED", + "OBJSWITCH_SUBTYPE_SYNC", + ][subType] + if type_name == "OBJSWITCH_TYPE_EYE": + unused_mask &= ~0b1000_0000 + isFrozen = bits(params, 7, 1) != 0 + assert unused_bits == 0 + params_str = ( + f"OBJSWITCH_PARAMS_EYE({subType_name}, {switchFlag}, {cbool(isFrozen)})" + ) + else: + macro_name = { + 0b00: "OBJSWITCH_PARAMS", + 0b11: "OBJSWITCH_PARAMS_ALT", + }[unused_bits] + params_str = f"{macro_name}({type_name}, {subType_name}, {switchFlag})" + assert (params & unused_mask) == 0, (f"{params:#06X}", params_str) + return params_str + + PARAMS_FMT = { "ACTOR_EN_DOOR": params_en_door, + "ACTOR_OBJ_SWITCH": params_obj_switch, } INCLUDES = { "ACTOR_EN_DOOR": ["src/overlays/actors/ovl_En_Door/z_en_door.h"], + "ACTOR_OBJ_SWITCH": ["src/overlays/actors/ovl_Obj_Switch/z_obj_switch.h"], }