From 599559c68e1b96fb0daf3122c331fab6967799de Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 18 May 2025 11:54:40 +0200 Subject: [PATCH] sub_80A8ACC --- asm/ground_lives.s | 632 ----------------------------------------- include/ground_lives.h | 11 + src/code_809C5C4.c | 23 +- src/ground_lives.c | 253 ++++++++++++++++- 4 files changed, 255 insertions(+), 664 deletions(-) diff --git a/asm/ground_lives.s b/asm/ground_lives.s index 9a2e42fa6..c72d971d1 100644 --- a/asm/ground_lives.s +++ b/asm/ground_lives.s @@ -7,638 +7,6 @@ - - - - thumb_func_start GroundLives_Delete -GroundLives_Delete: - push {r4,lr} - adds r2, r0, 0 - lsls r2, 16 - asrs r2, 16 - ldr r1, _080A86BC - lsls r0, r2, 5 - subs r0, r2 - lsls r0, 4 - ldr r1, [r1] - adds r4, r1, r0 - ldr r1, _080A86C0 - movs r0, 0 - bl Log - movs r1, 0xB8 - lsls r1, 1 - adds r0, r4, r1 - bl sub_80A74E4 - adds r0, r4, 0 - adds r0, 0x38 - bl InitAction2 - ldr r0, _080A86C4 - strh r0, [r4, 0x2] - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_080A86BC: .4byte gGroundLives -_080A86C0: .4byte gUnknown_8118194 -_080A86C4: .4byte 0x0000ffff - thumb_func_end GroundLives_Delete - - thumb_func_start sub_80A86C8 -sub_80A86C8: - push {r4,r5,lr} - adds r5, r1, 0 - lsls r0, 16 - asrs r0, 16 - ldr r2, _080A8708 - lsls r1, r0, 5 - subs r1, r0 - lsls r1, 4 - ldr r0, [r2] - adds r4, r0, r1 - movs r1, 0x2 - ldrsh r0, [r4, r1] - movs r3, 0x1 - negs r3, r3 - cmp r0, r3 - beq _080A8744 - movs r2, 0x9E - lsls r2, 1 - adds r1, r4, r2 - movs r2, 0 - ldrsh r0, [r1, r2] - cmp r0, 0 - bne _080A870C - movs r0, 0xC0 - lsls r0, 6 - ands r0, r5 - cmp r0, 0 - beq _080A872E - bl sub_80AB5A4 - b _080A872E - .align 2, 0 -_080A8708: .4byte gGroundLives -_080A870C: - movs r0, 0x80 - lsls r0, 5 - ands r0, r5 - cmp r0, 0 - beq _080A872E - ldr r2, _080A874C - movs r0, 0 - ldrsh r1, [r1, r0] - lsls r0, r1, 1 - adds r0, r1 - lsls r0, 2 - ldr r1, [r2] - adds r1, r0 - str r3, [r1, 0x8] - movs r0, 0 - str r0, [r1] - str r0, [r1, 0x4] -_080A872E: - movs r1, 0x8E - lsls r1, 1 - adds r0, r4, r1 - ldr r1, [r0] - orrs r1, r5 - str r1, [r0] - movs r2, 0xB8 - lsls r2, 1 - adds r0, r4, r2 - bl sub_80A6688 -_080A8744: - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_080A874C: .4byte gGroundLivesMeta - thumb_func_end sub_80A86C8 - - thumb_func_start sub_80A8750 -sub_80A8750: - push {r4,r5,lr} - adds r5, r1, 0 - lsls r0, 16 - asrs r0, 16 - ldr r2, _080A87A8 - lsls r1, r0, 5 - subs r1, r0 - lsls r1, 4 - ldr r0, [r2] - adds r4, r0, r1 - movs r0, 0x2 - ldrsh r1, [r4, r0] - movs r0, 0x1 - negs r0, r0 - cmp r1, r0 - beq _080A87A2 - movs r1, 0x9E - lsls r1, 1 - adds r0, r4, r1 - movs r2, 0 - ldrsh r0, [r0, r2] - cmp r0, 0 - bne _080A878C - movs r0, 0xC0 - lsls r0, 6 - ands r0, r5 - cmp r0, 0 - beq _080A878C - bl sub_80AB5A4 -_080A878C: - movs r1, 0x8E - lsls r1, 1 - adds r0, r4, r1 - ldr r1, [r0] - bics r1, r5 - str r1, [r0] - movs r2, 0xB8 - lsls r2, 1 - adds r0, r4, r2 - bl sub_80A6688 -_080A87A2: - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_080A87A8: .4byte gGroundLives - thumb_func_end sub_80A8750 - - thumb_func_start sub_80A87AC -sub_80A87AC: - push {lr} - adds r3, r1, 0 - lsls r0, 16 - asrs r0, 16 - ldr r2, _080A87DC - lsls r1, r0, 5 - subs r1, r0 - lsls r1, 4 - ldr r0, [r2] - adds r2, r0, r1 - movs r0, 0x2 - ldrsh r1, [r2, r0] - movs r0, 0x1 - negs r0, r0 - cmp r1, r0 - beq _080A87D8 - movs r1, 0x90 - lsls r1, 1 - adds r0, r2, r1 - adds r1, r3, 0 - bl sub_809CD8C -_080A87D8: - pop {r0} - bx r0 - .align 2, 0 -_080A87DC: .4byte gGroundLives - thumb_func_end sub_80A87AC - - thumb_func_start sub_80A87E0 -sub_80A87E0: - push {r4,lr} - adds r3, r1, 0 - lsls r0, 16 - asrs r0, 16 - ldr r2, _080A8820 - lsls r1, r0, 5 - subs r1, r0 - lsls r1, 4 - ldr r0, [r2] - adds r4, r0, r1 - movs r0, 0x2 - ldrsh r1, [r4, r0] - movs r0, 0x1 - negs r0, r0 - cmp r1, r0 - beq _080A8824 - movs r0, 0x7 - movs r1, 0 - adds r2, r3, 0 - bl sub_809B1C0 - lsls r0, 24 - cmp r0, 0 - beq _080A8824 - movs r1, 0x90 - lsls r1, 1 - adds r0, r4, r1 - movs r1, 0x5 - bl sub_809CD8C - movs r0, 0x1 - b _080A8826 - .align 2, 0 -_080A8820: .4byte gGroundLives -_080A8824: - movs r0, 0 -_080A8826: - pop {r4} - pop {r1} - bx r1 - thumb_func_end sub_80A87E0 - - thumb_func_start sub_80A882C -sub_80A882C: - push {lr} - lsls r0, 16 - asrs r0, 16 - ldr r2, _080A8850 - lsls r1, r0, 5 - subs r1, r0 - lsls r1, 4 - ldr r0, [r2] - adds r2, r0, r1 - movs r0, 0x2 - ldrsh r1, [r2, r0] - movs r0, 0x1 - negs r0, r0 - cmp r1, r0 - bne _080A8854 - movs r0, 0 - b _080A8858 - .align 2, 0 -_080A8850: .4byte gGroundLives -_080A8854: - adds r0, r2, 0 - adds r0, 0x38 -_080A8858: - pop {r1} - bx r1 - thumb_func_end sub_80A882C - - thumb_func_start sub_80A885C -sub_80A885C: - push {r4,lr} - adds r4, r1, 0 - lsls r0, 16 - asrs r0, 16 - lsls r2, 16 - asrs r3, r2, 16 - ldr r2, _080A8884 - lsls r1, r0, 5 - subs r1, r0 - lsls r1, 4 - ldr r0, [r2] - adds r2, r0, r1 - movs r0, 0x2 - ldrsh r1, [r2, r0] - movs r0, 0x1 - negs r0, r0 - cmp r1, r0 - bne _080A8888 - movs r0, 0 - b _080A8898 - .align 2, 0 -_080A8884: .4byte gGroundLives -_080A8888: - adds r0, r2, 0 - adds r0, 0x38 - adds r1, r4, 0 - adds r2, r3, 0 - bl GetPredefinedScript - lsls r0, 24 - lsrs r0, 24 -_080A8898: - pop {r4} - pop {r1} - bx r1 - thumb_func_end sub_80A885C - - thumb_func_start sub_80A88A0 -sub_80A88A0: - push {lr} - lsls r0, 16 - asrs r0, 16 - ldr r2, _080A88C4 - lsls r1, r0, 5 - subs r1, r0 - lsls r1, 4 - ldr r0, [r2] - adds r2, r0, r1 - movs r0, 0x2 - ldrsh r1, [r2, r0] - movs r0, 0x1 - negs r0, r0 - cmp r1, r0 - bne _080A88C8 - movs r0, 0 - b _080A88D4 - .align 2, 0 -_080A88C4: .4byte gGroundLives -_080A88C8: - adds r0, r2, 0 - adds r0, 0x38 - bl sub_809D678 - lsls r0, 24 - lsrs r0, 24 -_080A88D4: - pop {r1} - bx r1 - thumb_func_end sub_80A88A0 - - thumb_func_start GroundLives_ExecuteScript -GroundLives_ExecuteScript: - push {r4-r7,lr} - sub sp, 0x4 - adds r4, r0, 0 - adds r7, r1, 0 - adds r6, r2, 0 - lsls r4, 16 - asrs r4, 16 - ldr r1, _080A8914 - lsls r0, r4, 5 - subs r0, r4 - lsls r0, 4 - ldr r1, [r1] - adds r5, r1, r0 - ldr r1, _080A8918 - movs r0, 0x2 - ldrsh r3, [r5, r0] - str r6, [sp] - movs r0, 0 - adds r2, r4, 0 - bl Log - movs r0, 0x2 - ldrsh r1, [r5, r0] - movs r0, 0x1 - negs r0, r0 - cmp r1, r0 - bne _080A891C - movs r0, 0 - b _080A8934 - .align 2, 0 -_080A8914: .4byte gGroundLives -_080A8918: .4byte gUnknown_81181B0 -_080A891C: - adds r0, r5, 0 - adds r0, 0x38 - ldr r3, _080A893C - adds r1, r7, 0 - adds r2, r6, 0 - bl GroundScript_ExecutePP - movs r0, 0xAE - lsls r0, 1 - adds r1, r5, r0 - movs r0, 0x1 - strb r0, [r1] -_080A8934: - add sp, 0x4 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_080A893C: .4byte gUnknown_81181F4 - thumb_func_end GroundLives_ExecuteScript - - thumb_func_start _ExecutePlayerScript -_ExecutePlayerScript: - push {r4,r5,lr} - adds r3, r0, 0 - adds r5, r1, 0 - adds r4, r2, 0 - movs r0, 0xAF - lsls r0, 1 - adds r1, r3, r0 - movs r2, 0 - movs r0, 0xC0 - lsls r0, 2 - strh r0, [r1] - movs r0, 0xB0 - lsls r0, 1 - adds r1, r3, r0 - movs r0, 0x1 - strh r0, [r1] - movs r1, 0xB2 - lsls r1, 1 - adds r0, r3, r1 - str r2, [r0] - movs r0, 0xB4 - lsls r0, 1 - adds r2, r3, r0 - movs r1, 0 - ldrsh r0, [r2, r1] - ldr r1, _080A898C - cmp r0, r1 - beq _080A8984 - strh r1, [r2] - movs r0, 0xAE - lsls r0, 1 - adds r1, r3, r0 - movs r0, 0x1 - strb r0, [r1] -_080A8984: - cmp r4, 0 - bne _080A8990 - movs r0, 0 - b _080A89A2 - .align 2, 0 -_080A898C: .4byte 0x00000807 -_080A8990: - adds r0, r3, 0 - adds r0, 0x38 - ldr r3, _080A89A8 - adds r1, r5, 0 - adds r2, r4, 0 - bl GroundScript_ExecutePP - lsls r0, 24 - lsrs r0, 24 -_080A89A2: - pop {r4,r5} - pop {r1} - bx r1 - .align 2, 0 -_080A89A8: .4byte gUnknown_8118218 - thumb_func_end _ExecutePlayerScript - - thumb_func_start sub_80A89AC -sub_80A89AC: - push {r4,lr} - lsls r0, 16 - asrs r0, 16 - ldr r4, _080A89CC - lsls r3, r0, 5 - subs r3, r0 - lsls r3, 4 - ldr r0, [r4] - adds r0, r3 - bl _ExecutePlayerScript - lsls r0, 24 - lsrs r0, 24 - pop {r4} - pop {r1} - bx r1 - .align 2, 0 -_080A89CC: .4byte gGroundLives - thumb_func_end sub_80A89AC - - thumb_func_start GroundLives_ExecutePlayerScriptActionLives -GroundLives_ExecutePlayerScriptActionLives: - push {r4-r6,lr} - sub sp, 0x10 - lsls r0, 16 - asrs r2, r0, 16 - lsls r1, 16 - asrs r4, r1, 16 - cmp r2, 0 - blt _080A8A50 - cmp r4, 0 - blt _080A8A50 - ldr r1, _080A8A48 - lsls r0, r2, 5 - subs r0, r2 - lsls r0, 4 - ldr r1, [r1] - adds r5, r1, r0 - lsls r0, r4, 5 - subs r0, r4 - lsls r0, 4 - adds r1, r0 - movs r2, 0x2 - ldrsh r0, [r5, r2] - movs r2, 0x1 - negs r2, r2 - cmp r0, r2 - beq _080A8A50 - movs r3, 0x2 - ldrsh r0, [r1, r3] - cmp r0, r2 - beq _080A8A50 - adds r6, r1, 0 - adds r6, 0x38 - adds r0, r6, 0 - mov r1, sp - movs r2, 0x2 - bl GetPredefinedScript - lsls r0, 24 - cmp r0, 0 - beq _080A8A50 - movs r1, 0x1 - lsls r0, r4, 16 - orrs r0, r1 - str r0, [sp, 0xC] - adds r1, r5, 0 - adds r1, 0x40 - ldr r3, _080A8A4C - adds r0, r6, 0 - movs r2, 0x3 - bl ExecutePredefinedScript - add r1, sp, 0xC - adds r0, r5, 0 - mov r2, sp - bl _ExecutePlayerScript - lsls r0, 24 - lsrs r0, 24 - b _080A8A52 - .align 2, 0 -_080A8A48: .4byte gGroundLives -_080A8A4C: .4byte gUnknown_8118250 -_080A8A50: - movs r0, 0 -_080A8A52: - add sp, 0x10 - pop {r4-r6} - pop {r1} - bx r1 - thumb_func_end GroundLives_ExecutePlayerScriptActionLives - - thumb_func_start sub_80A8A5C -sub_80A8A5C: - push {r4-r6,lr} - sub sp, 0x1C - lsls r0, 16 - asrs r2, r0, 16 - lsls r1, 16 - asrs r5, r1, 16 - cmp r2, 0 - blt _080A8AC0 - cmp r5, 0 - blt _080A8AC0 - ldr r1, _080A8ABC - lsls r0, r2, 5 - subs r0, r2 - lsls r0, 4 - ldr r1, [r1] - adds r6, r1, r0 - adds r0, r5, 0 - mov r1, sp - movs r2, 0x2 - bl sub_80AC274 - lsls r0, 24 - cmp r0, 0 - beq _080A8AC0 - movs r1, 0x2 - lsls r0, r5, 16 - orrs r0, r1 - str r0, [sp, 0x18] - add r4, sp, 0xC - adds r0, r5, 0 - adds r1, r4, 0 - movs r2, 0x3 - bl sub_80AC274 - adds r1, r6, 0 - adds r1, 0x40 - adds r0, r5, 0 - adds r2, r4, 0 - bl GroundObject_ExecuteScript - add r1, sp, 0x18 - adds r0, r6, 0 - mov r2, sp - bl _ExecutePlayerScript - lsls r0, 24 - lsrs r0, 24 - b _080A8AC2 - .align 2, 0 -_080A8ABC: .4byte gGroundLives -_080A8AC0: - movs r0, 0 -_080A8AC2: - add sp, 0x1C - pop {r4-r6} - pop {r1} - bx r1 - thumb_func_end sub_80A8A5C - - thumb_func_start sub_80A8ACC -sub_80A8ACC: - push {r4,lr} - sub sp, 0xC - lsls r0, 16 - asrs r2, r0, 16 - lsls r1, 16 - asrs r3, r1, 16 - cmp r2, 0 - blt _080A8B10 - cmp r3, 0 - blt _080A8B10 - ldr r1, _080A8B0C - lsls r0, r2, 5 - subs r0, r2 - lsls r0, 4 - ldr r1, [r1] - adds r4, r1, r0 - adds r0, r3, 0 - mov r1, sp - bl sub_80ADC64 - lsls r0, 24 - cmp r0, 0 - beq _080A8B10 - adds r0, r4, 0 - movs r1, 0 - mov r2, sp - bl _ExecutePlayerScript - lsls r0, 24 - lsrs r0, 24 - b _080A8B12 - .align 2, 0 -_080A8B0C: .4byte gGroundLives -_080A8B10: - movs r0, 0 -_080A8B12: - add sp, 0xC - pop {r4} - pop {r1} - bx r1 - thumb_func_end sub_80A8ACC - thumb_func_start GroundLivesNotifyAll GroundLivesNotifyAll: push {r4-r7,lr} diff --git a/include/ground_lives.h b/include/ground_lives.h index 12d347ccc..4e910eacb 100644 --- a/include/ground_lives.h +++ b/include/ground_lives.h @@ -3,6 +3,17 @@ #include "structs/str_position.h" +struct Struct3001B84_sub120 +{ + s32 unk0; + s32 unk4; + s32 unk8; + u8 unkC; + s32 unk10; + s32 unk14; + u8 unk18; +}; + // ground_lives.s s32 sub_80A7AE8(s16); s16 sub_80A8FD8(s32, PixelPos*); diff --git a/src/code_809C5C4.c b/src/code_809C5C4.c index 604867589..c7e5bf4c2 100644 --- a/src/code_809C5C4.c +++ b/src/code_809C5C4.c @@ -9,6 +9,7 @@ #include "code_80118A4.h" #include "string_format.h" #include "input.h" +#include "ground_lives.h" struct unkStruct_3001B68 { @@ -554,19 +555,7 @@ s32 sub_809CD48(void) void nullsub_117(void) {} void nullsub_118(void) {} -// TODO: merge this struct with other ground-related structs (if possible, otherwise just give a fitting name) -struct Tempsub_809CD68Struct -{ - s32 unk0; - s32 unk4; - s32 unk8; - u8 unkC; - s32 unk10; - s32 unk14; - u8 unk18; -}; - -void sub_809CD68(struct Tempsub_809CD68Struct *dst) +void sub_809CD68(struct Struct3001B84_sub120 *dst) { dst->unk0 = 0; dst->unk4 = 0; @@ -576,7 +565,7 @@ void sub_809CD68(struct Tempsub_809CD68Struct *dst) dst->unk18 = 0; } -void sub_809CD7C(struct Tempsub_809CD68Struct *dst) +void sub_809CD7C(struct Struct3001B84_sub120 *dst) { dst->unk0 = 0; dst->unk10 = -1; @@ -584,7 +573,7 @@ void sub_809CD7C(struct Tempsub_809CD68Struct *dst) dst->unk8 = 0; } -void sub_809CD8C(struct Tempsub_809CD68Struct *dst, s32 a1) +void sub_809CD8C(struct Struct3001B84_sub120 *dst, s32 a1) { if (a1 == 5) { sub_809CD68(dst); @@ -597,7 +586,7 @@ void sub_809CD8C(struct Tempsub_809CD68Struct *dst, s32 a1) } } -s32 sub_809CDB8(struct Tempsub_809CD68Struct *dst) +s32 sub_809CDB8(struct Struct3001B84_sub120 *dst) { s32 ret = dst->unk4; if (ret == 0) { @@ -606,7 +595,7 @@ s32 sub_809CDB8(struct Tempsub_809CD68Struct *dst) return ret; } -u32 sub_809CDC8(struct Tempsub_809CD68Struct *strPtr, u32 *r6, s8 *r7, s32 *param_4, u32 param_5, u32 param_6) +u32 sub_809CDC8(struct Struct3001B84_sub120 *strPtr, u32 *r6, s8 *r7, s32 *param_4, u32 param_5, u32 param_6) { u32 sp_4; s32 sp; diff --git a/src/ground_lives.c b/src/ground_lives.c index f1b88f193..7549fee93 100644 --- a/src/ground_lives.c +++ b/src/ground_lives.c @@ -33,18 +33,6 @@ struct unkStruct_3001B80 }; IWRAM_INIT struct unkStruct_3001B80 *gGroundLivesMeta = NULL; -// TODO: Merge with code 809C5C4 -struct Tempsub_809CD68Struct -{ - s32 unk0; - s32 unk4; - s32 unk8; - u8 unkC; - s32 unk10; - s32 unk14; - u8 unk18; -}; - struct unkStruct_3001B84_sub { // size: 0x1F0 @@ -62,7 +50,7 @@ struct unkStruct_3001B84_sub PixelPos unk30; Action unk38; u32 unk11C; - struct Tempsub_809CD68Struct unk120; + struct Struct3001B84_sub120 unk120; s16 unk13C; s16 unk13E; s16 unk140; @@ -75,7 +63,7 @@ struct unkStruct_3001B84_sub u16 unk15E; u16 unk160; s32 unk164; - u16 unk168; + s16 unk168; u16 unk16A; u8 fill16C[1]; struct UnkGroundSpriteStruct unk170; @@ -97,6 +85,7 @@ const struct GroundScriptHeader *GetGroundScript(s16 a0, DebugLocation *); extern DebugLocation gUnknown_811808C; extern u8 gUnknown_8118098[]; extern u8 gUnknown_81180BC[]; +extern u8 gUnknown_81181B0[]; void AllocGroundLives(void) { @@ -598,19 +587,24 @@ s32 sub_80A7DDC(s16 *a0, s16 *speciesDst) } extern const char gUnknown_811811C[]; +extern const char gUnknown_8118194[]; -extern void sub_809CD68(struct Tempsub_809CD68Struct *dst); +extern void sub_809CD68(struct Struct3001B84_sub120 *dst); extern bool8 GetCurrentDungeonBounds(PixelPos *a0, PixelPos *a1); extern void sub_80A7428(struct UnkGroundSpriteStruct *ptr, s32 a1_, s32 monsterId_, s32 a3); extern void SetPredefinedScript(Action *param_1, s16 index, const ScriptCommand *param_3); extern bool8 ExecutePredefinedScript(Action *param_1, s32 *param_2, s16 index, const DebugLocation *debug); extern void sub_809D170(s32 r0, s32 r1); +extern void sub_80A74E4(struct UnkGroundSpriteStruct *ptr); extern const CallbackData gGroundLivesCallbacks[]; extern const DebugLocation gUnknown_8118170; extern const DebugLocation gUnknown_811817C; extern const DebugLocation gUnknown_8118188; +extern const DebugLocation gUnknown_81181F4; +extern const DebugLocation gUnknown_8118218; +extern const DebugLocation gUnknown_8118250; void sub_80A9750(struct unkStruct_3001B84_sub *ptr, u16 a1); @@ -853,4 +847,233 @@ s32 GroundLives_Add(s32 id_, const GroundLivesData *ptr, s32 group_, s32 sector_ return id; } +void GroundLives_Delete(s32 id_) +{ + s32 id = (s16) id_; + struct unkStruct_3001B84_sub *livesPtr = &gGroundLives->array[id]; + + Log(0, gUnknown_8118194, id); + sub_80A74E4(&livesPtr->unk170); + InitAction2(&livesPtr->unk38); + livesPtr->unk2 = -1; +} + +extern void sub_80A6688(struct UnkGroundSpriteStruct *ptr, s32 a0); +extern void sub_80AB5A4(void); + +void sub_80A86C8(s32 id_, u32 flags) +{ + s32 id = (s16) id_; + struct unkStruct_3001B84_sub *livesPtr = &gGroundLives->array[id]; + + if (livesPtr->unk2 != -1) { + if (livesPtr->unk13C == 0) { + if (flags & 0x3000) { + sub_80AB5A4(); + } + } + else { + if (flags & 0x1000) { + struct GroundLivesMeta_Sub1 *metaPtr = &gGroundLivesMeta->unk0[livesPtr->unk13C]; + + metaPtr->unk8 = -1; + metaPtr->unk0 = 0; + metaPtr->unk4 = 0; + } + } + + livesPtr->unk11C |= flags; + sub_80A6688(&livesPtr->unk170, livesPtr->unk11C); + } +} + +void sub_80A8750(s32 id_, u32 flags) +{ + s32 id = (s16) id_; + struct unkStruct_3001B84_sub *livesPtr = &gGroundLives->array[id]; + + if (livesPtr->unk2 != -1) { + if (livesPtr->unk13C == 0) { + if (flags & 0x3000) { + sub_80AB5A4(); + } + } + + livesPtr->unk11C &= ~(flags); + sub_80A6688(&livesPtr->unk170, livesPtr->unk11C); + } +} + +extern void sub_809CD8C(struct Struct3001B84_sub120 *dst, s32 a1); +extern bool8 sub_809B1C0(s32 a0, u32 kind, u8 *a2); +extern bool8 GetPredefinedScript(Action *param_1, ScriptInfoSmall *script, s32 _index); +extern bool8 sub_809D678(Action *action); + +void sub_80A87AC(s32 id_, s32 a1) +{ + s32 id = (s16) id_; + struct unkStruct_3001B84_sub *livesPtr = &gGroundLives->array[id]; + + if (livesPtr->unk2 != -1) { + sub_809CD8C(&livesPtr->unk120, a1); + } +} + +bool8 sub_80A87E0(s32 id_, u8 *a1) +{ + s32 id = (s16) id_; + struct unkStruct_3001B84_sub *livesPtr = &gGroundLives->array[id]; + + if (livesPtr->unk2 != -1 && sub_809B1C0(7, 0, a1)) { + sub_809CD8C(&livesPtr->unk120, 5); + return TRUE; + } + + return FALSE; +} + +Action *sub_80A882C(s32 id_) +{ + s32 id = (s16) id_; + struct unkStruct_3001B84_sub *livesPtr = &gGroundLives->array[id]; + + if (livesPtr->unk2 != -1) { + return &livesPtr->unk38; + } + + return NULL; +} + +UNUSED static bool8 sub_80A885C(s32 id_, ScriptInfoSmall *scriptInfo, s32 a2_) +{ + s32 id = (s16) id_; + s32 a2 = (s16) a2_; + struct unkStruct_3001B84_sub *livesPtr = &gGroundLives->array[id]; + + if (livesPtr->unk2 != -1) { + return GetPredefinedScript(&livesPtr->unk38, scriptInfo, a2); + } + + return FALSE; +} + +UNUSED static bool8 sub_80A88A0(s32 id_) +{ + s32 id = (s16) id_; + struct unkStruct_3001B84_sub *livesPtr = &gGroundLives->array[id]; + + if (livesPtr->unk2 != -1) { + return sub_809D678(&livesPtr->unk38); + } + + return FALSE; +} + +bool8 GroundLives_ExecuteScript(s32 id_, s32 *a1, ScriptInfoSmall *scriptInfo) +{ + s32 id = (s16) id_; + struct unkStruct_3001B84_sub *livesPtr = &gGroundLives->array[id]; + + Log(0, gUnknown_81181B0, id, livesPtr->unk2, scriptInfo); + + if (livesPtr->unk2 != -1) { + GroundScript_ExecutePP(&livesPtr->unk38, a1, scriptInfo, &gUnknown_81181F4); + livesPtr->unk15C = 1; + return TRUE; + } + + return FALSE; +} + +bool8 _ExecutePlayerScript(struct unkStruct_3001B84_sub *livesPtr, s32 *a1, ScriptInfoSmall *scriptInfo) +{ + livesPtr->unk15E = 0x300; + livesPtr->unk160 = 1; + livesPtr->unk164 = 0; + if (livesPtr->unk168 != 0x807) { + livesPtr->unk168 = 0x807; + livesPtr->unk15C = 1; + } + + if (scriptInfo != NULL) { + return GroundScript_ExecutePP(&livesPtr->unk38, a1, scriptInfo, &gUnknown_8118218); + } + + return FALSE; +} + +UNUSED static bool8 sub_80A89AC(s32 id_, s32 *a1, ScriptInfoSmall *scriptInfo) +{ + s32 id = (s16) id_; + struct unkStruct_3001B84_sub *livesPtr = &gGroundLives->array[id]; + + return _ExecutePlayerScript(livesPtr, a1, scriptInfo); +} + +bool8 GroundLives_ExecutePlayerScriptActionLives(s32 id1_, s32 id2_) +{ + s32 id1 = (s16) id1_; + s32 id2 = (s16) id2_; + + if (id1 >= 0 && id2 >= 0) { + ScriptInfoSmall scriptInfo; + struct unkStruct_3001B84_sub *livesPtr1 = &gGroundLives->array[id1]; + struct unkStruct_3001B84_sub *livesPtr2 = &gGroundLives->array[id2]; + + if (livesPtr1->unk2 != -1 && livesPtr2->unk2 != -1 && GetPredefinedScript(&livesPtr2->unk38, &scriptInfo, 2)) { + s32 sp = 1; + + sp |= (id2 << 0x10); + ExecutePredefinedScript(&livesPtr2->unk38, (void *) &livesPtr1->unk38.unk8, 3, &gUnknown_8118250); // TODO: fix unk8 field? + return _ExecutePlayerScript(livesPtr1, &sp, &scriptInfo); + } + } + + return FALSE; +} + +extern bool8 sub_80AC274(s32 a0, ScriptInfoSmall *scriptInfo, s32 a2); +extern void GroundObject_ExecuteScript(s32, void *, ScriptInfoSmall *); +extern bool8 sub_80ADC64(s32 id, ScriptInfoSmall *dst); + +bool8 sub_80A8A5C(s32 id1_, s32 id2_) +{ + s32 id1 = (s16) id1_; + s32 id2 = (s16) id2_; + + if (id1 >= 0 && id2 >= 0) { + ScriptInfoSmall scriptInfo1; + struct unkStruct_3001B84_sub *livesPtr1 = &gGroundLives->array[id1]; + + if (sub_80AC274(id2, &scriptInfo1, 2)) { + s32 sp = 2; + ScriptInfoSmall scriptInfo2; + + sp |= (id2 << 0x10); + sub_80AC274(id2, &scriptInfo2, 3); + GroundObject_ExecuteScript(id2, &livesPtr1->unk38.unk8, &scriptInfo2); + return _ExecutePlayerScript(livesPtr1, &sp, &scriptInfo1); + } + } + + return FALSE; +} + +bool8 sub_80A8ACC(s32 id1_, s32 id2_) +{ + s32 id1 = (s16) id1_; + s32 id2 = (s16) id2_; + + if (id1 >= 0 && id2 >= 0) { + ScriptInfoSmall scriptInfo; + struct unkStruct_3001B84_sub *livesPtr1 = &gGroundLives->array[id1]; + + if (sub_80ADC64(id2, &scriptInfo)) { + return _ExecutePlayerScript(livesPtr1, NULL, &scriptInfo); + } + } + + return FALSE; +} + //