diff --git a/asm/non_matching/npc5/sub_08060FD0.inc b/asm/non_matching/npc5/sub_08060FD0.inc deleted file mode 100644 index a86ce611..00000000 --- a/asm/non_matching/npc5/sub_08060FD0.inc +++ /dev/null @@ -1,103 +0,0 @@ - .syntax unified - .text - - push {r4, r5, r6, r7, lr} - mov r7, sl - mov r6, sb - mov r5, r8 - push {r5, r6, r7} - sub sp, #8 - adds r4, r0, #0 - mov sb, r1 - mov r8, r2 - movs r0, #0x2e - ldrsh r7, [r4, r0] - movs r1, #0x32 - ldrsh r6, [r4, r1] - mov r2, sb - subs r0, r2, r7 - mov r5, r8 - subs r1, r5, r6 - bl sub_080045DA - lsls r7, r7, #8 - lsls r6, r6, #8 - ldr r3, _08061058 @ =gSineTable - lsls r1, r0, #1 - adds r1, r1, r3 - movs r5, #0 - ldrsh r2, [r1, r5] - lsls r1, r2, #1 - adds r1, r1, r2 - lsls r1, r1, #1 - str r1, [sp] - adds r0, #0x40 - lsls r0, r0, #1 - adds r0, r0, r3 - movs r2, #0 - ldrsh r1, [r0, r2] - lsls r0, r1, #1 - adds r0, r0, r1 - lsls r0, r0, #1 - str r0, [sp, #4] - adds r4, #0x38 - ldrb r0, [r4] - ldr r5, _0806105C @ =gUnk_0200D654 - mov sl, r5 - cmp r0, #2 - beq _0806102E - ldr r0, _08061060 @ =gUnk_02027EB4 - mov sl, r0 -_0806102E: - adds r1, r7, #0 - cmp r7, #0 - bge _08061036 - adds r1, #0xff -_08061036: - asrs r5, r1, #8 - adds r2, r6, #0 - cmp r6, #0 - bge _08061040 - adds r2, #0xff -_08061040: - asrs r4, r2, #8 - mov r0, sl - adds r1, r5, #0 - adds r2, r4, #0 - movs r3, #6 - bl IsTileCollision - cmp r0, #0 - beq _08061064 - movs r0, #0 - b _08061084 - .align 2, 0 -_08061058: .4byte gSineTable -_0806105C: .4byte gUnk_0200D654 -_08061060: .4byte gUnk_02027EB4 -_08061064: - mov r1, sb - subs r0, r1, r5 - adds r0, #6 - cmp r0, #0xc - bhi _08061078 - mov r2, r8 - subs r0, r2, r4 - adds r0, #6 - cmp r0, #0xc - bls _08061082 -_08061078: - ldr r5, [sp] - adds r7, r7, r5 - ldr r0, [sp, #4] - subs r6, r6, r0 - b _0806102E -_08061082: - movs r0, #1 -_08061084: - add sp, #8 - pop {r3, r4, r5} - mov r8, r3 - mov sb, r4 - mov sl, r5 - pop {r4, r5, r6, r7, pc} - - .syntax divided diff --git a/asm/non_matching/npc5/sub_08061170.inc b/asm/non_matching/npc5/sub_08061170.inc deleted file mode 100644 index 566b0b23..00000000 --- a/asm/non_matching/npc5/sub_08061170.inc +++ /dev/null @@ -1,52 +0,0 @@ - .syntax unified - .text - - push {r4, r5, lr} - adds r4, r0, #0 - bl UpdateAnimationSingleFrame - adds r0, r4, #0 - bl ProcessMovement6 - cmp r0, #0 - bne _080611CA - adds r0, r4, #0 - bl sub_080611D4 - adds r5, r0, #0 - cmp r5, #0xff - beq _080611C6 - movs r0, #6 - strb r0, [r4, #0xc] - adds r0, r4, #0 - movs r1, #1 - bl sub_08079FD4 - lsls r0, r0, #4 - subs r0, #4 - lsls r0, r0, #0xc - str r0, [r4, #0x20] - movs r1, #0x80 - lsls r1, r1, #1 - strh r1, [r4, #0x24] - strb r5, [r4, #0x15] - lsrs r1, r5, #2 - strb r1, [r4, #0x14] - lsrs r0, r0, #0x10 - cmp r0, #0 - beq _080611BE - adds r0, r4, #0 - movs r1, #0x14 - bl sub_08060E70 - b _080611C6 -_080611BE: - adds r0, r4, #0 - movs r1, #0x18 - bl sub_08060E70 -_080611C6: - movs r0, #0 - b _080611D2 -_080611CA: - adds r0, r4, #0 - bl sub_08016AD2 - movs r0, #1 -_080611D2: - pop {r4, r5, pc} - - .syntax divided diff --git a/asm/non_matching/npc5/sub_08061358.inc b/asm/non_matching/npc5/sub_08061358.inc deleted file mode 100644 index fa9f4f14..00000000 --- a/asm/non_matching/npc5/sub_08061358.inc +++ /dev/null @@ -1,138 +0,0 @@ - .syntax unified - .text - - push {r4, r5, r6, lr} - adds r4, r0, #0 - ldrb r5, [r4, #0xd] - cmp r5, #1 - beq _0806139C - cmp r5, #1 - bgt _0806136C - cmp r5, #0 - beq _08061376 - b _08061460 -_0806136C: - cmp r5, #2 - beq _080613D0 - cmp r5, #3 - beq _0806141E - b _08061460 -_08061376: - adds r0, r4, #0 - bl UpdateAnimationSingleFrame - adds r0, r4, #0 - adds r0, #0x5a - ldrb r1, [r0] - movs r0, #0x80 - ands r0, r1 - cmp r0, #0 - beq _08061460 - movs r0, #1 - strb r0, [r4, #0xd] - movs r0, #0xf - strb r0, [r4, #0xe] - adds r0, r4, #0 - movs r1, #0 - bl sub_08060E70 - b _08061460 -_0806139C: - ldrb r0, [r4, #0xe] - subs r0, #1 - strb r0, [r4, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _08061460 - bl Random - adds r6, r0, #0 - ands r5, r6 - cmp r5, #0 - beq _080613FA - movs r0, #2 - strb r0, [r4, #0xd] - ldr r3, _080613CC @ =gUnk_0810AC5D - ldrb r0, [r4, #0x14] - lsls r0, r0, #1 - lsrs r1, r6, #4 - movs r2, #3 - ands r1, r2 - adds r0, r0, r1 - adds r0, r0, r3 - b _0806143A - .align 2, 0 -_080613CC: .4byte gUnk_0810AC5D -_080613D0: - adds r0, r4, #0 - bl UpdateAnimationSingleFrame - adds r0, r4, #0 - adds r0, #0x5a - ldrb r1, [r0] - movs r0, #0x80 - ands r0, r1 - cmp r0, #0 - beq _08061460 - movs r0, #0x18 - ands r0, r1 - lsrs r0, r0, #2 - strb r0, [r4, #0x14] - bl Random - adds r1, r0, #0 - movs r0, #1 - ands r1, r0 - cmp r1, #0 - beq _08061412 -_080613FA: - movs r0, #3 - strb r0, [r4, #0xd] - movs r0, #0x18 - ands r6, r0 - adds r0, r6, #0 - adds r0, #0x1e - strb r0, [r4, #0xe] - adds r0, r4, #0 - movs r1, #4 - bl sub_08060E70 - b _08061460 -_08061412: - strb r1, [r4, #0xd] - adds r0, r4, #0 - movs r1, #0x10 - bl sub_08060E70 - b _08061460 -_0806141E: - adds r0, r4, #0 - bl sub_08061170 - cmp r0, #0 - bne _08061448 - movs r0, #2 - strb r0, [r4, #0xd] - ldr r2, _08061444 @ =gUnk_0810AC5D - ldrb r0, [r4, #0x14] - lsls r0, r0, #1 - lsrs r1, r6, #4 - ands r1, r5 - adds r0, r0, r1 - adds r0, r0, r2 -_0806143A: - ldrb r1, [r0] - adds r0, r4, #0 - bl InitAnimationForceUpdate - b _08061460 - .align 2, 0 -_08061444: .4byte gUnk_0810AC5D -_08061448: - ldrb r0, [r4, #0xe] - subs r0, #1 - strb r0, [r4, #0xe] - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - cmp r0, #0 - bne _08061460 - strb r0, [r4, #0xd] - adds r0, r4, #0 - movs r1, #0x10 - bl sub_08060E70 -_08061460: - pop {r4, r5, r6, pc} - .align 2, 0 - - .syntax divided diff --git a/asm/non_matching/npc5/sub_08061B18.inc b/asm/non_matching/npc5/sub_08061B18.inc deleted file mode 100644 index 6ee68383..00000000 --- a/asm/non_matching/npc5/sub_08061B18.inc +++ /dev/null @@ -1,37 +0,0 @@ - .syntax unified - .text - - push {r4, lr} - adds r4, r0, #0 - adds r1, r4, #0 - adds r1, #0x39 - movs r0, #0 - ldrsb r0, [r1, r0] - cmp r0, #0 - beq _08061B54 - cmp r0, #1 - bne _08061B54 - movs r0, #0 - strb r0, [r1] - adds r0, r4, #0 - bl sub_08061AFC - ldr r2, [r4, #0x68] - ldrb r0, [r4, #0xe] - adds r1, r0, #1 - strb r1, [r4, #0xe] - lsls r0, r0, #0x18 - lsrs r0, r0, #0x17 - adds r2, r2, r0 - ldrh r0, [r2, #2] - cmp r0, #0 - bne _08061B4C - strb r0, [r4, #0xe] -_08061B4C: - ldrh r0, [r2] - adds r1, r4, #0 - bl MessageNoOverlap -_08061B54: - pop {r4, pc} - .align 2, 0 - - .syntax divided diff --git a/assets/assets.json b/assets/assets.json index 0b2fc082..fdd50ae9 100644 --- a/assets/assets.json +++ b/assets/assets.json @@ -35492,21 +35492,6 @@ "start": 1095262, "size": 2 }, - { - "path": "npc5/gUnk_0810AC4C.bin", - "start": 1092684, - "size": 8 - }, - { - "path": "npc5/gUnk_0810AC54.bin", - "start": 1092692, - "size": 9 - }, - { - "path": "npc5/gUnk_0810AC5D.bin", - "start": 1092701, - "size": 19 - }, { "path": "animations/gSpriteAnimations_Townsperson_0.bin", "start": 1096960, diff --git a/data/const/npc/npc5.s b/data/const/npc/npc5.s deleted file mode 100644 index ec175a99..00000000 --- a/data/const/npc/npc5.s +++ /dev/null @@ -1,34 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - .align 2 - -gUnk_0810AC1C:: @ 0810AC1C - .4byte sub_08060A00 - .4byte sub_08061AA0 - .4byte sub_08061AA8 - .4byte sub_08061B58 - -gUnk_0810AC2C:: @ 0810AC2C - .4byte sub_08060AE0 - .4byte sub_08060B5C - .4byte sub_08060BA0 - .4byte sub_08060D78 - .4byte sub_08060DD0 - .4byte sub_08060DF4 - .4byte sub_08060DFC - .4byte sub_08060E34 - -gUnk_0810AC4C:: @ 0810AC4C - .incbin "npc5/gUnk_0810AC4C.bin" - -gUnk_0810AC54:: @ 0810AC54 - .incbin "npc5/gUnk_0810AC54.bin" - -gUnk_0810AC5D:: @ 0810AC5D - .incbin "npc5/gUnk_0810AC5D.bin" - -gUnk_0810AC70:: @ 0810AC70 - .4byte sub_08061ACC - .4byte sub_08061B18 diff --git a/linker.ld b/linker.ld index 59ac6429..86a5f8e3 100644 --- a/linker.ld +++ b/linker.ld @@ -1188,7 +1188,7 @@ SECTIONS { data/animations/npc/forestMinish.o(.rodata); data/const/npc/postman.o(.rodata); data/animations/npc/postman.o(.rodata); - data/const/npc/npc5.o(.rodata); + src/npc/npc5.o(.rodata); data/animations/npc/npc5.o(.rodata); data/const/npc/townsperson.o(.rodata); data/animations/npc/townsperson.o(.rodata); diff --git a/src/npc/npc5.c b/src/npc/npc5.c index 7a72f32e..accc2716 100644 --- a/src/npc/npc5.c +++ b/src/npc/npc5.c @@ -2,10 +2,6 @@ #include "message.h" #include "npc.h" -extern void (*const gUnk_0810AC1C[])(Entity*); - -extern void (*const gUnk_0810AC2C[])(Entity*); - typedef struct { u8 unk_0; // u8 u8 unk_0b; // u8 @@ -34,8 +30,21 @@ void sub_08061120(Entity*, u32, u32, u32); bool32 sub_08061170(Entity*); void sub_08061358(Entity*); - void sub_08060E94(Entity*); +void sub_08060A00(Entity*); +void sub_08061AA0(Entity*); +void sub_08061AA8(Entity*); +void sub_08061B58(Entity*); +void sub_08060AE0(Entity*); +void sub_08060B5C(Entity*); +void sub_08060BA0(Entity*); +void sub_08060D78(Entity*); +void sub_08060DD0(Entity*); +void sub_08060DF4(Entity*); +void sub_08060DFC(Entity*); +void sub_08060E34(Entity*); +void sub_08061ACC(Entity*); +void sub_08061B18(Entity*); u32 PointInsideRadius(s32, s32, s32); @@ -46,14 +55,6 @@ u32 sub_080611D4(Entity*); extern u32 sub_08079FD4(Entity*, u32); extern void sub_08016AD2(Entity*); -extern struct { - s8 unk_0; - s8 unk_1; -} gUnk_0810AC4C[]; -extern u8 gUnk_0810AC54[8]; - -extern u8 gUnk_0810AC5D; - bool32 sub_08061630(Entity*, s32, s32, s32); bool32 sub_08061720(Entity*, s32, s32, s32); bool32 sub_080616A8(Entity*, s32, s32, s32); @@ -71,8 +72,6 @@ bool32 sub_080619F0(u8*, s32, s32, s32); bool32 sub_08061A48(u8*, s32, s32, s32); -extern void (*const gUnk_0810AC70[])(Entity*); - void sub_08061AFC(Entity*); extern u16* gUnk_0810B660[8]; @@ -91,10 +90,19 @@ void CreateZeldaFollower(void) { // UNUSED zelda follower, probably because it was too resource heavy void NPC5(Entity* this) { + static void (*const gUnk_0810AC1C[])(Entity*) = { + sub_08060A00, + sub_08061AA0, + sub_08061AA8, + sub_08061B58, + }; gUnk_0810AC1C[this->type](this); } void sub_08060A00(Entity* this) { + static void (*const Npc5_Actions[])(Entity*) = { + sub_08060AE0, sub_08060B5C, sub_08060BA0, sub_08060D78, sub_08060DD0, sub_08060DF4, sub_08060DFC, sub_08060E34, + }; u32 tmp; if ((gPlayerState.jump_status & 0x80) != 0) { @@ -108,7 +116,7 @@ void sub_08060A00(Entity* this) { } if ((this->action == 0) || (this->spriteSettings.draw != 0)) { - gUnk_0810AC2C[this->action](this); + Npc5_Actions[this->action](this); } if (this->action != 0) { @@ -351,7 +359,40 @@ u32 sub_08060F80(Entity* this) { return 0; } -ASM_FUNC("asm/non_matching/npc5/sub_08060FD0.inc", bool32 sub_08060FD0(Entity* this, u32 a, u32 b)) +bool32 sub_08060FD0(Entity* this, u32 a, u32 b) { + s32 sVar1; + s32 sVar2; + int iVar3; + int x; + int y; + u8* puVar8; + + x = this->x.HALF.HI; + y = this->y.HALF.HI; + iVar3 = sub_080045DA(a - x, b - y); + x <<= 8; + y <<= 8; + sVar1 = gSineTable[iVar3] * 6; + sVar2 = gSineTable[(iVar3 + 0x40)] * 6; + + if (this->collisionLayer != 2) { + puVar8 = gUnk_02027EB4; + } else { + puVar8 = gUnk_0200D654; + } + + while (1) { + if (IsTileCollision(puVar8, x / 0x100, y / 0x100, 6)) { + return 0; + } + if (((a - (x / 0x100)) + 6 >= 0xd) || ((b - (y / 0x100)) + 6 >= 0xd)) { + x += sVar1; + y -= sVar2; + continue; + } + return 1; + } +} void sub_08061090(Entity* this, u32 a, u32 b) { s32 xDist; @@ -389,7 +430,7 @@ void sub_08061120(Entity* this, u32 param_a, u32 param_b, u32 param_c) { } } -NONMATCH("asm/non_matching/npc5/sub_08061170.inc", bool32 sub_08061170(Entity* this)) { +bool32 sub_08061170(Entity* this) { u32 direction; u32 tmp; @@ -398,8 +439,10 @@ NONMATCH("asm/non_matching/npc5/sub_08061170.inc", bool32 sub_08061170(Entity* t direction = sub_080611D4(this); if (direction != 0xff) { this->action = 6; - tmp = (sub_08079FD4(this, 1) * 0x10 - 4); - // tmp <<= 0xc; + tmp = (sub_08079FD4(this, 1)); + tmp <<= 4; + tmp -= 4; + tmp = tmp << 0xc; this->zVelocity = tmp; this->speed = 0x100; this->direction = direction; @@ -416,16 +459,28 @@ NONMATCH("asm/non_matching/npc5/sub_08061170.inc", bool32 sub_08061170(Entity* t return TRUE; } } -END_NONMATCH u32 sub_080611D4(Entity* this) { - u32 uVar2; + static const struct { + s8 unk_0; + s8 unk_1; + } PACKED gUnk_0810AC4C[] = { + { 0, -8 }, + { 8, 0 }, + { 0, 3 }, + { -8, 0 }, + }; + static const u8 gUnk_0810AC54[] = { + 0x2b, 0x10, 0x2a, 0x0, 0x2d, 0x8, 0x2c, 0x18, 0x0, + }; + + u32 uVar2; u32 x; s32 a; s32 b; s8* ptr; - u8* ptr2; + const u8* ptr2; x = this->animationState & 6; ptr = (s8*)gUnk_0810AC4C; a = ptr[x]; @@ -487,13 +542,12 @@ u32 sub_08061230(Entity* this) { return 0; } -NONMATCH("asm/non_matching/npc5/sub_08061358.inc", void sub_08061358(Entity* this)) { +void sub_08061358(Entity* this) { + static const u8 gUnk_0810AC5D[] = { + 0x30, 0x31, 0x38, 0x39, 0x32, 0x33, 0x3a, 0x3b, 0x34, 0x35, 0x3c, 0x3d, 0x36, 0x37, 0x3e, 0x3f, 0x0, 0x0, 0x0, + }; u32 uVar2; - s32 iVar3; - u8 bVar4; - u32 unaff_r6; - - bVar4 = (u8)unaff_r6; + u32 bVar4; switch (this->subAction) { case 0: @@ -504,57 +558,54 @@ NONMATCH("asm/non_matching/npc5/sub_08061358.inc", void sub_08061358(Entity* thi this->subAction = 1; this->actionDelay = 0xf; sub_08060E70(this, 0); - return; + break; case 1: this->actionDelay -= 1; - asm("x"); if (this->actionDelay != 0) { return; } uVar2 = Random(); - // bVar4 = (u8)uVar2; - if ((uVar2 & 1) == 0) - goto _080613FA; + bVar4 = uVar2; + if ((uVar2 & 1) == 0) { + this->subAction = 3; + this->actionDelay = (bVar4 & 0x18) + 0x1e; + sub_08060E70(this, 4); + return; + } this->subAction = 2; - iVar3 = (u32)this->animationState * 2 + (uVar2 >> 4 & 3); - InitAnimationForceUpdate(this, (u32)(u8)(&gUnk_0810AC5D)[iVar3 + 1]); + InitAnimationForceUpdate(this, gUnk_0810AC5D[(u32)this->animationState * 2 + ((uVar2 >> 4) & 3)]); break; case 2: UpdateAnimationSingleFrame(this); if ((this->frame & 0x80) == 0) { return; } - this->animationState = (u8)(((u8)this->frame & 0x18) >> 2); - uVar2 = Random(); - if ((uVar2 & 1) == 0) { - this->subAction = 0; - sub_08060E70(this, 0x10); + this->animationState = ((this->frame & 0x18) >> 2); + if ((Random() & 1)) { + this->subAction = 3; + this->actionDelay = (bVar4 & 0x18) + 0x1e; + sub_08060E70(this, 4); return; } - _080613FA: - this->subAction = 3; - this->actionDelay = (bVar4 & 0x18) + 0x1e; - sub_08060E70(this, 4); - return; + this->subAction = 0; + sub_08060E70(this, 0x10); + break; case 3: - iVar3 = sub_08061170(this); - if (iVar3 != 0) { - this->subAction = this->actionDelay - 1; - this->actionDelay = this->subAction; - if (this->subAction != 0) { - return; - } - this->subAction = 0; - sub_08060E70(this, 0x10); + if (sub_08061170(this) == 0) { + this->subAction = 2; + + //! @bug bVar4 (r6) is uninitialized. + InitAnimationForceUpdate(this, gUnk_0810AC5D[this->animationState * 2 + (bVar4 >> 4 & 3)]); return; } - this->subAction = 2; - iVar3 = (u32)this->animationState * 2 + (unaff_r6 >> 4 & 3); - InitAnimationForceUpdate(this, (u32)(u8)(&gUnk_0810AC5D)[iVar3 + 1]); + if (--this->actionDelay != 0) { + return; + } + this->subAction = 0; + sub_08060E70(this, 0x10); break; } } -END_NONMATCH void sub_08061464(Entity* this, u32 param_a, u32 param_b) { s32 iVar10; @@ -808,11 +859,15 @@ bool32 sub_08061A74(u8* layer, s32 x, s32 y, s32 param) { return TRUE; } -void sub_08061AA0(void) { +void sub_08061AA0(Entity* this) { DeleteThisEntity(); } void sub_08061AA8(Entity* this) { + static void (*const gUnk_0810AC70[])(Entity*) = { + sub_08061ACC, + sub_08061B18, + }; gUnk_0810AC70[this->action](this); CopyPosition(this->parent, this); } @@ -836,30 +891,24 @@ void sub_08061AFC(Entity* this) { } } -NONMATCH("asm/non_matching/npc5/sub_08061B18.inc", void sub_08061B18(Entity* this)) { +void sub_08061B18(Entity* this) { u16* puVar2; - typedef struct { - u16 unk_0; - u16 unk_2; - } Tmp; - switch (this->interactType) { case 0: break; case 1: this->interactType = 0; sub_08061AFC(this); - // puVar2 = (u16*)(*(int*)&this->field_0x68 + (((u32)this->actionDelay << 0x18) >> 0x17)); - // if puVar2[1] == 0 - if ((((Tmp**)&this->field_0x68))[++this->actionDelay]->unk_2 == 0) { + puVar2 = *(u16**)&this->field_0x68; + puVar2 += (this->actionDelay++); + if (puVar2[1] == 0) { this->actionDelay = 0; } - MessageNoOverlap((u32)*puVar2, this); + MessageNoOverlap(puVar2[0], this); break; } } -END_NONMATCH void sub_08061B58(Entity* this) { if (this->action == 0) {