From de9366028d13fa916646dc5218908e73729390d2 Mon Sep 17 00:00:00 2001 From: octorock <79596758+octorock@users.noreply.github.com> Date: Sat, 1 May 2021 22:38:06 +0200 Subject: [PATCH] Decompile cat --- asm/cat.s | 857 -------------------------------------------------- asm/npc/cat.s | 26 -- linker.ld | 2 - src/npc/cat.c | 384 +++++++++++++++++++++- 4 files changed, 383 insertions(+), 886 deletions(-) delete mode 100644 asm/cat.s delete mode 100644 asm/npc/cat.s diff --git a/asm/cat.s b/asm/cat.s deleted file mode 100644 index 5dfe0f10..00000000 --- a/asm/cat.s +++ /dev/null @@ -1,857 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - thumb_func_start sub_080677EC -sub_080677EC: @ 0x080677EC - push {r4, lr} - adds r4, r0, #0 - ldrb r1, [r4, #0x18] - movs r0, #4 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #1 - orrs r0, r1 - strb r0, [r4, #0x18] - movs r0, #8 - strb r0, [r4, #0x15] - movs r0, #0x80 - strh r0, [r4, #0x24] - adds r1, r4, #0 - adds r1, #0x3c - movs r0, #7 - strb r0, [r1] - adds r1, #4 - movs r0, #0x48 - strb r0, [r1] - subs r1, #1 - movs r0, #0xa8 - strb r0, [r1] - subs r1, #4 - movs r0, #1 - strb r0, [r1] - adds r1, #0x2e - movs r0, #0xff - strb r0, [r1] - ldr r0, _0806783C @ =gPlayerEntity - movs r2, #0x2e - ldrsh r1, [r4, r2] - movs r2, #0x2e - ldrsh r0, [r0, r2] - cmp r1, r0 - bge _08067840 - ldrb r0, [r4, #0x18] - movs r1, #0x40 - orrs r0, r1 - b _08067848 - .align 2, 0 -_0806783C: .4byte gPlayerEntity -_08067840: - ldrb r1, [r4, #0x18] - movs r0, #0x41 - rsbs r0, r0, #0 - ands r0, r1 -_08067848: - strb r0, [r4, #0x18] - adds r0, r4, #0 - bl sub_0801E99C - adds r1, r4, #0 - adds r1, #0x68 - strb r0, [r1] - ldr r0, _0806786C @ =gUnk_08110EF0 - str r0, [r4, #0x48] - adds r0, r4, #0 - bl sub_0805ACC0 - adds r2, r0, #0 - cmp r2, #0 - bne _08067870 - movs r0, #0x2e - ldrsh r2, [r4, r0] - b _08067872 - .align 2, 0 -_0806786C: .4byte gUnk_08110EF0 -_08067870: - lsrs r2, r2, #0x10 -_08067872: - adds r0, r4, #0 - adds r0, #0x6c - movs r1, #0 - strh r2, [r0] - ldrb r0, [r4, #0xe] - adds r0, r0, r2 - adds r2, r4, #0 - adds r2, #0x6e - strh r0, [r2] - strb r1, [r4, #0xe] - adds r0, r4, #0 - adds r0, #0x75 - strb r1, [r0] - bl Random - movs r1, #0x7f - ands r0, r1 - adds r0, #0x1e - adds r1, r4, #0 - adds r1, #0x74 - strb r0, [r1] - subs r1, #0xb - movs r0, #0xff - strb r0, [r1] - adds r0, r4, #0 - bl sub_08067B08 - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_080678AC -sub_080678AC: @ 0x080678AC - push {r4, r5, lr} - adds r4, r0, #0 - bl sub_08067D20 - cmp r0, #0 - beq _080678C2 - adds r0, r4, #0 - movs r1, #5 - bl sub_08067B80 - b _08067900 -_080678C2: - adds r2, r4, #0 - adds r2, #0x72 - ldrh r0, [r2] - cmp r0, #0 - beq _080678D0 - subs r0, #1 - strh r0, [r2] -_080678D0: - adds r0, r4, #0 - adds r0, #0x5a - ldrb r1, [r0] - adds r5, r0, #0 - cmp r1, #1 - bne _080678EA - ldrh r0, [r2] - cmp r0, #0 - bne _080678EA - adds r0, r4, #0 - bl sub_08067AAC - b _08067900 -_080678EA: - adds r0, r4, #0 - bl UpdateAnimationSingleFrame - ldrb r1, [r5] - movs r0, #0x80 - ands r0, r1 - cmp r0, #0 - beq _08067900 - adds r0, r4, #0 - bl sub_08067B34 -_08067900: - pop {r4, r5, pc} - .align 2, 0 - - thumb_func_start sub_08067904 -sub_08067904: @ 0x08067904 - push {r4, lr} - adds r4, r0, #0 - bl sub_08067D20 - cmp r0, #0 - beq _0806791A - adds r0, r4, #0 - movs r1, #8 - bl sub_08067B80 - b _08067978 -_0806791A: - adds r1, r4, #0 - adds r1, #0x72 - ldrh r0, [r1] - subs r0, #1 - strh r0, [r1] - lsls r0, r0, #0x10 - cmp r0, #0 - bne _08067932 - adds r0, r4, #0 - bl sub_08067B70 - b _08067978 -_08067932: - ldrb r0, [r4, #0x15] - cmp r0, #8 - bne _08067952 - movs r1, #0x2e - ldrsh r0, [r4, r1] - adds r1, r4, #0 - adds r1, #0x6e - ldrh r1, [r1] - cmp r0, r1 - ble _0806796C - movs r0, #0x18 - strb r0, [r4, #0x15] - ldrb r1, [r4, #0x18] - subs r0, #0x59 - ands r0, r1 - b _0806796A -_08067952: - movs r0, #0x2e - ldrsh r1, [r4, r0] - adds r0, r4, #0 - adds r0, #0x6c - ldrh r0, [r0] - cmp r1, r0 - bge _0806796C - movs r0, #8 - strb r0, [r4, #0x15] - ldrb r0, [r4, #0x18] - movs r1, #0x40 - orrs r0, r1 -_0806796A: - strb r0, [r4, #0x18] -_0806796C: - adds r0, r4, #0 - bl sub_0806F69C - adds r0, r4, #0 - bl UpdateAnimationSingleFrame -_08067978: - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_0806797C -sub_0806797C: @ 0x0806797C - push {r4, lr} - adds r4, r0, #0 - bl UpdateAnimationSingleFrame - adds r0, r4, #0 - adds r0, #0x5a - ldrb r1, [r0] - movs r0, #0x80 - ands r0, r1 - cmp r0, #0 - beq _08067998 - adds r0, r4, #0 - bl sub_08067B08 -_08067998: - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_0806799C -sub_0806799C: @ 0x0806799C - push {r4, lr} - adds r4, r0, #0 - bl UpdateAnimationSingleFrame - ldr r0, _080679C0 @ =gTextBox - ldrb r1, [r0] - movs r0, #0x7f - ands r0, r1 - cmp r0, #0 - bne _080679BE - adds r0, r4, #0 - bl sub_08067B08 - adds r0, r4, #0 - movs r1, #1 - bl sub_0805E3A0 -_080679BE: - pop {r4, pc} - .align 2, 0 -_080679C0: .4byte gTextBox - - thumb_func_start sub_080679C4 -sub_080679C4: @ 0x080679C4 - push {r4, lr} - adds r4, r0, #0 - adds r1, r4, #0 - adds r1, #0x74 - ldrb r0, [r1] - cmp r0, #0 - beq _080679E6 - subs r0, #1 - strb r0, [r1] - lsls r0, r0, #0x18 - cmp r0, #0 - beq _080679E6 - adds r0, r4, #0 - bl sub_08067D20 - cmp r0, #0 - bne _080679EE -_080679E6: - adds r0, r4, #0 - bl sub_08067C24 - b _08067A0A -_080679EE: - adds r0, r4, #0 - bl UpdateAnimationSingleFrame - adds r0, r4, #0 - bl sub_08067BD4 - adds r0, r4, #0 - bl sub_08067D74 - cmp r0, #0 - beq _08067A0A - adds r0, r4, #0 - bl sub_08067C18 -_08067A0A: - pop {r4, pc} - - thumb_func_start sub_08067A0C -sub_08067A0C: @ 0x08067A0C - push {r4, lr} - adds r4, r0, #0 - bl UpdateAnimationSingleFrame - adds r0, r4, #0 - adds r0, #0x5a - ldrb r1, [r0] - movs r0, #0x80 - ands r0, r1 - cmp r0, #0 - beq _08067A44 - adds r0, r4, #0 - bl sub_08067D20 - cmp r0, #0 - beq _08067A3C - adds r0, r4, #0 - movs r1, #5 - bl sub_08067B80 - ldrb r0, [r4, #0xe] - adds r0, #0x14 - strb r0, [r4, #0xe] - b _08067A76 -_08067A3C: - adds r0, r4, #0 - bl sub_08067C24 - b _08067A76 -_08067A44: - movs r2, #7 - ands r2, r1 - cmp r2, #0 - beq _08067A70 - ldrb r0, [r4, #0x10] - movs r1, #0x80 - orrs r0, r1 - strb r0, [r4, #0x10] - ldr r1, _08067A6C @ =gUnk_08111154 - ldrb r0, [r4, #0x18] - lsls r0, r0, #0x19 - lsrs r0, r0, #0x1f - lsls r0, r0, #2 - subs r0, #1 - adds r0, r2, r0 - lsls r0, r0, #2 - adds r0, r0, r1 - ldr r0, [r0] - str r0, [r4, #0x48] - b _08067A76 - .align 2, 0 -_08067A6C: .4byte gUnk_08111154 -_08067A70: - adds r0, r4, #0 - bl sub_08067DDC -_08067A76: - pop {r4, pc} - - thumb_func_start sub_08067A78 -sub_08067A78: @ 0x08067A78 - push {r4, lr} - adds r4, r0, #0 - bl UpdateAnimationSingleFrame - adds r0, r4, #0 - adds r0, #0x5a - ldrb r1, [r0] - movs r0, #0x80 - ands r0, r1 - cmp r0, #0 - beq _08067A94 - adds r0, r4, #0 - bl sub_08067AAC -_08067A94: - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_08067A98 -sub_08067A98: @ 0x08067A98 - push {r4, lr} - adds r4, r0, #0 - bl UpdateFuseInteraction - cmp r0, #0 - beq _08067AAA - adds r0, r4, #0 - bl sub_08067B08 -_08067AAA: - pop {r4, pc} - - thumb_func_start sub_08067AAC -sub_08067AAC: @ 0x08067AAC - push {r4, lr} - adds r4, r0, #0 - movs r0, #2 - strb r0, [r4, #0xc] - bl Random - ldr r2, _08067AFC @ =gUnk_081110FC - movs r1, #3 - ands r1, r0 - lsls r1, r1, #1 - adds r1, r1, r2 - ldrh r0, [r1] - adds r1, r4, #0 - adds r1, #0x72 - strh r0, [r1] - ldrb r1, [r4, #0x15] - lsrs r1, r1, #4 - movs r0, #1 - eors r1, r0 - ands r1, r0 - lsls r1, r1, #6 - ldrb r2, [r4, #0x18] - movs r0, #0x41 - rsbs r0, r0, #0 - ands r0, r2 - orrs r0, r1 - strb r0, [r4, #0x18] - adds r0, r4, #0 - movs r1, #3 - bl sub_08067DCC - ldr r0, _08067B00 @ =gUnk_0811110C - ldrb r2, [r0, #2] - ldr r3, _08067B04 @ =gUnk_0811110F - adds r0, r4, #0 - movs r1, #0 - bl sub_08078850 - pop {r4, pc} - .align 2, 0 -_08067AFC: .4byte gUnk_081110FC -_08067B00: .4byte gUnk_0811110C -_08067B04: .4byte gUnk_0811110F - - thumb_func_start sub_08067B08 -sub_08067B08: @ 0x08067B08 - push {r4, lr} - adds r4, r0, #0 - movs r0, #1 - strb r0, [r4, #0xc] - bl Random - ldr r2, _08067B30 @ =gUnk_08111104 - movs r1, #3 - ands r1, r0 - lsls r1, r1, #1 - adds r1, r1, r2 - ldrh r0, [r1] - adds r1, r4, #0 - adds r1, #0x72 - strh r0, [r1] - adds r0, r4, #0 - bl sub_08067B34 - pop {r4, pc} - .align 2, 0 -_08067B30: .4byte gUnk_08111104 - - thumb_func_start sub_08067B34 -sub_08067B34: @ 0x08067B34 - push {r4, lr} - adds r4, r0, #0 - movs r1, #0 - bl sub_08067DCC - bl Random - movs r1, #0x30 - ands r0, r1 - adds r0, #0xb4 - adds r1, r4, #0 - adds r1, #0x59 - strb r0, [r1] - ldr r1, _08067B68 @ =gUnk_0811110C - ldrb r0, [r4, #0x18] - lsls r0, r0, #0x19 - lsrs r0, r0, #0x1f - adds r0, r0, r1 - ldrb r2, [r0] - ldr r3, _08067B6C @ =gUnk_0811110F - adds r0, r4, #0 - movs r1, #0 - bl sub_08078850 - pop {r4, pc} - .align 2, 0 -_08067B68: .4byte gUnk_0811110C -_08067B6C: .4byte gUnk_0811110F - - thumb_func_start sub_08067B70 -sub_08067B70: @ 0x08067B70 - push {lr} - movs r1, #3 - strb r1, [r0, #0xc] - movs r1, #4 - bl sub_08067DCC - pop {pc} - .align 2, 0 - - thumb_func_start sub_08067B80 -sub_08067B80: @ 0x08067B80 - push {r4, r5, lr} - adds r5, r0, #0 - adds r4, r1, #0 - movs r0, #5 - strb r0, [r5, #0xc] - movs r0, #0x14 - strb r0, [r5, #0xe] - bl Random - movs r1, #0x7f - ands r0, r1 - adds r0, #0x1e - adds r1, r5, #0 - adds r1, #0x74 - strb r0, [r1] - adds r0, r5, #0 - adds r1, r4, #0 - bl InitAnimationForceUpdate - adds r0, r5, #0 - bl sub_08067DDC - ldr r0, _08067BC4 @ =gPlayerEntity - movs r2, #0x2e - ldrsh r1, [r5, r2] - movs r2, #0x2e - ldrsh r0, [r0, r2] - cmp r1, r0 - bge _08067BC8 - ldrb r0, [r5, #0x18] - movs r1, #0x40 - orrs r0, r1 - b _08067BD0 - .align 2, 0 -_08067BC4: .4byte gPlayerEntity -_08067BC8: - ldrb r1, [r5, #0x18] - movs r0, #0x41 - rsbs r0, r0, #0 - ands r0, r1 -_08067BD0: - strb r0, [r5, #0x18] - pop {r4, r5, pc} - - thumb_func_start sub_08067BD4 -sub_08067BD4: @ 0x08067BD4 - push {r4, lr} - adds r2, r0, #0 - ldrb r3, [r2, #0x18] - lsls r0, r3, #0x19 - cmp r0, #0 - bge _08067BFC - movs r1, #0x2e - ldrsh r0, [r2, r1] - subs r0, #4 - ldr r1, _08067BF8 @ =gPlayerEntity - movs r4, #0x2e - ldrsh r1, [r1, r4] - cmp r0, r1 - ble _08067C12 - movs r0, #0x41 - rsbs r0, r0, #0 - ands r0, r3 - b _08067C10 - .align 2, 0 -_08067BF8: .4byte gPlayerEntity -_08067BFC: - movs r1, #0x2e - ldrsh r0, [r2, r1] - adds r0, #4 - ldr r1, _08067C14 @ =gPlayerEntity - movs r4, #0x2e - ldrsh r1, [r1, r4] - cmp r0, r1 - bge _08067C12 - movs r0, #0x40 - orrs r0, r3 -_08067C10: - strb r0, [r2, #0x18] -_08067C12: - pop {r4, pc} - .align 2, 0 -_08067C14: .4byte gPlayerEntity - - thumb_func_start sub_08067C18 -sub_08067C18: @ 0x08067C18 - push {lr} - movs r1, #6 - strb r1, [r0, #0xc] - bl InitAnimationForceUpdate - pop {pc} - - thumb_func_start sub_08067C24 -sub_08067C24: @ 0x08067C24 - push {r4, lr} - adds r4, r0, #0 - movs r0, #7 - strb r0, [r4, #0xc] - adds r1, r4, #0 - adds r1, #0x75 - movs r0, #0x14 - strb r0, [r1] - adds r0, r4, #0 - bl sub_08067DDC - adds r0, r4, #0 - movs r1, #7 - bl InitAnimationForceUpdate - pop {r4, pc} - - thumb_func_start sub_08067C44 -sub_08067C44: @ 0x08067C44 - push {r4, r5, lr} - adds r4, r0, #0 - ldr r0, _08067C6C @ =gPlayerState - ldr r0, [r0, #0x30] - movs r1, #0x80 - ands r0, r1 - rsbs r0, r0, #0 - lsrs r5, r0, #0x1f - adds r0, r4, #0 - adds r0, #0x69 - ldrb r0, [r0] - cmp r5, r0 - beq _08067C7C - cmp r5, #0 - bne _08067C70 - adds r0, r4, #0 - bl sub_08078778 - b _08067C7C - .align 2, 0 -_08067C6C: .4byte gPlayerState -_08067C70: - adds r0, r4, #0 - adds r0, #0x68 - ldrb r1, [r0] - adds r0, r4, #0 - bl sub_080787A8 -_08067C7C: - adds r0, r4, #0 - adds r0, #0x69 - strb r5, [r0] - subs r0, #0x30 - movs r1, #0 - ldrsb r1, [r0, r1] - adds r5, r0, #0 - cmp r1, #0 - beq _08067D1C - ldr r1, _08067CB4 @ =gPlayerEntity - adds r0, r4, #0 - bl sub_0806FCA0 - adds r2, r0, #0 - adds r0, r4, #0 - adds r0, #0x58 - ldrb r0, [r0] - cmp r0, #0 - beq _08067CA6 - cmp r0, #3 - beq _08067CB8 -_08067CA6: - cmp r2, #2 - bne _08067CDA - adds r0, r4, #0 - movs r1, #2 - bl InitAnimationForceUpdate - b _08067CEC - .align 2, 0 -_08067CB4: .4byte gPlayerEntity -_08067CB8: - cmp r2, #1 - bne _08067CC4 - ldrb r0, [r4, #0x18] - movs r1, #0x40 - orrs r0, r1 - b _08067CD4 -_08067CC4: - ldrb r1, [r4, #0x18] - lsls r0, r1, #0x19 - lsrs r0, r0, #0x1f - cmp r0, #3 - bne _08067CD6 - movs r0, #0x41 - rsbs r0, r0, #0 - ands r0, r1 -_08067CD4: - strb r0, [r4, #0x18] -_08067CD6: - cmp r2, #2 - beq _08067CE4 -_08067CDA: - adds r0, r4, #0 - movs r1, #1 - bl InitAnimationForceUpdate - b _08067CEC -_08067CE4: - adds r0, r4, #0 - movs r1, #2 - bl InitAnimationForceUpdate -_08067CEC: - movs r0, #0 - ldrsb r0, [r5, r0] - cmp r0, #2 - bne _08067D00 - movs r0, #8 - strb r0, [r4, #0xc] - adds r0, r4, #0 - bl sub_0806F118 - b _08067D12 -_08067D00: - movs r0, #4 - strb r0, [r4, #0xc] - adds r0, r4, #0 - bl sub_08067790 - adds r0, r4, #0 - movs r1, #2 - bl sub_0805E3A0 -_08067D12: - movs r0, #0 - strb r0, [r5] - movs r0, #0xd2 - bl SoundReq -_08067D1C: - pop {r4, r5, pc} - .align 2, 0 - - thumb_func_start sub_08067D20 -sub_08067D20: @ 0x08067D20 - push {r4, r5, lr} - adds r4, r0, #0 - adds r1, r4, #0 - adds r1, #0x75 - ldrb r0, [r1] - cmp r0, #0 - beq _08067D34 - subs r0, #1 - strb r0, [r1] - b _08067D70 -_08067D34: - movs r0, #2 - bl sub_08049DF4 - adds r2, r0, #0 - cmp r2, #0 - beq _08067D70 - ldrb r0, [r4, #0x18] - lsls r0, r0, #0x19 - movs r3, #0x28 - cmp r0, #0 - bge _08067D4C - movs r3, #0x10 -_08067D4C: - movs r0, #0x2e - ldrsh r1, [r2, r0] - movs r5, #0x2e - ldrsh r0, [r4, r5] - subs r0, r0, r3 - subs r1, r1, r0 - cmp r1, #0x30 - bhi _08067D70 - movs r1, #0x32 - ldrsh r0, [r2, r1] - adds r0, #4 - movs r2, #0x32 - ldrsh r1, [r4, r2] - subs r0, r0, r1 - cmp r0, #0x38 - bhi _08067D70 - movs r0, #1 - b _08067D72 -_08067D70: - movs r0, #0 -_08067D72: - pop {r4, r5, pc} - - thumb_func_start sub_08067D74 -sub_08067D74: @ 0x08067D74 - push {r4, r5, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xa] - cmp r0, #5 - beq _08067DC8 - ldrb r0, [r4, #0xe] - cmp r0, #0 - beq _08067D88 - subs r0, #1 - strb r0, [r4, #0xe] -_08067D88: - movs r0, #2 - bl sub_08049DF4 - adds r2, r0, #0 - cmp r2, #0 - beq _08067DC8 - ldrb r0, [r4, #0x18] - lsls r0, r0, #0x19 - movs r3, #0x18 - cmp r0, #0 - bge _08067DA0 - movs r3, #8 -_08067DA0: - movs r0, #0x2e - ldrsh r1, [r2, r0] - movs r5, #0x2e - ldrsh r0, [r4, r5] - subs r0, r0, r3 - subs r1, r1, r0 - cmp r1, #0x1e - bhi _08067DC8 - movs r1, #0x32 - ldrsh r0, [r2, r1] - movs r2, #0x32 - ldrsh r1, [r4, r2] - subs r0, r0, r1 - cmp r0, #0x16 - bhi _08067DC8 - ldrb r0, [r4, #0xe] - cmp r0, #0 - bne _08067DC8 - movs r0, #1 - b _08067DCA -_08067DC8: - movs r0, #0 -_08067DCA: - pop {r4, r5, pc} - - thumb_func_start sub_08067DCC -sub_08067DCC: @ 0x08067DCC - push {lr} - adds r2, r0, #0 - adds r2, #0x71 - strb r1, [r2] - bl InitAnimationForceUpdate - pop {pc} - .align 2, 0 - - thumb_func_start sub_08067DDC -sub_08067DDC: @ 0x08067DDC - adds r2, r0, #0 - ldrb r1, [r2, #0x10] - movs r0, #0x7f - ands r0, r1 - movs r1, #0 - strb r0, [r2, #0x10] - adds r0, r2, #0 - adds r0, #0x41 - strb r1, [r0] - subs r0, #4 - strb r1, [r0] - ldr r0, _08067DF8 @ =gUnk_08110EF0 - str r0, [r2, #0x48] - bx lr - .align 2, 0 -_08067DF8: .4byte gUnk_08110EF0 - - thumb_func_start Cat_Fusion -Cat_Fusion: @ 0x08067DFC - push {lr} - adds r2, r0, #0 - ldrb r0, [r2, #0xc] - cmp r0, #0 - bne _08067E22 - adds r0, #1 - strb r0, [r2, #0xc] - ldrb r1, [r2, #0x18] - movs r0, #4 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #1 - orrs r0, r1 - strb r0, [r2, #0x18] - adds r0, r2, #0 - movs r1, #5 - bl InitAnimationForceUpdate - b _08067E28 -_08067E22: - adds r0, r2, #0 - bl UpdateAnimationSingleFrame -_08067E28: - pop {pc} - .align 2, 0 diff --git a/asm/npc/cat.s b/asm/npc/cat.s deleted file mode 100644 index 75890472..00000000 --- a/asm/npc/cat.s +++ /dev/null @@ -1,26 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - thumb_func_start sub_08067790 -sub_08067790: @ 0x08067790 - push {lr} - ldrb r2, [r0, #0xa] - lsls r1, r2, #2 - adds r1, r1, r2 - lsls r1, r1, #4 - ldr r2, _080677AC @ =gSave - ldrb r2, [r2, #8] - lsls r2, r2, #3 - ldr r3, _080677B0 @ =gUnk_08110EF8 - adds r2, r2, r3 - adds r1, r1, r2 - bl ShowNPCDialogue - pop {pc} - .align 2, 0 -_080677AC: .4byte gSave -_080677B0: .4byte gUnk_08110EF8 diff --git a/linker.ld b/linker.ld index 5af39578..b9f4494e 100644 --- a/linker.ld +++ b/linker.ld @@ -595,9 +595,7 @@ SECTIONS { src/npc/carpenter.o(.text); asm/carpenter.o(.text); asm/castorWildsStatue.o(.text); - asm/npc/cat.o(.text); src/npc/cat.o(.text); - asm/cat.o(.text); asm/mountainMinish.o(.text); src/npc/zeldaFollower.o(.text); asm/zeldaFollower.o(.text); diff --git a/src/npc/cat.c b/src/npc/cat.c index c00a41ef..b08369a0 100644 --- a/src/npc/cat.c +++ b/src/npc/cat.c @@ -1,11 +1,54 @@ #include "global.h" #include "entity.h" +#include "functions.h" +#include "save.h" +#include "player.h" +#include "random.h" +#include "textbox.h" +#include "npc.h" +#include "audio.h" -extern void sub_0806ED78(); extern void sub_08067C44(); extern void (*gCat[9])(Entity*); +extern Dialog gUnk_08110EF8; + +extern Hitbox gUnk_08110EF0; +extern void sub_08067B08(Entity*); + +extern u32 sub_08067D20(); +extern void sub_08067AAC(Entity*); +extern void sub_08067B34(Entity*); +extern void sub_08067B80(Entity*, u32); + +extern void sub_08067B70(Entity*); + +extern void sub_08067C24(Entity*); +extern void sub_08067BD4(Entity*); +extern u32 sub_08067D74(Entity*); +extern void sub_08067C18(Entity*); + +extern Hitbox* gUnk_08111154[8]; +extern void sub_08067DDC(Entity*); + +extern u16 gUnk_081110FC[4]; +extern void sub_08067DCC(Entity*, u32); + +extern u8 gUnk_0811110C[2]; +extern u32 gUnk_0811110F; +extern void sub_08078850(Entity*, u32, u8, u32*); + +extern u16 gUnk_08111104[]; + +extern u32 sub_0806FCA0(Entity*, Entity*); + +extern Entity* sub_08049DF4(u32); + +void sub_08067790(Entity* this) { + ShowNPCDialogue(this, &gUnk_08110EF8 + this->type * 10 + gSave.unk8); +} + // Main void Cat(Entity* ent) { gCat[ent->action](ent); @@ -14,3 +57,342 @@ void Cat(Entity* ent) { sub_0806ED78(ent); } } + +void sub_080677EC(Entity* this) { + u8 bVar1; + u32 uVar2; + + this->spriteSettings.b.draw = 1; + this->direction = 8; + this->speed = 0x80; + this->field_0x3c = 7; + this->field_0x40 = 0x48; + this->damageType = -0x58; + this->flags2 = 1; + this->field_0x68.HALF.HI = 0xff; + if (this->x.HALF.HI < gPlayerEntity.x.HALF.HI) { + this->spriteSettings.b.flipX = 1; + } else { + this->spriteSettings.b.flipX = 0; + } + + this->field_0x68.HALF.LO = sub_0801E99C(this); + this->hitbox = &gUnk_08110EF0; + uVar2 = sub_0805ACC0(this); + if (uVar2 == 0) { + uVar2 = this->x.HALF.HI; + } else { + uVar2 >>= 0x10; + } + this->field_0x6c.HWORD = uVar2; + this->field_0x6e.HWORD = this->actionDelay + uVar2; + this->actionDelay = 0; + this->field_0x74.HALF.HI = 0; + this->field_0x74.HALF.LO = (Random() & 0x7f) + 0x1e; + this->field_0x68.HALF.HI = 0xff; + sub_08067B08(this); +} + +void sub_080678AC(Entity* this) { + u32 iVar1; + u16* psVar2; + + iVar1 = sub_08067D20(); + if (iVar1 != 0) { + sub_08067B80(this, 5); + } else { + psVar2 = (u16*)&this->field_0x70.HALF.HI; + if (*psVar2 != 0) { + *psVar2 = *psVar2 - 1; + } + if ((this->frames.all == 1) && (*psVar2 == 0)) { + sub_08067AAC(this); + } else { + UpdateAnimationSingleFrame(this); + if ((this->frames.all & 0x80) != 0) { + sub_08067B34(this); + } + } + } +} + +void sub_08067904(Entity* this) { + if (sub_08067D20() != 0) { + sub_08067B80(this, 8); + return; + } + + this->field_0x70.HALF.HI -= 1; + if (this->field_0x70.HALF.HI == 0) { + sub_08067B70(this); + return; + } + if (this->direction == 8) { + if (this->x.HALF.HI > this->field_0x6e.HWORD) { + this->direction = 0x18; + this->spriteSettings.b.flipX = 0; + } + } else { + if (this->x.HALF.HI < this->field_0x6c.HWORD) { + this->direction = 8; + this->spriteSettings.b.flipX = 1; + } + } + sub_0806F69C(this); + UpdateAnimationSingleFrame(this); +} + +void sub_0806797C(Entity* this) { + UpdateAnimationSingleFrame(this); + if (this->frames.b.f3 != 0) { + sub_08067B08(this); + } +} + +void sub_0806799C(Entity* this) { + UpdateAnimationSingleFrame(this); + if ((gTextBox.doTextBox & 0x7f) == 0) { + sub_08067B08(this); + sub_0805E3A0(this, 1); + } +} + +void sub_080679C4(Entity* this) { + if (this->field_0x74.HALF.LO == 0 || --this->field_0x74.HALF.LO == 0 || sub_08067D20(this) == 0) { + sub_08067C24(this); + } else { + UpdateAnimationSingleFrame(this); + sub_08067BD4(this); + if (sub_08067D74(this) != 0) { + sub_08067C18(this); + } + } +} + +void sub_08067A0C(Entity* this) { + u8 tmp; + + UpdateAnimationSingleFrame(this); + if (this->frames.b.f3 != 0) { + if (sub_08067D20(this) != 0) { + sub_08067B80(this, 5); + this->actionDelay = this->actionDelay + 0x14; + } else { + sub_08067C24(this); + } + } else { + tmp = (this->frames.all & 7); + if (tmp != 0) { + this->flags = this->flags | 0x80; + this->hitbox = gUnk_08111154[tmp - 1 + ((this->spriteSettings.b.flipX << 2))]; + } else { + sub_08067DDC(this); + } + } +} + +void sub_08067A78(Entity* this) { + UpdateAnimationSingleFrame(this); + if (this->frames.b.f3 != 0) { + sub_08067AAC(this); + } +} + +void sub_08067A98(Entity* this) { + if (UpdateFuseInteraction(this) != 0) { + sub_08067B08(this); + } +} + +void sub_08067AAC(Entity* this) { + this->action = 2; + this->field_0x70.HALF.HI = gUnk_081110FC[(Random() & 3)]; + + this->spriteSettings.b.flipX = this->direction >> 4 ^ 1; + + sub_08067DCC(this, 3); + sub_08078850(this, 0, gUnk_0811110C[2], &gUnk_0811110F); +} + +void sub_08067B08(Entity* this) { + this->action = 1; + this->field_0x70.HALF.HI = gUnk_08111104[Random() & 3]; + sub_08067B34(this); +} + +void sub_08067B34(Entity* this) { + sub_08067DCC(this, 0); + this->frameDuration = (Random() & 0x30) + 0xb4; + sub_08078850(this, 0, gUnk_0811110C[this->spriteSettings.b.flipX], &gUnk_0811110F); +} + +void sub_08067B70(Entity* this) { + this->action = 3; + sub_08067DCC(this, 4); +} + +void sub_08067B80(Entity* this, u32 param) { + this->action = 5; + this->actionDelay = 0x14; + this->field_0x74.HALF.LO = (Random() & 0x7f) + 0x1e; + InitAnimationForceUpdate(this, param); + sub_08067DDC(this); + if (this->x.HALF.HI < gPlayerEntity.x.HALF.HI) { + this->spriteSettings.b.flipX = 1; + } else { + this->spriteSettings.b.flipX = 0; + } +} + +void sub_08067BD4(Entity* this) { + if (this->spriteSettings.b.flipX > 0) { + if (this->x.HALF.HI - 4 > gPlayerEntity.x.HALF.HI) { + this->spriteSettings.b.flipX = 0; + } + } else { + if (this->x.HALF.HI + 4 < gPlayerEntity.x.HALF.HI) { + this->spriteSettings.b.flipX = 1; + } + } +} + +void sub_08067C18(Entity* this) { + this->action = 6; + InitAnimationForceUpdate(this, 6); +} + +void sub_08067C24(Entity* this) { + this->action = 7; + this->field_0x74.HALF.HI = 0x14; + sub_08067DDC(this); + InitAnimationForceUpdate(this, 7); +} + +void sub_08067C44(Entity* this) { + s32 iVar4; + u32 uVar5; + + uVar5 = -((s32) - (gPlayerState.flags.all & 0x80) >> 0x1f); + if (uVar5 != this->field_0x68.HALF.HI) { + if (uVar5 == 0) { + sub_08078778(this); + } else { + sub_080787A8(this, this->field_0x68.HALF.LO); + } + } + + this->field_0x68.HALF.HI = uVar5; + + if (this->interactType == 0) { + return; + } + + iVar4 = sub_0806FCA0(this, &gPlayerEntity); + switch (this->animIndex) { + case 0: + default: + if (iVar4 == 2) { + InitAnimationForceUpdate(this, 2); + } else { + InitAnimationForceUpdate(this, 1); + } + break; + case 3: + if (iVar4 == 1) { + this->spriteSettings.b.flipX = 1; + } else { + if (this->spriteSettings.b.flipX == 3) { // TODO 3 ??? + this->spriteSettings.b.flipX = 0; + } + } + if (iVar4 != 2) { + InitAnimationForceUpdate(this, 1); + } else { + InitAnimationForceUpdate(this, 2); + } + break; + } + + if (this->interactType == 2) { + this->action = 8; + sub_0806F118(this); + } else { + this->action = 4; + sub_08067790(this); + sub_0805E3A0(this, 2); + } + this->interactType = 0; + SoundReq(SFX_VO_CAT); +} + +u32 sub_08067D20(Entity* this) { + s32 tmp; + Entity* entity; + int iVar4; + if (this->field_0x74.HALF.HI != 0) { + this->field_0x74.HALF.HI -= 1; + } else { + entity = sub_08049DF4(2); + if (entity != NULL) { + tmp = this->spriteSettings.raw * 0x2000000; // TODO maybe convert to ternary? + iVar4 = 0x28; + if (tmp < 0) { + iVar4 = 0x10; + } + + if (((u32)(entity->x.HALF.HI - (this->x.HALF.HI - iVar4)) < 0x31) && + ((((u32)entity->y.HALF.HI) - (this->y.HALF.HI - 4)) < 0x39)) { + return 1; + } + } + } + return 0; +} + +u32 sub_08067D74(Entity* this) { + Entity* entity; + int iVar2; + s32 tmp; + + if (this->type != 5) { + if (this->actionDelay != 0) { + this->actionDelay -= 1; + } + entity = sub_08049DF4(2); + if (entity != NULL) { + tmp = (this->spriteSettings.raw * 0x2000000); // TODO convert to ternary? + iVar2 = 0x18; + if (tmp < 0) { + iVar2 = 8; + } + if ((((u32)(entity->x.HALF.HI - (this->x.HALF.HI - iVar2)) < 0x1f) && + ((u32)(entity->y.HALF.HI - this->y.HALF.HI) < 0x17)) && + (this->actionDelay == 0)) { + return 1; + } + } + } + return 0; +} + +void sub_08067DCC(Entity* this, u32 param) { + this->field_0x70.BYTES.byte1 = param; + InitAnimationForceUpdate(this, param); +} + +void sub_08067DDC(Entity* this) { + this->flags = this->flags & 0x7f; + this->bitfield = 0; + this->iframes = 0; + this->hitbox = &gUnk_08110EF0; +} + +void Cat_Fusion(Entity* this) { + if (this->action == 0) { + this->action += 1; + this->spriteSettings.b.draw = 1; + InitAnimationForceUpdate(this, 5); + } else { + UpdateAnimationSingleFrame(this); + } +}