From 4148c9e16ff7fea334532012caf0be19e46af4ce Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Tue, 20 May 2025 15:20:02 +0200 Subject: [PATCH] sub_80A95AC --- asm/ground_lives.s | 771 --------------------------------------------- src/ground_lives.c | 208 +++++++++++- 2 files changed, 202 insertions(+), 777 deletions(-) diff --git a/asm/ground_lives.s b/asm/ground_lives.s index fb769c9ec..6839e7fca 100644 --- a/asm/ground_lives.s +++ b/asm/ground_lives.s @@ -7,777 +7,6 @@ - - - - - thumb_func_start sub_80A91A0 -sub_80A91A0: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x10 - lsls r0, 16 - asrs r2, r0, 16 - lsls r1, 16 - asrs r4, r1, 16 - cmp r2, r4 - beq _080A928E - ldr r1, _080A9260 - lsls r0, r2, 5 - subs r0, r2 - lsls r0, 4 - ldr r1, [r1] - adds r7, r1, r0 - lsls r0, r4, 5 - subs r0, r4 - lsls r0, 4 - adds r1, r0 - mov r8, r1 - movs r1, 0x2 - ldrsh r0, [r7, r1] - movs r2, 0x1 - negs r2, r2 - mov r10, r2 - cmp r0, r10 - beq _080A928E - mov r3, r8 - movs r1, 0x2 - ldrsh r0, [r3, r1] - cmp r0, r10 - beq _080A928E - movs r3, 0xA2 - lsls r3, 1 - adds r0, r7, r3 - ldr r0, [r0] - ldr r1, [r7, 0x14] - adds r0, r1 - str r0, [sp] - movs r2, 0xA4 - lsls r2, 1 - adds r0, r7, r2 - ldr r0, [r0] - ldr r1, [r7, 0x18] - adds r0, r1 - str r0, [sp, 0x4] - add r3, r8 - ldr r0, [r3] - mov r3, r8 - ldr r1, [r3, 0x14] - adds r0, r1 - str r0, [sp, 0x8] - add r2, r8 - ldr r0, [r2] - ldr r1, [r3, 0x18] - adds r0, r1 - add r4, sp, 0x8 - str r0, [r4, 0x4] - adds r5, r7, 0 - adds r5, 0xC - mov r6, r8 - adds r6, 0xC - mov r0, sp - adds r1, r5, 0 - adds r2, r4, 0 - adds r3, r6, 0 - bl SizedDeltaDirection8 - lsls r0, 24 - asrs r0, 24 - mov r9, r0 - mov r0, sp - adds r1, r5, 0 - adds r2, r4, 0 - adds r3, r6, 0 - bl SizedDeltaDirection4 - lsls r0, 24 - asrs r1, r0, 24 - cmp r9, r10 - beq _080A928E - cmp r1, r10 - beq _080A928E - movs r2, 0x2 - ldrsh r0, [r7, r2] - cmp r0, 0x24 - bgt _080A9264 - movs r3, 0xA1 - lsls r3, 1 - adds r0, r7, r3 - mov r2, r9 - strb r2, [r0] - b _080A926C - .align 2, 0 -_080A9260: .4byte gGroundLives -_080A9264: - movs r3, 0xA1 - lsls r3, 1 - adds r0, r7, r3 - strb r1, [r0] -_080A926C: - mov r2, r8 - movs r3, 0x2 - ldrsh r0, [r2, r3] - cmp r0, 0x25 - bgt _080A927A - mov r0, r9 - b _080A927C -_080A927A: - adds r0, r1, 0 -_080A927C: - movs r1, 0x5 - bl sub_8002984 - movs r1, 0xA1 - lsls r1, 1 - add r1, r8 - strb r0, [r1] - movs r0, 0x1 - b _080A9290 -_080A928E: - movs r0, 0 -_080A9290: - add sp, 0x10 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end sub_80A91A0 - - thumb_func_start GetLivesCollision_80A92A0 -GetLivesCollision_80A92A0: - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - mov r9, r1 - adds r4, r2, 0 - lsls r0, 16 - asrs r6, r0, 16 - ldr r0, _080A931C - ldr r0, [r0] - mov r12, r0 - movs r2, 0 - movs r0, 0x1 - negs r0, r0 - mov r8, r0 - movs r5, 0x80 - lsls r5, 9 -_080A92C2: - cmp r2, r6 - beq _080A9320 - mov r1, r12 - movs r7, 0x2 - ldrsh r0, [r1, r7] - cmp r0, r8 - beq _080A9320 - movs r0, 0x8E - lsls r0, 1 - add r0, r12 - ldr r0, [r0] - mov r1, r9 - ands r0, r1 - cmp r0, 0 - beq _080A9320 - movs r0, 0xA2 - lsls r0, 1 - add r0, r12 - ldr r1, [r0] - ldr r0, [r3] - cmp r1, r0 - bge _080A9320 - movs r0, 0xA6 - lsls r0, 1 - add r0, r12 - ldr r1, [r0] - ldr r0, [r4] - cmp r1, r0 - ble _080A9320 - movs r0, 0xA4 - lsls r0, 1 - add r0, r12 - ldr r1, [r0] - ldr r0, [r3, 0x4] - cmp r1, r0 - bge _080A9320 - movs r0, 0xA8 - lsls r0, 1 - add r0, r12 - ldr r1, [r0] - ldr r0, [r4, 0x4] - cmp r1, r0 - ble _080A9320 - adds r0, r2, 0 - b _080A9338 - .align 2, 0 -_080A931C: .4byte gGroundLives -_080A9320: - adds r0, r5, 0 - movs r7, 0x80 - lsls r7, 9 - adds r5, r7 - asrs r2, r0, 16 - movs r0, 0xF8 - lsls r0, 1 - add r12, r0 - cmp r2, 0x17 - ble _080A92C2 - movs r0, 0x1 - negs r0, r0 -_080A9338: - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end GetLivesCollision_80A92A0 - - thumb_func_start sub_80A9344 -sub_80A9344: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x4 - mov r9, r1 - str r2, [sp] - adds r5, r3, 0 - lsls r0, 16 - asrs r0, 16 - mov r8, r0 - ldr r0, _080A93C4 - ldr r0, [r0] - mov r12, r0 - movs r4, 0 - movs r0, 0x1 - negs r0, r0 - mov r10, r0 - movs r7, 0x80 - lsls r7, 9 -_080A936E: - cmp r4, r8 - beq _080A93C8 - mov r1, r12 - movs r2, 0x2 - ldrsh r0, [r1, r2] - cmp r0, r10 - beq _080A93C8 - movs r0, 0x8E - lsls r0, 1 - add r0, r12 - ldr r0, [r0] - mov r6, r9 - ands r0, r6 - cmp r0, 0 - beq _080A93C8 - movs r0, 0xA2 - lsls r0, 1 - add r0, r12 - ldr r1, [r0] - mov r6, r12 - ldr r0, [r6, 0x14] - adds r2, r1, r0 - movs r0, 0xA4 - lsls r0, 1 - add r0, r12 - ldr r1, [r0] - ldr r0, [r6, 0x18] - adds r3, r1, r0 - ldr r0, [r5] - cmp r2, r0 - bge _080A93C8 - ldr r1, [sp] - ldr r0, [r1] - cmp r2, r0 - ble _080A93C8 - ldr r0, [r5, 0x4] - cmp r3, r0 - bge _080A93C8 - ldr r0, [r1, 0x4] - cmp r3, r0 - ble _080A93C8 - adds r0, r4, 0 - b _080A93E0 - .align 2, 0 -_080A93C4: .4byte gGroundLives -_080A93C8: - adds r0, r7, 0 - movs r2, 0x80 - lsls r2, 9 - adds r7, r2 - asrs r4, r0, 16 - movs r6, 0xF8 - lsls r6, 1 - add r12, r6 - cmp r4, 0x17 - ble _080A936E - movs r0, 0x1 - negs r0, r0 -_080A93E0: - add sp, 0x4 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end sub_80A9344 - - thumb_func_start sub_80A93F0 -sub_80A93F0: - push {r4-r7,lr} - sub sp, 0x10 - lsls r0, 16 - asrs r0, 16 - lsls r1, 24 - lsrs r6, r1, 24 - ldr r2, _080A947C - lsls r1, r0, 5 - subs r1, r0 - lsls r1, 4 - ldr r0, [r2] - adds r0, r1 - mov r12, r0 - movs r0, 0xA2 - lsls r0, 1 - add r0, r12 - ldr r0, [r0] - cmp r0, 0 - bge _080A941A - ldr r1, _080A9480 - adds r0, r1 -_080A941A: - asrs r5, r0, 11 - str r5, [sp] - movs r0, 0xA4 - lsls r0, 1 - add r0, r12 - ldr r0, [r0] - cmp r0, 0 - bge _080A942E - ldr r7, _080A9480 - adds r0, r7 -_080A942E: - asrs r4, r0, 11 - str r4, [sp, 0x4] - movs r0, 0xA6 - lsls r0, 1 - add r0, r12 - ldr r0, [r0] - subs r1, r0, 0x1 - cmp r1, 0 - bge _080A9444 - ldr r7, _080A9484 - adds r1, r0, r7 -_080A9444: - asrs r2, r1, 11 - movs r0, 0xA8 - lsls r0, 1 - add r0, r12 - ldr r0, [r0] - subs r1, r0, 0x1 - cmp r1, 0 - bge _080A9458 - ldr r7, _080A9484 - adds r1, r0, r7 -_080A9458: - asrs r3, r1, 11 - subs r0, r2, r5 - adds r0, 0x1 - str r0, [sp, 0x8] - subs r0, r3, r4 - adds r0, 0x1 - add r2, sp, 0x8 - str r0, [r2, 0x4] - adds r0, r6, 0 - mov r1, sp - bl sub_80A5934 - lsls r0, 24 - lsrs r0, 24 - add sp, 0x10 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_080A947C: .4byte gGroundLives -_080A9480: .4byte 0x000007ff -_080A9484: .4byte 0x000007fe - thumb_func_end sub_80A93F0 - - thumb_func_start sub_80A9488 -sub_80A9488: - push {r4-r7,lr} - mov r7, r8 - push {r7} - sub sp, 0x10 - adds r5, r0, 0 - adds r7, r1, 0 - mov r8, r2 - ldr r0, [r7] - cmp r0, 0 - bge _080A94A0 - ldr r1, _080A9528 - adds r0, r1 -_080A94A0: - asrs r0, 11 - mov r12, r0 - str r0, [sp] - ldr r0, [r7, 0x4] - cmp r0, 0 - bge _080A94B0 - ldr r3, _080A9528 - adds r0, r3 -_080A94B0: - asrs r4, r0, 11 - str r4, [sp, 0x4] - mov r6, r8 - ldr r3, [r6] - subs r0, r3, 0x1 - cmp r0, 0 - bge _080A94C2 - ldr r6, _080A952C - adds r0, r3, r6 -_080A94C2: - asrs r1, r0, 11 - mov r0, r8 - ldr r3, [r0, 0x4] - subs r0, r3, 0x1 - cmp r0, 0 - bge _080A94D2 - ldr r6, _080A952C - adds r0, r3, r6 -_080A94D2: - asrs r2, r0, 11 - mov r3, r12 - subs r0, r1, r3 - adds r0, 0x1 - str r0, [sp, 0x8] - subs r0, r2, r4 - adds r0, 0x1 - add r2, sp, 0x8 - str r0, [r2, 0x4] - movs r6, 0x8E - lsls r6, 1 - adds r0, r5, r6 - ldr r0, [r0] - movs r1, 0x1 - ands r0, r1 - adds r4, r2, 0 - cmp r0, 0 - beq _080A9504 - mov r0, sp - adds r1, r4, 0 - bl CheckMapCollision_80A585C - lsls r0, 24 - cmp r0, 0 - bne _080A9522 -_080A9504: - movs r1, 0x8E - lsls r1, 1 - adds r0, r5, r1 - ldr r0, [r0] - movs r1, 0x2 - ands r0, r1 - cmp r0, 0 - beq _080A9530 - mov r0, sp - adds r1, r4, 0 - bl sub_80A58C8 - lsls r0, 24 - cmp r0, 0 - beq _080A9530 -_080A9522: - movs r0, 0x1 - b _080A95A0 - .align 2, 0 -_080A9528: .4byte 0x000007ff -_080A952C: .4byte 0x000007fe -_080A9530: - movs r3, 0x8E - lsls r3, 1 - adds r0, r5, r3 - ldr r0, [r0] - movs r1, 0x4 - ands r0, r1 - cmp r0, 0 - beq _080A9556 - movs r6, 0 - ldrsh r0, [r5, r6] - adds r2, r7, 0 - mov r3, r8 - bl GetLivesCollision_80A92A0 - lsls r0, 16 - cmp r0, 0 - blt _080A9556 - movs r0, 0x4 - b _080A95A0 -_080A9556: - movs r1, 0x8E - lsls r1, 1 - adds r0, r5, r1 - ldr r0, [r0] - movs r1, 0x8 - ands r0, r1 - cmp r0, 0 - beq _080A957A - movs r0, 0x4 - adds r1, r7, 0 - mov r2, r8 - bl sub_80AC4C8 - lsls r0, 16 - cmp r0, 0 - blt _080A957A - movs r0, 0x8 - b _080A95A0 -_080A957A: - movs r3, 0x8E - lsls r3, 1 - adds r0, r5, r3 - ldr r0, [r0] - movs r1, 0x10 - ands r0, r1 - cmp r0, 0 - beq _080A959E - movs r0, 0x40 - adds r1, r7, 0 - mov r2, r8 - bl FindGroundEvent - lsls r0, 16 - cmp r0, 0 - blt _080A959E - movs r0, 0x10 - b _080A95A0 -_080A959E: - movs r0, 0 -_080A95A0: - add sp, 0x10 - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end sub_80A9488 - - thumb_func_start sub_80A95AC -sub_80A95AC: - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - sub sp, 0x14 - adds r5, r0, 0 - adds r7, r1, 0 - mov r8, r2 - ldr r0, [r7] - cmp r0, 0 - bge _080A95C6 - ldr r1, _080A96BC - adds r0, r1 -_080A95C6: - asrs r0, 11 - mov r9, r0 - str r0, [sp] - ldr r0, [r7, 0x4] - cmp r0, 0 - bge _080A95D6 - ldr r2, _080A96BC - adds r0, r2 -_080A95D6: - asrs r4, r0, 11 - str r4, [sp, 0x4] - mov r6, r8 - ldr r3, [r6] - subs r0, r3, 0x1 - cmp r0, 0 - bge _080A95E8 - ldr r6, _080A96C0 - adds r0, r3, r6 -_080A95E8: - asrs r1, r0, 11 - mov r0, r8 - ldr r3, [r0, 0x4] - subs r0, r3, 0x1 - cmp r0, 0 - bge _080A95F8 - ldr r6, _080A96C0 - adds r0, r3, r6 -_080A95F8: - asrs r2, r0, 11 - mov r3, r9 - subs r0, r1, r3 - adds r0, 0x1 - str r0, [sp, 0x8] - subs r0, r2, r4 - adds r0, 0x1 - add r2, sp, 0x8 - str r0, [r2, 0x4] - movs r6, 0x8E - lsls r6, 1 - adds r0, r5, r6 - ldr r0, [r0] - movs r1, 0x1 - ands r0, r1 - adds r4, r2, 0 - cmp r0, 0 - beq _080A962C - mov r0, sp - adds r1, r4, 0 - bl CheckMapCollision_80A585C - lsls r0, 24 - cmp r0, 0 - beq _080A962C - b _080A973C -_080A962C: - movs r1, 0x8E - lsls r1, 1 - adds r0, r5, r1 - ldr r0, [r0] - movs r1, 0x2 - ands r0, r1 - cmp r0, 0 - beq _080A964A - mov r0, sp - adds r1, r4, 0 - bl sub_80A58C8 - lsls r0, 24 - cmp r0, 0 - bne _080A973C -_080A964A: - movs r4, 0x8E - lsls r4, 1 - adds r0, r5, r4 - ldr r0, [r0] - movs r1, 0x4 - ands r0, r1 - cmp r0, 0 - beq _080A96C8 - movs r2, 0 - ldrsh r0, [r5, r2] - movs r1, 0x44 - adds r2, r7, 0 - mov r3, r8 - bl GetLivesCollision_80A92A0 - lsls r0, 16 - asrs r2, r0, 16 - mov r9, r2 - cmp r2, 0 - blt _080A96C8 - ldr r1, _080A96C4 - lsls r0, r2, 5 - subs r0, r2 - lsls r0, 4 - ldr r1, [r1] - adds r6, r1, r0 - adds r0, r6, r4 - ldr r1, [r0] - movs r0, 0x40 - ands r0, r1 - cmp r0, 0 - beq _080A973C - movs r0, 0x80 - lsls r0, 2 - ands r1, r0 - cmp r1, 0 - beq _080A96A8 - adds r4, 0x26 - adds r0, r5, r4 - ldrb r0, [r0] - lsls r0, 24 - asrs r0, 24 - movs r1, 0x5 - bl sub_8002984 - adds r4, r6, r4 - strb r0, [r4] -_080A96A8: - movs r3, 0 - ldrsh r0, [r5, r3] - mov r1, r9 - bl GroundLives_ExecutePlayerScriptActionLives -_080A96B2: - lsls r0, 24 - cmp r0, 0 - bne _080A9738 - b _080A973C - .align 2, 0 -_080A96BC: .4byte 0x000007ff -_080A96C0: .4byte 0x000007fe -_080A96C4: .4byte gGroundLives -_080A96C8: - movs r6, 0x8E - lsls r6, 1 - adds r0, r5, r6 - ldr r0, [r0] - movs r1, 0x8 - ands r0, r1 - cmp r0, 0 - beq _080A9708 - movs r0, 0x44 - adds r1, r7, 0 - mov r2, r8 - bl sub_80AC4C8 - lsls r0, 16 - asrs r4, r0, 16 - cmp r4, 0 - blt _080A9708 - add r1, sp, 0x10 - adds r0, r4, 0 - bl sub_80AC3E0 - ldr r0, [sp, 0x10] - movs r1, 0x40 - ands r0, r1 - cmp r0, 0 - beq _080A973C - movs r1, 0 - ldrsh r0, [r5, r1] - adds r1, r4, 0 - bl sub_80A8A5C - b _080A96B2 -_080A9708: - movs r2, 0x8E - lsls r2, 1 - adds r0, r5, r2 - ldr r0, [r0] - movs r1, 0x10 - ands r0, r1 - cmp r0, 0 - beq _080A9740 - movs r0, 0x40 - adds r1, r7, 0 - mov r2, r8 - bl FindGroundEvent - lsls r0, 16 - asrs r1, r0, 16 - cmp r1, 0 - blt _080A9740 - movs r3, 0 - ldrsh r0, [r5, r3] - bl sub_80A8ACC - lsls r0, 24 - cmp r0, 0 - beq _080A973C -_080A9738: - movs r0, 0x2 - b _080A9742 -_080A973C: - movs r0, 0x1 - b _080A9742 -_080A9740: - movs r0, 0 -_080A9742: - add sp, 0x14 - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end sub_80A95AC - thumb_func_start sub_80A9750 sub_80A9750: push {r4,lr} diff --git a/src/ground_lives.c b/src/ground_lives.c index 2361085cb..af47fbac7 100644 --- a/src/ground_lives.c +++ b/src/ground_lives.c @@ -38,7 +38,7 @@ IWRAM_INIT struct unkStruct_3001B80 *gGroundLivesMeta = NULL; struct unkStruct_3001B84_sub { // size: 0x1F0 - u16 unk0; + s16 unk0; s16 unk2; s16 unk4; s8 unk6; @@ -1427,7 +1427,7 @@ UNUSED static bool8 sub_80A90E8(s32 id1_, s32 id2_) struct unkStruct_3001B84_sub *livesPtr2 = &gGroundLives->array[id2]; if (livesPtr1->unk2 != -1 && livesPtr2->unk2 != -1) { - s32 ret; + s32 dir; PixelPos pixelPos1, pixelPos2; pixelPos1.x = livesPtr1->unk144.x + livesPtr1->unk14.x; @@ -1437,14 +1437,14 @@ UNUSED static bool8 sub_80A90E8(s32 id1_, s32 id2_) pixelPos2.y = livesPtr2->unk144.y + livesPtr2->unk14.y; if (livesPtr1->unk2 <= 36) { - ret = SizedDeltaDirection8(&pixelPos1, &livesPtr1->unkC, &pixelPos2, &livesPtr2->unkC); + dir = SizedDeltaDirection8(&pixelPos1, &livesPtr1->unkC, &pixelPos2, &livesPtr2->unkC); } else { - ret = SizedDeltaDirection4(&pixelPos1, &livesPtr1->unkC, &pixelPos2, &livesPtr2->unkC); + dir = SizedDeltaDirection4(&pixelPos1, &livesPtr1->unkC, &pixelPos2, &livesPtr2->unkC); } - if (ret != -1) { - livesPtr1->unk142 = ret; + if (dir != -1) { + livesPtr1->unk142 = dir; return TRUE; } } @@ -1453,4 +1453,200 @@ UNUSED static bool8 sub_80A90E8(s32 id1_, s32 id2_) return FALSE; } +extern s32 sub_8002984(s32 _direction1, u32 caseID); + +UNUSED static bool8 sub_80A91A0(s32 id1_, s32 id2_) +{ + s32 id1 = (s16) id1_; + s32 id2 = (s16) id2_; + + if (id1 != id2) { + struct unkStruct_3001B84_sub *livesPtr1 = &gGroundLives->array[id1]; + struct unkStruct_3001B84_sub *livesPtr2 = &gGroundLives->array[id2]; + + if (livesPtr1->unk2 != -1 && livesPtr2->unk2 != -1) { + s32 dir1, dir2; + PixelPos pixelPos1, pixelPos2; + + pixelPos1.x = livesPtr1->unk144.x + livesPtr1->unk14.x; + pixelPos1.y = livesPtr1->unk144.y + livesPtr1->unk14.y; + + pixelPos2.x = livesPtr2->unk144.x + livesPtr2->unk14.x; + pixelPos2.y = livesPtr2->unk144.y + livesPtr2->unk14.y; + + dir1 = SizedDeltaDirection8(&pixelPos1, &livesPtr1->unkC, &pixelPos2, &livesPtr2->unkC); + dir2 = SizedDeltaDirection4(&pixelPos1, &livesPtr1->unkC, &pixelPos2, &livesPtr2->unkC); + + if (dir1 != -1 && dir2 != -1) { + if (livesPtr1->unk2 <= 36) { + livesPtr1->unk142 = dir1; + } + else { + livesPtr1->unk142 = dir2; + } + + if (livesPtr2->unk2 <= 37) { + livesPtr2->unk142 = sub_8002984(dir1, 5); + } + else { + livesPtr2->unk142 = sub_8002984(dir2, 5); + } + + return TRUE; + } + } + } + + return FALSE; +} + +s32 GetLivesCollision_80A92A0(s32 id_, u32 flags, PixelPos *pixelPos1, PixelPos *pixelPos2) +{ + s32 i; + struct unkStruct_3001B84_sub *livesPtr; + s32 id = (s16) id_; + + for (livesPtr = &gGroundLives->array[0], i = 0; i < UNK_3001B84_ARR_COUNT; i = (s16)(i + 1), livesPtr++) { + if (i != id + && livesPtr->unk2 != -1 + && livesPtr->unk11C & flags + && livesPtr->unk144.x < pixelPos2->x + && livesPtr->unk14C.x > pixelPos1->x + && livesPtr->unk144.y < pixelPos2->y + && livesPtr->unk14C.y > pixelPos1->y) + { + return i; + } + } + return -1; +} + +extern u8 sub_80A5934(s32 param_1, PixelPos *, PixelPos *); + +s32 sub_80A9344(s32 id_, u32 flags, PixelPos *pixelPos1, PixelPos *pixelPos2) +{ + s32 i; + struct unkStruct_3001B84_sub *livesPtr; + s32 id = (s16) id_; + + for (livesPtr = &gGroundLives->array[0], i = 0; i < UNK_3001B84_ARR_COUNT; i = (s16)(i + 1), livesPtr++) { + if (i != id && livesPtr->unk2 != -1 && livesPtr->unk11C & flags) { + PixelPos resultPos = {0}; + resultPos.x = livesPtr->unk144.x + livesPtr->unk14.x; + resultPos.y = livesPtr->unk144.y + livesPtr->unk14.y; + if (resultPos.x < pixelPos2->x + && resultPos.x > pixelPos1->x + && resultPos.y < pixelPos2->y + && resultPos.y > pixelPos1->y) + { + return i; + } + } + } + return -1; +} + +u8 sub_80A93F0(s32 id_, s32 a1_) +{ + s32 id = (s16) id_; + s32 a1 = (u8) a1_; + struct unkStruct_3001B84_sub *livesPtr = &gGroundLives->array[id]; + PixelPos pixPos1 = {livesPtr->unk144.x / 2048, livesPtr->unk144.y / 2048}; + PixelPos posTemp = {((livesPtr->unk14C.x - 1) / 2048), ((livesPtr->unk14C.y - 1) / 2048)}; + PixelPos pixPos2 = {(posTemp.x- pixPos1.x) + 1, (posTemp.y -pixPos1.y) + 1}; + + return sub_80A5934(a1, &pixPos1, &pixPos2); +} + +extern bool8 CheckMapCollision_80A585C(PixelPos *, PixelPos *); +extern bool8 sub_80A58C8(PixelPos *, PixelPos *); +extern s32 sub_80AC4C8(u32 a0, PixelPos *, PixelPos *); + +s32 sub_80A9488(struct unkStruct_3001B84_sub *livesPtr, PixelPos *posArg1, PixelPos *posArg2) +{ + PixelPos pixPos1 = {posArg1->x / 2048, posArg1->y / 2048}; + PixelPos posTemp = {((posArg2->x - 1) / 2048), ((posArg2->y - 1) / 2048)}; + PixelPos pixPos2 = {(posTemp.x- pixPos1.x) + 1, (posTemp.y -pixPos1.y) + 1}; + + if (livesPtr->unk11C & 1) { + if (CheckMapCollision_80A585C(&pixPos1, &pixPos2)) + return 1; + } + if (livesPtr->unk11C & 2) { + if (sub_80A58C8(&pixPos1, &pixPos2)) + return 1; + } + if (livesPtr->unk11C & 4) { + if ((s16) GetLivesCollision_80A92A0(livesPtr->unk0, 4, posArg1, posArg2) >= 0) + return 4; + } + if (livesPtr->unk11C & 8) { + if ((s16) sub_80AC4C8(4, posArg1, posArg2) >= 0) + return 8; + } + if (livesPtr->unk11C & 0x10) { + if ((s16) FindGroundEvent(0x40, posArg1, posArg2) >= 0) + return 0x10; + } + + return 0; +} + +extern void sub_80AC3E0(s32 id, s32 *a1); + + +s32 sub_80A95AC(struct unkStruct_3001B84_sub *livesPtr, PixelPos *posArg1, PixelPos *posArg2) +{ + PixelPos pixPos1 = {posArg1->x / 2048, posArg1->y / 2048}; + PixelPos posTemp = {((posArg2->x - 1) / 2048), ((posArg2->y - 1) / 2048)}; + PixelPos pixPos2 = {(posTemp.x- pixPos1.x) + 1, (posTemp.y -pixPos1.y) + 1}; + + if (livesPtr->unk11C & 1) { + if (CheckMapCollision_80A585C(&pixPos1, &pixPos2)) + return 1; + } + if (livesPtr->unk11C & 2) { + if (sub_80A58C8(&pixPos1, &pixPos2)) + return 1; + } + if (livesPtr->unk11C & 4) { + s32 id2 = (s16) GetLivesCollision_80A92A0(livesPtr->unk0, 0x44, posArg1, posArg2); + // Needed for matching. + s32 id2_ = id2; + if (id2 >= 0) { + struct unkStruct_3001B84_sub *ptr2 = &gGroundLives->array[id2]; + + if (ptr2->unk11C & 0x40) { + if (ptr2->unk11C & 0x200) { + ptr2->unk142 = sub_8002984(livesPtr->unk142, 5); + } + if (GroundLives_ExecutePlayerScriptActionLives(livesPtr->unk0, id2_)) + return 2; + } + return 1; + } + } + if (livesPtr->unk11C & 8) { + s32 id2 = (s16) sub_80AC4C8(0x44, posArg1, posArg2); + if (id2 >= 0) { + s32 sp; + + sub_80AC3E0(id2, &sp); + if ((sp & 0x40) && sub_80A8A5C(livesPtr->unk0, id2)) + return 2; + return 1; + } + } + if (livesPtr->unk11C & 0x10) { + s32 id2 = (s16) FindGroundEvent(0x40, posArg1, posArg2); + if (id2 >= 0) { + if (sub_80A8ACC(livesPtr->unk0, id2)) + return 2; + return 1; + } + } + + return 0; +} + //