Decompile the rest of npc5

This commit is contained in:
Tal Hayon 2022-02-15 20:52:35 +02:00
parent caa11c47ef
commit 5d7fec7f2d
8 changed files with 121 additions and 451 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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,

View File

@ -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

View File

@ -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);

View File

@ -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) {