From 54ae9dfa85b4dffae5d314ca27b3071f8f863509 Mon Sep 17 00:00:00 2001 From: octorock <79596758+octorock@users.noreply.github.com> Date: Fri, 14 May 2021 18:29:45 +0200 Subject: [PATCH] Decompile kid --- asm/non_matching/kid/Kid_Head.inc | 127 ++++++++ asm/non_matching/kid/sub_080621AC.inc | 173 ++++++++++ asm/non_matching/kid/sub_080622F4.inc | 275 ++++++++++++++++ asm/non_matching/kid/sub_0806252C.inc | 131 ++++++++ asm/non_matching/kid/sub_08062634.inc | 23 ++ asm/non_matching/kid/sub_0806265C.inc | 34 ++ asm/non_matching/kid/sub_080626E0.inc | 90 ++++++ asm/non_matching/kid/sub_08062948.inc | 142 ++++++++ linker.ld | 2 +- src/npc/kid.c | 444 ++++++++++++++++++++++++++ 10 files changed, 1440 insertions(+), 1 deletion(-) create mode 100644 asm/non_matching/kid/Kid_Head.inc create mode 100644 asm/non_matching/kid/sub_080621AC.inc create mode 100644 asm/non_matching/kid/sub_080622F4.inc create mode 100644 asm/non_matching/kid/sub_0806252C.inc create mode 100644 asm/non_matching/kid/sub_08062634.inc create mode 100644 asm/non_matching/kid/sub_0806265C.inc create mode 100644 asm/non_matching/kid/sub_080626E0.inc create mode 100644 asm/non_matching/kid/sub_08062948.inc create mode 100644 src/npc/kid.c diff --git a/asm/non_matching/kid/Kid_Head.inc b/asm/non_matching/kid/Kid_Head.inc new file mode 100644 index 00000000..4d98f33f --- /dev/null +++ b/asm/non_matching/kid/Kid_Head.inc @@ -0,0 +1,127 @@ + .syntax unified + .text + +Kid_Head: @ 0x08062834 + push {r4, r5, r6, r7, lr} + adds r5, r0, #0 + ldrb r4, [r5, #0xa] + lsls r0, r4, #2 + mov ip, r0 + ldr r2, _08062868 @ =gUnk_0810C0A0 + add r2, ip + adds r0, r5, #0 + adds r0, #0x5a + ldrb r3, [r0] + movs r1, #0x1f + adds r0, r1, #0 + ands r0, r3 + ldrb r3, [r2] + adds r6, r0, r3 + ldrb r0, [r5, #0x1e] + ands r1, r0 + ldrb r2, [r2, #1] + adds r7, r1, r2 + cmp r4, #8 + bhi _08062946 + ldr r0, _0806286C @ =_08062870 + add r0, ip + ldr r0, [r0] + mov pc, r0 + .align 2, 0 +_08062868: .4byte gUnk_0810C0A0 +_0806286C: .4byte _08062870 @ jump table +_08062870: + .4byte _08062894 @ case 0 + .4byte _08062894 @ case 1 + .4byte _08062894 @ case 2 + .4byte _08062894 @ case 3 + .4byte _08062894 @ case 4 + .4byte _08062894 @ case 5 + .4byte _080628D8 @ case 6 + .4byte _08062922 @ case 7 + .4byte _08062922 @ case 8 +_08062894: + adds r0, r5, #0 + adds r0, #0x5b + ldrb r1, [r0] + movs r0, #0x30 + ands r0, r1 + lsrs r4, r0, #4 + cmp r4, #0 + beq _080628A6 + adds r4, #0x50 +_080628A6: + subs r4, #1 + adds r0, r5, #0 + movs r1, #0 + adds r2, r6, #0 + bl SetExtraSpriteFrame + adds r0, r5, #0 + movs r1, #1 + adds r2, r7, #0 + bl SetExtraSpriteFrame + adds r0, r5, #0 + movs r1, #2 + adds r2, r4, #0 + bl SetExtraSpriteFrame + adds r0, r5, #0 + movs r1, #1 + movs r2, #0 + bl SetSpriteSubEntryOffsetData1 + adds r0, r5, #0 + movs r1, #1 + movs r2, #2 + b _08062916 +_080628D8: + adds r0, r5, #0 + adds r0, #0x5b + ldrb r0, [r0] + movs r2, #0xf + ands r2, r0 + cmp r2, #0 + beq _080628E8 + adds r2, #0x93 +_080628E8: + subs r2, #1 + adds r0, r5, #0 + movs r1, #0 + bl SetExtraSpriteFrame + adds r0, r5, #0 + movs r1, #1 + adds r2, r6, #0 + bl SetExtraSpriteFrame + adds r0, r5, #0 + movs r1, #2 + adds r2, r7, #0 + bl SetExtraSpriteFrame + adds r0, r5, #0 + movs r1, #2 + movs r2, #1 + bl SetSpriteSubEntryOffsetData1 + adds r0, r5, #0 + movs r1, #1 + movs r2, #0 +_08062916: + bl SetSpriteSubEntryOffsetData2 + adds r0, r5, #0 + bl sub_0807000C + b _08062946 +_08062922: + adds r0, r5, #0 + movs r1, #0 + adds r2, r6, #0 + bl SetExtraSpriteFrame + adds r0, r5, #0 + movs r1, #1 + adds r2, r7, #0 + bl SetExtraSpriteFrame + adds r0, r5, #0 + movs r1, #1 + movs r2, #0 + bl SetSpriteSubEntryOffsetData1 + adds r0, r5, #0 + bl sub_0807000C +_08062946: + pop {r4, r5, r6, r7, pc} + + .syntax divided diff --git a/asm/non_matching/kid/sub_080621AC.inc b/asm/non_matching/kid/sub_080621AC.inc new file mode 100644 index 00000000..e474a346 --- /dev/null +++ b/asm/non_matching/kid/sub_080621AC.inc @@ -0,0 +1,173 @@ + .syntax unified + .text + +sub_080621AC: @ 0x080621AC + push {r4, r5, r6, lr} + adds r4, r0, #0 + ldrb r5, [r4, #0xc] + cmp r5, #1 + beq _08062234 + cmp r5, #1 + bgt _080621C0 + cmp r5, #0 + beq _080621CE + b _080622F2 +_080621C0: + cmp r5, #2 + bne _080621C6 + b _080622CC +_080621C6: + cmp r5, #3 + bne _080621CC + b _080622E4 +_080621CC: + b _080622F2 +_080621CE: + ldr r1, _0806221C @ =gUnk_0810BDC4 + ldrb r0, [r4, #0xa] + lsls r0, r0, #2 + adds r0, r0, r1 + ldr r1, [r0] + adds r0, r4, #0 + bl LoadExtraSpriteData + cmp r0, #0 + bne _080621E4 + b _080622F2 +_080621E4: + movs r0, #1 + strb r0, [r4, #0xc] + ldrb r0, [r4, #0xe] + strb r0, [r4, #0x14] + strb r5, [r4, #0xe] + adds r0, r4, #0 + adds r0, #0x68 + strb r5, [r0] + adds r0, #1 + strb r5, [r0] + adds r1, r4, #0 + adds r1, #0x6b + movs r0, #0xff + strb r0, [r1] + adds r0, r4, #0 + bl sub_0805ACC0 + adds r2, r0, #0 + cmp r2, #0 + bne _08062220 + ldrh r0, [r4, #0x2e] + adds r1, r4, #0 + adds r1, #0x6c + strh r0, [r1] + ldrh r0, [r4, #0x32] + adds r1, #2 + strh r0, [r1] + b _0806222C + .align 2, 0 +_0806221C: .4byte gUnk_0810BDC4 +_08062220: + lsrs r1, r2, #0x10 + adds r0, r4, #0 + adds r0, #0x6c + strh r1, [r0] + adds r0, #2 + strh r2, [r0] +_0806222C: + adds r0, r4, #0 + bl sub_0807DD50 + b _080622F2 +_08062234: + adds r5, r4, #0 + adds r5, #0x39 + movs r1, #0 + ldrsb r1, [r5, r1] + cmp r1, #2 + bne _08062252 + movs r1, #0 + movs r0, #3 + strb r0, [r4, #0xc] + strb r1, [r5] + adds r0, r4, #0 + bl sub_0806F118 + adds r5, #0x1f + b _0806229A +_08062252: + adds r0, r4, #0 + adds r0, #0x68 + movs r6, #0 + ldrsb r6, [r0, r6] + cmp r6, #0 + beq _08062274 + cmp r1, #0 + beq _0806226C + movs r1, #0 + movs r0, #2 + strb r0, [r4, #0xc] + strb r1, [r5] + b _0806228A +_0806226C: + adds r0, r4, #0 + bl sub_080622F4 + b _080622F2 +_08062274: + adds r0, r4, #0 + movs r1, #0 + bl sub_0807DD94 + movs r0, #0 + ldrsb r0, [r5, r0] + cmp r0, #0 + beq _080622F2 + movs r0, #2 + strb r0, [r4, #0xc] + strb r6, [r5] +_0806228A: + adds r0, r4, #0 + adds r0, #0x84 + ldr r1, [r0] + adds r0, r4, #0 + bl sub_0806265C + adds r5, r4, #0 + adds r5, #0x58 +_0806229A: + ldrb r0, [r5] + adds r1, r4, #0 + adds r1, #0x6b + strb r0, [r1] + ldrb r0, [r5] + cmp r0, #7 + bhi _080622F2 + ldr r1, _080622C8 @ =gPlayerEntity + adds r0, r4, #0 + bl GetFacingDirection + bl sub_0806F5A4 + ldrb r1, [r5] + movs r2, #4 + rsbs r2, r2, #0 + ands r1, r2 + adds r1, r1, r0 + adds r0, r4, #0 + bl InitializeAnimation + b _080622F2 + .align 2, 0 +_080622C8: .4byte gPlayerEntity +_080622CC: + adds r0, r4, #0 + bl GetNextFrame + ldr r0, _080622E0 @ =gTextBox + ldrb r1, [r0] + movs r0, #0x7f + ands r0, r1 + cmp r0, #0 + bne _080622F2 + b _080622EE + .align 2, 0 +_080622E0: .4byte gTextBox +_080622E4: + adds r0, r4, #0 + bl UpdateFuseInteraction + cmp r0, #0 + beq _080622F2 +_080622EE: + movs r0, #1 + strb r0, [r4, #0xc] +_080622F2: + pop {r4, r5, r6, pc} + .syntax divided diff --git a/asm/non_matching/kid/sub_080622F4.inc b/asm/non_matching/kid/sub_080622F4.inc new file mode 100644 index 00000000..94e8ae01 --- /dev/null +++ b/asm/non_matching/kid/sub_080622F4.inc @@ -0,0 +1,275 @@ + .syntax unified + .text + +sub_080622F4: @ 0x080622F4 + push {r4, r5, r6, r7, lr} + mov r7, sb + mov r6, r8 + push {r6, r7} + adds r7, r0, #0 + ldr r0, _0806239C @ =gPlayerEntity + mov r8, r0 + ldrh r1, [r0, #0x2e] + ldr r3, _080623A0 @ =0xFFFF0000 + adds r0, r3, #0 + ands r0, r5 + orrs r0, r1 + mov r2, r8 + ldrh r1, [r2, #0x32] + lsls r1, r1, #0x10 + ldr r2, _080623A4 @ =0x0000FFFF + ands r0, r2 + adds r5, r0, #0 + orrs r5, r1 + mov r1, r8 + ldrh r0, [r1, #0x36] + ands r3, r6 + orrs r3, r0 + ldr r0, _080623A8 @ =gPlayerState + adds r0, #0xa8 + ldrb r0, [r0] + lsls r0, r0, #0x10 + ldr r2, _080623AC @ =0xFF00FFFF + ands r2, r3 + orrs r2, r0 + ldrb r1, [r1, #0x14] + movs r0, #0x3f + ands r1, r0 + lsls r1, r1, #0x18 + ldr r0, _080623B0 @ =0xC0FFFFFF + ands r0, r2 + orrs r0, r1 + mov r1, r8 + adds r1, #0x38 + ldrb r1, [r1] + lsls r1, r1, #0x1e + ldr r2, _080623B4 @ =0x3FFFFFFF + ands r0, r2 + adds r6, r0, #0 + orrs r6, r1 + ldr r4, [r7, #0x64] + ldrb r0, [r4, #6] + cmp r0, #0x16 + bne _080623BE + lsrs r0, r6, #0x10 + lsls r0, r0, #0x18 + lsrs r0, r0, #0x18 + cmp r0, #0x16 + beq _080623BE + movs r2, #0x2e + ldrsh r1, [r7, r2] + mov r3, r8 + movs r2, #0x2e + ldrsh r0, [r3, r2] + subs r2, r1, r0 + movs r0, #0x32 + ldrsh r3, [r7, r0] + mov sb, r3 + mov r1, r8 + movs r3, #0x32 + ldrsh r0, [r1, r3] + mov r3, sb + subs r1, r3, r0 + cmp r2, #0 + bge _08062382 + rsbs r2, r2, #0 +_08062382: + cmp r1, #0 + bge _08062388 + rsbs r1, r1, #0 +_08062388: + cmp r2, #0x78 + bgt _08062390 + cmp r1, #0x50 + ble _080623B8 +_08062390: + adds r1, r7, #0 + adds r1, #0x68 + movs r0, #0 + strb r0, [r1] + b _080624F8 + .align 2, 0 +_0806239C: .4byte gPlayerEntity +_080623A0: .4byte 0xFFFF0000 +_080623A4: .4byte 0x0000FFFF +_080623A8: .4byte gPlayerState +_080623AC: .4byte 0xFF00FFFF +_080623B0: .4byte 0xC0FFFFFF +_080623B4: .4byte 0x3FFFFFFF +_080623B8: + adds r0, r7, #0 + bl sub_0806252C +_080623BE: + movs r0, #0 + mov sb, r0 + ldr r0, [r4] + cmp r5, r0 + bne _080623CE + ldr r0, [r4, #4] + cmp r6, r0 + beq _08062410 +_080623CE: + ldr r4, [r7, #0x64] + adds r4, #0x90 + movs r1, #0x69 + adds r1, r1, r7 + mov r8, r1 + adds r3, r7, #0 + adds r3, #0x38 + movs r2, #0x58 + adds r2, r2, r7 + mov ip, r2 + movs r2, #0x12 +_080623E4: + ldr r0, [r4] + ldr r1, [r4, #4] + str r0, [r4, #8] + str r1, [r4, #0xc] + subs r4, #8 + subs r2, #1 + cmp r2, #0 + bge _080623E4 + ldr r4, [r7, #0x64] + str r5, [r4] + str r6, [r4, #4] + movs r0, #4 + mov sb, r0 + mov r2, r8 + ldrb r1, [r2] + movs r0, #0 + ldrsb r0, [r2, r0] + cmp r0, #0 + ble _08062484 + subs r0, r1, #1 + strb r0, [r2] + b _08062484 +_08062410: + adds r4, #0x98 + movs r3, #4 + ldrsh r0, [r4, r3] + cmp r0, #0 + bge _08062442 + ldr r4, [r7, #0x64] + adds r4, #0x90 + movs r0, #0x69 + adds r0, r0, r7 + mov r8, r0 + adds r3, r7, #0 + adds r3, #0x38 + movs r1, #0x58 + adds r1, r1, r7 + mov ip, r1 + movs r2, #0x12 +_08062430: + ldr r0, [r4] + ldr r1, [r4, #4] + str r0, [r4, #8] + str r1, [r4, #0xc] + subs r4, #8 + subs r2, #1 + cmp r2, #0 + bge _08062430 + b _08062480 +_08062442: + ldr r1, _080624E8 @ =gPlayerEntity + movs r3, #0x2e + ldrsh r0, [r1, r3] + movs r2, #0x32 + ldrsh r1, [r1, r2] + ldrh r2, [r4] + ldrh r3, [r4, #2] + bl sub_080041E8 + lsrs r0, r0, #4 + movs r3, #0x69 + adds r3, r3, r7 + mov r8, r3 + adds r3, r7, #0 + adds r3, #0x38 + movs r1, #0x58 + adds r1, r1, r7 + mov ip, r1 + cmp r0, #0x18 + ble _08062484 + ldr r4, [r7, #0x64] + adds r4, #0x90 + movs r2, #0x12 +_08062470: + ldr r0, [r4] + ldr r1, [r4, #4] + str r0, [r4, #8] + str r1, [r4, #0xc] + subs r4, #8 + subs r2, #1 + cmp r2, #0 + bge _08062470 +_08062480: + movs r2, #4 + mov sb, r2 +_08062484: + ldr r4, [r7, #0x64] + adds r4, #0x98 + ldrh r0, [r4] + strh r0, [r7, #0x2e] + ldrh r0, [r4, #2] + strh r0, [r7, #0x32] + ldrh r0, [r4, #4] + strh r0, [r7, #0x36] + ldrb r0, [r4, #7] + lsls r0, r0, #0x1a + lsrs r0, r0, #0x1a + strb r0, [r7, #0x14] + ldrb r0, [r4, #7] + lsrs r0, r0, #6 + strb r0, [r3] + mov r1, r8 + ldrb r2, [r1] + movs r0, #0 + ldrsb r0, [r1, r0] + cmp r0, #0 + ble _080624B2 + subs r0, r2, #1 + strb r0, [r1] +_080624B2: + mov r2, sb + ldrb r0, [r7, #0x14] + lsrs r0, r0, #1 + add sb, r0 + ldrb r0, [r7, #0xa] + cmp r0, #6 + bne _080624C4 + movs r3, #0x10 + add sb, r3 +_080624C4: + mov r0, ip + ldrb r0, [r0] + cmp sb, r0 + beq _080624EC + cmp r2, #0 + bne _080624D8 + movs r0, #0 + ldrsb r0, [r1, r0] + cmp r0, #0 + bgt _080624EC +_080624D8: + adds r0, r7, #0 + mov r1, sb + bl InitAnimationForceUpdate + movs r0, #0x1e + mov r1, r8 + strb r0, [r1] + b _080624F2 + .align 2, 0 +_080624E8: .4byte gPlayerEntity +_080624EC: + adds r0, r7, #0 + bl UpdateAnimationSingleFrame +_080624F2: + adds r0, r7, #0 + bl sub_0800451C +_080624F8: + pop {r3, r4} + mov r8, r3 + mov sb, r4 + pop {r4, r5, r6, r7, pc} + + .syntax divided diff --git a/asm/non_matching/kid/sub_0806252C.inc b/asm/non_matching/kid/sub_0806252C.inc new file mode 100644 index 00000000..c647a74c --- /dev/null +++ b/asm/non_matching/kid/sub_0806252C.inc @@ -0,0 +1,131 @@ + .syntax unified + .text + +sub_0806252C: @ 0x0806252C + push {r4, r5, r6, r7, lr} + mov r7, sl + mov r6, sb + mov r5, r8 + push {r5, r6, r7} + adds r7, r0, #0 + ldr r4, _08062618 @ =gPlayerEntity + ldrh r1, [r4, #0x2e] + ldr r3, _0806261C @ =0xFFFF0000 + adds r0, r3, #0 + ands r0, r5 + orrs r0, r1 + ldrh r1, [r4, #0x32] + lsls r1, r1, #0x10 + ldr r2, _08062620 @ =0x0000FFFF + ands r0, r2 + adds r5, r0, #0 + orrs r5, r1 + ldrh r0, [r4, #0x36] + ands r3, r6 + orrs r3, r0 + ldr r0, _08062624 @ =gPlayerState + adds r0, #0xa8 + ldrb r0, [r0] + lsls r0, r0, #0x10 + ldr r2, _08062628 @ =0xFF00FFFF + ands r2, r3 + orrs r2, r0 + ldrb r1, [r4, #0x14] + movs r0, #0x3f + ands r1, r0 + lsls r1, r1, #0x18 + ldr r0, _0806262C @ =0xC0FFFFFF + ands r0, r2 + orrs r0, r1 + adds r1, r4, #0 + adds r1, #0x38 + ldrb r1, [r1] + lsls r1, r1, #0x1e + ldr r2, _08062630 @ =0x3FFFFFFF + ands r0, r2 + adds r6, r0, #0 + orrs r6, r1 + movs r0, #0x2e + ldrsh r1, [r4, r0] + movs r2, #0x2e + ldrsh r0, [r7, r2] + subs r1, r1, r0 + mov sl, r1 + movs r0, #0x32 + ldrsh r1, [r4, r0] + movs r2, #0x32 + ldrsh r0, [r7, r2] + subs r1, r1, r0 + mov r8, r1 + mov r1, sl + lsls r0, r1, #0x10 + asrs r0, r0, #0x10 + movs r1, #0x14 + bl FixedDiv + lsls r0, r0, #0x10 + asrs r0, r0, #0x10 + mov sl, r0 + mov r2, r8 + lsls r0, r2, #0x10 + asrs r0, r0, #0x10 + movs r1, #0x14 + bl FixedDiv + lsls r0, r0, #0x10 + asrs r0, r0, #0x10 + mov r8, r0 + ldr r3, [r7, #0x64] + movs r0, #0 + mov sb, r0 + mov ip, r0 + movs r4, #0x13 +_080625C8: + mov r1, ip + asrs r0, r1, #8 + subs r0, r5, r0 + strh r0, [r3] + lsrs r0, r5, #0x10 + mov r2, sb + asrs r1, r2, #8 + subs r0, r0, r1 + strh r0, [r3, #2] + strh r6, [r3, #4] + lsrs r0, r6, #0x10 + strb r0, [r3, #6] + ldrb r0, [r7, #0x14] + movs r1, #0x3f + ands r1, r0 + ldrb r2, [r3, #7] + movs r0, #0x40 + rsbs r0, r0, #0 + ands r0, r2 + orrs r0, r1 + strb r0, [r3, #7] + adds r1, r7, #0 + adds r1, #0x38 + ldrb r1, [r1] + lsls r1, r1, #6 + movs r2, #0x3f + ands r0, r2 + orrs r0, r1 + strb r0, [r3, #7] + adds r3, #8 + add sb, r8 + add ip, sl + subs r4, #1 + cmp r4, #0 + bge _080625C8 + pop {r3, r4, r5} + mov r8, r3 + mov sb, r4 + mov sl, r5 + pop {r4, r5, r6, r7, pc} + .align 2, 0 +_08062618: .4byte gPlayerEntity +_0806261C: .4byte 0xFFFF0000 +_08062620: .4byte 0x0000FFFF +_08062624: .4byte gPlayerState +_08062628: .4byte 0xFF00FFFF +_0806262C: .4byte 0xC0FFFFFF +_08062630: .4byte 0x3FFFFFFF + + .syntax divided diff --git a/asm/non_matching/kid/sub_08062634.inc b/asm/non_matching/kid/sub_08062634.inc new file mode 100644 index 00000000..0fe2a5cf --- /dev/null +++ b/asm/non_matching/kid/sub_08062634.inc @@ -0,0 +1,23 @@ + .syntax unified + .text + +sub_08062634: @ 0x08062634 + push {r4, r5, lr} + adds r5, r0, #0 + ldrb r4, [r5, #0xb] + bl Random + movs r1, #1 + ands r1, r0 + ldr r0, _08062658 @ =gUnk_0810BDE8 + lsls r1, r1, #1 + lsls r4, r4, #2 + adds r1, r1, r4 + adds r1, r1, r0 + ldrh r0, [r1] + adds r1, r5, #0 + bl TextboxNoOverlap + pop {r4, r5, pc} + .align 2, 0 +_08062658: .4byte gUnk_0810BDE8 + + .syntax divided diff --git a/asm/non_matching/kid/sub_0806265C.inc b/asm/non_matching/kid/sub_0806265C.inc new file mode 100644 index 00000000..b4f5dcf9 --- /dev/null +++ b/asm/non_matching/kid/sub_0806265C.inc @@ -0,0 +1,34 @@ + .syntax unified + .text + +sub_0806265C: @ 0x0806265C + push {lr} + adds r2, r0, #0 + ldr r3, _08062674 @ =gSave + ldrb r0, [r3, #8] + cmp r0, #0 + bne _08062678 + movs r0, #0 + adds r1, r2, #0 + bl TextboxNoOverlap + b _08062690 + .align 2, 0 +_08062674: .4byte gSave +_08062678: + ldrb r0, [r2, #0xa] + lsls r1, r0, #3 + adds r1, r1, r0 + lsls r1, r1, #3 + ldr r0, _08062694 @ =gUnk_0810BE10 + adds r1, r1, r0 + ldrb r0, [r3, #8] + lsls r0, r0, #3 + adds r1, r1, r0 + adds r0, r2, #0 + bl ShowNPCDialogue +_08062690: + pop {pc} + .align 2, 0 +_08062694: .4byte gUnk_0810BE10 + + .syntax divided diff --git a/asm/non_matching/kid/sub_080626E0.inc b/asm/non_matching/kid/sub_080626E0.inc new file mode 100644 index 00000000..ebdce74f --- /dev/null +++ b/asm/non_matching/kid/sub_080626E0.inc @@ -0,0 +1,90 @@ + .syntax unified + .text + +sub_080626E0: @ 0x080626E0 + push {r4, r5, lr} + adds r5, r0, #0 + adds r4, r1, #0 + ldrb r0, [r4, #0x18] + cmp r0, #0 + bne _0806270E + adds r0, #1 + strb r0, [r4, #0x18] + movs r0, #0xa + strb r0, [r4, #0x19] + ldr r0, [r4, #8] + movs r1, #2 + orrs r0, r1 + str r0, [r4, #8] + ldrh r2, [r4, #4] + ldr r1, _08062778 @ =gRoomControls + ldrh r0, [r4, #6] + ldrh r3, [r1, #6] + adds r0, r0, r3 + strh r0, [r4, #0x1e] + ldrh r0, [r1, #8] + adds r0, r0, r2 + strh r0, [r4, #0x22] +_0806270E: + ldrb r0, [r4, #0x19] + subs r0, #1 + strb r0, [r4, #0x19] + lsls r0, r0, #0x18 + cmp r0, #0 + bne _0806274A + movs r0, #0xa + strb r0, [r4, #0x19] + movs r1, #0x1e + ldrsh r0, [r4, r1] + movs r2, #0x2e + ldrsh r1, [r5, r2] + subs r0, r0, r1 + movs r3, #0x22 + ldrsh r1, [r4, r3] + movs r3, #0x32 + ldrsh r2, [r5, r3] + subs r1, r1, r2 + bl sub_080045DA + strb r0, [r5, #0x15] + bl Random + movs r1, #0xb + bl __modsi3 + ldrb r1, [r5, #0x15] + adds r1, r1, r0 + subs r1, #5 + strb r1, [r5, #0x15] +_0806274A: + movs r0, #0x24 + ldrsh r1, [r5, r0] + ldrb r2, [r5, #0x15] + adds r0, r5, #0 + bl sub_0806F62C + movs r2, #0x2e + ldrsh r1, [r5, r2] + movs r3, #0x1e + ldrsh r0, [r4, r3] + subs r1, r1, r0 + lsls r1, r1, #8 + ldrh r0, [r5, #0x24] + lsls r0, r0, #0x10 + asrs r0, r0, #0x11 + adds r1, r1, r0 + movs r2, #0x24 + ldrsh r0, [r5, r2] + cmp r1, r0 + bhi _0806277C + ldrh r0, [r4, #0x1e] + strh r0, [r5, #0x2e] + b _08062782 + .align 2, 0 +_08062778: .4byte gRoomControls +_0806277C: + ldr r1, _08062784 @ =gActiveScriptInfo + movs r0, #0 + strb r0, [r1, #6] +_08062782: + pop {r4, r5, pc} + .align 2, 0 +_08062784: .4byte gActiveScriptInfo + + .syntax divided diff --git a/asm/non_matching/kid/sub_08062948.inc b/asm/non_matching/kid/sub_08062948.inc new file mode 100644 index 00000000..e698b073 --- /dev/null +++ b/asm/non_matching/kid/sub_08062948.inc @@ -0,0 +1,142 @@ + .syntax unified + .text + +sub_08062948: @ 0x08062948 + push {r4, r5, r6, lr} + adds r4, r0, #0 + adds r6, r1, #0 + ldrb r0, [r6, #0x18] + cmp r0, #0 + bne _080629B4 + adds r0, #1 + strb r0, [r6, #0x18] + bl Random + movs r1, #0x3f + ands r0, r1 + adds r0, #0x20 + strh r0, [r6, #0x12] + bl Random + adds r1, r0, #0 + movs r0, #0x18 + ands r1, r0 + ldrb r0, [r4, #0x15] + cmp r0, #8 + beq _08062990 + cmp r0, #8 + bgt _0806297E + cmp r0, #0 + beq _08062988 + b _080629A6 +_0806297E: + cmp r0, #0x10 + beq _08062998 + cmp r0, #0x18 + beq _080629A0 + b _080629A6 +_08062988: + cmp r1, #0x10 + bne _080629A6 + movs r1, #8 + b _080629A6 +_08062990: + cmp r1, #0x18 + bne _080629A6 + movs r1, #0x10 + b _080629A6 +_08062998: + cmp r1, #0 + bne _080629A6 + movs r1, #0x18 + b _080629A6 +_080629A0: + cmp r1, #8 + bne _080629A6 + movs r1, #0 +_080629A6: + strb r1, [r4, #0x15] + adds r0, r1, #0 + bl sub_0806F5B0 + strb r0, [r4, #0x14] + movs r0, #0x80 + strh r0, [r4, #0x24] +_080629B4: + ldrb r0, [r4, #0x14] + lsrs r0, r0, #1 + adds r1, r0, #4 + adds r5, r4, #0 + adds r5, #0x58 + ldrb r0, [r5] + cmp r1, r0 + beq _080629D2 + adds r0, r4, #0 + bl InitializeAnimation + ldrb r1, [r5] + adds r0, r4, #0 + adds r0, #0x80 + strh r1, [r0] +_080629D2: + adds r0, r4, #0 + bl ProcessMovement + movs r3, #0x2e + ldrsh r1, [r4, r3] + adds r2, r4, #0 + adds r2, #0x6c + movs r5, #0 + ldrsh r0, [r2, r5] + subs r1, r1, r0 + cmp r1, #0x10 + ble _080629F4 + ldrh r0, [r2] + adds r0, #0x10 + strh r0, [r4, #0x2e] + movs r0, #1 + strh r0, [r6, #0x12] +_080629F4: + movs r3, #0x10 + rsbs r3, r3, #0 + cmp r1, r3 + bge _08062A06 + ldrh r0, [r2] + subs r0, #0x10 + strh r0, [r4, #0x2e] + movs r0, #1 + strh r0, [r6, #0x12] +_08062A06: + movs r0, #0x32 + ldrsh r1, [r4, r0] + adds r2, r4, #0 + adds r2, #0x6e + movs r5, #0 + ldrsh r0, [r2, r5] + subs r1, r1, r0 + cmp r1, #0x10 + ble _08062A22 + ldrh r0, [r2] + adds r0, #0x10 + strh r0, [r4, #0x32] + movs r0, #1 + strh r0, [r6, #0x12] +_08062A22: + cmp r1, r3 + bge _08062A30 + ldrh r0, [r2] + subs r0, #0x10 + strh r0, [r4, #0x32] + movs r0, #1 + strh r0, [r6, #0x12] +_08062A30: + ldrh r0, [r6, #0x12] + subs r0, #1 + strh r0, [r6, #0x12] + lsls r0, r0, #0x10 + cmp r0, #0 + beq _08062A42 + ldr r1, _08062A44 @ =gActiveScriptInfo + movs r0, #0 + strb r0, [r1, #6] +_08062A42: + pop {r4, r5, r6, pc} + .align 2, 0 +_08062A44: .4byte gActiveScriptInfo + + .syntax divided diff --git a/linker.ld b/linker.ld index b88eaad4..06817df7 100644 --- a/linker.ld +++ b/linker.ld @@ -556,7 +556,7 @@ SECTIONS { asm/postman.o(.text); src/npc/npc5.o(.text); src/npc/townsperson.o(.text); - asm/kid.o(.text); + src/npc/kid.o(.text); src/npc/npc9.o(.text); src/npc/stamp.o(.text); src/npc/marcy.o(.text); diff --git a/src/npc/kid.c b/src/npc/kid.c new file mode 100644 index 00000000..f265106e --- /dev/null +++ b/src/npc/kid.c @@ -0,0 +1,444 @@ +#include "entity.h" +#include "functions.h" +#include "textbox.h" +#include "npc.h" +#include "script.h" +#include "utils.h" +#include "random.h" +#include "save.h" + +extern void (*const gUnk_0810BE0C[])(Entity*); +void sub_080621AC(Entity*); + +extern SpriteLoadData* gUnk_0810BDC4[]; + +void sub_080622F4(Entity*); +void sub_0806265C(Entity*, ScriptExecutionContext*); + +void sub_0806252C(Entity*); + +typedef struct { + u16 unk_0; /* u16 */ + u16 unk_2; /* u16 */ + u16 unk_4; /* u16 */ + u8 unk_6; + u8 unk_7; +} KidHeap; + +extern u16 gUnk_0810BDE8[]; + +extern Dialog gUnk_0810BE10[]; + +extern u8 gUnk_0810C0A0[]; + +extern SpriteLoadData* gUnk_0810BDC4[]; + +void Kid(Entity* this) { + if ((this->flags & 2) != 0) { + sub_080621AC(this); + } else { + gUnk_0810BE0C[this->action](this); + } +} + +void sub_080620F4(Entity* this) { + if (LoadExtraSpriteData(this, gUnk_0810BDC4[this->type]) != 0) { + this->animationState = 4; + this->field_0x68.HALF.LO = 0; + this->action = 1; + InitAnimationForceUpdate(this, 2); + sub_08078778(this); + } +} + +void sub_08062130(Entity* this) { + if (this->interactType != 0) { + this->action = 2; + InitAnimationForceUpdate(this, GetAnimationState(this)); + } + if (this->field_0xf++ >= 0x79) { + this->field_0xf = 0; + this->actionDelay = (this->actionDelay + 1) & 7; + if (this->type == 6) { + this->actionDelay = this->actionDelay + 0x10; + } + InitAnimationForceUpdate(this, this->actionDelay); + } else { + UpdateAnimationSingleFrame(this); + } + sub_0806ED78(this); +} + +void sub_08062194(Entity* this) { + TextboxNoOverlapFollow(0); + this->action = 1; + this->interactType = 0; +} + +NONMATCH("asm/non_matching/kid/sub_080621AC.inc", void sub_080621AC(Entity* this)) { + u32 tmp; + + switch (this->action) { + case 0: + if (LoadExtraSpriteData(this, gUnk_0810BDC4[this->type]) != 0) { + this->action = 1; + this->animationState = this->actionDelay; + this->actionDelay = 0; + this->field_0x68.HALF.LO = 0; + this->field_0x68.HALF.HI = 0; + this->field_0x6a.HALF.HI = 0xff; + tmp = sub_0805ACC0(this); + if (tmp == 0) { + this->field_0x6c.HWORD = this->x.HALF.HI; + this->field_0x6e.HWORD = this->y.HALF.HI; + } else { + this->field_0x6c.HWORD = tmp >> 0x10; + this->field_0x6e.HWORD = tmp; + } + sub_0807DD50(this); + } + break; + case 1: + if (this->interactType == 2) { + this->action = 3; + this->interactType = 0; + sub_0806F118(this); + } else { + if ((s8)this->field_0x68.HALF.LO != 0) { + if (this->interactType != 0) { + this->action = 2; + this->interactType = 0; + } else { + sub_080622F4(this); + return; + } + } else { + sub_0807DD94(this, NULL); + if (this->interactType != 0) { + this->action = 2; + this->interactType = 0; + } else { + return; + } + } + sub_0806265C(this, *(ScriptExecutionContext**)&this->cutsceneBeh); + } + // TODO this needs to be moved up somehow? + this->field_0x6a.HALF.HI = this->animIndex; + if (this->animIndex < 8) { + InitializeAnimation(this, (this->animIndex & 0xfffffffc) + + sub_0806F5A4(GetFacingDirection(this, &gPlayerEntity))); + } + break; + case 2: + GetNextFrame(this); + if ((gTextBox.doTextBox & 0x7f) == 0) { + this->action = 1; + } + break; + case 3: + if (UpdateFuseInteraction(this) != 0) { + this->action = 1; + } + break; + default: + break; + } +} +END_NONMATCH + +ASM_FUNC("asm/non_matching/kid/sub_080622F4.inc", void sub_080622F4(Entity* this)) + +void sub_08062500(Entity* this) { + this->myHeap = zMalloc(0xa0); + if (this->myHeap != NULL) { + this->field_0x68.HALF.LO = 1; + sub_080788E0(this); + this->hitbox = NULL; + sub_0806252C(this); + } +} + +NONMATCH("asm/non_matching/kid/sub_0806252C.inc", void sub_0806252C(Entity* this)) { + s16 sVar1; + s16 sVar2; + u16 uVar3; + u8 uVar4; + s16 r0; + s16 sVar5; + s16 sVar6; + u8 bVar7; + KidHeap* heapObj; + s32 loopVar; + s32 iVar10; + s32 iVar11; + + uVar4 = gPlayerState.field_0xa8; + uVar3 = gPlayerEntity.height.HALF.HI; + sVar2 = gPlayerEntity.y.HALF.HI; + sVar1 = gPlayerEntity.x.HALF.HI; + r0 = gPlayerEntity.y.HALF.HI - this->y.HALF.HI; + sVar5 = FixedDiv(gPlayerEntity.x.HALF.HI - this->x.HALF.HI, 0x14); + sVar6 = FixedDiv(r0, 0x14); + heapObj = (KidHeap*)this->myHeap; + iVar10 = 0; + iVar11 = 0; + loopVar = 0x13; + while (loopVar > -1) { + heapObj->unk_0 = sVar1 - (s16)((u32)iVar11 >> 8); + heapObj->unk_2 = sVar2 - (s16)((u32)iVar10 >> 8); + heapObj->unk_4 = uVar3; + heapObj->unk_6 = uVar4; + bVar7 = this->animationState & 0x3f; + heapObj->unk_7 = (heapObj->unk_7 & 0xc0) | bVar7; + heapObj->unk_7 = bVar7 | this->collisionLayer << 6; + heapObj = heapObj + 1; + iVar10 = iVar10 + sVar6; + iVar11 = iVar11 + sVar5; + loopVar = loopVar - 1; + }; +} +END_NONMATCH + +NONMATCH("asm/non_matching/kid/sub_08062634.inc", void sub_08062634(Entity* this)) { + u8 arr = this->type2; + u32 arr2 = arr * 2 + (Random() & 1); + u16 id = gUnk_0810BDE8[arr2]; + TextboxNoOverlap(id, this); +} +END_NONMATCH + +NONMATCH("asm/non_matching/kid/sub_0806265C.inc", void sub_0806265C(Entity* this, ScriptExecutionContext* context)) { + if (gSave.unk8 == 0) { + TextboxNoOverlap(0, this); + } else { + ShowNPCDialogue(this, &gUnk_0810BE10[this->type * 9 + gSave.unk8]); + } +} +END_NONMATCH + +void sub_08062698(Entity* this) { + this->speed = (Random() & 0x3f) + 0xc0; +} + +void sub_080626AC(Entity* this) { + this->actionDelay = (Random() & 0x1f) + 0x40; +} + +void sub_080626C0(Entity* this, ScriptExecutionContext* context) { + context->condition = 0; + if ((this->actionDelay != 0) && (--this->actionDelay == 0)) { + context->condition = 1; + } +} + +NONMATCH("asm/non_matching/kid/sub_080626E0.inc", void sub_080626E0(Entity* this, ScriptExecutionContext* context)) { + // TODO second parameter might be anything as this function does not seem to be called? + s16 sVar1; + u8 bVar2; + u8 cVar3; + s32 uVar4; + + if (context->unk_18 == 0) { + context->unk_18 += 1; + context->unk_19 = 10; + context->postScriptActions |= 2; + sVar1 = *(s16*)&context->intVariable; + context->x.HALF.HI = *((u16*)&context->intVariable + 2) + gRoomControls.roomOriginX; + context->y.HALF.HI = gRoomControls.roomOriginY + sVar1; + } + bVar2 = context->unk_19 - 1; + context->unk_19 = bVar2; + if (bVar2 == 0) { + context->unk_19 = 10; + uVar4 = sub_080045DA(context->x.HALF.HI - this->x.HALF.HI, context->y.HALF.HI - this->y.HALF.HI); + this->direction = (u8)uVar4; + uVar4 = Random(); + cVar3 = uVar4 % 0xb; + this->direction = (this->direction + cVar3) - 5; + } + sub_0806F62C(this, (s32)this->speed, (u32)this->direction); + if ((u32)(s32)this->speed < + (u32)((this->x.HALF.HI - context->x.HALF.HI) * 0x100 + ((s32)((u32)(u16)this->speed << 0x10) >> 0x11))) { + gActiveScriptInfo.commandSize = 0; + } else { + this->x.HALF.HI = context->x.HALF.HI; + } +} +END_NONMATCH + +void sub_08062788(Entity* this, ScriptExecutionContext* context) { + SetTile(0x4072, 0x60b, 1); + SetTile(0x4072, 0x60c, 1); + SetTile(0x4072, 0x60d, 1); + SetTile(0x4072, 0x64b, 1); + SetTile(0x4072, 0x64c, 1); + SetTile(0x4072, 0x64d, 1); +} + +void sub_080627E8(Entity* this, ScriptExecutionContext* context) { + sub_0807BA8C(0x60b, 1); + sub_0807BA8C(0x60c, 1); + sub_0807BA8C(0x60d, 1); + sub_0807BA8C(0x64b, 1); + sub_0807BA8C(0x64c, 1); + sub_0807BA8C(0x64d, 1); +} + +NONMATCH("asm/non_matching/kid/Kid_Head.inc", void Kid_Head(Entity* this)) { + s32 iVar1; + u32 uVar2; + u32 uVar3; + u32 uVar4; + + iVar1 = (u32)this->type * 4; + uVar3 = ((u8)this->frames.all & 0x1f) + (u32)gUnk_0810C0A0[iVar1]; + uVar4 = (this->frameIndex & 0x1f) + (u32)gUnk_0810C0A0[iVar1 + 1]; + switch (this->type) { + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + uVar2 = (this->frameSpriteSettings & 0x30) >> 4; + if (uVar2 != 0) { + uVar2 = uVar2 + 0x50; + } + SetExtraSpriteFrame(this, 0, uVar3); + SetExtraSpriteFrame(this, 1, uVar4); + SetExtraSpriteFrame(this, 2, uVar2 - 1); + SetSpriteSubEntryOffsetData1(this, 1, 0); + SetSpriteSubEntryOffsetData2(this, 1, 2); + sub_0807000C(this); + break; + case 6: + uVar2 = this->frameSpriteSettings & 0xf; + if ((this->frameSpriteSettings & 0xf) != 0) { + uVar2 = uVar2 + 0x93; + } + SetExtraSpriteFrame(this, 0, uVar2 - 1); + SetExtraSpriteFrame(this, 1, uVar3); + SetExtraSpriteFrame(this, 2, uVar4); + SetSpriteSubEntryOffsetData1(this, 2, 1); + SetSpriteSubEntryOffsetData2(this, 1, 0); + sub_0807000C(this); + break; + case 7: + case 8: + SetExtraSpriteFrame(this, 0, uVar3); + SetExtraSpriteFrame(this, 1, uVar4); + SetSpriteSubEntryOffsetData1(this, 1, 0); + sub_0807000C(this); + break; + default: + break; + } +} +END_NONMATCH + +NONMATCH("asm/non_matching/kid/sub_08062948.inc", void sub_08062948(Entity* this, ScriptExecutionContext* context)) { + u8 bVar1; + u16 uVar2; + u32 uVar3; + s32 iVar4; + s16* psVar5; + + if (context->unk_18 == 0) { + context->unk_18 += 1; + context->unk_12 = (Random() & 0x3f) + 0x20; + uVar3 = Random() & 0x18; + bVar1 = this->direction; + if (bVar1 != 8) { + if (bVar1 >= 9) { + if (bVar1 == 0x10) { + if (uVar3 == 0) { + uVar3 = 0x18; + } + } else { + if ((bVar1 == 0x18) && (uVar3 == 8)) { + uVar3 = 0; + } + } + } else { + if ((bVar1 == 0) && (uVar3 == 0x10)) { + uVar3 = 8; + } + } + } else { + if (uVar3 == 0x18) { + uVar3 = 0x10; + } + } + this->direction = (u8)uVar3; + uVar3 = sub_0806F5B0(uVar3); + this->animationState = (u8)uVar3; + this->speed = 0x80; + } + uVar3 = (this->animationState >> 1) + 4; + if (uVar3 != this->animIndex) { + InitializeAnimation(this, uVar3); + this->field_0x80.HALF.LO = (u16)this->animIndex; + } + ProcessMovement(this); + iVar4 = this->x.HALF.HI - this->field_0x6c.HALF.LO; + if (0x10 < iVar4) { + this->x.HALF.HI = this->field_0x6c.HALF.LO + 0x10; + context->unk_12 = 1; + } + if (iVar4 < -0x10) { + this->x.HALF.HI = this->field_0x6c.HALF.LO + -0x10; + context->unk_12 = 1; + } + iVar4 = this->y.HALF.HI - this->field_0x6e.HALF.LO; + if (0x10 < iVar4) { + this->y.HALF.HI = this->field_0x6e.HALF.LO + 0x10; + context->unk_12 = 1; + } + if (iVar4 < -0x10) { + this->y.HALF.HI = this->field_0x6e.HALF.LO + -0x10; + context->unk_12 = 1; + } + uVar2 = context->unk_12 - 1; + context->unk_12 = uVar2; + if (uVar2 != 0) { + gActiveScriptInfo.commandSize = 0; + } +} +END_NONMATCH + +void sub_08062A48(Entity* this, ScriptExecutionContext* context) { + this->field_0x6a.HALF.LO = sub_0801E99C(this); + sub_08078784(this, this->field_0x6a.HALF.LO); +} + +void Kid_Fusion(Entity* this) { + u32 tmp; + if (this->action == 0) { + if (LoadExtraSpriteData(this, gUnk_0810BDC4[this->type]) != 0) { + this->action = this->action + 1; + this->spriteSettings.b.draw = 1; + this->y.HALF.HI = this->y.HALF.HI + -8; + tmp = 6; + if (this->type == 6) { + tmp = 0x16; + } + InitializeAnimation(this, tmp); + } + } else { + GetNextFrame(this); + } +} + +// TODO does this belong to child or next, unused entity? +extern void (*const gUnk_0810C268[])(Entity*); + +void sub_08062AB8(Entity* this) { + gUnk_0810C268[this->action](this); +} + +void sub_08062AD0(Entity* this) { +} + +void sub_08062AD4(Entity* this) { +}