From 6fe3168caf5726f1800902df53e8f0e0fc29ea7e Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Sun, 29 Jun 2025 15:43:41 -0700 Subject: [PATCH] move most ground_effects funcs to src --- asm/ground_effect.s | 677 ------------------------------------------ data/data_8115F5C_1.s | 8 - ld_script.ld | 1 - src/ground_effect.c | 448 ++++++++++++++++++++++++++-- 4 files changed, 427 insertions(+), 707 deletions(-) delete mode 100644 asm/ground_effect.s diff --git a/asm/ground_effect.s b/asm/ground_effect.s deleted file mode 100644 index 7c046cbfe..000000000 --- a/asm/ground_effect.s +++ /dev/null @@ -1,677 +0,0 @@ - #include "asm/constants/gba_constants.inc" - #include "asm/macros.inc" - - .syntax unified - - .text - - - thumb_func_start sub_80AD3E0 -sub_80AD3E0: - push {r4-r7,lr} - mov r12, r0 - ldr r3, [r1] - ldr r2, [r0, 0x14] - subs r6, r3, r2 - ldr r1, [r1, 0x4] - ldr r0, [r0, 0x18] - subs r7, r1, r0 - adds r4, r3, r2 - adds r5, r1, r0 - mov r1, r12 - ldr r0, [r1, 0x28] - cmp r6, r0 - blt _080AD40E - ldr r0, [r1, 0x30] - cmp r4, r0 - bge _080AD40E - ldr r0, [r1, 0x2C] - cmp r7, r0 - blt _080AD40E - ldr r0, [r1, 0x34] - cmp r5, r0 - blt _080AD412 -_080AD40E: - movs r0, 0x1 - b _080AD428 -_080AD412: - movs r0, 0x92 - lsls r0, 1 - add r0, r12 - str r6, [r0] - str r7, [r0, 0x4] - movs r0, 0x96 - lsls r0, 1 - add r0, r12 - str r4, [r0] - str r5, [r0, 0x4] - movs r0, 0 -_080AD428: - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end sub_80AD3E0 - - thumb_func_start sub_80AD430 -sub_80AD430: - push {r4-r6,lr} - mov r12, r0 - movs r0, 0x92 - lsls r0, 1 - add r0, r12 - ldr r0, [r0] - ldr r2, [r1] - adds r5, r0, r2 - movs r0, 0x94 - lsls r0, 1 - add r0, r12 - ldr r0, [r0] - ldr r1, [r1, 0x4] - adds r6, r0, r1 - movs r0, 0x96 - lsls r0, 1 - add r0, r12 - ldr r0, [r0] - adds r3, r0, r2 - movs r0, 0x98 - lsls r0, 1 - add r0, r12 - ldr r0, [r0] - adds r4, r0, r1 - mov r0, r12 - ldr r1, [r0, 0x28] - cmp r5, r1 - bge _080AD470 - adds r5, r1, 0 - ldr r0, [r0, 0xC] - adds r3, r1, r0 - b _080AD47E -_080AD470: - mov r2, r12 - ldr r1, [r2, 0x30] - cmp r3, r1 - blt _080AD47E - ldr r0, [r2, 0xC] - subs r5, r1, r0 - adds r3, r1, 0 -_080AD47E: - mov r0, r12 - ldr r1, [r0, 0x2C] - cmp r6, r1 - bge _080AD48E - adds r6, r1, 0 - ldr r0, [r0, 0x10] - adds r4, r1, r0 - b _080AD49C -_080AD48E: - mov r2, r12 - ldr r1, [r2, 0x34] - cmp r4, r1 - blt _080AD49C - ldr r0, [r2, 0x10] - subs r6, r1, r0 - adds r4, r1, 0 -_080AD49C: - movs r0, 0x92 - lsls r0, 1 - add r0, r12 - str r5, [r0] - str r6, [r0, 0x4] - movs r0, 0x96 - lsls r0, 1 - add r0, r12 - str r3, [r0] - str r4, [r0, 0x4] - movs r0, 0 - pop {r4-r6} - pop {r1} - bx r1 - thumb_func_end sub_80AD430 - - thumb_func_start CallbackEffectGetIndex -CallbackEffectGetIndex: - movs r1, 0x4 - ldrsh r0, [r0, r1] - bx lr - thumb_func_end CallbackEffectGetIndex - - thumb_func_start CallbackEffectGetSize -CallbackEffectGetSize: - ldr r2, [r0, 0xC] - ldr r3, [r0, 0x10] - str r2, [r1] - str r3, [r1, 0x4] - bx lr - thumb_func_end CallbackEffectGetSize - - thumb_func_start CallbackEffectSetHitboxPos -CallbackEffectSetHitboxPos: - push {r4,lr} - adds r3, r0, 0 - adds r4, r1, 0 - cmp r4, 0 - beq _080AD50C - movs r0, 0x92 - lsls r0, 1 - adds r2, r3, r0 - ldr r1, [r4] - ldr r0, [r3, 0x14] - subs r0, r1, r0 - str r0, [r2] - movs r0, 0x96 - lsls r0, 1 - adds r2, r3, r0 - ldr r0, [r3, 0x14] - adds r1, r0 - str r1, [r2] - movs r0, 0x94 - lsls r0, 1 - adds r2, r3, r0 - ldr r1, [r4, 0x4] - ldr r0, [r3, 0x18] - subs r0, r1, r0 - str r0, [r2] - movs r0, 0x98 - lsls r0, 1 - adds r2, r3, r0 - ldr r0, [r3, 0x18] - adds r1, r0 - str r1, [r2] - b _080AD572 -_080AD50C: - movs r0, 0x92 - lsls r0, 1 - adds r2, r3, r0 - ldr r0, [r3, 0x20] - ldr r1, [r3, 0x14] - subs r0, r1 - str r0, [r2] - movs r0, 0x96 - lsls r0, 1 - adds r2, r3, r0 - ldr r0, [r3, 0x20] - ldr r1, [r3, 0x14] - adds r0, r1 - str r0, [r2] - movs r0, 0x94 - lsls r0, 1 - adds r2, r3, r0 - ldr r0, [r3, 0x24] - ldr r1, [r3, 0x18] - subs r0, r1 - str r0, [r2] - movs r0, 0x98 - lsls r0, 1 - adds r2, r3, r0 - ldr r0, [r3, 0x24] - ldr r1, [r3, 0x18] - adds r0, r1 - str r0, [r2] - movs r2, 0x9A - lsls r2, 1 - adds r1, r3, r2 - adds r2, 0x4 - adds r0, r3, r2 - str r4, [r0] - str r4, [r1] - movs r0, 0x90 - lsls r0, 1 - adds r2, r3, r0 - movs r1, 0 - ldrsb r1, [r2, r1] - movs r0, 0x1C - ldrsb r0, [r3, r0] - cmp r1, r0 - beq _080AD56E - movs r0, 0x9E - lsls r0, 1 - adds r1, r3, r0 - movs r0, 0x1 - strb r0, [r1] -_080AD56E: - ldrb r0, [r3, 0x1C] - strb r0, [r2] -_080AD572: - pop {r4} - pop {r0} - bx r0 - thumb_func_end CallbackEffectSetHitboxPos - - thumb_func_start CallbackEffectSetPositionBounds -CallbackEffectSetPositionBounds: - push {r4,lr} - ldr r3, [r1] - ldr r4, [r1, 0x4] - str r3, [r0, 0x28] - str r4, [r0, 0x2C] - ldr r1, [r2] - ldr r2, [r2, 0x4] - str r1, [r0, 0x30] - str r2, [r0, 0x34] - pop {r4} - pop {r0} - bx r0 - thumb_func_end CallbackEffectSetPositionBounds - - thumb_func_start CallbackEffectGetHitboxCenter -CallbackEffectGetHitboxCenter: - adds r3, r0, 0 - movs r2, 0x92 - lsls r2, 1 - adds r0, r3, r2 - ldr r0, [r0] - ldr r2, [r3, 0x14] - adds r0, r2 - str r0, [r1] - movs r2, 0x94 - lsls r2, 1 - adds r0, r3, r2 - ldr r0, [r0] - ldr r2, [r3, 0x18] - adds r0, r2 - str r0, [r1, 0x4] - bx lr - thumb_func_end CallbackEffectGetHitboxCenter - - thumb_func_start CallbackEffectMoveReal -CallbackEffectMoveReal: - push {lr} - bl sub_80AD3E0 - pop {r1} - bx r1 - thumb_func_end CallbackEffectMoveReal - - thumb_func_start CallbackEffectGetPosHeightAndUnk -CallbackEffectGetPosHeightAndUnk: - push {r4,lr} - adds r3, r0, 0 - movs r4, 0x9A - lsls r4, 1 - adds r0, r3, r4 - ldr r0, [r0] - str r0, [r1] - movs r1, 0x9C - lsls r1, 1 - adds r0, r3, r1 - ldr r0, [r0] - str r0, [r2] - pop {r4} - pop {r0} - bx r0 - thumb_func_end CallbackEffectGetPosHeightAndUnk - - thumb_func_start CallbackEffectSetPosHeight -CallbackEffectSetPosHeight: - movs r2, 0x9A - lsls r2, 1 - adds r0, r2 - str r1, [r0] - bx lr - thumb_func_end CallbackEffectSetPosHeight - - thumb_func_start CallbackEffectGetDirection -CallbackEffectGetDirection: - movs r2, 0x90 - lsls r2, 1 - adds r0, r2 - ldrb r0, [r0] - strb r0, [r1] - bx lr - thumb_func_end CallbackEffectGetDirection - - thumb_func_start CallbackEffectSetDirection -CallbackEffectSetDirection: - push {lr} - adds r2, r0, 0 - lsls r1, 24 - asrs r1, 24 - movs r0, 0x1 - negs r0, r0 - cmp r1, r0 - beq _080AD60C - movs r3, 0x90 - lsls r3, 1 - adds r0, r2, r3 - strb r1, [r0] -_080AD60C: - pop {r0} - bx r0 - thumb_func_end CallbackEffectSetDirection - - thumb_func_start CallbackEffectSetEventIndex -CallbackEffectSetEventIndex: - push {r4,r5,lr} - lsls r1, 16 - adds r3, r0, 0 - movs r0, 0xFF - lsls r0, 16 - ands r0, r1 - lsrs r0, 16 - cmp r0, 0 - beq _080AD630 - ldr r1, _080AD62C - lsls r0, 1 - adds r0, r1 - b _080AD636 - .align 2, 0 -_080AD62C: .4byte gUnknown_81185F2 -_080AD630: - movs r5, 0x9F - lsls r5, 1 - adds r0, r3, r5 -_080AD636: - movs r1, 0 - ldrsh r2, [r0, r1] - movs r5, 0x9F - lsls r5, 1 - adds r1, r3, r5 - ldrh r4, [r1] - movs r5, 0 - ldrsh r0, [r1, r5] - cmp r0, r2 - beq _080AD654 - strh r2, [r1] - movs r0, 0x9E - lsls r0, 1 - adds r1, r3, r0 - b _080AD664 -_080AD654: - movs r0, 0x80 - lsls r0, 5 - ands r0, r4 - cmp r0, 0 - beq _080AD668 - movs r5, 0x9E - lsls r5, 1 - adds r1, r3, r5 -_080AD664: - movs r0, 0x1 - strb r0, [r1] -_080AD668: - pop {r4,r5} - pop {r0} - bx r0 - thumb_func_end CallbackEffectSetEventIndex - - thumb_func_start CallbackEffectSetUnk_80AD670 -CallbackEffectSetUnk_80AD670: - push {lr} - lsls r1, 16 - asrs r1, 16 - adds r2, r1, 0 - cmp r1, 0 - bne _080AD682 - movs r1, 0xE0 - lsls r1, 1 - adds r2, r1, 0 -_080AD682: - movs r1, 0xA0 - lsls r1, 1 - adds r0, r1 - strh r2, [r0] - pop {r0} - bx r0 - thumb_func_end CallbackEffectSetUnk_80AD670 - - thumb_func_start CallbackEffectSpriteRelatedCheck_80AD690 -CallbackEffectSpriteRelatedCheck_80AD690: - push {lr} - adds r1, r0, 0 - movs r2, 0x9E - lsls r2, 1 - adds r0, r1, r2 - ldrb r0, [r0] - cmp r0, 0 - bne _080AD6AE - adds r2, 0x8 - adds r0, r1, r2 - bl sub_80A66F8 - lsls r0, 24 - lsrs r0, 24 - b _080AD6B0 -_080AD6AE: - movs r0, 0x1 -_080AD6B0: - pop {r1} - bx r1 - thumb_func_end CallbackEffectSpriteRelatedCheck_80AD690 - - thumb_func_start CallbackEffectSpriteRelated_80AD6B4 -CallbackEffectSpriteRelated_80AD6B4: - push {lr} - adds r1, r0, 0 - movs r2, 0xA0 - lsls r2, 1 - adds r0, r1, r2 - movs r2, 0 - ldrsh r0, [r0, r2] - cmp r0, 0 - bne _080AD6D6 - movs r2, 0xA2 - lsls r2, 1 - adds r0, r1, r2 - bl sub_80A671C - lsls r0, 24 - lsrs r0, 24 - b _080AD6D8 -_080AD6D6: - movs r0, 0x1 -_080AD6D8: - pop {r1} - bx r1 - thumb_func_end CallbackEffectSpriteRelated_80AD6B4 - - thumb_func_start CallbackEffectGetFlags -CallbackEffectGetFlags: - movs r2, 0x8E - lsls r2, 1 - adds r0, r2 - ldr r0, [r0] - str r0, [r1] - bx lr - thumb_func_end CallbackEffectGetFlags - - thumb_func_start CallbackEffectSetFlags -CallbackEffectSetFlags: - push {lr} - movs r2, 0x4 - ldrsh r0, [r0, r2] - bl sub_80AD0C8 - pop {r0} - bx r0 - thumb_func_end CallbackEffectSetFlags - - thumb_func_start CallbackEffectClearFlags -CallbackEffectClearFlags: - push {lr} - movs r2, 0x4 - ldrsh r0, [r0, r2] - bl sub_80AD10C - pop {r0} - bx r0 - thumb_func_end CallbackEffectClearFlags - - thumb_func_start CallbackEffectMoveRelative -CallbackEffectMoveRelative: - push {lr} - bl sub_80AD430 - pop {r1} - bx r1 - thumb_func_end CallbackEffectMoveRelative - - thumb_func_start GroundEffect_Action -GroundEffect_Action: - push {r4-r7,lr} - mov r7, r8 - push {r7} - ldr r0, _080AD754 - ldr r5, [r0] - movs r7, 0 - movs r0, 0x1 - negs r0, r0 - mov r8, r0 - movs r1, 0x9E - lsls r1, 1 - adds r6, r5, r1 -_080AD72C: - movs r3, 0x6 - ldrsh r0, [r5, r3] - cmp r0, r8 - beq _080AD78A - adds r4, r5, 0 - adds r4, 0x38 - adds r0, r4, 0 - ldr r1, _080AD758 - bl HandleAction - lsls r0, 16 - asrs r0, 16 - cmp r0, 0 - beq _080AD75C - cmp r0, 0x4 - bne _080AD768 - adds r0, r7, 0 - bl GroundEffect_Delete - b _080AD78A - .align 2, 0 -_080AD754: .4byte gGroundEffects -_080AD758: .4byte gUnknown_811874C -_080AD75C: - adds r0, r4, 0 - movs r1, 0 - movs r2, 0x1 - ldr r3, _080AD7A8 - bl ExecutePredefinedScript -_080AD768: - ldrb r0, [r6] - cmp r0, 0 - beq _080AD78A - movs r0, 0 - strb r0, [r6] - movs r1, 0xA2 - lsls r1, 1 - adds r0, r5, r1 - ldrh r2, [r6, 0x2] - movs r3, 0xF8 - lsls r3, 5 - adds r1, r3, 0 - ands r1, r2 - lsls r2, 24 - asrs r2, 24 - bl sub_80A6EFC -_080AD78A: - adds r0, r7, 0x1 - lsls r0, 16 - asrs r7, r0, 16 - movs r0, 0xE2 - lsls r0, 1 - adds r6, r0 - adds r5, r0 - cmp r7, 0xF - ble _080AD72C - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_080AD7A8: .4byte gUnknown_8118758 - thumb_func_end GroundEffect_Action - - thumb_func_start sub_80AD7AC -sub_80AD7AC: - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - sub sp, 0x8 - ldr r0, _080AD864 - ldr r6, [r0] - movs r0, 0 - mov r8, r0 - movs r1, 0x1 - negs r1, r1 - mov r9, r1 - movs r2, 0x90 - lsls r2, 1 - adds r4, r6, r2 -_080AD7CA: - movs r0, 0x6 - ldrsh r1, [r6, r0] - mov r2, r9 - lsls r0, r2, 16 - asrs r0, 16 - cmp r1, r0 - beq _080AD83C - ldr r0, [r4, 0x4] - ldr r1, [r6, 0x14] - adds r0, r1 - str r0, [sp] - ldr r0, [r4, 0x8] - ldr r1, [r6, 0x18] - adds r0, r1 - str r0, [sp, 0x4] - ldr r1, [r4, 0x14] - ldr r0, [r4, 0x18] - adds r7, r1, r0 - movs r0, 0xA2 - lsls r0, 1 - adds r5, r6, r0 - adds r0, r5, 0 - bl sub_80A66D4 - lsls r0, 24 - cmp r0, 0 - beq _080AD818 - movs r0, 0 - strb r0, [r4, 0x1C] - ldrh r2, [r4, 0x1E] - movs r0, 0xF8 - lsls r0, 5 - adds r1, r0, 0 - ands r1, r2 - lsls r2, 24 - asrs r2, 24 - adds r0, r5, 0 - bl sub_80A6EFC -_080AD818: - movs r1, 0x20 - ldrsh r0, [r4, r1] - cmp r0, 0 - beq _080AD832 - adds r1, r0, 0 - movs r2, 0 - ldrsb r2, [r4, r2] - adds r0, r5, 0 - movs r3, 0 - bl sub_80A7040 - movs r0, 0 - strh r0, [r4, 0x20] -_080AD832: - adds r0, r5, 0 - mov r1, sp - adds r2, r7, 0 - bl sub_80A7720 -_080AD83C: - mov r0, r8 - adds r0, 0x1 - lsls r0, 16 - asrs r0, 16 - mov r8, r0 - movs r0, 0xE2 - lsls r0, 1 - adds r4, r0 - adds r6, r0 - mov r1, r8 - cmp r1, 0xF - ble _080AD7CA - add sp, 0x8 - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_080AD864: .4byte gGroundEffects - thumb_func_end sub_80AD7AC - - .align 2,0 diff --git a/data/data_8115F5C_1.s b/data/data_8115F5C_1.s index cf2a6cace..657ea747d 100644 --- a/data/data_8115F5C_1.s +++ b/data/data_8115F5C_1.s @@ -1,15 +1,7 @@ .section .rodata -.align 2 - @ ground_effect.c -.byte 0xf6, 0x00, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -.4byte gUnknown_81185D8 -.byte 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -.byte 0xdb, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -.byte 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - .global gUnknown_81185D8 gUnknown_81185D8: @ 81185D8 .string "../ground/ground_effect.c\0" diff --git a/ld_script.ld b/ld_script.ld index 801bfa928..465231c80 100755 --- a/ld_script.ld +++ b/ld_script.ld @@ -357,7 +357,6 @@ SECTIONS { src/ground_lives.o(.text); src/ground_object.o(.text); src/ground_effect.o(.text); - asm/ground_effect.o(.text); src/ground_link.o(.text); src/ground_event.o(.text); src/unk_dungeon_load_maybe.o(.text); diff --git a/src/ground_effect.c b/src/ground_effect.c index 6863a6257..87d773ab3 100644 --- a/src/ground_effect.c +++ b/src/ground_effect.c @@ -51,6 +51,7 @@ struct GroundEffectTypeData extern struct GroundEffectTypeData gGroundEffectTypes[]; +extern const s16 gUnknown_81185F2[]; extern DebugLocation gUnknown_8118610; extern const u8 gUnknown_811861C[]; extern const u8 gUnknown_8118640[]; @@ -75,25 +76,31 @@ void sub_80A7714(struct UnkGroundSpriteStruct *); void sub_80A6688(struct UnkGroundSpriteStruct *, s32); extern bool8 GroundScriptNotify(Action*, s32); extern bool8 GroundScript_Cancel(Action *r0); +s32 sub_80AD3E0(GroundEffect *, PixelPos *); +extern bool8 sub_80A66F8(struct UnkGroundSpriteStruct *ptr); +extern bool8 sub_80A671C(struct UnkGroundSpriteStruct *ptr); +bool8 sub_80A66D4(struct UnkGroundSpriteStruct *ptr); +void sub_80A7720(struct UnkGroundSpriteStruct *ptr, PixelPos *pixelPos, s32 a2); -extern s16 CallbackEffectGetIndex(void *ptr); -extern void CallbackEffectGetSize(void *effectPtr_, PixelPos *out); -extern void CallbackEffectSetHitboxPos(void *effectPtr_, PixelPos *posOrNull); -extern void CallbackEffectSetPositionBounds(void *effectPtr_, PixelPos *from, PixelPos *to); -extern void CallbackEffectGetHitboxCenter(void *effectPtr_, PixelPos *out); -extern s32 CallbackEffectMoveReal(void *effectPtr_, PixelPos *pos); -extern void CallbackEffectGetPosHeightAndUnk(void *effectPtr_, u32 *height, u32 *unk); -extern void CallbackEffectSetPosHeight(void *effectPtr_, u32 height); -extern void CallbackEffectGetDirection(void *effectPtr_, s8 *dir); -extern void CallbackEffectSetDirection(void *effectPtr_, s32 dir_); -extern void CallbackEffectSetEventIndex(void *effectPtr_, u16 a1); -extern void CallbackEffectSetUnk_80AD670(void *effectPtr_, s32 a1_, s32 a2); -extern bool8 CallbackEffectSpriteRelatedCheck_80AD690(void *effectPtr_); -extern bool8 CallbackEffectSpriteRelated_80AD6B4(void *effectPtr_); -extern void CallbackEffectGetFlags(void *effectPtr_, u32 *flags); -extern void CallbackEffectSetFlags(void *effectPtr_, u32 flags); -extern void CallbackEffectClearFlags(void *effectPtr_, u32 flags); -extern s32 CallbackEffectMoveRelative(void *effectPtr_, PixelPos *pos); + +static s16 CallbackEffectGetIndex(void *ptr); +static void CallbackEffectGetSize(void *effectPtr_, PixelPos *out); +static void CallbackEffectSetHitboxPos(void *effectPtr_, PixelPos *posOrNull); +static void CallbackEffectSetPositionBounds(void *effectPtr_, PixelPos *from, PixelPos *to); +static void CallbackEffectGetHitboxCenter(void *effectPtr_, PixelPos *out); +static s32 CallbackEffectMoveReal(void *effectPtr_, PixelPos *pos); +static void CallbackEffectGetPosHeightAndUnk(void *effectPtr_, u32 *height, u32 *unk); +static void CallbackEffectSetPosHeight(void *effectPtr_, u32 height); +static void CallbackEffectGetDirection(void *effectPtr_, s8 *dir); +static void CallbackEffectSetDirection(void *effectPtr_, s32 dir_); +static void CallbackEffectSetEventIndex(void *effectPtr_, u16 a1); +static void CallbackEffectSetUnk_80AD670(void *effectPtr_, s32 a1_, s32 a2); +static bool8 CallbackEffectSpriteRelatedCheck_80AD690(void *effectPtr_); +static bool8 CallbackEffectSpriteRelated_80AD6B4(void *effectPtr_); +static void CallbackEffectGetFlags(void *effectPtr_, u32 *flags); +static void CallbackEffectSetFlags(void *effectPtr_, u32 flags); +static void CallbackEffectClearFlags(void *effectPtr_, u32 flags); +static s32 CallbackEffectMoveRelative(void *effectPtr_, PixelPos *pos); static const CallbackData gGroundEffectCallbacks = { .maybeId = 3, @@ -118,6 +125,40 @@ static const CallbackData gGroundEffectCallbacks = { .func4C_spriteRelatedCheck = CallbackEffectSpriteRelatedCheck_80AD690, .func50_spriteRelated = CallbackEffectSpriteRelated_80AD6B4, }; +extern const u8 gUnknown_81185D8[]; +#define FAKE_FILENAME gUnknown_81185D8 + + + + + + + + + + + + + + + + + + + + + + + + +static const struct ScriptCommand gUnusedScript[] = { + DEBUGINFO, // Needs to be line 155 + LABEL(0), + WAIT(0x78), + JUMP_LABEL(0), +}; +//ALIGNED(4) const u8 gUnknown_81185D8[] = "../ground/ground_effect.c"; + void AllocGroundEffects() { @@ -765,9 +806,6 @@ s16 sub_80AD360(s32 index_, PixelPos *pos) return parent->kind; } -extern s32 sub_80AD3E0(GroundEffect *, PixelPos *); - - s16 sub_80AD3B4(s32 index_, PixelPos *pos) { s32 index = (s16)index_; @@ -778,3 +816,371 @@ s16 sub_80AD3B4(s32 index_, PixelPos *pos) return parent->kind; } +NAKED +s32 sub_80AD3E0(GroundEffect *r0, PixelPos *r1) +{ + asm_unified( + "\tpush {r4-r7,lr}\n" + "\tmov r12, r0\n" + "\tldr r3, [r1]\n" + "\tldr r2, [r0, 0x14]\n" + "\tsubs r6, r3, r2\n" + "\tldr r1, [r1, 0x4]\n" + "\tldr r0, [r0, 0x18]\n" + "\tsubs r7, r1, r0\n" + "\tadds r4, r3, r2\n" + "\tadds r5, r1, r0\n" + "\tmov r1, r12\n" + "\tldr r0, [r1, 0x28]\n" + "\tcmp r6, r0\n" + "\tblt _080AD40E\n" + "\tldr r0, [r1, 0x30]\n" + "\tcmp r4, r0\n" + "\tbge _080AD40E\n" + "\tldr r0, [r1, 0x2C]\n" + "\tcmp r7, r0\n" + "\tblt _080AD40E\n" + "\tldr r0, [r1, 0x34]\n" + "\tcmp r5, r0\n" + "\tblt _080AD412\n" +"_080AD40E:\n" + "\tmovs r0, 0x1\n" + "\tb _080AD428\n" +"_080AD412:\n" + "\tmovs r0, 0x92\n" + "\tlsls r0, 1\n" + "\tadd r0, r12\n" + "\tstr r6, [r0]\n" + "\tstr r7, [r0, 0x4]\n" + "\tmovs r0, 0x96\n" + "\tlsls r0, 1\n" + "\tadd r0, r12\n" + "\tstr r4, [r0]\n" + "\tstr r5, [r0, 0x4]\n" + "\tmovs r0, 0\n" +"_080AD428:\n" + "\tpop {r4-r7}\n" + "\tpop {r1}\n" + "\tbx r1"); +} + +NAKED +s32 sub_80AD430(GroundEffect *r0, PixelPos *r1) +{ + asm_unified( + "\tpush {r4-r6,lr}\n" + "\tmov r12, r0\n" + "\tmovs r0, 0x92\n" + "\tlsls r0, 1\n" + "\tadd r0, r12\n" + "\tldr r0, [r0]\n" + "\tldr r2, [r1]\n" + "\tadds r5, r0, r2\n" + "\tmovs r0, 0x94\n" + "\tlsls r0, 1\n" + "\tadd r0, r12\n" + "\tldr r0, [r0]\n" + "\tldr r1, [r1, 0x4]\n" + "\tadds r6, r0, r1\n" + "\tmovs r0, 0x96\n" + "\tlsls r0, 1\n" + "\tadd r0, r12\n" + "\tldr r0, [r0]\n" + "\tadds r3, r0, r2\n" + "\tmovs r0, 0x98\n" + "\tlsls r0, 1\n" + "\tadd r0, r12\n" + "\tldr r0, [r0]\n" + "\tadds r4, r0, r1\n" + "\tmov r0, r12\n" + "\tldr r1, [r0, 0x28]\n" + "\tcmp r5, r1\n" + "\tbge _080AD470\n" + "\tadds r5, r1, 0\n" + "\tldr r0, [r0, 0xC]\n" + "\tadds r3, r1, r0\n" + "\tb _080AD47E\n" +"_080AD470:\n" + "\tmov r2, r12\n" + "\tldr r1, [r2, 0x30]\n" + "\tcmp r3, r1\n" + "\tblt _080AD47E\n" + "\tldr r0, [r2, 0xC]\n" + "\tsubs r5, r1, r0\n" + "\tadds r3, r1, 0\n" +"_080AD47E:\n" + "\tmov r0, r12\n" + "\tldr r1, [r0, 0x2C]\n" + "\tcmp r6, r1\n" + "\tbge _080AD48E\n" + "\tadds r6, r1, 0\n" + "\tldr r0, [r0, 0x10]\n" + "\tadds r4, r1, r0\n" + "\tb _080AD49C\n" +"_080AD48E:\n" + "\tmov r2, r12\n" + "\tldr r1, [r2, 0x34]\n" + "\tcmp r4, r1\n" + "\tblt _080AD49C\n" + "\tldr r0, [r2, 0x10]\n" + "\tsubs r6, r1, r0\n" + "\tadds r4, r1, 0\n" +"_080AD49C:\n" + "\tmovs r0, 0x92\n" + "\tlsls r0, 1\n" + "\tadd r0, r12\n" + "\tstr r5, [r0]\n" + "\tstr r6, [r0, 0x4]\n" + "\tmovs r0, 0x96\n" + "\tlsls r0, 1\n" + "\tadd r0, r12\n" + "\tstr r3, [r0]\n" + "\tstr r4, [r0, 0x4]\n" + "\tmovs r0, 0\n" + "\tpop {r4-r6}\n" + "\tpop {r1}\n" + "\tbx r1"); + +} + +static s16 CallbackEffectGetIndex(void *ptr) +{ + struct GroundEffect *groundObject = ptr; + return groundObject->id; +} + +static void CallbackEffectGetSize(void *objectPtr_, PixelPos *out) +{ + struct GroundEffect *objectPtr = objectPtr_; + *out = objectPtr->unkC; +} + +static void CallbackEffectSetHitboxPos(void *objectPtr_, PixelPos *posOrNull) +{ + struct GroundEffect *objectPtr = objectPtr_; + + if (posOrNull != NULL) { + objectPtr->unk124.x = posOrNull->x - objectPtr->unk14.x; + objectPtr->unk12C.x = posOrNull->x + objectPtr->unk14.x; + objectPtr->unk124.y = posOrNull->y - objectPtr->unk14.y; + objectPtr->unk12C.y = posOrNull->y + objectPtr->unk14.y; + } + else { + objectPtr->unk124.x = objectPtr->unk20.x - objectPtr->unk14.x; + objectPtr->unk12C.x = objectPtr->unk20.x + objectPtr->unk14.x; + objectPtr->unk124.y = objectPtr->unk20.y - objectPtr->unk14.y; + objectPtr->unk12C.y = objectPtr->unk20.y + objectPtr->unk14.y; + objectPtr->unk134.x = objectPtr->unk134.y = 0; + if (objectPtr->direction != objectPtr->direction1) { + objectPtr->directionRelated = TRUE; + } + objectPtr->direction = objectPtr->direction1; + } +} + +static void CallbackEffectSetPositionBounds(void *objectPtr_, PixelPos *from, PixelPos *to) +{ + struct GroundEffect *objectPtr = objectPtr_; + + objectPtr->unk28 = *from; + objectPtr->unk30 = *to; +} + +static void CallbackEffectGetHitboxCenter(void *objectPtr_, PixelPos *out) +{ + struct GroundEffect *objectPtr = objectPtr_; + + out->x = objectPtr->unk124.x + objectPtr->unk14.x; + out->y = objectPtr->unk124.y + objectPtr->unk14.y; +} + +static s32 CallbackEffectMoveReal(void *objectPtr_, PixelPos *pos) +{ + struct GroundEffect *objectPtr = objectPtr_; + return sub_80AD3E0(objectPtr, pos); +} + +static void CallbackEffectGetPosHeightAndUnk(void *objectPtr_, u32 *height, u32 *unk) +{ + struct GroundEffect *objectPtr = objectPtr_; + + *height = objectPtr->unk134.x; + *unk= objectPtr->unk134.y; +} + +static void CallbackEffectSetPosHeight(void *objectPtr_, u32 height) +{ + struct GroundEffect *objectPtr = objectPtr_; + objectPtr->unk134.x = height; + +} + +static void CallbackEffectGetDirection(void *objectPtr_, s8 *dir) +{ + struct GroundEffect *objectPtr = objectPtr_; + *dir = objectPtr->direction; + +} + +static void CallbackEffectSetDirection(void *livesPtr_, s32 direction) +{ + struct GroundEffect *livesPtr = livesPtr_; + s32 dir = (s8) direction; + + if (dir != -1) { + livesPtr->direction = dir; + } +} + +static void CallbackEffectSetEventIndex(void *livesPtr_, u16 a1) { + struct GroundEffect *livesPtr = livesPtr_; + + u32 r1; + u16 f1 = a1 & 0xFF; + + if (f1 != 0) + { + r1 = gUnknown_81185F2[f1]; + } + else + { + r1 = livesPtr->unk13E; + } + + if(livesPtr->unk13E != (s16) r1) + { + livesPtr->unk13E = r1; + livesPtr->directionRelated = 1; + } + else if((livesPtr->unk13E & 0x1000)) + livesPtr->directionRelated = 1; +} + +static void CallbackEffectSetUnk_80AD670(void *objectPtr_, s32 a1_, s32 a2) { + struct GroundEffect *livesPtr = objectPtr_; + + s32 a1Match = (s16) a1_; + #ifndef NONMATCHING + register s16 a1 asm("r2") = a1Match; + #else + s32 a1 = a1Match; + #endif + + if (a1Match == 0) { + a1 = 448; + } + + livesPtr->unk140 = a1; +} + +static bool8 CallbackEffectSpriteRelatedCheck_80AD690(void *objectPtr_) +{ + struct GroundEffect *livesPtr = objectPtr_; + + if (livesPtr->directionRelated) { + return TRUE; + } + else { + return sub_80A66F8(&livesPtr->unk144); + } +} + +static bool8 CallbackEffectSpriteRelated_80AD6B4(void *objectPtr_) +{ + struct GroundEffect *livesPtr = objectPtr_; + + if (livesPtr->unk140 != 0) { + return TRUE; + } + else { + return sub_80A671C(&livesPtr->unk144); + } +} + +static void CallbackEffectGetFlags(void *livesPtr_, u32 *flags) +{ + struct GroundEffect *livesPtr = livesPtr_; + + *flags = livesPtr->flags; +} + +static void CallbackEffectSetFlags(void *livesPtr_, u32 flags) +{ + struct GroundEffect *livesPtr = livesPtr_; + + sub_80AD0C8(livesPtr->id, flags); +} + +static void CallbackEffectClearFlags(void *livesPtr_, u32 flags) +{ + struct GroundEffect *livesPtr = livesPtr_; + + sub_80AD10C(livesPtr->id, flags); +} + +static s32 CallbackEffectMoveRelative(void *livesPtr_, PixelPos *pos) +{ + struct GroundEffect *livesPtr = livesPtr_; + + return sub_80AD430(livesPtr, pos); +} + +extern DebugLocation gUnknown_811874C; +extern DebugLocation gUnknown_8118758; +extern s16 HandleAction(Action *action, DebugLocation *debug); + +void GroundEffect_Action(void) +{ + GroundEffect *objectPtr; + s32 i; + s32 ret; + + for (objectPtr = &gGroundEffects[0], i = 0; i < NUM_GROUND_EFFECTS; i = (s16)(i + 1), objectPtr++) + { + if (objectPtr->kind != -1) { + ret = HandleAction(&objectPtr->action, &gUnknown_811874C); + switch(ret) + { + case 4: + GroundEffect_Delete(i); + continue; + case 0: + ExecutePredefinedScript(&objectPtr->action, NULL, 1, &gUnknown_8118758); + break; + } + + if (objectPtr->directionRelated) { + objectPtr->directionRelated = FALSE; + sub_80A6EFC(&objectPtr->unk144,objectPtr->unk13E & 0x1f00,(s8)objectPtr->unk13E); + } + } + } +} + +void sub_80AD7AC(void) +{ + GroundEffect *objectPtr; + s32 i; + s32 minus1; + + + for (objectPtr = &gGroundEffects[0], i = 0, minus1 = -1; i < NUM_GROUND_EFFECTS; i = (s16)(i + 1), objectPtr++) + { + minus1 = (s16)minus1; + if (objectPtr->kind != (s16)minus1) { + + PixelPos pos = {objectPtr->unk124.x + (objectPtr->unk14).x, objectPtr->unk124.y + (objectPtr->unk14).y}; + s32 num = objectPtr->unk134.x + objectPtr->unk134.y; + + if ((sub_80A66D4(&objectPtr->unk144))) { + objectPtr->directionRelated = 0; + sub_80A6EFC(&objectPtr->unk144,objectPtr->unk13E & 0x1f00,(s8)objectPtr->unk13E); + } + if (objectPtr->unk140 != 0) { + sub_80A7040(&objectPtr->unk144,objectPtr->unk140,objectPtr->direction,0); + objectPtr->unk140 = 0; + } + sub_80A7720(&objectPtr->unk144, &pos, num); + } + } +}