diff --git a/asm/non_matching/townsperson/sub_08061C60.inc b/asm/non_matching/townsperson/sub_08061C60.inc new file mode 100644 index 00000000..d1064414 --- /dev/null +++ b/asm/non_matching/townsperson/sub_08061C60.inc @@ -0,0 +1,46 @@ + .include "asm/macros.inc" + + .include "constants/constants.inc" + + .syntax unified + + .text + + push {r4, r5, lr} + adds r4, r0, #0 + adds r0, #0x58 + ldrb r1, [r0] + movs r0, #3 + ands r0, r1 + ldr r1, _08061CAC @ =gUnk_0810B78C + adds r0, r0, r1 + ldrb r1, [r0] + ldr r5, _08061CB0 @ =gUnk_0810B680 + ldrb r0, [r4, #0xa] + lsls r0, r0, #2 + adds r0, r0, r5 + ldrb r2, [r0] + adds r2, r1, r2 + adds r0, r4, #0 + movs r1, #0 + bl SetExtraSpriteFrame + ldrb r2, [r4, #0x1e] + ldrb r0, [r4, #0xa] + lsls r0, r0, #2 + adds r0, r0, r5 + ldrb r0, [r0, #1] + adds r2, r2, r0 + adds r0, r4, #0 + movs r1, #1 + bl SetExtraSpriteFrame + adds r0, r4, #0 + movs r1, #1 + movs r2, #0 + bl SetSpriteSubEntryOffsetData1 + adds r0, r4, #0 + bl sub_0807000C + pop {r4, r5, pc} + .align 2, 0 +_08061CAC: .4byte gUnk_0810B78C +_08061CB0: .4byte gUnk_0810B680 + .syntax divided \ No newline at end of file diff --git a/asm/townsperson.s b/asm/townsperson.s deleted file mode 100644 index 32bf8e55..00000000 --- a/asm/townsperson.s +++ /dev/null @@ -1,598 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - thumb_func_start Townsperson_Head -Townsperson_Head: @ 0x08061C60 - push {r4, r5, lr} - adds r4, r0, #0 - adds r0, #0x58 - ldrb r1, [r0] - movs r0, #3 - ands r0, r1 - ldr r1, _08061CAC @ =gUnk_0810B78C - adds r0, r0, r1 - ldrb r1, [r0] - ldr r5, _08061CB0 @ =gUnk_0810B680 - ldrb r0, [r4, #0xa] - lsls r0, r0, #2 - adds r0, r0, r5 - ldrb r2, [r0] - adds r2, r1, r2 - adds r0, r4, #0 - movs r1, #0 - bl SetExtraSpriteFrame - ldrb r2, [r4, #0x1e] - ldrb r0, [r4, #0xa] - lsls r0, r0, #2 - adds r0, r0, r5 - ldrb r0, [r0, #1] - adds r2, r2, r0 - adds r0, r4, #0 - movs r1, #1 - bl SetExtraSpriteFrame - adds r0, r4, #0 - movs r1, #1 - movs r2, #0 - bl SetSpriteSubEntryOffsetData1 - adds r0, r4, #0 - bl sub_0807000C - pop {r4, r5, pc} - .align 2, 0 -_08061CAC: .4byte gUnk_0810B78C -_08061CB0: .4byte gUnk_0810B680 - - thumb_func_start sub_08061CB4 -sub_08061CB4: @ 0x08061CB4 - push {r4, lr} - adds r4, r0, #0 - adds r0, #0x58 - ldrb r0, [r0] - cmp r0, r1 - beq _08061CC8 - adds r0, r4, #0 - bl InitializeAnimation - b _08061CCE -_08061CC8: - adds r0, r4, #0 - bl GetNextFrame -_08061CCE: - adds r2, r4, #0 - adds r2, #0x59 - ldrb r0, [r2] - cmp r0, #0xff - bne _08061CE4 - ldr r0, _08061CE8 @ =gUnk_0810B680 - ldrb r1, [r4, #0xa] - lsls r1, r1, #2 - adds r1, r1, r0 - ldrb r0, [r1, #2] - strb r0, [r2] -_08061CE4: - pop {r4, pc} - .align 2, 0 -_08061CE8: .4byte gUnk_0810B680 - - thumb_func_start sub_08061CEC -sub_08061CEC: @ 0x08061CEC - push {r4, lr} - adds r4, r0, #0 - ldr r1, _08061D38 @ =gUnk_0810B6EC - ldrb r0, [r4, #0xa] - lsls r0, r0, #2 - adds r0, r0, r1 - ldr r1, [r0] - adds r0, r4, #0 - bl LoadExtraSpriteData - cmp r0, #0 - beq _08061D62 - movs r2, #1 - movs r0, #1 - strb r0, [r4, #0xc] - ldrb r1, [r4, #0x18] - subs r0, #5 - ands r0, r1 - orrs r0, r2 - strb r0, [r4, #0x18] - ldrb r0, [r4, #0xe] - strb r0, [r4, #0x14] - adds r1, r4, #0 - adds r1, #0x69 - movs r0, #0xff - strb r0, [r1] - adds r0, r4, #0 - bl sub_0805ACC0 - adds r1, r0, #0 - cmp r1, #0 - bne _08061D3C - ldrh r0, [r4, #0x2e] - adds r1, r4, #0 - adds r1, #0x6a - strh r0, [r1] - ldrh r1, [r4, #0x32] - b _08061D44 - .align 2, 0 -_08061D38: .4byte gUnk_0810B6EC -_08061D3C: - lsrs r0, r1, #0x10 - adds r2, r4, #0 - adds r2, #0x6a - strh r0, [r2] -_08061D44: - adds r0, r4, #0 - adds r0, #0x6c - strh r1, [r0] - adds r0, r4, #0 - bl sub_0801E99C - adds r1, r4, #0 - adds r1, #0x68 - strb r0, [r1] - adds r0, r4, #0 - bl sub_0807DD64 - adds r0, r4, #0 - bl sub_08061D64 -_08061D62: - pop {r4, pc} - - thumb_func_start sub_08061D64 -sub_08061D64: @ 0x08061D64 - push {r4, r5, lr} - adds r5, r0, #0 - adds r4, r5, #0 - adds r4, #0x39 - movs r0, #0 - ldrsb r0, [r4, r0] - cmp r0, #2 - bne _08061DB0 - movs r1, #0 - movs r0, #3 - strb r0, [r5, #0xc] - strb r1, [r4] - adds r0, r5, #0 - bl sub_0806F118 - adds r4, #0x1f - ldrb r0, [r4] - adds r1, r5, #0 - adds r1, #0x69 - strb r0, [r1] - ldr r1, _08061DAC @ =gLinkEntity - adds r0, r5, #0 - bl GetFacingDirection - bl sub_0806F5A4 - ldrb r1, [r4] - movs r2, #4 - rsbs r2, r2, #0 - ands r1, r2 - adds r1, r1, r0 - adds r0, r5, #0 - bl InitializeAnimation - b _08061E18 - .align 2, 0 -_08061DAC: .4byte gLinkEntity -_08061DB0: - adds r0, r5, #0 - movs r1, #0 - bl sub_0807DDAC - adds r0, r5, #0 - bl sub_0807DDE4 - adds r2, r5, #0 - adds r2, #0x59 - ldrb r0, [r2] - cmp r0, #0xff - bne _08061DD4 - ldr r0, _08061E1C @ =gUnk_0810B680 - ldrb r1, [r5, #0xa] - lsls r1, r1, #2 - adds r1, r1, r0 - ldrb r0, [r1, #2] - strb r0, [r2] -_08061DD4: - adds r0, r5, #0 - bl GetNextFrame - movs r0, #0 - ldrsb r0, [r4, r0] - cmp r0, #0 - beq _08061E18 - movs r1, #0 - movs r0, #2 - strb r0, [r5, #0xc] - strb r1, [r4] - adds r0, r5, #0 - bl sub_08062048 - adds r4, r5, #0 - adds r4, #0x58 - ldrb r0, [r4] - adds r1, r5, #0 - adds r1, #0x69 - strb r0, [r1] - ldr r1, _08061E20 @ =gLinkEntity - adds r0, r5, #0 - bl GetFacingDirection - bl sub_0806F5A4 - ldrb r1, [r4] - movs r2, #4 - rsbs r2, r2, #0 - ands r1, r2 - adds r1, r1, r0 - adds r0, r5, #0 - bl InitializeAnimation -_08061E18: - pop {r4, r5, pc} - .align 2, 0 -_08061E1C: .4byte gUnk_0810B680 -_08061E20: .4byte gLinkEntity - - thumb_func_start sub_08061E24 -sub_08061E24: @ 0x08061E24 - push {r4, lr} - adds r4, r0, #0 - bl GetNextFrame - ldr r0, _08061E4C @ =gTextBox - ldrb r1, [r0] - movs r0, #0x7f - ands r0, r1 - cmp r0, #0 - bne _08061E48 - movs r0, #1 - strb r0, [r4, #0xc] - adds r0, r4, #0 - adds r0, #0x69 - ldrb r1, [r0] - adds r0, r4, #0 - bl InitializeAnimation -_08061E48: - pop {r4, pc} - .align 2, 0 -_08061E4C: .4byte gTextBox - - thumb_func_start sub_08061E50 -sub_08061E50: @ 0x08061E50 - push {r4, lr} - adds r4, r0, #0 - bl UpdateFuseInteraction - cmp r0, #0 - beq _08061E6C - movs r0, #1 - strb r0, [r4, #0xc] - adds r0, r4, #0 - adds r0, #0x69 - ldrb r1, [r0] - adds r0, r4, #0 - bl InitializeAnimation -_08061E6C: - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_08061E70 -sub_08061E70: @ 0x08061E70 - push {lr} - adds r2, r0, #0 - ldrb r0, [r2, #9] - cmp r0, #6 - bne _08061E88 - adds r0, r2, #0 - adds r0, #0x68 - ldrb r1, [r0] - adds r0, r2, #0 - bl sub_08078784 - b _08061E8E -_08061E88: - adds r0, r2, #0 - bl sub_08078778 -_08061E8E: - pop {pc} - - thumb_func_start sub_08061E90 -sub_08061E90: @ 0x08061E90 - push {r4, r5, r6, lr} - adds r4, r0, #0 - adds r5, r1, #0 - ldrb r0, [r5, #0x18] - cmp r0, #0 - bne _08061F04 - adds r0, #1 - strb r0, [r5, #0x18] - bl Random - movs r1, #0x3f - ands r0, r1 - adds r0, #0x20 - strh r0, [r5, #0x12] - bl Random - adds r1, r0, #0 - movs r0, #0x18 - ands r1, r0 - ldrb r0, [r4, #0x15] - cmp r0, #8 - beq _08061ED8 - cmp r0, #8 - bgt _08061EC6 - cmp r0, #0 - beq _08061ED0 - b _08061EEE -_08061EC6: - cmp r0, #0x10 - beq _08061EE0 - cmp r0, #0x18 - beq _08061EE8 - b _08061EEE -_08061ED0: - cmp r1, #0x10 - bne _08061EEE - movs r1, #8 - b _08061EEE -_08061ED8: - cmp r1, #0x18 - bne _08061EEE - movs r1, #0x10 - b _08061EEE -_08061EE0: - cmp r1, #0 - bne _08061EEE - movs r1, #0x18 - b _08061EEE -_08061EE8: - cmp r1, #8 - bne _08061EEE - movs r1, #0 -_08061EEE: - strb r1, [r4, #0x15] - adds r0, r1, #0 - bl sub_0806F5B0 - strb r0, [r4, #0x14] - ldr r1, _08061F8C @ =gUnk_0810B74A - ldrb r0, [r4, #0xa] - lsls r0, r0, #1 - adds r0, r0, r1 - ldrh r0, [r0] - strh r0, [r4, #0x24] -_08061F04: - ldrb r0, [r4, #0x14] - lsrs r0, r0, #1 - adds r1, r0, #4 - adds r0, r4, #0 - adds r0, #0x58 - ldrb r0, [r0] - cmp r1, r0 - beq _08061F1A - adds r0, r4, #0 - bl InitializeAnimation -_08061F1A: - adds r0, r4, #0 - bl sub_080AEF88 - movs r0, #0x2e - ldrsh r1, [r4, r0] - adds r2, r4, #0 - adds r2, #0x6a - movs r3, #0 - ldrsh r0, [r2, r3] - subs r1, r1, r0 - cmp r1, #0x10 - ble _08061F3C - ldrh r0, [r2] - adds r0, #0x10 - strh r0, [r4, #0x2e] - movs r0, #1 - strh r0, [r5, #0x12] -_08061F3C: - movs r3, #0x10 - rsbs r3, r3, #0 - cmp r1, r3 - bge _08061F4E - ldrh r0, [r2] - subs r0, #0x10 - strh r0, [r4, #0x2e] - movs r0, #1 - strh r0, [r5, #0x12] -_08061F4E: - movs r6, #0x32 - ldrsh r1, [r4, r6] - adds r2, r4, #0 - adds r2, #0x6c - movs r6, #0 - ldrsh r0, [r2, r6] - subs r1, r1, r0 - cmp r1, #0x10 - ble _08061F6A - ldrh r0, [r2] - adds r0, #0x10 - strh r0, [r4, #0x32] - movs r0, #1 - strh r0, [r5, #0x12] -_08061F6A: - cmp r1, r3 - bge _08061F78 - ldrh r0, [r2] - subs r0, #0x10 - strh r0, [r4, #0x32] - movs r0, #1 - strh r0, [r5, #0x12] -_08061F78: - ldrh r0, [r5, #0x12] - subs r0, #1 - strh r0, [r5, #0x12] - lsls r0, r0, #0x10 - cmp r0, #0 - beq _08061F8A - ldr r1, _08061F90 @ =gUnk_02033280 - movs r0, #0 - strb r0, [r1, #6] -_08061F8A: - pop {r4, r5, r6, pc} - .align 2, 0 -_08061F8C: .4byte gUnk_0810B74A -_08061F90: .4byte gUnk_02033280 - - thumb_func_start sub_08061F94 -sub_08061F94: @ 0x08061F94 - push {r4, lr} - adds r4, r0, #0 - movs r1, #0x35 - movs r2, #0 - bl CreateFx - adds r1, r0, #0 - cmp r1, #0 - beq _08061FAC - adds r0, r4, #0 - bl ResolveEntityOnTop -_08061FAC: - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_08061FB0 -sub_08061FB0: @ 0x08061FB0 - movs r1, #0 - str r1, [r0, #0x48] - bx lr - .align 2, 0 - - thumb_func_start sub_08061FB8 -sub_08061FB8: @ 0x08061FB8 - push {lr} - ldr r2, _08061FD0 @ =gUnk_0810B748 - ldr r3, [r1, #4] - adds r2, r3, r2 - ldrb r2, [r2] - lsls r3, r3, #2 - ldr r1, _08061FD4 @ =gUnk_0810B740 - adds r3, r3, r1 - movs r1, #1 - bl sub_08078850 - pop {pc} - .align 2, 0 -_08061FD0: .4byte gUnk_0810B748 -_08061FD4: .4byte gUnk_0810B740 - - thumb_func_start sub_08061FD8 -sub_08061FD8: @ 0x08061FD8 - push {lr} - ldrb r1, [r0, #0x14] - lsrs r1, r1, #1 - bl InitializeAnimation - pop {pc} - - thumb_func_start sub_08061FE4 -sub_08061FE4: @ 0x08061FE4 - push {lr} - ldrb r1, [r0, #0x14] - lsrs r1, r1, #1 - adds r1, #4 - bl InitializeAnimation - pop {pc} - .align 2, 0 - - thumb_func_start sub_08061FF4 -sub_08061FF4: @ 0x08061FF4 - push {lr} - adds r1, r0, #0 - ldr r2, _08062008 @ =gUnk_0810B790 - ldrb r0, [r1, #0xa] - lsls r0, r0, #1 - adds r0, r0, r2 - ldrh r0, [r0] - bl TextboxNoOverlap - pop {pc} - .align 2, 0 -_08062008: .4byte gUnk_0810B790 - - thumb_func_start sub_0806200C -sub_0806200C: @ 0x0806200C - push {r4, r5, lr} - adds r5, r0, #0 - movs r4, #0 - movs r0, #0x29 - bl CheckGlobalFlag - cmp r0, #0 - beq _08062034 - movs r0, #0x6b - bl CheckLocalFlag - cmp r0, #0 - beq _08062034 - movs r0, #0x39 - bl GetInventoryValue - movs r4, #1 - cmp r0, #2 - bne _08062034 - movs r4, #2 -_08062034: - ldr r0, _08062044 @ =gUnk_0810B7BA - lsls r1, r4, #1 - adds r1, r1, r0 - ldrh r0, [r1] - adds r1, r5, #0 - bl TextboxNoOverlap - pop {r4, r5, pc} - .align 2, 0 -_08062044: .4byte gUnk_0810B7BA - - thumb_func_start sub_08062048 -sub_08062048: @ 0x08062048 - push {lr} - adds r3, r0, #0 - ldrb r0, [r3, #9] - cmp r0, #6 - bne _0806207C - ldr r0, _08062074 @ =gUnk_02002A40 - ldrb r0, [r0, #8] - subs r0, #2 - cmp r0, #0 - bge _0806205E - movs r0, #0 -_0806205E: - ldrb r1, [r3, #0xa] - lsls r1, r1, #6 - lsls r0, r0, #3 - ldr r2, _08062078 @ =gUnk_0810B7C0 - adds r0, r0, r2 - adds r1, r1, r0 - adds r0, r3, #0 - bl ShowNPCDialogue - b _08062084 - .align 2, 0 -_08062074: .4byte gUnk_02002A40 -_08062078: .4byte gUnk_0810B7C0 -_0806207C: - movs r0, #0 - adds r1, r3, #0 - bl TextboxNoOverlap -_08062084: - pop {pc} - .align 2, 0 - - thumb_func_start Townsperson_Fusion -Townsperson_Fusion: @ 0x08062088 - push {r4, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xc] - cmp r0, #0 - bne _080620BA - ldr r1, _080620C4 @ =gUnk_0810B6EC - ldrb r0, [r4, #0xa] - lsls r0, r0, #2 - adds r0, r0, r1 - ldr r1, [r0] - adds r0, r4, #0 - bl LoadExtraSpriteData - cmp r0, #0 - beq _080620C2 - ldrb r0, [r4, #0xc] - adds r0, #1 - strb r0, [r4, #0xc] - ldrb r1, [r4, #0x18] - movs r0, #4 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #1 - orrs r0, r1 - strb r0, [r4, #0x18] -_080620BA: - adds r0, r4, #0 - movs r1, #6 - bl sub_08061CB4 -_080620C2: - pop {r4, pc} - .align 2, 0 -_080620C4: .4byte gUnk_0810B6EC diff --git a/linker.ld b/linker.ld index 70de38a4..8710c675 100644 --- a/linker.ld +++ b/linker.ld @@ -541,7 +541,6 @@ SECTIONS { asm/postman.o(.text); asm/npc5.o(.text); src/npc/townsperson.o(.text); - asm/townsperson.o(.text); asm/kid.o(.text); asm/npc9.o(.text); src/npc/stamp.o(.text); diff --git a/src/npc/townsperson.c b/src/npc/townsperson.c index 454474cb..7c4bf877 100644 --- a/src/npc/townsperson.c +++ b/src/npc/townsperson.c @@ -3,56 +3,322 @@ #include "npc.h" #include "link.h" #include "textbox.h" +#include "flags.h" + +typedef struct { + u8 frame1; + u8 frame2; + u8 unk2; + u8 unk3; +} struct_0810B680; + +typedef struct { + u32 unk; + u32 unk2; +} struct_08061FB8; extern void (*const gUnk_0810B774[])(Entity*); extern void (*const gUnk_0810B77C[])(Entity*); extern void sub_08061CB4(Entity*, u32); extern u32 sub_0806ED9C(Entity*, u32, u32); extern void sub_0806ED78(Entity*); +extern u32 sub_0805ACC0(Entity*); +extern u32 sub_0801E99C(Entity*); +extern void sub_0807DD64(Entity*); +extern void sub_08061D64(Entity*); +extern void sub_0806F118(Entity*); +extern u32 sub_0806F5A4(u32); +extern u32 GetFacingDirection(Entity*, Entity*); +extern void sub_0807DDAC(Entity*, u32); +extern void sub_0807DDE4(Entity*); +extern void sub_08062048(Entity*); +extern void sub_08078784(Entity*, u32); +extern void sub_08078778(Entity*); +extern u32 sub_0806F5B0(u32); +extern void sub_080AEF88(Entity*); +extern u32 Random(void); +extern void ResolveEntityOnTop(Entity*, Entity*); +extern void sub_08078850(Entity*, u32, u8, u32*); extern SpriteLoadData* gUnk_0810B6EC[]; +extern u8 gUnk_0810B78C[]; +extern struct_0810B680 gUnk_0810B680[]; +extern u16 gUnk_0810B74A[]; +extern u8 gUnk_02033280[]; +extern u8 gUnk_0810B748[]; +extern u32 gUnk_0810B740[]; +extern u16 gUnk_0810B790[]; +extern u16 gUnk_0810B7BA[]; +extern u32 gUnk_0810B7C0[]; -void Townsperson(Entity *this) -{ - if ((this->flags & 2) != 0) { - gUnk_0810B77C[this->action](this); - } - else { - gUnk_0810B774[this->action](this); - } +void Townsperson(Entity* this) { + if ((this->flags & 2) != 0) { + gUnk_0810B77C[this->action](this); + } else { + gUnk_0810B774[this->action](this); + } } -void sub_08061BC8(Entity *this) -{ - if (LoadExtraSpriteData(this, gUnk_0810B6EC[this->entityType.form])) { - this->animationState = 2; - this->field_0xf = this->entityType.form + 1; - this->action++; - sub_08061CB4(this, 2); - } +void sub_08061BC8(Entity* this) { + if (LoadExtraSpriteData(this, gUnk_0810B6EC[this->entityType.form])) { + this->animationState = 2; + this->field_0xf = this->entityType.form + 1; + this->action++; + sub_08061CB4(this, 2); + } } -void sub_08061C00(Entity *this) +void sub_08061C00(Entity* this) { + s32 uVar1; + + uVar1 = sub_0806ED9C(this, 0x20, 0x20); + if (uVar1 < 0) { + uVar1 = this->animationState + 4; + } else { + if (this->field_0xf == 0) { + this->field_0xf = 0x10; + } else { + this->field_0xf--; + uVar1 = this->animIndex & 3; + } + } + sub_08061CB4(this, uVar1); + sub_0806ED78(this); + if (this->interactType != 0) { + this->interactType = 0; + TextboxNoOverlapFollow(this->entityType.parameter + 0xa01); + } +} + +#if NON_MATCHING +void Townsperson_Head(Entity* this) { + SetExtraSpriteFrame(this, 0, + *(gUnk_0810B78C + (this->animIndex & 3)) + gUnk_0810B680[this->entityType.form].frame1); + SetExtraSpriteFrame(this, 1, this->frameIndex + gUnk_0810B680[this->entityType.form].frame2); + SetSpriteSubEntryOffsetData1(this, 1, 0); + sub_0807000C(this); +} +#else +NAKED +void Townsperson_Head(Entity* this) { + asm(".include \"asm/non_matching/townsperson/sub_08061C60.inc\""); +} +#endif + +void sub_08061CB4(Entity* this, u32 arg1) { + if (this->animIndex != arg1) { + InitializeAnimation(this, arg1); + } else { + GetNextFrame(this); + } + if (this->frameDuration == 0xff) { + this->frameDuration = gUnk_0810B680[this->entityType.form].unk2; + } +} + +void sub_08061CEC(Entity* this) { + u32 uVar2; + + if (LoadExtraSpriteData(this, gUnk_0810B6EC[this->entityType.form])) { + this->action = 1; + this->spriteSettings.b.draw = TRUE; + this->animationState = this->actionDelay; + this->field_0x69 = 0xff; + uVar2 = sub_0805ACC0(this); + if (uVar2 == 0) { + this->field_0x6a.HWORD = this->x.HALF.HI; + uVar2 = (u16)this->y.HALF.HI; + } else { + this->field_0x6a.HWORD = (uVar2 >> 0x10); + } + *(u16*)&this->field_0x6c = uVar2; + this->field_0x68 = sub_0801E99C(this); + sub_0807DD64(this); + sub_08061D64(this); + } +} + +void sub_08061D64(Entity* this) { + if (this->interactType == 2) { + this->action = 3; + this->interactType = 0; + sub_0806F118(this); + this->field_0x69 = this->animIndex; + InitializeAnimation(this, (this->animIndex & -4) + sub_0806F5A4(GetFacingDirection(this, &gLinkEntity))); + } else { + sub_0807DDAC(this, 0); + sub_0807DDE4(this); + if (this->frameDuration == 0xff) { + this->frameDuration = gUnk_0810B680[this->entityType.form].unk2; + } + GetNextFrame(this); + if (this->interactType != 0) { + this->action = 2; + this->interactType = 0; + sub_08062048(this); + this->field_0x69 = this->animIndex; + InitializeAnimation(this, (this->animIndex & -4) + sub_0806F5A4(GetFacingDirection(this, &gLinkEntity))); + } + } +} + +void sub_08061E24(Entity* this) { + GetNextFrame(this); + if ((gTextBox.doTextBox & 0x7f) == 0) { + this->action = 1; + InitializeAnimation(this, this->field_0x69); + } +} + +void sub_08061E50(Entity* this) { + + if (UpdateFuseInteraction(this) != 0) { + this->action = 1; + InitializeAnimation(this, this->field_0x69); + } +} + +void sub_08061E70(Entity* this) { + if ((this->entityType).subtype == 6) { + sub_08078784(this, this->field_0x68); + } else { + sub_08078778(this); + } +} + +void sub_08061E90(Entity* this, Entity* arg1) { + u32 animIndex; + s32 iVar4; + + if (arg1->spriteSettings.raw == 0) { + arg1->spriteSettings.raw++; + arg1->spriteTileSize = (Random() & 0x3f) + 0x20; + animIndex = Random() & 0x18; + switch (this->direction) { + case 0x0: + if (animIndex == 0x10) { + animIndex = 0x8; + } + break; + case 0x8: + if (animIndex == 0x18) { + animIndex = 0x10; + } + break; + case 0x10: + if (animIndex == 0x0) { + animIndex = 0x18; + } + break; + case 0x18: + if (animIndex == 0x8) { + animIndex = 0; + } + } + this->direction = (u8)animIndex; + this->animationState = sub_0806F5B0(animIndex); + this->nonPlanarMovement = gUnk_0810B74A[this->entityType.form]; + } + animIndex = (this->animationState >> 1) + 4; + if (animIndex != this->animIndex) { + InitializeAnimation(this, animIndex); + } + sub_080AEF88(this); + iVar4 = this->x.HALF.HI - *(s16*)&this->field_0x6a.HWORD; + if (0x10 < iVar4) { + this->x.HALF.HI = this->field_0x6a.HWORD + 0x10; + arg1->spriteTileSize = 1; + } + if (iVar4 < -0x10) { + this->x.HALF.HI = *(s16*)&this->field_0x6a.HWORD - 0x10; + arg1->spriteTileSize = 1; + } + + iVar4 = this->y.HALF.HI - *(s16*)&this->field_0x6c; + if (0x10 < iVar4) { + this->y.HALF.HI = *(s16*)&this->field_0x6c + 0x10; + arg1->spriteTileSize = 1; + } + if (iVar4 < -0x10) { + this->y.HALF.HI = *(s16*)&this->field_0x6c - 0x10; + arg1->spriteTileSize = 1; + } + if (--arg1->spriteTileSize != 0) { + gUnk_02033280[6] = 0; + } +} + +void sub_08061F94(Entity* this) { + Entity* ent; + + ent = CreateFx(this, 0x35, 0); + if (ent != NULL) { + ResolveEntityOnTop(this, ent); + } +} + +void sub_08061FB0(Entity* this) { + this->boundingBox = NULL; +} + +void sub_08061FB8(Entity* this, struct_08061FB8* arg1) { + u8* temp = gUnk_0810B748; + + sub_08078850(this, 1, temp[arg1->unk2], &gUnk_0810B740[arg1->unk2]); +} + +void sub_08061FD8(Entity* this) { + InitializeAnimation(this, this->animationState >> 1); +} + +void sub_08061FE4(Entity* this) { + InitializeAnimation(this, (this->animationState >> 1) + 4); +} + +void sub_08061FF4(Entity* this) { + TextboxNoOverlap(gUnk_0810B790[this->entityType.form], this); +} + +void sub_0806200C(Entity* this) { + u32 index; + + index = 0; + if ((CheckGlobalFlag(0x29) != 0) && (CheckLocalFlag(0x6b))) { + + // hyrule bestiary + if (GetInventoryValue(0x39) == 2) { + index = 2; + } else { + index = 1; + } + } + TextboxNoOverlap(gUnk_0810B7BA[index], this); +} + +void sub_08062048(Entity *this) { - s32 uVar1; + int iVar1; - uVar1 = sub_0806ED9C(this, 0x20, 0x20); - if (uVar1 < 0) { - uVar1 = this->animationState + 4; + if ((this->entityType).subtype == 6) { + iVar1 = gUnk_02002A40.unk - 2; + if (iVar1 < 0) { + iVar1 = 0; + } + ShowNPCDialogue(this, gUnk_0810B7C0 + this->entityType.form * 0x10 + iVar1 * 2); } else { - if (this->field_0xf == 0) { - this->field_0xf = 0x10; - } - else { - this->field_0xf--; - uVar1 = this->animIndex & 3; - } + TextboxNoOverlap(0, this); } - sub_08061CB4(this, uVar1); - sub_0806ED78(this); - if (this->interactType != 0) { - this->interactType = 0; - TextboxNoOverlapFollow(this->entityType.parameter + 0xa01); +} + +void Townsperson_Fusion(Entity *this) +{ + if (this->action == 0) { + if (LoadExtraSpriteData(this, gUnk_0810B6EC[this->entityType.form]) == 0) { + return; + } + this->action++; + this->spriteSettings.b.draw = TRUE; } + sub_08061CB4(this, 6); } \ No newline at end of file