mirror of https://github.com/zeldaret/tmc.git
Improve nonmatching state in collision.c
This commit is contained in:
parent
60e74d1ba9
commit
9efd8da104
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Reference in New Issue