summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornotyourav <65437533+notyourav@users.noreply.github.com>2021-12-27 21:30:03 -0800
committerGitHub <noreply@github.com>2021-12-27 21:30:03 -0800
commitd8dfff5de93387a6a8a77ea9e7bdbd53b6ff9500 (patch)
tree0a8ef45048e01091415348e57df4b0e6318eb0dd
parent5b84008265fb7bfd997e8df35301a7d95fd8845d (diff)
parent9dac4f766060ff430c84966e0e5f874d1c2d1bbd (diff)
Merge pull request #224 from hatal175/collision
Improve nonmatching state in collision.c
-rw-r--r--asm/non_matching/arm_proxy/sub_0801766C.inc68
-rw-r--r--asm/non_matching/arm_proxy/sub_080176E4.inc54
-rw-r--r--asm/non_matching/collision/sub_08017CBC.inc57
-rw-r--r--asm/non_matching/collision/sub_0801802C.inc75
-rw-r--r--include/entity.h5
-rw-r--r--src/collision.c56
6 files changed, 33 insertions, 282 deletions
diff --git a/asm/non_matching/arm_proxy/sub_0801766C.inc b/asm/non_matching/arm_proxy/sub_0801766C.inc
deleted file mode 100644
index 239a6506..00000000
--- a/asm/non_matching/arm_proxy/sub_0801766C.inc
+++ /dev/null
@@ -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
diff --git a/asm/non_matching/arm_proxy/sub_080176E4.inc b/asm/non_matching/arm_proxy/sub_080176E4.inc
deleted file mode 100644
index e8a48278..00000000
--- a/asm/non_matching/arm_proxy/sub_080176E4.inc
+++ /dev/null
@@ -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
diff --git a/asm/non_matching/collision/sub_08017CBC.inc b/asm/non_matching/collision/sub_08017CBC.inc
deleted file mode 100644
index 470a013e..00000000
--- a/asm/non_matching/collision/sub_08017CBC.inc
+++ /dev/null
@@ -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
diff --git a/asm/non_matching/collision/sub_0801802C.inc b/asm/non_matching/collision/sub_0801802C.inc
deleted file mode 100644
index 2e766839..00000000
--- a/asm/non_matching/collision/sub_0801802C.inc
+++ /dev/null
@@ -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
diff --git a/include/entity.h b/include/entity.h
index 43c3b721..ecea4a9d 100644
--- a/include/entity.h
+++ b/include/entity.h
@@ -95,8 +95,9 @@ typedef struct Entity_ {
/*0x26*/ u8 spriteAnimation[3];
/*0x29*/ struct {
/* */ u8 b0 : 3; // 1-4
- /* */ u8 b1 : 3; // 8
- /* */ u8 b2 : 2; //0x40
+ /* */ u8 b1 : 3; // 8
+ /* */ u8 b2 : 1; // 0x40
+ /* */ u8 b3 : 1; // 0x80
/* */ } PACKED spritePriority;
/*0x2a*/ u16 collisions;
/*0x2c*/ union SplitWord x;
diff --git a/src/collision.c b/src/collision.c
index 3dac2783..7c3fc4d0 100644
--- a/src/collision.c
+++ b/src/collision.c
@@ -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)