Decompile npc5

This commit is contained in:
octorock
2021-05-11 22:10:29 +02:00
parent 3f404fa46f
commit bbc78fd2d2
9 changed files with 1562 additions and 2331 deletions
+104
View File
@@ -0,0 +1,104 @@
.syntax unified
.text
sub_08060FD0: @ 0x08060FD0
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 sub_080AE4CC
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
+53
View File
@@ -0,0 +1,53 @@
.syntax unified
.text
sub_08061170: @ 0x08061170
push {r4, r5, lr}
adds r4, r0, #0
bl UpdateAnimationSingleFrame
adds r0, r4, #0
bl sub_080AF1EC
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
+54
View File
@@ -0,0 +1,54 @@
.syntax unified
.text
sub_080611D4: @ 0x080611D4
push {r4, lr}
adds r4, r0, #0
ldrb r1, [r4, #0x14]
movs r0, #6
ands r0, r1
ldr r1, _08061218 @ =gUnk_0810AC4C
adds r0, r0, r1
movs r1, #0
ldrsb r1, [r0, r1]
movs r2, #1
ldrsb r2, [r0, r2]
adds r0, r4, #0
bl sub_080002B4
adds r3, r0, #0
ldr r2, _0806121C @ =gUnk_0810AC54
_080611F4:
ldrb r0, [r2]
cmp r0, r3
bne _08061220
ldrb r0, [r2, #1]
ldrb r1, [r4, #0x14]
lsrs r0, r0, #2
cmp r1, r0
bne _08061220
ldrb r0, [r4, #0xf]
adds r0, #1
strb r0, [r4, #0xf]
lsls r0, r0, #0x18
lsrs r0, r0, #0x18
cmp r0, #7
bls _0806122A
ldrb r0, [r2, #1]
b _0806122C
.align 2, 0
_08061218: .4byte gUnk_0810AC4C
_0806121C: .4byte gUnk_0810AC54
_08061220:
adds r2, #2
ldrb r0, [r2]
cmp r0, #0
bne _080611F4
strb r0, [r4, #0xf]
_0806122A:
movs r0, #0xff
_0806122C:
pop {r4, pc}
.align 2, 0
.syntax divided
+139
View File
@@ -0,0 +1,139 @@
.syntax unified
.text
sub_08061358: @ 0x08061358
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
+231
View File
@@ -0,0 +1,231 @@
.syntax unified
.text
sub_08061464: @ 0x08061464
push {r4, r5, r6, r7, lr}
mov r7, sb
mov r6, r8
push {r6, r7}
adds r4, r0, #0
mov r8, r1
adds r5, r2, #0
movs r0, #0x2e
ldrsh r7, [r4, r0]
movs r1, #0x32
ldrsh r6, [r4, r1]
adds r0, r7, #0
adds r1, r6, #0
mov r2, r8
adds r3, r5, #0
bl sub_080045D4
adds r0, #2
movs r1, #0x1c
ands r0, r1
lsrs r0, r0, #2
cmp r0, #7
bls _08061494
b _08061612
_08061494:
lsls r0, r0, #2
ldr r1, _080614A0 @ =_080614A4
adds r0, r0, r1
ldr r0, [r0]
mov pc, r0
.align 2, 0
_080614A0: .4byte _080614A4
_080614A4: @ jump table
.4byte _080614C4 @ case 0
.4byte _080614E2 @ case 1
.4byte _08061514 @ case 2
.4byte _08061544 @ case 3
.4byte _08061566 @ case 4
.4byte _08061584 @ case 5
.4byte _080615B4 @ case 6
.4byte _080615E4 @ case 7
_080614C4:
adds r0, r4, #0
adds r0, #0x6e
strh r5, [r0]
movs r1, #0x2e
ldrsh r0, [r4, r1]
cmp r0, r8
ble _08061504
adds r2, r6, #0
subs r2, #8
adds r0, r4, #0
adds r1, r7, #0
mov r3, r8
bl sub_08061630
b _08061612
_080614E2:
movs r0, #0x6e
adds r0, r0, r4
mov sb, r0
mov r1, r8
strh r1, [r0]
adds r1, r7, #0
adds r1, #8
adds r0, r4, #0
adds r2, r6, #0
adds r3, r5, #0
bl sub_08061720
cmp r0, #0
beq _08061500
b _08061612
_08061500:
mov r0, sb
strh r5, [r0]
_08061504:
adds r2, r6, #0
subs r2, #8
adds r0, r4, #0
adds r1, r7, #0
mov r3, r8
bl sub_080616A8
b _08061612
_08061514:
adds r0, r4, #0
adds r0, #0x6e
mov r1, r8
strh r1, [r0]
movs r1, #0x32
ldrsh r0, [r4, r1]
cmp r0, r5
ble _08061534
adds r1, r7, #0
adds r1, #8
adds r0, r4, #0
adds r2, r6, #0
adds r3, r5, #0
bl sub_08061720
b _08061612
_08061534:
adds r1, r7, #0
adds r1, #8
adds r0, r4, #0
adds r2, r6, #0
adds r3, r5, #0
bl sub_08061798
b _08061612
_08061544:
movs r0, #0x6e
adds r0, r0, r4
mov sb, r0
mov r1, r8
strh r1, [r0]
adds r1, r7, #0
adds r1, #8
adds r0, r4, #0
adds r2, r6, #0
adds r3, r5, #0
bl sub_08061798
cmp r0, #0
bne _08061612
mov r0, sb
strh r5, [r0]
b _08061574
_08061566:
adds r0, r4, #0
adds r0, #0x6e
strh r5, [r0]
movs r1, #0x2e
ldrsh r0, [r4, r1]
cmp r0, r8
bgt _080615A4
_08061574:
adds r2, r6, #0
adds r2, #8
adds r0, r4, #0
adds r1, r7, #0
mov r3, r8
bl sub_08061888
b _08061612
_08061584:
movs r0, #0x6e
adds r0, r0, r4
mov sb, r0
mov r1, r8
strh r1, [r0]
adds r1, r7, #0
subs r1, #8
adds r0, r4, #0
adds r2, r6, #0
adds r3, r5, #0
bl sub_08061978
cmp r0, #0
bne _08061612
mov r0, sb
strh r5, [r0]
_080615A4:
adds r2, r6, #0
adds r2, #8
adds r0, r4, #0
adds r1, r7, #0
mov r3, r8
bl sub_08061810
b _08061612
_080615B4:
adds r0, r4, #0
adds r0, #0x6e
mov r1, r8
strh r1, [r0]
movs r1, #0x32
ldrsh r0, [r4, r1]
cmp r0, r5
ble _080615D4
adds r1, r7, #0
subs r1, #8
adds r0, r4, #0
adds r2, r6, #0
adds r3, r5, #0
bl sub_08061900
b _08061612
_080615D4:
adds r1, r7, #0
subs r1, #8
adds r0, r4, #0
adds r2, r6, #0
adds r3, r5, #0
bl sub_08061978
b _08061612
_080615E4:
movs r0, #0x6e
adds r0, r0, r4
mov sb, r0
mov r1, r8
strh r1, [r0]
adds r1, r7, #0
subs r1, #8
adds r0, r4, #0
adds r2, r6, #0
adds r3, r5, #0
bl sub_08061900
cmp r0, #0
bne _08061612
mov r0, sb
strh r5, [r0]
adds r2, r6, #0
subs r2, #8
adds r0, r4, #0
adds r1, r7, #0
mov r3, r8
bl sub_08061630
_08061612:
ldr r0, [r4, #0x64]
ldrb r1, [r0]
movs r0, #8
ands r0, r1
lsls r0, r0, #0x18
lsrs r1, r0, #0x18
cmp r1, #0
bne _08061628
movs r0, #3
strb r0, [r4, #0xc]
strb r1, [r4, #0xd]
_08061628:
pop {r3, r4}
mov r8, r3
mov sb, r4
pop {r4, r5, r6, r7, pc}
.syntax divided
+38
View File
@@ -0,0 +1,38 @@
.syntax unified
.text
sub_08061B18: @ 0x08061B18
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 TextboxNoOverlap
_08061B54:
pop {r4, pc}
.align 2, 0
.syntax divided
-2330
View File
File diff suppressed because it is too large Load Diff
-1
View File
@@ -555,7 +555,6 @@ SECTIONS {
src/npc/postman.o(.text);
asm/postman.o(.text);
src/npc/npc5.o(.text);
asm/npc5.o(.text);
src/npc/townsperson.o(.text);
asm/kid.o(.text);
src/npc/npc9.o(.text);
+943
View File
@@ -0,0 +1,943 @@
#include "global.h"
#include "entity.h"
#include "player.h"
#include "room.h"
#include "coord.h"
#include "random.h"
#include "utils.h"
#include "functions.h"
#include "textbox.h"
extern void (*const gUnk_0810AC1C[])(Entity*);
extern void (*const gUnk_0810AC2C[])(Entity*);
typedef struct {
u8 unk_0; // u8
u8 unk_0b; // u8
u16 unk_1; // u16
u16 unk_2; // u16
u16 unk_3;
u16 unk_4;
u16 unk_5; // u16
u16 unk_6; // u16
u16 unk_7; // u16
u16 unk_8; // u16
} UnkHeap;
extern Hitbox gUnk_080FD150;
void sub_08060E70(Entity*, u32);
u32 sub_08061230(Entity*);
u32 sub_08060F80(Entity*);
void sub_08060EDC(Entity*);
void sub_08061090(Entity*, u32, u32);
bool32 sub_08060FD0(Entity*, u32, u32);
void sub_08061464(Entity*, u32, u32);
void sub_08061120(Entity*, u32, u32, u32);
bool32 sub_08061170(Entity*);
void sub_08061358(Entity*);
void sub_08060E94(Entity*);
u32 sub_0806FCD0(u32, u32, u32);
extern Entity gUnk_0200D654;
extern Entity gUnk_02027EB4;
extern bool32 sub_080AE4CC(Entity*, u32, u32, u32);
extern u32 sub_080AF1EC(Entity*);
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 u32 sub_080002B4(Entity*, u32, u32);
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);
bool32 sub_08061798(Entity*, s32, s32, s32);
bool32 sub_08061888(Entity*, s32, s32, s32);
bool32 sub_08061978(Entity*, s32, s32, s32);
bool32 sub_08061810(Entity*, s32, s32, s32);
bool32 sub_08061900(Entity*, s32, s32, s32);
bool32 sub_08061A74(Entity*, s32, s32, s32);
bool32 sub_08061A1C(Entity*, s32, s32, s32);
bool32 sub_080619F0(Entity*, s32, s32, s32);
bool32 sub_08061A48(Entity*, s32, s32, s32);
extern void (*const gUnk_0810AC70[])(Entity*);
void sub_08061AFC(Entity*);
extern u16* gUnk_0810B660[8];
void NPC5(Entity* this) {
gUnk_0810AC1C[this->type](this);
}
void sub_08060A00(Entity* this) {
u32 tmp;
if ((gPlayerState.jumpStatus & 0x80) != 0) {
if (this->action != 0) {
if (((((UnkHeap*)this->myHeap)->unk_0) & 4) == 0) {
((UnkHeap*)this->myHeap)->unk_0 |= 4;
((UnkHeap*)this->myHeap)->unk_5 = (gPlayerEntity.x.HALF.HI & 0xfff0) + 8;
((UnkHeap*)this->myHeap)->unk_6 = (gPlayerEntity.y.HALF.HI & 0xfff0) + 8;
}
}
}
if ((this->action == 0) || (this->spriteSettings.b.draw != 0)) {
gUnk_0810AC2C[this->action](this);
}
if (this->action != 0) {
((UnkHeap*)this->myHeap)->unk_1 = gPlayerEntity.x.HALF.HI;
((UnkHeap*)this->myHeap)->unk_2 = gPlayerEntity.y.HALF.HI;
}
if (this->field_0x74.HWORD != gRoomControls.roomID) {
this->field_0x74.HWORD = gRoomControls.roomID;
CopyPosition(&gPlayerEntity, this);
this->action = 1;
this->spriteSettings.b.draw = 1;
this->speed = 0x120;
tmp = gRoomControls.filler[0];
this->animationState = tmp * 2;
InitAnimationForceUpdate(this, tmp << 0x19 >> 0x19); // TODO some conversion between u8 and u32?
this->frameDuration = (Random() & 0x7f) + 0x80;
((UnkHeap*)this->myHeap)->unk_0 &= 0xfb;
}
}
void sub_08060AE0(Entity* this) {
UnkHeap* heapObj;
Entity* otherNpc;
heapObj = (UnkHeap*)zMalloc(0x14); // TODO UnkHeap struct should have size 0x14?
if (heapObj != NULL) {
this->myHeap = (u32*)heapObj;
heapObj->unk_0b = 0x20;
this->action = 1;
this->flags |= 0x80;
this->animationState &= 3;
this->field_0x3c = 7;
this->field_0x40 = 0x48;
this->damageType = 0x49;
this->flags2 = 3;
this->hitbox = &gUnk_080FD150;
this->field_0x17 &= 0xfe;
this->field_0x6c.HALF.LO = 0xff;
sub_08060E70(this, this->animationState);
otherNpc = CreateNPC(5, 2, 0);
if (otherNpc != NULL) {
otherNpc->parent = this;
*(Entity**)&this->field_0x78 = otherNpc;
}
}
}
void sub_08060B5C(Entity* this) {
if (sub_08061230(this) == 0) {
if ((sub_08060F80(this) == 0) &&
(((GetFacingDirection(this, &gPlayerEntity) + (this->animationState * -4) + 4) & 0x1f)) < 9) {
this->action = 2;
this->field_0xf = 0;
return;
}
sub_08060EDC(this);
}
}
void sub_08060BA0(Entity* this) {
Entity* r5;
if (sub_08061230(this) != 0) {
return;
}
if ((((UnkHeap*)this->myHeap)->unk_0 & 4) != 0) {
if ((((UnkHeap*)this->myHeap)->unk_0 & 8) != 0) {
this->speed = 0x1e0;
sub_08061120(this, ((UnkHeap*)this->myHeap)->unk_7, ((UnkHeap*)this->myHeap)->unk_8, 0xc);
sub_08061170(this);
if (sub_0806FCB8(this, ((UnkHeap*)this->myHeap)->unk_7, ((UnkHeap*)this->myHeap)->unk_8, 4) != 0) {
((UnkHeap*)this->myHeap)->unk_0 &= 0xf7;
}
} else {
if (sub_08060FD0(this, ((UnkHeap*)this->myHeap)->unk_5, ((UnkHeap*)this->myHeap)->unk_6) != 0) {
if (sub_0806FCB8(this, ((UnkHeap*)this->myHeap)->unk_5, ((UnkHeap*)this->myHeap)->unk_6, 4) != 0) {
((UnkHeap*)this->myHeap)->unk_0 &= 0xfb;
this->action = 5;
this->direction = r5->direction;
this->speed = 0x160;
sub_08060E70(this, 8);
} else {
this->speed = 0x1e0;
sub_08061120(this, r5->x.HALF.HI, r5->y.HALF.HI, 0xc);
sub_08061170(this);
}
} else {
sub_08061464(this, r5->x.HALF.HI, r5->y.HALF.HI);
}
}
} else {
if (sub_08060FD0(this, gPlayerEntity.x.HALF.HI, gPlayerEntity.y.HALF.HI) != 0) {
sub_08061090(this, gPlayerEntity.x.HALF.HI, gPlayerEntity.y.HALF.HI);
sub_08061170(this);
((UnkHeap*)this->myHeap)->unk_0 &= 0xf5;
} else {
((UnkHeap*)this->myHeap) = (UnkHeap*)this->myHeap;
if ((((UnkHeap*)this->myHeap)->unk_0 & 8) != 0) {
this->speed = 0x1e0;
sub_08061120(this, ((UnkHeap*)this->myHeap)->unk_7, ((UnkHeap*)this->myHeap)->unk_8, 0xc);
sub_08061170(this);
if (sub_0806FCB8(this, ((UnkHeap*)this->myHeap)->unk_7, ((UnkHeap*)this->myHeap)->unk_8, 4) != 0) {
((UnkHeap*)this->myHeap)->unk_0 &= 0xf7;
}
} else {
if ((((UnkHeap*)this->myHeap)->unk_0 & 2) == 0) {
((UnkHeap*)this->myHeap)->unk_0 |= 2;
((UnkHeap*)this->myHeap)->unk_3 = ((UnkHeap*)this->myHeap)->unk_1;
((UnkHeap*)this->myHeap)->unk_4 = ((UnkHeap*)this->myHeap)->unk_2;
}
if (sub_08060FD0(this, ((UnkHeap*)this->myHeap)->unk_3, ((UnkHeap*)this->myHeap)->unk_4) != 0) {
this->speed = 0x1e0;
sub_08061120(this, ((UnkHeap*)this->myHeap)->unk_3, ((UnkHeap*)this->myHeap)->unk_4, 0xc);
sub_08061170(this);
if (sub_0806FCB8(this, ((UnkHeap*)this->myHeap)->unk_3, ((UnkHeap*)this->myHeap)->unk_4, 4) != 0) {
((UnkHeap*)this->myHeap)->unk_0 &= 0xfd;
}
} else {
((UnkHeap*)this->myHeap)->unk_0 &= 0xfd;
sub_08061464(this, gPlayerEntity.x.HALF.HI, gPlayerEntity.y.HALF.HI);
}
}
}
}
if (sub_08060F80(this) != 0) {
this->action = 1;
((UnkHeap*)this->myHeap)->unk_0 &= 0xfb;
sub_08060E70(this, 0);
}
}
void sub_08060D78(Entity* this) {
sub_08061358(this);
if (sub_08060F80(this) != 0) {
if ((u32)this->animIndex - 0x20 < 0x10) {
if ((this->frames.all & 7) != 0) {
this->frameDuration = 1;
UpdateAnimationSingleFrame(this);
}
this->animationState = this->frames.all & 0x18;
this->field_0x6c.HALF.LO = 0xff;
}
this->action = 1;
sub_08060E70(this, 0);
}
}
void sub_08060DD0(Entity* this) {
UpdateAnimationSingleFrame(this);
if ((this->frames.all & 0x80) != 0) {
this->action = 1;
sub_08060E70(this, 0);
}
}
void sub_08060DF4(Entity* this) {
sub_08061170(this);
}
void sub_08060DFC(Entity* this) {
u32 uVar1;
sub_0806F69C(this);
sub_08060E94(this);
uVar1 = sub_08003FC4(this, 0x2000);
if (uVar1 == 0) {
this->action = 7;
this->collisionLayer = 1;
UpdateSpriteForCollisionLayer(this);
sub_08060E70(this, 0x1c);
}
}
void sub_08060E34(Entity* this) {
UpdateAnimationSingleFrame(this);
if ((this->frames.all & 0x80) != 0) {
this->action = 2;
this->animationState = DirectionToAnimationState(GetFacingDirection(this, &gPlayerEntity)) * 2;
sub_08060E70(this, 8);
}
}
void sub_08060E70(Entity* this, u32 param) {
u32 tmp = param + this->animationState / 2;
if (tmp != this->animIndex) {
this->field_0x6c.HALF.LO = param;
InitAnimationForceUpdate(this, tmp);
}
}
void sub_08060E94(Entity* this) {
if (((*(u32*)&this->animIndex & 0x80ff00) == 0x800100) && (this->animIndex < 4)) {
InitAnimationForceUpdate(this, (this->animationState >> 1));
this->frameDuration = (Random() & 0x7f) + 0x80;
} else {
UpdateAnimationSingleFrame(this);
}
}
void sub_08060EDC(Entity* this) {
s32 tmp;
if (((u32)this->animIndex - 0x20 < 0x10) && ((this->frames.all & 0x80) == 0)) {
UpdateAnimationSingleFrame(this);
} else {
tmp = GetFacingDirection(this, &gPlayerEntity) + this->animationState * -4;
if (((tmp + 3) & 0x1f) >= 7) {
if ((tmp & 0x1f) < 0x10) {
InitAnimationForceUpdate(this, this->animationState + 0x20);
this->animationState = (this->animationState + 1) & 7;
} else {
InitAnimationForceUpdate(this, this->animationState + 0x28);
this->animationState = (this->animationState - 1) & 7;
}
} else {
if ((this->animationState & 1) == 0) {
if (((this->frames.all & 0x80) != 0) && (0xf >= (u32)this->animIndex - 0x20)) {
sub_08060E70(this, 0);
} else {
sub_08060E94(this);
}
}
}
}
}
u32 sub_08060F80(Entity* this) {
if (sub_08060FD0(this, (s32)gPlayerEntity.x.HALF.HI, (s32)gPlayerEntity.y.HALF.HI) == 0) {
return 0;
}
((UnkHeap*)this->myHeap)->unk_0 &= 0xfb;
if (sub_0806FCD0(gPlayerEntity.x.HALF.HI - this->x.HALF.HI, gPlayerEntity.y.HALF.HI - this->y.HALF.HI,
((UnkHeap*)this->myHeap)->unk_0b) != 0) {
return 1;
}
return 0;
}
NONMATCH("asm/non_matching/npc5/sub_08060FD0.inc", bool32 sub_08060FD0(Entity* this, u32 a, u32 b)) {
u32 sVar1;
u32 sVar2;
u32 uVar3;
s32 iVar4;
s32 iVar5;
s32 iVar6;
u32 r6;
u32 r7;
Entity* puVar9;
r7 = this->x.HALF.HI;
r6 = this->y.HALF.HI;
// asm("c");
uVar3 = sub_080045DA(a - r7, b - r6);
// asm("b");
r7 = r7 << 8;
r6 = r6 << 8;
// asm("a");
sVar1 = gSineTable[uVar3];
// asm("b");
sVar2 = gSineTable[uVar3 + 0x40];
asm("c");
puVar9 = &gUnk_0200D654;
if (this->collisionLayer != 2) {
puVar9 = &gUnk_02027EB4;
}
code0:
// for(;;) {
asm("k");
if (r7 < 0) {
r7 += 0xff;
}
// asm("i");
if (r6 < 0) {
// asm("j");
r6 += 0xff;
}
// asm("k");
// asm("m");
if (sub_080AE4CC(puVar9, r7 >> 8, r6 >> 8, 6) != 0) {
return FALSE;
}
if (!(((a - (r7 >> 8)) + 6 < 0xd) && ((b - (r6 >> 8)) + 6 < 0xd))) {
r7 += sVar1 * 6;
r6 -= sVar2 * -6;
// asm("q");
// asm("r");
} else {
return TRUE;
// asm("p");
}
goto code0;
// };
code4:
// asm("l");
return FALSE;
}
END_NONMATCH
void sub_08061090(Entity* this, u32 a, u32 b) {
s32 xDist;
s32 yDist;
s32 sqrDist;
u32 tmp;
xDist = gPlayerEntity.x.HALF.HI - this->x.HALF.HI;
yDist = gPlayerEntity.y.HALF.HI - this->y.HALF.HI;
sqrDist = (xDist * xDist) + (yDist * yDist);
if (sqrDist < 0x900) {
this->speed = 0x120;
} else {
if (sqrDist < 0x1900) {
this->speed = ((sqrDist - 0x900) >> 4) + 0x120;
} else {
this->speed = 0x220;
}
}
if (this->speed == 0x120) {
tmp = 4;
} else if (this->speed < 0x160) {
tmp = 8;
} else {
tmp = 0xc;
}
sub_08061120(this, a, b, tmp);
}
void sub_08061120(Entity* this, u32 param_a, u32 param_b, u32 param_c) {
this->direction = sub_080045D4(this->x.HALF.HI, this->y.HALF.HI, param_a, param_b);
if ((param_c != this->field_0x6c.HALF.LO) || (10 < ((this->direction + this->animationState * -4 + 5) & 0x1f))) {
this->animationState = DirectionRoundUp(this->direction) >> 2;
sub_08060E70(this, param_c);
}
}
NONMATCH("asm/non_matching/npc5/sub_08061170.inc", bool32 sub_08061170(Entity* this)) {
u32 direction;
u32 tmp;
UpdateAnimationSingleFrame(this);
if (sub_080AF1EC(this) == 0) {
direction = sub_080611D4(this);
if (direction != 0xff) {
this->action = 6;
tmp = (sub_08079FD4(this, 1) * 0x10 - 4);
// tmp <<= 0xc;
this->field_0x20 = tmp;
this->speed = 0x100;
this->direction = direction;
this->animationState = direction >> 2;
if (tmp >> 0x10 != 0) {
sub_08060E70(this, 0x14);
} else {
sub_08060E70(this, 0x18);
}
}
return FALSE;
} else {
sub_08016AD2(this);
return TRUE;
}
}
END_NONMATCH
NONMATCH("asm/non_matching/npc5/sub_080611D4.inc", u32 sub_080611D4(Entity* this)) {
u8 bVar1;
u32 uVar2;
u8* pbVar3;
u32 x;
s32 a;
s32 b;
x = this->animationState & 6;
// asm("a");
a = gUnk_0810AC4C[x].unk_0;
// asm("c");
b = gUnk_0810AC4C[x].unk_1;
// asm("d");
uVar2 = sub_080002B4(this, a, b);
// asm("b");
code4:
if ((gUnk_0810AC54[0] != uVar2 || (this->animationState != gUnk_0810AC54[1] >> 2))) {
// asm ("e");
if (gUnk_0810AC54[2] == 0) {
this->field_0xf = 0;
return 0xff;
}
}
this->field_0xf += 1;
if (this->field_0xf < 8) {
return 0xff;
}
return gUnk_0810AC54[3];
}
END_NONMATCH
u32 sub_08061230(Entity* this) {
if ((((UnkHeap*)this->myHeap)->unk_0 & 1) == 0) {
if ((this->bitfield & 0x80) != 0) {
switch (this->bitfield & 0x7f) {
case 0:
case 1:
case 2:
case 3:
case 0xf:
case 0x13:
case 0x1b:
case 0x1e:
case 0x1f:
break;
default:
((UnkHeap*)this->myHeap)->unk_0 = ((UnkHeap*)this->myHeap)->unk_0 | 1;
InitAnimationForceUpdate(this, (this->animationState >> 1) + 0x40);
return 1;
}
}
} else {
UpdateAnimationSingleFrame(this);
if ((this->frames.all & 0x80) == 0) {
return 1;
}
((UnkHeap*)this->myHeap)->unk_0 &= 0xfe;
InitAnimationForceUpdate(this, this->field_0x6c.HALF.LO + (this->animationState >> 1));
}
this->bitfield = this->bitfield & 0x7f;
if (this->iframes != 0) {
this->iframes += 1;
}
return 0;
}
NONMATCH("asm/non_matching/npc5/sub_08061358.inc", void sub_08061358(Entity* this)) {
u8 bVar1;
u32 uVar2;
s32 iVar3;
u8 bVar4;
u32 unaff_r6;
bVar4 = (u8)unaff_r6;
switch (this->subAction) {
case 0:
UpdateAnimationSingleFrame(this);
if ((this->frames.all & 0x80) == 0) {
return;
}
this->subAction = 1;
this->actionDelay = 0xf;
sub_08060E70(this, 0);
return;
case 1:
this->actionDelay -= 1;
asm("x");
if (this->actionDelay != 0) {
return;
}
uVar2 = Random();
// bVar4 = (u8)uVar2;
if ((uVar2 & 1) == 0)
goto _080613FA;
this->subAction = 2;
iVar3 = (u32)this->animationState * 2 + (uVar2 >> 4 & 3);
InitAnimationForceUpdate(this, (u32)(u8)(&gUnk_0810AC5D)[iVar3 + 1]);
break;
case 2:
UpdateAnimationSingleFrame(this);
if ((this->frames.all & 0x80) == 0) {
return;
}
this->animationState = (u8)(((u8)this->frames.all & 0x18) >> 2);
uVar2 = Random();
if ((uVar2 & 1) == 0) {
this->subAction = 0;
sub_08060E70(this, 0x10);
return;
}
_080613FA:
this->subAction = 3;
this->actionDelay = (bVar4 & 0x18) + 0x1e;
sub_08060E70(this, 4);
return;
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);
return;
}
this->subAction = 2;
iVar3 = (u32)this->animationState * 2 + (unaff_r6 >> 4 & 3);
InitAnimationForceUpdate(this, (u32)(u8)(&gUnk_0810AC5D)[iVar3 + 1]);
break;
}
}
END_NONMATCH
NONMATCH("asm/non_matching/npc5/sub_08061464.inc", void sub_08061464(Entity* this, u32 param_a, u32 param_b)) {
u8 bVar1;
s16 sVar2;
s16 sVar3;
u16 uVar4;
u32 uVar6;
u32 uVar7;
s32 iVar8;
s32 iVar9;
s32 iVar10;
u16 uVar5;
sVar2 = this->x.HALF.HI;
iVar10 = (s32)sVar2;
sVar3 = this->y.HALF.HI;
iVar9 = (s32)sVar3;
uVar6 = sub_080045D4(sVar2, sVar3, param_a, param_b);
// uVar7 = (uVar6 + 2) & 0x1c;
// if (7 < uVar7 >> 2)
// goto _08061612;
// uVar4 = (u16)param_b;
// uVar5 = (u16)param_a;
// asm("----");
switch (uVar7) {
case 0:
this->field_0x6e.HALF.LO = uVar4;
if ((s32)param_a < this->x.HALF.HI) {
sub_08061630(this, iVar10, iVar9 + -8, param_a);
break;
}
goto _08061504;
case 4:
this->field_0x6e.HALF.LO = uVar5;
iVar8 = sub_08061720(this, iVar10 + 8, iVar9, param_b);
if (iVar8 != 0)
break;
this->field_0x6e.HALF.LO = uVar4;
_08061504:
sub_080616A8(this, iVar10, iVar9 + -8, param_a);
break;
case 8:
this->field_0x6e.HALF.LO = uVar5;
if ((s32)param_b < this->y.HALF.HI) {
sub_08061720(this, iVar10 + 8, iVar9, param_b);
} else {
sub_08061798(this, iVar10 + 8, iVar9, param_b);
}
break;
case 0xc:
this->field_0x6e.HALF.LO = uVar5;
iVar8 = sub_08061798(this, iVar10 + 8, iVar9, param_b);
if (iVar8 != 0)
break;
this->field_0x6e.HALF.LO = uVar4;
goto _08061574;
case 0x10:
this->field_0x6e.HALF.LO = uVar4;
if ((s32)param_a < this->x.HALF.HI)
goto _080615A4;
_08061574:
sub_08061888(this, iVar10, iVar9 + 8, param_a);
break;
case 0x14:
this->field_0x6e.HALF.LO = uVar5;
iVar8 = sub_08061978(this, iVar10 + -8, iVar9, param_b);
if (iVar8 != 0)
break;
this->field_0x6e.HALF.LO = uVar4;
_080615A4:
sub_08061810(this, iVar10, iVar9 + 8, param_a);
break;
case 0x18:
this->field_0x6e.HALF.LO = uVar5;
if ((s32)param_b < this->y.HALF.HI) {
sub_08061900(this, iVar10 + -8, iVar9, param_b);
} else {
sub_08061978(this, iVar10 + -8, iVar9, param_b);
}
break;
case 0x1c:
this->field_0x6e.HALF.LO = uVar5;
iVar8 = sub_08061900(this, iVar10 + -8, iVar9, param_b);
if (iVar8 == 0) {
this->field_0x6e.HALF.LO = uVar4;
sub_08061630(this, iVar10, iVar9 + -8, param_a);
}
}
_08061612:
bVar1 = ((UnkHeap*)this->myHeap)->unk_0;
if ((bVar1 & 8) == 0) {
this->action = 3;
this->subAction = bVar1 & 8;
}
}
END_NONMATCH
bool32 sub_08061630(Entity* this, s32 x, s32 y, s32 param) {
u32 param_y = y;
Entity* entity = (this->collisionLayer == 2) ? &gUnk_0200D654 : &gUnk_02027EB4;
while (!sub_080AE4CC(entity, x, y, 6)) {
if (sub_08061A74(entity, x, y, param)) {
((UnkHeap*)this->myHeap)->unk_7 = x;
((UnkHeap*)this->myHeap)->unk_8 = param_y;
((UnkHeap*)this->myHeap)->unk_0 |= 8;
if (this->field_0x6e.HWORD >= y) {
return TRUE;
}
}
y -= 8;
}
return FALSE;
}
bool32 sub_080616A8(Entity* this, s32 x, s32 y, s32 param) {
u32 param_y = y;
Entity* entity = (this->collisionLayer == 2) ? &gUnk_0200D654 : &gUnk_02027EB4;
while (!sub_080AE4CC(entity, x, y, 6)) {
if (sub_08061A1C(entity, x, y, param)) {
((UnkHeap*)this->myHeap)->unk_7 = x;
((UnkHeap*)this->myHeap)->unk_8 = param_y;
((UnkHeap*)this->myHeap)->unk_0 |= 8;
if (this->field_0x6e.HWORD >= y) {
return TRUE;
}
}
y -= 8;
}
return FALSE;
}
bool32 sub_08061720(Entity* this, s32 x, s32 y, s32 param) {
u32 param_x = x;
Entity* entity = (this->collisionLayer == 2) ? &gUnk_0200D654 : &gUnk_02027EB4;
while (!sub_080AE4CC(entity, x, y, 6)) {
if (sub_080619F0(entity, x, y, param)) {
((UnkHeap*)this->myHeap)->unk_7 = param_x;
((UnkHeap*)this->myHeap)->unk_8 = y;
((UnkHeap*)this->myHeap)->unk_0 |= 8;
if (this->field_0x6e.HWORD <= x) {
return TRUE;
}
}
x += 8;
}
return FALSE;
}
bool32 sub_08061798(Entity* this, s32 x, s32 y, s32 param) {
u32 param_x = x;
Entity* entity = (this->collisionLayer == 2) ? &gUnk_0200D654 : &gUnk_02027EB4;
while (!sub_080AE4CC(entity, x, y, 6)) {
if (sub_08061A48(entity, x, y, param)) {
((UnkHeap*)this->myHeap)->unk_7 = param_x;
((UnkHeap*)this->myHeap)->unk_8 = y;
((UnkHeap*)this->myHeap)->unk_0 |= 8;
if (this->field_0x6e.HWORD <= x) {
return TRUE;
}
}
x += 8;
}
return FALSE;
}
bool32 sub_08061810(Entity* this, s32 x, s32 y, s32 param) {
u32 param_y = y;
Entity* entity = (this->collisionLayer == 2) ? &gUnk_0200D654 : &gUnk_02027EB4;
while (!sub_080AE4CC(entity, x, y, 6)) {
if (sub_08061A74(entity, x, y, param)) {
((UnkHeap*)this->myHeap)->unk_7 = x;
((UnkHeap*)this->myHeap)->unk_8 = param_y;
((UnkHeap*)this->myHeap)->unk_0 |= 8;
if (this->field_0x6e.HWORD <= y) {
return TRUE;
}
}
y += 8;
}
return FALSE;
}
bool32 sub_08061888(Entity* this, s32 x, s32 y, s32 param) {
u32 param_y = y;
Entity* entity = (this->collisionLayer == 2) ? &gUnk_0200D654 : &gUnk_02027EB4;
while (!sub_080AE4CC(entity, x, y, 6)) {
if (sub_08061A1C(entity, x, y, param)) {
((UnkHeap*)this->myHeap)->unk_7 = x;
((UnkHeap*)this->myHeap)->unk_8 = param_y;
((UnkHeap*)this->myHeap)->unk_0 |= 8;
if (this->field_0x6e.HWORD <= y) {
return TRUE;
}
}
y += 8;
}
return FALSE;
}
bool32 sub_08061900(Entity* this, s32 x, s32 y, s32 param) {
u32 param_x = x;
Entity* entity = (this->collisionLayer == 2) ? &gUnk_0200D654 : &gUnk_02027EB4;
while (!sub_080AE4CC(entity, x, y, 6)) {
if (sub_080619F0(entity, x, y, param)) {
((UnkHeap*)this->myHeap)->unk_7 = param_x;
((UnkHeap*)this->myHeap)->unk_8 = y;
((UnkHeap*)this->myHeap)->unk_0 |= 8;
if (this->field_0x6e.HWORD >= x) {
return TRUE;
}
}
x -= 8;
}
return FALSE;
}
bool32 sub_08061978(Entity* this, s32 x, s32 y, s32 param) {
u32 param_x = x;
Entity* entity = (this->collisionLayer == 2) ? &gUnk_0200D654 : &gUnk_02027EB4;
while (!sub_080AE4CC(entity, x, y, 6)) {
if (sub_08061A48(entity, x, y, param)) {
((UnkHeap*)this->myHeap)->unk_7 = param_x;
((UnkHeap*)this->myHeap)->unk_8 = y;
((UnkHeap*)this->myHeap)->unk_0 |= 8;
if (this->field_0x6e.HWORD >= x) {
return TRUE;
}
}
x -= 8;
}
return FALSE;
}
bool32 sub_080619F0(Entity* this, s32 x, s32 y, s32 param) {
while (param <= y) {
if (sub_080AE4CC(this, x, y, 6) != 0) {
return FALSE;
}
y -= 8;
}
return TRUE;
}
bool32 sub_08061A1C(Entity* this, s32 x, s32 y, s32 param) {
while (param >= x) {
if (sub_080AE4CC(this, x, y, 6) != 0) {
return FALSE;
}
x += 8;
}
return TRUE;
}
bool32 sub_08061A48(Entity* this, s32 x, s32 y, s32 param) {
while (param >= y) {
if (sub_080AE4CC(this, x, y, 6) != 0) {
return FALSE;
}
y += 8;
}
return TRUE;
}
bool32 sub_08061A74(Entity* this, s32 x, s32 y, s32 param) {
while (param <= x) {
if (sub_080AE4CC(this, x, y, 6) != 0) {
return FALSE;
}
x -= 8;
}
return TRUE;
}
void sub_08061AA0() {
DeleteThisEntity();
}
void sub_08061AA8(Entity* this) {
gUnk_0810AC70[this->action](this);
CopyPosition(this->parent, this);
}
void sub_08061ACC(Entity* this) {
this->flags = this->flags | 0x20;
this->action = 1;
this->subAction = 0xff;
this->actionDelay = 0;
this->field_0x17 = this->field_0x17 & 0xfe;
sub_08078778(this);
sub_08061AFC(this);
}
void sub_08061AFC(Entity* this) {
u32 tmp = 0;
if (this->subAction != 0) {
this->subAction = tmp;
*((u16**)&this->field_0x68) = gUnk_0810B660[0];
this->actionDelay = 0;
}
}
NONMATCH("asm/non_matching/npc5/sub_08061B18.inc", void sub_08061B18(Entity* this)) {
u8 bVar1;
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) {
this->actionDelay = 0;
}
TextboxNoOverlap((u32)*puVar2, this);
break;
}
}
END_NONMATCH
void sub_08061B58(Entity* this) {
if (this->action == 0) {
this->action = 1;
InitAnimationForceUpdate(this, 2);
}
if (gScreenTransition.field_0x24[8] == 2) {
UpdateAnimationSingleFrame(this);
}
sub_0806FD3C(this);
}