From 5df51b56d1da370ea5ae1c88483b36528fd06450 Mon Sep 17 00:00:00 2001 From: Oliver Bell Date: Wed, 22 Apr 2026 01:13:16 +0100 Subject: [PATCH] sa1: match Coll_Player_PlatformCrumbling --- include/rect.h | 4 +- .../shared/stage/collision__sa2__800C060.inc | 306 ------------------ sa1/src/game/shared/stage/collision_3.c | 35 +- src/game/shared/stage/collision_3.c | 238 ++++++++++++++ 4 files changed, 259 insertions(+), 324 deletions(-) delete mode 100644 sa1/asm/non_matching/game/shared/stage/collision__sa2__800C060.inc diff --git a/include/rect.h b/include/rect.h index a640cda1e..8af6f8ae9 100644 --- a/include/rect.h +++ b/include/rect.h @@ -32,11 +32,11 @@ typedef struct { #define Q_RECT_WIDTH(hb) QS(RECT_WIDTH(hb)) #define Q_RECT_HEIGHT(hb) QS(RECT_HEIGHT(hb)) #define Q_RECT_LEFT(x, hb) ((x) + Q((hb)->left)) -#define Q_RECT_LEFT2(x, hb) QS((hb)->left + (x)) +#define Q_RECT_LEFT2(x, hb) (QS(x) + QS((hb)->left)) #define Q_RECT_RIGHT(x, hb) (Q_RECT_LEFT(x, hb) + Q_RECT_WIDTH(hb)) #define Q_RECT_RIGHT2(x, hb) (Q_RECT_LEFT2(x, hb) + Q_RECT_WIDTH(hb)) #define Q_RECT_TOP(y, hb) (((y) + Q((hb)->top))) -#define Q_RECT_TOP2(y, hb) QS(((hb)->top) + (y)) +#define Q_RECT_TOP2(y, hb) (QS(y) + QS((hb)->top)) #define Q_RECT_BOTTOM(y, hb) (Q_RECT_TOP(y, hb) + Q_RECT_HEIGHT(hb)) #define Q_RECT_BOTTOM2(y, hb) (Q_RECT_TOP2(y, hb) + Q_RECT_HEIGHT(hb)) diff --git a/sa1/asm/non_matching/game/shared/stage/collision__sa2__800C060.inc b/sa1/asm/non_matching/game/shared/stage/collision__sa2__800C060.inc deleted file mode 100644 index fe5745fc3..000000000 --- a/sa1/asm/non_matching/game/shared/stage/collision__sa2__800C060.inc +++ /dev/null @@ -1,306 +0,0 @@ -.include "constants/constants.inc" - -.syntax unified -.text - push {r4, r5, r6, r7, lr} - mov r7, sl - mov r6, sb - mov r5, r8 - push {r5, r6, r7} - sub sp, #0x10 - mov r8, r0 - adds r5, r3, #0 - lsls r1, r1, #0x10 - lsrs r6, r1, #0x10 - lsls r2, r2, #0x10 - lsrs r7, r2, #0x10 - ldrb r4, [r5, #0xe] - rsbs r0, r4, #0 - add r1, sp, #4 - strb r0, [r1] - ldrb r3, [r5, #0xf] - rsbs r2, r3, #0 - mov r0, sp - adds r0, #5 - strb r2, [r0] - adds r0, #1 - strb r4, [r0] - adds r0, #1 - strb r3, [r0] - mov r0, sp - movs r2, #4 - bl memcpy - movs r0, #0 - str r0, [sp, #8] - mov sb, r0 - mov r2, r8 - ldr r1, [r2, #0x28] - subs r0, #1 - cmp r1, r0 - beq _0800B310 - ldr r1, [r5, #0x10] - movs r0, #0x80 - ands r0, r1 - cmp r0, #0 - beq _0800B314 -_0800B310: - movs r0, #0 - b _0800B4E6 -_0800B314: - movs r0, #8 - ands r0, r1 - cmp r0, #0 - beq _0800B32E - ldr r0, [r5, #0x28] - cmp r0, r8 - bne _0800B32E - movs r0, #9 - rsbs r0, r0, #0 - ands r1, r0 - str r1, [r5, #0x10] - movs r0, #1 - mov sb, r0 -_0800B32E: - lsls r1, r6, #0x10 - asrs r1, r1, #8 - mov r0, r8 - adds r0, #0x2c - movs r3, #0 - ldrsb r3, [r0, r3] - lsls r0, r3, #8 - adds r2, r1, r0 - mov r0, sp - movs r4, #0 - ldrsb r4, [r0, r4] - lsls r1, r4, #8 - ldr r0, [r5] - adds r1, r0, r1 - cmp r2, r1 - bgt _0800B368 - mov r0, r8 - adds r0, #0x2e - ldrb r0, [r0] - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - subs r0, r0, r3 - lsls r0, r0, #8 - adds r0, r2, r0 - cmp r0, r1 - bge _0800B37C - cmp r2, r1 - bge _0800B368 - b _0800B4C8 -_0800B368: - mov r0, sp - ldrb r0, [r0, #2] - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - subs r0, r0, r4 - lsls r0, r0, #8 - adds r0, r1, r0 - cmp r0, r2 - bge _0800B37C - b _0800B4C8 -_0800B37C: - lsls r3, r7, #0x10 - asrs r1, r3, #8 - mov r2, r8 - adds r2, #0x2d - movs r7, #0 - ldrsb r7, [r2, r7] - lsls r0, r7, #8 - adds r6, r1, r0 - mov r0, sp - ldrb r0, [r0, #1] - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - mov ip, r0 - lsls r0, r0, #8 - ldr r1, [r5, #4] - adds r4, r1, r0 - mov sl, r3 - str r2, [sp, #0xc] - adds r3, r1, #0 - cmp r6, r4 - bgt _0800B3C0 - mov r0, r8 - adds r0, #0x2f - ldrb r0, [r0] - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - subs r0, r0, r7 - lsls r0, r0, #8 - adds r0, r6, r0 - cmp r0, r4 - bge _0800B3D4 - cmp r6, r4 - bge _0800B3C0 - b _0800B4C8 -_0800B3C0: - mov r0, sp - ldrb r0, [r0, #3] - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - mov r1, ip - subs r0, r0, r1 - lsls r0, r0, #8 - adds r0, r4, r0 - cmp r0, r6 - blt _0800B4C8 -_0800B3D4: - movs r2, #0xa - ldrsh r0, [r5, r2] - cmp r0, #0 - blt _0800B4C8 - mov r2, sp - ldrb r1, [r5, #0xf] - rsbs r0, r1, #0 - strb r0, [r2, #1] - mov r0, sp - strb r1, [r0, #3] - ldr r1, [r5, #0x10] - movs r0, #8 - orrs r1, r0 - str r1, [r5, #0x10] - ldr r2, [sp, #8] - orrs r2, r0 - str r2, [sp, #8] - adds r0, r5, #0 - adds r0, #0x59 - movs r2, #0 - ldrsb r2, [r0, r2] - adds r4, r0, #0 - cmp r2, #2 - bne _0800B414 - subs r0, #0x1c - ldrb r0, [r0] - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - cmp r0, #1 - beq _0800B43A - cmp r0, #3 - beq _0800B43A -_0800B414: - cmp r2, #3 - bne _0800B430 - movs r0, #0x80 - lsls r0, r0, #0x13 - ands r1, r0 - cmp r1, #0 - beq _0800B430 - adds r0, r5, #0 - adds r0, #0x3e - ldrb r0, [r0] - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - cmp r0, #0 - bne _0800B43A -_0800B430: - ldr r0, [r5, #0x10] - movs r1, #3 - rsbs r1, r1, #0 - ands r0, r1 - str r0, [r5, #0x10] -_0800B43A: - mov r0, sb - cmp r0, #0 - bne _0800B46A - movs r0, #0 - ldrsb r0, [r4, r0] - cmp r0, #2 - bne _0800B45A - adds r0, r5, #0 - adds r0, #0x3d - ldrb r0, [r0] - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - cmp r0, #1 - beq _0800B464 - cmp r0, #3 - beq _0800B464 -_0800B45A: - adds r0, r5, #0 - bl sa2__sub_8021BE0 - ldrh r0, [r5, #8] - strh r0, [r5, #0xc] -_0800B464: - movs r0, #0 - strb r0, [r5, #0x14] - ldr r3, [r5, #4] -_0800B46A: - mov r1, r8 - str r1, [r5, #0x28] - movs r0, #0 - strh r0, [r5, #0xa] - ldr r0, _0800B498 @ =gStageFlags - ldrh r1, [r0] - movs r0, #0x80 - ands r0, r1 - cmp r0, #0 - bne _0800B49C - mov r2, sl - asrs r0, r2, #0x10 - ldr r2, [sp, #0xc] - movs r1, #0 - ldrsb r1, [r2, r1] - adds r0, r0, r1 - mov r1, sp - ldrb r1, [r1, #3] - lsls r1, r1, #0x18 - asrs r1, r1, #0x18 - subs r0, r0, r1 - b _0800B4B6 - .align 2, 0 -_0800B498: .4byte gStageFlags -_0800B49C: - mov r1, sl - asrs r0, r1, #0x10 - mov r1, r8 - adds r1, #0x2f - ldrb r1, [r1] - lsls r1, r1, #0x18 - asrs r1, r1, #0x18 - adds r0, r0, r1 - mov r1, sp - ldrb r1, [r1, #3] - lsls r1, r1, #0x18 - asrs r1, r1, #0x18 - adds r0, r0, r1 -_0800B4B6: - lsls r0, r0, #8 - ldr r1, _0800B4C4 @ =0xFFFFFF00 - bics r3, r1 - adds r0, r3, r0 - str r0, [r5, #4] - b _0800B4E4 - .align 2, 0 -_0800B4C4: .4byte 0xFFFFFF00 -_0800B4C8: - mov r2, sb - cmp r2, #0 - beq _0800B4E4 - ldr r1, [r5, #0x10] - movs r0, #8 - ands r0, r1 - cmp r0, #0 - bne _0800B4E4 - movs r0, #0x21 - rsbs r0, r0, #0 - ands r1, r0 - movs r0, #2 - orrs r1, r0 - str r1, [r5, #0x10] -_0800B4E4: - ldr r0, [sp, #8] -_0800B4E6: - add sp, #0x10 - pop {r3, r4, r5} - mov r8, r3 - mov sb, r4 - mov sl, r5 - pop {r4, r5, r6, r7} - pop {r1} - bx r1 - .align 2, 0 - -.syntax divided diff --git a/sa1/src/game/shared/stage/collision_3.c b/sa1/src/game/shared/stage/collision_3.c index 70f5c2a87..8c2a8563c 100644 --- a/sa1/src/game/shared/stage/collision_3.c +++ b/sa1/src/game/shared/stage/collision_3.c @@ -28,8 +28,9 @@ // COLLISION 3 -bool32 Coll_DamageSuperSonic(Player *p); +static bool32 Coll_DamageSuperSonic(Player *p); +#ifndef COLLECT_RINGS_ROM u32 Coll_Player_Entity_RectIntersection(Sprite *s, CamCoord sx, CamCoord sy, Player *p, Rect8 *rectPlayer) { u32 result = 0; @@ -44,6 +45,7 @@ u32 Coll_Player_Entity_RectIntersection(Sprite *s, CamCoord sx, CamCoord sy, Pla return result; } +#endif #if (GAME == GAME_SA1) u32 Coll_AmyHammer_Spring(Sprite *s, s16 worldX, s16 worldY, Player *p) @@ -283,11 +285,8 @@ u32 Coll_Player_SkatingStone(Sprite *s, CamCoord worldX, CamCoord worldY, Player } #endif -// sa2__sub_800C060 -// 'Coll_Player_PlatformCrumbling' name from SA2, called by many Entities in SA1! -// (86.62%) https://decomp.me/scratch/kyp0r -NONMATCH("asm/non_matching/game/shared/stage/collision__sa2__800C060.inc", - u32 Coll_Player_PlatformCrumbling(Sprite *s, CamCoord sx, CamCoord sy, Player *p)) +// SA1 reg mismatch: https://decomp.me/scratch/LcYA5 +u32 Coll_Player_PlatformCrumbling(Sprite *s, CamCoord sx, CamCoord sy, Player *p) { s8 rectPlayer[4] = { -p->spriteOffsetX, -p->spriteOffsetY, +p->spriteOffsetX, +p->spriteOffsetY }; @@ -306,7 +305,12 @@ NONMATCH("asm/non_matching/game/shared/stage/collision__sa2__800C060.inc", if (RECT_COLLISION_2(sx, sy, &s->hitboxes[0].b, p->qWorldX, p->qWorldY, (Rect8 *)rectPlayer) && (p->qSpeedAirY >= 0)) { #ifndef NON_MATCHING +#if (GAME == GAME_SA1) + register s32 y asm("r0"); + s32 mask = 0xFFFFFF00; +#elif (GAME == GAME_SA2) register s32 y asm("r1"); +#endif #else s32 y; #endif @@ -341,17 +345,17 @@ NONMATCH("asm/non_matching/game/shared/stage/collision__sa2__800C060.inc", p->qSpeedAirY = 0; if (!GRAVITY_IS_INVERTED) { - y = s->hitboxes[0].b.top; - y += sy; - y -= rectPlayer[3]; + y = sy; + y = (((y + s->hitboxes[0].b.top) - rectPlayer[3])); + y = Q_24_8(y); } else { - y = s->hitboxes[0].b.bottom; - y += sy; - y += rectPlayer[3]; + y = sy; + y = (y + s->hitboxes[0].b.bottom) + rectPlayer[3]; + y = Q_24_8(y); } - y = Q(y); -#ifndef NON_MATCHING - asm("" : "=r"(p->qWorldY) : "r"(~0xFF), "r"(p->qWorldY), "r"(y)); + +#if (GAME == GAME_SA1) && !defined(NON_MATCHING) + p->qWorldY = ((p->qWorldY & ~mask)) + (y); #else p->qWorldY = Q_24_8_FRAC(p->qWorldY) + (y); #endif @@ -362,7 +366,6 @@ NONMATCH("asm/non_matching/game/shared/stage/collision__sa2__800C060.inc", return result; } -END_NONMATCH // TODO: Simplify and merge SA1 and SA2 versions! #if (GAME == GAME_SA1) diff --git a/src/game/shared/stage/collision_3.c b/src/game/shared/stage/collision_3.c index 53037f06e..d89a5771e 100644 --- a/src/game/shared/stage/collision_3.c +++ b/src/game/shared/stage/collision_3.c @@ -36,6 +36,244 @@ u32 Coll_Player_Entity_RectIntersection(Sprite *s, s32 sx, s32 sy, Player *p, Re return result; } +#if (GAME == GAME_SA1) +u32 Coll_AmyHammer_Spring(Sprite *s, s16 worldX, s16 worldY, Player *p) +{ + bool32 isColliding = FALSE; + + if (p->character == CHARACTER_AMY) { + if ((p->charState == CHARSTATE_87) || (p->charState == CHARSTATE_88) || (p->charState == CHARSTATE_89) + || (p->charState == CHARSTATE_90)) { + if (p->spriteInfoBody->s.hitboxes[1].index != HITBOX_STATE_INACTIVE) { + if (HB_COLLISION(worldX, worldY, s->hitboxes[0].b, I(p->qWorldX), I(p->qWorldY), p->spriteInfoBody->s.hitboxes[1].b)) { + isColliding = TRUE; + } + } + } + } + + return isColliding; +} + +u32 Coll_Player_Spring_Sideways(Sprite *s, CamCoord worldX, CamCoord worldY, Player *p) +{ + s8 rectDataPlayerA[4] = { -(p->spriteOffsetX + 5), (1 - p->spriteOffsetY), (p->spriteOffsetX + 5), (p->spriteOffsetY - 1) }; + s8 rectDataPlayerB[4] = { -(p->spriteOffsetX + 0), (0 - p->spriteOffsetY), (p->spriteOffsetX + 0), (p->spriteOffsetY + 0) }; + Rect8 *rectPlayerB; + + u32 moveState = 0; + bool32 stoodOnCurrent = 0; + + if (s->hitboxes[0].index == -1) { + return moveState; + } + + if (!IS_ALIVE(p)) { + return moveState; + } + + moveState = p->moveState & MOVESTATE_IN_AIR; + rectPlayerB = (Rect8 *)&rectDataPlayerB[0]; + if ((p->moveState & MOVESTATE_STOOD_ON_OBJ) && (p->stoodObj == s)) { + p->moveState &= ~MOVESTATE_STOOD_ON_OBJ; + moveState |= MOVESTATE_IN_AIR; + stoodOnCurrent = 1; + } + + if (moveState & MOVESTATE_IN_AIR) { + if (HB_COLLISION(worldX, worldY, s->hitboxes[0].b, I(p->qWorldX), I(p->qWorldY), (*rectPlayerB))) { + if (sub_800C934(s, worldX, worldY, (Rect8 *)&rectDataPlayerB, stoodOnCurrent, p, &moveState)) { + return moveState; + } + } else if (HB_COLLISION(worldX, worldY, s->hitboxes[0].b, I(p->qWorldX), I(p->qWorldY), (*(Rect8 *)&rectDataPlayerA))) { + if (I(p->qWorldX) <= worldX) { + if (p->qSpeedAirX >= 0) { + p->qSpeedAirX = 0; + p->qWorldX = Q((worldX + s->hitboxes[0].b.left) - rectDataPlayerA[2]); + moveState |= MOVESTATE_20000; + } + } else if (p->qSpeedAirX <= 0) { + p->qSpeedAirX = 0; + p->qWorldX = Q(((worldX + s->hitboxes[0].b.right) - rectDataPlayerA[0]) + 1); + moveState |= MOVESTATE_40000; + } + } + } + + if (HB_COLLISION(worldX, worldY, s->hitboxes[0].b, I(p->qWorldX), I(p->qWorldY), (*(Rect8 *)&rectDataPlayerA))) { + if (I(p->qWorldX) <= worldX) { + if (p->qSpeedAirX >= 0) { + moveState |= MOVESTATE_20000; + + if (p->qSpeedAirX > 0) { + moveState |= MOVESTATE_20; + moveState &= ~MOVESTATE_FACING_LEFT; + p->qWorldX = Q((worldX + s->hitboxes[0].b.left) - rectDataPlayerA[2]); + } + } + } else { + if (p->qSpeedAirX <= 0) { + moveState |= MOVESTATE_40000; + + if (p->qSpeedAirX < 0) { + moveState |= MOVESTATE_20; + moveState |= MOVESTATE_FACING_LEFT; + p->qWorldX = Q(((worldX + s->hitboxes[0].b.right) - rectDataPlayerA[0]) + 1); + } + } + } + } + + return moveState; +} + +// (99.92%) https://decomp.me/scratch/GFpFd +NONMATCH("asm/non_matching/game/shared/stage/collision__Coll_Player_Itembox.inc", + u32 Coll_Player_Itembox(Sprite *s, CamCoord worldX, CamCoord worldY, Player *p)) +{ + s8 rectDataPlayerA[4] = { -(p->spriteOffsetX + 5), (1 - p->spriteOffsetY), (p->spriteOffsetX + 5), (p->spriteOffsetY - 1) }; + s8 rectDataPlayerB[4] = { -(p->spriteOffsetX + 0), (0 - p->spriteOffsetY), (p->spriteOffsetX + 0), (p->spriteOffsetY + 0) }; + Rect8 *rectPlayerB = (Rect8 *)&rectDataPlayerB[0]; + + u32 result; + s32 middleX; + s32 middleY; + + result = 0; + if (s->hitboxes[0].index == -1) { + return result; + } + + if (!IS_ALIVE(p)) { + return result; + } + + if (p->spriteInfoBody->s.hitboxes[1].index != -1) { + if (HB_COLLISION(worldX, worldY, s->hitboxes[0].b, I(p->qWorldX), I(p->qWorldY), p->spriteInfoBody->s.hitboxes[1].b)) { + result |= 0x20; + if (p->moveState & MOVESTATE_IN_AIR) { + if (p->qSpeedAirY > 0) { + p->qSpeedAirY = -p->qSpeedAirY; + } + } + } + } + + if (p->moveState & MOVESTATE_IN_AIR) { + middleX = worldX + ((s->hitboxes[0].b.left + s->hitboxes[0].b.right) >> 1); + middleY = worldY + ((s->hitboxes[0].b.top + s->hitboxes[0].b.bottom) >> 1); + + if (HB_COLLISION(worldX, worldY, s->hitboxes[0].b, I(p->qWorldX), I(p->qWorldY), (*rectPlayerB))) { + if ((!GRAVITY_IS_INVERTED && (I(p->qWorldY) <= middleY)) || (GRAVITY_IS_INVERTED && (I(p->qWorldY) >= middleY))) { + if ((p->character == 1) && (p->SA2_LABEL(unk61) != 0)) { + Coll_Player_Platform(s, worldX, worldY, p); + return 0; + } else if (p->qSpeedAirY >= 0) { + result |= 8; + + if (p->qSpeedAirY > 0) { + p->qSpeedAirY = -p->qSpeedAirY; + } + } + } else if (p->qSpeedAirY < 0) { + p->qSpeedAirY = 0; + + if (!GRAVITY_IS_INVERTED) { + p->qWorldY = p->qWorldY + (Q((worldY + s->hitboxes[0].b.bottom) - rectDataPlayerB[1]) - (0xFFFFFF00 & p->qWorldY)); + } else { + p->qWorldY = p->qWorldY - (Q((worldY + s->hitboxes[0].b.bottom) - rectDataPlayerB[1]) - (0xFFFFFF00 & p->qWorldY)); + } + + result |= 0x10000; + } + } else if (HB_COLLISION(worldX, worldY, s->hitboxes[0].b, I(p->qWorldX), I(p->qWorldY), (*(Rect8 *)&rectDataPlayerA[0]))) { + if (I(p->qWorldX) <= middleX) { + if (p->qSpeedAirX > 0) { + p->qSpeedAirX = 0; + p->qWorldX = Q(worldX + s->hitboxes[0].b.left - rectDataPlayerA[2]); + } + } else { + if (p->qSpeedAirX < 0) { + p->qSpeedAirX = 0; + p->qWorldX = Q((worldX + s->hitboxes[0].b.right - rectDataPlayerA[0]) + 1); + } + } + } + } + + return result; +} +END_NONMATCH + +// Used by Security Gate and Breakable Wall. +u32 Coll_Player_Gate(Sprite *s, CamCoord worldX, CamCoord worldY, Player *p, u32 arg4) +{ + u32 result = 0; + s8 rectPlayer[4] = { -(p->spriteOffsetX + 5), (1 - p->spriteOffsetY), (p->spriteOffsetX + 5), (p->spriteOffsetY - 1) }; + + if (s->hitboxes[0].index == -1) { + return result; + } + + if (!IS_ALIVE(p)) { + return result; + } + + if (arg4 != 0) { + if (p->spriteInfoBody->s.hitboxes[1].index != -1) { + if (HB_COLLISION(worldX, worldY, s->hitboxes[0].b, I(p->qWorldX), I(p->qWorldY), p->spriteInfoBody->s.hitboxes[1].b) + || HB_COLLISION(worldX, worldY, s->hitboxes[0].b, I(p->qWorldX), I(p->qWorldY), (*(Rect8 *)&rectPlayer[0]))) { + + result |= 8; + if ((p->moveState & MOVESTATE_IN_AIR) && (p->qSpeedAirY > 0)) { + p->qSpeedAirY = -p->qSpeedAirY; + } + + return result; + } + } + } + + sub_800CBBC(s, worldX, worldY, (Rect8 *)&rectPlayer, 0, p, &result); + return result; +} + +u32 Coll_Player_SkatingStone(Sprite *s, CamCoord worldX, CamCoord worldY, Player *p) +{ + s32 moveState; + s32 var_sb; + + s8 rectPlayer[4] = { -p->spriteOffsetX, -p->spriteOffsetY, +p->spriteOffsetX, +p->spriteOffsetY }; + + u32 result; + + result = 0; + var_sb = 0; + + if ((s->hitboxes[0].index == -1) || (((0x80 & p->moveState) != 0))) { + return 0U; + } + + moveState = p->moveState & MOVESTATE_IN_AIR; + if ((p->moveState & MOVESTATE_STOOD_ON_OBJ) && (p->stoodObj == s)) { + p->moveState = p->moveState & ~MOVESTATE_STOOD_ON_OBJ; + moveState |= MOVESTATE_IN_AIR; + var_sb = 1; + } + + if (((moveState == 0) || !sub_800C934(s, worldX, worldY, (Rect8 *)rectPlayer, var_sb, p, &result)) + && !sub_800C934(s, worldX, worldY, (Rect8 *)rectPlayer, var_sb, p, &result)) { + if (var_sb) { + if (!(p->moveState & MOVESTATE_STOOD_ON_OBJ)) { + p->moveState = (p->moveState & ~MOVESTATE_20) | MOVESTATE_IN_AIR; + } + } + } + + return result; +} +#endif + // (Link included because of register-match) // (100.00%) https://decomp.me/scratch/0Ro0I u32 Coll_Player_PlatformCrumbling(Sprite *s, s32 sx, s32 sy, Player *p)