From ac569baeaca6cb917cb77d4c03d393f947f3d58d Mon Sep 17 00:00:00 2001 From: Unreference <87878910+unreference@users.noreply.github.com> Date: Tue, 12 May 2026 11:31:09 -0700 Subject: [PATCH 1/3] fix(actors): Initialize En_Dnt_Nomal flower position before draw --- soh/src/overlays/actors/ovl_En_Dnt_Nomal/z_en_dnt_nomal.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/soh/src/overlays/actors/ovl_En_Dnt_Nomal/z_en_dnt_nomal.c b/soh/src/overlays/actors/ovl_En_Dnt_Nomal/z_en_dnt_nomal.c index 4e66ac0bf3b..79483d1f94a 100644 --- a/soh/src/overlays/actors/ovl_En_Dnt_Nomal/z_en_dnt_nomal.c +++ b/soh/src/overlays/actors/ovl_En_Dnt_Nomal/z_en_dnt_nomal.c @@ -189,6 +189,10 @@ void EnDntNomal_WaitForObject(EnDntNomal* this, PlayState* play) { this->morphTable, 11); this->actor.draw = EnDntNomal_DrawStageScrub; } + + // Draw is now enabled but SetFlower hasn't run yet (it waits for ground contact). Default flowerPos to the + // actor's spawn position so the flower doesn't render at the origin for the intervening frames. + this->flowerPos = this->actor.world.pos; this->actionFunc = EnDntNomal_SetFlower; } } @@ -887,4 +891,4 @@ void EnDntNomal_DrawTargetScrub(Actor* thisx, PlayState* play) { gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); gSPDisplayList(POLY_OPA_DISP++, gHintNutsFlowerDL); CLOSE_DISPS(play->state.gfxCtx); -} +} \ No newline at end of file From ad0db341de977d92fd4749d84e25762d5dba916d Mon Sep 17 00:00:00 2001 From: Unreference <87878910+unreference@users.noreply.github.com> Date: Wed, 13 May 2026 07:39:57 -0700 Subject: [PATCH 2/3] chore: Add issue link for clarification --- soh/src/overlays/actors/ovl_En_Dnt_Nomal/z_en_dnt_nomal.c | 1 + 1 file changed, 1 insertion(+) diff --git a/soh/src/overlays/actors/ovl_En_Dnt_Nomal/z_en_dnt_nomal.c b/soh/src/overlays/actors/ovl_En_Dnt_Nomal/z_en_dnt_nomal.c index 79483d1f94a..2246b65beb6 100644 --- a/soh/src/overlays/actors/ovl_En_Dnt_Nomal/z_en_dnt_nomal.c +++ b/soh/src/overlays/actors/ovl_En_Dnt_Nomal/z_en_dnt_nomal.c @@ -190,6 +190,7 @@ void EnDntNomal_WaitForObject(EnDntNomal* this, PlayState* play) { this->actor.draw = EnDntNomal_DrawStageScrub; } + // https://github.com/HarbourMasters/Shipwright/issues/2796 // Draw is now enabled but SetFlower hasn't run yet (it waits for ground contact). Default flowerPos to the // actor's spawn position so the flower doesn't render at the origin for the intervening frames. this->flowerPos = this->actor.world.pos; From 96662c0d5b64f09e298f818d3f2bd7127387d8fe Mon Sep 17 00:00:00 2001 From: Unreference <87878910+unreference@users.noreply.github.com> Date: Thu, 14 May 2026 00:01:49 -0700 Subject: [PATCH 3/3] fix: Move flowerPos initialization to Init --- .../overlays/actors/ovl_En_Dnt_Nomal/z_en_dnt_nomal.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/soh/src/overlays/actors/ovl_En_Dnt_Nomal/z_en_dnt_nomal.c b/soh/src/overlays/actors/ovl_En_Dnt_Nomal/z_en_dnt_nomal.c index 2246b65beb6..831a298f17c 100644 --- a/soh/src/overlays/actors/ovl_En_Dnt_Nomal/z_en_dnt_nomal.c +++ b/soh/src/overlays/actors/ovl_En_Dnt_Nomal/z_en_dnt_nomal.c @@ -157,6 +157,11 @@ void EnDntNomal_Init(Actor* thisx, PlayState* play) { } else { Actor_Kill(&this->actor); } + + // https://github.com/HarbourMasters/Shipwright/issues/2796 + // Default flowerPos to the actor's spawn position so the flower doesn't render at the origin if the draw function + // is enabled before SetFlower position (which waits for ground contact) has a chance to set the real position. + this->flowerPos = this->actor.world.pos; this->actionFunc = EnDntNomal_WaitForObject; } @@ -190,10 +195,6 @@ void EnDntNomal_WaitForObject(EnDntNomal* this, PlayState* play) { this->actor.draw = EnDntNomal_DrawStageScrub; } - // https://github.com/HarbourMasters/Shipwright/issues/2796 - // Draw is now enabled but SetFlower hasn't run yet (it waits for ground contact). Default flowerPos to the - // actor's spawn position so the flower doesn't render at the origin for the intervening frames. - this->flowerPos = this->actor.world.pos; this->actionFunc = EnDntNomal_SetFlower; } }