Improve nonmatching state in collision.c

This commit is contained in:
Tal Hayon 2021-12-28 05:27:27 +02:00
parent 60e74d1ba9
commit 9efd8da104
6 changed files with 34 additions and 283 deletions

View File

@ -1,68 +0,0 @@
.syntax unified
push {r4, lr}
adds r4, r0, #0
adds r3, r4, #0
adds r3, #0x29
ldrb r1, [r3]
movs r0, #0x40
ands r0, r1
cmp r0, #0
beq _08017682
_0801767E:
movs r0, #1
b _080176DE
_08017682:
ldr r2, _080176C0 @ =gUnk_03003C70
movs r0, #0x80
lsls r0, r0, #1
adds r1, r2, r0
cmp r1, r2
bls _080176DC
_0801768E:
ldr r0, [r2, #8]
cmp r0, #0
bne _080176D6
str r4, [r2, #8]
strb r0, [r2, #0xc]
ldrb r0, [r3]
movs r1, #0x40
orrs r0, r1
strb r0, [r3]
ldr r3, _080176C4 @ =gUnk_02018EA0
ldr r1, [r3]
ldrb r0, [r1, #0xc]
cmp r0, #0
beq _080176C8
_080176AA:
ldr r1, [r1, #4]
ldrb r0, [r1, #0xc]
cmp r0, #0
bne _080176AA
str r1, [r2, #4]
ldr r0, [r1]
str r0, [r2]
str r2, [r0, #4]
str r2, [r1]
b _0801767E
.align 2, 0
_080176C0: .4byte gUnk_03003C70
_080176C4: .4byte gUnk_02018EA0
_080176C8:
str r1, [r2, #4]
ldr r0, [r1]
str r0, [r2]
str r2, [r0, #4]
str r2, [r1]
str r2, [r3]
b _0801767E
_080176D6:
adds r2, #0x10
cmp r1, r2
bhi _0801768E
_080176DC:
movs r0, #0
_080176DE:
pop {r4}
pop {r1}
bx r1
.syntax divided

View File

@ -1,54 +0,0 @@
.syntax unified
push {lr}
adds r2, r0, #0
adds r0, #0x29
ldrb r1, [r0]
movs r0, #0x40
ands r0, r1
cmp r0, #0
beq _08017720
movs r0, #1
b _0801773A
_080176F8:
str r2, [r3, #8]
movs r0, #1
strb r0, [r3, #0xc]
adds r2, #0x29
ldrb r0, [r2]
movs r1, #0x40
orrs r0, r1
strb r0, [r2]
ldr r2, _0801771C @ =gUnk_02018EA0
ldr r0, [r2]
str r0, [r3, #4]
ldr r1, [r0]
str r1, [r3]
str r3, [r1, #4]
str r3, [r0]
str r3, [r2]
movs r0, #1
b _0801773A
.align 2, 0
_0801771C: .4byte gUnk_02018EA0
_08017720:
ldr r3, _08017740 @ =gUnk_03003C70
movs r0, #0x80
lsls r0, r0, #1
adds r1, r3, r0
cmp r1, r3
bls _08017738
_0801772C:
ldr r0, [r3, #8]
cmp r0, #0
beq _080176F8
adds r3, #0x10
cmp r1, r3
bhi _0801772C
_08017738:
movs r0, #0
_0801773A:
pop {r1}
bx r1
.align 2, 0
_08017740: .4byte gUnk_03003C70
.syntax divided

View File

@ -1,57 +0,0 @@
.syntax unified
push {r4, r5, lr}
adds r4, r0, #0
adds r3, r1, #0
movs r5, #0x10
eors r2, r5
adds r0, r2, #0
subs r0, #0xc
movs r2, #0x1f
ands r0, r2
ldrb r1, [r3, #0x15]
subs r1, r1, r0
ands r1, r2
cmp r1, #0x18
bhi _08017CF0
adds r1, r4, #0
adds r1, #0x3d
movs r0, #0xf4
strb r0, [r1]
adds r1, r3, #0
adds r1, #0x3d
strb r0, [r1]
adds r0, r4, #0
adds r1, r3, #0
bl sub_08017940
b _08017D1E
_08017CF0:
adds r1, r3, #0
adds r1, #0x42
movs r0, #0xc
strb r0, [r1]
adds r0, r3, #0
adds r0, #0x3d
strb r5, [r0]
adds r1, #1
movs r0, #0xf0
strb r0, [r1]
adds r1, #3
movs r0, #0xc0
lsls r0, r0, #2
strh r0, [r1]
adds r1, r4, #0
adds r1, #0x3d
ldrb r2, [r1]
movs r0, #0
ldrsb r0, [r1, r0]
cmp r0, #0
bne _08017D1E
movs r0, #0xff
strb r0, [r1]
_08017D1E:
movs r0, #1
pop {r4, r5}
pop {r1}
bx r1
.align 2, 0
.syntax divided

View File

@ -1,75 +0,0 @@
.syntax unified
push {r4, r5, r6, lr}
adds r4, r0, #0
adds r5, r1, #0
adds r6, r2, #0
ldrb r0, [r4, #8]
cmp r0, #1
bne _08018058
bl sub_08079F8C
cmp r0, #0
beq _08018090
movs r0, #0x10
eors r0, r6
ldrb r1, [r5, #0x14]
lsls r1, r1, #2
subs r0, r0, r1
adds r0, #5
movs r1, #0x1f
ands r0, r1
cmp r0, #0xa
bhi _08018090
b _0801807A
_08018058:
cmp r0, #8
bne _08018086
ldrb r0, [r4, #0x15]
movs r1, #0x10
eors r1, r0
ldrb r0, [r5, #0x14]
lsls r0, r0, #2
subs r1, r1, r0
adds r1, #5
movs r0, #0x1f
ands r1, r0
cmp r1, #0xa
bgt _08018090
adds r1, r4, #0
adds r1, #0x45
movs r0, #0
strb r0, [r1]
_0801807A:
adds r0, r4, #0
adds r1, r5, #0
bl sub_080180BC
movs r0, #1
b _080180AE
_08018086:
adds r1, r4, #0
adds r1, #0x45
movs r0, #0
strb r0, [r1]
b _080180AE
_08018090:
adds r0, r4, #0
adds r0, #0x40
ldrb r0, [r0]
ldr r1, _080180B4 @ =0x000011AA
adds r0, r0, r1
lsls r3, r0, #1
adds r3, r3, r0
lsls r3, r3, #2
ldr r0, _080180B8 @ =gCollisionMtx
adds r3, r3, r0
adds r0, r4, #0
adds r1, r5, #0
adds r2, r6, #0
bl sub_08018308
_080180AE:
pop {r4, r5, r6}
pop {r1}
bx r1
.align 2, 0
_080180B4: .4byte 0x000011AA
_080180B8: .4byte gCollisionMtx
.syntax divided

View File

@ -94,9 +94,10 @@ typedef struct Entity_ {
/*0x24*/ s16 speed;
/*0x26*/ u8 spriteAnimation[3];
/*0x29*/ struct {
/* */ u8 b0 : 3; // 1-4
/* */ u8 b1 : 3; // 8
/* */ u8 b2 : 2; //0x40
/* */ u8 b0 : 3; // 0-2
/* */ u8 b1 : 3; // 3-5
/* */ u8 b2 : 1; // 6
/* */ u8 b3 : 1; // 7
/* */ } PACKED spritePriority;
/*0x2a*/ u16 collisions;
/*0x2c*/ union SplitWord x;

View File

@ -83,19 +83,19 @@ void RegisterPlayerHitbox(void) {
gUnk_03003C70[0].node = &gPlayerEntity;
}
// Loop declaration seems wrong
NONMATCH("asm/non_matching/arm_proxy/sub_0801766C.inc", u32 sub_0801766C(Entity* this)) {
u32 sub_0801766C(Entity* this) {
u32 uVar1;
LinkedList2* puVar3;
LinkedList2* puVar2;
LinkedList2* pLVar2;
LinkedList2* i;
LinkedList2* end;
u8* pbVar4;
if (this->spritePriority.b2 != 0) {
return 1;
} else {
for (i = &gUnk_03003C70[0]; i < &gUnk_03003C70[16]; ++i) {
for (i = gUnk_03003C70, end = gUnk_03003C70 + 16; end > i; ++i) {
if (i->node == NULL) {
i->node = this;
i->flags = 0;
@ -124,19 +124,18 @@ NONMATCH("asm/non_matching/arm_proxy/sub_0801766C.inc", u32 sub_0801766C(Entity*
return 0;
}
}
END_NONMATCH
// same loop issue
NONMATCH("asm/non_matching/arm_proxy/sub_080176E4.inc", u32 sub_080176E4(Entity* this)) {
u32 sub_080176E4(Entity* this) {
u32 uVar1;
LinkedList2* j;
LinkedList2* i;
LinkedList2* end;
u8* pbVar4;
if (this->spritePriority.b2 != 0) {
return 1;
} else {
for (i = &gUnk_03003C70[0]; i < &gUnk_03003C70[16]; ++i) {
for (i = gUnk_03003C70, end = gUnk_03003C70 + 16; end > i; ++i) {
if (i->node == NULL) {
i->node = this;
i->flags = 1;
@ -153,12 +152,15 @@ NONMATCH("asm/non_matching/arm_proxy/sub_080176E4.inc", u32 sub_080176E4(Entity*
return 0;
}
}
END_NONMATCH
// you guessed it
// Several issues:
// 1. b2 mask value is set before the loop even begins
// 2. data is allocated mid function
// 3. regalloc
NONMATCH("asm/non_matching/arm_proxy/sub_08017744.inc", void sub_08017744(Entity* this)) {
LinkedList2* i;
for (i = &gUnk_03003C70[0]; i < &gUnk_03003C70[16]; ++i) {
LinkedList2* end;
for (i = gUnk_03003C70, end = gUnk_03003C70 + 16; end > i; ++i) {
if (i->node == this) {
if (this->spritePriority.b2 != 0) {
this->spritePriority.b2 = 0;
@ -179,17 +181,17 @@ NONMATCH("asm/non_matching/arm_proxy/sub_080177A0.inc", bool32 sub_080177A0(Enti
u32 this_d;
u32 depth;
if ((that->collisionLayer & this->collisionLayer) != 0) {
if ((this->collisionLayer & that->collisionLayer) != 0) {
Hitbox* bb_this = this->hitbox;
Hitbox* bb_that = that->hitbox;
u32 this_w = bb_this->width;
u32 that_w = bb_that->width;
if ((((this->x.HALF.HI - that->x.HALF.HI) + bb_this->offset_x) - bb_that->offset_x) + this_w + that_w <=
(this_w + that_w) * 2) {
u32 sumw = this_w + that_w;
if ((((this->x.HALF.HI - that->x.HALF.HI) + bb_this->offset_x) - bb_that->offset_x) + sumw <= (sumw)*2) {
u32 this_h = bb_this->height;
u32 that_h = bb_that->height;
if ((((this->y.HALF.HI - that->y.HALF.HI) + bb_this->offset_y) - bb_that->offset_y) + this_h + that_h <=
(this_h + that_h) * 2) {
u32 sumh = this_h + that_h;
if ((((this->y.HALF.HI - that->y.HALF.HI) + bb_this->offset_y) - bb_that->offset_y) + sumh <= (sumh)*2) {
if ((this->field_0x3c & 0x10) != 0)
this_d = ((Hitbox3D*)bb_this)->depth;
else
@ -424,9 +426,9 @@ s32 sub_08017C40(Entity* org, Entity* tgt, u32 direction, ColSettings* settings)
return 1;
}
NONMATCH("asm/non_matching/collision/sub_08017CBC.inc",
s32 sub_08017CBC(Entity* org, Entity* tgt, u32 direction, ColSettings* settings)) {
if (((-(((direction ^ 0x10) - 0xc) & 0x1f) + tgt->direction) & 0x1f) < 0x19) {
s32 sub_08017CBC(Entity* org, Entity* tgt, u32 direction, ColSettings* settings) {
direction = ((direction ^ 0x10) - 0xc) & 0x1f;
if (((-direction + tgt->direction) & 0x1f) < 0x19) {
org->iframes = -12;
tgt->iframes = -12;
sub_08017940(org, tgt);
@ -440,7 +442,6 @@ NONMATCH("asm/non_matching/collision/sub_08017CBC.inc",
}
return 1;
}
END_NONMATCH
s32 sub_08017D28(Entity* org, Entity* tgt, u32 direction, ColSettings* settings) {
gPlayerState.field_0x1a[0] = 1;
@ -565,19 +566,22 @@ s32 sub_08017F40(Entity* org, Entity* tgt, u32 direction, ColSettings* settings)
return 0;
}
// inverted branch
NONMATCH("asm/non_matching/collision/sub_0801802C.inc",
s32 sub_0801802C(Entity* org, Entity* tgt, u32 direction, ColSettings* settings)) {
s32 sub_0801802C(Entity* org, Entity* tgt, u32 direction, ColSettings* settings) {
int kind;
ColSettings* p;
u32 x;
kind = org->kind;
if (kind == 1) {
if (sub_08079F8C() && (((direction ^ 0x10) - 4 * tgt->animationState + 5) & 0x1Fu) <= 0xA)
goto _0801807A;
if (sub_08079F8C()) {
if (((((direction ^ 0x10) - 4 * tgt->animationState + 5) & 0x1F)) > 0xA) {
goto _08018090;
} else {
goto _0801807A;
}
}
} else if (kind == 8) {
if ((((org->direction ^ 0x10) - 4 * tgt->animationState + 5) & 0x1Fu) <= 0xA) {
if ((((org->direction ^ 0x10) - 4 * tgt->animationState + 5) & 0x1F) <= 0xA) {
org->health = 0;
_0801807A:
sub_080180BC(org, tgt);
@ -587,10 +591,10 @@ NONMATCH("asm/non_matching/collision/sub_0801802C.inc",
org->health = 0;
return 0;
}
_08018090:
x = 0x11aa;
return sub_08018308(org, tgt, direction, &gCollisionMtx[x + org->hurtType]);
}
END_NONMATCH
void sub_080180BC(Entity* org, Entity* tgt) {
if (org->iframes == 0)