From 1b707bea03b583bdddfe23c0ba919fa200828c65 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Thu, 15 Aug 2024 02:30:11 -0700 Subject: [PATCH] more work on ground_script --- asm/code_809D148.s | 147 ---------------------------------------- include/ground_script.h | 6 +- ld_script.txt | 1 - src/code_809D148.c | 69 ------------------- src/ground_script.c | 140 +++++++++++++++++++++++++++++++++++++- 5 files changed, 142 insertions(+), 221 deletions(-) delete mode 100644 asm/code_809D148.s diff --git a/asm/code_809D148.s b/asm/code_809D148.s deleted file mode 100644 index fe3112245..000000000 --- a/asm/code_809D148.s +++ /dev/null @@ -1,147 +0,0 @@ - #include "asm/constants/gba_constants.inc" - #include "asm/macros.inc" - - .syntax unified - - .text - - - - - thumb_func_start InitActionWithParams -InitActionWithParams: - push {r4-r7,lr} - mov r7, r8 - push {r7} - adds r7, r0, 0 - adds r6, r1, 0 - mov r8, r2 - adds r4, r3, 0 - ldr r5, [sp, 0x18] - lsls r4, 16 - asrs r4, 16 - lsls r5, 24 - asrs r5, 24 - bl InitAction - str r6, [r7] - mov r0, r8 - str r0, [r7, 0x4] - strh r4, [r7, 0x10] - strb r5, [r7, 0x12] - ldrh r0, [r6] - strh r0, [r7, 0x8] - ldr r1, [r6, 0x4] - cmp r1, 0 - beq _0809D63A - mov r0, r8 - bl _call_via_r1 - strh r0, [r7, 0xA] - b _0809D63C -_0809D63A: - strh r1, [r7, 0xA] -_0809D63C: - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end InitActionWithParams - - thumb_func_start sub_809D648 -sub_809D648: - push {lr} - bl InitAction - pop {r0} - bx r0 - thumb_func_end sub_809D648 - - thumb_func_start sub_809D654 -sub_809D654: - movs r1, 0x26 - ldrsh r0, [r0, r1] - bx lr - thumb_func_end sub_809D654 - - thumb_func_start sub_809D65C -sub_809D65C: - push {lr} - adds r1, r0, 0 - movs r2, 0x26 - ldrsh r0, [r1, r2] - cmp r0, 0 - bne _0809D66E - movs r0, 0x1 - negs r0, r0 - b _0809D672 -_0809D66E: - movs r2, 0x24 - ldrsh r0, [r1, r2] -_0809D672: - pop {r1} - bx r1 - thumb_func_end sub_809D65C - - thumb_func_start sub_809D678 -sub_809D678: - movs r2, 0x26 - ldrsh r1, [r0, r2] - negs r0, r1 - orrs r0, r1 - lsrs r0, 31 - bx lr - thumb_func_end sub_809D678 - - thumb_func_start sub_809D684 -sub_809D684: - push {lr} - adds r2, r0, 0 - adds r3, r1, 0 - movs r1, 0x26 - ldrsh r0, [r2, r1] - cmp r0, 0 - beq _0809D6A4 - ldr r0, [r2, 0x34] - cmp r0, 0 - beq _0809D69C - ldr r1, [r2, 0x38] - b _0809D69E -_0809D69C: - ldr r1, [r2, 0x2C] -_0809D69E: - ldr r0, [r3] - cmp r1, r0 - beq _0809D6CC -_0809D6A4: - adds r0, r2, 0 - adds r0, 0x86 - movs r1, 0 - ldrsh r0, [r0, r1] - cmp r0, 0 - beq _0809D6D0 - adds r0, r2, 0 - adds r0, 0x94 - ldr r0, [r0] - cmp r0, 0 - beq _0809D6C0 - adds r0, r2, 0 - adds r0, 0x98 - b _0809D6C4 -_0809D6C0: - adds r0, r2, 0 - adds r0, 0x8C -_0809D6C4: - ldr r1, [r0] - ldr r0, [r3] - cmp r1, r0 - bne _0809D6D0 -_0809D6CC: - movs r0, 0x1 - b _0809D6D2 -_0809D6D0: - movs r0, 0 -_0809D6D2: - pop {r1} - bx r1 - thumb_func_end sub_809D684 - - .align 2,0 diff --git a/include/ground_script.h b/include/ground_script.h index 1b20f04c6..c001a4fcb 100644 --- a/include/ground_script.h +++ b/include/ground_script.h @@ -104,12 +104,12 @@ typedef struct CallbackData typedef struct Action { // size: 0xE4 - /* 0x00 */ struct CallbackData *callbacks; + /* 0x00 */ const struct CallbackData *callbacks; /* 0x04 */ void *parentObject; // struct GroundObject * /* 0x08 */ s16 unk8[2]; // id? /* 0x0C */ ScriptUnion1632 unkC; - /* 0x10 */ u16 group; - /* 0x12 */ u8 sector; + /* 0x10 */ s16 group; + /* 0x12 */ s8 sector; // padding /* 0x14 */ ScriptCommand *predefinedScripts[4]; /* 0x24 */ ScriptData scriptData; diff --git a/ld_script.txt b/ld_script.txt index 8fd439a74..a4b4745e1 100755 --- a/ld_script.txt +++ b/ld_script.txt @@ -347,7 +347,6 @@ SECTIONS { src/code_809C5C4.o(.text); asm/code_809C5C4.o(.text); src/code_809D148.o(.text); - asm/code_809D148.o(.text); src/ground_script.o(.text); asm/handleaction.o(.text); src/ground_script_1.o(.text); diff --git a/src/code_809D148.c b/src/code_809D148.c index fe31cdd79..57f7f0788 100644 --- a/src/code_809D148.c +++ b/src/code_809D148.c @@ -1,7 +1,6 @@ #include "global.h" #include "other_random.h" #include "memory.h" -#include "ground_script.h" struct unkStruct_809D158 { @@ -415,71 +414,3 @@ void sub_809D508(void) MemoryFree(gUnknown_203B4B0); gUnknown_203B4B0 = NULL; } - -// -1 didn't match -void sub_809D520(void *a0) -{ - u16 *ptr = a0; - u16 v = 0xFFFF; - *ptr = v; -} - -extern s32 sub_80A882C(s16); -extern s32 sub_80AC240(s16); -extern s32 sub_80AD158(s16); - -s32 sub_809D52C(void *a0) -{ - s16 *ptr = a0; - - switch (ptr[0]) - { - case 0: return 0; - case 1: return sub_80A882C(ptr[1]); - case 2: return sub_80AC240(ptr[1]); - case 3: return sub_80AD158(ptr[1]); - } - return 0; -} - -void InitScriptData(ScriptData *a0) -{ - s32 i; - - a0->state = -1; - a0->savedState = 0; - a0->script.ptr2 = 0; - a0->script.ptr = 0; - a0->savedScript.ptr2 = 0; - a0->savedScript.ptr = 0; - a0->curScriptOp = 0; - a0->curPtr = 0; - a0->unk22 = -1; - a0->unk24 = 0; - a0->unk26 = 0xFF; - a0->branchDiscriminant = 0; - a0->unk2A = 0; - a0->unk2C = 0; - a0->unk30 = 0; - for (i = 0; i < 4; i++) { - a0->unk50[i].raw = 0; - } -} - -void InitAction(Action *a0) -{ - s32 i; - - a0->callbacks = NULL; - a0->parentObject = NULL; - a0->group = -1; - a0->sector = 0xFF; - sub_809D520(&a0->unkC); - - for (i = 0; i < 4; i++) { - a0->predefinedScripts[i] = NULL; - } - - InitScriptData(&a0->scriptData); - InitScriptData(&a0->scriptData2); -} diff --git a/src/ground_script.c b/src/ground_script.c index d700f1cdb..a87deb888 100644 --- a/src/ground_script.c +++ b/src/ground_script.c @@ -17,13 +17,151 @@ extern u8 gUnknown_811656C[]; extern DebugLocation gUnknown_81165C8; extern void sub_809D520(void *); -extern void InitScriptData(void *); extern u8 sub_80AC378(void); extern u8 sub_80AD290(void); extern u8 sub_80A8B74(void); extern u8 sub_809A750(void); +extern s32 sub_80A882C(s16); +extern s32 sub_80AC240(s16); +extern s32 sub_80AD158(s16); void FatalError(u32 *, const char *, ...) __attribute__((noreturn)); +// -1 didn't match +void sub_809D520(void *a0) +{ + u16 *ptr = a0; + u16 v = 0xFFFF; + *ptr = v; +} + +s32 sub_809D52C(void *a0) +{ + s16 *ptr = a0; + + switch (ptr[0]) + { + case 0: return 0; + case 1: return sub_80A882C(ptr[1]); + case 2: return sub_80AC240(ptr[1]); + case 3: return sub_80AD158(ptr[1]); + } + return 0; +} + +void InitScriptData(ScriptData *a0) +{ + s32 i; + + a0->state = -1; + a0->savedState = 0; + a0->script.ptr2 = 0; + a0->script.ptr = 0; + a0->savedScript.ptr2 = 0; + a0->savedScript.ptr = 0; + a0->curScriptOp = 0; + a0->curPtr = 0; + a0->unk22 = -1; + a0->unk24 = 0; + a0->unk26 = 0xFF; + a0->branchDiscriminant = 0; + a0->unk2A = 0; + a0->unk2C = 0; + a0->unk30 = 0; + for (i = 0; i < 4; i++) { + a0->unk50[i].raw = 0; + } +} + +void InitAction(Action *a0) +{ + s32 i; + + a0->callbacks = NULL; + a0->parentObject = NULL; + a0->group = -1; + a0->sector = 0xFF; + sub_809D520(&a0->unkC); + + for (i = 0; i < 4; i++) { + a0->predefinedScripts[i] = NULL; + } + + InitScriptData(&a0->scriptData); + InitScriptData(&a0->scriptData2); +} + +void InitActionWithParams(Action *action, const CallbackData *callbacks, void *parent, s16 group, s8 sector) +{ + s32 group_s32; + s32 sector_s32; + + group_s32 = group; + sector_s32 = sector; + + InitAction(action); + + action->callbacks = callbacks; + action->parentObject = parent; + action->group = group_s32; + action->sector = sector_s32; + action->unk8[0] = callbacks->maybeId; + + if(callbacks->func04) + action->unk8[1] = callbacks->func04(parent); + else + action->unk8[1] = 0; +} + +void sub_809D648(Action *action) +{ + InitAction(action); +} + +UNUSED s16 sub_809D654(Action *action) +{ + return action->scriptData.savedState; +} + +UNUSED s16 sub_809D65C(Action *action) +{ + if(action->scriptData.savedState != 0) + return action->scriptData.state; + else + return -1; +} + +bool8 sub_809D678(Action *action) +{ + return action->scriptData.savedState == 0 ? FALSE : TRUE; +} + +bool8 sub_809D684(Action *action, ScriptCommand **scriptPtr) +{ + if(action->scriptData.savedState != 0) + { + if(action->scriptData.savedScript.ptr != 0) + { + if(action->scriptData.savedScript.ptr2 == *scriptPtr) return 1; + } + else + { + if(action->scriptData.script.ptr2 == *scriptPtr) return 1; + } + } + if(action->scriptData2.savedState != 0) + { + if(action->scriptData2.savedScript.ptr != 0) + { + if(action->scriptData2.savedScript.ptr2 == *scriptPtr) return 1; + } + else + { + if(action->scriptData2.script.ptr2 == *scriptPtr) return 1; + } + } + return 0; +} + void SetPredefinedScript(Action *param_1, s16 index, ScriptCommand *param_3) { param_1->predefinedScripts[index] = param_3;