From 581bd9a21c5af25372393a38e09af0aba29c7a61 Mon Sep 17 00:00:00 2001 From: idefix02 <237103031+idefix02@users.noreply.github.com> Date: Thu, 24 Sep 2026 21:55:23 +0200 Subject: [PATCH 1/2] Find a better match for sub_8004BD0 --- src/game/sa3/stage/player.c | 88 +++++++++++++++++-------------------- 1 file changed, 40 insertions(+), 48 deletions(-) diff --git a/src/game/sa3/stage/player.c b/src/game/sa3/stage/player.c index 85f84133..d52d2564 100644 --- a/src/game/sa3/stage/player.c +++ b/src/game/sa3/stage/player.c @@ -812,68 +812,60 @@ void sub_8004B14(void) } } -// Fake-match -// (100.0%) https://decomp.me/scratch/hKyWu void sub_8004BD0(Player *p, s32 qWorldX, s32 qWorldY) { - s32 partnerChar; - s32 qPlayerX; - s32 dx; - s32 qPlayerY; - s32 distance; - s32 dy; - s16 var_r1; - s32 new_var; - s32 forMatch; - u32 temp_r1; + s32 qPlayerX, qPlayerY; + s32 dx, dy; + s32 squaredDistance; + s32 maxSquaredDistance; + s16 angle; + Player *partner; - if ((gPlayers + p->charFlags.partnerIndex)->charFlags.character == CREAM) { + partner = &gPlayers[p->charFlags.partnerIndex]; + if (partner->charFlags.character == CREAM) { qPlayerX = p->qWorldX; qPlayerY = p->qWorldY; - if (MOVESTATE_GRAVITY_SWITCHED & p->moveState) { + if (p->moveState & MOVESTATE_GRAVITY_SWITCHED) { if (qPlayerY >= qWorldY) { - if (MOVESTATE_FACING_LEFT & p->moveState) { - goto block_9; - } else { - goto block_7; + if (p->moveState & MOVESTATE_FACING_LEFT) { + if (qPlayerX > qWorldX) { + return; + } + } else if (qPlayerX < qWorldX) { + return; } + } else { + return; } } else if (qPlayerY <= qWorldY) { - if (MOVESTATE_FACING_LEFT & p->moveState) { - block_7: + if (p->moveState & MOVESTATE_FACING_LEFT) { if (qPlayerX < qWorldX) { return; - } else { - goto block_10; } + } else if (qPlayerX > qWorldX) { + return; } - { - block_9: - if (qPlayerX <= qWorldX) { - block_10: - dx = I(qWorldX - p->qWorldX); - dy = I(qWorldY - qPlayerY); - - forMatch = 256; - new_var = (SQUARE(5) * forMatch); // <- SQUARE(80) - distance = SQUARE(dx) + SQUARE(dy); - if (new_var >= distance) { - if (p->unkB8 >= distance) { - if (p->moveState & MOVESTATE_GRAVITY_SWITCHED) { - dy = -dy; - } - var_r1 = (u16)SA2_LABEL(sub_8004418)(dy, dx); - if (p->moveState & MOVESTATE_GRAVITY_SWITCHED) { - var_r1 = (0x400 - var_r1) & 0x3FF; - } - p->unkA8 = qWorldX; - p->unkAC = (dy = qWorldY); - p->unkB8 = distance; - p->unkC0 = var_r1; - } - } - } + } else { + return; + } + qPlayerX = p->qWorldX; // duplicate assignment for matching + dx = I(qWorldX - qPlayerX); + dy = I(qWorldY - qPlayerY); + + maxSquaredDistance = SQUARE(80); + squaredDistance = SQUARE(dx) + SQUARE(dy); + if ((maxSquaredDistance >= squaredDistance) && (p->unkB8 >= squaredDistance)) { + if (p->moveState & MOVESTATE_GRAVITY_SWITCHED) { + dy = -dy; + } + angle = SA2_LABEL(sub_8004418)(dy, dx); + if (p->moveState & MOVESTATE_GRAVITY_SWITCHED) { + angle = CLAMP_SIN_PERIOD((s32)SIN_PERIOD - angle); } + p->unkA8 = qWorldX; + p->unkAC = qWorldY; + p->unkB8 = squaredDistance; + p->unkC0 = angle; } } } From 1bcfc5f46a9c28a7f80bd198d7888f5ed3652f6d Mon Sep 17 00:00:00 2001 From: idefix02 <237103031+idefix02@users.noreply.github.com> Date: Tue, 29 Sep 2026 21:07:18 +0200 Subject: [PATCH 2/2] Improve the shape of tests in sub_8004BD0 --- src/game/sa3/stage/player.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/game/sa3/stage/player.c b/src/game/sa3/stage/player.c index d52d2564..673d4fbf 100644 --- a/src/game/sa3/stage/player.c +++ b/src/game/sa3/stage/player.c @@ -837,16 +837,18 @@ void sub_8004BD0(Player *p, s32 qWorldX, s32 qWorldY) } else { return; } - } else if (qPlayerY <= qWorldY) { - if (p->moveState & MOVESTATE_FACING_LEFT) { - if (qPlayerX < qWorldX) { + } else { + if (qPlayerY <= qWorldY) { + if (p->moveState & MOVESTATE_FACING_LEFT) { + if (qPlayerX < qWorldX) { + return; + } + } else if (qPlayerX > qWorldX) { return; } - } else if (qPlayerX > qWorldX) { + } else { return; } - } else { - return; } qPlayerX = p->qWorldX; // duplicate assignment for matching dx = I(qWorldX - qPlayerX);