From 8b30a773460b8dce1bccc1faee9ab02ed15b6d46 Mon Sep 17 00:00:00 2001 From: mzxrules Date: Sun, 22 Feb 2026 03:35:51 -0500 Subject: [PATCH 1/4] z_bg_haka_meganebg documentation pass (#2685) * document z_bg_haka_meganebg * Dragorn suggestions and @bug documentation * i swear i was good at grammar as a child --- assets/xml/objects/object_haka_objects.xml | 24 +-- .../ovl_Bg_Haka_MeganeBG/z_bg_haka_meganebg.c | 173 +++++++++++------- .../ovl_Bg_Haka_MeganeBG/z_bg_haka_meganebg.h | 11 +- 3 files changed, 126 insertions(+), 82 deletions(-) diff --git a/assets/xml/objects/object_haka_objects.xml b/assets/xml/objects/object_haka_objects.xml index 7e0195e148..dfac5ebb62 100644 --- a/assets/xml/objects/object_haka_objects.xml +++ b/assets/xml/objects/object_haka_objects.xml @@ -1,10 +1,10 @@ - + - - + + @@ -51,11 +51,11 @@ - + - - + + @@ -88,21 +88,21 @@ - + - - + + - + - - + + diff --git a/src/overlays/actors/ovl_Bg_Haka_MeganeBG/z_bg_haka_meganebg.c b/src/overlays/actors/ovl_Bg_Haka_MeganeBG/z_bg_haka_meganebg.c index 061cdaf5d5..d1004f66e7 100644 --- a/src/overlays/actors/ovl_Bg_Haka_MeganeBG/z_bg_haka_meganebg.c +++ b/src/overlays/actors/ovl_Bg_Haka_MeganeBG/z_bg_haka_meganebg.c @@ -1,7 +1,23 @@ /* * File: z_bg_haka_meganebg.c * Overlay: ovl_Bg_Haka_MeganeBG - * Description: + * Description: Misc. Shadow Temple themed objects + * + * BGHAKAMEGANEBG_TYPE_HIDDEN_MOVING_PLATFORM: + * An invisible square moving platform, viewable with Lens of Truth. Travels -320 x units from home and back. + * Setting rotY when spawning will rotate the shape, but not affect the movement path. + * world.rot.y is used like a flag, tracking the direction of movement for the platform. + * If world.rot.y == initial rotation, the platform is travelling from home towards the secondary position. + * If world.rot.y != initial rotation, the platform is travelling from the secondary position towards home. + * + * BGHAKAMEGANEBG_TYPE_CHAINED_ELEVATOR_PLATFORM: + * A square platform with chains on four corners. Drops 640 units before pulling itself up back to the home position. + * + * BGHAKAMEGANEBG_TYPE_ROTATING_PLATFORM: + * A simple spinning hexacon shaped black platform with a column in the center. + * + * BGHAKAMEGANEBG_TYPE_METAL_GATE: + * A metal gate that rises 100 units on switchFlag on. */ #include "z_bg_haka_meganebg.h" @@ -21,14 +37,14 @@ void BgHakaMeganeBG_Destroy(Actor* thisx, PlayState* play); void BgHakaMeganeBG_Update(Actor* thisx, PlayState* play); void BgHakaMeganeBG_Draw(Actor* thisx, PlayState* play); -void func_8087DFF8(BgHakaMeganeBG* this, PlayState* play); -void func_8087E040(BgHakaMeganeBG* this, PlayState* play); -void func_8087E10C(BgHakaMeganeBG* this, PlayState* play); -void func_8087E1E0(BgHakaMeganeBG* this, PlayState* play); -void func_8087E258(BgHakaMeganeBG* this, PlayState* play); -void func_8087E288(BgHakaMeganeBG* this, PlayState* play); -void func_8087E2D8(BgHakaMeganeBG* this, PlayState* play); -void func_8087E34C(BgHakaMeganeBG* this, PlayState* play); +void BgHakaMeganeBG_HiddenMovingPlatform_Idle(BgHakaMeganeBG* this, PlayState* play); +void BgHakaMeganeBG_HiddenMovingPlatform_Move(BgHakaMeganeBG* this, PlayState* play); +void BgHakaMeganeBG_ElevatorPlatform_Drop(BgHakaMeganeBG* this, PlayState* play); +void BgHakaMeganeBG_ElevatorPlatform_Raise(BgHakaMeganeBG* this, PlayState* play); +void BgHakaMeganeBG_RotatingPlatform_Spin(BgHakaMeganeBG* this, PlayState* play); +void BgHakaMeganeBG_Gate_WaitForSwitchFlag(BgHakaMeganeBG* this, PlayState* play); +void BgHakaMeganeBG_Gate_Open(BgHakaMeganeBG* this, PlayState* play); +void BgHakaMeganeBG_DoNothing(BgHakaMeganeBG* this, PlayState* play); ActorProfile Bg_Haka_MeganeBG_Profile = { /**/ ACTOR_BG_HAKA_MEGANEBG, @@ -53,50 +69,45 @@ static u32 D_8087E3FC[] = { 0x00000000, 0x00000000, 0x00000000, 0xC8C800FF, 0xFF0000FF, }; -static Gfx* D_8087E410[] = { - object_haka_objects_DL_008EB0, - object_haka_objects_DL_00A1A0, - object_haka_objects_DL_005000, - object_haka_objects_DL_000040, -}; - void BgHakaMeganeBG_Init(Actor* thisx, PlayState* play) { s32 pad; BgHakaMeganeBG* this = (BgHakaMeganeBG*)thisx; CollisionHeader* colHeader = NULL; Actor_ProcessInitChain(&this->dyna.actor, sInitChain); - this->unk_168 = PARAMS_GET_U(thisx->params, 8, 8); + this->switchFlag = PARAMS_GET_U(thisx->params, 8, 8); thisx->params &= 0xFF; - if (thisx->params == 2) { + if (thisx->params == BGHAKAMEGANEBG_TYPE_ROTATING_PLATFORM) { DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS | DYNA_TRANSFORM_ROT_Y); thisx->flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; - CollisionHeader_GetVirtual(&object_haka_objects_Col_005334, &colHeader); - this->actionFunc = func_8087E258; + CollisionHeader_GetVirtual(&gShadowTempleBlackPlatformWithScrewColumnCol, &colHeader); + this->actionFunc = BgHakaMeganeBG_RotatingPlatform_Spin; } else { DynaPolyActor_Init(&this->dyna, DYNA_TRANSFORM_POS); - if (thisx->params == 0) { - CollisionHeader_GetVirtual(&object_haka_objects_Col_009168, &colHeader); + if (thisx->params == BGHAKAMEGANEBG_TYPE_HIDDEN_MOVING_PLATFORM) { + CollisionHeader_GetVirtual(&gShadowTempleHiddenBlockPlatformCol, &colHeader); thisx->flags |= ACTOR_FLAG_REACT_TO_LENS; - this->unk_16A = 20; - this->actionFunc = func_8087DFF8; - } else if (thisx->params == 3) { - CollisionHeader_GetVirtual(&object_haka_objects_Col_000118, &colHeader); + this->timer = 20; + this->actionFunc = BgHakaMeganeBG_HiddenMovingPlatform_Idle; + } else if (thisx->params == BGHAKAMEGANEBG_TYPE_METAL_GATE) { + CollisionHeader_GetVirtual(&gShadowTempleMetalGateCol, &colHeader); thisx->home.pos.y += 100.0f; - if (Flags_GetSwitch(play, this->unk_168)) { - this->actionFunc = func_8087E34C; + if (Flags_GetSwitch(play, this->switchFlag)) { + // Gate open + this->actionFunc = BgHakaMeganeBG_DoNothing; thisx->world.pos.y = thisx->home.pos.y; } else { + // Gate closed thisx->flags |= ACTOR_FLAG_UPDATE_CULLING_DISABLED; - this->actionFunc = func_8087E288; + this->actionFunc = BgHakaMeganeBG_Gate_WaitForSwitchFlag; } - } else { - CollisionHeader_GetVirtual(&object_haka_objects_Col_00A7F4, &colHeader); - this->unk_16A = 80; - this->actionFunc = func_8087E10C; + } else /* BGHAKAMEGANEBG_TYPE_CHAINED_ELEVATOR_PLATFORM */ { + CollisionHeader_GetVirtual(&gShadowTempleChainedElevatorPlatformCol, &colHeader); + this->timer = 80; + this->actionFunc = BgHakaMeganeBG_ElevatorPlatform_Drop; thisx->cullingVolumeScale = 3000.0f; thisx->cullingVolumeDownward = 3000.0f; } @@ -111,45 +122,64 @@ void BgHakaMeganeBG_Destroy(Actor* thisx, PlayState* play) { DynaPoly_DeleteBgActor(play, &play->colCtx.dyna, this->dyna.bgId); } -void func_8087DFF8(BgHakaMeganeBG* this, PlayState* play) { - if (this->unk_16A != 0) { - this->unk_16A--; +void BgHakaMeganeBG_HiddenMovingPlatform_Idle(BgHakaMeganeBG* this, PlayState* play) { + if (this->timer != 0) { + this->timer--; } - if (this->unk_16A == 0) { - this->unk_16A = 40; + if (this->timer == 0) { + this->timer = 40; + + // world.rot.y is used like a binary flag here, where rotating by exactly 180 degrees will toggle the direction + // of movement. Arbitrary rotation values won't function correctly here. + //! @bug On the first run of the actor, this line will toggle the direction of movement before the actor has + //! moved to the secondary position, causing it to teleport. In practice it is hard to observe in normal + //! gameplay because the platform is invisible without lens of truth, and the teleport happens after a second of + //! spawning into the room. + //! + //! One possible fix would be to move this line into BgHakaMeganeBG_HiddenMovingPlatform_Move so it's always + //! flipping direction after it reached its destination. this->dyna.actor.world.rot.y += 0x8000; - this->actionFunc = func_8087E040; + + this->actionFunc = BgHakaMeganeBG_HiddenMovingPlatform_Move; } } -void func_8087E040(BgHakaMeganeBG* this, PlayState* play) { +void BgHakaMeganeBG_HiddenMovingPlatform_Move(BgHakaMeganeBG* this, PlayState* play) { f32 xSub; - if (this->unk_16A != 0) { - this->unk_16A--; + if (this->timer != 0) { + this->timer--; } - xSub = (sinf(((this->unk_16A * 0.025f) + 0.5f) * M_PI) + 1.0f) * 160.0f; + // The sine function is used to create an easing effect when the platform reaches its two target destinations. It + // works like this: + // + // The timer state, ranging from 39 to 0, is converted into an angle between 270 to 90 degrees, and in turn the sine + // function returns a value between -1.0 to 1.0. This is incremented by +1 to get 0.0 to 2.0, and finally multiplied + // by half of the travel distance to get the current platform's delta position. + xSub = (sinf(((this->timer * (1.0f / 40.0f)) + 0.5f) * M_PI) + 1.0f) * (320.0f / 2); + // The result is then inverted if the platform should travel the opposite direction. if (this->dyna.actor.world.rot.y != this->dyna.actor.shape.rot.y) { xSub = 320.0f - xSub; } this->dyna.actor.world.pos.x = this->dyna.actor.home.pos.x - xSub; - if (this->unk_16A == 0) { - this->unk_16A = 20; - this->actionFunc = func_8087DFF8; + if (this->timer == 0) { + this->timer = 20; + this->actionFunc = BgHakaMeganeBG_HiddenMovingPlatform_Idle; } } -void func_8087E10C(BgHakaMeganeBG* this, PlayState* play) { +void BgHakaMeganeBG_ElevatorPlatform_Drop(BgHakaMeganeBG* this, PlayState* play) { + // Here velocity.y is storing absolute velocity instead of directional velocity this->dyna.actor.velocity.y += 1.0f; this->dyna.actor.velocity.y = CLAMP_MAX(this->dyna.actor.velocity.y, 20.0f); - if (this->unk_16A != 0) { - this->unk_16A--; + if (this->timer != 0) { + this->timer--; } if (!Math_StepToF(&this->dyna.actor.world.pos.y, this->dyna.actor.home.pos.y - 640.0f, @@ -157,51 +187,51 @@ void func_8087E10C(BgHakaMeganeBG* this, PlayState* play) { Actor_PlaySfx_Flagged(&this->dyna.actor, NA_SE_EV_CHINETRAP_DOWN - SFX_FLAG); } - if (this->unk_16A == 0) { - this->unk_16A = 120; - this->actionFunc = func_8087E1E0; + if (this->timer == 0) { + this->timer = 120; + this->actionFunc = BgHakaMeganeBG_ElevatorPlatform_Raise; this->dyna.actor.velocity.y = 0.0f; } } -void func_8087E1E0(BgHakaMeganeBG* this, PlayState* play) { +void BgHakaMeganeBG_ElevatorPlatform_Raise(BgHakaMeganeBG* this, PlayState* play) { Math_StepToF(&this->dyna.actor.world.pos.y, this->dyna.actor.home.pos.y, 16.0f / 3.0f); Actor_PlaySfx_Flagged(&this->dyna.actor, NA_SE_EV_BRIDGE_CLOSE - SFX_FLAG); - if (this->unk_16A != 0) { - this->unk_16A--; + if (this->timer != 0) { + this->timer--; } - if (this->unk_16A == 0) { - this->unk_16A = 80; - this->actionFunc = func_8087E10C; + if (this->timer == 0) { + this->timer = 80; + this->actionFunc = BgHakaMeganeBG_ElevatorPlatform_Drop; } } -void func_8087E258(BgHakaMeganeBG* this, PlayState* play) { +void BgHakaMeganeBG_RotatingPlatform_Spin(BgHakaMeganeBG* this, PlayState* play) { this->dyna.actor.shape.rot.y += 0x180; Actor_PlaySfx_Flagged(&this->dyna.actor, NA_SE_EV_ELEVATOR_MOVE - SFX_FLAG); } -void func_8087E288(BgHakaMeganeBG* this, PlayState* play) { - if (Flags_GetSwitch(play, this->unk_168)) { +void BgHakaMeganeBG_Gate_WaitForSwitchFlag(BgHakaMeganeBG* this, PlayState* play) { + if (Flags_GetSwitch(play, this->switchFlag)) { OnePointCutscene_Attention(play, &this->dyna.actor); - this->actionFunc = func_8087E2D8; + this->actionFunc = BgHakaMeganeBG_Gate_Open; } } -void func_8087E2D8(BgHakaMeganeBG* this, PlayState* play) { +void BgHakaMeganeBG_Gate_Open(BgHakaMeganeBG* this, PlayState* play) { Math_StepToF(&this->dyna.actor.speed, 30.0f, 2.0f); if (Math_StepToF(&this->dyna.actor.world.pos.y, this->dyna.actor.home.pos.y, this->dyna.actor.speed)) { Actor_SetFocus(&this->dyna.actor, 50.0f); - this->actionFunc = func_8087E34C; + this->actionFunc = BgHakaMeganeBG_DoNothing; } else { Actor_PlaySfx_Flagged(&this->dyna.actor, NA_SE_EV_METALDOOR_OPEN); } } -void func_8087E34C(BgHakaMeganeBG* this, PlayState* play) { +void BgHakaMeganeBG_DoNothing(BgHakaMeganeBG* this, PlayState* play) { } void BgHakaMeganeBG_Update(Actor* thisx, PlayState* play) { @@ -211,12 +241,19 @@ void BgHakaMeganeBG_Update(Actor* thisx, PlayState* play) { } void BgHakaMeganeBG_Draw(Actor* thisx, PlayState* play) { + static Gfx* sDLists[] = { + gShadowTempleHiddenBlockPlatformDL, + gShadowTempleChainedElevatorPlatformDL, + gShadowTempleBlackPlatformWithScrewColumnDL, + gShadowTempleMetalGateDL, + }; + BgHakaMeganeBG* this = (BgHakaMeganeBG*)thisx; s16 params = this->dyna.actor.params; - if (params == 0) { - Gfx_DrawDListXlu(play, object_haka_objects_DL_008EB0); + if (params == BGHAKAMEGANEBG_TYPE_HIDDEN_MOVING_PLATFORM) { + Gfx_DrawDListXlu(play, gShadowTempleHiddenBlockPlatformDL); } else { - Gfx_DrawDListOpa(play, D_8087E410[params]); + Gfx_DrawDListOpa(play, sDLists[params]); } } diff --git a/src/overlays/actors/ovl_Bg_Haka_MeganeBG/z_bg_haka_meganebg.h b/src/overlays/actors/ovl_Bg_Haka_MeganeBG/z_bg_haka_meganebg.h index 47342beb78..0c3b7cde9e 100644 --- a/src/overlays/actors/ovl_Bg_Haka_MeganeBG/z_bg_haka_meganebg.h +++ b/src/overlays/actors/ovl_Bg_Haka_MeganeBG/z_bg_haka_meganebg.h @@ -4,6 +4,13 @@ #include "ultra64.h" #include "actor.h" +typedef enum BgHakaMeganeBGType { + /* 0 */ BGHAKAMEGANEBG_TYPE_HIDDEN_MOVING_PLATFORM, + /* 1 */ BGHAKAMEGANEBG_TYPE_CHAINED_ELEVATOR_PLATFORM, + /* 2 */ BGHAKAMEGANEBG_TYPE_ROTATING_PLATFORM, + /* 3 */ BGHAKAMEGANEBG_TYPE_METAL_GATE +} BgHakaMeganeBGType; + struct BgHakaMeganeBG; typedef void (*BgHakaMeganeBGActionFunc)(struct BgHakaMeganeBG*, struct PlayState*); @@ -11,8 +18,8 @@ typedef void (*BgHakaMeganeBGActionFunc)(struct BgHakaMeganeBG*, struct PlayStat typedef struct BgHakaMeganeBG { /* 0x0000 */ DynaPolyActor dyna; /* 0x0164 */ BgHakaMeganeBGActionFunc actionFunc; - /* 0x0168 */ u8 unk_168; - /* 0x016A */ s16 unk_16A; + /* 0x0168 */ u8 switchFlag; + /* 0x016A */ s16 timer; } BgHakaMeganeBG; // size = 0x016C #endif From f2cb5ecb2f7c174d69c61ab1dfa6f7784050014e Mon Sep 17 00:00:00 2001 From: Dragorn421 Date: Sun, 22 Feb 2026 18:48:27 +0100 Subject: [PATCH 2/4] 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",) From abdae818bda2f397c23e41078a4d89079b9fa7b8 Mon Sep 17 00:00:00 2001 From: Dragorn421 Date: Sun, 22 Feb 2026 19:08:12 +0100 Subject: [PATCH 3/4] Fix misc 23 (#2699) * remove noop macros Fault_SetFontColor Fault_SetCharPad under PLATFORM_N64 * remove duplicate declarations in sfx.h * use render mode presets more * decimal for alpha values * fix some z_camera comments typos * fix references to preprocess.sh (used to be preprocess.py) * remove outdated comment on deps in makefile * code_800AD920 was renamed to z_viszbuf * fix capitalization typo: gOcarinaofTimeDesignTex -> gOcarinaOfTimeDesignTex * fix typo: gLinkAdultEyesClosedfTex, gLinkChildEyesClosedfTex -> remove extra f * fix typo: gCrstalSwitchRedTex, gCrstalSwitchBlueTex -> gCrystal * fix PARAMS_GET_U amount of bits --- Makefile | 3 +-- assets/objects/gameplay_keep/link_textures.c | 4 ++-- assets/objects/gameplay_keep/link_textures.h | 6 +++--- assets/objects/object_link_boy/object_link_boy.c | 4 ++-- assets/objects/object_link_boy/object_link_boy.h | 2 +- assets/objects/object_link_child/object_link_child.c | 4 ++-- assets/objects/object_link_child/object_link_child.h | 2 +- assets/xml/objects/gameplay_dangeon_keep.xml | 4 ++-- assets/xml/objects/gameplay_keep.xml | 2 +- assets/xml/objects/gameplay_keep_pal.xml | 2 +- assets/xml/objects/object_link_boy.xml | 2 +- assets/xml/objects/object_link_child.xml | 2 +- include/fault.h | 4 ---- include/sfx.h | 4 ---- src/code/z_actor.c | 8 +++----- src/code/z_camera.c | 6 +++--- src/code/z_player_lib.c | 10 +++++----- .../actors/ovl_Bg_Ydan_Maruta/z_bg_ydan_maruta.c | 2 +- src/overlays/actors/ovl_Obj_Switch/z_obj_switch.c | 4 ++-- tools/fix_bss.py | 2 +- tools/ido_block_numbers.py | 2 +- undefined_syms.txt | 2 +- 22 files changed, 35 insertions(+), 46 deletions(-) diff --git a/Makefile b/Makefile index 5103d58691..70cfc4df6d 100644 --- a/Makefile +++ b/Makefile @@ -499,7 +499,6 @@ O_FILES := $(filter-out %_reloc.o,$(SPEC_O_FILES)) OVL_RELOC_FILES := $(filter %_reloc.o,$(SPEC_O_FILES)) # Automatic dependency files -# (Only asm_processor dependencies and reloc dependencies are handled for now) DEP_FILES := $(O_FILES:.o=.d) $(O_FILES:.o=.asmproc.d) $(OVL_RELOC_FILES:.o=.d) $(BUILD_DIR)/spec.d TEXTURE_FILES_PNG_EXTRACTED := $(foreach dir,$(ASSET_BIN_DIRS_EXTRACTED),$(wildcard $(dir)/*.png)) @@ -732,7 +731,7 @@ $(BUILD_DIR)/src/makerom/%.o: CCASFLAGS := $(EGCS_CCASFLAGS) $(BUILD_DIR)/src/makerom/%.o: ASOPTFLAGS := $(EGCS_ASOPTFLAGS) endif -ifeq ($(PERMUTER),) # permuter + preprocess.py misbehaves, permuter doesn't care about rodata diffs or bss ordering so just don't use it in that case +ifeq ($(PERMUTER),) # permuter + preprocess.sh misbehaves, permuter doesn't care about rodata diffs or bss ordering so just don't use it in that case # Handle encoding (UTF-8 -> EUC-JP) and custom pragmas $(BUILD_DIR)/src/%.o: PREPROCESS := ./tools/preprocess.sh -v $(VERSION) -i $(ICONV) -- endif diff --git a/assets/objects/gameplay_keep/link_textures.c b/assets/objects/gameplay_keep/link_textures.c index 3564006310..2ce9e69688 100644 --- a/assets/objects/gameplay_keep/link_textures.c +++ b/assets/objects/gameplay_keep/link_textures.c @@ -4,8 +4,8 @@ u64 gHylianShieldDesignTex[TEX_LEN(u64, gHylianShieldDesignTex_WIDTH, gHylianShi #include "assets/objects/gameplay_keep/gHylianShieldDesignTex.rgba16.inc.c" }; -u64 gOcarinaofTimeDesignTex[TEX_LEN(u64, gOcarinaofTimeDesignTex_WIDTH, gOcarinaofTimeDesignTex_HEIGHT, 16)] = { -#include "assets/objects/gameplay_keep/gOcarinaofTimeDesignTex.rgba16.inc.c" +u64 gOcarinaOfTimeDesignTex[TEX_LEN(u64, gOcarinaOfTimeDesignTex_WIDTH, gOcarinaOfTimeDesignTex_HEIGHT, 16)] = { +#include "assets/objects/gameplay_keep/gOcarinaOfTimeDesignTex.rgba16.inc.c" }; u64 gBottleGlassTex[TEX_LEN(u64, gBottleGlassTex_WIDTH, gBottleGlassTex_HEIGHT, 16)] = { diff --git a/assets/objects/gameplay_keep/link_textures.h b/assets/objects/gameplay_keep/link_textures.h index 1b69ed135c..eea7c7fee8 100644 --- a/assets/objects/gameplay_keep/link_textures.h +++ b/assets/objects/gameplay_keep/link_textures.h @@ -7,9 +7,9 @@ #define gHylianShieldDesignTex_WIDTH 32 #define gHylianShieldDesignTex_HEIGHT 64 extern u64 gHylianShieldDesignTex[TEX_LEN(u64, gHylianShieldDesignTex_WIDTH, gHylianShieldDesignTex_HEIGHT, 16)]; -#define gOcarinaofTimeDesignTex_WIDTH 32 -#define gOcarinaofTimeDesignTex_HEIGHT 16 -extern u64 gOcarinaofTimeDesignTex[TEX_LEN(u64, gOcarinaofTimeDesignTex_WIDTH, gOcarinaofTimeDesignTex_HEIGHT, 16)]; +#define gOcarinaOfTimeDesignTex_WIDTH 32 +#define gOcarinaOfTimeDesignTex_HEIGHT 16 +extern u64 gOcarinaOfTimeDesignTex[TEX_LEN(u64, gOcarinaOfTimeDesignTex_WIDTH, gOcarinaOfTimeDesignTex_HEIGHT, 16)]; #define gBottleGlassTex_WIDTH 16 #define gBottleGlassTex_HEIGHT 16 extern u64 gBottleGlassTex[TEX_LEN(u64, gBottleGlassTex_WIDTH, gBottleGlassTex_HEIGHT, 16)]; diff --git a/assets/objects/object_link_boy/object_link_boy.c b/assets/objects/object_link_boy/object_link_boy.c index ea6fe8c9f2..5f5065aadb 100644 --- a/assets/objects/object_link_boy/object_link_boy.c +++ b/assets/objects/object_link_boy/object_link_boy.c @@ -15,8 +15,8 @@ u64 gLinkAdultEyesHalfTex[TEX_LEN(u64, LINK_ADULT_EYES_TEX_WIDTH, LINK_ADULT_EYE #include "assets/objects/object_link_boy/gLinkAdultEyesHalfTex.ci8.tlut_gLinkAdultHeadTLUT.inc.c" }; -u64 gLinkAdultEyesClosedfTex[TEX_LEN(u64, LINK_ADULT_EYES_TEX_WIDTH, LINK_ADULT_EYES_TEX_HEIGHT, 8)] = { -#include "assets/objects/object_link_boy/gLinkAdultEyesClosedfTex.ci8.tlut_gLinkAdultHeadTLUT.inc.c" +u64 gLinkAdultEyesClosedTex[TEX_LEN(u64, LINK_ADULT_EYES_TEX_WIDTH, LINK_ADULT_EYES_TEX_HEIGHT, 8)] = { +#include "assets/objects/object_link_boy/gLinkAdultEyesClosedTex.ci8.tlut_gLinkAdultHeadTLUT.inc.c" }; u64 gLinkAdultEyesRightTex[TEX_LEN(u64, LINK_ADULT_EYES_TEX_WIDTH, LINK_ADULT_EYES_TEX_HEIGHT, 8)] = { diff --git a/assets/objects/object_link_boy/object_link_boy.h b/assets/objects/object_link_boy/object_link_boy.h index 349c36adeb..334e62b63f 100644 --- a/assets/objects/object_link_boy/object_link_boy.h +++ b/assets/objects/object_link_boy/object_link_boy.h @@ -9,7 +9,7 @@ #define LINK_ADULT_EYES_TEX_HEIGHT 32 extern u64 gLinkAdultEyesOpenTex[TEX_LEN(u64, LINK_ADULT_EYES_TEX_WIDTH, LINK_ADULT_EYES_TEX_HEIGHT, 8)]; extern u64 gLinkAdultEyesHalfTex[TEX_LEN(u64, LINK_ADULT_EYES_TEX_WIDTH, LINK_ADULT_EYES_TEX_HEIGHT, 8)]; -extern u64 gLinkAdultEyesClosedfTex[TEX_LEN(u64, LINK_ADULT_EYES_TEX_WIDTH, LINK_ADULT_EYES_TEX_HEIGHT, 8)]; +extern u64 gLinkAdultEyesClosedTex[TEX_LEN(u64, LINK_ADULT_EYES_TEX_WIDTH, LINK_ADULT_EYES_TEX_HEIGHT, 8)]; extern u64 gLinkAdultEyesRightTex[TEX_LEN(u64, LINK_ADULT_EYES_TEX_WIDTH, LINK_ADULT_EYES_TEX_HEIGHT, 8)]; extern u64 gLinkAdultEyesLeftTex[TEX_LEN(u64, LINK_ADULT_EYES_TEX_WIDTH, LINK_ADULT_EYES_TEX_HEIGHT, 8)]; extern u64 gLinkAdultEyesWideTex[TEX_LEN(u64, LINK_ADULT_EYES_TEX_WIDTH, LINK_ADULT_EYES_TEX_HEIGHT, 8)]; diff --git a/assets/objects/object_link_child/object_link_child.c b/assets/objects/object_link_child/object_link_child.c index 30411ab0b4..a7062de659 100644 --- a/assets/objects/object_link_child/object_link_child.c +++ b/assets/objects/object_link_child/object_link_child.c @@ -15,8 +15,8 @@ u64 gLinkChildEyesHalfTex[TEX_LEN(u64, LINK_CHILD_EYES_TEX_WIDTH, LINK_CHILD_EYE #include "assets/objects/object_link_child/gLinkChildEyesHalfTex.ci8.tlut_gLinkChildSkinTLUT.inc.c" }; -u64 gLinkChildEyesClosedfTex[TEX_LEN(u64, LINK_CHILD_EYES_TEX_WIDTH, LINK_CHILD_EYES_TEX_HEIGHT, 8)] = { -#include "assets/objects/object_link_child/gLinkChildEyesClosedfTex.ci8.tlut_gLinkChildSkinTLUT.inc.c" +u64 gLinkChildEyesClosedTex[TEX_LEN(u64, LINK_CHILD_EYES_TEX_WIDTH, LINK_CHILD_EYES_TEX_HEIGHT, 8)] = { +#include "assets/objects/object_link_child/gLinkChildEyesClosedTex.ci8.tlut_gLinkChildSkinTLUT.inc.c" }; u64 gLinkChildEyesLeftTex[TEX_LEN(u64, LINK_CHILD_EYES_TEX_WIDTH, LINK_CHILD_EYES_TEX_HEIGHT, 8)] = { diff --git a/assets/objects/object_link_child/object_link_child.h b/assets/objects/object_link_child/object_link_child.h index 0641714080..8da3bfc6b6 100644 --- a/assets/objects/object_link_child/object_link_child.h +++ b/assets/objects/object_link_child/object_link_child.h @@ -9,7 +9,7 @@ #define LINK_CHILD_EYES_TEX_HEIGHT 32 extern u64 gLinkChildEyesOpenTex[TEX_LEN(u64, LINK_CHILD_EYES_TEX_WIDTH, LINK_CHILD_EYES_TEX_HEIGHT, 8)]; extern u64 gLinkChildEyesHalfTex[TEX_LEN(u64, LINK_CHILD_EYES_TEX_WIDTH, LINK_CHILD_EYES_TEX_HEIGHT, 8)]; -extern u64 gLinkChildEyesClosedfTex[TEX_LEN(u64, LINK_CHILD_EYES_TEX_WIDTH, LINK_CHILD_EYES_TEX_HEIGHT, 8)]; +extern u64 gLinkChildEyesClosedTex[TEX_LEN(u64, LINK_CHILD_EYES_TEX_WIDTH, LINK_CHILD_EYES_TEX_HEIGHT, 8)]; extern u64 gLinkChildEyesLeftTex[TEX_LEN(u64, LINK_CHILD_EYES_TEX_WIDTH, LINK_CHILD_EYES_TEX_HEIGHT, 8)]; extern u64 gLinkChildEyesRightTex[TEX_LEN(u64, LINK_CHILD_EYES_TEX_WIDTH, LINK_CHILD_EYES_TEX_HEIGHT, 8)]; extern u64 gLinkChildEyesWideTex[TEX_LEN(u64, LINK_CHILD_EYES_TEX_WIDTH, LINK_CHILD_EYES_TEX_HEIGHT, 8)]; diff --git a/assets/xml/objects/gameplay_dangeon_keep.xml b/assets/xml/objects/gameplay_dangeon_keep.xml index 015e400e41..debafa33e7 100644 --- a/assets/xml/objects/gameplay_dangeon_keep.xml +++ b/assets/xml/objects/gameplay_dangeon_keep.xml @@ -135,8 +135,8 @@ - - + + diff --git a/assets/xml/objects/gameplay_keep.xml b/assets/xml/objects/gameplay_keep.xml index b8e20ab429..973d4c3ced 100644 --- a/assets/xml/objects/gameplay_keep.xml +++ b/assets/xml/objects/gameplay_keep.xml @@ -4,7 +4,7 @@ - + diff --git a/assets/xml/objects/gameplay_keep_pal.xml b/assets/xml/objects/gameplay_keep_pal.xml index 04387392fb..d09be36fd6 100644 --- a/assets/xml/objects/gameplay_keep_pal.xml +++ b/assets/xml/objects/gameplay_keep_pal.xml @@ -4,7 +4,7 @@ - + diff --git a/assets/xml/objects/object_link_boy.xml b/assets/xml/objects/object_link_boy.xml index 21a1d407c2..eab6ae3ab9 100644 --- a/assets/xml/objects/object_link_boy.xml +++ b/assets/xml/objects/object_link_boy.xml @@ -526,7 +526,7 @@ - + diff --git a/assets/xml/objects/object_link_child.xml b/assets/xml/objects/object_link_child.xml index 25ad178c3c..99492de108 100644 --- a/assets/xml/objects/object_link_child.xml +++ b/assets/xml/objects/object_link_child.xml @@ -436,7 +436,7 @@ - + diff --git a/include/fault.h b/include/fault.h index af895927d0..015da7d1c8 100644 --- a/include/fault.h +++ b/include/fault.h @@ -81,10 +81,6 @@ void Fault_DrawText(s32 x, s32 y, const char* fmt, ...); void func_800AE1F8(void); -// Not implemented. Silently noop-ing is fine, these are not essential for functionality. -#define Fault_SetFontColor(color) (void)0 -#define Fault_SetCharPad(padW, padH) (void)0 - #else void Fault_InitDrawer(void); diff --git a/include/sfx.h b/include/sfx.h index 2a9b543c3b..6d61c3cf1f 100644 --- a/include/sfx.h +++ b/include/sfx.h @@ -184,10 +184,6 @@ void func_800F8F88(void); u8 Audio_IsSfxPlaying(u32 sfxId); void Audio_ResetSfx(void); -extern Vec3f gSfxDefaultPos; -extern f32 gSfxDefaultFreqAndVolScale; -extern s8 gSfxDefaultReverb; - extern SfxParams* gSfxParams[7]; extern char D_80133390[]; extern char D_80133398[]; diff --git a/src/code/z_actor.c b/src/code/z_actor.c index 4a86cf25c5..ddb8a9e0be 100644 --- a/src/code/z_actor.c +++ b/src/code/z_actor.c @@ -4511,9 +4511,7 @@ Gfx* func_80034B54(GraphicsContext* gfxCtx) { displayList = displayListHead = GRAPH_ALLOC(gfxCtx, 2 * sizeof(Gfx)); - gDPSetRenderMode(displayListHead++, G_RM_FOG_SHADE_A, - AA_EN | Z_CMP | Z_UPD | IM_RD | CLR_ON_CVG | CVG_DST_WRAP | ZMODE_XLU | FORCE_BL | - GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)); + gDPSetRenderMode(displayListHead++, G_RM_FOG_SHADE_A, Z_UPD | G_RM_AA_ZB_XLU_SURF2); gSPEndDisplayList(displayListHead++); @@ -4565,10 +4563,10 @@ s16 Actor_UpdateAlphaByDistance(Actor* actor, PlayState* play, s16 alpha, f32 ra if (radius < distance) { actor->flags &= ~ACTOR_FLAG_ATTENTION_ENABLED; - Math_SmoothStepToS(&alpha, 0, 6, 0x14, 1); + Math_SmoothStepToS(&alpha, 0, 6, 20, 1); } else { actor->flags |= ACTOR_FLAG_ATTENTION_ENABLED; - Math_SmoothStepToS(&alpha, 0xFF, 6, 0x14, 1); + Math_SmoothStepToS(&alpha, 255, 6, 20, 1); } return alpha; diff --git a/src/code/z_camera.c b/src/code/z_camera.c index 803a89400f..3baaf6579f 100644 --- a/src/code/z_camera.c +++ b/src/code/z_camera.c @@ -6333,8 +6333,8 @@ s32 Camera_Demo5(Camera* camera) { camera->timer += D_8011D79C[2].timerInit + D_8011D79C[3].timerInit; } } else if (eyeTargetDist < 300.0f && eyePlayerGeo.r < 30.0f) { - // distance from the camera's current positon and the target is less than 300 units - // and the distance fromthe camera's current position to the player is less than 30 units + // distance from the camera's current position and the target is less than 300 units + // and the distance from the camera's current position to the player is less than 30 units static OnePointCsFull D_8011D83C[] = { { ONEPOINT_CS_ACTION(ONEPOINT_CS_ACTION_ID_3, false, true), @@ -7237,7 +7237,7 @@ s32 Camera_Special6(Camera* camera) { sCameraInterfaceField = roData->interfaceField; if (eyeNext->x != bgCamPos.x || eyeNext->y != bgCamPos.y || eyeNext->z != bgCamPos.z || camera->animState == 0) { - // A change in the current scene's camera positon has been detected, + // A change in the current scene's camera position has been detected, // Change "screens" camera->player->actor.freezeTimer = 12; // Overwrite hud visibility to CAM_HUD_VISIBILITY_HEARTS_FORCE diff --git a/src/code/z_player_lib.c b/src/code/z_player_lib.c index 69d7b76d9e..49948f8562 100644 --- a/src/code/z_player_lib.c +++ b/src/code/z_player_lib.c @@ -1007,7 +1007,7 @@ PlayerFaceIndices sPlayerFaces[PLAYER_FACE_MAX] = { void* sEyeTextures[PLAYER_EYES_MAX] = { gLinkAdultEyesOpenTex, // PLAYER_EYES_OPEN gLinkAdultEyesHalfTex, // PLAYER_EYES_HALF - gLinkAdultEyesClosedfTex, // PLAYER_EYES_CLOSED + gLinkAdultEyesClosedTex, // PLAYER_EYES_CLOSED gLinkAdultEyesRightTex, // PLAYER_EYES_RIGHT gLinkAdultEyesLeftTex, // PLAYER_EYES_LEFT gLinkAdultEyesWideTex, // PLAYER_EYES_WIDE @@ -1027,7 +1027,7 @@ void* sEyeTextures[][PLAYER_EYES_MAX] = { { gLinkAdultEyesOpenTex, // PLAYER_EYES_OPEN gLinkAdultEyesHalfTex, // PLAYER_EYES_HALF - gLinkAdultEyesClosedfTex, // PLAYER_EYES_CLOSED + gLinkAdultEyesClosedTex, // PLAYER_EYES_CLOSED gLinkAdultEyesRightTex, // PLAYER_EYES_RIGHT gLinkAdultEyesLeftTex, // PLAYER_EYES_LEFT gLinkAdultEyesWideTex, // PLAYER_EYES_WIDE @@ -1035,9 +1035,9 @@ void* sEyeTextures[][PLAYER_EYES_MAX] = { gLinkAdultEyesWincingTex, // PLAYER_EYES_WINCING }, { - gLinkChildEyesOpenTex, // PLAYER_EYES_OPEN - gLinkChildEyesHalfTex, // PLAYER_EYES_HALF - gLinkChildEyesClosedfTex, // PLAYER_EYES_CLOSED + gLinkChildEyesOpenTex, // PLAYER_EYES_OPEN + gLinkChildEyesHalfTex, // PLAYER_EYES_HALF + gLinkChildEyesClosedTex, // PLAYER_EYES_CLOSED /* Note `PLAYER_EYES_RIGHT` corresponds to the "left" eyes texture, and vice-versa with the "right" eyes textures. This is because on the textures Link appears to look left/right as if facing outwards the screen, diff --git a/src/overlays/actors/ovl_Bg_Ydan_Maruta/z_bg_ydan_maruta.c b/src/overlays/actors/ovl_Bg_Ydan_Maruta/z_bg_ydan_maruta.c index 10c23e5187..71aa22cd03 100644 --- a/src/overlays/actors/ovl_Bg_Ydan_Maruta/z_bg_ydan_maruta.c +++ b/src/overlays/actors/ovl_Bg_Ydan_Maruta/z_bg_ydan_maruta.c @@ -96,7 +96,7 @@ void BgYdanMaruta_Init(Actor* thisx, PlayState* play) { Collider_InitTris(play, &this->collider); Collider_SetTris(play, &this->collider, &this->dyna.actor, &sTrisInit, this->colliderElements); - this->switchFlag = PARAMS_GET_U(this->dyna.actor.params, 0, 16); + this->switchFlag = PARAMS_GET_U(this->dyna.actor.params, 0, 8); thisx->params = PARAMS_GET_U(thisx->params, 8, 8); // thisx is required to match here if (this->dyna.actor.params == 0) { 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 dbe4193bef..328e6ea205 100644 --- a/src/overlays/actors/ovl_Obj_Switch/z_obj_switch.c +++ b/src/overlays/actors/ovl_Obj_Switch/z_obj_switch.c @@ -622,7 +622,7 @@ void ObjSwitch_CrystalOffInit(ObjSwitch* this) { this->crystalColor.r = 0; this->crystalColor.g = 0; this->crystalColor.b = 0; - this->crystalSubtype1texture = gCrstalSwitchRedTex; + this->crystalSubtype1texture = gCrystalSwitchRedTex; this->actionFunc = ObjSwitch_CrystalOff; } @@ -677,7 +677,7 @@ void ObjSwitch_CrystalOnInit(ObjSwitch* this) { this->crystalColor.r = 255; this->crystalColor.g = 255; this->crystalColor.b = 255; - this->crystalSubtype1texture = gCrstalSwitchBlueTex; + this->crystalSubtype1texture = gCrystalSwitchBlueTex; this->actionFunc = ObjSwitch_CrystalOn; } diff --git a/tools/fix_bss.py b/tools/fix_bss.py index 743085cd17..6d13a794e5 100755 --- a/tools/fix_bss.py +++ b/tools/fix_bss.py @@ -349,7 +349,7 @@ class BssSymbol: INCREMENT_BLOCK_NUMBER_RE = re.compile(r"increment_block_number_(\d+)_(\d+)") -# Find increment_block_number pragmas by parsing the symbol names generated by preprocess.py. +# Find increment_block_number pragmas by parsing the symbol names generated by preprocess.sh. # This is pretty ugly but it seems more reliable than trying to determine the line numbers of # BSS variables in the C file. def find_pragmas(symbol_table: list[SymbolTableEntry]) -> list[Pragma]: diff --git a/tools/ido_block_numbers.py b/tools/ido_block_numbers.py index 188cf8f36d..dc7cc99548 100755 --- a/tools/ido_block_numbers.py +++ b/tools/ido_block_numbers.py @@ -497,7 +497,7 @@ def run_cfe( command_line: list[str], keep_files: bool ) -> Tuple[list[SymbolTableEntry], list[UcodeOp]]: # Assume command line is of the form: - # python3 tools/preprocess.py [COMPILER] [COMPILER_ARGS] [INPUT_FILE] + # python3 tools/preprocess.sh [COMPILER] [COMPILER_ARGS] [INPUT_FILE] input_file = Path(command_line[-1]) rest = command_line[:-1] diff --git a/undefined_syms.txt b/undefined_syms.txt index deba8affd0..c40597854c 100644 --- a/undefined_syms.txt +++ b/undefined_syms.txt @@ -1,7 +1,7 @@ // z_kankyo, z_demo_kankyo, z_en_viewer, z_object_kankyo, z_eff_ss_dead_dd D_01000000 = 0x01000000; -// code_800AD920 +// z_viszbuf D_0E000000 = 0x0E000000; // z_vismono From 0d4dbb61a0099226d530b384533bda45e7b5ef69 Mon Sep 17 00:00:00 2001 From: Dragorn421 Date: Sun, 22 Feb 2026 22:50:27 +0100 Subject: [PATCH 4/4] Fix F3DEX2 ucode name on N64 versions (not PosLight) (#2701) * Fix F3DEX2 ucode name on N64 versions (not PosLight) * put the not-PosLight / PosLight differences under F3DEX_GBI_PL * revert bss changes --- Makefile | 2 +- baseroms/ntsc-1.0/config.yml | 4 ++-- baseroms/ntsc-1.1/config.yml | 4 ++-- baseroms/ntsc-1.2/config.yml | 4 ++-- baseroms/pal-1.0/config.yml | 4 ++-- baseroms/pal-1.1/config.yml | 4 ++-- data/rsp.rodata.s | 8 ++++++-- data/rsp.text.s | 8 ++++---- include/ultra64/ucode.h | 5 +++++ src/code/graph.c | 16 ++++++++++++++++ src/code/sys_ucode.c | 5 +++++ src/overlays/actors/ovl_Boss_Tw/z_boss_tw.c | 4 ++-- 12 files changed, 49 insertions(+), 19 deletions(-) diff --git a/Makefile b/Makefile index 70cfc4df6d..cfaf3d3449 100644 --- a/Makefile +++ b/Makefile @@ -362,7 +362,7 @@ ifeq ($(DEBUG_FEATURES),1) GBI_DEFINES += -DGBI_DEBUG endif -CPPFLAGS += -P -xc -fno-dollars-in-identifiers $(CPP_DEFINES) +CPPFLAGS += -P -xc -fno-dollars-in-identifiers $(CPP_DEFINES) $(GBI_DEFINES) ASFLAGS += -march=vr4300 -32 -no-pad-sections -Iinclude -I$(EXTRACTED_DIR) ifeq ($(COMPILER),gcc) diff --git a/baseroms/ntsc-1.0/config.yml b/baseroms/ntsc-1.0/config.yml index 948bbd179a..e164590c39 100644 --- a/baseroms/ntsc-1.0/config.yml +++ b/baseroms/ntsc-1.0/config.yml @@ -16,7 +16,7 @@ incbins: segment: code vram: 0x800E2FC0 size: 0xFB0 - - name: gspF3DZEX2_NoN_PosLight_fifoText + - name: gspF3DZEX2_NoN_fifoText segment: code vram: 0x800E3F70 size: 0x1390 @@ -32,7 +32,7 @@ incbins: segment: code vram: 0x801142E0 size: 0x2E0 - - name: gspF3DZEX2_NoN_PosLight_fifoData + - name: gspF3DZEX2_NoN_fifoData segment: code vram: 0x801145C0 size: 0x420 diff --git a/baseroms/ntsc-1.1/config.yml b/baseroms/ntsc-1.1/config.yml index 2317ae2dac..ee27b55df9 100644 --- a/baseroms/ntsc-1.1/config.yml +++ b/baseroms/ntsc-1.1/config.yml @@ -16,7 +16,7 @@ incbins: segment: code vram: 0x800E3180 size: 0xFB0 - - name: gspF3DZEX2_NoN_PosLight_fifoText + - name: gspF3DZEX2_NoN_fifoText segment: code vram: 0x800E4130 size: 0x1390 @@ -32,7 +32,7 @@ incbins: segment: code vram: 0x801144A0 size: 0x2E0 - - name: gspF3DZEX2_NoN_PosLight_fifoData + - name: gspF3DZEX2_NoN_fifoData segment: code vram: 0x80114780 size: 0x420 diff --git a/baseroms/ntsc-1.2/config.yml b/baseroms/ntsc-1.2/config.yml index 6fc7896db0..b0c8b18bee 100644 --- a/baseroms/ntsc-1.2/config.yml +++ b/baseroms/ntsc-1.2/config.yml @@ -16,7 +16,7 @@ incbins: segment: code vram: 0x800E3600 size: 0xFB0 - - name: gspF3DZEX2_NoN_PosLight_fifoText + - name: gspF3DZEX2_NoN_fifoText segment: code vram: 0x800E45B0 size: 0x1390 @@ -32,7 +32,7 @@ incbins: segment: code vram: 0x80114990 size: 0x2E0 - - name: gspF3DZEX2_NoN_PosLight_fifoData + - name: gspF3DZEX2_NoN_fifoData segment: code vram: 0x80114C70 size: 0x420 diff --git a/baseroms/pal-1.0/config.yml b/baseroms/pal-1.0/config.yml index 37ffb7500b..d9bfda781c 100644 --- a/baseroms/pal-1.0/config.yml +++ b/baseroms/pal-1.0/config.yml @@ -13,7 +13,7 @@ incbins: segment: code vram: 0x800E0F10 size: 0xFB0 - - name: gspF3DZEX2_NoN_PosLight_fifoText + - name: gspF3DZEX2_NoN_fifoText segment: code vram: 0x800E1EC0 size: 0x1390 @@ -37,7 +37,7 @@ incbins: segment: code vram: 0x801120E0 size: 0x2E0 - - name: gspF3DZEX2_NoN_PosLight_fifoData + - name: gspF3DZEX2_NoN_fifoData segment: code vram: 0x801123C0 size: 0x420 diff --git a/baseroms/pal-1.1/config.yml b/baseroms/pal-1.1/config.yml index 45bf82b877..6de560bcca 100644 --- a/baseroms/pal-1.1/config.yml +++ b/baseroms/pal-1.1/config.yml @@ -13,7 +13,7 @@ incbins: segment: code vram: 0x800E0F50 size: 0xFB0 - - name: gspF3DZEX2_NoN_PosLight_fifoText + - name: gspF3DZEX2_NoN_fifoText segment: code vram: 0x800E1F00 size: 0x1390 @@ -37,7 +37,7 @@ incbins: segment: code vram: 0x80112120 size: 0x2E0 - - name: gspF3DZEX2_NoN_PosLight_fifoData + - name: gspF3DZEX2_NoN_fifoData segment: code vram: 0x80112400 size: 0x420 diff --git a/data/rsp.rodata.s b/data/rsp.rodata.s index 6688f7c627..e60c522133 100644 --- a/data/rsp.rodata.s +++ b/data/rsp.rodata.s @@ -13,15 +13,19 @@ glabel aspMainDataStart .incbin "incbin/aspMainData" glabel aspMainDataEnd -#if !PLATFORM_N64 +#ifndef F3DEX_GBI_PL +glabel gspF3DZEX2_NoN_fifoDataStart + .incbin "incbin/gspF3DZEX2_NoN_fifoData" +glabel gspF3DZEX2_NoN_fifoDataEnd +#else glabel gspF3DZEX2_NoN_PosLight_fifoTextStart .incbin "incbin/gspF3DZEX2_NoN_PosLight_fifoText" glabel gspF3DZEX2_NoN_PosLight_fifoTextEnd -#endif glabel gspF3DZEX2_NoN_PosLight_fifoDataStart .incbin "incbin/gspF3DZEX2_NoN_PosLight_fifoData" glabel gspF3DZEX2_NoN_PosLight_fifoDataEnd +#endif glabel gspS2DEX2d_fifoDataStart .incbin "incbin/gspS2DEX2d_fifoData" diff --git a/data/rsp.text.s b/data/rsp.text.s index a40252853a..34033443b8 100644 --- a/data/rsp.text.s +++ b/data/rsp.text.s @@ -13,10 +13,10 @@ glabel aspMainTextStart .incbin "incbin/aspMainText" glabel aspMainTextEnd -#if PLATFORM_N64 -glabel gspF3DZEX2_NoN_PosLight_fifoTextStart - .incbin "incbin/gspF3DZEX2_NoN_PosLight_fifoText" -glabel gspF3DZEX2_NoN_PosLight_fifoTextEnd +#ifndef F3DEX_GBI_PL +glabel gspF3DZEX2_NoN_fifoTextStart + .incbin "incbin/gspF3DZEX2_NoN_fifoText" +glabel gspF3DZEX2_NoN_fifoTextEnd #endif glabel gspS2DEX2d_fifoTextStart diff --git a/include/ultra64/ucode.h b/include/ultra64/ucode.h index 9265c882b6..dfd0e08e2e 100644 --- a/include/ultra64/ucode.h +++ b/include/ultra64/ucode.h @@ -17,8 +17,13 @@ extern u64 cic6105TextStart[], cic6105TextEnd[]; extern u64 aspMainTextStart[], aspMainTextEnd[]; extern u64 aspMainDataStart[], aspMainDataEnd[]; +#ifndef F3DEX_GBI_PL +extern u64 gspF3DZEX2_NoN_fifoTextStart[], gspF3DZEX2_NoN_fifoTextEnd[]; +extern u64 gspF3DZEX2_NoN_fifoDataStart[], gspF3DZEX2_NoN_fifoDataEnd[]; +#else extern u64 gspF3DZEX2_NoN_PosLight_fifoTextStart[], gspF3DZEX2_NoN_PosLight_fifoTextEnd[]; extern u64 gspF3DZEX2_NoN_PosLight_fifoDataStart[], gspF3DZEX2_NoN_PosLight_fifoDataEnd[]; +#endif extern u64 gspS2DEX2d_fifoTextStart[], gspS2DEX2d_fifoTextEnd[]; extern u64 gspS2DEX2d_fifoDataStart[], gspS2DEX2d_fifoDataEnd[]; diff --git a/src/code/graph.c b/src/code/graph.c index c6b5f3cb61..826dd71c08 100644 --- a/src/code/graph.c +++ b/src/code/graph.c @@ -50,13 +50,21 @@ OSTime sGraphPrevTaskTimeStart; FaultClient sGraphFaultClient; UCodeInfo D_8012D230[3] = { +#ifndef F3DEX_GBI_PL + { UCODE_TYPE_F3DZEX, gspF3DZEX2_NoN_fifoTextStart }, +#else { UCODE_TYPE_F3DZEX, gspF3DZEX2_NoN_PosLight_fifoTextStart }, +#endif { UCODE_TYPE_UNK, NULL }, { UCODE_TYPE_S2DEX, gspS2DEX2d_fifoTextStart }, }; UCodeInfo D_8012D248[3] = { +#ifndef F3DEX_GBI_PL + { UCODE_TYPE_F3DZEX, gspF3DZEX2_NoN_fifoTextStart }, +#else { UCODE_TYPE_F3DZEX, gspF3DZEX2_NoN_PosLight_fifoTextStart }, +#endif { UCODE_TYPE_UNK, NULL }, { UCODE_TYPE_S2DEX, gspS2DEX2d_fifoTextStart }, }; @@ -81,7 +89,11 @@ void Graph_DisassembleUCode(Gfx* workBuf) { disassembler.enableLog = R_UCODE_DISAS_LOG_LEVEL; UCodeDisas_RegisterUCode(&disassembler, ARRAY_COUNT(D_8012D230), D_8012D230); +#ifndef F3DEX_GBI_PL + UCodeDisas_SetCurUCode(&disassembler, gspF3DZEX2_NoN_fifoTextStart); +#else UCodeDisas_SetCurUCode(&disassembler, gspF3DZEX2_NoN_PosLight_fifoTextStart); +#endif UCodeDisas_Disassemble(&disassembler, workBuf); @@ -120,7 +132,11 @@ void Graph_UCodeFaultClient(Gfx* workBuf) { UCodeDisas_Init(&disassembler); disassembler.enableLog = true; UCodeDisas_RegisterUCode(&disassembler, ARRAY_COUNT(D_8012D248), D_8012D248); +#ifndef F3DEX_GBI_PL + UCodeDisas_SetCurUCode(&disassembler, gspF3DZEX2_NoN_fifoTextStart); +#else UCodeDisas_SetCurUCode(&disassembler, gspF3DZEX2_NoN_PosLight_fifoTextStart); +#endif UCodeDisas_Disassemble(&disassembler, workBuf); UCodeDisas_Destroy(&disassembler); } diff --git a/src/code/sys_ucode.c b/src/code/sys_ucode.c index 71ae003909..d1e6098026 100644 --- a/src/code/sys_ucode.c +++ b/src/code/sys_ucode.c @@ -1,8 +1,13 @@ #include "ultra64.h" #include "sys_ucode.h" +#ifndef F3DEX_GBI_PL +u64* sDefaultGSPUCodeText = gspF3DZEX2_NoN_fifoTextStart; +u64* sDefaultGSPUCodeData = gspF3DZEX2_NoN_fifoDataStart; +#else u64* sDefaultGSPUCodeText = gspF3DZEX2_NoN_PosLight_fifoTextStart; u64* sDefaultGSPUCodeData = gspF3DZEX2_NoN_PosLight_fifoDataStart; +#endif u64* SysUcode_GetUCodeBoot(void) { return rspbootTextStart; diff --git a/src/overlays/actors/ovl_Boss_Tw/z_boss_tw.c b/src/overlays/actors/ovl_Boss_Tw/z_boss_tw.c index e3de734e45..5401b389d2 100644 --- a/src/overlays/actors/ovl_Boss_Tw/z_boss_tw.c +++ b/src/overlays/actors/ovl_Boss_Tw/z_boss_tw.c @@ -26,8 +26,8 @@ #include "assets/objects/gameplay_keep/shadow_circle.h" #include "assets/objects/object_tw/object_tw.h" -#pragma increment_block_number "gc-eu:0 gc-eu-mq:0 gc-jp:0 gc-jp-ce:0 gc-jp-mq:0 gc-us:0 gc-us-mq:0" \ - "ique-cn:0 ntsc-1.0:0 ntsc-1.1:0 ntsc-1.2:0 pal-1.0:0 pal-1.1:0" +#pragma increment_block_number "gc-eu:0 gc-eu-mq:0 gc-jp:0 gc-jp-ce:0 gc-jp-mq:0 gc-us:0 gc-us-mq:0 ique-cn:128" \ + "ntsc-1.0:0 ntsc-1.1:0 ntsc-1.2:0 pal-1.0:0 pal-1.1:0" #define FLAGS \ (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_CULLING_DISABLED | \