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..ef7ae85f 100644 --- a/include/entity.h +++ b/include/entity.h @@ -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; 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)