summaryrefslogtreecommitdiff
path: root/soh/src
diff options
context:
space:
mode:
Diffstat (limited to 'soh/src')
-rw-r--r--soh/src/code/game.c13
-rw-r--r--soh/src/code/gfxprint.c2
-rw-r--r--soh/src/code/z_actor.c122
-rw-r--r--soh/src/code/z_fcurve_data_skelanime.c4
-rw-r--r--soh/src/code/z_message_PAL.c2
-rw-r--r--soh/src/code/z_player_lib.c40
-rw-r--r--soh/src/code/z_rcp.c8
-rw-r--r--soh/src/code/z_skelanime.c20
-rw-r--r--soh/src/overlays/actors/ovl_Boss_Dodongo/z_boss_dodongo.c17
-rw-r--r--soh/src/overlays/actors/ovl_Boss_Goma/z_boss_goma.c36
-rw-r--r--soh/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c4
-rw-r--r--soh/src/overlays/actors/ovl_En_Bili/z_en_bili.c2
-rw-r--r--soh/src/overlays/actors/ovl_En_Box/z_en_box.c4
-rw-r--r--soh/src/overlays/actors/ovl_En_Bw/z_en_bw.c4
-rw-r--r--soh/src/overlays/actors/ovl_En_Eiyer/z_en_eiyer.c4
-rw-r--r--soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c2
-rw-r--r--soh/src/overlays/actors/ovl_En_Firefly/z_en_firefly.c7
-rw-r--r--soh/src/overlays/actors/ovl_En_Fr/z_en_fr.c43
-rw-r--r--soh/src/overlays/actors/ovl_En_Partner/z_en_partner.c2
-rw-r--r--soh/src/overlays/actors/ovl_En_Po_Desert/z_en_po_desert.c2
-rw-r--r--soh/src/overlays/actors/ovl_En_Po_Field/z_en_po_field.c5
-rw-r--r--soh/src/overlays/actors/ovl_En_Po_Sisters/z_en_po_sisters.c8
-rw-r--r--soh/src/overlays/actors/ovl_En_Poh/z_en_poh.c4
-rw-r--r--soh/src/overlays/actors/ovl_En_Vali/z_en_vali.c2
-rw-r--r--soh/src/overlays/actors/ovl_En_Weiyer/z_en_weiyer.c6
-rw-r--r--soh/src/overlays/actors/ovl_En_Wood02/z_en_wood02.c14
-rw-r--r--soh/src/overlays/actors/ovl_En_Zf/z_en_zf.c4
-rw-r--r--soh/src/overlays/actors/ovl_Obj_Mure/z_obj_mure.c16
-rw-r--r--soh/src/overlays/actors/ovl_Obj_Mure2/z_obj_mure2.c24
-rw-r--r--soh/src/overlays/actors/ovl_player_actor/z_player.c7
-rw-r--r--soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c10
-rw-r--r--soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c4
32 files changed, 318 insertions, 124 deletions
diff --git a/soh/src/code/game.c b/soh/src/code/game.c
index f0988c7c3..e1974ed98 100644
--- a/soh/src/code/game.c
+++ b/soh/src/code/game.c
@@ -239,16 +239,15 @@ void GameState_ReqPadData(GameState* gameState) {
PadMgr_RequestPadData(&gPadMgr, &gameState->input[0], 1);
}
-// OTRTODO
-int fbTest = -1;
+// Framebuffer for the Link preview on the pause menu equipment sub-screen
+int gPauseLinkFrameBuffer = -1;
void GameState_Update(GameState* gameState) {
GraphicsContext* gfxCtx = gameState->gfxCtx;
- if (fbTest == -1)
- {
- fbTest = gfx_create_framebuffer(64, 112, SCREEN_WIDTH, SCREEN_HEIGHT, true);
- //fbTest = gfx_create_framebuffer(256, 512);
+ if (gPauseLinkFrameBuffer == -1) {
+ gPauseLinkFrameBuffer = gfx_create_framebuffer(PAUSE_EQUIP_PLAYER_WIDTH, PAUSE_EQUIP_PLAYER_HEIGHT,
+ PAUSE_EQUIP_PLAYER_WIDTH, PAUSE_EQUIP_PLAYER_HEIGHT, true);
}
GameState_SetFrameBuffer(gfxCtx);
@@ -467,7 +466,7 @@ void GameState_Destroy(GameState* gameState) {
// Performing clear skeletons before unload resources fixes an actor heap corruption crash due to the skeleton patching system.
ResourceMgr_ClearSkeletons();
- if (CVarGetInteger(CVAR_ALT_ASSETS, 0)) {
+ if (ResourceMgr_IsAltAssetsEnabled()) {
ResourceUnloadDirectory("alt/*");
gfx_texture_cache_clear();
}
diff --git a/soh/src/code/gfxprint.c b/soh/src/code/gfxprint.c
index 1717e46b3..6d8686074 100644
--- a/soh/src/code/gfxprint.c
+++ b/soh/src/code/gfxprint.c
@@ -141,7 +141,7 @@ static const ALIGN_ASSET(2) char rGfxPrintFontDataAlt[] = drGfxPrintFontDataAlt;
// https://github.com/HarbourMasters/Shipwright/issues/2762
typedef enum {hardcoded, otrDefault, otrAlt} font_texture_t;
font_texture_t GfxPrint_TextureToUse() {
- if (CVarGetInteger(CVAR_ALT_ASSETS, 0) && ResourceMgr_FileExists(rGfxPrintFontDataAlt)) {
+ if (ResourceMgr_IsAltAssetsEnabled() && ResourceMgr_FileExists(rGfxPrintFontDataAlt)) {
// If we have alt assets enabled, and we have alt prefixed font texture, use that
return otrAlt;
} else if (ResourceMgr_FileExists(rGfxPrintFontData)) {
diff --git a/soh/src/code/z_actor.c b/soh/src/code/z_actor.c
index 98e414d55..5b8aa1eca 100644
--- a/soh/src/code/z_actor.c
+++ b/soh/src/code/z_actor.c
@@ -1228,14 +1228,6 @@ void Actor_Init(Actor* actor, PlayState* play) {
actor->uncullZoneForward = 1000.0f;
actor->uncullZoneScale = 350.0f;
actor->uncullZoneDownward = 700.0f;
- if (CVarGetInteger(CVAR_ENHANCEMENT("DisableDrawDistance"), 0) != 0 && actor->id != ACTOR_EN_TORCH2 && actor->id != ACTOR_EN_BLKOBJ // Extra check for Dark Link and his room
- && actor->id != ACTOR_EN_HORSE // Check for Epona, else if we call her she will spawn at the other side of the map + we can hear her during the title screen sequence
- && actor->id != ACTOR_EN_HORSE_GANON && actor->id != ACTOR_EN_HORSE_ZELDA // check for Zelda's and Ganondorf's horses that will always be scene during cinematic whith camera paning
- && (play->sceneNum != SCENE_DODONGOS_CAVERN && actor->id != ACTOR_EN_ZF)) { // Check for DC and Lizalfos for the case where the miniboss music would still play under certains conditions and changing room
- actor->uncullZoneForward = 32767.0f;
- actor->uncullZoneScale = 32767.0f;
- actor->uncullZoneDownward = 32767.0f;
- }
CollisionCheck_InitInfo(&actor->colChkInfo);
actor->floorBgId = BGCHECK_SCENE;
ActorShape_Init(&actor->shape, 0.0f, NULL, 0.0f);
@@ -2897,33 +2889,92 @@ s32 func_800314B0(PlayState* play, Actor* actor) {
s32 func_800314D4(PlayState* play, Actor* actor, Vec3f* arg2, f32 arg3) {
f32 var;
- if (CVarGetInteger(CVAR_ENHANCEMENT("DisableDrawDistance"), 0) != 0 && actor->id != ACTOR_EN_TORCH2 && actor->id != ACTOR_EN_BLKOBJ // Extra check for Dark Link and his room
- && actor->id != ACTOR_EN_HORSE // Check for Epona, else if we call her she will spawn at the other side of the map + we can hear her during the title screen sequence
- && actor->id != ACTOR_EN_HORSE_GANON && actor->id != ACTOR_EN_HORSE_ZELDA // check for Zelda's and Ganondorf's horses that will always be scene during cinematic whith camera paning
- && (play->sceneNum != SCENE_DODONGOS_CAVERN && actor->id != ACTOR_EN_ZF)) { // Check for DC and Lizalfos for the case where the miniboss music would still play under certains conditions and changing room
+ if ((arg2->z > -actor->uncullZoneScale) && (arg2->z < (actor->uncullZoneForward + actor->uncullZoneScale))) {
+ var = (arg3 < 1.0f) ? 1.0f : 1.0f / arg3;
+
+ if ((((fabsf(arg2->x) - actor->uncullZoneScale) * var) < 1.0f) &&
+ (((arg2->y + actor->uncullZoneDownward) * var) > -1.0f) &&
+ (((arg2->y - actor->uncullZoneScale) * var) < 1.0f)) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+// #region SOH [Enhancements] Allows us to increase the draw and update distance independently,
+// mostly a modified version of the function above and additional tweaks for some specfic actors
+s32 Ship_CalcShouldDrawAndUpdate(PlayState* play, Actor* actor, Vec3f* projectedPos, f32 projectedW, bool* shouldDraw,
+ bool* shouldUpdate) {
+ f32 clampedProjectedW;
+
+ // Check if the actor passes its original/vanilla culling requirements
+ if (func_800314D4(play, actor, projectedPos, projectedW)) {
+ *shouldUpdate = true;
+ *shouldDraw = true;
return true;
}
- if ((arg2->z > -actor->uncullZoneScale) && (arg2->z < (actor->uncullZoneForward + actor->uncullZoneScale))) {
- var = (arg3 < 1.0f) ? 1.0f : 1.0f / arg3;
+ // Skip cutscne actors that depend on culling to hide from camera pans
+ if (actor->id == ACTOR_EN_VIEWER) {
+ return false;
+ }
- // #region SoH [Widescreen support]
- // Doors will cull quite noticeably on wider screens. For these actors the zone is increased
- f32 limit = 1.0f;
- if (((actor->id == ACTOR_EN_DOOR) || (actor->id == ACTOR_DOOR_SHUTTER)) && CVarGetInteger(CVAR_GENERAL("IncreaseDoorUncullZones"), 1)) {
- limit = 2.0f;
+ s32 multiplier = CVarGetInteger(CVAR_ENHANCEMENT("DisableDrawDistance"), 1);
+ multiplier = MAX(multiplier, 1);
+
+ // Some actors have a really short forward value, so we need to add to it before the multiplier to increase the
+ // final strength of the forward culling
+ f32 adder = (actor->uncullZoneForward < 500) ? 1000.0f : 0.0f;
+
+ if ((projectedPos->z > -actor->uncullZoneScale) &&
+ (projectedPos->z < (((actor->uncullZoneForward + adder) * multiplier) + actor->uncullZoneScale))) {
+ clampedProjectedW = (projectedW < 1.0f) ? 1.0f : 1.0f / projectedW;
+
+ f32 ratioAdjusted = 1.0f;
+
+ if (CVarGetInteger(CVAR_ENHANCEMENT("WidescreenActorCulling"), 0)) {
+ f32 originalAspectRatio = 4.0f / 3.0f;
+ f32 currentAspectRatio = OTRGetAspectRatio();
+ ratioAdjusted = MAX(currentAspectRatio / originalAspectRatio, 1.0f);
}
- if ((((fabsf(arg2->x) - actor->uncullZoneScale) * var) < limit) &&
- (((arg2->y + actor->uncullZoneDownward) * var) > -limit) &&
- (((arg2->y - actor->uncullZoneScale) * var) < limit)) {
+ if ((((fabsf(projectedPos->x) - actor->uncullZoneScale) * (clampedProjectedW / ratioAdjusted)) < 1.0f) &&
+ (((projectedPos->y + actor->uncullZoneDownward) * clampedProjectedW) > -1.0f) &&
+ (((projectedPos->y - actor->uncullZoneScale) * clampedProjectedW) < 1.0f)) {
+
+ if (CVarGetInteger(CVAR_ENHANCEMENT("ExtendedCullingExcludeGlitchActors"), 0)) {
+ // These actors are safe to draw without impacting glitches
+ if ((actor->id == ACTOR_OBJ_BOMBIWA || actor->id == ACTOR_OBJ_HAMISHI ||
+ actor->id == ACTOR_EN_ISHI) || // Boulders (hookshot through collision)
+ actor->id == ACTOR_EN_GS || // Gossip stones (text delay)
+ actor->id == ACTOR_EN_GE1 || // White gerudos (gate clip/archery room transition)
+ actor->id == ACTOR_EN_KZ || // King Zora (unfreeze glitch)
+ actor->id == ACTOR_EN_DU || // Darunia (Fire temple BK skip)
+ actor->id == ACTOR_DOOR_WARP1 // Blue warps (wrong warps)
+ ) {
+ *shouldDraw = true;
+ return true;
+ }
+
+ // Skip these actors entirely as their draw funcs impacts glitches
+ if ((actor->id == ACTOR_EN_SW &&
+ (((actor->params & 0xE000) >> 0xD) == 1 ||
+ ((actor->params & 0xE000) >> 0xD) == 2)) // Gold Skulltulas (hitbox at 0,0)
+ ) {
+ return false;
+ }
+ }
+
+ *shouldDraw = true;
+ *shouldUpdate = true;
return true;
}
- // #endregion
}
return false;
}
+// #endregion
void func_800315AC(PlayState* play, ActorContext* actorCtx) {
s32 invisibleActorCounter;
@@ -2960,18 +3011,35 @@ void func_800315AC(PlayState* play, ActorContext* actorCtx) {
}
}
+ // #region SOH [Enhancement] Extended culling updates
+ bool shipShouldDraw = false;
+ bool shipShouldUpdate = false;
if ((HREG(64) != 1) || ((HREG(65) != -1) && (HREG(65) != HREG(66))) || (HREG(70) == 0)) {
- if (func_800314B0(play, actor)) {
- actor->flags |= ACTOR_FLAG_ACTIVE;
+ if (CVarGetInteger(CVAR_ENHANCEMENT("DisableDrawDistance"), 1) > 1 ||
+ CVarGetInteger(CVAR_ENHANCEMENT("WidescreenActorCulling"), 0)) {
+ Ship_CalcShouldDrawAndUpdate(play, actor, &actor->projectedPos, actor->projectedW, &shipShouldDraw,
+ &shipShouldUpdate);
+
+ if (shipShouldUpdate) {
+ actor->flags |= ACTOR_FLAG_ACTIVE;
+ } else {
+ actor->flags &= ~ACTOR_FLAG_ACTIVE;
+ }
} else {
- actor->flags &= ~ACTOR_FLAG_ACTIVE;
+ if (func_800314B0(play, actor)) {
+ actor->flags |= ACTOR_FLAG_ACTIVE;
+ } else {
+ actor->flags &= ~ACTOR_FLAG_ACTIVE;
+ }
}
}
actor->isDrawn = false;
if ((HREG(64) != 1) || ((HREG(65) != -1) && (HREG(65) != HREG(66))) || (HREG(71) == 0)) {
- if ((actor->init == NULL) && (actor->draw != NULL) && (actor->flags & (ACTOR_FLAG_DRAW_WHILE_CULLED | ACTOR_FLAG_ACTIVE))) {
+ if ((actor->init == NULL) && (actor->draw != NULL) &&
+ ((actor->flags & (ACTOR_FLAG_DRAW_WHILE_CULLED | ACTOR_FLAG_ACTIVE)) || shipShouldDraw)) {
+ // #endregion
if ((actor->flags & ACTOR_FLAG_LENS) &&
((play->roomCtx.curRoom.lensMode == LENS_MODE_HIDE_ACTORS) ||
play->actorCtx.lensActive || (actor->room != play->roomCtx.curRoom.num))) {
diff --git a/soh/src/code/z_fcurve_data_skelanime.c b/soh/src/code/z_fcurve_data_skelanime.c
index 91b6dc90c..c75450be2 100644
--- a/soh/src/code/z_fcurve_data_skelanime.c
+++ b/soh/src/code/z_fcurve_data_skelanime.c
@@ -131,10 +131,6 @@ void SkelCurve_DrawLimb(PlayState* play, s32 limbIndex, SkelAnimeCurve* skelCurv
Matrix_TranslateRotateZYX(&pos, &rot);
Matrix_Scale(scale.x, scale.y, scale.z, MTXMODE_APPLY);
- if (CVarGetInteger(CVAR_ENHANCEMENT("DisableLOD"), 0)) {
- lod = 0;
- }
-
if (lod == 0) {
s32 pad1;
diff --git a/soh/src/code/z_message_PAL.c b/soh/src/code/z_message_PAL.c
index 4847bb47e..8da747dd5 100644
--- a/soh/src/code/z_message_PAL.c
+++ b/soh/src/code/z_message_PAL.c
@@ -1116,7 +1116,7 @@ void Message_DrawText(PlayState* play, Gfx** gfxP) {
}
}
if (msgCtx->textDelayTimer == 0) {
- msgCtx->textDrawPos = i + CVarGetInteger(CVAR_ENHANCEMENT("TextSpeed"), 2);
+ msgCtx->textDrawPos = i + CVarGetInteger(CVAR_ENHANCEMENT("TextSpeed"), 1);
msgCtx->textDelayTimer = msgCtx->textDelay;
} else {
msgCtx->textDelayTimer--;
diff --git a/soh/src/code/z_player_lib.c b/soh/src/code/z_player_lib.c
index f5c529a66..94538c229 100644
--- a/soh/src/code/z_player_lib.c
+++ b/soh/src/code/z_player_lib.c
@@ -2079,10 +2079,12 @@ void Pause_DrawTriforceSpot(PlayState* play, s32 showLightColumn) {
rotation += 0x03E8;
}
-void Player_DrawPauseImpl(PlayState* play, void* seg04, void* seg06, SkelAnime* skelAnime, Vec3f* pos, Vec3s* rot,
- f32 scale, s32 sword, s32 tunic, s32 shield, s32 boots, s32 width, s32 height, Vec3f* eye, Vec3f* at,
- f32 fovy, void* img1, void* img2) {
- static Vp viewport = { 128, 224, 511, 0, 128, 224, 511, 0 };
+void Player_DrawPauseImpl(PlayState* play, void* gameplayKeep, void* linkObject, SkelAnime* skelAnime, Vec3f* pos,
+ Vec3s* rot, f32 scale, s32 sword, s32 tunic, s32 shield, s32 boots, s32 width, s32 height,
+ Vec3f* eye, Vec3f* at, f32 fovy, void* colorFrameBuffer, void* depthFrameBuffer) {
+ // Note: the viewport x and y values are overwritten below, before usage
+ static Vp viewport = { (PAUSE_EQUIP_PLAYER_WIDTH / 2) << 2, (PAUSE_EQUIP_PLAYER_HEIGHT / 2) << 2, G_MAXZ / 2, 0,
+ (PAUSE_EQUIP_PLAYER_WIDTH / 2) << 2, (PAUSE_EQUIP_PLAYER_HEIGHT / 2) << 2, G_MAXZ / 2, 0 };
static Lights1 lights1 = gdSPDefLights1(80, 80, 80, 255, 255, 255, 84, 84, 172);
static Vec3f lightDir = { 89.8f, 0.0f, 89.8f };
u8 playerSwordAndShield[2];
@@ -2110,6 +2112,24 @@ void Player_DrawPauseImpl(PlayState* play, void* seg04, void* seg06, SkelAnime*
gDPSetScissor(POLY_OPA_DISP++, G_SC_NON_INTERLACE, 0, 0, width, height);
gSPClipRatio(POLY_OPA_DISP++, FRUSTRATIO_1);
+ gDPSetColorImage(POLY_OPA_DISP++, G_IM_FMT_RGBA, G_IM_SIZ_16b, width, depthFrameBuffer);
+ gDPSetCycleType(POLY_OPA_DISP++, G_CYC_FILL);
+ gDPSetRenderMode(POLY_OPA_DISP++, G_RM_NOOP, G_RM_NOOP2);
+ gDPSetFillColor(POLY_OPA_DISP++, (GPACK_ZDZ(G_MAXFBZ, 0) << 16) | GPACK_ZDZ(G_MAXFBZ, 0));
+ gDPFillRectangle(POLY_OPA_DISP++, 0, 0, width - 1, height - 1);
+
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ gDPSetColorImage(POLY_OPA_DISP++, G_IM_FMT_RGBA, G_IM_SIZ_16b, width, colorFrameBuffer);
+ gDPSetCycleType(POLY_OPA_DISP++, G_CYC_FILL);
+ gDPSetRenderMode(POLY_OPA_DISP++, G_RM_NOOP, G_RM_NOOP2);
+ gDPSetFillColor(POLY_OPA_DISP++, (GPACK_RGBA5551(0, 0, 0, 1) << 16) | GPACK_RGBA5551(0, 0, 0, 1));
+ gDPFillRectangle(POLY_OPA_DISP++, 0, 0, width - 1, height - 1);
+
+ gDPPipeSync(POLY_OPA_DISP++);
+
+ gDPSetDepthImage(POLY_OPA_DISP++, depthFrameBuffer);
+
viewport.vp.vscale[0] = viewport.vp.vtrans[0] = width * 2;
viewport.vp.vscale[1] = viewport.vp.vtrans[1] = height * 2;
gSPViewport(POLY_OPA_DISP++, &viewport);
@@ -2130,8 +2150,8 @@ void Player_DrawPauseImpl(PlayState* play, void* seg04, void* seg06, SkelAnime*
pos->y - (CVarGetInteger(CVAR_GENERAL("PauseTriforce"), 0) ? 16 : 0), pos->z, rot);
Matrix_Scale(scale * (CVarGetInteger(CVAR_ENHANCEMENT("MirroredWorld"), 0) ? -1 : 1), scale, scale, MTXMODE_APPLY);
- gSPSegment(POLY_OPA_DISP++, 0x04, seg04);
- gSPSegment(POLY_OPA_DISP++, 0x06, seg06);
+ gSPSegment(POLY_OPA_DISP++, 0x04, gameplayKeep);
+ gSPSegment(POLY_OPA_DISP++, 0x06, linkObject);
gSPSetLights1(POLY_OPA_DISP++, lights1);
@@ -2399,14 +2419,16 @@ void Player_DrawPause(PlayState* play, u8* segment, SkelAnime* skelAnime, Vec3f*
}
srcTable = ResourceMgr_LoadArrayByNameAsVec3s(srcTable);
+ Vec3s* ogSrcTable = srcTable;
destTable = skelAnime->jointTable;
for (i = 0; i < skelAnime->limbCount; i++) {
*destTable++ = *srcTable++;
}
+ free(ogSrcTable);
}
-
Player_DrawPauseImpl(play, segment + 0x3800, segment + 0x8800, skelAnime, pos, rot, scale, sword, tunic, shield,
- boots, 64, 112, &eye, &at, 60.0f, play->state.gfxCtx->curFrameBuffer,
- play->state.gfxCtx->curFrameBuffer + 0x1C00);
+ boots, PAUSE_EQUIP_PLAYER_WIDTH, PAUSE_EQUIP_PLAYER_HEIGHT, &eye, &at, 60.0f,
+ play->state.gfxCtx->curFrameBuffer,
+ play->state.gfxCtx->curFrameBuffer + (PAUSE_EQUIP_PLAYER_WIDTH * PAUSE_EQUIP_PLAYER_HEIGHT));
}
diff --git a/soh/src/code/z_rcp.c b/soh/src/code/z_rcp.c
index adfa946e7..978c04d3c 100644
--- a/soh/src/code/z_rcp.c
+++ b/soh/src/code/z_rcp.c
@@ -1539,7 +1539,7 @@ void Gfx_SetupFrame(GraphicsContext* gfxCtx, u8 r, u8 g, u8 b) {
gDPSetCycleType(POLY_OPA_DISP++, G_CYC_FILL);
gDPSetRenderMode(POLY_OPA_DISP++, G_RM_NOOP, G_RM_NOOP2);
gDPSetFillColor(POLY_OPA_DISP++, (GPACK_ZDZ(G_MAXFBZ, 0) << 16) | GPACK_ZDZ(G_MAXFBZ, 0));
- gDPFillRectangle(POLY_OPA_DISP++, 0, letterboxSize, gScreenWidth - 1, gScreenHeight - letterboxSize - 1);
+ gDPFillWideRectangle(POLY_OPA_DISP++, OTRGetRectDimensionFromLeftEdge(0), letterboxSize, OTRGetRectDimensionFromRightEdge(gScreenWidth - 1), gScreenHeight - letterboxSize - 1);
gDPPipeSync(POLY_OPA_DISP++);
// Fill the whole screen with the base color
@@ -1548,7 +1548,7 @@ void Gfx_SetupFrame(GraphicsContext* gfxCtx, u8 r, u8 g, u8 b) {
gDPSetCycleType(POLY_OPA_DISP++, G_CYC_FILL);
gDPSetRenderMode(POLY_OPA_DISP++, G_RM_NOOP, G_RM_NOOP2);
gDPSetFillColor(POLY_OPA_DISP++, (GPACK_RGBA5551(r, g, b, 1) << 16) | GPACK_RGBA5551(r, g, b, 1));
- gDPFillRectangle(POLY_OPA_DISP++, 0, letterboxSize, gScreenWidth - 1, gScreenHeight - letterboxSize - 1);
+ gDPFillWideRectangle(POLY_OPA_DISP++, OTRGetRectDimensionFromLeftEdge(0), letterboxSize, OTRGetRectDimensionFromRightEdge(gScreenWidth - 1), gScreenHeight - letterboxSize - 1);
gDPPipeSync(POLY_OPA_DISP++);
// Draw the letterbox if applicable (uses the same color as the screen base)
@@ -1557,8 +1557,8 @@ void Gfx_SetupFrame(GraphicsContext* gfxCtx, u8 r, u8 g, u8 b) {
gDPSetCycleType(OVERLAY_DISP++, G_CYC_FILL);
gDPSetRenderMode(OVERLAY_DISP++, G_RM_NOOP, G_RM_NOOP2);
gDPSetFillColor(OVERLAY_DISP++, (GPACK_RGBA5551(r, g, b, 1) << 16) | GPACK_RGBA5551(r, g, b, 1));
- gDPFillRectangle(OVERLAY_DISP++, 0, 0, gScreenWidth - 1, letterboxSize - 1);
- gDPFillRectangle(OVERLAY_DISP++, 0, gScreenHeight - letterboxSize, gScreenWidth - 1, gScreenHeight - 1);
+ gDPFillWideRectangle(OVERLAY_DISP++, OTRGetRectDimensionFromLeftEdge(0), 0, OTRGetRectDimensionFromRightEdge(gScreenWidth - 1), letterboxSize - 1);
+ gDPFillWideRectangle(OVERLAY_DISP++, OTRGetRectDimensionFromLeftEdge(0), gScreenHeight - letterboxSize, OTRGetRectDimensionFromRightEdge(gScreenWidth - 1), gScreenHeight - 1);
gDPPipeSync(OVERLAY_DISP++);
}
}
diff --git a/soh/src/code/z_skelanime.c b/soh/src/code/z_skelanime.c
index 3df8a26a5..0bcf39236 100644
--- a/soh/src/code/z_skelanime.c
+++ b/soh/src/code/z_skelanime.c
@@ -148,6 +148,8 @@ void SkelAnime_DrawFlexLimbLod(PlayState* play, s32 limbIndex, void** skeleton,
newDList = limbDList = limb->dLists[lod];
+ play->flexLimbOverrideMTX = mtx;
+
if ((overrideLimbDraw == NULL) || !overrideLimbDraw(play, limbIndex, &newDList, &pos, &rot, arg)) {
Matrix_TranslateRotateZYX(&pos, &rot);
if (newDList != NULL) {
@@ -220,6 +222,8 @@ void SkelAnime_DrawFlexLod(PlayState* play, void** skeleton, Vec3s* jointTable,
newDList = limbDList = rootLimb->dLists[lod];
+ play->flexLimbOverrideMTX = &mtx;
+
if ((overrideLimbDraw == 0) || !overrideLimbDraw(play, 1, &newDList, &pos, &rot, arg)) {
Matrix_TranslateRotateZYX(&pos, &rot);
if (newDList != NULL) {
@@ -306,6 +310,20 @@ void SkelAnime_DrawSkeletonOpa(PlayState* play, SkelAnime* skelAnime, OverrideLi
}
}
+Gfx* SkelAnime_DrawSkeleton2(PlayState* play, SkelAnime* skelAnime, OverrideLimbDrawOpa overrideLimbDraw,
+ PostLimbDrawOpa postLimbDraw, void* arg, Gfx* gfx)
+{
+ if (skelAnime->skeletonHeader->skeletonType == SKELANIME_TYPE_NORMAL) {
+ return SkelAnime_Draw(play, skelAnime->skeleton, skelAnime->jointTable, overrideLimbDraw, postLimbDraw, arg, gfx);
+ } else if (skelAnime->skeletonHeader->skeletonType == SKELANIME_TYPE_FLEX) {
+ FlexSkeletonHeader* flexHeader = (FlexSkeletonHeader*)skelAnime->skeletonHeader;
+ return SkelAnime_DrawFlex(play, skelAnime->skeleton, skelAnime->jointTable, flexHeader->dListCount,
+ overrideLimbDraw, postLimbDraw, arg, gfx);
+ }
+
+ return gfx;
+}
+
/**
* Draw all limbs of type `StandardLimb` in a given skeleton to the polyOpa buffer
*/
@@ -383,6 +401,8 @@ void SkelAnime_DrawFlexLimbOpa(PlayState* play, s32 limbIndex, void** skeleton,
newDList = limbDList = limb->dList;
+ play->flexLimbOverrideMTX = limbMatricies;
+
if ((overrideLimbDraw == NULL) || !overrideLimbDraw(play, limbIndex, &newDList, &pos, &rot, arg)) {
Matrix_TranslateRotateZYX(&pos, &rot);
if (newDList != NULL) {
diff --git a/soh/src/overlays/actors/ovl_Boss_Dodongo/z_boss_dodongo.c b/soh/src/overlays/actors/ovl_Boss_Dodongo/z_boss_dodongo.c
index a825f67d7..d3f279575 100644
--- a/soh/src/overlays/actors/ovl_Boss_Dodongo/z_boss_dodongo.c
+++ b/soh/src/overlays/actors/ovl_Boss_Dodongo/z_boss_dodongo.c
@@ -1288,6 +1288,10 @@ block_1:
if (*dList != NULL) {
OPEN_DISPS(play->state.gfxCtx);
+ if (this->skelAnime.skeletonHeader->skeletonType == SKELANIME_TYPE_FLEX) {
+ MATRIX_TOMTX(*play->flexLimbOverrideMTX);
+ }
+
mtxScaleZ = 1.0f;
mtxScaleY = 1.0f;
@@ -1308,11 +1312,20 @@ block_1:
Matrix_RotateX(-(this->unk_25C[limbIndex] * 0.115f), MTXMODE_APPLY);
}
- gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx),
- G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ if (this->skelAnime.skeletonHeader->skeletonType == SKELANIME_TYPE_FLEX) {
+ gSPMatrix(POLY_OPA_DISP++, *play->flexLimbOverrideMTX, G_MTX_LOAD);
+ } else {
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx),
+ G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ }
+
gSPDisplayList(POLY_OPA_DISP++, *dList);
Matrix_Pop();
+ if (this->skelAnime.skeletonHeader->skeletonType == SKELANIME_TYPE_FLEX) {
+ (*play->flexLimbOverrideMTX)++;
+ }
+
CLOSE_DISPS(play->state.gfxCtx);
}
{ s32 pad; } // Required to match
diff --git a/soh/src/overlays/actors/ovl_Boss_Goma/z_boss_goma.c b/soh/src/overlays/actors/ovl_Boss_Goma/z_boss_goma.c
index e05b73650..842ec0fab 100644
--- a/soh/src/overlays/actors/ovl_Boss_Goma/z_boss_goma.c
+++ b/soh/src/overlays/actors/ovl_Boss_Goma/z_boss_goma.c
@@ -2015,12 +2015,26 @@ s32 BossGoma_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f
Matrix_TranslateRotateZYX(pos, rot);
if (*dList != NULL) {
+ if (this->skelanime.skeletonHeader->skeletonType == SKELANIME_TYPE_FLEX) {
+ MATRIX_TOMTX(*play->flexLimbOverrideMTX);
+ }
+
Matrix_Push();
Matrix_Scale(this->eyeIrisScaleX, this->eyeIrisScaleY, 1.0f, MTXMODE_APPLY);
- gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx),
- G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ if (this->skelanime.skeletonHeader->skeletonType == SKELANIME_TYPE_FLEX) {
+ gSPMatrix(POLY_OPA_DISP++, *play->flexLimbOverrideMTX, G_MTX_LOAD);
+ } else {
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx),
+ G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ }
+
gSPDisplayList(POLY_OPA_DISP++, *dList);
Matrix_Pop();
+
+ if (this->skelanime.skeletonHeader->skeletonType == SKELANIME_TYPE_FLEX) {
+ (*play->flexLimbOverrideMTX)++;
+ }
}
doNotDrawLimb = true;
@@ -2034,14 +2048,28 @@ s32 BossGoma_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f
Matrix_TranslateRotateZYX(pos, rot);
if (*dList != NULL) {
+ if (this->skelanime.skeletonHeader->skeletonType == SKELANIME_TYPE_FLEX) {
+ MATRIX_TOMTX(*play->flexLimbOverrideMTX);
+ }
+
Matrix_Push();
Matrix_Scale(this->tailLimbsScale[limbIndex - BOSSGOMA_LIMB_TAIL4],
this->tailLimbsScale[limbIndex - BOSSGOMA_LIMB_TAIL4],
this->tailLimbsScale[limbIndex - BOSSGOMA_LIMB_TAIL4], MTXMODE_APPLY);
- gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx),
- G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ if (this->skelanime.skeletonHeader->skeletonType == SKELANIME_TYPE_FLEX) {
+ gSPMatrix(POLY_OPA_DISP++, *play->flexLimbOverrideMTX, G_MTX_LOAD);
+ } else {
+ gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx),
+ G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ }
+
gSPDisplayList(POLY_OPA_DISP++, *dList);
Matrix_Pop();
+
+ if (this->skelanime.skeletonHeader->skeletonType == SKELANIME_TYPE_FLEX) {
+ (*play->flexLimbOverrideMTX)++;
+ }
}
doNotDrawLimb = true;
diff --git a/soh/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c b/soh/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c
index ff55bf65f..00509500f 100644
--- a/soh/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c
+++ b/soh/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c
@@ -961,7 +961,7 @@ void DoorWarp1_DrawBlueCrystal(DoorWarp1* this, PlayState* play) {
gDPSetPrimColor(POLY_XLU_DISP++, 0xFF, 0xFF, 200, 255, 255, (u8)this->crystalAlpha);
gDPSetEnvColor(POLY_XLU_DISP++, 0, 100, 255, (u8)this->crystalAlpha);
- POLY_XLU_DISP = SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable, NULL, NULL,
+ POLY_XLU_DISP = SkelAnime_DrawSkeleton2(play, &this->skelAnime, NULL, NULL,
&this->actor, POLY_XLU_DISP);
CLOSE_DISPS(play->state.gfxCtx);
@@ -985,7 +985,7 @@ void DoorWarp1_DrawPurpleCrystal(DoorWarp1* this, PlayState* play) {
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, (u8)this->crystalAlpha);
gDPSetEnvColor(POLY_XLU_DISP++, 150, 0, 100, (u8)this->crystalAlpha);
- POLY_XLU_DISP = SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable, NULL, NULL,
+ POLY_XLU_DISP = SkelAnime_DrawSkeleton2(play, &this->skelAnime, NULL, NULL,
&this->actor, POLY_XLU_DISP);
CLOSE_DISPS(play->state.gfxCtx);
diff --git a/soh/src/overlays/actors/ovl_En_Bili/z_en_bili.c b/soh/src/overlays/actors/ovl_En_Bili/z_en_bili.c
index 74f89cbe3..a50dabe01 100644
--- a/soh/src/overlays/actors/ovl_En_Bili/z_en_bili.c
+++ b/soh/src/overlays/actors/ovl_En_Bili/z_en_bili.c
@@ -768,7 +768,7 @@ void EnBili_Draw(Actor* thisx, PlayState* play) {
gSPSegment(POLY_XLU_DISP++, 0x09, D_809C1700);
}
- POLY_XLU_DISP = SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
+ POLY_XLU_DISP = SkelAnime_DrawSkeleton2(play, &this->skelAnime,
EnBili_OverrideLimbDraw, NULL, this, POLY_XLU_DISP);
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/soh/src/overlays/actors/ovl_En_Box/z_en_box.c b/soh/src/overlays/actors/ovl_En_Box/z_en_box.c
index 29eb6dc94..41234d54f 100644
--- a/soh/src/overlays/actors/ovl_En_Box/z_en_box.c
+++ b/soh/src/overlays/actors/ovl_En_Box/z_en_box.c
@@ -895,7 +895,7 @@ void EnBox_Draw(Actor* thisx, PlayState* play) {
gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255);
gSPSegment(POLY_OPA_DISP++, 0x08, EnBox_EmptyDList(play->state.gfxCtx));
Gfx_SetupDL_25Opa(play->state.gfxCtx);
- POLY_OPA_DISP = SkelAnime_Draw(play, this->skelanime.skeleton, this->skelanime.jointTable, NULL,
+ POLY_OPA_DISP = SkelAnime_DrawSkeleton2(play, &this->skelanime, NULL,
EnBox_PostLimbDraw, this, POLY_OPA_DISP);
} else if (this->alpha != 0) {
gDPPipeSync(POLY_XLU_DISP++);
@@ -906,7 +906,7 @@ void EnBox_Draw(Actor* thisx, PlayState* play) {
} else {
gSPSegment(POLY_XLU_DISP++, 0x08, func_809CA4A0(play->state.gfxCtx));
}
- POLY_XLU_DISP = SkelAnime_Draw(play, this->skelanime.skeleton, this->skelanime.jointTable, NULL,
+ POLY_XLU_DISP = SkelAnime_DrawSkeleton2(play, &this->skelanime, NULL,
EnBox_PostLimbDraw, this, POLY_XLU_DISP);
}
diff --git a/soh/src/overlays/actors/ovl_En_Bw/z_en_bw.c b/soh/src/overlays/actors/ovl_En_Bw/z_en_bw.c
index 2a6fdb4fd..501c7ec9e 100644
--- a/soh/src/overlays/actors/ovl_En_Bw/z_en_bw.c
+++ b/soh/src/overlays/actors/ovl_En_Bw/z_en_bw.c
@@ -856,7 +856,7 @@ void EnBw_Draw(Actor* thisx, PlayState* play2) {
Gfx_SetupDL_25Opa(play->state.gfxCtx);
gDPSetEnvColor(POLY_OPA_DISP++, this->color1.r, this->color1.g, this->color1.b, this->color1.a);
gSPSegment(POLY_OPA_DISP++, 0x08, &D_80116280[2]);
- POLY_OPA_DISP = SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
+ POLY_OPA_DISP = SkelAnime_DrawSkeleton2(play, &this->skelAnime,
EnBw_OverrideLimbDraw, NULL, this, POLY_OPA_DISP);
} else {
Gfx_SetupDL_25Xlu(play->state.gfxCtx);
@@ -864,7 +864,7 @@ void EnBw_Draw(Actor* thisx, PlayState* play2) {
gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, 0, 0, 0, this->color1.a);
gDPSetEnvColor(POLY_XLU_DISP++, this->color1.r, this->color1.g, this->color1.b, this->color1.a);
gSPSegment(POLY_XLU_DISP++, 0x08, &D_80116280[0]);
- POLY_XLU_DISP = SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
+ POLY_XLU_DISP = SkelAnime_DrawSkeleton2(play, &this->skelAnime,
EnBw_OverrideLimbDraw, NULL, this, POLY_XLU_DISP);
}
diff --git a/soh/src/overlays/actors/ovl_En_Eiyer/z_en_eiyer.c b/soh/src/overlays/actors/ovl_En_Eiyer/z_en_eiyer.c
index 049570716..7340d9cf5 100644
--- a/soh/src/overlays/actors/ovl_En_Eiyer/z_en_eiyer.c
+++ b/soh/src/overlays/actors/ovl_En_Eiyer/z_en_eiyer.c
@@ -708,14 +708,14 @@ void EnEiyer_Draw(Actor* thisx, PlayState* play) {
gSPSegment(POLY_OPA_DISP++, 0x08, &D_80116280[2]);
gDPSetEnvColor(POLY_OPA_DISP++, 255, 255, 255, 255);
- POLY_OPA_DISP = SkelAnime_Draw(play, this->skelanime.skeleton, this->skelanime.jointTable,
+ POLY_OPA_DISP = SkelAnime_DrawSkeleton2(play, &this->skelanime,
EnEiyer_OverrideLimbDraw, NULL, this, POLY_OPA_DISP);
} else {
Gfx_SetupDL_25Xlu(play->state.gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x08, D_80116280);
gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 255, this->actor.shape.shadowAlpha);
- POLY_XLU_DISP = SkelAnime_Draw(play, this->skelanime.skeleton, this->skelanime.jointTable,
+ POLY_XLU_DISP = SkelAnime_DrawSkeleton2(play, &this->skelanime,
EnEiyer_OverrideLimbDraw, NULL, this, POLY_XLU_DISP);
}
CLOSE_DISPS(play->state.gfxCtx);
diff --git a/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c b/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c
index 2c1bd0983..f6f82f5c7 100644
--- a/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c
+++ b/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c
@@ -1540,7 +1540,7 @@ void EnElf_Draw(Actor* thisx, PlayState* play) {
gSPEndDisplayList(dListHead++);
gDPSetEnvColor(POLY_XLU_DISP++, (u8)this->outerColor.r, (u8)this->outerColor.g, (u8)this->outerColor.b,
(u8)(envAlpha * alphaScale));
- POLY_XLU_DISP = SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
+ POLY_XLU_DISP = SkelAnime_DrawSkeleton2(play, &this->skelAnime,
EnElf_OverrideLimbDraw, NULL, this, POLY_XLU_DISP);
CLOSE_DISPS(play->state.gfxCtx);
diff --git a/soh/src/overlays/actors/ovl_En_Firefly/z_en_firefly.c b/soh/src/overlays/actors/ovl_En_Firefly/z_en_firefly.c
index 6c8afb6d7..7797cba9c 100644
--- a/soh/src/overlays/actors/ovl_En_Firefly/z_en_firefly.c
+++ b/soh/src/overlays/actors/ovl_En_Firefly/z_en_firefly.c
@@ -839,8 +839,9 @@ void EnFirefly_Draw(Actor* thisx, PlayState* play) {
gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255);
}
- POLY_OPA_DISP = SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
- EnFirefly_OverrideLimbDraw, EnFirefly_PostLimbDraw, &this->actor, POLY_OPA_DISP);
+ POLY_OPA_DISP = SkelAnime_DrawSkeleton2(play, &this->skelAnime, EnFirefly_OverrideLimbDraw, EnFirefly_PostLimbDraw,
+ &this->actor, POLY_OPA_DISP);
+
CLOSE_DISPS(play->state.gfxCtx);
}
@@ -856,7 +857,7 @@ void EnFirefly_DrawInvisible(Actor* thisx, PlayState* play) {
gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 0, 255);
}
- POLY_XLU_DISP = SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
+ POLY_XLU_DISP = SkelAnime_DrawSkeleton2(play, &this->skelAnime,
EnFirefly_OverrideLimbDraw, EnFirefly_PostLimbDraw, this, POLY_XLU_DISP);
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/soh/src/overlays/actors/ovl_En_Fr/z_en_fr.c b/soh/src/overlays/actors/ovl_En_Fr/z_en_fr.c
index 8af56cd79..4d41bb1f8 100644
--- a/soh/src/overlays/actors/ovl_En_Fr/z_en_fr.c
+++ b/soh/src/overlays/actors/ovl_En_Fr/z_en_fr.c
@@ -817,12 +817,28 @@ void EnFr_SetupFrogSong(EnFr* this, PlayState* play) {
if (this->frogSongTimer != 0) {
this->frogSongTimer--;
} else {
- this->frogSongTimer = 40;
- this->ocarinaNoteIndex = 0;
- func_8010BD58(play, OCARINA_ACTION_FROGS);
- this->ocarinaNote = EnFr_GetNextNoteFrogSong(this->ocarinaNoteIndex);
- EnFr_CheckOcarinaInputFrogSong(this->ocarinaNote);
- this->actionFunc = EnFr_ContinueFrogSong;
+ // #region SOH [Enhancement]
+ if (CVarGetInteger(CVAR_ENHANCEMENT("CustomizeFrogsOcarinaGame"), 0)) {
+ this->frogSongTimer = 40 * CVarGetInteger(CVAR_ENHANCEMENT("FrogsModifyFailTime"), 1);
+ if (CVarGetInteger(CVAR_ENHANCEMENT("InstantFrogsGameWin"), 0)) {
+ this->actor.textId = 0x40AC;
+ EnFr_SetupReward(this, play, false);
+ } else {
+ this->ocarinaNoteIndex = 0;
+ func_8010BD58(play, OCARINA_ACTION_FROGS);
+ this->ocarinaNote = EnFr_GetNextNoteFrogSong(this->ocarinaNoteIndex);
+ EnFr_CheckOcarinaInputFrogSong(this->ocarinaNote);
+ this->actionFunc = EnFr_ContinueFrogSong;
+ }
+ // #endregion
+ } else {
+ this->frogSongTimer = 40;
+ this->ocarinaNoteIndex = 0;
+ func_8010BD58(play, OCARINA_ACTION_FROGS);
+ this->ocarinaNote = EnFr_GetNextNoteFrogSong(this->ocarinaNoteIndex);
+ EnFr_CheckOcarinaInputFrogSong(this->ocarinaNote);
+ this->actionFunc = EnFr_ContinueFrogSong;
+ }
}
}
@@ -844,7 +860,13 @@ s32 EnFr_IsFrogSongComplete(EnFr* this, PlayState* play) {
ocarinaNote = EnFr_GetNextNoteFrogSong(ocarinaNoteIndex);
this->ocarinaNote = ocarinaNote;
EnFr_CheckOcarinaInputFrogSong(ocarinaNote);
- this->frogSongTimer = sTimerFrogSong[index];
+ // #region SOH [Enhancement]
+ if (CVarGetInteger(CVAR_ENHANCEMENT("CustomizeFrogsOcarinaGame"), 0)) {
+ this->frogSongTimer = sTimerFrogSong[index] * CVarGetInteger(CVAR_ENHANCEMENT("FrogsModifyFailTime"), 1);
+ // #endregion
+ } else {
+ this->frogSongTimer = sTimerFrogSong[index];
+ }
}
return false;
}
@@ -867,7 +889,12 @@ void EnFr_ContinueFrogSong(EnFr* this, PlayState* play) {
if (this->frogSongTimer == 0) {
EnFr_OcarinaMistake(this, play);
} else {
- this->frogSongTimer--;
+ // #region SOH [Enhancement] - Don't decrement timer
+ if (!CVarGetInteger(CVAR_ENHANCEMENT("CustomizeFrogsOcarinaGame"), 0) ||
+ !CVarGetInteger(CVAR_ENHANCEMENT("FrogsUnlimitedFailTime"), 0)) {
+ // #endregion
+ this->frogSongTimer--;
+ }
if (play->msgCtx.msgMode == MSGMODE_FROGS_PLAYING) {
counter = 0;
for (i = 0; i < ARRAY_COUNT(sEnFrPointers.frogs); i++) {
diff --git a/soh/src/overlays/actors/ovl_En_Partner/z_en_partner.c b/soh/src/overlays/actors/ovl_En_Partner/z_en_partner.c
index de7bddf82..0c30fcf17 100644
--- a/soh/src/overlays/actors/ovl_En_Partner/z_en_partner.c
+++ b/soh/src/overlays/actors/ovl_En_Partner/z_en_partner.c
@@ -880,7 +880,7 @@ void EnPartner_Draw(Actor* thisx, PlayState* play) {
gSPEndDisplayList(dListHead++);
gDPSetEnvColor(POLY_XLU_DISP++, (u8)this->outerColor.r, (u8)this->outerColor.g, (u8)this->outerColor.b,
(u8)(envAlpha * alphaScale));
- POLY_XLU_DISP = SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
+ POLY_XLU_DISP = SkelAnime_DrawSkeleton2(play, &this->skelAnime,
EnPartner_OverrideLimbDraw, NULL, this, POLY_XLU_DISP);
CLOSE_DISPS(play->state.gfxCtx);
diff --git a/soh/src/overlays/actors/ovl_En_Po_Desert/z_en_po_desert.c b/soh/src/overlays/actors/ovl_En_Po_Desert/z_en_po_desert.c
index 55155226b..2c00b284b 100644
--- a/soh/src/overlays/actors/ovl_En_Po_Desert/z_en_po_desert.c
+++ b/soh/src/overlays/actors/ovl_En_Po_Desert/z_en_po_desert.c
@@ -267,7 +267,7 @@ void EnPoDesert_Draw(Actor* thisx, PlayState* play) {
} else {
gSPSegment(POLY_XLU_DISP++, 0x0C, D_80116280 + 2);
}
- POLY_XLU_DISP = SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
+ POLY_XLU_DISP = SkelAnime_DrawSkeleton2(play, &this->skelAnime,
EnPoDesert_OverrideLimbDraw, EnPoDesert_PostLimbDraw, &this->actor, POLY_XLU_DISP);
CLOSE_DISPS(play->state.gfxCtx);
}
diff --git a/soh/src/overlays/actors/ovl_En_Po_Field/z_en_po_field.c b/soh/src/overlays/actors/ovl_En_Po_Field/z_en_po_field.c
index 3f109863c..d391840ba 100644
--- a/soh/src/overlays/actors/ovl_En_Po_Field/z_en_po_field.c
+++ b/soh/src/overlays/actors/ovl_En_Po_Field/z_en_po_field.c
@@ -944,15 +944,14 @@ void EnPoField_Draw(Actor* thisx, PlayState* play) {
this->lightColor.a));
gSPSegment(POLY_OPA_DISP++, 0x0C, D_80116280 + 2);
POLY_OPA_DISP =
- SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
+ SkelAnime_DrawSkeleton2(play, &this->skelAnime,
EnPoField_OverrideLimbDraw2, EnPoField_PostLimDraw2, &this->actor, POLY_OPA_DISP);
} else {
gSPSegment(POLY_XLU_DISP++, 0x08,
Gfx_EnvColor(play->state.gfxCtx, this->lightColor.r, this->lightColor.g, this->lightColor.b,
this->lightColor.a));
gSPSegment(POLY_XLU_DISP++, 0x0C, D_80116280);
- POLY_XLU_DISP =
- SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
+ POLY_XLU_DISP = SkelAnime_DrawSkeleton2(play, &this->skelAnime,
EnPoField_OverrideLimbDraw2, EnPoField_PostLimDraw2, &this->actor, POLY_XLU_DISP);
}
gDPPipeSync(POLY_OPA_DISP++);
diff --git a/soh/src/overlays/actors/ovl_En_Po_Sisters/z_en_po_sisters.c b/soh/src/overlays/actors/ovl_En_Po_Sisters/z_en_po_sisters.c
index 280640efd..e1a1d1f31 100644
--- a/soh/src/overlays/actors/ovl_En_Po_Sisters/z_en_po_sisters.c
+++ b/soh/src/overlays/actors/ovl_En_Po_Sisters/z_en_po_sisters.c
@@ -1362,14 +1362,12 @@ void EnPoSisters_Draw(Actor* thisx, PlayState* play) {
if (this->unk_22E.a == 255 || this->unk_22E.a == 0) {
gDPSetEnvColor(POLY_OPA_DISP++, this->unk_22E.r, this->unk_22E.g, this->unk_22E.b, this->unk_22E.a);
gSPSegment(POLY_OPA_DISP++, 0x09, D_80116280 + 2);
- POLY_OPA_DISP =
- SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
- EnPoSisters_OverrideLimbDraw, EnPoSisters_PostLimbDraw, &this->actor, POLY_OPA_DISP);
+ POLY_OPA_DISP = SkelAnime_DrawSkeleton2(play, &this->skelAnime, EnPoSisters_OverrideLimbDraw,
+ EnPoSisters_PostLimbDraw, &this->actor, POLY_OPA_DISP);
} else {
gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 255, this->unk_22E.a);
gSPSegment(POLY_XLU_DISP++, 0x09, D_80116280);
- POLY_XLU_DISP =
- SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
+ POLY_XLU_DISP = SkelAnime_DrawSkeleton2(play, &this->skelAnime,
EnPoSisters_OverrideLimbDraw, EnPoSisters_PostLimbDraw, &this->actor, POLY_XLU_DISP);
}
if (!(this->unk_199 & 0x80)) {
diff --git a/soh/src/overlays/actors/ovl_En_Poh/z_en_poh.c b/soh/src/overlays/actors/ovl_En_Poh/z_en_poh.c
index 809150fe6..2c7e90416 100644
--- a/soh/src/overlays/actors/ovl_En_Poh/z_en_poh.c
+++ b/soh/src/overlays/actors/ovl_En_Poh/z_en_poh.c
@@ -1085,12 +1085,12 @@ void EnPoh_DrawRegular(Actor* thisx, PlayState* play) {
if (this->lightColor.a == 255 || this->lightColor.a == 0) {
gDPSetEnvColor(POLY_OPA_DISP++, this->lightColor.r, this->lightColor.g, this->lightColor.b, this->lightColor.a);
gSPSegment(POLY_OPA_DISP++, 0x08, D_80116280 + 2);
- POLY_OPA_DISP = SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
+ POLY_OPA_DISP = SkelAnime_DrawSkeleton2(play, &this->skelAnime,
EnPoh_OverrideLimbDraw, EnPoh_PostLimbDraw, &this->actor, POLY_OPA_DISP);
} else {
gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 255, this->lightColor.a);
gSPSegment(POLY_XLU_DISP++, 0x08, D_80116280);
- POLY_XLU_DISP = SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
+ POLY_XLU_DISP = SkelAnime_DrawSkeleton2(play, &this->skelAnime,
EnPoh_OverrideLimbDraw, EnPoh_PostLimbDraw, &this->actor, POLY_XLU_DISP);
}
gDPPipeSync(POLY_OPA_DISP++);
diff --git a/soh/src/overlays/actors/ovl_En_Vali/z_en_vali.c b/soh/src/overlays/actors/ovl_En_Vali/z_en_vali.c
index 9b6154a8b..11772cd90 100644
--- a/soh/src/overlays/actors/ovl_En_Vali/z_en_vali.c
+++ b/soh/src/overlays/actors/ovl_En_Vali/z_en_vali.c
@@ -814,7 +814,7 @@ void EnVali_Draw(Actor* thisx, PlayState* play) {
EnVali_DrawBody(this, play);
- POLY_XLU_DISP = SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
+ POLY_XLU_DISP = SkelAnime_DrawSkeleton2(play, &this->skelAnime,
EnVali_OverrideLimbDraw, EnVali_PostLimbDraw, this, POLY_XLU_DISP);
CLOSE_DISPS(play->state.gfxCtx);
diff --git a/soh/src/overlays/actors/ovl_En_Weiyer/z_en_weiyer.c b/soh/src/overlays/actors/ovl_En_Weiyer/z_en_weiyer.c
index 4a267b001..e3f19a3ed 100644
--- a/soh/src/overlays/actors/ovl_En_Weiyer/z_en_weiyer.c
+++ b/soh/src/overlays/actors/ovl_En_Weiyer/z_en_weiyer.c
@@ -640,13 +640,13 @@ void EnWeiyer_Draw(Actor* thisx, PlayState* play) {
Gfx_SetupDL_25Opa(play->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, &D_80116280[2]);
gDPSetEnvColor(POLY_OPA_DISP++, 255, 255, 255, 255);
- POLY_OPA_DISP = SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
- EnWeiyer_OverrideLimbDraw, NULL, &this->actor, POLY_OPA_DISP);
+ POLY_OPA_DISP = SkelAnime_DrawSkeleton2(play, &this->skelAnime, EnWeiyer_OverrideLimbDraw, NULL, &this->actor,
+ POLY_OPA_DISP);
} else {
Gfx_SetupDL_25Xlu(play->state.gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x08, &D_80116280[0]);
gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 255, this->actor.shape.shadowAlpha);
- POLY_XLU_DISP = SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
+ POLY_XLU_DISP = SkelAnime_DrawSkeleton2(play, &this->skelAnime,
EnWeiyer_OverrideLimbDraw, NULL, &this->actor, POLY_XLU_DISP);
}
diff --git a/soh/src/overlays/actors/ovl_En_Wood02/z_en_wood02.c b/soh/src/overlays/actors/ovl_En_Wood02/z_en_wood02.c
index 2b0d6c126..eb6a77e24 100644
--- a/soh/src/overlays/actors/ovl_En_Wood02/z_en_wood02.c
+++ b/soh/src/overlays/actors/ovl_En_Wood02/z_en_wood02.c
@@ -101,13 +101,19 @@ static f32 sSpawnSin;
s32 EnWood02_SpawnZoneCheck(EnWood02* this, PlayState* play, Vec3f* pos) {
f32 phi_f12;
- if (CVarGetInteger(CVAR_ENHANCEMENT("DisableDrawDistance"), 0) != 0) {
- return true;
- }
-
SkinMatrix_Vec3fMtxFMultXYZW(&play->viewProjectionMtxF, pos, &this->actor.projectedPos,
&this->actor.projectedW);
+ // #region SOH [Enhancement] Use the extended culling calculation
+ if (CVarGetInteger(CVAR_ENHANCEMENT("DisableDrawDistance"), 1) > 1 ||
+ CVarGetInteger(CVAR_ENHANCEMENT("WidescreenActorCulling"), 0)) {
+ bool shipShouldDraw = false;
+ bool shipShouldUpdate = false;
+ return Ship_CalcShouldDrawAndUpdate(play, &this->actor, &this->actor.projectedPos, this->actor.projectedW,
+ &shipShouldDraw, &shipShouldUpdate);
+ }
+ // #endregion
+
phi_f12 = ((this->actor.projectedW == 0.0f) ? 1000.0f : fabsf(1.0f / this->actor.projectedW));
if ((-this->actor.uncullZoneScale < this->actor.projectedPos.z) &&
diff --git a/soh/src/overlays/actors/ovl_En_Zf/z_en_zf.c b/soh/src/overlays/actors/ovl_En_Zf/z_en_zf.c
index 98180605e..03fb95bd3 100644
--- a/soh/src/overlays/actors/ovl_En_Zf/z_en_zf.c
+++ b/soh/src/overlays/actors/ovl_En_Zf/z_en_zf.c
@@ -2252,7 +2252,7 @@ void EnZf_Draw(Actor* thisx, PlayState* play) {
gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, this->alpha);
gSPSegment(POLY_OPA_DISP++, 0x09, &D_80116280[2]);
- POLY_OPA_DISP = SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
+ POLY_OPA_DISP = SkelAnime_DrawSkeleton2(play, &this->skelAnime,
EnZf_OverrideLimbDraw, EnZf_PostLimbDraw, this, POLY_OPA_DISP);
if (this->iceTimer != 0) {
@@ -2271,7 +2271,7 @@ void EnZf_Draw(Actor* thisx, PlayState* play) {
gDPPipeSync(POLY_XLU_DISP++);
gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 0, this->alpha);
gSPSegment(POLY_XLU_DISP++, 0x09, &D_80116280[0]);
- POLY_XLU_DISP = SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
+ POLY_XLU_DISP = SkelAnime_DrawSkeleton2(play, &this->skelAnime,
EnZf_OverrideLimbDraw, EnZf_PostLimbDraw, this, POLY_XLU_DISP);
}
CLOSE_DISPS(play->state.gfxCtx);
diff --git a/soh/src/overlays/actors/ovl_Obj_Mure/z_obj_mure.c b/soh/src/overlays/actors/ovl_Obj_Mure/z_obj_mure.c
index 519035081..94c1d468b 100644
--- a/soh/src/overlays/actors/ovl_Obj_Mure/z_obj_mure.c
+++ b/soh/src/overlays/actors/ovl_Obj_Mure/z_obj_mure.c
@@ -275,7 +275,12 @@ void ObjMure_InitialAction(ObjMure* this, PlayState* play) {
}
void ObjMure_CulledState(ObjMure* this, PlayState* play) {
- if (fabsf(this->actor.projectedPos.z) < sZClip[this->type] || CVarGetInteger(CVAR_ENHANCEMENT("DisableDrawDistance"), 0) != 0) {
+ // #region SOH [Enhancements] Extended draw distance
+ s32 distanceMultiplier = CVarGetInteger(CVAR_ENHANCEMENT("DisableDrawDistance"), 1);
+ distanceMultiplier = MAX(distanceMultiplier, 1);
+
+ if (fabsf(this->actor.projectedPos.z) < sZClip[this->type] * distanceMultiplier) {
+ // #endregion
this->actionFunc = ObjMure_ActiveState;
this->actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED;
ObjMure_SpawnActors(this, play);
@@ -398,8 +403,13 @@ static ObjMureActionFunc sTypeGroupBehaviorFunc[] = {
void ObjMure_ActiveState(ObjMure* this, PlayState* play) {
ObjMure_CheckChildren(this, play);
- if (sZClip[this->type] + 40.0f <= fabsf(this->actor.projectedPos.z) &&
- CVarGetInteger(CVAR_ENHANCEMENT("DisableDrawDistance"), 1) != 0) {
+
+ // #region SOH [Enhancements] Extended draw distance
+ s32 distanceMultiplier = CVarGetInteger(CVAR_ENHANCEMENT("DisableDrawDistance"), 1);
+ distanceMultiplier = MAX(distanceMultiplier, 1);
+
+ if ((sZClip[this->type] + 40.0f) * distanceMultiplier <= fabsf(this->actor.projectedPos.z)) {
+ // #endregion
this->actionFunc = ObjMure_CulledState;
this->actor.flags &= ~ACTOR_FLAG_UPDATE_WHILE_CULLED;
ObjMure_KillActors(this, play);
diff --git a/soh/src/overlays/actors/ovl_Obj_Mure2/z_obj_mure2.c b/soh/src/overlays/actors/ovl_Obj_Mure2/z_obj_mure2.c
index 0aad27c04..5b1eecbd4 100644
--- a/soh/src/overlays/actors/ovl_Obj_Mure2/z_obj_mure2.c
+++ b/soh/src/overlays/actors/ovl_Obj_Mure2/z_obj_mure2.c
@@ -190,8 +190,7 @@ void func_80B9A658(ObjMure2* this) {
void func_80B9A668(ObjMure2* this, PlayState* play) {
if (Math3D_Dist1DSq(this->actor.projectedPos.x, this->actor.projectedPos.z) <
- (sDistSquared1[this->actor.params & 3] * this->unk_184) ||
- CVarGetInteger(CVAR_ENHANCEMENT("DisableDrawDistance"), 0) != 0) {
+ (sDistSquared1[this->actor.params & 3] * this->unk_184)) {
this->actor.flags |= ACTOR_FLAG_UPDATE_WHILE_CULLED;
ObjMure2_SpawnActors(this, play);
func_80B9A6E8(this);
@@ -205,12 +204,8 @@ void func_80B9A6E8(ObjMure2* this) {
void func_80B9A6F8(ObjMure2* this, PlayState* play) {
func_80B9A534(this);
- if (CVarGetInteger(CVAR_ENHANCEMENT("DisableDrawDistance"), 0) != 0) {
- return;
- }
-
if ((sDistSquared2[this->actor.params & 3] * this->unk_184) <=
- Math3D_Dist1DSq(this->actor.projectedPos.x, this->actor.projectedPos.z)) {
+ Math3D_Dist1DSq(this->actor.projectedPos.x, this->actor.projectedPos.z)) {
this->actor.flags &= ~ACTOR_FLAG_UPDATE_WHILE_CULLED;
ObjMure2_CleanupAndDie(this, play);
func_80B9A658(this);
@@ -225,5 +220,20 @@ void ObjMure2_Update(Actor* thisx, PlayState* play) {
} else {
this->unk_184 = 4.0f;
}
+
+ // SOH [Enhancements] Extended draw distance
+ s32 distanceMultiplier = CVarGetInteger(CVAR_ENHANCEMENT("DisableDrawDistance"), 1);
+ if (CVarGetInteger(CVAR_ENHANCEMENT("WidescreenActorCulling"), 0) || distanceMultiplier > 1) {
+ f32 originalAspectRatio = 4.0f / 3.0f;
+ f32 currentAspectRatio = OTRGetAspectRatio();
+ // Adjust ratio difference based on field of view testing
+ f32 ratioAdjusted = 1.0f + (MAX(currentAspectRatio / originalAspectRatio, 1.0f) / 1.5f);
+ // Distance multiplier is squared due to the checks above for squared distances
+ distanceMultiplier = SQ(MAX(distanceMultiplier, 1));
+
+ // Prefer the largest of the three values
+ this->unk_184 = MAX(MAX((f32)distanceMultiplier, ratioAdjusted), this->unk_184);
+ }
+
this->actionFunc(this, play);
}
diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c
index 3dfb2dbeb..c5d1a65bd 100644
--- a/soh/src/overlays/actors/ovl_player_actor/z_player.c
+++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c
@@ -11895,10 +11895,6 @@ void Player_Draw(Actor* thisx, PlayState* play2) {
lod = 1;
}
- if (CVarGetInteger(CVAR_ENHANCEMENT("DisableLOD"), 0)) {
- lod = 0;
- }
-
func_80093C80(play);
Gfx_SetupDL_25Xlu(play->state.gfxCtx);
@@ -12119,7 +12115,8 @@ void func_8084AEEC(Player* this, f32* arg1, f32 arg2, s16 arg3) {
} else if (gWalkSpeedToggle2) {
swimMod *= CVarGetFloat(CVAR_SETTING("WalkModifier.SwimMapping2"), 1.0f);
}
- } else {
+ // sControlInput is NULL to prevent inputs while surfacing after obtaining an underwater item so we want to ignore it for that case
+ } else if (sControlInput != NULL) {
if (CHECK_BTN_ALL(sControlInput->cur.button, BTN_MODIFIER1)) {
swimMod *= CVarGetFloat(CVAR_SETTING("WalkModifier.SwimMapping1"), 1.0f);
} else if (CHECK_BTN_ALL(sControlInput->cur.button, BTN_MODIFIER2)) {
diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c
index 99ba5df72..116ad0c3c 100644
--- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c
+++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c
@@ -27,6 +27,8 @@ static Vtx sStrengthAButtonVtx[] = {
static s16 sEquipTimer = 0;
+extern int gPauseLinkFrameBuffer;
+
void KaleidoScope_DrawEquipmentImage(PlayState* play, void* source, u32 width, u32 height) {
PauseContext* pauseCtx = &play->pauseCtx;
u8* curTexture;
@@ -70,13 +72,12 @@ void KaleidoScope_DrawEquipmentImage(PlayState* play, void* source, u32 width, u
for (i = 0; i < textureCount; i++) {
gSPVertex(POLY_KAL_DISP++, &pauseCtx->equipVtx[vtxIndex], 4, 0);
- extern int fbTest;
gDPSetTextureImage(POLY_KAL_DISP++, G_IM_FMT_RGBA, G_IM_SIZ_16b, width, curTexture);
gDPLoadSync(POLY_KAL_DISP++);
gDPLoadTile(POLY_KAL_DISP++, G_TX_LOADTILE, 0, 0, (width - 1) << 2, (textureHeight - 1) << 2);
- gDPSetTextureImageFB(POLY_KAL_DISP++, G_IM_FMT_RGBA, G_IM_SIZ_16b, width, fbTest);
+ gDPSetTextureImageFB(POLY_KAL_DISP++, G_IM_FMT_RGBA, G_IM_SIZ_16b, width, gPauseLinkFrameBuffer);
gSP1Quadrangle(POLY_KAL_DISP++, 0, 2, 3, 1, 0);
curTexture += textureSize;
@@ -185,8 +186,7 @@ void KaleidoScope_DrawPlayerWork(PlayState* play) {
link_kaleido_rot.x = 0;
- extern int fbTest;
- gsSPSetFB(play->state.gfxCtx->polyOpa.p++, fbTest);
+ gsSPSetFB(play->state.gfxCtx->polyOpa.p++, gPauseLinkFrameBuffer);
Player_DrawPause(play, pauseCtx->playerSegment, &pauseCtx->playerSkelAnime, &pos, &link_kaleido_rot, scale,
SWORD_EQUIP_TO_PLAYER(CUR_EQUIP_VALUE(EQUIP_TYPE_SWORD)),
TUNIC_EQUIP_TO_PLAYER(CUR_EQUIP_VALUE(EQUIP_TYPE_TUNIC)),
@@ -852,7 +852,7 @@ void KaleidoScope_DrawEquipment(PlayState* play) {
//gSPSegment(POLY_KAL_DISP++, 0x0C, pauseCtx->iconItemAltSegment);
Gfx_SetupDL_42Kal(play->state.gfxCtx);
- KaleidoScope_DrawEquipmentImage(play, pauseCtx->playerSegment, 64, 112);
+ KaleidoScope_DrawEquipmentImage(play, pauseCtx->playerSegment, PAUSE_EQUIP_PLAYER_WIDTH, PAUSE_EQUIP_PLAYER_HEIGHT);
if (gUpgradeMasks[0]) {}
diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c
index 424c823d6..a8b7536f0 100644
--- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c
+++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c
@@ -929,7 +929,6 @@ static void* sPromptChoiceTexs[][2] = {
static u8 sButtonStatusSave[ARRAY_COUNT(gSaveContext.buttonStatus)];
static PreRender sPlayerPreRender;
static void* sPreRenderCvg;
-extern int fbTest;
void KaleidoScope_ProcessPlayerPreRender(void) {
PreRender_Calc(&sPlayerPreRender);
@@ -3725,7 +3724,8 @@ void KaleidoScope_Update(PlayState* play)
sPreRenderCvg = (void*)(((uintptr_t)pauseCtx->nameSegment + 0x400 + 0xA00 + 0xF) & ~0xF);
PreRender_Init(&sPlayerPreRender);
- PreRender_SetValuesSave(&sPlayerPreRender, 64, 112, pauseCtx->playerSegment, NULL, sPreRenderCvg);
+ PreRender_SetValuesSave(&sPlayerPreRender, PAUSE_EQUIP_PLAYER_WIDTH, PAUSE_EQUIP_PLAYER_HEIGHT,
+ pauseCtx->playerSegment, NULL, sPreRenderCvg);
KaleidoScope_DrawPlayerWork(play);
//KaleidoScope_SetupPlayerPreRender(play);