From a04079708edbefbe43d03adf83aeb79349423758 Mon Sep 17 00:00:00 2001 From: Tal Hayon Date: Thu, 28 Jul 2022 19:25:12 +0300 Subject: [PATCH] Match CalculateEntityTileCollisions --- .../CalculateEntityTileCollisions.inc | 288 ------------------ src/movement.c | 138 +++++---- 2 files changed, 72 insertions(+), 354 deletions(-) delete mode 100644 asm/non_matching/movement/CalculateEntityTileCollisions.inc diff --git a/asm/non_matching/movement/CalculateEntityTileCollisions.inc b/asm/non_matching/movement/CalculateEntityTileCollisions.inc deleted file mode 100644 index 4c7223d6..00000000 --- a/asm/non_matching/movement/CalculateEntityTileCollisions.inc +++ /dev/null @@ -1,288 +0,0 @@ - .syntax unified - push {r4, r5, r6, r7, lr} - mov r7, sl - mov r6, sb - mov r5, r8 - push {r5, r6, r7} - sub sp, #0x18 - str r0, [sp] - str r1, [sp, #4] - adds r4, r2, #0 - adds r0, #0x38 - ldrb r0, [r0] - bl GetLayerByIndex - ldr r1, _080AE624 @ =0x00002004 - adds r5, r0, r1 - ldr r2, [sp] - ldr r2, [r2, #0x48] - str r2, [sp, #8] - ldr r0, [sp] - movs r2, #0x2e - ldrsh r1, [r0, r2] - ldr r2, [sp, #8] - movs r0, #0 - ldrsb r0, [r2, r0] - adds r1, r1, r0 - str r1, [sp, #0xc] - ldr r0, [sp] - movs r2, #0x32 - ldrsh r1, [r0, r2] - ldr r2, [sp, #8] - movs r0, #1 - ldrsb r0, [r2, r0] - adds r1, r1, r0 - mov sl, r1 - ldrb r0, [r2, #2] - mov sb, r0 - ldrb r1, [r2, #3] - mov r8, r1 - movs r0, #0xf - ldr r2, [sp, #4] - ands r0, r2 - cmp r0, #0 - beq _080AE65C - cmp r2, #0xf - bhi _080AE628 - ldr r7, [sp, #0xc] - add r7, sb - adds r0, r5, #0 - adds r1, r7, #0 - mov r2, sl - adds r3, r4, #0 - bl IsTileCollision - adds r6, r0, #0 - lsls r6, r6, #1 - mov r2, sl - add r2, r8 - adds r0, r5, #0 - adds r1, r7, #0 - adds r3, r4, #0 - bl IsTileCollision - orrs r6, r0 - lsls r6, r6, #1 - mov r0, sl - mov r1, r8 - subs r2, r0, r1 - adds r0, r5, #0 - adds r1, r7, #0 - adds r3, r4, #0 - bl IsTileCollision - orrs r6, r0 - lsls r6, r6, #6 - b _080AE6D2 - .align 2, 0 -_080AE624: .4byte 0x00002004 -_080AE628: - ldr r2, [sp, #0xc] - mov r0, sb - subs r7, r2, r0 - adds r0, r5, #0 - adds r1, r7, #0 - mov r2, sl - adds r3, r4, #0 - bl IsTileCollision - adds r6, r0, #0 - lsls r6, r6, #1 - mov r2, sl - add r2, r8 - adds r0, r5, #0 - adds r1, r7, #0 - adds r3, r4, #0 - bl IsTileCollision - orrs r6, r0 - lsls r6, r6, #1 - mov r1, sl - mov r0, r8 - subs r2, r1, r0 - adds r0, r5, #0 - adds r1, r7, #0 - b _080AE6C8 -_080AE65C: - ldr r7, [sp, #0xc] - add r7, sb - adds r0, r5, #0 - adds r1, r7, #0 - mov r2, sl - adds r3, r4, #0 - bl IsTileCollision - adds r6, r0, #0 - lsls r6, r6, #1 - mov r1, sl - add r1, r8 - str r1, [sp, #0x10] - adds r0, r5, #0 - adds r1, r7, #0 - ldr r2, [sp, #0x10] - adds r3, r4, #0 - bl IsTileCollision - orrs r6, r0 - lsls r6, r6, #1 - mov r2, sl - mov r0, r8 - subs r2, r2, r0 - mov r8, r2 - adds r0, r5, #0 - adds r1, r7, #0 - adds r3, r4, #0 - bl IsTileCollision - orrs r6, r0 - lsls r6, r6, #2 - ldr r1, [sp, #0xc] - mov r2, sb - subs r7, r1, r2 - adds r0, r5, #0 - adds r1, r7, #0 - mov r2, sl - adds r3, r4, #0 - bl IsTileCollision - orrs r6, r0 - lsls r6, r6, #1 - adds r0, r5, #0 - adds r1, r7, #0 - ldr r2, [sp, #0x10] - adds r3, r4, #0 - bl IsTileCollision - orrs r6, r0 - lsls r6, r6, #1 - adds r0, r5, #0 - adds r1, r7, #0 - mov r2, r8 -_080AE6C8: - adds r3, r4, #0 - bl IsTileCollision - orrs r6, r0 - lsls r6, r6, #2 -_080AE6D2: - ldr r0, [sp, #8] - ldrb r0, [r0, #4] - mov sb, r0 - ldr r1, [sp, #8] - ldrb r1, [r1, #5] - mov r8, r1 - ldr r2, [sp, #4] - subs r2, #8 - str r2, [sp, #4] - movs r0, #0xf - ands r0, r2 - cmp r0, #0 - beq _080AE760 - cmp r2, #0xf - bhi _080AE72C - mov r7, sl - add r7, r8 - adds r0, r5, #0 - ldr r1, [sp, #0xc] - adds r2, r7, #0 - adds r3, r4, #0 - bl IsTileCollision - orrs r6, r0 - lsls r6, r6, #1 - ldr r1, [sp, #0xc] - add r1, sb - adds r0, r5, #0 - adds r2, r7, #0 - adds r3, r4, #0 - bl IsTileCollision - orrs r6, r0 - lsls r6, r6, #1 - ldr r0, [sp, #0xc] - mov r2, sb - subs r1, r0, r2 - adds r0, r5, #0 - adds r2, r7, #0 - adds r3, r4, #0 - bl IsTileCollision - orrs r6, r0 - lsls r6, r6, #5 - b _080AE7D6 -_080AE72C: - mov r0, sl - mov r1, r8 - subs r7, r0, r1 - lsls r6, r6, #4 - adds r0, r5, #0 - ldr r1, [sp, #0xc] - adds r2, r7, #0 - adds r3, r4, #0 - bl IsTileCollision - orrs r6, r0 - lsls r6, r6, #1 - ldr r1, [sp, #0xc] - add r1, sb - adds r0, r5, #0 - adds r2, r7, #0 - adds r3, r4, #0 - bl IsTileCollision - orrs r6, r0 - lsls r6, r6, #1 - ldr r2, [sp, #0xc] - mov r0, sb - subs r1, r2, r0 - adds r0, r5, #0 - b _080AE7CA -_080AE760: - mov r7, sl - add r7, r8 - adds r0, r5, #0 - ldr r1, [sp, #0xc] - adds r2, r7, #0 - adds r3, r4, #0 - bl IsTileCollision - orrs r6, r0 - lsls r6, r6, #1 - ldr r1, [sp, #0xc] - add r1, sb - str r1, [sp, #0x14] - adds r0, r5, #0 - adds r2, r7, #0 - adds r3, r4, #0 - bl IsTileCollision - orrs r6, r0 - lsls r6, r6, #1 - ldr r2, [sp, #0xc] - mov r0, sb - subs r2, r2, r0 - mov sb, r2 - adds r0, r5, #0 - mov r1, sb - adds r2, r7, #0 - adds r3, r4, #0 - bl IsTileCollision - orrs r6, r0 - lsls r6, r6, #2 - mov r1, sl - mov r2, r8 - subs r7, r1, r2 - adds r0, r5, #0 - ldr r1, [sp, #0xc] - adds r2, r7, #0 - adds r3, r4, #0 - bl IsTileCollision - orrs r6, r0 - lsls r6, r6, #1 - adds r0, r5, #0 - ldr r1, [sp, #0x14] - adds r2, r7, #0 - adds r3, r4, #0 - bl IsTileCollision - orrs r6, r0 - lsls r6, r6, #1 - adds r0, r5, #0 - mov r1, sb -_080AE7CA: - adds r2, r7, #0 - adds r3, r4, #0 - bl IsTileCollision - orrs r6, r0 - lsls r6, r6, #1 -_080AE7D6: - ldr r0, [sp] - strh r6, [r0, #0x2a] - add sp, #0x18 - pop {r3, r4, r5} - mov r8, r3 - mov sb, r4 - mov sl, r5 - pop {r4, r5, r6, r7, pc} - .align 2, 0 - .syntax divided diff --git a/src/movement.c b/src/movement.c index 87c70b0c..62b76406 100644 --- a/src/movement.c +++ b/src/movement.c @@ -1603,92 +1603,98 @@ bool32 IsTileCollision(const u8* collisionData, s32 x, s32 y, u32 collisionType) return FALSE; } -ASM_FUNC("asm/non_matching/movement/CalculateEntityTileCollisions.inc", - void CalculateEntityTileCollisions(Entity* this, u32 direction, u32 collisionType)) -/*NONMATCH("asm/non_matching/movement/CalculateEntityTileCollisions.inc", - void CalculateEntityTileCollisions(Entity* this, u32 direction, u32 collisionType)) { +void CalculateEntityTileCollisions(Entity* this, u32 direction, u32 collisionType) { u8* layer; - u32 colResult; - + Hitbox* hb; s32 xMin; - s32 xVar1; - s32 xVar2; - s32 yMin; - s32 yVar1; - s32 yVar2; - - bool32 col1; - bool32 col2; - bool32 col3; - bool32 col4; - bool32 col5; - bool32 col6; - + s32 temp; u32 hitboxUnkX; u32 hitboxUnkY; layer = GetLayerByIndex(this->collisionLayer)->collisionData; - xMin = this->x.HALF.HI + this->hitbox->offset_x; - yMin = this->y.HALF.HI + this->hitbox->offset_y; - hitboxUnkX = this->hitbox->unk2[0]; - hitboxUnkY = this->hitbox->unk2[1]; + hb = this->hitbox; + xMin = this->x.HALF.HI + hb->offset_x; + yMin = this->y.HALF.HI + hb->offset_y; + hitboxUnkX = hb->unk2[0]; + hitboxUnkY = hb->unk2[1]; if ((direction & 0xf) != 0) { if (0xf >= direction) { - col1 = IsTileCollision(layer, xMin + hitboxUnkX, yMin, collisionType); - col2 = IsTileCollision(layer, xMin + hitboxUnkX, yMin + hitboxUnkY, collisionType); - col3 = IsTileCollision(layer, xMin + hitboxUnkX, yMin - hitboxUnkY, collisionType); - colResult = ((col1 << 1 | col2) << 1 | col3) << 6; + temp = xMin + hitboxUnkX; + colResult = IsTileCollision(layer, temp, yMin, collisionType); + colResult <<= 1; + colResult |= IsTileCollision(layer, temp, yMin + hitboxUnkY, collisionType); + colResult <<= 1; + colResult |= IsTileCollision(layer, temp, yMin - hitboxUnkY, collisionType); + colResult <<= 6; } else { - col1 = IsTileCollision(layer, xMin - hitboxUnkX, yMin, collisionType); - col2 = IsTileCollision(layer, xMin - hitboxUnkX, yMin + hitboxUnkY, collisionType); - colResult = col1 << 1 | col2; - col3 = IsTileCollision(layer, xMin - hitboxUnkX, yMin - hitboxUnkY, collisionType); - colResult = (colResult << 1 | col3) << 2; + temp = xMin - hitboxUnkX; + colResult = IsTileCollision(layer, temp, yMin, collisionType); + colResult <<= 1; + colResult |= IsTileCollision(layer, temp, yMin + hitboxUnkY, collisionType); + colResult <<= 1; + colResult |= IsTileCollision(layer, temp, yMin - hitboxUnkY, collisionType); + colResult <<= 2; } } else { - col1 = IsTileCollision(layer, xMin + hitboxUnkX, yMin, collisionType); - col2 = IsTileCollision(layer, xMin + hitboxUnkX, yMin + hitboxUnkY, collisionType); - col3 = IsTileCollision(layer, xMin + hitboxUnkX, yMin - hitboxUnkY, collisionType); - col4 = IsTileCollision(layer, xMin - hitboxUnkX, yMin, collisionType); - col5 = IsTileCollision(layer, xMin - hitboxUnkX, yMin + hitboxUnkY, collisionType); - colResult = (((col1 << 1 | col2) << 1 | col3) << 2 | col4) << 1 | col5; - col6 = IsTileCollision(layer, xMin - hitboxUnkX, yMin - hitboxUnkY, collisionType); - colResult = (colResult << 1 | col6) << 2; + temp = xMin + hitboxUnkX; + colResult = IsTileCollision(layer, temp, yMin, collisionType); + colResult <<= 1; + colResult |= IsTileCollision(layer, temp, yMin + hitboxUnkY, collisionType); + colResult <<= 1; + colResult |= IsTileCollision(layer, temp, yMin - hitboxUnkY, collisionType); + colResult <<= 2; + temp = xMin - hitboxUnkX; + colResult |= IsTileCollision(layer, temp, yMin, collisionType); + colResult <<= 1; + colResult |= IsTileCollision(layer, temp, yMin + hitboxUnkY, collisionType); + colResult <<= 1; + colResult |= IsTileCollision(layer, temp, yMin - hitboxUnkY, collisionType); + colResult <<= 2; } - hitboxUnkX = this->hitbox->unk2[2]; - hitboxUnkY = this->hitbox->unk2[3]; + hitboxUnkX = hb->unk2[2]; + hitboxUnkY = hb->unk2[3]; - if (((direction - 8) & 0xf) == 0) { - col1 = IsTileCollision(layer, xMin, yMin + hitboxUnkY, collisionType); - col2 = IsTileCollision(layer, xMin + hitboxUnkX, yMin + hitboxUnkY, collisionType); - col3 = IsTileCollision(layer, xMin - hitboxUnkX, yMin + hitboxUnkY, collisionType); - yMin -= hitboxUnkY; - col4 = IsTileCollision(layer, xMin, yMin, collisionType); - col5 = IsTileCollision(layer, xMin + hitboxUnkX, yMin, collisionType); - colResult = ((((colResult | col1) << 1 | col2) << 1 | col3) << 2 | col4) << 1 | col5; - col6 = IsTileCollision(layer, xMin - hitboxUnkX, yMin, collisionType); - this->collisions = ((colResult << 1 | col6) << 1); - } else { - if (direction - 8 < 0x10) { - yMin += hitboxUnkY; - col1 = IsTileCollision(layer, xMin, yMin, collisionType); - col2 = IsTileCollision(layer, xMin + hitboxUnkX, yMin, collisionType); - col3 = IsTileCollision(layer, xMin - hitboxUnkX, yMin, collisionType); - this->collisions = ((((colResult | col1) << 1 | col2) << 1 | col3) << 5); + direction -= 8; + if (((direction)&0xf) != 0) { + if (direction < 0x10) { + temp = yMin + hitboxUnkY; + colResult |= IsTileCollision(layer, xMin, temp, collisionType); + colResult <<= 1; + colResult |= IsTileCollision(layer, xMin + hitboxUnkX, temp, collisionType); + colResult <<= 1; + colResult |= IsTileCollision(layer, xMin - hitboxUnkX, temp, collisionType); + colResult <<= 5; } else { - yMin -= hitboxUnkY; - col1 = IsTileCollision(layer, xMin, yMin, collisionType); - col2 = IsTileCollision(layer, xMin + hitboxUnkX, yMin, collisionType); - col6 = (colResult << 4 | col1) << 1 | col2; - colResult = IsTileCollision(layer, xMin - hitboxUnkX, yMin, collisionType); - this->collisions = ((col6 << 1 | colResult) << 1); + temp = yMin - hitboxUnkY; + colResult <<= 4; + colResult |= IsTileCollision(layer, xMin, temp, collisionType); + colResult <<= 1; + colResult |= IsTileCollision(layer, xMin + hitboxUnkX, temp, collisionType); + colResult <<= 1; + colResult |= IsTileCollision(layer, xMin - hitboxUnkX, temp, collisionType); + colResult <<= 1; } + } else { + temp = yMin + hitboxUnkY; + colResult |= IsTileCollision(layer, xMin, temp, collisionType); + colResult <<= 1; + colResult |= IsTileCollision(layer, xMin + hitboxUnkX, temp, collisionType); + colResult <<= 1; + colResult |= IsTileCollision(layer, xMin - hitboxUnkX, temp, collisionType); + colResult <<= 2; + temp = yMin - hitboxUnkY; + colResult |= IsTileCollision(layer, xMin, temp, collisionType); + colResult <<= 1; + colResult |= IsTileCollision(layer, xMin + hitboxUnkX, temp, collisionType); + colResult <<= 1; + colResult |= IsTileCollision(layer, xMin - hitboxUnkX, temp, collisionType); + colResult <<= 1; } + this->collisions = colResult; } -END_NONMATCH*/ bool32 ProcessMovementInternal(Entity* this, s32 radius, s32 direction, u32 collisionType) { static bool32 (*const gDirectionalMovementFunctions[])(Entity*, s32, s32, u32) = {