From cc8ef3a2607a9faf1cf17d1f9a0fff8a4ad2267b Mon Sep 17 00:00:00 2001 From: Tal Hayon Date: Sun, 13 Mar 2022 00:12:16 +0200 Subject: [PATCH 01/23] Decompile object10 --- asm/object/object10.s | 652 ----------------------------------- assets/assets.json | 10 - data/const/object/object10.s | 16 - include/functions.h | 1 + include/object.h | 4 +- linker.ld | 4 +- src/object.c | 2 +- src/object/playerClone.c | 187 ++++++++++ src/player.c | 2 +- 9 files changed, 194 insertions(+), 684 deletions(-) delete mode 100644 asm/object/object10.s delete mode 100644 data/const/object/object10.s create mode 100644 src/object/playerClone.c diff --git a/asm/object/object10.s b/asm/object/object10.s deleted file mode 100644 index 66f067d2..00000000 --- a/asm/object/object10.s +++ /dev/null @@ -1,652 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start Object10 -Object10: @ 0x08084824 - push {lr} - ldr r2, _08084838 @ =gUnk_08120560 - ldrb r1, [r0, #0xc] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_08084838: .4byte gUnk_08120560 - - thumb_func_start sub_0808483C -sub_0808483C: @ 0x0808483C - push {r4, r5, lr} - adds r4, r0, #0 - movs r0, #1 - strb r0, [r4, #0xc] - ldrb r1, [r4, #0x19] - movs r0, #0x3f - ands r0, r1 - movs r1, #0x80 - orrs r0, r1 - strb r0, [r4, #0x19] - adds r2, r4, #0 - adds r2, #0x29 - ldrb r1, [r2] - movs r0, #8 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #4 - orrs r0, r1 - strb r0, [r2] - ldrh r2, [r4, #0x2e] - movs r1, #0x10 - rsbs r1, r1, #0 - adds r0, r1, #0 - ands r0, r2 - movs r2, #8 - orrs r0, r2 - strh r0, [r4, #0x2e] - ldrh r0, [r4, #0x32] - ands r1, r0 - orrs r1, r2 - strh r1, [r4, #0x32] - movs r0, #0x2e - ldrsh r1, [r4, r0] - ldr r2, _080848C0 @ =gRoomControls - ldrh r0, [r2, #6] - subs r1, r1, r0 - asrs r1, r1, #4 - movs r3, #0x3f - ands r1, r3 - movs r5, #0x32 - ldrsh r0, [r4, r5] - ldrh r2, [r2, #8] - subs r0, r0, r2 - asrs r0, r0, #4 - ands r0, r3 - lsls r0, r0, #6 - orrs r1, r0 - adds r5, r4, #0 - adds r5, #0x74 - strh r1, [r5] - adds r0, r4, #0 - movs r1, #8 - bl InitializeAnimation - ldr r0, _080848C4 @ =0x00004016 - ldrh r1, [r5] - adds r4, #0x38 - ldrb r2, [r4] - bl SetTile - movs r0, #0x89 - lsls r0, r0, #1 - bl SoundReq - pop {r4, r5, pc} - .align 2, 0 -_080848C0: .4byte gRoomControls -_080848C4: .4byte 0x00004016 - - thumb_func_start sub_080848C8 -sub_080848C8: @ 0x080848C8 - push {r4, r5, lr} - adds r4, r0, #0 - ldr r0, _08084980 @ =gPlayerState - adds r0, #0xa0 - ldrb r0, [r0] - cmp r0, #5 - bne _08084994 - ldrb r1, [r4, #0x18] - movs r0, #4 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #1 - orrs r0, r1 - strb r0, [r4, #0x18] - adds r0, r4, #0 - adds r0, #0x45 - movs r5, #1 - strb r5, [r0] - movs r0, #2 - strb r0, [r4, #0xc] - ldrb r1, [r4, #0x11] - subs r0, #0x12 - ands r0, r1 - movs r1, #6 - orrs r0, r1 - strb r0, [r4, #0x11] - ldr r0, _08084984 @ =gUnk_08120574 - str r0, [r4, #0x48] - ldrb r1, [r4, #0xa] - adds r1, #1 - lsls r0, r1, #4 - subs r0, r0, r1 - strb r0, [r4, #0xf] - ldr r2, _08084988 @ =gPlayerEntity - ldrh r0, [r4, #0x2e] - ldrh r1, [r2, #0x2e] - subs r0, r0, r1 - adds r3, r4, #0 - adds r3, #0x78 - strh r0, [r3] - ldrh r1, [r4, #0x32] - ldrh r0, [r2, #0x32] - subs r1, r1, r0 - adds r0, r4, #0 - adds r0, #0x7a - strh r1, [r0] - ldrh r0, [r3] - cmp r0, #0 - beq _0808493C - lsls r0, r1, #0x10 - cmp r0, #0 - beq _0808493C - ldr r0, _0808498C @ =gPlayerClones - ldrb r1, [r4, #0xa] - lsls r1, r1, #2 - adds r1, r1, r0 - ldr r0, [r1] - str r5, [r0, #0x70] -_0808493C: - ldr r0, _08084990 @ =0x00000315 - adds r1, r4, #0 - adds r1, #0x74 - ldrh r1, [r1] - adds r2, r4, #0 - adds r2, #0x38 - ldrb r2, [r2] - bl sub_08000152 - ldrb r1, [r4, #0xa] - adds r1, #1 - ldr r0, _08084980 @ =gPlayerState - ldr r0, [r0, #0x2c] - adds r0, #0x68 - ldrb r3, [r0] - movs r0, #1 - movs r2, #0 - bl sub_08077CF8 - str r0, [r4, #0x54] - cmp r0, #0 - beq _0808496A - str r4, [r0, #0x50] -_0808496A: - adds r0, r4, #0 - bl sub_0801766C - adds r0, r4, #0 - bl sub_0806FDA0 - adds r0, r4, #0 - bl sub_080849D8 - b _080849D6 - .align 2, 0 -_08084980: .4byte gPlayerState -_08084984: .4byte gUnk_08120574 -_08084988: .4byte gPlayerEntity -_0808498C: .4byte gPlayerClones -_08084990: .4byte 0x00000315 -_08084994: - cmp r0, #4 - beq _080849C4 - ldr r0, _080849BC @ =0x00000315 - adds r1, r4, #0 - adds r1, #0x74 - ldrh r1, [r1] - adds r2, r4, #0 - adds r2, #0x38 - ldrb r2, [r2] - bl sub_08000152 - ldr r1, _080849C0 @ =gPlayerClones - ldrb r0, [r4, #0xa] - lsls r0, r0, #2 - adds r0, r0, r1 - movs r1, #0 - str r1, [r0] - bl DeleteThisEntity - b _080849D6 - .align 2, 0 -_080849BC: .4byte 0x00000315 -_080849C0: .4byte gPlayerClones -_080849C4: - ldrb r2, [r4, #0x18] - lsls r1, r2, #0x1e - lsrs r1, r1, #0x1e - movs r0, #1 - eors r1, r0 - subs r0, #5 - ands r0, r2 - orrs r0, r1 - strb r0, [r4, #0x18] -_080849D6: - pop {r4, r5, pc} - - thumb_func_start sub_080849D8 -sub_080849D8: @ 0x080849D8 - push {r4, r5, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xf] - adds r1, r0, #0 - cmp r1, #1 - bne _080849EE - movs r0, #0x76 - bl SoundReq - ldrb r0, [r4, #0xf] - b _080849F2 -_080849EE: - cmp r1, #0 - beq _080849F6 -_080849F2: - subs r0, #1 - strb r0, [r4, #0xf] -_080849F6: - ldr r2, _08084A3C @ =gPlayerState - adds r3, r2, #0 - adds r3, #0xa0 - ldrb r0, [r3] - cmp r0, #5 - beq _08084A04 - b _08084AF8 -_08084A04: - ldr r0, _08084A40 @ =gPlayerClones - ldrb r1, [r4, #0xa] - lsls r1, r1, #2 - adds r1, r1, r0 - ldr r0, [r1] - cmp r0, #0 - beq _08084AF8 - adds r0, r2, #0 - adds r0, #0xa8 - ldrb r0, [r0] - cmp r0, #0x13 - beq _08084AF8 - adds r0, r4, #0 - adds r0, #0x45 - ldrb r0, [r0] - cmp r0, #0 - beq _08084AF8 - ldr r5, _08084A44 @ =gPlayerEntity - adds r0, r5, #0 - adds r0, #0x3d - ldrb r0, [r0] - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - cmp r0, #0 - ble _08084A48 - movs r0, #1 - strb r0, [r3] - b _08084AF8 - .align 2, 0 -_08084A3C: .4byte gPlayerState -_08084A40: .4byte gPlayerClones -_08084A44: .4byte gPlayerEntity -_08084A48: - adds r0, r4, #0 - bl sub_080B1AA8 - adds r0, r4, #0 - bl sub_08084B1C - adds r0, r4, #0 - adds r0, #0x78 - ldrh r0, [r0] - ldrh r1, [r5, #0x2e] - adds r0, r0, r1 - strh r0, [r4, #0x2e] - adds r0, r4, #0 - adds r0, #0x7a - ldrh r0, [r0] - ldrh r5, [r5, #0x32] - adds r0, r0, r5 - strh r0, [r4, #0x32] - adds r0, r4, #0 - bl sub_08084CAC - adds r0, r4, #0 - bl sub_080085B0 - ldrh r2, [r4, #0x2a] - ldr r1, _08084AB8 @ =0x00006666 - adds r0, r1, #0 - ands r0, r2 - cmp r0, r1 - beq _08084AEA - movs r3, #0 - ldr r5, _08084ABC @ =gUnk_0812056C - ldrh r1, [r5] - adds r0, r1, #0 - ands r0, r2 - cmp r1, r0 - beq _08084AA6 - adds r2, r5, #0 -_08084A94: - adds r2, #2 - adds r3, #1 - cmp r3, #3 - bhi _08084AA6 - ldrh r1, [r2] - ldrh r0, [r4, #0x2a] - ands r0, r1 - cmp r1, r0 - bne _08084A94 -_08084AA6: - cmp r3, #4 - bne _08084AC0 - movs r0, #0 - strb r0, [r4, #0xe] - ldrb r1, [r4, #0x18] - subs r0, #4 - ands r0, r1 - movs r1, #1 - b _08084ADE - .align 2, 0 -_08084AB8: .4byte 0x00006666 -_08084ABC: .4byte gUnk_0812056C -_08084AC0: - ldrb r0, [r4, #0xe] - cmp r0, #0 - beq _08084AE4 - subs r0, #1 - strb r0, [r4, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - beq _08084AEA - ldrb r2, [r4, #0x18] - lsls r1, r2, #0x1e - lsrs r1, r1, #0x1e - movs r0, #1 - eors r1, r0 - subs r0, #5 - ands r0, r2 -_08084ADE: - orrs r0, r1 - strb r0, [r4, #0x18] - b _08084B16 -_08084AE4: - movs r0, #0x1e - strb r0, [r4, #0xe] - b _08084B16 -_08084AEA: - ldr r0, _08084AF4 @ =gPlayerState - adds r0, #0xa0 - movs r1, #1 - strb r1, [r0] - b _08084B16 - .align 2, 0 -_08084AF4: .4byte gPlayerState -_08084AF8: - bl DeleteClones - adds r0, r4, #0 - movs r1, #0x30 - movs r2, #0 - bl CreateFx - ldr r0, [r4, #0x54] - bl DeleteEntity - ldr r0, _08084B18 @ =0x0000018F - bl SoundReq - bl DeleteThisEntity -_08084B16: - pop {r4, r5, pc} - .align 2, 0 -_08084B18: .4byte 0x0000018F - - thumb_func_start sub_08084B1C -sub_08084B1C: @ 0x08084B1C - push {r4, r5, r6, r7, lr} - mov r7, sl - mov r6, sb - mov r5, r8 - push {r5, r6, r7} - adds r4, r0, #0 - ldr r3, _08084CA4 @ =gPlayerEntity - ldrb r0, [r3, #0x10] - strb r0, [r4, #0x10] - adds r0, r3, #0 - adds r0, #0x60 - ldrh r1, [r0] - adds r0, r4, #0 - adds r0, #0x60 - strh r1, [r0] - ldrb r0, [r3, #0x1e] - strb r0, [r4, #0x1e] - adds r0, r3, #0 - adds r0, #0x5b - ldrb r0, [r0] - adds r1, r4, #0 - adds r1, #0x5b - strb r0, [r1] - ldrh r0, [r3, #0x12] - strh r0, [r4, #0x12] - ldrb r0, [r3, #0x15] - strb r0, [r4, #0x15] - ldrb r0, [r3, #0x14] - strb r0, [r4, #0x14] - ldrb r0, [r3, #0x18] - movs r1, #1 - mov r8, r1 - movs r1, #0x40 - ands r1, r0 - ldrb r2, [r4, #0x18] - movs r0, #0x41 - rsbs r0, r0, #0 - mov sb, r0 - ands r0, r2 - orrs r0, r1 - strb r0, [r4, #0x18] - ldrb r1, [r3, #0x19] - lsrs r1, r1, #6 - lsls r1, r1, #6 - ldrb r2, [r4, #0x19] - movs r7, #0x3f - adds r0, r7, #0 - ands r0, r2 - orrs r0, r1 - strb r0, [r4, #0x19] - adds r0, r3, #0 - adds r0, #0x29 - ldrb r1, [r0] - lsls r1, r1, #0x1d - movs r0, #0x29 - adds r0, r0, r4 - mov ip, r0 - movs r6, #7 - lsrs r1, r1, #0x1d - ldrb r2, [r0] - movs r0, #8 - rsbs r0, r0, #0 - mov sl, r0 - ands r0, r2 - orrs r0, r1 - mov r1, ip - strb r0, [r1] - ldrb r1, [r3, #0x1b] - lsrs r1, r1, #6 - lsls r1, r1, #6 - ldrb r2, [r4, #0x1b] - adds r0, r7, #0 - ands r0, r2 - orrs r0, r1 - strb r0, [r4, #0x1b] - adds r0, r3, #0 - adds r0, #0x38 - ldrb r1, [r0] - adds r0, r4, #0 - adds r0, #0x38 - strb r1, [r0] - adds r0, r3, #0 - adds r0, #0x3b - ldrb r0, [r0] - adds r1, r4, #0 - adds r1, #0x3b - strb r0, [r1] - adds r0, r3, #0 - adds r0, #0x3f - ldrb r0, [r0] - adds r1, #4 - strb r0, [r1] - adds r0, r3, #0 - adds r0, #0x3c - ldrb r1, [r0] - adds r0, r4, #0 - adds r0, #0x3c - strb r1, [r0] - adds r0, r3, #0 - adds r0, #0x40 - ldrb r1, [r0] - adds r0, r4, #0 - adds r0, #0x40 - strb r1, [r0] - ldr r1, [r4, #0x54] - adds r0, r4, #0 - bl CopyPosition - ldr r5, _08084CA8 @ =gPlayerState - ldrb r0, [r5, #4] - cmp r0, #0 - beq _08084C6A - ldr r1, [r4, #0x54] - ldr r0, [r5, #0x2c] - adds r0, #0x44 - ldrb r0, [r0] - adds r1, #0x44 - strb r0, [r1] - ldr r1, [r4, #0x54] - ldr r0, [r5, #0x2c] - ldrb r0, [r0, #0x1e] - strb r0, [r1, #0x1e] - ldr r3, [r4, #0x54] - ldr r0, [r5, #0x2c] - ldrb r1, [r0, #0x18] - lsls r1, r1, #0x19 - lsrs r1, r1, #0x1f - mov r0, r8 - ands r1, r0 - lsls r1, r1, #6 - ldrb r2, [r3, #0x18] - mov r0, sb - ands r0, r2 - orrs r0, r1 - strb r0, [r3, #0x18] - ldr r3, [r4, #0x54] - ldr r0, [r5, #0x2c] - ldrb r1, [r0, #0x19] - lsrs r1, r1, #6 - lsls r1, r1, #6 - ldrb r2, [r3, #0x19] - adds r0, r7, #0 - ands r0, r2 - orrs r0, r1 - strb r0, [r3, #0x19] - ldr r2, [r4, #0x54] - ldr r0, [r5, #0x2c] - adds r0, #0x29 - ldrb r0, [r0] - lsls r0, r0, #0x1d - lsrs r0, r0, #0x1d - adds r2, #0x29 - ands r6, r0 - ldrb r1, [r2] - mov r0, sl - ands r0, r1 - orrs r0, r6 - strb r0, [r2] - ldr r1, [r4, #0x54] - ldrb r0, [r1, #0x18] - lsls r0, r0, #0x19 - cmp r0, #0 - bge _08084C6A - ldr r1, [r1, #0x48] - ldrb r0, [r1] - rsbs r0, r0, #0 - strb r0, [r1] -_08084C6A: - adds r0, r4, #0 - movs r1, #0 - movs r2, #0 - bl sub_0806FEBC - adds r0, r4, #0 - movs r1, #1 - movs r2, #0 - bl sub_0806FEBC - adds r0, r4, #0 - movs r1, #2 - adds r2, r4, #0 - bl sub_0806FEBC - adds r0, r4, #0 - movs r1, #3 - movs r2, #0 - bl sub_0806FEBC - ldr r0, [r4, #0x54] - adds r1, r4, #0 - bl sub_08078E84 - pop {r3, r4, r5} - mov r8, r3 - mov sb, r4 - mov sl, r5 - pop {r4, r5, r6, r7, pc} - .align 2, 0 -_08084CA4: .4byte gPlayerEntity -_08084CA8: .4byte gPlayerState - - thumb_func_start sub_08084CAC -sub_08084CAC: @ 0x08084CAC - push {r4, r5, r6, r7, lr} - adds r5, r0, #0 - ldr r6, _08084D18 @ =gPlayerClones - ldrb r0, [r5, #0xa] - lsls r0, r0, #2 - adds r0, r0, r6 - ldr r0, [r0] - ldr r0, [r0, #0x70] - cmp r0, #0 - bne _08084D32 - ldrb r0, [r5, #0x14] - movs r2, #6 - ands r2, r0 - lsls r2, r2, #1 - ldr r0, _08084D1C @ =gUnk_080B4468 - adds r2, r2, r0 - movs r1, #0x2e - ldrsh r0, [r5, r1] - movs r3, #0 - ldrsh r1, [r2, r3] - adds r0, r0, r1 - ldr r4, _08084D20 @ =gRoomControls - ldrh r1, [r4, #6] - subs r0, r0, r1 - asrs r0, r0, #4 - movs r3, #0x3f - ands r0, r3 - movs r7, #0x32 - ldrsh r1, [r5, r7] - movs r7, #2 - ldrsh r2, [r2, r7] - adds r1, r1, r2 - ldrh r2, [r4, #8] - subs r1, r1, r2 - asrs r1, r1, #4 - ands r1, r3 - lsls r1, r1, #6 - orrs r0, r1 - adds r1, r5, #0 - adds r1, #0x38 - ldrb r1, [r1] - bl GetTileType - bl sub_080B1B54 - cmp r0, #0x72 - bne _08084D24 - ldr r2, [r6] - movs r1, #1 - ldrb r5, [r5, #0xa] - lsls r1, r5 - ldr r0, [r2, #0x6c] - orrs r0, r1 - b _08084D30 - .align 2, 0 -_08084D18: .4byte gPlayerClones -_08084D1C: .4byte gUnk_080B4468 -_08084D20: .4byte gRoomControls -_08084D24: - ldr r2, [r6] - movs r1, #1 - ldrb r5, [r5, #0xa] - lsls r1, r5 - ldr r0, [r2, #0x6c] - bics r0, r1 -_08084D30: - str r0, [r2, #0x6c] -_08084D32: - pop {r4, r5, r6, r7, pc} diff --git a/assets/assets.json b/assets/assets.json index 48bcb6a2..d7eaee43 100644 --- a/assets/assets.json +++ b/assets/assets.json @@ -42665,16 +42665,6 @@ "size": 56, "type": "animation" }, - { - "path": "object10/gUnk_0812056C.bin", - "start": 1181036, - "size": 8 - }, - { - "path": "object10/gUnk_08120574.bin", - "start": 1181044, - "size": 8 - }, { "path": "animations/gSpriteAnimations_Railtrack_0.bin", "start": 1181156, diff --git a/data/const/object/object10.s b/data/const/object/object10.s deleted file mode 100644 index ea6d7265..00000000 --- a/data/const/object/object10.s +++ /dev/null @@ -1,16 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - .align 2 - -gUnk_08120560:: @ 08120560 - .4byte sub_0808483C - .4byte sub_080848C8 - .4byte sub_080849D8 - -gUnk_0812056C:: @ 0812056C - .incbin "object10/gUnk_0812056C.bin" - -gUnk_08120574:: @ 08120574 - .incbin "object10/gUnk_08120574.bin" diff --git a/include/functions.h b/include/functions.h index f6bc2bc4..2ba07a82 100644 --- a/include/functions.h +++ b/include/functions.h @@ -255,4 +255,5 @@ extern void sub_080ADD70(void); extern bool32 sub_080AE4CC(Entity*, u32, u32, u32); extern void sub_080AE58C(Entity*, u32, u32); extern void sub_080AF284(void); +extern bool32 sub_080B1B54(u32); #endif diff --git a/include/object.h b/include/object.h index f6f7f5c5..5d6cb713 100644 --- a/include/object.h +++ b/include/object.h @@ -46,7 +46,7 @@ typedef enum { OBJECT_D, OBJECT_E, SPECIAL_FX, - OBJECT_10, + PLAYER_CLONE, OBJECT_11, OBJECT_12, RAILTRACK, @@ -242,7 +242,7 @@ void ChestSpawner(); void ObjectD(); void ObjectE(); void SpecialFx(); -void Object10(); +void PlayerClone(); void Object11(); void Object12(); void Railtrack(); diff --git a/linker.ld b/linker.ld index e39f434f..eeb7506b 100644 --- a/linker.ld +++ b/linker.ld @@ -636,7 +636,7 @@ SECTIONS { src/object/objectD.o(.text); src/object/objectE.o(.text); src/object/specialFx.o(.text); - asm/object/object10.o(.text); + src/object/playerClone.o(.text); src/object/object11.o(.text); src/object/object12.o(.text); src/object/railtrack.o(.text); @@ -1354,7 +1354,7 @@ SECTIONS { data/animations/object/objectD.o(.rodata); src/object/specialFx.o(.rodata); data/animations/object/specialFx.o(.rodata); - data/const/object/object10.o(.rodata); + src/object/playerClone.o(.rodata); src/object/object11.o(.rodata); src/object/object12.o(.rodata); data/const/object/railtrack.o(.rodata); diff --git a/src/object.c b/src/object.c index caddaddc..da1eb312 100644 --- a/src/object.c +++ b/src/object.c @@ -18,7 +18,7 @@ void (*const gObjectFunctions[])(Entity*) = { [OBJECT_D] = ObjectD, [OBJECT_E] = ObjectE, [SPECIAL_FX] = SpecialFx, - [OBJECT_10] = Object10, + [PLAYER_CLONE] = PlayerClone, [OBJECT_11] = Object11, [OBJECT_12] = Object12, [RAILTRACK] = Railtrack, diff --git a/src/object/playerClone.c b/src/object/playerClone.c new file mode 100644 index 00000000..eee252ae --- /dev/null +++ b/src/object/playerClone.c @@ -0,0 +1,187 @@ +#define NENT_DEPRECATED +#include "entity.h" +#include "room.h" +#include "asm.h" +#include "sound.h" +#include "player.h" +#include "functions.h" +#include "effects.h" + +typedef struct { + Entity base; + u8 filler[0x4]; + u32 unk6c; + u32 unk70; + u16 tilePos; + u16 unk76; + u16 unk78; + u16 unk7a; +} PlayerCloneEntity; + +extern Entity* sub_08077CF8(u32 subtype, u32 form, u32 parameter, u32 unk); +extern const s16 gUnk_080B4468[]; + +void PlayerClone_Init(PlayerCloneEntity*); +void PlayerClone_Action1(PlayerCloneEntity*); +void PlayerClone_Action2(PlayerCloneEntity*); +void sub_08084B1C(PlayerCloneEntity*); +void sub_08084CAC(PlayerCloneEntity*); + +void PlayerClone(Entity* this) { + static void (*const actionFuncs[])(PlayerCloneEntity*) = { + PlayerClone_Init, + PlayerClone_Action1, + PlayerClone_Action2, + }; + + actionFuncs[this->action]((PlayerCloneEntity*)this); +} + +void PlayerClone_Init(PlayerCloneEntity* this) { + super->action = 1; + super->spriteRendering.b3 = 2; + super->spritePriority.b0 = 4; + super->x.HALF.HI = (super->x.HALF.HI & 0xfff0) | 8; + super->y.HALF.HI = (super->y.HALF.HI & 0xfff0) | 8; + this->tilePos = COORD_TO_TILE(super); + InitializeAnimation(super, 8); + SetTile(0x4016, this->tilePos, super->collisionLayer); + SoundReq(SFX_112); +} + +const u16 PlayerCloneCollisions[] = { 0x2206, 0x6044, 0x4460, 0x622 }; + +void PlayerClone_Action1(PlayerCloneEntity* this) { + static const Hitbox PlayerCloneHitbox = { 0, -3, { 5, 3, 3, 5 }, 6, 6 }; + + if (gPlayerState.chargeState.action == 5) { + super->spriteSettings.draw = 1; + super->health = 1; + super->action = 2; + super->updatePriority = 6; + super->hitbox = (Hitbox*)&PlayerCloneHitbox; + super->field_0xf = (super->type + 1) * 15; + this->unk78 = super->x.HALF.HI - gPlayerEntity.x.HALF.HI; + this->unk7a = super->y.HALF.HI - gPlayerEntity.y.HALF.HI; + if ((this->unk78 != 0) && (this->unk7a != 0)) { + ((PlayerCloneEntity*)gPlayerClones[super->type])->unk70 = 1; + } + sub_08000152(0x315, this->tilePos, super->collisionLayer); + super->child = sub_08077CF8(1, super->type + 1, 0, ((GenericEntity*)gPlayerState.item)->field_0x68.HALF.LO); + if (super->child != NULL) { + super->child->parent = super; + } + sub_0801766C(super); + sub_0806FDA0(super); + PlayerClone_Action2(this); + } else if (gPlayerState.chargeState.action != 4) { + sub_08000152(0x315, this->tilePos, super->collisionLayer); + gPlayerClones[super->type] = NULL; + DeleteThisEntity(); + } else { + super->spriteSettings.draw ^= 1; + } +} + +void PlayerClone_Action2(PlayerCloneEntity* this) { + u32 index; + + if (super->field_0xf == 1) { + SoundReq(SFX_PLY_VO2); + super->field_0xf--; + } else if (super->field_0xf != 0) { + super->field_0xf--; + } + + if (gPlayerState.chargeState.action == 5 && gPlayerClones[super->type] != NULL && gPlayerState.framestate != 19 && + super->health != 0) { + if (gPlayerEntity.iframes >= 1) { + gPlayerState.chargeState.action = 1; + } else { + sub_080B1AA8(super); + sub_08084B1C(this); + super->x.HALF.HI = gPlayerEntity.x.HALF.HI + this->unk78; + super->y.HALF.HI = gPlayerEntity.y.HALF.HI + this->unk7a; + sub_08084CAC(this); + sub_080085B0(super); + if ((super->collisions & 0x6666) != 0x6666) { + for (index = 0; index <= 3; index++) { + if (PlayerCloneCollisions[index] == (PlayerCloneCollisions[index] & super->collisions)) { + break; + } + } + + if (index == 4) { + super->actionDelay = 0; + super->spriteSettings.draw = 1; + return; + } else { + if (super->actionDelay != 0) { + if (--super->actionDelay != 0) { + super->spriteSettings.draw ^= 1; + return; + } + } else { + super->actionDelay = 30; + return; + } + } + } + gPlayerState.chargeState.action = 1; + return; + } + } + DeleteClones(); + CreateFx(super, FX_SPARKLE_SECRET, 0); + DeleteEntity(super->child); + SoundReq(SFX_18F); + DeleteThisEntity(); +} + +void sub_08084B1C(PlayerCloneEntity* this) { + super->flags = gPlayerEntity.flags; + super->spriteVramOffset = gPlayerEntity.spriteVramOffset; + super->frameIndex = gPlayerEntity.frameIndex; + super->frameSpriteSettings = gPlayerEntity.frameSpriteSettings; + super->spriteIndex = gPlayerEntity.spriteIndex; + super->direction = gPlayerEntity.direction; + super->animationState = gPlayerEntity.animationState; + super->spriteSettings.flipX = gPlayerEntity.spriteSettings.flipX; + super->spriteRendering.b3 = gPlayerEntity.spriteRendering.b3; + super->spritePriority.b0 = gPlayerEntity.spritePriority.b0; + super->spriteOrientation.flipY = gPlayerEntity.spriteOrientation.flipY; + super->collisionLayer = gPlayerEntity.collisionLayer; + super->flags2 = gPlayerEntity.flags2; + super->hitType = gPlayerEntity.hitType; + super->field_0x3c = gPlayerEntity.field_0x3c; + super->hurtType = gPlayerEntity.hurtType; + CopyPosition(super, super->child); + if (gPlayerState.field_0x3[1] != 0) { + super->child->damage = gPlayerState.item->damage; + super->child->frameIndex = gPlayerState.item->frameIndex; + super->child->spriteSettings.flipX = gPlayerState.item->spriteSettings.flipX; + super->child->spriteRendering.b3 = gPlayerState.item->spriteRendering.b3; + super->child->spritePriority.b0 = gPlayerState.item->spritePriority.b0; + if (super->child->spriteSettings.flipX) { + super->child->hitbox->offset_x = -super->child->hitbox->offset_x; + } + } + sub_0806FEBC(super, 0, 0); + sub_0806FEBC(super, 1, 0); + sub_0806FEBC(super, 2, super); + sub_0806FEBC(super, 3, 0); + sub_08078E84(super->child, super); +} + +void sub_08084CAC(PlayerCloneEntity* this) { + const s16* ptr; + + if (((PlayerCloneEntity*)gPlayerClones[super->type])->unk70 == 0) { + ptr = &gUnk_080B4468[super->animationState & 6]; + if (sub_080B1B54(GetTileType(COORD_TO_TILE_OFFSET(super, -ptr[0], -ptr[1]), super->collisionLayer)) == 0x72) { + ((PlayerCloneEntity*)gPlayerClones[0])->unk6c |= (1 << super->type); + } else { + ((PlayerCloneEntity*)gPlayerClones[0])->unk6c &= ~(1 << super->type); + } + } +} diff --git a/src/player.c b/src/player.c index 5f15068c..252c178c 100644 --- a/src/player.c +++ b/src/player.c @@ -3501,7 +3501,7 @@ void SurfaceAction_CloneTile(Entity* this) { break; } if (n > i) { - Entity* e = CreateObjectWithParent(this, OBJECT_10, i, 0); + Entity* e = CreateObjectWithParent(this, PLAYER_CLONE, i, 0); gPlayerClones[i] = e; if (e != NULL) { CopyPosition(this, e); From 830f07d554f840b6d8921c6c5a273a03987a46fb Mon Sep 17 00:00:00 2001 From: Tal Hayon Date: Sun, 13 Mar 2022 01:17:02 +0200 Subject: [PATCH 02/23] Decompile object15 --- asm/object/object15.s | 98 ------------------------------------ data/const/object/object15.s | 9 ---- linker.ld | 4 +- src/object/object15.c | 48 ++++++++++++++++++ 4 files changed, 50 insertions(+), 109 deletions(-) delete mode 100644 asm/object/object15.s delete mode 100644 data/const/object/object15.s create mode 100644 src/object/object15.c diff --git a/asm/object/object15.s b/asm/object/object15.s deleted file mode 100644 index 7f9ddd41..00000000 --- a/asm/object/object15.s +++ /dev/null @@ -1,98 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start Object15 -Object15: @ 0x0808601C - push {lr} - ldr r2, _08086030 @ =gUnk_08120648 - ldrb r1, [r0, #0xc] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_08086030: .4byte gUnk_08120648 - - thumb_func_start sub_08086034 -sub_08086034: @ 0x08086034 - push {lr} - movs r3, #1 - movs r1, #1 - strb r1, [r0, #0xc] - ldrb r2, [r0, #0x18] - subs r1, #5 - ands r1, r2 - orrs r1, r3 - strb r1, [r0, #0x18] - adds r1, r0, #0 - adds r1, #0x58 - ldrb r1, [r1] - bl InitializeAnimation - pop {pc} - .align 2, 0 - - thumb_func_start sub_08086054 -sub_08086054: @ 0x08086054 - push {r4, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xa] - cmp r0, #0 - bne _08086064 - adds r0, r4, #0 - bl GetNextFrame -_08086064: - ldrb r0, [r4, #0xb] - cmp r0, #0 - beq _0808607C - ldrb r2, [r4, #0x18] - lsls r1, r2, #0x1e - lsrs r1, r1, #0x1e - movs r0, #1 - eors r1, r0 - subs r0, #5 - ands r0, r2 - orrs r0, r1 - strb r0, [r4, #0x18] -_0808607C: - ldrb r0, [r4, #0xe] - lsls r1, r0, #0x18 - cmp r1, #0 - blt _080860AA - cmp r1, #0 - beq _08086098 - subs r0, #1 - strb r0, [r4, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _080860AA - bl DeleteThisEntity - b _080860AA -_08086098: - adds r0, r4, #0 - adds r0, #0x5a - ldrb r1, [r0] - movs r0, #0x80 - ands r0, r1 - cmp r0, #0 - beq _080860AA - bl DeleteThisEntity -_080860AA: - ldr r1, [r4, #0x54] - cmp r1, #0 - beq _080860BC - ldr r0, [r1, #0x2c] - str r0, [r4, #0x2c] - ldr r0, [r1, #0x30] - str r0, [r4, #0x30] - ldr r0, [r1, #0x34] - str r0, [r4, #0x34] -_080860BC: - pop {r4, pc} - .align 2, 0 diff --git a/data/const/object/object15.s b/data/const/object/object15.s deleted file mode 100644 index 1b2ec904..00000000 --- a/data/const/object/object15.s +++ /dev/null @@ -1,9 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - .align 2 - -gUnk_08120648:: @ 08120648 - .4byte sub_08086034 - .4byte sub_08086054 diff --git a/linker.ld b/linker.ld index eeb7506b..f09a1690 100644 --- a/linker.ld +++ b/linker.ld @@ -641,7 +641,7 @@ SECTIONS { src/object/object12.o(.text); src/object/railtrack.o(.text); src/object/lilypadLarge.o(.text); - asm/object/object15.o(.text); + src/object/object15.o(.text); src/object/floatingPlatform.o(.text); asm/object/object17.o(.text); asm/object/evilSpirit.o(.text); @@ -1360,7 +1360,7 @@ SECTIONS { data/const/object/railtrack.o(.rodata); data/animations/object/railtrack.o(.rodata); data/const/object/lilypadLarge.o(.rodata); - data/const/object/object15.o(.rodata); + src/object/object15.o(.rodata); src/object/floatingPlatform.o(.rodata); data/const/object/object17.o(.rodata); data/const/object/evilSpirit.o(.rodata); diff --git a/src/object/object15.c b/src/object/object15.c new file mode 100644 index 00000000..25bfe1f5 --- /dev/null +++ b/src/object/object15.c @@ -0,0 +1,48 @@ +#define NENT_DEPRECATED +#include "entity.h" + +void Object15_Init(Entity*); +void Object15_Action1(Entity*); + +void Object15(Entity* this) { + static void (*const actionFuncs[])(Entity*) = { + Object15_Init, + Object15_Action1, + }; + + actionFuncs[this->action](this); +} + +void Object15_Init(Entity* this) { + this->action = 1; + this->spriteSettings.draw = 1; + InitializeAnimation(this, this->animIndex); +} + +void Object15_Action1(Entity* this) { + if (this->type == 0) { + GetNextFrame(this); + } + + if (this->type2 != 0) { + this->spriteSettings.draw ^= 1; + } + + if ((int)(this->actionDelay * 0x1000000) >= 0) { + if (this->actionDelay) { + if (--this->actionDelay == 0) { + DeleteThisEntity(); + } + } else { + if ((this->frame & 0x80) != 0) { + DeleteThisEntity(); + } + } + } + + if (this->child != NULL) { + this->x = this->child->x; + this->y = this->child->y; + this->z = this->child->z; + } +} From 710ede70d288c5a10b78805502c5a519247c44b4 Mon Sep 17 00:00:00 2001 From: Tal Hayon Date: Sun, 13 Mar 2022 01:25:41 +0200 Subject: [PATCH 03/23] Decompile object17 --- asm/object/object17.s | 119 ----------------------------------- data/const/object/object17.s | 9 --- linker.ld | 4 +- src/object/object17.c | 45 +++++++++++++ 4 files changed, 47 insertions(+), 130 deletions(-) delete mode 100644 asm/object/object17.s delete mode 100644 data/const/object/object17.s create mode 100644 src/object/object17.c diff --git a/asm/object/object17.s b/asm/object/object17.s deleted file mode 100644 index 2dee5055..00000000 --- a/asm/object/object17.s +++ /dev/null @@ -1,119 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start Object17 -Object17: @ 0x080861AC - push {lr} - ldr r2, _080861C0 @ =gUnk_08120660 - ldrb r1, [r0, #0xc] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_080861C0: .4byte gUnk_08120660 - - thumb_func_start sub_080861C4 -sub_080861C4: @ 0x080861C4 - push {r4, r5, r6, lr} - adds r4, r0, #0 - movs r5, #1 - movs r0, #1 - strb r0, [r4, #0xc] - movs r0, #0x80 - strh r0, [r4, #0x24] - ldr r0, _08086230 @ =gPlayerEntity - mov ip, r0 - ldrb r1, [r0, #0x19] - lsrs r1, r1, #6 - lsls r1, r1, #6 - ldrb r3, [r4, #0x19] - movs r2, #0x3f - adds r0, r2, #0 - ands r0, r3 - orrs r0, r1 - strb r0, [r4, #0x19] - mov r0, ip - adds r0, #0x29 - ldrb r1, [r0] - lsls r1, r1, #0x1d - adds r6, r4, #0 - adds r6, #0x29 - lsrs r1, r1, #0x1d - ldrb r3, [r6] - movs r0, #8 - rsbs r0, r0, #0 - ands r0, r3 - orrs r0, r1 - strb r0, [r6] - mov r0, ip - adds r0, #0x38 - ldrb r1, [r0] - adds r0, r4, #0 - adds r0, #0x38 - strb r1, [r0] - mov r1, ip - ldrb r0, [r1, #0x1b] - lsrs r0, r0, #6 - lsls r0, r0, #6 - ldrb r1, [r4, #0x1b] - ands r2, r1 - orrs r2, r0 - strb r2, [r4, #0x1b] - bl Random - ands r0, r5 - strb r0, [r4, #0xa] - adds r0, r4, #0 - movs r1, #0x11 - bl InitializeAnimation - pop {r4, r5, r6, pc} - .align 2, 0 -_08086230: .4byte gPlayerEntity - - thumb_func_start sub_08086234 -sub_08086234: @ 0x08086234 - push {r4, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xa] - cmp r0, #0 - beq _08086258 - ldr r0, _08086254 @ =gRoomTransition - ldr r0, [r0] - movs r1, #1 - ands r0, r1 - cmp r0, #0 - bne _0808625E - adds r0, r4, #0 - bl GetNextFrame - b _0808625E - .align 2, 0 -_08086254: .4byte gRoomTransition -_08086258: - adds r0, r4, #0 - bl GetNextFrame -_0808625E: - adds r0, r4, #0 - bl sub_0806F3E4 - cmp r0, #0 - beq _0808626E - bl DeleteThisEntity - b _0808627E -_0808626E: - ldr r0, _08086280 @ =gPlayerState - ldrb r1, [r0, #0x1c] - movs r0, #0xf - ands r0, r1 - cmp r0, #1 - beq _0808627E - bl DeleteThisEntity -_0808627E: - pop {r4, pc} - .align 2, 0 -_08086280: .4byte gPlayerState diff --git a/data/const/object/object17.s b/data/const/object/object17.s deleted file mode 100644 index 2f7cf510..00000000 --- a/data/const/object/object17.s +++ /dev/null @@ -1,9 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - .align 2 - -gUnk_08120660:: @ 08120660 - .4byte sub_080861C4 - .4byte sub_08086234 diff --git a/linker.ld b/linker.ld index f09a1690..3900ebdc 100644 --- a/linker.ld +++ b/linker.ld @@ -643,7 +643,7 @@ SECTIONS { src/object/lilypadLarge.o(.text); src/object/object15.o(.text); src/object/floatingPlatform.o(.text); - asm/object/object17.o(.text); + src/object/object17.o(.text); asm/object/evilSpirit.o(.text); src/object/houseDoorExterior.o(.text); src/object/rupee.o(.text); @@ -1362,7 +1362,7 @@ SECTIONS { data/const/object/lilypadLarge.o(.rodata); src/object/object15.o(.rodata); src/object/floatingPlatform.o(.rodata); - data/const/object/object17.o(.rodata); + src/object/object17.o(.rodata); data/const/object/evilSpirit.o(.rodata); data/animations/object/evilSpirit.o(.rodata); data/const/object/houseDoorExterior.o(.rodata); diff --git a/src/object/object17.c b/src/object/object17.c new file mode 100644 index 00000000..419b3173 --- /dev/null +++ b/src/object/object17.c @@ -0,0 +1,45 @@ +#define NENT_DEPRECATED +#include "entity.h" +#include "player.h" +#include "asm.h" +#include "room.h" +#include "coord.h" + +void Object17_Init(Entity*); +void Object17_Action1(Entity*); + +void Object17(Entity* this) { + static void (*const actionFuncs[])(Entity*) = { + Object17_Init, + Object17_Action1, + }; + + actionFuncs[this->action](this); +} + +void Object17_Init(Entity* this) { + this->action = 1; + this->speed = 0x80; + this->spriteRendering.b3 = gPlayerEntity.spriteRendering.b3; + this->spritePriority.b0 = gPlayerEntity.spritePriority.b0; + this->collisionLayer = gPlayerEntity.collisionLayer; + this->spriteOrientation.flipY = gPlayerEntity.spriteOrientation.flipY; + this->type = Random() & 1; + InitializeAnimation(this, 0x11); +} + +void Object17_Action1(Entity* this) { + if (this->type != 0) { + if ((gRoomTransition.frameCount & 1) == 0) { + GetNextFrame(this); + } + } else { + GetNextFrame(this); + } + + if (sub_0806F3E4(this)) { + DeleteThisEntity(); + } else if ((gPlayerState.field_0x1c & 0xf) != 1) { + DeleteThisEntity(); + } +} From 935a37b95335afea375a137cfb14c3f2e583d707 Mon Sep 17 00:00:00 2001 From: Tal Hayon Date: Sun, 13 Mar 2022 02:03:18 +0200 Subject: [PATCH 04/23] decompile object1F --- asm/object/object1F.s | 208 ----------------------------------- assets/assets.json | 10 -- data/const/object/object1F.s | 16 --- linker.ld | 4 +- src/object/object1F.c | 102 +++++++++++++++++ 5 files changed, 104 insertions(+), 236 deletions(-) delete mode 100644 asm/object/object1F.s delete mode 100644 data/const/object/object1F.s create mode 100644 src/object/object1F.c diff --git a/asm/object/object1F.s b/asm/object/object1F.s deleted file mode 100644 index db5a2968..00000000 --- a/asm/object/object1F.s +++ /dev/null @@ -1,208 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start Object1F -Object1F: @ 0x08087690 - push {lr} - ldr r2, _080876A4 @ =gUnk_08120A0C - ldrb r1, [r0, #0xc] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_080876A4: .4byte gUnk_08120A0C - - thumb_func_start sub_080876A8 -sub_080876A8: @ 0x080876A8 - push {lr} - mov ip, r0 - movs r0, #1 - mov r1, ip - strb r0, [r1, #0xc] - movs r0, #0xb0 - lsls r0, r0, #0xa - str r0, [r1, #0x20] - ldrb r2, [r1, #0x14] - lsls r0, r2, #2 - movs r1, #0x10 - eors r0, r1 - mov r3, ip - strb r0, [r3, #0x15] - lsls r2, r2, #0x18 - cmp r2, #0 - bne _080876E2 - adds r3, #0x29 - ldrb r2, [r3] - lsls r1, r2, #0x1d - lsrs r1, r1, #0x1d - subs r1, #1 - movs r0, #7 - ands r1, r0 - movs r0, #8 - rsbs r0, r0, #0 - ands r0, r2 - orrs r0, r1 - strb r0, [r3] -_080876E2: - ldr r1, _08087760 @ =gUnk_08120A20 - mov r2, ip - ldrb r0, [r2, #0x14] - adds r0, r0, r1 - ldrb r0, [r0] - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - ldrh r3, [r2, #0x2e] - adds r0, r0, r3 - strh r0, [r2, #0x2e] - ldrb r0, [r2, #0x14] - adds r0, #1 - adds r0, r0, r1 - ldrb r0, [r0] - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - ldrh r1, [r2, #0x32] - adds r0, r0, r1 - strh r0, [r2, #0x32] - ldr r3, _08087764 @ =gUnk_08120A18 - ldrb r0, [r2, #0xf] - lsls r0, r0, #2 - adds r0, r0, r3 - ldrb r1, [r0, #3] - mov r0, ip - adds r0, #0x60 - strh r1, [r0] - ldrb r0, [r2, #0xf] - lsls r0, r0, #2 - adds r0, r0, r3 - ldrb r1, [r0, #1] - movs r0, #0xf - ands r1, r0 - ldrb r2, [r2, #0x1a] - movs r0, #0x10 - rsbs r0, r0, #0 - ands r0, r2 - orrs r0, r1 - mov r2, ip - strb r0, [r2, #0x1a] - ldrb r0, [r2, #0xf] - lsls r0, r0, #2 - adds r0, r0, r3 - ldrb r0, [r0, #2] - str r0, [r2, #0x6c] - ldr r0, _08087768 @ =gPlayerEntity - adds r0, #0x38 - ldrb r1, [r0] - mov r0, ip - adds r0, #0x38 - strb r1, [r0] - movs r0, #0x80 - lsls r0, r0, #1 - strh r0, [r2, #0x24] - ldrb r0, [r2, #0xf] - lsls r0, r0, #2 - adds r0, r0, r3 - ldrb r1, [r0] - mov r0, ip - bl InitializeAnimation - pop {pc} - .align 2, 0 -_08087760: .4byte gUnk_08120A20 -_08087764: .4byte gUnk_08120A18 -_08087768: .4byte gPlayerEntity - - thumb_func_start sub_0808776C -sub_0808776C: @ 0x0808776C - push {r4, lr} - adds r4, r0, #0 - ldr r0, [r4, #0x6c] - cmp r0, #0 - beq _08087788 - subs r0, #1 - str r0, [r4, #0x6c] - ldr r0, _08087784 @ =gPlayerState - adds r0, #0x3d - ldrb r0, [r0] - b _08087798 - .align 2, 0 -_08087784: .4byte gPlayerState -_08087788: - adds r0, r4, #0 - bl ProcessMovement2 - movs r1, #0xa0 - lsls r1, r1, #6 - adds r0, r4, #0 - bl GravityUpdate -_08087798: - cmp r0, #0 - bne _080877A0 - movs r0, #2 - strb r0, [r4, #0xc] -_080877A0: - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_080877A4 -sub_080877A4: @ 0x080877A4 - push {r4, lr} - adds r4, r0, #0 - bl sub_080B1B0C - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - adds r1, r0, #0 - cmp r0, #0x25 - beq _080877D0 - cmp r0, #0x25 - bgt _080877C4 - cmp r0, #0x21 - beq _080877CA - cmp r0, #0x24 - beq _080877D6 - b _080877E2 -_080877C4: - cmp r1, #0x30 - beq _080877D6 - b _080877E2 -_080877CA: - adds r0, r4, #0 - movs r1, #0 - b _080877DA -_080877D0: - adds r0, r4, #0 - movs r1, #0xc - b _080877DA -_080877D6: - adds r0, r4, #0 - movs r1, #0xb -_080877DA: - movs r2, #0 - bl CreateFx - b _08087804 -_080877E2: - ldrb r0, [r4, #0xb] - cmp r0, #0 - beq _08087804 - cmp r0, #0xf - bne _080877F8 - ldrb r1, [r4, #0xe] - adds r0, r4, #0 - movs r2, #0x80 - bl CreateFx - b _08087804 -_080877F8: - ldrb r1, [r4, #0xb] - ldrb r2, [r4, #0xe] - adds r0, r4, #0 - movs r3, #0 - bl CreateObjectWithParent -_08087804: - bl DeleteThisEntity - pop {r4, pc} - .align 2, 0 diff --git a/assets/assets.json b/assets/assets.json index d7eaee43..c376afe1 100644 --- a/assets/assets.json +++ b/assets/assets.json @@ -42865,16 +42865,6 @@ "size": 44, "type": "animation" }, - { - "path": "object1F/gUnk_08120A18.bin", - "start": 1182232, - "size": 8 - }, - { - "path": "object1F/gUnk_08120A20.bin", - "start": 1182240, - "size": 8 - }, { "path": "animations/gSpriteAnimations_FigurineDevice_0.bin", "start": 1182440, diff --git a/data/const/object/object1F.s b/data/const/object/object1F.s deleted file mode 100644 index 9a818cb1..00000000 --- a/data/const/object/object1F.s +++ /dev/null @@ -1,16 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - .align 2 - -gUnk_08120A0C:: @ 08120A0C - .4byte sub_080876A8 - .4byte sub_0808776C - .4byte sub_080877A4 - -gUnk_08120A18:: @ 08120A18 - .incbin "object1F/gUnk_08120A18.bin" - -gUnk_08120A20:: @ 08120A20 - .incbin "object1F/gUnk_08120A20.bin" diff --git a/linker.ld b/linker.ld index 3900ebdc..8b88d7e5 100644 --- a/linker.ld +++ b/linker.ld @@ -651,7 +651,7 @@ SECTIONS { src/object/object1C.o(.text); src/object/object1D.o(.text); src/object/object1E.o(.text); - asm/object/object1F.o(.text); + src/object/object1F.o(.text); src/object/object20.o(.text); src/object/object21.o(.text); src/object/figurineDevice.o(.text); @@ -1372,7 +1372,7 @@ SECTIONS { data/const/object/object1D.o(.rodata); src/object/object1E.o(.rodata); data/animations/object/object1E.o(.rodata); - data/const/object/object1F.o(.rodata); + src/object/object1F.o(.rodata); src/object/object20.o(.rodata); src/object/object21.o(.rodata); src/object/figurineDevice.o(.rodata); diff --git a/src/object/object1F.c b/src/object/object1F.c new file mode 100644 index 00000000..2c548d67 --- /dev/null +++ b/src/object/object1F.c @@ -0,0 +1,102 @@ +#define NENT_DEPRECATED +#include "entity.h" +#include "player.h" +#include "functions.h" +#include "asm.h" +#include "effects.h" + +typedef struct { + Entity base; + u8 filler[0x4]; + u32 unk6c; +} Object1FEntity; + +void Object1F_Init(Object1FEntity*); +void Object1F_Action1(Object1FEntity*); +void Object1F_Action2(Object1FEntity*); + +void Object1F(Entity* this) { + static void (*const actionFuncs[])(Object1FEntity*) = { + Object1F_Init, + Object1F_Action1, + Object1F_Action2, + }; + + actionFuncs[this->action]((Object1FEntity*)this); +} + +typedef struct { + u8 animationState; + u8 unk1; + u8 unk2; + u8 spriteVramOffset; +} gUnk_08120A18_struct; + +void Object1F_Init(Object1FEntity* this) { + static const gUnk_08120A18_struct gUnk_08120A18[] = { + { 0x0, 0x2, 0xA, 0xE8 }, + { 0x0, 0x5, 0x20, 0xE0 }, + }; + static const s8 gUnk_08120A20[] = { 0, -18, 16, 0, 0, 12, -16, 0 }; + + u32 temp; + super->action = 1; + super->zVelocity = 0x2c000; + super->direction = super->animationState << 2 ^ 0x10; + if (super->animationState == 0) { + super->spritePriority.b0--; + } + super->x.HALF.HI = gUnk_08120A20[super->animationState] + super->x.HALF.HI; + super->y.HALF.HI = gUnk_08120A20[super->animationState + 1] + super->y.HALF.HI; + + super->spriteVramOffset = gUnk_08120A18[super->field_0xf].spriteVramOffset; + temp = gUnk_08120A18[super->field_0xf].unk1; + super->palette.b.b0 = temp; + this->unk6c = gUnk_08120A18[super->field_0xf].unk2; + super->collisionLayer = gPlayerEntity.collisionLayer; + super->speed = 0x100; + InitializeAnimation(super, gUnk_08120A18[super->field_0xf].animationState); +} + +void Object1F_Action1(Object1FEntity* this) { + u32 uVar1; + + if (this->unk6c) { + this->unk6c--; + uVar1 = gPlayerState.field_0x3c[1]; + } else { + ProcessMovement2(super); + uVar1 = GravityUpdate(super, 0x2800); + } + + if (uVar1 == 0) { + super->action = 2; + } +} + +void Object1F_Action2(Object1FEntity* this) { + u8 bVar1; + + bVar1 = sub_080B1B0C(super); + switch (bVar1) { + case 0x21: + CreateFx(super, FX_FALL_DOWN, 0); + break; + case 0x25: + CreateFx(super, FX_LAVA_SPLASH, 0); + break; + case 0x24: + case 0x30: + CreateFx(super, FX_WATER_SPLASH, 0); + break; + default: + if (super->type2 != 0) { + if (super->type2 == 15) { + CreateFx(super, super->actionDelay, 0x80); + } else { + CreateObjectWithParent(super, super->type2, super->actionDelay, 0); + } + } + } + DeleteThisEntity(); +} From e11d36d9acb8934de44623f4f1d774c7004ffd63 Mon Sep 17 00:00:00 2001 From: Tal Hayon Date: Sun, 13 Mar 2022 05:13:38 +0200 Subject: [PATCH 05/23] Decompile object28 --- asm/object/object28.s | 129 ------------------------------------------ linker.ld | 2 +- src/object/object28.c | 62 ++++++++++++++++++++ 3 files changed, 63 insertions(+), 130 deletions(-) delete mode 100644 asm/object/object28.s create mode 100644 src/object/object28.c diff --git a/asm/object/object28.s b/asm/object/object28.s deleted file mode 100644 index 8845a4f6..00000000 --- a/asm/object/object28.s +++ /dev/null @@ -1,129 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start Object28 -Object28: @ 0x0808976C - push {r4, r5, r6, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xc] - cmp r0, #0 - bne _080897D0 - movs r0, #1 - strb r0, [r4, #0xc] - ldrb r0, [r4, #0x18] - movs r1, #3 - orrs r0, r1 - strb r0, [r4, #0x18] - ldrb r0, [r4, #0xb] - strb r0, [r4, #0x1e] - ldrb r0, [r4, #0x1b] - movs r1, #0xc0 - orrs r0, r1 - strb r0, [r4, #0x1b] - ldrb r0, [r4, #0x19] - orrs r0, r1 - strb r0, [r4, #0x19] - ldrb r0, [r4, #0xa] - cmp r0, #3 - bne _080897AE - adds r2, r4, #0 - adds r2, #0x29 - ldrb r0, [r2] - movs r1, #8 - rsbs r1, r1, #0 - ands r1, r0 - movs r0, #6 - orrs r1, r0 - strb r1, [r2] - b _080897BA -_080897AE: - adds r2, r4, #0 - adds r2, #0x29 - ldrb r0, [r2] - movs r1, #7 - orrs r0, r1 - strb r0, [r2] -_080897BA: - ldrh r0, [r4, #0x2e] - adds r1, r4, #0 - adds r1, #0x68 - strh r0, [r1] - ldrh r0, [r4, #0x32] - adds r1, #2 - strh r0, [r1] - adds r0, r4, #0 - movs r1, #6 - bl SetDefaultPriority -_080897D0: - ldrb r1, [r4, #0x10] - movs r0, #0x10 - ands r0, r1 - cmp r0, #0 - bne _08089840 - movs r0, #0x2e - ldrsh r1, [r4, r0] - ldr r2, _08089844 @ =gRoomControls - movs r3, #0xa - ldrsh r0, [r2, r3] - subs r5, r1, r0 - adds r3, r5, #0 - subs r3, #0x78 - movs r6, #0x32 - ldrsh r1, [r4, r6] - movs r6, #0xc - ldrsh r0, [r2, r6] - subs r1, r1, r0 - adds r2, r1, #0 - subs r2, #0x50 - adds r0, r3, #0 - cmp r0, #0 - bge _08089802 - adds r0, r5, #0 - subs r0, #0x75 -_08089802: - asrs r3, r0, #2 - adds r0, r2, #0 - cmp r0, #0 - bge _0808980E - adds r0, r1, #0 - subs r0, #0x4d -_0808980E: - asrs r2, r0, #2 - movs r0, #0x10 - rsbs r0, r0, #0 - cmp r3, r0 - bge _0808981A - adds r3, r0, #0 -_0808981A: - cmp r3, #0x10 - ble _08089820 - movs r3, #0x10 -_08089820: - cmp r2, r0 - bge _08089826 - adds r2, r0, #0 -_08089826: - cmp r2, #0x10 - ble _0808982C - movs r2, #0x10 -_0808982C: - adds r0, r4, #0 - adds r0, #0x68 - ldrh r0, [r0] - adds r0, r0, r3 - strh r0, [r4, #0x2e] - adds r0, r4, #0 - adds r0, #0x6a - ldrh r0, [r0] - adds r0, r0, r2 - strh r0, [r4, #0x32] -_08089840: - pop {r4, r5, r6, pc} - .align 2, 0 -_08089844: .4byte gRoomControls diff --git a/linker.ld b/linker.ld index 8b88d7e5..2d19b8fe 100644 --- a/linker.ld +++ b/linker.ld @@ -660,7 +660,7 @@ SECTIONS { src/object/bigBarrel.o(.text); src/object/barrelInside.o(.text); src/object/pushableStatue.o(.text); - asm/object/object28.o(.text); + src/object/object28.o(.text); src/object/ambientClouds.o(.text); src/object/object2A.o(.text); src/object/object2B.o(.text); diff --git a/src/object/object28.c b/src/object/object28.c new file mode 100644 index 00000000..90c2be50 --- /dev/null +++ b/src/object/object28.c @@ -0,0 +1,62 @@ +#include "entity.h" +#include "room.h" + +void Object28(Entity* this) { + int iVar1; + int diffY; + int diffX; + int iVar4; + int temp; + + if (this->action == 0) { + this->action = 1; + this->spriteSettings.draw = 3; + this->frameIndex = this->type2; + this->spriteOrientation.flipY = 3; + this->spriteRendering.b3 = 3; + if (this->type == 3) { + this->spritePriority.b0 = 6; + } else { + this->spritePriority.b0 = 7; + } + this->field_0x68.HWORD = this->x.HALF.HI; + this->field_0x6a.HWORD = this->y.HALF.HI; + SetDefaultPriority(this, 6); + } + if ((this->flags & 0x10) == 0) { + iVar4 = (int)this->x.HALF.HI - (int)gRoomControls.scroll_x; + diffX = iVar4 - 0x78; + iVar1 = (int)this->y.HALF.HI - (int)gRoomControls.scroll_y; + diffY = iVar1 - 0x50; + if (diffX < 0) { + temp = (iVar4 - 0x75); + } else { + temp = diffX; + } + diffX = temp >> 2; + + if (diffY < 0) { + temp = iVar1 - 0x4d; + } else { + temp = diffY; + } + diffY = temp >> 2; + + if (diffX < -0x10) { + diffX = -0x10; + } + if (0x10 < diffX) { + diffX = 0x10; + } + + if (diffY < -0x10) { + diffY = -0x10; + } + if (0x10 < diffY) { + diffY = 0x10; + } + + this->x.HALF.HI = this->field_0x68.HWORD + diffX; + this->y.HALF.HI = this->field_0x6a.HWORD + diffY; + } +} From 01fc98d161c47163817151fc27d85d18fb63dc59 Mon Sep 17 00:00:00 2001 From: Tal Hayon Date: Sun, 13 Mar 2022 05:37:52 +0200 Subject: [PATCH 06/23] Decompile object37 --- asm/object/object37.s | 88 ------------------------------------ data/const/object/object37.s | 9 ---- linker.ld | 4 +- src/object/bigIceBlock.c | 3 +- src/object/object37.c | 51 +++++++++++++++++++++ src/object/object68.c | 3 +- src/object/smallIceBlock.c | 5 +- 7 files changed, 60 insertions(+), 103 deletions(-) delete mode 100644 asm/object/object37.s delete mode 100644 data/const/object/object37.s create mode 100644 src/object/object37.c diff --git a/asm/object/object37.s b/asm/object/object37.s deleted file mode 100644 index 40535c2b..00000000 --- a/asm/object/object37.s +++ /dev/null @@ -1,88 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start Object37 -Object37: @ 0x0808BDE8 - push {lr} - ldr r2, _0808BDFC @ =gUnk_08121480 - ldrb r1, [r0, #0xc] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_0808BDFC: .4byte gUnk_08121480 - - thumb_func_start sub_0808BE00 -sub_0808BE00: @ 0x0808BE00 - push {r4, r5, lr} - adds r5, r0, #0 - adds r0, #0x38 - ldrb r0, [r0] - bl GetLayerByIndex - adds r4, r0, #0 - adds r0, r5, #0 - bl sub_0806F798 - lsls r0, r0, #1 - adds r0, #4 - adds r4, r4, r0 - str r4, [r5, #0x78] - ldrh r1, [r4] - adds r0, r5, #0 - adds r0, #0x70 - strh r1, [r0] - movs r0, #1 - strb r0, [r5, #0xc] - pop {r4, r5, pc} - .align 2, 0 - - thumb_func_start sub_0808BE2C -sub_0808BE2C: @ 0x0808BE2C - push {r4, lr} - adds r2, r0, #0 - ldr r0, _0808BE78 @ =gSave - ldr r1, _0808BE7C @ =0x0000024E - adds r4, r0, r1 - ldrb r0, [r4] - cmp r0, #0 - beq _0808BE74 - adds r0, r2, #0 - adds r0, #0x70 - ldr r1, [r2, #0x78] - ldrh r0, [r0] - ldrh r1, [r1] - cmp r0, r1 - beq _0808BE74 - adds r0, r2, #0 - movs r1, #0x58 - movs r2, #0 - bl CreateGroundItem - adds r1, r0, #0 - cmp r1, #0 - beq _0808BE6C - ldr r0, _0808BE80 @ =gPlayerEntity - ldrb r0, [r0, #0x14] - lsls r0, r0, #2 - strb r0, [r1, #0x15] - movs r0, #0x80 - strh r0, [r1, #0x24] - movs r0, #0x80 - lsls r0, r0, #0xa - str r0, [r1, #0x20] -_0808BE6C: - movs r0, #1 - strb r0, [r4] - bl DeleteThisEntity -_0808BE74: - pop {r4, pc} - .align 2, 0 -_0808BE78: .4byte gSave -_0808BE7C: .4byte 0x0000024E -_0808BE80: .4byte gPlayerEntity diff --git a/data/const/object/object37.s b/data/const/object/object37.s deleted file mode 100644 index 1c6c757b..00000000 --- a/data/const/object/object37.s +++ /dev/null @@ -1,9 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - .align 2 - -gUnk_08121480:: @ 08121480 - .4byte sub_0808BE00 - .4byte sub_0808BE2C diff --git a/linker.ld b/linker.ld index 2d19b8fe..8aeb00a2 100644 --- a/linker.ld +++ b/linker.ld @@ -675,7 +675,7 @@ SECTIONS { src/object/warpPoint.o(.text); src/object/object35.o(.text); asm/object/object36.o(.text); - asm/object/object37.o(.text); + src/object/object37.o(.text); src/object/jarPortal.o(.text); src/object/bossDoor.o(.text); src/object/object3A.o(.text); @@ -1406,7 +1406,7 @@ SECTIONS { src/object/object35.o(.rodata); data/animations/object/object35.o(.rodata); data/const/object/object36.o(.rodata); - data/const/object/object37.o(.rodata); + src/object/object37.o(.rodata); data/const/object/jarPortal.o(.rodata); data/animations/object/jarPortal.o(.rodata); src/object/bossDoor.o(.rodata); diff --git a/src/object/bigIceBlock.c b/src/object/bigIceBlock.c index c7d7a2bd..09407bc4 100644 --- a/src/object/bigIceBlock.c +++ b/src/object/bigIceBlock.c @@ -10,6 +10,7 @@ #include "object.h" #include "functions.h" #include "hitbox.h" +#include "item.h" typedef struct { /*0x00*/ Entity base; @@ -91,7 +92,7 @@ void BigIceBlock_Action2(BigIceBlockEntity* this) { if (super->type != 2) { SetFlag(this->unk_86); } else { - CreateGroundItemWithFlags(super, 0x53, 0, this->unk_86); + CreateGroundItemWithFlags(super, ITEM_SMALL_KEY, 0, this->unk_86); } } super->action = 3; diff --git a/src/object/object37.c b/src/object/object37.c new file mode 100644 index 00000000..99eca229 --- /dev/null +++ b/src/object/object37.c @@ -0,0 +1,51 @@ +#define NENT_DEPRECATED +#include "entity.h" +#include "functions.h" +#include "save.h" +#include "item.h" + +typedef struct { + Entity base; + u8 filler[0x8]; + u16 unk70; + u8 filler2[0x6]; + u16* unk78; +} Object37Entity; + +extern u32 sub_0806F798(Entity*); + +void Object37_Init(Object37Entity*); +void Object37_Action1(Object37Entity*); + +void Object37(Entity* this) { + static void (*const actionFuncs[])(Object37Entity*) = { + Object37_Init, + Object37_Action1, + }; + + actionFuncs[this->action]((Object37Entity*)this); +} + +void Object37_Init(Object37Entity* this) { + u16* puVar1; + + puVar1 = GetLayerByIndex(super->collisionLayer)->mapData + sub_0806F798(super); + this->unk78 = puVar1; + this->unk70 = *puVar1; + super->action = 1; +} + +void Object37_Action1(Object37Entity* this) { + Entity* item; + + if ((gSave.unk24E[0] != 0) && (this->unk70 != *this->unk78)) { + item = CreateGroundItem(super, ITEM_RUPEE100, 0); + if (item != 0) { + item->direction = gPlayerEntity.animationState << 2; + item->speed = 0x80; + item->zVelocity = 0x20000; + } + gSave.unk24E[0] = 1; + DeleteThisEntity(); + } +} diff --git a/src/object/object68.c b/src/object/object68.c index e5265aa9..d26bb550 100644 --- a/src/object/object68.c +++ b/src/object/object68.c @@ -10,6 +10,7 @@ #include "global.h" #include "object.h" #include "functions.h" +#include "item.h" typedef struct { /*0x00*/ Entity base; @@ -66,7 +67,7 @@ void sub_08094774(Object68Entity* this) { } break; case 2: - child = CreateGroundItem(&gPlayerEntity, 0x60, 0); + child = CreateGroundItem(&gPlayerEntity, ITEM_FAIRY, 0); super->child = child; if (child != NULL) { child->actionDelay = 1; diff --git a/src/object/smallIceBlock.c b/src/object/smallIceBlock.c index 9e2cf781..3ffedb89 100644 --- a/src/object/smallIceBlock.c +++ b/src/object/smallIceBlock.c @@ -10,6 +10,7 @@ #include "object.h" #include "functions.h" #include "hitbox.h" +#include "item.h" typedef struct { /*0x00*/ Entity base; @@ -138,10 +139,10 @@ void SmallIceBlock_Action3(SmallIceBlockEntity* this) { } sub_0805EC9C(super, 0x100, gUnk_08123748[super->actionDelay >> 5], 0); if (super->type == 1) { - CreateGroundItemWithFlags(super, 0x53, 0, this->unk_86); + CreateGroundItemWithFlags(super, ITEM_SMALL_KEY, 0, this->unk_86); SoundReq(SFX_SECRET); } else if (super->type == 2) { - CreateGroundItemWithFlags(super, 0x52, 0, this->unk_86); + CreateGroundItemWithFlags(super, ITEM_BIG_KEY, 0, this->unk_86); SoundReq(SFX_SECRET); } super->action = 4; From 248578d7d218d89a22d53dd91817941eb301e018 Mon Sep 17 00:00:00 2001 From: Tal Hayon Date: Sun, 13 Mar 2022 06:23:12 +0200 Subject: [PATCH 07/23] Decompile object44 --- asm/object/object44.s | 215 ----------------------------------- data/const/object/object44.s | 9 -- linker.ld | 4 +- src/object/object44.c | 70 ++++++++++++ 4 files changed, 72 insertions(+), 226 deletions(-) delete mode 100644 asm/object/object44.s delete mode 100644 data/const/object/object44.s create mode 100644 src/object/object44.c diff --git a/asm/object/object44.s b/asm/object/object44.s deleted file mode 100644 index f97e9383..00000000 --- a/asm/object/object44.s +++ /dev/null @@ -1,215 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start Object44 -Object44: @ 0x0808E280 - push {lr} - ldr r2, _0808E294 @ =gUnk_08121B8C - ldrb r1, [r0, #0xc] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_0808E294: .4byte gUnk_08121B8C - - thumb_func_start sub_0808E298 -sub_0808E298: @ 0x0808E298 - push {r4, r5, r6, lr} - adds r4, r0, #0 - adds r0, #0x38 - movs r1, #2 - strb r1, [r0] - movs r0, #1 - strb r0, [r4, #0xc] - movs r5, #0 - movs r6, #0 - adds r0, r4, #0 - bl GetTileTypeByEntity - adds r1, r0, #0 - movs r0, #0xd1 - lsls r0, r0, #2 - cmp r1, r0 - beq _0808E2DA - cmp r1, r0 - bhi _0808E2C6 - subs r0, #1 - cmp r1, r0 - beq _0808E2D8 - b _0808E2E2 -_0808E2C6: - ldr r0, _0808E2D4 @ =0x00000345 - cmp r1, r0 - beq _0808E2DE - adds r0, #1 - cmp r1, r0 - beq _0808E2E6 - b _0808E2E2 - .align 2, 0 -_0808E2D4: .4byte 0x00000345 -_0808E2D8: - movs r5, #0x10 -_0808E2DA: - movs r6, #0x10 - b _0808E2E6 -_0808E2DE: - movs r5, #0x10 - b _0808E2E6 -_0808E2E2: - bl DeleteThisEntity -_0808E2E6: - ldrh r0, [r4, #0x2e] - adds r0, r0, r5 - movs r2, #0x10 - rsbs r2, r2, #0 - adds r1, r2, #0 - ands r0, r1 - strh r0, [r4, #0x2e] - ldrh r0, [r4, #0x32] - adds r0, r0, r6 - ands r0, r1 - strh r0, [r4, #0x32] - adds r0, r4, #0 - movs r1, #0 - bl InitializeAnimation - ldr r1, _0808E314 @ =0x00000347 - adds r0, r4, #0 - bl sub_0808E354 - adds r0, r4, #0 - bl sub_0808E318 - pop {r4, r5, r6, pc} - .align 2, 0 -_0808E314: .4byte 0x00000347 - - thumb_func_start sub_0808E318 -sub_0808E318: @ 0x0808E318 - push {r4, lr} - adds r4, r0, #0 - bl GetNextFrame - adds r0, r4, #0 - adds r0, #0x5a - ldrb r1, [r0] - movs r0, #0x80 - ands r0, r1 - cmp r0, #0 - beq _0808E340 - ldr r1, _0808E33C @ =0x00000343 - adds r0, r4, #0 - bl sub_0808E354 - bl DeleteThisEntity - b _0808E34E - .align 2, 0 -_0808E33C: .4byte 0x00000343 -_0808E340: - movs r0, #1 - ands r0, r1 - cmp r0, #0 - beq _0808E34E - ldr r0, _0808E350 @ =0x0000018B - bl EnqueueSFX -_0808E34E: - pop {r4, pc} - .align 2, 0 -_0808E350: .4byte 0x0000018B - - thumb_func_start sub_0808E354 -sub_0808E354: @ 0x0808E354 - push {r4, r5, r6, lr} - mov r6, r8 - push {r6} - adds r6, r0, #0 - lsls r1, r1, #0x10 - mov r8, r1 - mov r0, r8 - lsrs r0, r0, #0x10 - mov r8, r0 - movs r2, #0x2e - ldrsh r1, [r6, r2] - ldr r5, _0808E410 @ =gRoomControls - ldrh r0, [r5, #6] - adds r0, #0x10 - subs r1, r1, r0 - asrs r1, r1, #4 - movs r4, #0x3f - ands r1, r4 - movs r3, #0x32 - ldrsh r0, [r6, r3] - ldrh r2, [r5, #8] - adds r2, #0x10 - subs r0, r0, r2 - asrs r0, r0, #4 - ands r0, r4 - lsls r0, r0, #6 - orrs r1, r0 - mov r0, r8 - movs r2, #2 - bl sub_0807B7D8 - mov r0, r8 - adds r0, #1 - movs r2, #0x2e - ldrsh r1, [r6, r2] - ldrh r2, [r5, #6] - subs r1, r1, r2 - asrs r1, r1, #4 - ands r1, r4 - movs r3, #0x32 - ldrsh r2, [r6, r3] - ldrh r3, [r5, #8] - adds r3, #0x10 - subs r2, r2, r3 - asrs r2, r2, #4 - ands r2, r4 - lsls r2, r2, #6 - orrs r1, r2 - movs r2, #2 - bl sub_0807B7D8 - mov r0, r8 - adds r0, #2 - movs r2, #0x2e - ldrsh r1, [r6, r2] - ldrh r2, [r5, #6] - adds r2, #0x10 - subs r1, r1, r2 - asrs r1, r1, #4 - ands r1, r4 - movs r3, #0x32 - ldrsh r2, [r6, r3] - ldrh r3, [r5, #8] - subs r2, r2, r3 - asrs r2, r2, #4 - ands r2, r4 - lsls r2, r2, #6 - orrs r1, r2 - movs r2, #2 - bl sub_0807B7D8 - movs r0, #3 - add r8, r0 - movs r2, #0x2e - ldrsh r1, [r6, r2] - ldrh r0, [r5, #6] - subs r1, r1, r0 - asrs r1, r1, #4 - ands r1, r4 - movs r3, #0x32 - ldrsh r0, [r6, r3] - ldrh r2, [r5, #8] - subs r0, r0, r2 - asrs r0, r0, #4 - ands r0, r4 - lsls r0, r0, #6 - orrs r1, r0 - mov r0, r8 - movs r2, #2 - bl sub_0807B7D8 - pop {r3} - mov r8, r3 - pop {r4, r5, r6, pc} - .align 2, 0 -_0808E410: .4byte gRoomControls diff --git a/data/const/object/object44.s b/data/const/object/object44.s deleted file mode 100644 index ca4c690e..00000000 --- a/data/const/object/object44.s +++ /dev/null @@ -1,9 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - .align 2 - -gUnk_08121B8C:: @ 08121B8C - .4byte sub_0808E298 - .4byte sub_0808E318 diff --git a/linker.ld b/linker.ld index 8aeb00a2..8fb6600e 100644 --- a/linker.ld +++ b/linker.ld @@ -691,7 +691,7 @@ SECTIONS { src/object/ladderUp.o(.text); src/object/object42.o(.text); src/object/object43.o(.text); - asm/object/object44.o(.text); + src/object/object44.o(.text); asm/object/object45.o(.text); src/object/giantBookLadder.o(.text); src/object/heartContainer.o(.text); @@ -1423,7 +1423,7 @@ SECTIONS { src/object/object42.o(.rodata); src/object/object43.o(.rodata); data/animations/object/object43.o(.rodata); - data/const/object/object44.o(.rodata); + src/object/object44.o(.rodata); data/animations/object/object44.o(.rodata); data/const/object/object45.o(.rodata); data/animations/object/object45.o(.rodata); diff --git a/src/object/object44.c b/src/object/object44.c new file mode 100644 index 00000000..0753c7f4 --- /dev/null +++ b/src/object/object44.c @@ -0,0 +1,70 @@ +#define NENT_DEPRECATED +#include "entity.h" +#include "asm.h" +#include "sound.h" +#include "room.h" +#include "functions.h" + +void sub_0808E298(Entity*); +void sub_0808E318(Entity*); +void sub_0808E354(Entity*, u32); + +void Object44(Entity* this) { + static void (*const actionFuncs[])(Entity*) = { + sub_0808E298, + sub_0808E318, + }; + + actionFuncs[this->action]((Entity*)this); +} + +void sub_0808E298(Entity* this) { + int x; + int y; + + this->collisionLayer = 2; + this->action = 1; + x = 0; + y = 0; + switch (GetTileTypeByEntity(this)) { + case 0x343: + x = 0x10; + case 0x344: + y = 0x10; + break; + case 0x345: + x = 0x10; + break; + case 0x346: + break; + default: + DeleteThisEntity(); + break; + } + + this->x.HALF.HI = (this->x.HALF.HI + x) & 0xfff0; + this->y.HALF.HI = (this->y.HALF.HI + y) & 0xfff0; + InitializeAnimation(this, 0); + sub_0808E354(this, 0x347); + sub_0808E318(this); +} + +void sub_0808E318(Entity* this) { + GetNextFrame(this); + if (this->frame & 0x80) { + sub_0808E354(this, 0x343); + DeleteThisEntity(); + } else { + if (this->frame & 1) { + EnqueueSFX(SFX_18B); + } + } +} + +void sub_0808E354(Entity* this, u32 param_2) { + u16 uVar1 = param_2; + sub_0807B7D8(uVar1, COORD_TO_TILE_OFFSET(this, 0x10, 0x10), 2); + sub_0807B7D8(uVar1 + 1, COORD_TO_TILE_OFFSET(this, 0, 0x10), 2); + sub_0807B7D8(uVar1 + 2, COORD_TO_TILE_OFFSET(this, 0x10, 0), 2); + sub_0807B7D8(uVar1 + 3, COORD_TO_TILE_OFFSET(this, 0, 0), 2); +} From 8986c417cf1f59fd165414153df6b9f4012a7685 Mon Sep 17 00:00:00 2001 From: Tal Hayon Date: Sun, 13 Mar 2022 09:52:51 +0200 Subject: [PATCH 08/23] Decompile object45 --- asm/object/object45.s | 89 ------------------------------------ data/const/object/object45.s | 9 ---- linker.ld | 4 +- src/object/object45.c | 44 ++++++++++++++++++ 4 files changed, 46 insertions(+), 100 deletions(-) delete mode 100644 asm/object/object45.s delete mode 100644 data/const/object/object45.s create mode 100644 src/object/object45.c diff --git a/asm/object/object45.s b/asm/object/object45.s deleted file mode 100644 index 4b1d866a..00000000 --- a/asm/object/object45.s +++ /dev/null @@ -1,89 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start Object45 -Object45: @ 0x0808E414 - push {lr} - ldr r2, _0808E428 @ =gUnk_08121BD8 - ldrb r1, [r0, #0xc] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_0808E428: .4byte gUnk_08121BD8 - - thumb_func_start sub_0808E42C -sub_0808E42C: @ 0x0808E42C - push {lr} - movs r1, #1 - strb r1, [r0, #0xc] - ldrb r2, [r0, #0x11] - subs r1, #0x11 - ands r1, r2 - movs r2, #6 - orrs r1, r2 - strb r1, [r0, #0x11] - ldrb r1, [r0, #0xa] - bl InitializeAnimation - pop {pc} - .align 2, 0 - - thumb_func_start sub_0808E448 -sub_0808E448: @ 0x0808E448 - push {r4, lr} - adds r4, r0, #0 - movs r0, #0x10 - bl IsItemEquipped - cmp r0, #1 - bls _0808E45A - bl DeleteThisEntity -_0808E45A: - adds r0, r4, #0 - bl GetNextFrame - adds r0, r4, #0 - adds r0, #0x5a - ldrb r0, [r0] - cmp r0, #1 - beq _0808E472 - cmp r0, #0x80 - bne _0808E486 - bl DeleteThisEntity -_0808E472: - ldrb r2, [r4, #0x18] - lsls r1, r2, #0x1e - lsrs r1, r1, #0x1e - movs r0, #1 - eors r1, r0 - subs r0, #5 - ands r0, r2 - orrs r0, r1 - strb r0, [r4, #0x18] - b _0808E494 -_0808E486: - ldrb r0, [r4, #0x18] - movs r1, #4 - rsbs r1, r1, #0 - ands r1, r0 - movs r0, #1 - orrs r1, r0 - strb r1, [r4, #0x18] -_0808E494: - ldrb r0, [r4, #0xa] - cmp r0, #0 - bne _0808E4A2 - ldr r0, [r4, #0x34] - ldr r1, _0808E4A4 @ =0xFFFF8000 - adds r0, r0, r1 - str r0, [r4, #0x34] -_0808E4A2: - pop {r4, pc} - .align 2, 0 -_0808E4A4: .4byte 0xFFFF8000 diff --git a/data/const/object/object45.s b/data/const/object/object45.s deleted file mode 100644 index 3d3acfcb..00000000 --- a/data/const/object/object45.s +++ /dev/null @@ -1,9 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - .align 2 - -gUnk_08121BD8:: @ 08121BD8 - .4byte sub_0808E42C - .4byte sub_0808E448 diff --git a/linker.ld b/linker.ld index 8fb6600e..9fc7b40d 100644 --- a/linker.ld +++ b/linker.ld @@ -692,7 +692,7 @@ SECTIONS { src/object/object42.o(.text); src/object/object43.o(.text); src/object/object44.o(.text); - asm/object/object45.o(.text); + src/object/object45.o(.text); src/object/giantBookLadder.o(.text); src/object/heartContainer.o(.text); src/object/fileScreenObjects.o(.text); @@ -1425,7 +1425,7 @@ SECTIONS { data/animations/object/object43.o(.rodata); src/object/object44.o(.rodata); data/animations/object/object44.o(.rodata); - data/const/object/object45.o(.rodata); + src/object/object45.o(.rodata); data/animations/object/object45.o(.rodata); src/object/giantBookLadder.o(.rodata); src/object/heartContainer.o(.rodata); diff --git a/src/object/object45.c b/src/object/object45.c new file mode 100644 index 00000000..1de0e0f1 --- /dev/null +++ b/src/object/object45.c @@ -0,0 +1,44 @@ +#define NENT_DEPRECATED +#include "entity.h" +#include "player.h" +#include "item.h" + +void sub_0808E42C(Entity*); +void sub_0808E448(Entity*); + +void Object45(Entity* this) { + static void (*const actionFuncs[])(Entity*) = { + sub_0808E42C, + sub_0808E448, + }; + + actionFuncs[this->action]((Entity*)this); +} + +void sub_0808E42C(Entity* this) { + this->action = 1; + this->updatePriority = 6; + InitializeAnimation(this, this->type); +} + +void sub_0808E448(Entity* this) { + if (1 < IsItemEquipped(ITEM_LANTERN_ON)) { + DeleteThisEntity(); + } + GetNextFrame(this); + + switch (this->frame) { + case 0x80: + DeleteThisEntity(); + case 1: + this->spriteSettings.draw ^= 1; + break; + default: + this->spriteSettings.draw = 1; + break; + } + + if (this->type == 0) { + this->z.WORD -= 0x8000; + } +} From 875049f3ce331ad39d4cb7749d4e09744d2060a3 Mon Sep 17 00:00:00 2001 From: Tal Hayon Date: Sun, 13 Mar 2022 11:04:57 +0200 Subject: [PATCH 09/23] Decompile object52 --- asm/object/object52.s | 60 ------------------------------------------- linker.ld | 2 +- src/object/object52.c | 22 ++++++++++++++++ 3 files changed, 23 insertions(+), 61 deletions(-) delete mode 100644 asm/object/object52.s create mode 100644 src/object/object52.c diff --git a/asm/object/object52.s b/asm/object/object52.s deleted file mode 100644 index cf96ecb2..00000000 --- a/asm/object/object52.s +++ /dev/null @@ -1,60 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start Object52 -Object52: @ 0x080910A0 - push {r4, r5, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xc] - cmp r0, #0 - bne _080910C8 - ldrb r0, [r4, #0xa] - bl CheckLocalFlag - cmp r0, #0 - beq _080910B8 - bl DeleteThisEntity -_080910B8: - movs r1, #1 - strb r1, [r4, #0xc] - adds r0, r4, #0 - adds r0, #0x38 - strb r1, [r0] - adds r0, r4, #0 - bl sub_08078828 -_080910C8: - adds r0, r4, #0 - adds r0, #0x39 - ldrb r0, [r0] - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - cmp r0, #0 - beq _08091100 - movs r1, #0x2e - ldrsh r0, [r4, r1] - ldr r2, _08091104 @ =gRoomControls - ldrh r1, [r2, #6] - subs r0, r0, r1 - asrs r0, r0, #4 - movs r3, #0x3f - ands r0, r3 - movs r5, #0x32 - ldrsh r1, [r4, r5] - ldrh r2, [r2, #8] - subs r1, r1, r2 - asrs r1, r1, #4 - ands r1, r3 - lsls r1, r1, #6 - orrs r0, r1 - movs r1, #2 - bl sub_080A7C8C - bl DeleteThisEntity -_08091100: - pop {r4, r5, pc} - .align 2, 0 -_08091104: .4byte gRoomControls diff --git a/linker.ld b/linker.ld index 9fc7b40d..95b13c7f 100644 --- a/linker.ld +++ b/linker.ld @@ -705,7 +705,7 @@ SECTIONS { src/object/archway.o(.text); src/object/giantRock.o(.text); src/object/giantRock2.o(.text); - asm/object/object52.o(.text); + src/object/object52.o(.text); asm/object/object53.o(.text); src/object/pullableLever.o(.text); src/object/minecart.o(.text); diff --git a/src/object/object52.c b/src/object/object52.c new file mode 100644 index 00000000..d5905484 --- /dev/null +++ b/src/object/object52.c @@ -0,0 +1,22 @@ +#define NENT_DEPRECATED +#include "entity.h" +#include "flags.h" +#include "room.h" + +extern void sub_08078828(Entity*); +extern void sub_080A7C8C(u32 pos, u32 layer); + +void Object52(Entity* this) { + if (this->action == 0) { + if (CheckLocalFlag(this->type)) { + DeleteThisEntity(); + } + this->action = 1; + this->collisionLayer = 1; + sub_08078828(this); + } + if (this->interactType != 0) { + sub_080A7C8C(COORD_TO_TILE(this), 2); + DeleteThisEntity(); + } +} From c70e86a8d8acad99c1294ce6179a1b49fb1b7435 Mon Sep 17 00:00:00 2001 From: Tal Hayon Date: Sun, 13 Mar 2022 11:39:30 +0200 Subject: [PATCH 10/23] Decompile object53 --- asm/object/object53.s | 128 ----------------------------------- assets/assets.json | 5 -- data/const/object/object53.s | 12 ---- linker.ld | 4 +- src/object/object53.c | 64 ++++++++++++++++++ 5 files changed, 66 insertions(+), 147 deletions(-) delete mode 100644 asm/object/object53.s delete mode 100644 data/const/object/object53.s create mode 100644 src/object/object53.c diff --git a/asm/object/object53.s b/asm/object/object53.s deleted file mode 100644 index cb6da18f..00000000 --- a/asm/object/object53.s +++ /dev/null @@ -1,128 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start Object53 -Object53: @ 0x08091108 - push {lr} - ldr r2, _0809111C @ =gUnk_08122280 - ldrb r1, [r0, #0xc] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_0809111C: .4byte gUnk_08122280 - - thumb_func_start sub_08091120 -sub_08091120: @ 0x08091120 - push {r4, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xc] - adds r0, #1 - strb r0, [r4, #0xc] - ldr r3, _08091194 @ =gUnk_08122288 - ldrb r0, [r4, #0xa] - lsls r0, r0, #2 - adds r0, r0, r3 - ldrb r1, [r0, #2] - adds r0, r4, #0 - adds r0, #0x60 - strh r1, [r0] - ldrb r0, [r4, #0xa] - lsls r0, r0, #2 - adds r0, r0, r3 - ldrb r1, [r0, #1] - movs r0, #0xf - ands r1, r0 - ldrb r2, [r4, #0x1a] - movs r0, #0x10 - rsbs r0, r0, #0 - ands r0, r2 - orrs r0, r1 - strb r0, [r4, #0x1a] - ldrb r0, [r4, #0xa] - lsls r0, r0, #2 - adds r0, r0, r3 - ldrb r0, [r0, #3] - strh r0, [r4, #0x12] - ldrb r1, [r4, #0x18] - movs r0, #4 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #1 - orrs r0, r1 - strb r0, [r4, #0x18] - ldrb r1, [r4, #0x19] - movs r0, #0x3f - ands r0, r1 - movs r1, #0x80 - orrs r0, r1 - strb r0, [r4, #0x19] - movs r0, #0xa8 - lsls r0, r0, #0xa - str r0, [r4, #0x20] - ldrb r0, [r4, #0xa] - lsls r0, r0, #2 - adds r0, r0, r3 - ldrb r1, [r0] - adds r0, r4, #0 - bl InitializeAnimation - adds r0, r4, #0 - bl sub_08004168 - pop {r4, pc} - .align 2, 0 -_08091194: .4byte gUnk_08122288 - - thumb_func_start sub_08091198 -sub_08091198: @ 0x08091198 - push {r4, lr} - adds r4, r0, #0 - ldr r0, [r4, #0x20] - cmp r0, #0 - bge _080911AA - ldrb r0, [r4, #0x18] - movs r1, #0x80 - orrs r0, r1 - strb r0, [r4, #0x18] -_080911AA: - movs r1, #0x80 - lsls r1, r1, #6 - adds r0, r4, #0 - bl GravityUpdate - cmp r0, #0 - bne _080911E8 - ldrb r1, [r4, #0xb] - cmp r1, #0xf - beq _080911CE - cmp r1, #0xf - bgt _080911C8 - cmp r1, #0 - beq _080911E4 - b _080911DA -_080911C8: - cmp r1, #0xff - bne _080911DA - b _080911E4 -_080911CE: - ldrb r1, [r4, #0xe] - adds r0, r4, #0 - movs r2, #0x80 - bl CreateFx - b _080911E4 -_080911DA: - ldrb r2, [r4, #0xe] - adds r0, r4, #0 - movs r3, #0 - bl CreateObjectWithParent -_080911E4: - bl DeleteThisEntity -_080911E8: - pop {r4, pc} - .align 2, 0 diff --git a/assets/assets.json b/assets/assets.json index c376afe1..1d7802ad 100644 --- a/assets/assets.json +++ b/assets/assets.json @@ -43547,11 +43547,6 @@ "start": 1188444, "size": 8 }, - { - "path": "object53/gUnk_08122288.bin", - "start": 1188488, - "size": 12 - }, { "path": "animations/gSpriteAnimations_PullableLever_0.bin", "start": 1188548, diff --git a/data/const/object/object53.s b/data/const/object/object53.s deleted file mode 100644 index b9fb52e7..00000000 --- a/data/const/object/object53.s +++ /dev/null @@ -1,12 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - .align 2 - -gUnk_08122280:: @ 08122280 - .4byte sub_08091120 - .4byte sub_08091198 - -gUnk_08122288:: @ 08122288 - .incbin "object53/gUnk_08122288.bin" diff --git a/linker.ld b/linker.ld index 95b13c7f..a92d765b 100644 --- a/linker.ld +++ b/linker.ld @@ -706,7 +706,7 @@ SECTIONS { src/object/giantRock.o(.text); src/object/giantRock2.o(.text); src/object/object52.o(.text); - asm/object/object53.o(.text); + src/object/object53.o(.text); src/object/pullableLever.o(.text); src/object/minecart.o(.text); asm/object/minecart.o(.text); @@ -1442,7 +1442,7 @@ SECTIONS { data/const/object/minishSizedEntrance.o(.rodata); data/animations/object/minishSizedEntrance.o(.rodata); src/object/giantRock2.o(.rodata); - data/const/object/object53.o(.rodata); + src/object/object53.o(.rodata); src/object/pullableLever.o(.rodata); data/animations/object/pullableLever.o(.rodata); data/const/object/minecart.o(.rodata); diff --git a/src/object/object53.c b/src/object/object53.c new file mode 100644 index 00000000..0e10371e --- /dev/null +++ b/src/object/object53.c @@ -0,0 +1,64 @@ +#define NENT_DEPRECATED +#include "entity.h" +#include "functions.h" +#include "asm.h" + +void sub_08091120(Entity*); +void sub_08091198(Entity*); + +void Object53(Entity* this) { + static void (*const actionFuncs[])(Entity*) = { + sub_08091120, + sub_08091198, + }; + + actionFuncs[this->action]((Entity*)this); +} + +typedef struct { + u8 animationState; + u8 palette; + u8 spriteVramOffset; + u8 spriteIndex; +} gUnk_08122288_struct; + +void sub_08091120(Entity* this) { + static const gUnk_08122288_struct gUnk_08122288[] = { { 0x0, 0x2, 0xe8, 0xa7 }, + { 0x0, 0x5, 0xe0, 0xa7 }, + { 0x0, 0x5, 0xf2, 0xa7 } }; + u32 temp; + this->action++; + this->spriteVramOffset = gUnk_08122288[this->type].spriteVramOffset; + temp = gUnk_08122288[this->type].palette; + this->palette.b.b0 = temp; + this->spriteIndex = gUnk_08122288[this->type].spriteIndex; + this->spriteSettings.draw = 1; + this->spriteRendering.b3 = 2; + this->zVelocity = 0x2a000; + InitializeAnimation(this, gUnk_08122288[this->type].animationState); + sub_08004168(this); +} + +void sub_08091198(Entity* this) { + if (this->zVelocity < 0) { + this->spriteSettings.flipY = 1; + } + + if (GravityUpdate(this, 0x2000)) { + return; + } + + switch ((u8)this->type2) { + case 0: + case 0xff: + break; + case 0xf: + CreateFx(this, this->actionDelay, 0x80); + break; + default: + CreateObjectWithParent(this, this->type2, this->actionDelay, 0); + break; + } + + DeleteThisEntity(); +} From 2446053493563105fb27d01c16862fb8636376a2 Mon Sep 17 00:00:00 2001 From: Tal Hayon Date: Sun, 13 Mar 2022 11:53:19 +0200 Subject: [PATCH 11/23] Decompile object63 --- asm/object/object63.s | 112 ----------------------------------- data/const/object/object63.s | 10 ---- linker.ld | 4 +- src/object/object63.c | 65 ++++++++++++++++++++ 4 files changed, 67 insertions(+), 124 deletions(-) delete mode 100644 asm/object/object63.s delete mode 100644 data/const/object/object63.s create mode 100644 src/object/object63.c diff --git a/asm/object/object63.s b/asm/object/object63.s deleted file mode 100644 index 76bf8b49..00000000 --- a/asm/object/object63.s +++ /dev/null @@ -1,112 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start Object63 -Object63: @ 0x08093D70 - push {lr} - ldr r2, _08093D84 @ =gUnk_08122944 - ldrb r1, [r0, #0xc] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_08093D84: .4byte gUnk_08122944 - - thumb_func_start sub_08093D88 -sub_08093D88: @ 0x08093D88 - push {r4, lr} - adds r4, r0, #0 - movs r0, #1 - strb r0, [r4, #0xc] - ldrh r0, [r4, #0x36] - subs r0, #8 - strh r0, [r4, #0x36] - movs r0, #0xa8 - lsls r0, r0, #0xa - str r0, [r4, #0x20] - movs r0, #0x20 - strb r0, [r4, #0xe] - ldrb r0, [r4, #0xa] - cmp r0, #0 - beq _08093DAC - cmp r0, #1 - beq _08093DC4 - b _08093DDE -_08093DAC: - adds r0, r4, #0 - movs r1, #4 - bl CreateRandomItemDrop - cmp r0, #0 - bne _08093DBC - movs r0, #2 - strb r0, [r4, #0xc] -_08093DBC: - ldr r1, [r4, #0x54] - ldr r0, [r4, #0x20] - str r0, [r1, #0x20] - b _08093DDE -_08093DC4: - movs r0, #0 - movs r1, #0x5f - movs r2, #0 - bl CreateObject - adds r1, r0, #0 - cmp r1, #0 - beq _08093DDE - movs r0, #5 - strb r0, [r1, #0xe] - adds r0, r4, #0 - bl sub_08093E10 -_08093DDE: - pop {r4, pc} - - thumb_func_start sub_08093DE0 -sub_08093DE0: @ 0x08093DE0 - push {lr} - adds r2, r0, #0 - ldrb r0, [r2, #0xe] - subs r0, #1 - strb r0, [r2, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _08093DF4 - movs r0, #2 - strb r0, [r2, #0xc] -_08093DF4: - ldrb r1, [r2, #0xe] - movs r0, #1 - ands r0, r1 - cmp r0, #0 - beq _08093E06 - ldr r1, [r2, #0x54] - ldrh r0, [r1, #0x32] - adds r0, #1 - strh r0, [r1, #0x32] -_08093E06: - pop {pc} - - thumb_func_start sub_08093E08 -sub_08093E08: @ 0x08093E08 - push {lr} - bl DeleteEntity - pop {pc} - - thumb_func_start sub_08093E10 -sub_08093E10: @ 0x08093E10 - push {r4, r5, lr} - adds r4, r0, #0 - adds r5, r1, #0 - bl CopyPosition - str r4, [r5, #0x50] - str r5, [r4, #0x54] - ldr r0, [r4, #0x20] - str r0, [r5, #0x20] - pop {r4, r5, pc} diff --git a/data/const/object/object63.s b/data/const/object/object63.s deleted file mode 100644 index 0727682c..00000000 --- a/data/const/object/object63.s +++ /dev/null @@ -1,10 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - .align 2 - -gUnk_08122944:: @ 08122944 - .4byte sub_08093D88 - .4byte sub_08093DE0 - .4byte sub_08093E08 diff --git a/linker.ld b/linker.ld index a92d765b..58e09d13 100644 --- a/linker.ld +++ b/linker.ld @@ -723,7 +723,7 @@ SECTIONS { src/object/swordsmanNewsletter.o(.text); src/object/object61.o(.text); src/object/giantTwig.o(.text); - asm/object/object63.o(.text); + src/object/object63.o(.text); src/object/object64.o(.text); src/object/ladderHoleInBookshelf.o(.text); asm/object/object66.o(.text); @@ -1464,7 +1464,7 @@ SECTIONS { data/const/object/swordsmanNewsletter.o(.rodata); src/object/object61.o(.rodata); src/object/giantTwig.o(.rodata); - data/const/object/object63.o(.rodata); + src/object/object63.o(.rodata); src/object/object64.o(.rodata); data/animations/object/object64.o(.rodata); src/object/ladderHoleInBookshelf.o(.rodata); diff --git a/src/object/object63.c b/src/object/object63.c new file mode 100644 index 00000000..5cdd827e --- /dev/null +++ b/src/object/object63.c @@ -0,0 +1,65 @@ +#define NENT_DEPRECATED +#include "entity.h" +#include "functions.h" +#include "asm.h" +#include "object.h" + +void sub_08093D88(Entity*); +void sub_08093DE0(Entity*); +void Object63_Delete(Entity*); +void sub_08093E10(Entity*, Entity*); + +void Object63(Entity* this) { + static void (*const actionFuncs[])(Entity*) = { + sub_08093D88, + sub_08093DE0, + Object63_Delete, + }; + + actionFuncs[this->action]((Entity*)this); +} + +void sub_08093D88(Entity* this) { + Entity* objEnt; + + this->action = 1; + this->z.HALF.HI -= 8; + this->zVelocity = 0x2a000; + this->actionDelay = 32; + switch (this->type) { + case 0: + if (CreateRandomItemDrop(this, 4) == 0) { + this->action = 2; + } + this->child->zVelocity = this->zVelocity; + break; + case 1: + objEnt = CreateObject(0, OBJECT_BLOCKING_STAIRS, 0); + if (objEnt != NULL) { + objEnt->actionDelay = 5; + sub_08093E10(this, objEnt); + } + break; + } +} + +void sub_08093DE0(Entity* this) { + if (--this->actionDelay == 0) { + this->action = 2; + } + + if ((this->actionDelay & 1) != 0) { + this->child->y.HALF.HI++; + } +} + +void Object63_Delete(Entity* this) { + DeleteEntity(this); +} + +void sub_08093E10(Entity* this, Entity* ent) { + CopyPosition(this, ent); + ent->parent = this; + this->child = ent; + ent->zVelocity = this->zVelocity; +} From be2ea6c846380dd6dffd4f69a15795c04af8d00a Mon Sep 17 00:00:00 2001 From: Tal Hayon Date: Sun, 13 Mar 2022 12:03:11 +0200 Subject: [PATCH 12/23] Decompile object66 --- asm/object/object66.s | 99 ------------------------------------------- linker.ld | 2 +- src/object/object66.c | 34 +++++++++++++++ 3 files changed, 35 insertions(+), 100 deletions(-) delete mode 100644 asm/object/object66.s create mode 100644 src/object/object66.c diff --git a/asm/object/object66.s b/asm/object/object66.s deleted file mode 100644 index 733fb640..00000000 --- a/asm/object/object66.s +++ /dev/null @@ -1,99 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start Object66 -Object66: @ 0x08094084 - push {r4, r5, lr} - adds r4, r0, #0 - ldr r5, [r4, #0x50] - movs r1, #0x36 - ldrsh r0, [r5, r1] - cmp r0, #0 - beq _0809412A - ldrb r0, [r4, #0xc] - cmp r0, #0 - bne _080940CA - 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] - adds r2, r4, #0 - adds r2, #0x29 - ldrb r1, [r2] - movs r0, #8 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #6 - orrs r0, r1 - strb r0, [r2] - adds r1, r4, #0 - adds r1, #0x63 - movs r0, #5 - strb r0, [r1] - adds r0, r4, #0 - movs r1, #1 - bl InitializeAnimation -_080940CA: - ldrh r0, [r5, #0x2e] - strh r0, [r4, #0x2e] - ldrh r0, [r5, #0x32] - strh r0, [r4, #0x32] - ldrb r2, [r5, #0x1b] - lsrs r2, r2, #6 - lsls r2, r2, #6 - ldrb r3, [r4, #0x1b] - movs r1, #0x3f - adds r0, r1, #0 - ands r0, r3 - orrs r0, r2 - strb r0, [r4, #0x1b] - ldrb r0, [r5, #0x19] - lsrs r0, r0, #6 - lsls r0, r0, #6 - ldrb r2, [r4, #0x19] - ands r1, r2 - orrs r1, r0 - strb r1, [r4, #0x19] - movs r0, #0x36 - ldrsh r1, [r5, r0] - movs r0, #0x40 - rsbs r0, r0, #0 - cmp r1, r0 - ble _08094108 - movs r3, #0x80 - lsls r3, r3, #1 - movs r2, #0x80 - lsls r2, r2, #2 - b _0809411E -_08094108: - movs r1, #0x36 - ldrsh r0, [r5, r1] - adds r0, #0x40 - lsls r2, r0, #1 - movs r1, #0x80 - lsls r1, r1, #1 - subs r3, r1, r2 - lsls r0, r0, #2 - movs r1, #0x80 - lsls r1, r1, #2 - subs r2, r1, r0 -_0809411E: - adds r0, r4, #0 - adds r1, r3, #0 - movs r3, #0 - bl sub_0805EC9C - b _0809412E -_0809412A: - bl DeleteThisEntity -_0809412E: - pop {r4, r5, pc} diff --git a/linker.ld b/linker.ld index 58e09d13..4262547d 100644 --- a/linker.ld +++ b/linker.ld @@ -726,7 +726,7 @@ SECTIONS { src/object/object63.o(.text); src/object/object64.o(.text); src/object/ladderHoleInBookshelf.o(.text); - asm/object/object66.o(.text); + src/object/object66.o(.text); asm/object/object67.o(.text); src/object/object68.o(.text); src/object/object69.o(.text); diff --git a/src/object/object66.c b/src/object/object66.c new file mode 100644 index 00000000..02f31e6c --- /dev/null +++ b/src/object/object66.c @@ -0,0 +1,34 @@ +#define NENT_DEPRECATED +#include "entity.h" +#include "functions.h" + +void Object66(Entity* this) { + int iVar2; + int iVar4; + Entity* parent; + + parent = this->parent; + if (parent->z.HALF.HI != 0) { + if (this->action == 0) { + this->action = 1; + this->spriteSettings.draw = 1; + this->spritePriority.b0 = 6; + this->spriteOffsetY = 5; + InitializeAnimation(this, 1); + } + this->x.HALF.HI = parent->x.HALF.HI; + this->y.HALF.HI = parent->y.HALF.HI; + this->spriteOrientation.flipY = parent->spriteOrientation.flipY; + this->spriteRendering.b3 = parent->spriteRendering.b3; + if (parent->z.HALF.HI > -0x40) { + iVar2 = 0x100; + iVar4 = 0x200; + } else { + iVar2 = 0x100 - 2 * (parent->z.HALF.HI + 0x40); + iVar4 = 0x200 - 4 * (parent->z.HALF.HI + 0x40); + } + sub_0805EC9C(this, iVar2, iVar4, 0); + } else { + DeleteThisEntity(); + } +} From 5bb51e00476673f8fd1e816a334a1f9b8aa81d45 Mon Sep 17 00:00:00 2001 From: Tal Hayon Date: Mon, 14 Mar 2022 00:59:36 +0200 Subject: [PATCH 13/23] Decompile object67 --- asm/object/object67.s | 828 ----------------------------------- assets/assets.json | 10 - data/const/object/object67.s | 18 - linker.ld | 4 +- src/object/object67.c | 338 ++++++++++++++ 5 files changed, 340 insertions(+), 858 deletions(-) delete mode 100644 asm/object/object67.s delete mode 100644 data/const/object/object67.s create mode 100644 src/object/object67.c diff --git a/asm/object/object67.s b/asm/object/object67.s deleted file mode 100644 index 70e92552..00000000 --- a/asm/object/object67.s +++ /dev/null @@ -1,828 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start Object67 -Object67: @ 0x08094130 - push {lr} - ldr r2, _08094144 @ =gUnk_081229BC - ldrb r1, [r0, #0xc] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_08094144: .4byte gUnk_081229BC - - thumb_func_start sub_08094148 -sub_08094148: @ 0x08094148 - push {r4, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xa] - cmp r0, #1 - bne _08094154 - b _08094254 -_08094154: - cmp r0, #1 - bgt _0809415E - cmp r0, #0 - beq _080941A8 - b _0809438A -_0809415E: - cmp r0, #2 - beq _08094164 - b _0809438A -_08094164: - ldrb r0, [r4, #0xd] - cmp r0, #0 - bne _08094180 - movs r0, #1 - strb r0, [r4, #0xd] - movs r0, #0xb4 - lsls r0, r0, #1 - str r0, [r4, #0x78] - ldr r0, _0809417C @ =gRoomControls - str r4, [r0, #0x30] - b _08094198 - .align 2, 0 -_0809417C: .4byte gRoomControls -_08094180: - ldr r0, [r4, #0x78] - subs r0, #1 - str r0, [r4, #0x78] - movs r1, #1 - rsbs r1, r1, #0 - cmp r0, r1 - bne _08094198 - ldr r1, _080941A0 @ =gRoomControls - ldr r0, _080941A4 @ =gPlayerEntity - str r0, [r1, #0x30] - bl DeleteThisEntity -_08094198: - bl sub_08078B48 - b _08094394 - .align 2, 0 -_080941A0: .4byte gRoomControls -_080941A4: .4byte gPlayerEntity -_080941A8: - ldr r1, _08094228 @ =gUnk_081229D0 - ldrb r0, [r4, #0xb] - lsls r0, r0, #2 - adds r0, r0, r1 - ldrb r0, [r0, #1] - strb r0, [r4, #0x15] - ldrb r0, [r4, #0xb] - lsls r0, r0, #2 - adds r0, r0, r1 - ldrb r0, [r0, #2] - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - ldrh r2, [r4, #0x2e] - adds r0, r0, r2 - strh r0, [r4, #0x2e] - ldrb r0, [r4, #0xb] - lsls r0, r0, #2 - adds r0, r0, r1 - ldrb r0, [r0, #3] - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - ldrh r2, [r4, #0x32] - adds r0, r0, r2 - strh r0, [r4, #0x32] - ldrb r0, [r4, #0xb] - lsls r0, r0, #2 - adds r0, r0, r1 - ldrb r2, [r0] - movs r0, #0x40 - ands r0, r2 - cmp r0, #0 - beq _080941F0 - ldrb r0, [r4, #0x18] - movs r1, #0x40 - orrs r0, r1 - strb r0, [r4, #0x18] -_080941F0: - movs r0, #0x80 - ands r0, r2 - cmp r0, #0 - beq _08094200 - ldrb r0, [r4, #0x18] - movs r1, #0x80 - orrs r0, r1 - strb r0, [r4, #0x18] -_08094200: - ldrb r0, [r4, #0xb] - cmp r0, #3 - bhi _08094230 - bl Random - ldr r1, _0809422C @ =0x0001FFFF - ands r1, r0 - movs r0, #0xa0 - lsls r0, r0, #0xa - orrs r0, r1 - str r0, [r4, #0x20] - movs r0, #0x80 - lsls r0, r0, #1 - strh r0, [r4, #0x24] - adds r0, r4, #0 - movs r1, #0x56 - bl InitializeAnimation - b _0809438A - .align 2, 0 -_08094228: .4byte gUnk_081229D0 -_0809422C: .4byte 0x0001FFFF -_08094230: - movs r0, #0xa0 - lsls r0, r0, #0xa - str r0, [r4, #0x20] - movs r0, #0x80 - lsls r0, r0, #1 - strh r0, [r4, #0x24] - bl Random - movs r1, #3 - ands r0, r1 - ldrb r1, [r4, #0x15] - orrs r0, r1 - strb r0, [r4, #0x15] - adds r0, r4, #0 - movs r1, #0x57 - bl InitializeAnimation - b _0809438A -_08094254: - ldrb r0, [r4, #0xb] - cmp r0, #0 - bne _08094272 - adds r0, r4, #0 - movs r1, #0x67 - movs r2, #1 - movs r3, #0x80 - bl CreateObjectWithParent - adds r1, r0, #0 - str r1, [r4, #0x54] - cmp r1, #0 - beq _08094272 - ldr r0, [r4, #0x50] - str r0, [r1, #0x54] -_08094272: - ldrb r0, [r4, #0xb] - cmp r0, #0x80 - bne _0809427A - b _08094380 -_0809427A: - movs r2, #0 - movs r0, #0x4b - strb r0, [r4, #0x1e] - ldrb r1, [r4, #0x19] - subs r0, #0x58 - ands r0, r1 - movs r1, #4 - orrs r0, r1 - movs r1, #0xe0 - lsls r1, r1, #7 - strh r1, [r4, #0x24] - movs r1, #0xc0 - orrs r0, r1 - strb r0, [r4, #0x19] - adds r3, r4, #0 - adds r3, #0x29 - ldrb r0, [r3] - movs r1, #7 - orrs r0, r1 - strb r0, [r3] - ldrb r0, [r4, #0x19] - movs r1, #3 - orrs r0, r1 - strb r0, [r4, #0x19] - ldrb r0, [r4, #0xb] - lsls r0, r0, #3 - ldr r1, _080942E8 @ =gUnk_081229F0 - adds r3, r0, r1 - movs r0, #0 - ldrsb r0, [r3, r0] - ldrh r1, [r4, #0x2e] - adds r0, r0, r1 - strh r0, [r4, #0x2e] - movs r0, #1 - ldrsb r0, [r3, r0] - ldrh r1, [r4, #0x32] - adds r0, r0, r1 - strh r0, [r4, #0x32] - ldrb r0, [r3, #2] - strb r0, [r4, #0xe] - ldrb r0, [r3, #3] - strb r0, [r4, #0xf] - movs r0, #0xce - str r0, [r4, #0x7c] - str r2, [r4, #0x74] - ldrb r1, [r3, #4] - movs r0, #0x40 - ands r0, r1 - cmp r0, #0 - beq _080942EC - adds r1, r4, #0 - adds r1, #0x82 - movs r0, #0xff - lsls r0, r0, #8 - b _080942F4 - .align 2, 0 -_080942E8: .4byte gUnk_081229F0 -_080942EC: - adds r1, r4, #0 - adds r1, #0x82 - movs r0, #0x80 - lsls r0, r0, #1 -_080942F4: - strh r0, [r1] - ldrb r1, [r3, #4] - movs r0, #0x80 - ands r0, r1 - cmp r0, #0 - beq _0809430A - adds r1, r4, #0 - adds r1, #0x86 - movs r0, #0xff - lsls r0, r0, #8 - b _08094312 -_0809430A: - adds r1, r4, #0 - adds r1, #0x86 - movs r0, #0x80 - lsls r0, r0, #1 -_08094312: - strh r0, [r1] - adds r0, r4, #0 - bl AllocMutableHitbox - cmp r0, #0 - beq _0809438A - ldr r2, [r4, #0x48] - ldr r1, _0809437C @ =gUnk_080FD2E8 - ldrb r0, [r1] - strb r0, [r2] - ldr r2, [r4, #0x48] - ldrb r0, [r1, #1] - strb r0, [r2, #1] - ldr r2, [r4, #0x48] - ldrb r0, [r1, #2] - strb r0, [r2, #2] - ldr r2, [r4, #0x48] - ldrb r0, [r1, #3] - strb r0, [r2, #3] - ldr r2, [r4, #0x48] - ldrb r0, [r1, #4] - strb r0, [r2, #4] - ldr r2, [r4, #0x48] - ldrb r0, [r1, #5] - strb r0, [r2, #5] - ldr r2, [r4, #0x48] - ldrb r0, [r1, #6] - strb r0, [r2, #6] - ldr r2, [r4, #0x48] - ldrb r0, [r1, #7] - strb r0, [r2, #7] - ldrb r1, [r4, #0x10] - movs r0, #0x80 - orrs r0, r1 - strb r0, [r4, #0x10] - adds r1, r4, #0 - adds r1, #0x38 - movs r0, #2 - strb r0, [r1] - adds r1, #4 - movs r0, #7 - strb r0, [r1] - adds r1, #4 - movs r0, #0x48 - strb r0, [r1] - subs r1, #1 - movs r0, #0x7a - strb r0, [r1] - subs r1, #4 - movs r0, #1 - strb r0, [r1] - b _0809438A - .align 2, 0 -_0809437C: .4byte gUnk_080FD2E8 -_08094380: - ldrb r1, [r4, #0x18] - movs r0, #4 - rsbs r0, r0, #0 - ands r0, r1 - strb r0, [r4, #0x18] -_0809438A: - movs r0, #1 - strb r0, [r4, #0xc] - adds r0, r4, #0 - bl sub_08094398 -_08094394: - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_08094398 -sub_08094398: @ 0x08094398 - push {r4, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xa] - cmp r0, #0 - beq _080943A8 - cmp r0, #1 - beq _080943D8 - b _08094420 -_080943A8: - adds r0, r4, #0 - bl GetNextFrame - adds r0, r4, #0 - bl LinearMoveUpdate - movs r1, #0x80 - lsls r1, r1, #7 - adds r0, r4, #0 - bl GravityUpdate - cmp r0, #0 - bne _08094420 - ldrb r0, [r4, #0xb] - cmp r0, #3 - bhi _080943D2 - adds r0, r4, #0 - movs r1, #0xc - movs r2, #0 - bl CreateFx -_080943D2: - bl DeleteThisEntity - b _08094420 -_080943D8: - ldrb r1, [r4, #0xb] - cmp r1, #0x80 - beq _0809440A - ldr r0, [r4, #0x7c] - subs r0, #1 - str r0, [r4, #0x7c] - movs r1, #1 - rsbs r1, r1, #0 - cmp r0, r1 - bne _080943F6 - movs r0, #0x96 - lsls r0, r0, #2 - str r0, [r4, #0x7c] - movs r0, #2 - strb r0, [r4, #0xc] -_080943F6: - adds r0, r4, #0 - adds r0, #0x82 - ldrh r1, [r0] - adds r0, #4 - ldrh r2, [r0] - adds r0, r4, #0 - movs r3, #0 - bl sub_0805EC9C - b _08094420 -_0809440A: - ldr r0, [r4, #0x54] - adds r0, #0x79 - ldrb r0, [r0] - ands r1, r0 - cmp r1, #0 - bne _0809441A - bl DeleteThisEntity -_0809441A: - adds r0, r4, #0 - bl sub_08094660 -_08094420: - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_08094424 -sub_08094424: @ 0x08094424 - push {r4, r5, r6, r7, lr} - mov r7, r8 - push {r7} - adds r6, r0, #0 - adds r3, r6, #0 - adds r3, #0x82 - movs r1, #0 - ldrsh r0, [r3, r1] - cmp r0, #0 - bge _08094452 - adds r1, r6, #0 - adds r1, #0x80 - movs r0, #0x24 - ldrsh r2, [r6, r0] - ldr r0, [r1] - adds r0, r0, r2 - str r0, [r1] - movs r2, #0 - ldrsh r0, [r3, r2] - rsbs r0, r0, #0 - mov r8, r0 - adds r5, r1, #0 - b _08094466 -_08094452: - adds r0, r6, #0 - adds r0, #0x80 - movs r1, #0x24 - ldrsh r2, [r6, r1] - ldr r1, [r0] - subs r1, r1, r2 - str r1, [r0] - ldrh r3, [r3] - mov r8, r3 - adds r5, r0, #0 -_08094466: - adds r0, r6, #0 - adds r0, #0x86 - movs r2, #0 - ldrsh r1, [r0, r2] - adds r4, r0, #0 - cmp r1, #0 - bge _0809448C - adds r1, r6, #0 - adds r1, #0x84 - movs r0, #0x24 - ldrsh r2, [r6, r0] - ldr r0, [r1] - adds r0, r0, r2 - str r0, [r1] - movs r2, #0 - ldrsh r0, [r4, r2] - rsbs r7, r0, #0 - adds r3, r1, #0 - b _0809449E -_0809448C: - adds r0, r6, #0 - adds r0, #0x84 - movs r1, #0x24 - ldrsh r2, [r6, r1] - ldr r1, [r0] - subs r1, r1, r2 - str r1, [r0] - ldrh r7, [r4] - adds r3, r0, #0 -_0809449E: - ldrh r2, [r6, #0x24] - movs r0, #0x24 - ldrsh r1, [r6, r0] - movs r0, #0x80 - lsls r0, r0, #6 - cmp r1, r0 - ble _080944B2 - ldr r1, _080944D0 @ =0xFFFFFF00 - adds r0, r2, r1 - strh r0, [r6, #0x24] -_080944B2: - ldr r0, [r6, #0x7c] - subs r0, #1 - str r0, [r6, #0x7c] - movs r1, #1 - rsbs r1, r1, #0 - cmp r0, r1 - bne _080944D4 - movs r0, #0 - strh r0, [r5] - strh r0, [r3] - movs r0, #3 - strb r0, [r6, #0xc] - movs r0, #0x78 - str r0, [r6, #0x7c] - b _08094500 - .align 2, 0 -_080944D0: .4byte 0xFFFFFF00 -_080944D4: - adds r5, r6, #0 - adds r5, #0x82 - movs r2, #0 - ldrsh r1, [r5, r2] - ldrb r3, [r6, #0xe] - adds r0, r6, #0 - movs r2, #0x20 - bl sub_0806FCF4 - movs r0, #0 - ldrsh r1, [r4, r0] - ldrb r3, [r6, #0xf] - adds r0, r6, #0 - movs r2, #0x20 - bl sub_0806FCF4 - ldrh r1, [r5] - ldrh r2, [r4] - adds r0, r6, #0 - movs r3, #0 - bl sub_0805EC9C -_08094500: - ldr r5, [r6, #0x48] - cmp r5, #0 - beq _08094538 - movs r4, #0x80 - lsls r4, r4, #9 - adds r0, r4, #0 - mov r1, r8 - bl __divsi3 - lsrs r0, r0, #3 - strb r0, [r5, #6] - ldr r5, [r6, #0x48] - adds r0, r4, #0 - adds r1, r7, #0 - bl __divsi3 - lsrs r0, r0, #3 - strb r0, [r5, #7] - ldr r1, [r6, #0x48] - adds r0, r6, #0 - adds r0, #0x62 - ldrb r0, [r0] - strb r0, [r1] - ldr r1, [r6, #0x48] - adds r0, r6, #0 - adds r0, #0x63 - ldrb r0, [r0] - strb r0, [r1, #1] -_08094538: - pop {r3} - mov r8, r3 - pop {r4, r5, r6, r7, pc} - .align 2, 0 - - thumb_func_start sub_08094540 -sub_08094540: @ 0x08094540 - push {lr} - adds r3, r0, #0 - ldr r0, [r3, #0x7c] - subs r0, #1 - str r0, [r3, #0x7c] - movs r1, #1 - rsbs r1, r1, #0 - cmp r0, r1 - bne _0809455A - movs r0, #4 - strb r0, [r3, #0xc] - movs r0, #2 - str r0, [r3, #0x7c] -_0809455A: - adds r0, r3, #0 - adds r0, #0x82 - ldrh r1, [r0] - adds r0, #4 - ldrh r2, [r0] - adds r0, r3, #0 - movs r3, #0 - bl sub_0805EC9C - pop {pc} - .align 2, 0 - - thumb_func_start sub_08094570 -sub_08094570: @ 0x08094570 - push {r4, r5, r6, r7, lr} - mov r7, r8 - push {r7} - adds r6, r0, #0 - adds r2, r6, #0 - adds r2, #0x82 - ldrh r1, [r2] - lsls r3, r1, #0x10 - movs r0, #0x80 - lsls r0, r0, #1 - cmp r1, r0 - beq _08094590 - asrs r3, r3, #0x10 - ldr r0, _080945B0 @ =0xFFFFFF00 - cmp r3, r0 - bne _080945BA -_08094590: - ldr r1, [r6, #0x7c] - cmp r1, #0 - bne _080945B4 - ldr r0, [r6, #0x50] - adds r0, #0x7c - strh r1, [r0] - ldr r0, [r6, #0x50] - adds r0, #0x79 - ldrb r1, [r0] - movs r0, #0x80 - ands r0, r1 - cmp r0, #0 - bne _08094622 - bl DeleteThisEntity - b _08094622 - .align 2, 0 -_080945B0: .4byte 0xFFFFFF00 -_080945B4: - subs r0, r1, #1 - str r0, [r6, #0x7c] - b _08094622 -_080945BA: - cmp r3, #0 - bge _080945CC - subs r0, r1, #1 - strh r0, [r2] - movs r1, #0 - ldrsh r0, [r2, r1] - rsbs r0, r0, #0 - mov r8, r0 - b _080945D4 -_080945CC: - adds r0, r1, #1 - strh r0, [r2] - ldrh r2, [r2] - mov r8, r2 -_080945D4: - adds r0, r6, #0 - adds r0, #0x86 - ldrh r2, [r0] - movs r3, #0 - ldrsh r1, [r0, r3] - adds r4, r0, #0 - cmp r1, #0 - bge _080945F0 - subs r0, r2, #1 - strh r0, [r4] - movs r1, #0 - ldrsh r0, [r4, r1] - rsbs r7, r0, #0 - b _080945F6 -_080945F0: - adds r0, r2, #1 - strh r0, [r4] - ldrh r7, [r4] -_080945F6: - adds r5, r6, #0 - adds r5, #0x82 - movs r3, #0 - ldrsh r1, [r5, r3] - ldrb r3, [r6, #0xe] - adds r0, r6, #0 - movs r2, #0x20 - bl sub_0806FCF4 - movs r0, #0 - ldrsh r1, [r4, r0] - ldrb r3, [r6, #0xf] - adds r0, r6, #0 - movs r2, #0x20 - bl sub_0806FCF4 - ldrh r1, [r5] - ldrh r2, [r4] - adds r0, r6, #0 - movs r3, #0 - bl sub_0805EC9C -_08094622: - ldr r5, [r6, #0x48] - cmp r5, #0 - beq _0809465A - movs r4, #0x80 - lsls r4, r4, #9 - adds r0, r4, #0 - mov r1, r8 - bl __divsi3 - lsrs r0, r0, #3 - strb r0, [r5, #6] - ldr r5, [r6, #0x48] - adds r0, r4, #0 - adds r1, r7, #0 - bl __divsi3 - lsrs r0, r0, #3 - strb r0, [r5, #7] - ldr r1, [r6, #0x48] - adds r0, r6, #0 - adds r0, #0x62 - ldrb r0, [r0] - strb r0, [r1] - ldr r1, [r6, #0x48] - adds r0, r6, #0 - adds r0, #0x63 - ldrb r0, [r0] - strb r0, [r1, #1] -_0809465A: - pop {r3} - mov r8, r3 - pop {r4, r5, r6, r7, pc} - - thumb_func_start sub_08094660 -sub_08094660: @ 0x08094660 - push {r4, r5, r6, r7, lr} - mov r7, sb - mov r6, r8 - push {r6, r7} - adds r6, r0, #0 - ldr r0, [r6, #0x50] - adds r0, #0x62 - movs r7, #0 - ldrsb r7, [r0, r7] - cmp r7, #0 - bge _08094678 - rsbs r7, r7, #0 -_08094678: - lsls r7, r7, #1 - adds r0, r7, #0 - cmp r7, #0 - bge _08094682 - adds r0, #0xf -_08094682: - asrs r1, r0, #4 - ldr r0, [r6, #0x74] - cmp r0, r1 - bhs _08094700 - str r1, [r6, #0x74] - movs r1, #0x2e - ldrsh r0, [r6, r1] - subs r0, r0, r7 - adds r4, r0, #0 - subs r4, #0x40 - movs r1, #0x32 - ldrsh r0, [r6, r1] - subs r0, r0, r7 - adds r5, r0, #0 - subs r5, #0x40 - movs r0, #0x10 - mov sb, r0 - str r0, [r6, #0x78] - movs r1, #0 - mov r8, r1 - str r1, [r6, #0x7c] - adds r0, r6, #0 - adds r1, r4, #0 - adds r2, r5, #0 - bl sub_08094708 - mov r0, r8 - str r0, [r6, #0x78] - mov r1, sb - str r1, [r6, #0x7c] - adds r0, r6, #0 - adds r1, r4, #0 - adds r2, r5, #0 - bl sub_08094708 - movs r1, #0x2e - ldrsh r0, [r6, r1] - adds r0, r0, r7 - adds r4, r0, #0 - adds r4, #0x30 - movs r1, #0x32 - ldrsh r0, [r6, r1] - adds r0, r0, r7 - adds r5, r0, #0 - adds r5, #0x30 - movs r7, #0x10 - rsbs r7, r7, #0 - str r7, [r6, #0x78] - mov r0, r8 - str r0, [r6, #0x7c] - adds r0, r6, #0 - adds r1, r4, #0 - adds r2, r5, #0 - bl sub_08094708 - mov r1, r8 - str r1, [r6, #0x78] - str r7, [r6, #0x7c] - adds r0, r6, #0 - adds r1, r4, #0 - adds r2, r5, #0 - bl sub_08094708 -_08094700: - pop {r3, r4} - mov r8, r3 - mov sb, r4 - pop {r4, r5, r6, r7, pc} - - thumb_func_start sub_08094708 -sub_08094708: @ 0x08094708 - push {r4, r5, r6, r7, lr} - sub sp, #8 - adds r7, r0, #0 - adds r6, r1, #0 - adds r5, r2, #0 - ldr r0, [r7, #0x74] - lsls r0, r0, #1 - adds r4, r0, #0 - adds r4, #8 - cmp r4, #0 - beq _08094752 - ldr r3, _08094758 @ =gRoomControls - movs r2, #0x3f -_08094722: - ldrh r0, [r3, #6] - subs r0, r6, r0 - lsrs r0, r0, #4 - ands r0, r2 - ldrh r1, [r3, #8] - subs r1, r5, r1 - lsrs r1, r1, #4 - ands r1, r2 - lsls r1, r1, #6 - orrs r0, r1 - movs r1, #2 - str r2, [sp] - str r3, [sp, #4] - bl sub_0807BA8C - ldr r0, [r7, #0x78] - adds r6, r6, r0 - ldr r0, [r7, #0x7c] - adds r5, r5, r0 - subs r4, #1 - ldr r2, [sp] - ldr r3, [sp, #4] - cmp r4, #0 - bne _08094722 -_08094752: - add sp, #8 - pop {r4, r5, r6, r7, pc} - .align 2, 0 -_08094758: .4byte gRoomControls diff --git a/assets/assets.json b/assets/assets.json index 1d7802ad..ad11d8b5 100644 --- a/assets/assets.json +++ b/assets/assets.json @@ -43995,16 +43995,6 @@ "size": 28, "type": "animation" }, - { - "path": "object67/gUnk_081229D0.bin", - "start": 1190352, - "size": 32 - }, - { - "path": "object67/gUnk_081229F0.bin", - "start": 1190384, - "size": 32 - }, { "path": "animations/gSpriteAnimations_Object6A_10_0.bin", "start": 1190732, diff --git a/data/const/object/object67.s b/data/const/object/object67.s deleted file mode 100644 index fa7974f9..00000000 --- a/data/const/object/object67.s +++ /dev/null @@ -1,18 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - .align 2 - -gUnk_081229BC:: @ 081229BC - .4byte sub_08094148 - .4byte sub_08094398 - .4byte sub_08094424 - .4byte sub_08094540 - .4byte sub_08094570 - -gUnk_081229D0:: @ 081229D0 - .incbin "object67/gUnk_081229D0.bin" - -gUnk_081229F0:: @ 081229F0 - .incbin "object67/gUnk_081229F0.bin" diff --git a/linker.ld b/linker.ld index 4262547d..1827e5f0 100644 --- a/linker.ld +++ b/linker.ld @@ -727,7 +727,7 @@ SECTIONS { src/object/object64.o(.text); src/object/ladderHoleInBookshelf.o(.text); src/object/object66.o(.text); - asm/object/object67.o(.text); + src/object/object67.o(.text); src/object/object68.o(.text); src/object/object69.o(.text); src/object/object6A.o(.text); @@ -1468,7 +1468,7 @@ SECTIONS { src/object/object64.o(.rodata); data/animations/object/object64.o(.rodata); src/object/ladderHoleInBookshelf.o(.rodata); - data/const/object/object67.o(.rodata); + src/object/object67.o(.rodata); src/object/object68.o(.rodata); src/object/object6A.o(.rodata); data/const/object/object6A.o(.rodata); diff --git a/src/object/object67.c b/src/object/object67.c new file mode 100644 index 00000000..05218223 --- /dev/null +++ b/src/object/object67.c @@ -0,0 +1,338 @@ +#define NENT_DEPRECATED +#include "entity.h" +#include "room.h" +#include "player.h" +#include "asm.h" +#include "functions.h" +#include "object.h" +#include "effects.h" + +typedef struct { + Entity base; + u8 filler[0xC]; + u32 unk74; + u32 unk78; + u32 unk7c; + union SplitWord unk80; + union SplitWord unk84; +} Object67Entity; + +extern Hitbox gUnk_080FD2E8; + +void sub_08094148(Object67Entity*); +void sub_08094398(Object67Entity*); +void sub_08094424(Object67Entity*); +void sub_08094540(Object67Entity*); +void sub_08094570(Object67Entity*); +void sub_08094660(Object67Entity*); +void sub_08094708(Object67Entity*, u32, u32); + +extern bool32 AllocMutableHitbox(Entity*); + +void Object67(Entity* this) { + static void (*const actionFuncs[])(Object67Entity*) = { + sub_08094148, sub_08094398, sub_08094424, sub_08094540, sub_08094570, + }; + + actionFuncs[this->action]((Object67Entity*)this); +} + +typedef struct { + u8 unk0; + u8 direction; + s8 x; + s8 y; +} gUnk_081229D0_struct; + +typedef struct { + s8 x; + s8 y; + u8 actionDelay; + u8 unk3; + u8 unk4; + u8 filler[3]; +} gUnk_081229F0_struct; + +void sub_08094148(Object67Entity* this) { + static const gUnk_081229D0_struct gUnk_081229D0[] = { + { 0, 12, 8, 8 }, { 0x40, 0x14, -8, 8 }, { 0x80, 4, 8, -8 }, { 0xC0, 0x1C, -8, -8 }, + { 0, 12, 0, 0 }, { 0x40, 0x14, 0, 0 }, { 0x80, 4, 0, 0 }, { 0xC0, 0x1C, -0, 0 }, + }; + static const gUnk_081229F0_struct gUnk_081229F0[] = { + { -32, -40, 1, 2, 0, { 0 } }, + { 0x1f, -40, 3, 2, 0x40, { 0 } }, + { -32, 0x17, 1, 0, 0x80, { 0 } }, + { 0x1f, 0x17, 3, 0, 0xC0, { 0 } }, + }; + const gUnk_081229F0_struct* ptr; + + switch (super->type) { + case 2: + if (super->subAction == 0) { + super->subAction = 1; + this->unk78 = 0x168; + gRoomControls.camera_target = super; + } else { + if (--this->unk78 == -1) { + gRoomControls.camera_target = &gPlayerEntity; + DeleteThisEntity(); + } + } + sub_08078B48(); + return; + case 0: + super->direction = gUnk_081229D0[super->type2].direction; + super->x.HALF.HI += gUnk_081229D0[super->type2].x; + super->y.HALF.HI += gUnk_081229D0[super->type2].y; + if ((gUnk_081229D0[super->type2].unk0 & 0x40) != 0) { + super->spriteSettings.flipX = 1; + } + if ((gUnk_081229D0[super->type2].unk0 & 0x80) != 0) { + super->spriteSettings.flipY = 1; + } + if (super->type2 < 4) { + super->zVelocity = (Random() & 0x1ffff) | 0x28000; + super->speed = 0x100; + InitializeAnimation(super, 0x56); + } else { + super->zVelocity = 0x28000; + super->speed = 0x100; + super->direction = (Random() & 3) | super->direction; + InitializeAnimation(super, 0x57); + } + break; + case 1: + if (super->type2 == 0) { + super->child = CreateObjectWithParent(super, OBJECT_67, 1, 0x80); + if (super->child != NULL) { + super->child->child = super->parent; + } + } + + switch (super->type2) { + default: + super->frameIndex = 75; + super->spriteRendering.alphaBlend = 1; + super->speed = 0x7000; + super->spriteRendering.b3 = 3; + super->spritePriority.b0 = 7; + super->spriteRendering.b0 = 3; + ptr = gUnk_081229F0 + super->type2; + super->x.HALF.HI = ptr->x + super->x.HALF.HI; + super->y.HALF.HI = ptr->y + super->y.HALF.HI; + super->actionDelay = ptr->actionDelay; + super->field_0xf = ptr->unk3; + this->unk7c = 0xce; + this->unk74 = 0; + if ((ptr->unk4 & 0x40) != 0) { + this->unk80.HALF.HI = 0xff00; + } else { + this->unk80.HALF.HI = 0x100; + } + if ((ptr->unk4 & 0x80) != 0) { + this->unk84.HALF.HI = 0xff00; + } else { + this->unk84.HALF.HI = 0x100; + } + + if (AllocMutableHitbox(super)) { + super->hitbox->offset_x = gUnk_080FD2E8.offset_x; + super->hitbox->offset_y = gUnk_080FD2E8.offset_y; + super->hitbox->unk2[0] = gUnk_080FD2E8.unk2[0]; + super->hitbox->unk2[1] = gUnk_080FD2E8.unk2[1]; + super->hitbox->unk2[2] = gUnk_080FD2E8.unk2[2]; + super->hitbox->unk2[3] = gUnk_080FD2E8.unk2[3]; + super->hitbox->width = gUnk_080FD2E8.width; + super->hitbox->height = gUnk_080FD2E8.height; + COLLISION_ON(super); + super->collisionLayer = 2; + super->field_0x3c = 7; + super->hurtType = 0x48; + super->hitType = 0x7a; + super->flags2 = 1; + } + break; + case 0x80: + super->spriteSettings.draw = 0; + break; + } + break; + } + + super->action = 1; + sub_08094398(this); +} + +void sub_08094398(Object67Entity* this) { + switch (super->type) { + case 0: + GetNextFrame(super); + LinearMoveUpdate(super); + if (GravityUpdate(super, 0x4000) == 0) { + if (super->type2 < 4) { + CreateFx(super, FX_LAVA_SPLASH, 0); + } + DeleteThisEntity(); + } + break; + case 1: + if (super->type2 != 0x80) { + if (--this->unk7c == -1) { + this->unk7c = 600; + super->action = 2; + } + sub_0805EC9C(super, this->unk80.HALF_U.HI, this->unk84.HALF_U.HI, 0); + } else { + if ((((GenericEntity*)super->child)->field_0x78.HALF.HI & 0x80) == 0) { + DeleteThisEntity(); + } + sub_08094660(this); + } + break; + } +} + +void sub_08094424(Object67Entity* this) { + u32 uVar2; + u32 uVar5; + + if (this->unk80.HALF.HI < 0) { + this->unk80.WORD += (int)super->speed; + uVar2 = -this->unk80.HALF.HI; + } else { + this->unk80.WORD -= (int)super->speed; + uVar2 = this->unk80.HALF_U.HI; + } + + if (this->unk84.HALF.HI < 0) { + this->unk84.WORD += (int)super->speed; + uVar5 = -this->unk84.HALF.HI; + } else { + this->unk84.WORD -= (int)super->speed; + uVar5 = this->unk84.HALF_U.HI; + } + + if (0x2000 < super->speed) { + super->speed -= 0x100; + } + + if (--this->unk7c == -1) { + this->unk80.HALF.LO = 0; + this->unk84.HALF.LO = 0; + super->action = 3; + this->unk7c = 0x78; + } else { + sub_0806FCF4(super, this->unk80.HALF.HI, 0x20, super->actionDelay); + sub_0806FCF4(super, this->unk84.HALF.HI, 0x20, super->field_0xf); + sub_0805EC9C(super, this->unk80.HALF_U.HI, this->unk84.HALF_U.HI, 0); + } + + if (super->hitbox != NULL) { + super->hitbox->width = (u32)(0x10000 / (s32)uVar2) >> 3; + super->hitbox = super->hitbox; + super->hitbox->height = (u32)(0x10000 / (s32)uVar5) >> 3; + super->hitbox->offset_x = super->spriteOffsetX; + super->hitbox->offset_y = super->spriteOffsetY; + } +} + +void sub_08094540(Object67Entity* this) { + if (--this->unk7c == -1) { + super->action = 4; + this->unk7c = 2; + } + sub_0805EC9C(super, this->unk80.HALF_U.HI, this->unk84.HALF_U.HI, 0); +} + +void sub_08094570(Object67Entity* this) { + u32 uVar2; + u32 uVar3; + + if ((this->unk80.HALF_U.HI == 0x100) || (this->unk80.HALF.HI == -0x100)) { + if (this->unk7c == 0) { + ((GenericEntity*)super->parent)->field_0x7c.HALF.LO = 0; + if ((((GenericEntity*)super->parent)->field_0x78.HALF.HI & 0x80) == 0) { + DeleteThisEntity(); + } + } else { + this->unk7c--; + } + } else { + if (this->unk80.HALF.HI < 0) { + this->unk80.HALF.HI--; + uVar2 = -this->unk80.HALF.HI; + } else { + this->unk80.HALF.HI++; + uVar2 = this->unk80.HALF_U.HI; + } + + if (this->unk84.HALF.HI < 0) { + this->unk84.HALF.HI = this->unk84.HALF.HI + -1; + uVar3 = -this->unk84.HALF.HI; + } else { + this->unk84.HALF.HI = this->unk84.HALF.HI + 1; + uVar3 = this->unk84.HALF_U.HI; + } + sub_0806FCF4(super, this->unk80.HALF.HI, 0x20, super->actionDelay); + sub_0806FCF4(super, this->unk84.HALF.HI, 0x20, super->field_0xf); + sub_0805EC9C(super, this->unk80.HALF_U.HI, this->unk84.HALF_U.HI, 0); + } + + if (super->hitbox != NULL) { + super->hitbox->width = (u32)(0x10000 / (s32)uVar2) >> 3; + super->hitbox->height = (u32)(0x10000 / (s32)uVar3) >> 3; + super->hitbox->offset_x = super->spriteOffsetX; + super->hitbox->offset_y = super->spriteOffsetY; + } +} + +void sub_08094660(Object67Entity* this) { + int iVar1; + int spriteOffsetX; + int iVar3; + int iVar4; + int iVar5; + + spriteOffsetX = (s8)super->parent->spriteOffsetX; + if (spriteOffsetX < 0) { + spriteOffsetX = -spriteOffsetX; + } + + spriteOffsetX = spriteOffsetX * 2; + if (spriteOffsetX < 0) { + iVar5 = spriteOffsetX + 0xf; + } else { + iVar5 = spriteOffsetX; + } + + iVar1 = iVar5 >> 4; + if (this->unk74 < iVar1) { + this->unk74 = iVar1; + iVar3 = super->x.HALF.HI - spriteOffsetX - 0x40; + iVar4 = super->y.HALF.HI - spriteOffsetX - 0x40; + this->unk78 = 0x10; + this->unk7c = 0; + sub_08094708(this, iVar3, iVar4); + this->unk78 = 0; + this->unk7c = 0x10; + sub_08094708(this, iVar3, iVar4); + iVar3 = super->x.HALF.HI + spriteOffsetX + 0x30; + iVar4 = super->y.HALF.HI + spriteOffsetX + 0x30; + this->unk78 = 0xfffffff0; + this->unk7c = 0; + sub_08094708(this, iVar3, iVar4); + this->unk78 = 0; + this->unk7c = 0xfffffff0; + sub_08094708(this, iVar3, iVar4); + } +} + +void sub_08094708(Object67Entity* this, u32 param_2, u32 param_3) { + int index; + + for (index = this->unk74 * 2 + 8; index != 0; index--) { + sub_0807BA8C(TILE(param_2, param_3), 2); + param_2 = param_2 + this->unk78; + param_3 = param_3 + this->unk7c; + } +} From 5035a3cc391d58e46bf0dccb3ba6cff240fe9234 Mon Sep 17 00:00:00 2001 From: Tal Hayon Date: Mon, 14 Mar 2022 11:58:03 +0200 Subject: [PATCH 14/23] Decompile object75 --- asm/object/object75.s | 20 -------------------- data/const/object/object75.s | 9 --------- linker.ld | 4 ++-- src/object/object75.c | 14 ++++++++++++++ 4 files changed, 16 insertions(+), 31 deletions(-) delete mode 100644 asm/object/object75.s delete mode 100644 data/const/object/object75.s create mode 100644 src/object/object75.c diff --git a/asm/object/object75.s b/asm/object/object75.s deleted file mode 100644 index 6c8dc4a0..00000000 --- a/asm/object/object75.s +++ /dev/null @@ -1,20 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - thumb_func_start Object75 -Object75: @ 0x0808C934 - push {lr} - ldr r2, _0808C948 @ =gUnk_08121670 - ldrb r1, [r0, #0xc] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_0808C948: .4byte gUnk_08121670 diff --git a/data/const/object/object75.s b/data/const/object/object75.s deleted file mode 100644 index 738b65b7..00000000 --- a/data/const/object/object75.s +++ /dev/null @@ -1,9 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - .align 2 - -gUnk_08121670:: @ 08121670 - .4byte sub_0808C964 - .4byte sub_0808CA10 diff --git a/linker.ld b/linker.ld index 1827e5f0..8dcff676 100644 --- a/linker.ld +++ b/linker.ld @@ -680,7 +680,7 @@ SECTIONS { src/object/bossDoor.o(.text); src/object/object3A.o(.text); src/object/macroMushroomStalks.o(.text); - asm/object/object75.o(.text); /* 75 and 76 are mislocated in object table */ + src/object/object75.o(.text); /* 75 and 76 are mislocated in object table */ asm/object/object76.o(.text); asm/object/code_0808C964.o(.text); src/object/macroPlayer.o(.text); @@ -1413,7 +1413,7 @@ SECTIONS { data/animations/object/bossDoor.o(.rodata); src/object/object3A.o(.rodata); src/object/macroMushroomStalks.o(.rodata); - data/const/object/object75.o(.rodata); + src/object/object75.o(.rodata); data/const/object/object76.o(.rodata); src/object/macroPlayer.o(.rodata); src/object/object3D.o(.rodata); diff --git a/src/object/object75.c b/src/object/object75.c new file mode 100644 index 00000000..efd305f6 --- /dev/null +++ b/src/object/object75.c @@ -0,0 +1,14 @@ +#define NENT_DEPRECATED +#include "entity.h" + +extern void sub_0808C964(Entity*); +extern void sub_0808CA10(Entity*); + +void Object75(Entity* this) { + static void (*const actionFuncs[])(Entity*) = { + sub_0808C964, + sub_0808CA10, + }; + + actionFuncs[this->action](this); +} From 34453788ab04065ccc189b918cc944622f9f4e22 Mon Sep 17 00:00:00 2001 From: Tal Hayon Date: Mon, 14 Mar 2022 11:59:31 +0200 Subject: [PATCH 15/23] Decompile object76 --- asm/object/object76.s | 21 --------------------- data/const/object/object76.s | 9 --------- linker.ld | 4 ++-- src/object/object76.c | 14 ++++++++++++++ 4 files changed, 16 insertions(+), 32 deletions(-) delete mode 100644 asm/object/object76.s delete mode 100644 data/const/object/object76.s create mode 100644 src/object/object76.c diff --git a/asm/object/object76.s b/asm/object/object76.s deleted file mode 100644 index d22ca342..00000000 --- a/asm/object/object76.s +++ /dev/null @@ -1,21 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start Object76 -Object76: @ 0x0808C94C - push {lr} - ldr r2, _0808C960 @ =gUnk_08121678 - ldrb r1, [r0, #0xc] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_0808C960: .4byte gUnk_08121678 diff --git a/data/const/object/object76.s b/data/const/object/object76.s deleted file mode 100644 index 1e0542c4..00000000 --- a/data/const/object/object76.s +++ /dev/null @@ -1,9 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - .align 2 - -gUnk_08121678:: @ 08121678 - .4byte sub_0808C964 - .4byte sub_0808CA10 diff --git a/linker.ld b/linker.ld index 8dcff676..2c10036d 100644 --- a/linker.ld +++ b/linker.ld @@ -681,7 +681,7 @@ SECTIONS { src/object/object3A.o(.text); src/object/macroMushroomStalks.o(.text); src/object/object75.o(.text); /* 75 and 76 are mislocated in object table */ - asm/object/object76.o(.text); + src/object/object76.o(.text); asm/object/code_0808C964.o(.text); src/object/macroPlayer.o(.text); src/object/object3D.o(.text); @@ -1414,7 +1414,7 @@ SECTIONS { src/object/object3A.o(.rodata); src/object/macroMushroomStalks.o(.rodata); src/object/object75.o(.rodata); - data/const/object/object76.o(.rodata); + src/object/object76.o(.rodata); src/object/macroPlayer.o(.rodata); src/object/object3D.o(.rodata); src/object/object3E.o(.rodata); diff --git a/src/object/object76.c b/src/object/object76.c new file mode 100644 index 00000000..79df5405 --- /dev/null +++ b/src/object/object76.c @@ -0,0 +1,14 @@ +#define NENT_DEPRECATED +#include "entity.h" + +extern void sub_0808C964(Entity*); +extern void sub_0808CA10(Entity*); + +void Object76(Entity* this) { + static void (*const actionFuncs[])(Entity*) = { + sub_0808C964, + sub_0808CA10, + }; + + actionFuncs[this->action](this); +} From dd81c3a59cb66f00c1c5a82283e00db01fcf7577 Mon Sep 17 00:00:00 2001 From: Tal Hayon Date: Mon, 14 Mar 2022 12:44:46 +0200 Subject: [PATCH 16/23] Decompile object79 --- asm/object/object79.s | 256 ----------------------------------- assets/assets.json | 5 - data/const/object/object79.s | 13 -- linker.ld | 4 +- src/object/object79.c | 113 ++++++++++++++++ 5 files changed, 115 insertions(+), 276 deletions(-) delete mode 100644 asm/object/object79.s delete mode 100644 data/const/object/object79.s create mode 100644 src/object/object79.c diff --git a/asm/object/object79.s b/asm/object/object79.s deleted file mode 100644 index 1ff61a07..00000000 --- a/asm/object/object79.s +++ /dev/null @@ -1,256 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start Object79 -Object79: @ 0x08097F84 - push {r4, lr} - adds r4, r0, #0 - ldr r0, _08097FAC @ =gPlayerState - ldr r0, [r0, #0x30] - movs r1, #0x80 - ands r0, r1 - cmp r0, #0 - beq _08097F98 - bl DeleteThisEntity -_08097F98: - ldr r0, _08097FB0 @ =gUnk_08123410 - ldrb r1, [r4, #0xc] - lsls r1, r1, #2 - adds r1, r1, r0 - ldr r1, [r1] - adds r0, r4, #0 - bl _call_via_r1 - pop {r4, pc} - .align 2, 0 -_08097FAC: .4byte gPlayerState -_08097FB0: .4byte gUnk_08123410 - - thumb_func_start sub_08097FB4 -sub_08097FB4: @ 0x08097FB4 - push {r4, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xc] - adds r0, #1 - movs r1, #0 - strb r0, [r4, #0xc] - movs r2, #0 - strh r1, [r4, #0x24] - str r1, [r4, #0x6c] - adds r1, r4, #0 - adds r1, #0x7a - movs r0, #0x90 - lsls r0, r0, #5 - strh r0, [r1] - strb r2, [r4, #0xe] - movs r0, #0x1e - strb r0, [r4, #0xf] - ldr r1, _08098014 @ =gUnk_0812341C - ldrb r0, [r4, #0xa] - adds r0, r0, r1 - ldrb r0, [r0] - adds r1, r4, #0 - adds r1, #0x72 - strh r0, [r1] - movs r0, #0x80 - lsls r0, r0, #6 - str r0, [r4, #0x74] - adds r0, r4, #0 - movs r1, #6 - bl SetDefaultPriority - ldrb r0, [r4, #0xa] - cmp r0, #0 - bne _08098018 - adds r1, r4, #0 - adds r1, #0x7e - movs r0, #0x40 - strh r0, [r1] - adds r0, r4, #0 - movs r1, #1 - movs r2, #0 - bl LoadSwapGFX - ldrb r1, [r4, #0xa] - adds r0, r4, #0 - bl InitAnimationForceUpdate - b _08098032 - .align 2, 0 -_08098014: .4byte gUnk_0812341C -_08098018: - ldr r0, [r4, #0x50] - adds r0, #0x60 - ldrh r1, [r0] - adds r0, r4, #0 - adds r0, #0x60 - strh r1, [r0] - ldr r2, [r4, #0x50] - ldrb r1, [r4, #0xa] - movs r0, #0xd - muls r0, r1, r0 - ldrb r2, [r2, #0x1e] - adds r0, r0, r2 - strb r0, [r4, #0x1e] -_08098032: - adds r0, r4, #0 - bl sub_08098130 - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_0809803C -sub_0809803C: @ 0x0809803C - push {r4, r5, lr} - adds r4, r0, #0 - ldrb r5, [r4, #0xa] - cmp r5, #0 - bne _08098070 - bl UpdateAnimationSingleFrame - ldrb r0, [r4, #0xb] - cmp r0, #0 - beq _08098082 - ldr r0, _0809806C @ =gPlayerEntity - strb r5, [r0, #0xf] - ldrb r0, [r4, #0xc] - adds r0, #1 - strb r0, [r4, #0xc] - adds r0, r4, #0 - movs r1, #1 - bl InitAnimationForceUpdate - movs r0, #0xbc - lsls r0, r0, #1 - bl SoundReq - b _08098082 - .align 2, 0 -_0809806C: .4byte gPlayerEntity -_08098070: - ldr r2, [r4, #0x50] - ldrb r1, [r4, #0xa] - movs r0, #0xd - muls r0, r1, r0 - ldrb r1, [r2, #0x1e] - adds r0, r0, r1 - strb r0, [r4, #0x1e] - ldrb r0, [r2, #0xc] - strb r0, [r4, #0xc] -_08098082: - pop {r4, r5, pc} - - thumb_func_start sub_08098084 -sub_08098084: @ 0x08098084 - push {r4, lr} - adds r4, r0, #0 - ldr r1, [r4, #0x6c] - movs r0, #0xa0 - lsls r0, r0, #0xd - cmp r1, r0 - bls _080980A8 - ldr r0, _080980A4 @ =gPlayerState - ldr r1, [r0, #0x30] - movs r2, #0x80 - orrs r1, r2 - str r1, [r0, #0x30] - bl DeleteThisEntity - b _0809812E - .align 2, 0 -_080980A4: .4byte gPlayerState -_080980A8: - ldrb r0, [r4, #0xa] - cmp r0, #0 - bne _080980D8 - adds r0, r4, #0 - bl UpdateAnimationSingleFrame - adds r2, r4, #0 - adds r2, #0x7e - ldrh r0, [r2] - subs r0, #1 - strh r0, [r2] - lsls r0, r0, #0x10 - ldr r1, _080980D4 @ =0xFFFF0000 - cmp r0, r1 - bne _080980E6 - movs r0, #0x40 - strh r0, [r2] - movs r0, #0xbc - lsls r0, r0, #1 - bl SoundReq - b _080980E6 - .align 2, 0 -_080980D4: .4byte 0xFFFF0000 -_080980D8: - ldr r2, [r4, #0x50] - ldrb r1, [r4, #0xa] - movs r0, #0xd - muls r0, r1, r0 - ldrb r2, [r2, #0x1e] - adds r0, r0, r2 - strb r0, [r4, #0x1e] -_080980E6: - ldr r0, [r4, #0x6c] - movs r1, #0xa0 - lsls r1, r1, #5 - adds r0, r0, r1 - str r0, [r4, #0x6c] - ldr r0, [r4, #0x70] - ldr r1, [r4, #0x74] - adds r0, r0, r1 - str r0, [r4, #0x70] - adds r2, r4, #0 - adds r2, #0x72 - ldrh r1, [r2] - movs r0, #0x1f - ands r0, r1 - strh r0, [r2] - ldr r0, [r4, #0x74] - movs r1, #0xa0 - lsls r1, r1, #1 - adds r0, r0, r1 - str r0, [r4, #0x74] - ldrb r0, [r4, #0xf] - subs r0, #1 - strb r0, [r4, #0xf] - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - cmp r0, #0xff - bne _08098128 - movs r0, #0x1e - strb r0, [r4, #0xf] - ldrb r0, [r4, #0xe] - movs r1, #1 - eors r0, r1 - strb r0, [r4, #0xe] -_08098128: - adds r0, r4, #0 - bl sub_08098130 -_0809812E: - pop {r4, pc} - - thumb_func_start sub_08098130 -sub_08098130: @ 0x08098130 - push {r4, lr} - adds r4, r0, #0 - ldr r0, _08098160 @ =gPlayerEntity - adds r1, r4, #0 - bl CopyPosition - adds r0, r4, #0 - adds r0, #0x72 - ldrh r0, [r0] - strb r0, [r4, #0x15] - adds r0, r4, #0 - adds r0, #0x7a - ldrh r0, [r0] - strh r0, [r4, #0x24] - adds r0, r4, #0 - bl LinearMoveUpdate - ldr r0, [r4, #0x30] - ldr r1, _08098164 @ =0xFFEC0000 - adds r0, r0, r1 - ldr r1, [r4, #0x6c] - adds r0, r0, r1 - str r0, [r4, #0x30] - pop {r4, pc} - .align 2, 0 -_08098160: .4byte gPlayerEntity -_08098164: .4byte 0xFFEC0000 diff --git a/assets/assets.json b/assets/assets.json index ad11d8b5..68b02a16 100644 --- a/assets/assets.json +++ b/assets/assets.json @@ -44525,11 +44525,6 @@ "size": 40, "type": "animation" }, - { - "path": "object79/gUnk_0812341C.bin", - "start": 1192988, - "size": 6 - }, { "path": "animations/gSpriteAnimations_PushableLever_0.bin", "start": 1193140, diff --git a/data/const/object/object79.s b/data/const/object/object79.s deleted file mode 100644 index 179b2d69..00000000 --- a/data/const/object/object79.s +++ /dev/null @@ -1,13 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - .align 2 - -gUnk_08123410:: @ 08123410 - .4byte sub_08097FB4 - .4byte sub_0809803C - .4byte sub_08098084 - -gUnk_0812341C:: @ 0812341C - .incbin "object79/gUnk_0812341C.bin" diff --git a/linker.ld b/linker.ld index 2c10036d..4656311e 100644 --- a/linker.ld +++ b/linker.ld @@ -743,7 +743,7 @@ SECTIONS { src/object/object74.o(.text); src/object/bell.o(.text); src/object/macroDecorations.o(.text); - asm/object/object79.o(.text); + src/object/object79.o(.text); src/object/steam.o(.text); src/object/pushableLever.o(.text); src/object/macroShoes.o(.text); @@ -1486,7 +1486,7 @@ SECTIONS { data/const/object/bell.o(.rodata); data/animations/object/bell.o(.rodata); src/object/macroDecorations.o(.rodata); - data/const/object/object79.o(.rodata); + src/object/object79.o(.rodata); data/animations/object/object79.o(.rodata); src/object/steam.o(.rodata); src/object/pushableLever.o(.rodata); diff --git a/src/object/object79.c b/src/object/object79.c new file mode 100644 index 00000000..52480738 --- /dev/null +++ b/src/object/object79.c @@ -0,0 +1,113 @@ +#define NENT_DEPRECATED +#include "entity.h" +#include "player.h" +#include "functions.h" +#include "sound.h" + +typedef struct { + Entity base; + u8 filler[0x4]; + u32 unk6c; + union SplitWord objDir; + u32 unk74; + u16 unk78; + u16 unk7a; + u16 unk7c; + s16 unk7e; +} Object79Entity; + +void Object79_Init(Object79Entity*); +void Object79_Action1(Object79Entity*); +void Object79_Action2(Object79Entity*); +void sub_08098130(Object79Entity*); + +void Object79(Entity* this) { + static void (*const actionFuncs[])(Object79Entity*) = { + Object79_Init, + Object79_Action1, + Object79_Action2, + }; + + if ((gPlayerState.flags & PL_MINISH) != 0) { + DeleteThisEntity(); + } + + actionFuncs[this->action]((Object79Entity*)this); +} + +void Object79_Init(Object79Entity* this) { + static const u8 Object79_Directions[] = { DirectionSouthWest, DirectionWest, DirectionNorthWest, + DirectionNorthEast, DirectionEast, DirectionSouthEast }; + super->action++; + super->speed = 0; + this->unk6c = 0; + this->unk7a = 0x1200; + super->actionDelay = 0; + super->field_0xf = 30; + this->objDir.HALF.HI = Object79_Directions[super->type]; + this->unk74 = 0x2000; + SetDefaultPriority(super, 6); + if (super->type == 0) { + this->unk7e = 0x40; + LoadSwapGFX(super, 1, 0); + InitAnimationForceUpdate(super, super->type); + } else { + Entity* parent; + super->spriteVramOffset = super->parent->spriteVramOffset; + parent = super->parent; + super->frameIndex = super->type * 13 + parent->frameIndex; + } + sub_08098130(this); +} + +void Object79_Action1(Object79Entity* this) { + if (super->type == 0) { + UpdateAnimationSingleFrame(super); + if (super->type2 != 0) { + gPlayerEntity.field_0xf = 0; + super->action++; + InitAnimationForceUpdate(super, 1); + SoundReq(SFX_178); + } + } else { + Entity* parent = super->parent; + super->frameIndex = super->type * 13 + parent->frameIndex; + super->action = parent->action; + } +} + +void Object79_Action2(Object79Entity* this) { + if (this->unk6c >= 0x140001) { + gPlayerState.flags |= PL_MINISH; + DeleteThisEntity(); + } else { + if (super->type == 0) { + UpdateAnimationSingleFrame(super); + if (--this->unk7e << 16 == -0x10000) { + this->unk7e = 0x40; + SoundReq(SFX_178); + } + } else { + Entity* parent = super->parent; + super->frameIndex = super->type * 13 + parent->frameIndex; + } + this->unk6c += 0x1400; + this->objDir.WORD += this->unk74; + this->objDir.HALF.HI = DirectionNormalize(this->objDir.HALF.HI); + this->unk74 += 0x140; + if (--super->field_0xf == 0xff) { + super->field_0xf = 30; + super->actionDelay ^= 1; + } + sub_08098130(this); + } +} + +void sub_08098130(Object79Entity* this) { + CopyPosition(&gPlayerEntity, super); + super->direction = this->objDir.HALF.HI; + super->speed = this->unk7a; + LinearMoveUpdate(super); + super->y.WORD -= 0x140000; + super->y.WORD += this->unk6c; +} From 5eec991497eb9de2d9d1761e187262fc961b7fb5 Mon Sep 17 00:00:00 2001 From: Tal Hayon Date: Mon, 14 Mar 2022 12:54:30 +0200 Subject: [PATCH 17/23] Decompile object81 --- asm/object/object81.s | 84 ------------------------------------ data/const/object/object81.s | 9 ---- linker.ld | 4 +- src/object/object81.c | 39 +++++++++++++++++ 4 files changed, 41 insertions(+), 95 deletions(-) delete mode 100644 asm/object/object81.s delete mode 100644 data/const/object/object81.s create mode 100644 src/object/object81.c diff --git a/asm/object/object81.s b/asm/object/object81.s deleted file mode 100644 index a057e7d1..00000000 --- a/asm/object/object81.s +++ /dev/null @@ -1,84 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start Object81 -Object81: @ 0x08098C68 - push {lr} - ldr r2, _08098C7C @ =gUnk_08123674 - ldrb r1, [r0, #0xc] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_08098C7C: .4byte gUnk_08123674 - - thumb_func_start sub_08098C80 -sub_08098C80: @ 0x08098C80 - push {r4, r5, r6, lr} - adds r4, r0, #0 - movs r0, #0 - movs r5, #1 - strb r5, [r4, #0xc] - strb r0, [r4, #0xe] - movs r0, #0x2e - ldrsh r1, [r4, r0] - ldr r2, _08098CC8 @ =gRoomControls - ldrh r0, [r2, #6] - subs r1, r1, r0 - asrs r1, r1, #4 - movs r3, #0x3f - ands r1, r3 - movs r6, #0x32 - ldrsh r0, [r4, r6] - ldrh r2, [r2, #8] - subs r0, r0, r2 - asrs r0, r0, #4 - ands r0, r3 - lsls r0, r0, #6 - orrs r1, r0 - adds r0, r4, #0 - adds r0, #0x80 - strh r1, [r0] - ldr r0, _08098CCC @ =gPlayerState - ldr r0, [r0, #0x30] - movs r1, #0x80 - ands r0, r1 - cmp r0, #0 - beq _08098CD0 - adds r1, r4, #0 - adds r1, #0x38 - movs r0, #2 - strb r0, [r1] - b _08098CD6 - .align 2, 0 -_08098CC8: .4byte gRoomControls -_08098CCC: .4byte gPlayerState -_08098CD0: - adds r0, r4, #0 - adds r0, #0x38 - strb r5, [r0] -_08098CD6: - adds r0, r4, #0 - bl UpdateSpriteForCollisionLayer - adds r0, r4, #0 - adds r0, #0x80 - ldrh r1, [r0] - subs r1, #0x40 - movs r0, #0x47 - movs r2, #1 - bl sub_08000148 - pop {r4, r5, r6, pc} - .align 2, 0 - - thumb_func_start nullsub_124 -nullsub_124: @ 0x08098CF0 - bx lr - .align 2, 0 diff --git a/data/const/object/object81.s b/data/const/object/object81.s deleted file mode 100644 index 662d1322..00000000 --- a/data/const/object/object81.s +++ /dev/null @@ -1,9 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - .align 2 - -gUnk_08123674:: @ 08123674 - .4byte sub_08098C80 - .4byte nullsub_124 diff --git a/linker.ld b/linker.ld index 4656311e..0f11858f 100644 --- a/linker.ld +++ b/linker.ld @@ -751,7 +751,7 @@ SECTIONS { src/object/object7E.o(.text); asm/object/picoBloom.o(.text); src/object/board.o(.text); - asm/object/object81.o(.text); + src/object/object81.o(.text); src/object/bigVortex.o(.text); src/object/bigPushableLever.o(.text); src/object/smallIceBlock.o(.text); @@ -1496,7 +1496,7 @@ SECTIONS { data/const/object/picoBloom.o(.rodata); data/animations/object/picoBloom.o(.rodata); src/object/board.o(.rodata); - data/const/object/object81.o(.rodata); + src/object/object81.o(.rodata); data/const/object/bigVortex.o(.rodata); data/animations/object/bigVortex.o(.rodata); src/object/bigPushableLever.o(.rodata); diff --git a/src/object/object81.c b/src/object/object81.c new file mode 100644 index 00000000..ea5b8072 --- /dev/null +++ b/src/object/object81.c @@ -0,0 +1,39 @@ +#define NENT_DEPRECATED +#include "entity.h" +#include "player.h" +#include "functions.h" +#include "sound.h" + +typedef struct { + Entity base; + u8 filler[0x18]; + u16 tilePos; +} Object81Entity; + +void Object81_Init(Object81Entity*); +void Object81_Action1(Object81Entity*); + +void Object81(Entity* this) { + static void (*const actionFuncs[])(Object81Entity*) = { + Object81_Init, + Object81_Action1, + }; + + actionFuncs[this->action]((Object81Entity*)this); +} + +void Object81_Init(Object81Entity* this) { + super->action = 1; + super->actionDelay = 0; + this->tilePos = COORD_TO_TILE(super); + if (gPlayerState.flags & PL_MINISH) { + super->collisionLayer = 2; + } else { + super->collisionLayer = 1; + } + UpdateSpriteForCollisionLayer(super); + sub_08000148(0x47, this->tilePos - 0x40, 1); +} + +void Object81_Action1(Object81Entity* this) { +} From 8aa9c2876ab670cacbc6632a5cbe809993eace78 Mon Sep 17 00:00:00 2001 From: Tal Hayon Date: Tue, 15 Mar 2022 01:31:56 +0200 Subject: [PATCH 18/23] Decompile object9 --- asm/object/object9.s | 300 ------------------------------------ assets/assets.json | 21 --- data/const/object/object9.s | 18 --- linker.ld | 4 +- src/object/object9.c | 156 +++++++++++++++++++ 5 files changed, 158 insertions(+), 341 deletions(-) delete mode 100644 asm/object/object9.s delete mode 100644 data/const/object/object9.s create mode 100644 src/object/object9.c diff --git a/asm/object/object9.s b/asm/object/object9.s deleted file mode 100644 index 2cbdec01..00000000 --- a/asm/object/object9.s +++ /dev/null @@ -1,300 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start Object9 -Object9: @ 0x0808386C - push {r4, lr} - adds r4, r0, #0 - ldr r0, _080838C8 @ =gPlayerState - adds r0, #0x27 - ldrb r1, [r0] - rsbs r0, r1, #0 - orrs r0, r1 - lsrs r2, r0, #0x1f - ldr r0, _080838CC @ =gFuseInfo - ldrb r0, [r0] - cmp r0, #2 - bgt _08083894 - cmp r0, #0 - blt _08083894 - ldr r0, _080838D0 @ =gMessage - ldrb r1, [r0] - movs r0, #0x7f - ands r0, r1 - cmp r0, #0 - beq _080838AC -_08083894: - ldr r0, _080838D4 @ =gUnk_03003DF0 - ldr r0, [r0, #4] - ldrb r0, [r0, #3] - cmp r0, #0x32 - bne _080838AA - movs r0, #0x32 - bl CheckKinstoneFused - movs r2, #0 - cmp r0, #0 - beq _080838AC -_080838AA: - movs r2, #1 -_080838AC: - cmp r2, #0 - beq _080838B6 - adds r0, r4, #0 - bl sub_080838DC -_080838B6: - ldr r0, _080838D8 @ =gUnk_0811F754 - ldrb r1, [r4, #0xc] - lsls r1, r1, #2 - adds r1, r1, r0 - ldr r1, [r1] - adds r0, r4, #0 - bl _call_via_r1 - pop {r4, pc} - .align 2, 0 -_080838C8: .4byte gPlayerState -_080838CC: .4byte gFuseInfo -_080838D0: .4byte gMessage -_080838D4: .4byte gUnk_03003DF0 -_080838D8: .4byte gUnk_0811F754 - - thumb_func_start sub_080838DC -sub_080838DC: @ 0x080838DC - ldrb r2, [r0, #0x18] - movs r1, #4 - rsbs r1, r1, #0 - ands r1, r2 - strb r1, [r0, #0x18] - ldrb r2, [r0, #0x1b] - movs r3, #0x3f - adds r1, r3, #0 - ands r1, r2 - movs r2, #0x40 - orrs r1, r2 - strb r1, [r0, #0x1b] - ldrb r1, [r0, #0x19] - ands r3, r1 - strb r3, [r0, #0x19] - adds r3, r0, #0 - adds r3, #0x29 - ldrb r2, [r3] - movs r1, #8 - rsbs r1, r1, #0 - ands r1, r2 - strb r1, [r3] - movs r2, #0 - movs r1, #4 - strb r1, [r0, #0xe] - str r2, [r0, #0x54] - strb r2, [r0, #0xc] - bx lr - - thumb_func_start sub_08083914 -sub_08083914: @ 0x08083914 - push {r4, lr} - adds r4, r0, #0 - adds r0, #0x26 - ldrb r0, [r0] - cmp r0, #1 - beq _08083942 - adds r0, r4, #0 - movs r1, #1 - movs r2, #1 - bl LoadSwapGFX - adds r0, r4, #0 - adds r0, #0x60 - ldrh r1, [r0] - subs r1, #0x10 - strh r1, [r0] - ldr r1, _08083958 @ =0x01027820 - movs r0, #1 - bl sub_080ADDD8 - adds r0, r4, #0 - bl sub_080838DC -_08083942: - movs r0, #1 - strb r0, [r4, #0xc] - ldrb r1, [r4, #0x10] - movs r0, #0x20 - orrs r0, r1 - strb r0, [r4, #0x10] - adds r0, r4, #0 - movs r1, #6 - bl SetDefaultPriority - pop {r4, pc} - .align 2, 0 -.ifdef EU -_08083958: .4byte 0x010277E0 -.else -_08083958: .4byte 0x01027820 -.endif - - thumb_func_start sub_0808395C -sub_0808395C: @ 0x0808395C - push {lr} - adds r2, r0, #0 - ldrb r0, [r2, #0xe] - cmp r0, #0 - beq _0808396C - subs r0, #1 - strb r0, [r2, #0xe] - b _08083992 -_0808396C: - ldr r3, _08083994 @ =gUnk_03003DF0 - ldr r0, [r3, #4] - ldr r1, [r0, #8] - cmp r1, #0 - beq _08083992 - ldrb r0, [r0, #3] - subs r0, #1 - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - cmp r0, #0x63 - bhi _08083992 - str r1, [r2, #0x54] - ldrb r0, [r3, #3] - adds r1, r2, #0 - adds r1, #0x39 - strb r0, [r1] - adds r0, r2, #0 - bl sub_08083A40 -_08083992: - pop {pc} - .align 2, 0 -_08083994: .4byte gUnk_03003DF0 - - thumb_func_start sub_08083998 -sub_08083998: @ 0x08083998 - push {r4, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xa] - cmp r0, #1 - beq _080839C8 - ldr r0, _080839C4 @ =gUnk_03003DF0 - ldr r2, [r0, #4] - ldrb r0, [r2, #3] - subs r0, #1 - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - cmp r0, #0x63 - bhi _080839BA - ldr r1, [r4, #0x54] - ldr r0, [r2, #8] - cmp r1, r0 - beq _080839C8 -_080839BA: - adds r0, r4, #0 - bl sub_080838DC - b _08083A32 - .align 2, 0 -_080839C4: .4byte gUnk_03003DF0 -_080839C8: - ldr r1, [r4, #0x54] - ldr r0, [r1, #0x2c] - str r0, [r4, #0x2c] - ldr r0, [r1, #0x30] - str r0, [r4, #0x30] - ldr r0, [r1, #0x34] - str r0, [r4, #0x34] - adds r1, r4, #0 - adds r1, #0x5a - ldrb r0, [r1] - cmp r0, #1 - bne _08083A2C - movs r0, #0 - strb r0, [r1] - ldrb r0, [r4, #0xa] - cmp r0, #0 - bne _080839F8 - ldr r0, _080839F4 @ =gUnk_03003DF0 - ldr r0, [r0, #4] - ldrb r0, [r0, #3] - b _080839FA - .align 2, 0 -_080839F4: .4byte gUnk_03003DF0 -_080839F8: - ldrb r0, [r4, #0xb] -_080839FA: - lsls r0, r0, #3 - ldr r1, _08083A34 @ =gUnk_080C9CBC - adds r0, r0, r1 - ldrb r2, [r0, #6] - movs r1, #1 - ands r1, r2 - ldrb r3, [r4, #0x1a] - movs r0, #0x10 - rsbs r0, r0, #0 - ands r0, r3 - orrs r0, r1 - strb r0, [r4, #0x1a] - ldr r0, _08083A38 @ =gUnk_0811F744 - lsls r2, r2, #2 - adds r2, r2, r0 - ldr r1, [r2] - lsrs r2, r1, #0x1f - ldr r0, _08083A3C @ =0x00FFFFFF - ands r1, r0 - orrs r1, r2 - adds r0, #1 - orrs r1, r0 - movs r0, #0 - bl sub_080ADDD8 -_08083A2C: - adds r0, r4, #0 - bl GetNextFrame -_08083A32: - pop {r4, pc} - .align 2, 0 -_08083A34: .4byte gUnk_080C9CBC -_08083A38: .4byte gUnk_0811F744 -_08083A3C: .4byte 0x00FFFFFF - - thumb_func_start sub_08083A40 -sub_08083A40: @ 0x08083A40 - 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, #2 - strb r0, [r4, #0xc] - ldr r0, [r4, #0x54] - ldr r1, _08083A70 @ =gPlayerEntity - movs r3, #0x2e - ldrsh r2, [r0, r3] - movs r3, #0x2e - ldrsh r0, [r1, r3] - cmp r2, r0 - ble _08083A74 - movs r1, #0 - adds r2, r4, #0 - adds r2, #0x62 - movs r0, #8 - b _08083A7C - .align 2, 0 -_08083A70: .4byte gPlayerEntity -_08083A74: - movs r1, #1 - adds r2, r4, #0 - adds r2, #0x62 - movs r0, #0xf8 -_08083A7C: - strb r0, [r2] - adds r2, r4, #0 - adds r2, #0x63 - movs r0, #0xee - strb r0, [r2] - adds r0, r4, #0 - bl InitializeAnimation - adds r0, r4, #0 - bl sub_08083998 - pop {r4, pc} diff --git a/assets/assets.json b/assets/assets.json index 68b02a16..c579cdea 100644 --- a/assets/assets.json +++ b/assets/assets.json @@ -42176,27 +42176,6 @@ "size": 55, "type": "animation" }, - { - "path": "object9/gUnk_0811F744_EU.bin", - "variants": [ - "EU" - ], - "starts": { - "EU": 1175180 - }, - "size": 16 - }, - { - "path": "object9/gUnk_0811F744_1_USA-JP-DEMO_USA-DEMO_JP.bin", - "variants": [ - "USA", - "JP", - "DEMO_USA", - "DEMO_JP" - ], - "start": 1177412, - "size": 16 - }, { "path": "animations/gSpriteAnimations_ChestSpawner_0.bin", "start": 1177784, diff --git a/data/const/object/object9.s b/data/const/object/object9.s deleted file mode 100644 index 3af04d2d..00000000 --- a/data/const/object/object9.s +++ /dev/null @@ -1,18 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - .align 2 - -gUnk_0811F744:: @ 0811F744 -.ifdef EU - @ TODO only small differences - .incbin "object9/gUnk_0811F744_EU.bin" -.else - .incbin "object9/gUnk_0811F744_1_USA-JP-DEMO_USA-DEMO_JP.bin" -.endif - -gUnk_0811F754:: @ 0811F754 - .4byte sub_08083914 - .4byte sub_0808395C - .4byte sub_08083998 diff --git a/linker.ld b/linker.ld index 0f11858f..ba0ed04e 100644 --- a/linker.ld +++ b/linker.ld @@ -629,7 +629,7 @@ SECTIONS { src/object/ezloCap.o(.text); src/object/blockPushed.o(.text); src/object/lockedDoor.o(.text); - asm/object/object9.o(.text); + src/object/object9.o(.text); src/object/objectA.o(.text); src/object/objectB.o(.text); src/object/chestSpawner.o(.text); @@ -1345,7 +1345,7 @@ SECTIONS { data/animations/object/ezloCap.o(.rodata); src/object/blockPushed.o(.rodata); src/object/lockedDoor.o(.rodata); - data/const/object/object9.o(.rodata); + src/object/object9.o(.rodata); data/animations/object/object9.o(.rodata); src/object/objectB.o(.rodata); src/object/chestSpawner.o(.rodata); diff --git a/src/object/object9.c b/src/object/object9.c new file mode 100644 index 00000000..a3286f79 --- /dev/null +++ b/src/object/object9.c @@ -0,0 +1,156 @@ +#define NENT_DEPRECATED +#include "entity.h" +#include "message.h" +#include "kinstone.h" +#include "common.h" +#include "functions.h" + +// typedef struct { +// Entity base; +// u8 filler[0x18]; +// u16 tilePos; +// } Object81Entity; + +extern void sub_080ADDD8(u32, u32); +void sub_080838DC(Entity*); +void sub_08083A40(Entity*); +void Object9_Init(Entity*); +void Object9_Action1(Entity*); +void Object9_Action2(Entity*); + +#ifdef EU +static const s32 gUnk_0811F744[] = { + 0x00027940, + 0x00027B40, + 0x00027D40, + 0x00027F40, +}; +#else +static const s32 gUnk_0811F744[] = { + 0x00027980, + 0x00027B80, + 0x00027D80, + 0x00027F80, +}; +#endif + +void Object9(Entity* this) { + static void (*const gUnk_0811F754[])(Entity*) = { + Object9_Init, + Object9_Action1, + Object9_Action2, + }; + + u32 uVar2 = gPlayerState.field_0x27[0] > 0; + + switch (gFuseInfo._0) { + case 0: + case 1: + case 2: + if ((gMessage.doTextBox & 0x7f) != 0) { + default: + if (gUnk_03003DF0.unk_4[3] == 50) { + if (CheckKinstoneFused(0x32) == 0) { + uVar2 = 0; + break; + } + } + uVar2 = 1; + } + break; + } + + if (uVar2) { + sub_080838DC(this); + } + gUnk_0811F754[this->action](this); +} + +void sub_080838DC(Entity* this) { + this->spriteSettings.draw = 0; + this->spriteOrientation.flipY = 1; + this->spriteRendering.b3 = 0; + this->spritePriority.b0 = 0; + this->actionDelay = 4; + this->child = NULL; + this->action = 0; +} + +void Object9_Init(Entity* this) { + if (this->spriteAnimation[0] != 1) { + LoadSwapGFX(this, 1, 1); + this->spriteVramOffset -= 0x10; +#ifdef EU + sub_080ADDD8(1, 0x10277e0); +#else + sub_080ADDD8(1, 0x1027820); +#endif + sub_080838DC(this); + } + this->action = 1; + this->flags |= ENT_PERSIST; + SetDefaultPriority(this, 6); +} + +void Object9_Action1(Entity* this) { + if (this->actionDelay) { + this->actionDelay--; + } else { + if ((*(Entity**)(gUnk_03003DF0.unk_4 + 8) != NULL) && ((u8)(gUnk_03003DF0.unk_4[3] - 1) < 100)) { + this->child = *(Entity**)(gUnk_03003DF0.unk_4 + 8); + this->interactType = gUnk_03003DF0.unk_3; + sub_08083A40(this); + } + } +} + +void Object9_Action2(Entity* this) { + u32 bVar1; + u32 bVar2; + u32 bVar3; + u32 temp; + u32 temp2; + struct_080C9CBC* ptr; + + if ((this->type != 1) && + (((u8)(gUnk_03003DF0.unk_4[3] - 1) >= 100 || (this->child != *(Entity**)(gUnk_03003DF0.unk_4 + 8))))) { + sub_080838DC(this); + } else { + this->x = this->child->x; + this->y = this->child->y; + this->z = this->child->z; + if (this->frame == 1) { + this->frame = 0; + if (this->type == 0) { + bVar2 = gUnk_03003DF0.unk_4[3]; + } else { + bVar2 = this->type2; + } + ptr = gUnk_080C9CBC + bVar2; + bVar1 = ptr->_5[0]; + bVar3 = bVar1 & 1; + this->palette.b.b0 = bVar3; + temp = gUnk_0811F744[bVar1] < 0; + temp2 = (gUnk_0811F744[bVar1] & 0xffffff) | temp; + sub_080ADDD8(0, temp2 | 0x1000000); + } + GetNextFrame(this); + } +} + +void sub_08083A40(Entity* this) { + u32 bVar1; + + this->spriteSettings.draw = 1; + this->action = 2; + if (this->child->x.HALF.HI > gPlayerEntity.x.HALF.HI) { + bVar1 = 0; + this->spriteOffsetX = 8; + } else { + bVar1 = 1; + this->spriteOffsetX = -8; + } + this->spriteOffsetY = -18; + InitializeAnimation(this, bVar1); + Object9_Action2(this); +} From e4cd697f54cc1a56890eb89ef205e31ac3712681 Mon Sep 17 00:00:00 2001 From: Tal Hayon Date: Tue, 15 Mar 2022 01:36:01 +0200 Subject: [PATCH 19/23] Decompile objectA7 --- asm/object/objectA7.s | 34 ---------------------------------- linker.ld | 2 +- src/object/objectA7.c | 11 +++++++++++ 3 files changed, 12 insertions(+), 35 deletions(-) delete mode 100644 asm/object/objectA7.s create mode 100644 src/object/objectA7.c diff --git a/asm/object/objectA7.s b/asm/object/objectA7.s deleted file mode 100644 index 32d19498..00000000 --- a/asm/object/objectA7.s +++ /dev/null @@ -1,34 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start ObjectA7 -ObjectA7: @ 0x0809F9AC - push {r4, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xc] - cmp r0, #0 - bne _0809F9D2 - movs r0, #1 - strb r0, [r4, #0xc] - adds r2, r4, #0 - adds r2, #0x29 - ldrb r1, [r2] - subs r0, #9 - ands r0, r1 - movs r1, #6 - orrs r0, r1 - strb r0, [r2] - adds r0, r4, #0 - movs r1, #0 - bl InitializeAnimation -_0809F9D2: - adds r0, r4, #0 - bl GetNextFrame - pop {r4, pc} - .align 2, 0 diff --git a/linker.ld b/linker.ld index ba0ed04e..95ee0a28 100644 --- a/linker.ld +++ b/linker.ld @@ -791,7 +791,7 @@ SECTIONS { src/object/minishLight.o(.text); asm/object/fireballChain.o(.text); asm/object/objectA6.o(.text); - asm/object/objectA7.o(.text); + src/object/objectA7.o(.text); src/object/objectA8.o(.text); asm/object/objectA9.o(.text); src/object/waterfallOpening.o(.text); diff --git a/src/object/objectA7.c b/src/object/objectA7.c new file mode 100644 index 00000000..bfcd80ab --- /dev/null +++ b/src/object/objectA7.c @@ -0,0 +1,11 @@ +#define NENT_DEPRECATED +#include "entity.h" + +void ObjectA7(Entity* this) { + if (this->action == 0) { + this->action = 1; + this->spritePriority.b0 = 6; + InitializeAnimation(this, 0); + } + GetNextFrame(this); +} From c09173448f4a770cb1c2c39f8c89344464be7535 Mon Sep 17 00:00:00 2001 From: Tal Hayon Date: Tue, 15 Mar 2022 01:38:49 +0200 Subject: [PATCH 20/23] Decompile objectb6 --- asm/object/objectB6.s | 42 ------------------------------------------ linker.ld | 2 +- src/object/objectB6.c | 16 ++++++++++++++++ 3 files changed, 17 insertions(+), 43 deletions(-) delete mode 100644 asm/object/objectB6.s create mode 100644 src/object/objectB6.c diff --git a/asm/object/objectB6.s b/asm/object/objectB6.s deleted file mode 100644 index 7a6144ae..00000000 --- a/asm/object/objectB6.s +++ /dev/null @@ -1,42 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - thumb_func_start ObjectB6 -ObjectB6: @ 0x080A0E54 - push {r4, lr} - adds r4, r0, #0 - ldr r0, [r4, #0x50] - ldrb r0, [r0, #0xd] - cmp r0, #3 - bls _080A0E64 - bl DeleteThisEntity -_080A0E64: - ldrb r0, [r4, #0xc] - cmp r0, #0 - bne _080A0E76 - movs r0, #1 - strb r0, [r4, #0xc] - ldrb r1, [r4, #0xa] - adds r0, r4, #0 - bl InitializeAnimation -_080A0E76: - ldr r0, [r4, #0x50] - ldrb r3, [r4, #0xa] - adds r1, r4, #0 - movs r2, #0 - bl sub_0806FA90 - adds r2, r4, #0 - adds r2, #0x63 - ldrb r0, [r2] - ldrb r1, [r4, #0xa] - subs r0, r0, r1 - strb r0, [r2] - adds r0, r4, #0 - bl GetNextFrame - pop {r4, pc} - .align 2, 0 diff --git a/linker.ld b/linker.ld index 95ee0a28..fcdf02bd 100644 --- a/linker.ld +++ b/linker.ld @@ -806,7 +806,7 @@ SECTIONS { src/object/objectB3.o(.text); asm/object/objectB4.o(.text); src/object/objectB5.o(.text); - asm/object/objectB6.o(.text); + src/object/objectB6.o(.text); src/object/well.o(.text); src/object/windTribeTeleporter.o(.text); asm/object/objectB9.o(.text); diff --git a/src/object/objectB6.c b/src/object/objectB6.c new file mode 100644 index 00000000..aac1f103 --- /dev/null +++ b/src/object/objectB6.c @@ -0,0 +1,16 @@ +#define NENT_DEPRECATED +#include "entity.h" +#include "coord.h" + +void ObjectB6(Entity* this) { + if (this->parent->subAction > 3) { + DeleteThisEntity(); + } + if (this->action == 0) { + this->action = 1; + InitializeAnimation(this, this->type); + } + sub_0806FA90(this->parent, this, 0, this->type); + this->spriteOffsetY = this->spriteOffsetY - this->type; + GetNextFrame(this); +} From b84b2268a26ab06ab1893556764c2548f431be80 Mon Sep 17 00:00:00 2001 From: Tal Hayon Date: Tue, 15 Mar 2022 01:40:22 +0200 Subject: [PATCH 21/23] Delete unused objectE.s --- asm/object/objectE.s | 64 -------------------------------------------- 1 file changed, 64 deletions(-) delete mode 100644 asm/object/objectE.s diff --git a/asm/object/objectE.s b/asm/object/objectE.s deleted file mode 100644 index 3e760cf7..00000000 --- a/asm/object/objectE.s +++ /dev/null @@ -1,64 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start ObjectE -ObjectE: @ 0x08084458 - push {r4, r5, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xc] - cmp r0, #0 - bne _08084472 - movs r0, #1 - strb r0, [r4, #0xc] - movs r0, #0x14 - strb r0, [r4, #0xe] - adds r0, r4, #0 - bl sub_08004168 - b _080844C2 -_08084472: - ldrb r0, [r4, #0xe] - subs r0, #1 - strb r0, [r4, #0xe] - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - cmp r0, #0xff - bne _080844C2 - movs r0, #0x2e - ldrsh r1, [r4, r0] - ldr r2, _080844C4 @ =gRoomControls - ldrh r0, [r2, #6] - subs r1, r1, r0 - asrs r1, r1, #4 - movs r3, #0x3f - ands r1, r3 - movs r5, #0x32 - ldrsh r0, [r4, r5] - ldrh r2, [r2, #8] - subs r0, r0, r2 - asrs r0, r0, #4 - ands r0, r3 - lsls r0, r0, #6 - orrs r1, r0 - adds r0, r4, #0 - adds r0, #0x38 - ldrb r2, [r0] - movs r0, #0x35 - bl sub_0807B7D8 - adds r0, r4, #0 - movs r1, #0 - movs r2, #0x40 - bl CreateFx - movs r0, #0x93 - lsls r0, r0, #1 - bl SoundReq - bl DeleteThisEntity -_080844C2: - pop {r4, r5, pc} - .align 2, 0 -_080844C4: .4byte gRoomControls From bc89db61b5984dd5796520797192657941fd74cc Mon Sep 17 00:00:00 2001 From: Tal Hayon Date: Tue, 15 Mar 2022 01:55:54 +0200 Subject: [PATCH 22/23] Decompile the rest of treeHidingPortal --- asm/object/treeHidingPortal.s | 54 ---------------------------- assets/assets.json | 5 --- data/const/object/treeHidingPortal.s | 9 ++--- linker.ld | 3 +- src/object/treeHidingPortal.c | 35 +++++++++++++++--- 5 files changed, 34 insertions(+), 72 deletions(-) delete mode 100644 asm/object/treeHidingPortal.s diff --git a/asm/object/treeHidingPortal.s b/asm/object/treeHidingPortal.s deleted file mode 100644 index 5616c883..00000000 --- a/asm/object/treeHidingPortal.s +++ /dev/null @@ -1,54 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - thumb_func_start sub_0809E9A0 -sub_0809E9A0: @ 0x0809E9A0 - push {r4, r5, r6, lr} - ldr r5, _0809E9B0 @ =gPlayerEntity - ldrb r2, [r5, #0xc] - cmp r2, #6 - beq _0809E9B4 - movs r0, #0 - b _0809E9F0 - .align 2, 0 -_0809E9B0: .4byte gPlayerEntity -_0809E9B4: - ldrb r0, [r5, #0x14] - ands r2, r0 - lsls r2, r2, #1 - ldr r0, _0809E9F4 @ =gUnk_080B4468 - adds r2, r2, r0 - movs r1, #0x2e - ldrsh r0, [r5, r1] - movs r3, #0 - ldrsh r1, [r2, r3] - adds r0, r0, r1 - ldr r4, _0809E9F8 @ =gRoomControls - ldrh r1, [r4, #6] - subs r0, r0, r1 - asrs r0, r0, #4 - movs r3, #0x3f - ands r0, r3 - movs r6, #0x32 - ldrsh r1, [r5, r6] - movs r5, #2 - ldrsh r2, [r2, r5] - adds r1, r1, r2 - ldrh r2, [r4, #8] - subs r1, r1, r2 - asrs r1, r1, #4 - ands r1, r3 - lsls r1, r1, #6 - orrs r0, r1 - movs r1, #1 - bl sub_080B1AE0 -_0809E9F0: - pop {r4, r5, r6, pc} - .align 2, 0 -_0809E9F4: .4byte gUnk_080B4468 -_0809E9F8: .4byte gRoomControls diff --git a/assets/assets.json b/assets/assets.json index c579cdea..5ac2026c 100644 --- a/assets/assets.json +++ b/assets/assets.json @@ -44799,11 +44799,6 @@ "start": 1196760, "size": 16 }, - { - "path": "treeHidingPortal/gUnk_08124364.bin", - "start": 1196900, - "size": 80 - }, { "path": "animations/gSpriteAnimations_Fan_0.bin", "start": 1197044, diff --git a/data/const/object/treeHidingPortal.s b/data/const/object/treeHidingPortal.s index 69399391..8ad175aa 100644 --- a/data/const/object/treeHidingPortal.s +++ b/data/const/object/treeHidingPortal.s @@ -4,12 +4,7 @@ .section .rodata .align 2 -gUnk_08124354:: @ 08124354 - .4byte sub_0809E83C - .4byte sub_0809E86C - .4byte sub_0809E8BC - .4byte sub_0809E8EC -gUnk_08124364:: @ 08124364 - .incbin "treeHidingPortal/gUnk_08124364.bin" + + diff --git a/linker.ld b/linker.ld index fcdf02bd..625c621c 100644 --- a/linker.ld +++ b/linker.ld @@ -780,7 +780,6 @@ SECTIONS { src/object/macroAcorn.o(.text); asm/object/object9B.o(.text); src/object/treeHidingPortal.o(.text); - asm/object/treeHidingPortal.o(.text); src/object/lightableSwitch.o(.text); src/object/treeThorns.o(.text); src/object/fan.o(.text); @@ -1532,7 +1531,7 @@ SECTIONS { src/object/macroAcorn.o(.rodata); data/const/object/object9B.o(.rodata); data/animations/object/object9B.o(.rodata); - data/const/object/treeHidingPortal.o(.rodata); + src/object/treeHidingPortal.o(.rodata); data/const/object/lightableSwitch.o(.rodata); src/object/fan.o(.rodata); data/animations/object/fan.o(.rodata); diff --git a/src/object/treeHidingPortal.c b/src/object/treeHidingPortal.c index aa450002..c4a0518a 100644 --- a/src/object/treeHidingPortal.c +++ b/src/object/treeHidingPortal.c @@ -7,12 +7,21 @@ #include "functions.h" #include "effects.h" -extern void (*const gUnk_08124354[])(Entity*); +extern const s16 gUnk_080B4468[]; -extern s16 gUnk_08124364[]; +void sub_0809E83C(Entity* this); +void sub_0809E86C(Entity* this); +void sub_0809E8BC(Entity* this); +void sub_0809E8EC(Entity* this); void TreeHidingPortal(Entity* this) { - gUnk_08124354[this->action](this); + static void (*const actionFuncs[])(Entity*) = { + sub_0809E83C, + sub_0809E86C, + sub_0809E8BC, + sub_0809E8EC, + }; + actionFuncs[this->action](this); } void sub_0809E83C(Entity* this) { @@ -61,8 +70,12 @@ void sub_0809E8EC(Entity* this) { } void sub_0809E918(Entity* this) { + static const s16 gUnk_08124364[] = { + 0, -4, 8, -4, 16, -4, 22, -4, -8, -4, -16, -4, -22, -4, 0, -12, 0, 4, 8, -12, + 8, 4, -8, -12, -8, 4, 8, -16, -8, -16, 12, -16, -12, -16, 16, -14, -16, -14, -1000, 0, + }; Entity* fx; - s16* i = gUnk_08124364; + const s16* i = gUnk_08124364; while (*i != -1000) { fx = CreateFx(this, FX_BUSH, 0); if (fx != NULL) { @@ -78,3 +91,17 @@ void sub_0809E918(Entity* this) { void sub_0809E96C(Entity* this) { CreateMinishEntrance(COORD_TO_TILE_OFFSET(this, 0x20, 0x8)); } + +u32 sub_0809E9A0(void) { + u32 rv; + const s16* ptr; + + if (gPlayerEntity.action != PLAYER_BOUNCE) { + rv = 0; + } else { + ptr = &gUnk_080B4468[gPlayerEntity.animationState & 6]; + rv = sub_080B1AE0(COORD_TO_TILE_OFFSET(&gPlayerEntity, -ptr[0], -ptr[1]), 1); + } + + return rv; +} From b3ccaa78643ca84a6e19ba3800ce7b8c0ced7ed0 Mon Sep 17 00:00:00 2001 From: Tal Hayon Date: Tue, 15 Mar 2022 02:25:17 +0200 Subject: [PATCH 23/23] Decompile object9B --- asm/object/object9B.s | 76 ------------------------------------ assets/assets.json | 5 --- data/const/object/object9B.s | 13 ------ linker.ld | 4 +- src/object/object9B.c | 42 ++++++++++++++++++++ 5 files changed, 44 insertions(+), 96 deletions(-) delete mode 100644 asm/object/object9B.s delete mode 100644 data/const/object/object9B.s create mode 100644 src/object/object9B.c diff --git a/asm/object/object9B.s b/asm/object/object9B.s deleted file mode 100644 index fbebc8cc..00000000 --- a/asm/object/object9B.s +++ /dev/null @@ -1,76 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start Object9B -Object9B: @ 0x0809E7A8 - push {lr} - ldr r2, _0809E7BC @ =gUnk_081242D0 - ldrb r1, [r0, #0xc] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_0809E7BC: .4byte gUnk_081242D0 - - thumb_func_start sub_0809E7C0 -sub_0809E7C0: @ 0x0809E7C0 - push {r4, lr} - adds r4, r0, #0 - movs r0, #1 - strb r0, [r4, #0xc] - ldrb r0, [r4, #0xb] - cmp r0, #0xff - beq _0809E7D4 - adds r0, r4, #0 - bl sub_0809E7FC -_0809E7D4: - ldrb r1, [r4, #0xa] - adds r0, r4, #0 - bl InitializeAnimation - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_0809E7E0 -sub_0809E7E0: @ 0x0809E7E0 - push {r4, lr} - adds r4, r0, #0 - bl GetNextFrame - adds r4, #0x5a - ldrb r1, [r4] - movs r0, #0x80 - ands r0, r1 - cmp r0, #0 - beq _0809E7F8 - bl DeleteThisEntity -_0809E7F8: - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_0809E7FC -sub_0809E7FC: @ 0x0809E7FC - push {lr} - adds r1, r0, #0 - ldrb r3, [r1, #0xb] - lsls r3, r3, #1 - ldr r0, _0809E820 @ =gUnk_081242D8 - adds r3, r3, r0 - ldr r0, [r1, #0x50] - movs r2, #0 - ldrsb r2, [r3, r2] - lsls r2, r2, #0x10 - ldrb r3, [r3, #1] - lsls r3, r3, #0x18 - asrs r3, r3, #0x18 - lsls r3, r3, #0x10 - bl PositionRelative - pop {pc} - .align 2, 0 -_0809E820: .4byte gUnk_081242D8 diff --git a/assets/assets.json b/assets/assets.json index 5ac2026c..9d736c37 100644 --- a/assets/assets.json +++ b/assets/assets.json @@ -44794,11 +44794,6 @@ "size": 40, "type": "animation" }, - { - "path": "object9B/gUnk_081242D8.bin", - "start": 1196760, - "size": 16 - }, { "path": "animations/gSpriteAnimations_Fan_0.bin", "start": 1197044, diff --git a/data/const/object/object9B.s b/data/const/object/object9B.s deleted file mode 100644 index 224206d4..00000000 --- a/data/const/object/object9B.s +++ /dev/null @@ -1,13 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - .align 2 - - -gUnk_081242D0:: @ 081242D0 - .4byte sub_0809E7C0 - .4byte sub_0809E7E0 - -gUnk_081242D8:: @ 081242D8 - .incbin "object9B/gUnk_081242D8.bin" diff --git a/linker.ld b/linker.ld index 625c621c..c87bb22a 100644 --- a/linker.ld +++ b/linker.ld @@ -778,7 +778,7 @@ SECTIONS { asm/object/object98.o(.text); asm/object/object99.o(.text); src/object/macroAcorn.o(.text); - asm/object/object9B.o(.text); + src/object/object9B.o(.text); src/object/treeHidingPortal.o(.text); src/object/lightableSwitch.o(.text); src/object/treeThorns.o(.text); @@ -1529,7 +1529,7 @@ SECTIONS { data/const/object/object98.o(.rodata); data/animations/object/object98.o(.rodata); src/object/macroAcorn.o(.rodata); - data/const/object/object9B.o(.rodata); + src/object/object9B.o(.rodata); data/animations/object/object9B.o(.rodata); src/object/treeHidingPortal.o(.rodata); data/const/object/lightableSwitch.o(.rodata); diff --git a/src/object/object9B.c b/src/object/object9B.c new file mode 100644 index 00000000..1f88aefa --- /dev/null +++ b/src/object/object9B.c @@ -0,0 +1,42 @@ +#define NENT_DEPRECATED +#include "entity.h" +#include "coord.h" + +void sub_0809E7C0(Entity*); +void sub_0809E7E0(Entity*); +void sub_0809E7FC(Entity*); + +void Object9B(Entity* this) { + static void (*const actionFuncs[])(Entity*) = { + sub_0809E7C0, + sub_0809E7E0, + }; + + actionFuncs[this->action]((Entity*)this); +} + +void sub_0809E7C0(Entity* this) { + this->action = 1; + if (this->type2 != 0xff) { + sub_0809E7FC(this); + } + InitializeAnimation(this, this->type); +} + +void sub_0809E7E0(Entity* this) { + GetNextFrame(this); + if (this->frame & 0x80) { + DeleteThisEntity(); + } +} + +void sub_0809E7FC(Entity* this) { + static const s8 gUnk_081242D8[] = { + 0, -24, 16, -16, 24, 0, 16, 16, 0, 24, -16, 16, -24, 0, -16, -16, + }; + int iVar1; + const s8* ptr; + + ptr = &gUnk_081242D8[this->type2 * 2]; + PositionRelative(this->parent, this, ptr[0] << 0x10, ptr[1] << 0x10); +}