From 5b454deef60e3db1e739e8be8152cbe76ac9bc84 Mon Sep 17 00:00:00 2001 From: Behemoth Date: Mon, 21 Sep 2020 21:55:41 +0200 Subject: [PATCH] decompile FallingBoulder --- asm/fallingBoulder.s | 579 ------------------ .../fallingBoulder/sub_0802C334.inc | 193 ++++++ data/animations/fallingBoulder.s | 13 + data/data_080CC6FC.s | 24 - linker.ld | 4 +- src/enemy/fallingBoulder.c | 254 ++++++++ 6 files changed, 463 insertions(+), 604 deletions(-) delete mode 100644 asm/fallingBoulder.s create mode 100644 asm/non_matching/fallingBoulder/sub_0802C334.inc create mode 100644 data/animations/fallingBoulder.s create mode 100644 src/enemy/fallingBoulder.c diff --git a/asm/fallingBoulder.s b/asm/fallingBoulder.s deleted file mode 100644 index 9fbcfe62..00000000 --- a/asm/fallingBoulder.s +++ /dev/null @@ -1,579 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start FallingBoulder -FallingBoulder: @ 0x0802C228 - push {lr} - ldr r1, _0802C234 @ =gUnk_080CD540 - bl EnemyFunctionHandler - pop {pc} - .align 2, 0 -_0802C234: .4byte gUnk_080CD540 - - thumb_func_start sub_0802C238 -sub_0802C238: @ 0x0802C238 - push {lr} - ldr r2, _0802C24C @ =gUnk_080CD558 - ldrb r1, [r0, #0xc] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_0802C24C: .4byte gUnk_080CD558 - - thumb_func_start sub_0802C250 -sub_0802C250: @ 0x0802C250 - bx lr - .align 2, 0 - - thumb_func_start sub_0802C254 -sub_0802C254: @ 0x0802C254 - bx lr - .align 2, 0 - - thumb_func_start sub_0802C258 -sub_0802C258: @ 0x0802C258 - push {r4, r5, lr} - adds r4, r0, #0 - bl sub_0804A720 - movs r0, #0x80 - lsls r0, r0, #0xa - str r0, [r4, #0x20] - movs r0, #2 - strb r0, [r4, #0xe] - bl Random - adds r2, r0, #0 - movs r0, #0x70 - ands r2, r0 - adds r3, r4, #0 - adds r3, #0x7a - movs r1, #0 - strh r2, [r3] - ldrb r0, [r4, #0xa] - cmp r0, #1 - beq _0802C288 - cmp r0, #2 - beq _0802C290 - b _0802C29C -_0802C288: - movs r0, #0x80 - lsls r0, r0, #1 - adds r1, r0, #0 - b _0802C296 -_0802C290: - movs r5, #0x80 - lsls r5, r5, #2 - adds r1, r5, #0 -_0802C296: - adds r0, r2, #0 - orrs r0, r1 - strh r0, [r3] -_0802C29C: - ldrh r1, [r4, #0x2e] - adds r0, r4, #0 - adds r0, #0x80 - movs r2, #0 - strh r1, [r0] - ldrh r0, [r4, #0x32] - adds r1, r4, #0 - adds r1, #0x82 - strh r0, [r1] - ldr r0, _0802C310 @ =0x0000FFF0 - strh r0, [r4, #0x36] - subs r1, #0x4a - movs r0, #3 - strb r0, [r1] - ldrb r1, [r4, #0x19] - movs r0, #0x3f - ands r0, r1 - movs r1, #0x40 - orrs r0, r1 - strb r0, [r4, #0x19] - adds r3, r4, #0 - adds r3, #0x29 - ldrb r1, [r3] - movs r0, #8 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #2 - orrs r0, r1 - strb r0, [r3] - adds r0, r4, #0 - adds r0, #0x7c - strh r2, [r0] - movs r0, #0x2e - ldrsh r1, [r4, r0] - ldr r2, _0802C314 @ =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, #0x7e - strh r1, [r0] - adds r0, r4, #0 - bl sub_0802C62C - adds r0, r4, #0 - bl sub_0802C4B0 - pop {r4, r5, pc} - .align 2, 0 -_0802C310: .4byte 0x0000FFF0 -_0802C314: .4byte gRoomControls - - thumb_func_start sub_0802C318 -sub_0802C318: @ 0x0802C318 - push {lr} - adds r2, r0, #0 - adds r1, r2, #0 - adds r1, #0x7a - ldrh r0, [r1] - subs r0, #1 - strh r0, [r1] - lsls r0, r0, #0x10 - cmp r0, #0 - bne _0802C330 - movs r0, #2 - strb r0, [r2, #0xc] -_0802C330: - pop {pc} - .align 2, 0 - - thumb_func_start sub_0802C334 -sub_0802C334: @ 0x0802C334 - push {r4, r5, r6, r7, lr} - adds r4, r0, #0 - adds r3, r4, #0 - adds r3, #0x7c - ldrh r0, [r3] - cmp r0, #0 - bne _0802C36A - ldr r0, _0802C3C4 @ =gRoomControls - ldrh r1, [r0, #8] - ldr r2, _0802C3C8 @ =gPlayerEntity - cmp r2, #0 - bne _0802C34E - b _0802C4AA -_0802C34E: - movs r5, #0x32 - ldrsh r0, [r2, r5] - subs r0, r0, r1 - cmp r0, #0x38 - bhi _0802C35A - b _0802C4AA -_0802C35A: - movs r0, #1 - strh r0, [r3] - ldrb r1, [r4, #0x18] - subs r0, #5 - ands r0, r1 - movs r1, #1 - orrs r0, r1 - strb r0, [r4, #0x18] -_0802C36A: - adds r0, r4, #0 - bl GetNextFrame - movs r0, #0x2e - ldrsh r1, [r4, r0] - ldr r2, _0802C3C4 @ =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, #0x7e - strh r1, [r0] - adds r0, #6 - ldr r1, [r0] - adds r0, r4, #0 - bl sub_080044EC - cmp r0, #1 - bne _0802C3CC - movs r0, #0xa6 - lsls r0, r0, #1 - bl EnqueueSFX - ldrb r1, [r4, #0x10] - movs r0, #0x80 - orrs r0, r1 - strb r0, [r4, #0x10] - adds r1, r4, #0 - adds r1, #0x7a - movs r0, #0xc - strh r0, [r1] - adds r0, r4, #0 - bl sub_0802C4B0 - b _0802C48C - .align 2, 0 -_0802C3C4: .4byte gRoomControls -_0802C3C8: .4byte gPlayerEntity -_0802C3CC: - adds r0, r4, #0 - adds r0, #0x7a - ldrh r1, [r0] - adds r7, r0, #0 - cmp r1, #0 - beq _0802C442 - subs r0, r1, #1 - strh r0, [r7] - lsls r0, r0, #0x10 - lsrs r0, r0, #0x10 - cmp r0, #0 - beq _0802C3EA - cmp r0, #8 - beq _0802C3F4 - b _0802C442 -_0802C3EA: - ldrb r1, [r4, #0x10] - movs r0, #0x7f - ands r0, r1 - strb r0, [r4, #0x10] - b _0802C442 -_0802C3F4: - ldrb r0, [r4, #0xb] - cmp r0, #0 - beq _0802C442 - adds r0, r4, #0 - bl sub_08049FA0 - cmp r0, #0 - bne _0802C442 - movs r6, #0 - movs r5, #1 -_0802C408: - adds r0, r4, #0 - movs r1, #0x15 - movs r2, #0 - bl CreateFx - adds r2, r0, #0 - cmp r2, #0 - beq _0802C420 - ldrh r0, [r2, #0x2e] - adds r0, #0xc - subs r0, r0, r6 - strh r0, [r2, #0x2e] -_0802C420: - adds r6, #0x18 - subs r5, #1 - cmp r5, #0 - bge _0802C408 - adds r0, r4, #0 - bl sub_0802C62C - bl Random - movs r1, #0xff - ands r0, r1 - movs r2, #0x80 - lsls r2, r2, #1 - adds r1, r2, #0 - orrs r0, r1 - strh r0, [r7] - b _0802C4AA -_0802C442: - ldr r0, _0802C45C @ =gRoomControls - ldrh r1, [r0, #8] - ldrh r0, [r0, #0x20] - adds r1, r1, r0 - movs r5, #0x32 - ldrsh r0, [r4, r5] - subs r5, r1, r0 - cmp r5, #4 - ble _0802C460 - adds r0, r4, #0 - bl sub_080AEFB4 - b _0802C48C - .align 2, 0 -_0802C45C: .4byte gRoomControls -_0802C460: - adds r0, r4, #0 - bl sub_0806F69C - movs r1, #0x36 - ldrsh r0, [r4, r1] - subs r0, r0, r5 - cmp r0, #0x38 - ble _0802C48C - adds r0, r4, #0 - bl sub_0802C62C - bl Random - movs r1, #0x7f - ands r0, r1 - movs r1, #0x80 - orrs r0, r1 - strh r0, [r7] - ldrb r0, [r4, #0xa] - cmp r0, #3 - bne _0802C48C - strb r0, [r4, #0xc] -_0802C48C: - adds r1, r4, #0 - adds r1, #0x38 - movs r0, #3 - strb r0, [r1] - adds r2, r4, #0 - adds r2, #0x29 - ldrb r1, [r2] - subs r0, #0xb - ands r0, r1 - movs r1, #1 - orrs r0, r1 - strb r0, [r2] - adds r0, r4, #0 - bl UpdateSpriteForCollisionLayer -_0802C4AA: - pop {r4, r5, r6, r7, pc} - - thumb_func_start nullsub_148 -nullsub_148: @ 0x0802C4AC - bx lr - .align 2, 0 - - thumb_func_start sub_0802C4B0 -sub_0802C4B0: @ 0x0802C4B0 - push {r4, r5, r6, lr} - adds r5, r0, #0 - adds r0, #0x7e - ldrh r0, [r0] - adds r1, r5, #0 - adds r1, #0x38 - ldrb r1, [r1] - bl sub_080001DA - adds r1, r0, #0 - ldr r0, _0802C4D8 @ =0x000001AB - cmp r1, r0 - blo _0802C4E4 - adds r0, #4 - cmp r1, r0 - bls _0802C4DC - adds r0, #0x15 - cmp r1, r0 - beq _0802C4E0 - b _0802C4E4 - .align 2, 0 -_0802C4D8: .4byte 0x000001AB -_0802C4DC: - movs r6, #8 - b _0802C4E6 -_0802C4E0: - movs r6, #4 - b _0802C4E6 -_0802C4E4: - movs r6, #0 -_0802C4E6: - bl Random - adds r4, r0, #0 - movs r0, #7 - ands r4, r0 - movs r0, #4 - ands r0, r4 - cmp r0, #0 - beq _0802C518 - movs r0, #3 - ands r4, r0 - cmp r4, #0 - beq _0802C50C - ldr r0, _0802C508 @ =gUnk_080CD568 - movs r1, #2 - orrs r1, r6 - b _0802C532 - .align 2, 0 -_0802C508: .4byte gUnk_080CD568 -_0802C50C: - ldr r0, _0802C514 @ =gUnk_080CD568 - lsls r1, r6, #1 - b _0802C534 - .align 2, 0 -_0802C514: .4byte gUnk_080CD568 -_0802C518: - movs r2, #3 - ands r4, r2 - cmp r4, #0 - beq _0802C52C - ldr r0, _0802C528 @ =gUnk_080CD568 - movs r1, #1 - orrs r1, r6 - b _0802C532 - .align 2, 0 -_0802C528: .4byte gUnk_080CD568 -_0802C52C: - ldr r0, _0802C570 @ =gUnk_080CD568 - adds r1, r6, #0 - orrs r1, r2 -_0802C532: - lsls r1, r1, #1 -_0802C534: - adds r1, r1, r0 - ldrh r0, [r1] - strh r0, [r5, #0x24] - bl Random - adds r4, r0, #0 - movs r0, #7 - ands r4, r0 - movs r0, #4 - ands r0, r4 - cmp r0, #0 - beq _0802C584 - ldrb r0, [r5, #0xe] - cmp r0, #0 - beq _0802C55E - movs r0, #0 - strb r0, [r5, #0xe] - adds r0, r5, #0 - movs r1, #0 - bl InitializeAnimation -_0802C55E: - movs r0, #3 - ands r4, r0 - cmp r4, #0 - beq _0802C578 - ldr r0, _0802C574 @ =gUnk_080CD580 - movs r1, #1 - orrs r1, r6 - b _0802C5B2 - .align 2, 0 -_0802C570: .4byte gUnk_080CD568 -_0802C574: .4byte gUnk_080CD580 -_0802C578: - ldr r0, _0802C580 @ =gUnk_080CD580 - adds r0, r6, r0 - ldrb r0, [r0] - b _0802C5B6 - .align 2, 0 -_0802C580: .4byte gUnk_080CD580 -_0802C584: - ldrb r0, [r5, #0xe] - cmp r0, #1 - beq _0802C596 - movs r0, #1 - strb r0, [r5, #0xe] - adds r0, r5, #0 - movs r1, #1 - bl InitializeAnimation -_0802C596: - movs r2, #3 - ands r4, r2 - cmp r4, #0 - beq _0802C5AC - ldr r0, _0802C5A8 @ =gUnk_080CD580 - movs r1, #2 - orrs r1, r6 - b _0802C5B2 - .align 2, 0 -_0802C5A8: .4byte gUnk_080CD580 -_0802C5AC: - ldr r0, _0802C5E4 @ =gUnk_080CD580 - adds r1, r6, #0 - orrs r1, r2 -_0802C5B2: - adds r1, r1, r0 - ldrb r0, [r1] -_0802C5B6: - strb r0, [r5, #0x15] - bl Random - adds r4, r0, #0 - movs r0, #7 - ands r4, r0 - movs r0, #0x80 - lsls r0, r0, #0xa - str r0, [r5, #0x20] - movs r0, #4 - ands r0, r4 - cmp r0, #0 - beq _0802C5FC - movs r0, #3 - ands r4, r0 - cmp r4, #0 - beq _0802C5EC - adds r2, r5, #0 - adds r2, #0x84 - ldr r1, _0802C5E8 @ =gUnk_080CD58C - movs r0, #1 - orrs r6, r0 - b _0802C61A - .align 2, 0 -_0802C5E4: .4byte gUnk_080CD580 -_0802C5E8: .4byte gUnk_080CD58C -_0802C5EC: - adds r2, r5, #0 - adds r2, #0x84 - ldr r1, _0802C5F8 @ =gUnk_080CD58C - orrs r6, r0 - b _0802C61A - .align 2, 0 -_0802C5F8: .4byte gUnk_080CD58C -_0802C5FC: - movs r0, #3 - ands r4, r0 - cmp r4, #0 - beq _0802C614 - adds r2, r5, #0 - adds r2, #0x84 - ldr r1, _0802C610 @ =gUnk_080CD58C - movs r0, #2 - orrs r6, r0 - b _0802C61A - .align 2, 0 -_0802C610: .4byte gUnk_080CD58C -_0802C614: - adds r2, r5, #0 - adds r2, #0x84 - ldr r1, _0802C628 @ =gUnk_080CD58C -_0802C61A: - lsls r0, r6, #1 - adds r0, r0, r1 - movs r1, #0 - ldrsh r0, [r0, r1] - str r0, [r2] - pop {r4, r5, r6, pc} - .align 2, 0 -_0802C628: .4byte gUnk_080CD58C - - thumb_func_start sub_0802C62C -sub_0802C62C: @ 0x0802C62C - adds r3, r0, #0 - movs r2, #0 - movs r0, #1 - strb r0, [r3, #0xc] - adds r0, r3, #0 - adds r0, #0x82 - ldrh r0, [r0] - strh r0, [r3, #0x32] - adds r0, r3, #0 - adds r0, #0x80 - ldrh r0, [r0] - strh r0, [r3, #0x2e] - ldrb r1, [r3, #0x18] - movs r0, #4 - rsbs r0, r0, #0 - ands r0, r1 - strb r0, [r3, #0x18] - ldrb r1, [r3, #0x10] - movs r0, #0x7f - ands r0, r1 - strb r0, [r3, #0x10] - adds r0, r3, #0 - adds r0, #0x7c - strh r2, [r0] - bx lr - .align 2, 0 diff --git a/asm/non_matching/fallingBoulder/sub_0802C334.inc b/asm/non_matching/fallingBoulder/sub_0802C334.inc new file mode 100644 index 00000000..763973d7 --- /dev/null +++ b/asm/non_matching/fallingBoulder/sub_0802C334.inc @@ -0,0 +1,193 @@ + + .syntax unified + + .text + + push {r4, r5, r6, r7, lr} + adds r4, r0, #0 + adds r3, r4, #0 + adds r3, #0x7c + ldrh r0, [r3] + cmp r0, #0 + bne _0802C36A + ldr r0, _0802C3C4 @ =gRoomControls + ldrh r1, [r0, #8] + ldr r2, _0802C3C8 @ =gPlayerEntity + cmp r2, #0 + bne _0802C34E + b _0802C4AA +_0802C34E: + movs r5, #0x32 + ldrsh r0, [r2, r5] + subs r0, r0, r1 + cmp r0, #0x38 + bhi _0802C35A + b _0802C4AA +_0802C35A: + movs r0, #1 + strh r0, [r3] + ldrb r1, [r4, #0x18] + subs r0, #5 + ands r0, r1 + movs r1, #1 + orrs r0, r1 + strb r0, [r4, #0x18] +_0802C36A: + adds r0, r4, #0 + bl GetNextFrame + movs r0, #0x2e + ldrsh r1, [r4, r0] + ldr r2, _0802C3C4 @ =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, #0x7e + strh r1, [r0] + adds r0, #6 + ldr r1, [r0] + adds r0, r4, #0 + bl sub_080044EC + cmp r0, #1 + bne _0802C3CC + movs r0, #0xa6 + lsls r0, r0, #1 + bl EnqueueSFX + ldrb r1, [r4, #0x10] + movs r0, #0x80 + orrs r0, r1 + strb r0, [r4, #0x10] + adds r1, r4, #0 + adds r1, #0x7a + movs r0, #0xc + strh r0, [r1] + adds r0, r4, #0 + bl sub_0802C4B0 + b _0802C48C + .align 2, 0 +_0802C3C4: .4byte gRoomControls +_0802C3C8: .4byte gPlayerEntity +_0802C3CC: + adds r0, r4, #0 + adds r0, #0x7a + ldrh r1, [r0] + adds r7, r0, #0 + cmp r1, #0 + beq _0802C442 + subs r0, r1, #1 + strh r0, [r7] + lsls r0, r0, #0x10 + lsrs r0, r0, #0x10 + cmp r0, #0 + beq _0802C3EA + cmp r0, #8 + beq _0802C3F4 + b _0802C442 +_0802C3EA: + ldrb r1, [r4, #0x10] + movs r0, #0x7f + ands r0, r1 + strb r0, [r4, #0x10] + b _0802C442 +_0802C3F4: + ldrb r0, [r4, #0xb] + cmp r0, #0 + beq _0802C442 + adds r0, r4, #0 + bl sub_08049FA0 + cmp r0, #0 + bne _0802C442 + movs r6, #0 + movs r5, #1 +_0802C408: + adds r0, r4, #0 + movs r1, #0x15 + movs r2, #0 + bl CreateFx + adds r2, r0, #0 + cmp r2, #0 + beq _0802C420 + ldrh r0, [r2, #0x2e] + adds r0, #0xc + subs r0, r0, r6 + strh r0, [r2, #0x2e] +_0802C420: + adds r6, #0x18 + subs r5, #1 + cmp r5, #0 + bge _0802C408 + adds r0, r4, #0 + bl sub_0802C62C + bl Random + movs r1, #0xff + ands r0, r1 + movs r2, #0x80 + lsls r2, r2, #1 + adds r1, r2, #0 + orrs r0, r1 + strh r0, [r7] + b _0802C4AA +_0802C442: + ldr r0, _0802C45C @ =gRoomControls + ldrh r1, [r0, #8] + ldrh r0, [r0, #0x20] + adds r1, r1, r0 + movs r5, #0x32 + ldrsh r0, [r4, r5] + subs r5, r1, r0 + cmp r5, #4 + ble _0802C460 + adds r0, r4, #0 + bl sub_080AEFB4 + b _0802C48C + .align 2, 0 +_0802C45C: .4byte gRoomControls +_0802C460: + adds r0, r4, #0 + bl sub_0806F69C + movs r1, #0x36 + ldrsh r0, [r4, r1] + subs r0, r0, r5 + cmp r0, #0x38 + ble _0802C48C + adds r0, r4, #0 + bl sub_0802C62C + bl Random + movs r1, #0x7f + ands r0, r1 + movs r1, #0x80 + orrs r0, r1 + strh r0, [r7] + ldrb r0, [r4, #0xa] + cmp r0, #3 + bne _0802C48C + strb r0, [r4, #0xc] +_0802C48C: + adds r1, r4, #0 + adds r1, #0x38 + movs r0, #3 + strb r0, [r1] + adds r2, r4, #0 + adds r2, #0x29 + ldrb r1, [r2] + subs r0, #0xb + ands r0, r1 + movs r1, #1 + orrs r0, r1 + strb r0, [r2] + adds r0, r4, #0 + bl UpdateSpriteForCollisionLayer +_0802C4AA: + pop {r4, r5, r6, r7, pc} + + .syntax divided diff --git a/data/animations/fallingBoulder.s b/data/animations/fallingBoulder.s new file mode 100644 index 00000000..234ec77a --- /dev/null +++ b/data/animations/fallingBoulder.s @@ -0,0 +1,13 @@ + .include "asm/macros.inc" + .include "constants/constants.inc" + + .section .rodata + +gUnk_080CD5A4:: @ 080CD5A4 + .incbin "baserom.gba", 0x0CD5A4, 0x0000011 + +gUnk_080CD5B5:: @ 080CD5B5 + .incbin "baserom.gba", 0x0CD5B5, 0x0000013 + +gUnk_080CD5C8:: @ 080CD5C8 + .incbin "baserom.gba", 0x0CD5C8, 0x000000C diff --git a/data/data_080CC6FC.s b/data/data_080CC6FC.s index 68a0c8f3..07e517de 100644 --- a/data/data_080CC6FC.s +++ b/data/data_080CC6FC.s @@ -3,30 +3,6 @@ .section .rodata -gUnk_080CD540:: @ 080CD540 - .incbin "baserom.gba", 0x0CD540, 0x0000018 - -gUnk_080CD558:: @ 080CD558 - .incbin "baserom.gba", 0x0CD558, 0x0000010 - -gUnk_080CD568:: @ 080CD568 - .incbin "baserom.gba", 0x0CD568, 0x0000018 - -gUnk_080CD580:: @ 080CD580 - .incbin "baserom.gba", 0x0CD580, 0x000000C - -gUnk_080CD58C:: @ 080CD58C - .incbin "baserom.gba", 0x0CD58C, 0x0000018 - -gUnk_080CD5A4:: @ 080CD5A4 - .incbin "baserom.gba", 0x0CD5A4, 0x0000011 - -gUnk_080CD5B5:: @ 080CD5B5 - .incbin "baserom.gba", 0x0CD5B5, 0x0000013 - -gUnk_080CD5C8:: @ 080CD5C8 - .incbin "baserom.gba", 0x0CD5C8, 0x000000C - gUnk_080CD5D4:: @ 080CD5D4 .incbin "baserom.gba", 0x0CD5D4, 0x0000018 diff --git a/linker.ld b/linker.ld index 4f3fe8b3..c4bf2ce8 100644 --- a/linker.ld +++ b/linker.ld @@ -358,7 +358,7 @@ SECTIONS { src/enemy/spikedBeetle.o(.text); src/enemy/sensorBladeTrap.o(.text); src/enemy/helmasaur.o(.text); - asm/fallingBoulder.o(.text); + src/enemy/fallingBoulder.o(.text); asm/bobomb.o(.text); asm/wallMaster2.o(.text); asm/gleerok.o(.text); @@ -967,6 +967,8 @@ SECTIONS { src/enemy/sensorBladeTrap.o(.rodata); src/enemy/helmasaur.o(.rodata); data/animations/helmasaur.o(.rodata); + src/enemy/fallingBoulder.o(.rodata); + data/animations/fallingBoulder.o(.rodata); data/data_080CC6FC.o(.rodata); src/enemy.o(.rodata); data/data_080D3D94.o(.rodata); diff --git a/src/enemy/fallingBoulder.c b/src/enemy/fallingBoulder.c new file mode 100644 index 00000000..435e6b21 --- /dev/null +++ b/src/enemy/fallingBoulder.c @@ -0,0 +1,254 @@ +#include "enemy.h" +#include "functions.h" + +void sub_0802C4B0(Entity*); +void sub_0802C62C(Entity*); + +extern void (*const gUnk_080CD540[])(Entity*); +extern void (*const gUnk_080CD558[])(Entity*); +extern const u16 gUnk_080CD568[]; +extern const u8 gUnk_080CD580[]; +extern const s16 gUnk_080CD58C[]; + +void FallingBoulder(Entity* this) { + EnemyFunctionHandler(this, gUnk_080CD540); +} + +void sub_0802C238(Entity* this) { + gUnk_080CD558[this->action](this); +} + +void sub_0802C250(Entity* this) { + /* ... */ +} + +void sub_0802C254(Entity* this) { + /* ... */ +} + +void sub_0802C258(Entity* this) { + sub_0804A720(this); + this->field_0x20 = 0x20000; + this->actionDelay = 2; + this->field_0x7a.HWORD = Random() & 0x70; + switch (this->entityType.form) { + case 1: + this->field_0x7a.HWORD |= 0x100; + break; + case 2: + this->field_0x7a.HWORD |= 0x200; + break; + } + this->field_0x80.HWORD = this->x.HALF.HI; + this->field_0x82.HWORD = this->y.HALF.HI; + this->height.HALF.HI = -0x10; + this->collisionLayer = 3; + this->spriteRendering.b3 = 1; + this->spritePriority.b0 = 2; + this->field_0x7c.HALF.LO = 0; + this->field_0x7c.HALF.HI = COORD_TO_TILE(this); + sub_0802C62C(this); + sub_0802C4B0(this); +} + +void sub_0802C318(Entity* this) { + if (--this->field_0x7a.HWORD == 0) { + this->action = 2; + } +} + +#if NON_MATCHING +void sub_0802C334(Entity* this) { + if ((u16)this->field_0x7c.HALF.LO == 0) { + u32 tmp = gRoomControls.roomOriginY; + if (&gPlayerEntity == NULL) + return; + if (tmp - gPlayerEntity.y.HALF.HI <= 0x38) { + return; + } + this->field_0x7c.HALF.LO = 1; + this->spriteSettings.b.draw = 1; + } + GetNextFrame(this); + this->field_0x7c.HALF.HI = COORD_TO_TILE(this); + if (sub_080044EC(this, *(u32*)&this->cutsceneBeh) == 1) { + EnqueueSFX(0x14c); + this->flags = this->flags | 0x80; + this->field_0x7a.HWORD = 0xc; + sub_0802C4B0(this); + } else { + s32 y; + + if (this->field_0x7a.HWORD) { + u16 tmp = --this->field_0x7a.HWORD; + switch (tmp) { + case 0: + this->flags &= ~0x80; + break; + case 8: + if (this->entityType.parameter != 0 && !sub_08049FA0(this)) { + u32 diff = 0; + s32 i; + for (i = 1; i > -1; i--) { + Entity* ent = CreateFx(this, 0x15, 0); + if (ent) { + ent->x.HALF.HI += 12; + ent->x.HALF.HI -= diff; + } + diff += 0x18; + } + sub_0802C62C(this); + this->field_0x7a.HWORD = Random() & 0xff | 0x100; + return; + } + break; + } + } + + y = gRoomControls.roomOriginY + gRoomControls.height - this->y.HALF.HI; + if (y >= 5) { + sub_080AEFB4(this); + } else { + sub_0806F69C(this); + if (this->height.HALF.HI - y > 0x38) { + sub_0802C62C(this); + this->field_0x7a.HWORD = (Random() & 0x7f) | 0x80; + if (this->entityType.form == 3) { + this->action = 3; + } + } + } + } + this->collisionLayer = 3; + this->spritePriority.b0 = 1; + UpdateSpriteForCollisionLayer(this); +} +#else +NAKED +void sub_0802C334(Entity* this) { + asm(".include \"asm/non_matching/fallingBoulder/sub_0802C334.inc\""); +} +#endif + +void nullsub_148(Entity* this) { + /* ... */ +} + +extern u32 sub_080001DA(u32, u32); + +void sub_0802C4B0(Entity* this) { + u32 offset; + u32 index; + u32 rand; + + switch (sub_080001DA(this->field_0x7c.HALF_U.HI, this->collisionLayer)) { + case 0x1ab ... 0x1af: + offset = 8; + break; + case 0x1c4: + offset = 4; + break; + default: + offset = 0; + break; + } + + rand = Random() & 7; + if (rand & 4) { + if (rand & 3) { + this->nonPlanarMovement = gUnk_080CD568[offset | 2]; + } else { + this->nonPlanarMovement = gUnk_080CD568[offset | 0]; + } + } else { + if (rand & 3) { + this->nonPlanarMovement = gUnk_080CD568[offset | 1]; + } else { + this->nonPlanarMovement = gUnk_080CD568[offset | 3]; + } + } + + rand = Random() & 7; + if (rand & 4) { + if (this->actionDelay != 0) { + this->actionDelay = 0; + InitializeAnimation(this, 0); + } + if (rand & 3) { + this->direction = gUnk_080CD580[offset | 1]; + } else { + this->direction = gUnk_080CD580[offset | 0]; + } + } else { + if (this->actionDelay != 1) { + this->actionDelay = 1; + InitializeAnimation(this, 1); + } + if (rand & 3) { + this->direction = gUnk_080CD580[offset | 2]; + } else { + this->direction = gUnk_080CD580[offset | 3]; + } + } + + rand = Random() & 7; + this->field_0x20 = 0x20000; + if (rand & 4) { + if (rand & 3) { + *(u32*)&this->cutsceneBeh = gUnk_080CD58C[offset | 1]; + } else { + *(u32*)&this->cutsceneBeh = gUnk_080CD58C[offset | 3]; + } + } else { + if (rand & 3) { + *(u32*)&this->cutsceneBeh = gUnk_080CD58C[offset | 2]; + } else { + *(u32*)&this->cutsceneBeh = gUnk_080CD58C[offset | 0]; + } + } +} + +void sub_0802C62C(Entity *this) { + this->action = 1; + this->y.HALF.HI = this->field_0x82.HWORD; + this->x.HALF.HI = this->field_0x80.HWORD; + this->spriteSettings.b.draw = 0; + this->flags &= ~0x80; + this->field_0x7c.HALF.LO = 0; +} + +// clang-format off +void (*const gUnk_080CD540[])(Entity*) = { + sub_0802C238, + sub_0802C250, + sub_08001324, + sub_0804A7D4, + sub_08001242, + sub_0802C254, +}; + +void (*const gUnk_080CD558[])(Entity*) = { + sub_0802C258, + sub_0802C318, + sub_0802C334, + nullsub_148, +}; + +const u16 gUnk_080CD568[] = { + 0x80, 0x100, 0x180, 0x200, + 0x80, 0x100, 0x180, 0x200, + 0x100, 0x200, 0x300, 0x400, +}; + +const u8 gUnk_080CD580[] = { + 10, 14, 18, 22, + 10, 14, 18, 22, + 10, 14, 18, 22, +}; + +const s16 gUnk_080CD58C[] = { + 0x1800, 0x2000, 0x2800, 0x3000, + 0x1800, 0x2000, 0x2800, 0x3000, + 0x1800, 0x2000, 0x2800, 0x3000, +}; +// clang-format on