Match CalculateEntityTileCollisions

This commit is contained in:
Tal Hayon
2022-07-28 19:25:12 +03:00
parent c9f525a39c
commit a04079708e
2 changed files with 72 additions and 354 deletions
@@ -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
+72 -66
View File
@@ -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) = {