mirror of
https://github.com/zeldaret/oot
synced 2026-06-23 17:25:16 -04:00
55cdfccdd9
* ObjSwitch params macros * format extracted ObjSwitch params
94 lines
2.9 KiB
Python
94 lines
2.9 KiB
Python
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
|
|
|
|
|
|
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"],
|
|
}
|