From 9622c4e8b81fb3ef3f298f0ab42f4f6cff09dc45 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 23 May 2025 11:24:35 +0200 Subject: [PATCH] sub_80AB5D4 --- asm/ground_lives.s | 589 --------------------------------------------- src/ground_lives.c | 279 +++++++++++++++++---- 2 files changed, 238 insertions(+), 630 deletions(-) diff --git a/asm/ground_lives.s b/asm/ground_lives.s index f8adb9ec9..5d6fc739d 100644 --- a/asm/ground_lives.s +++ b/asm/ground_lives.s @@ -8,595 +8,6 @@ - thumb_func_start sub_80AB5A4 -sub_80AB5A4: - push {lr} - ldr r3, _080AB5D0 - ldr r0, [r3] - movs r2, 0x1 - negs r2, r2 - str r2, [r0, 0x24] - adds r0, 0x28 - movs r1, 0xFF - strb r1, [r0] - ldr r3, [r3] - movs r1, 0 - movs r0, 0x2 -_080AB5BC: - str r2, [r3, 0x8] - str r1, [r3] - str r1, [r3, 0x4] - subs r0, 0x1 - adds r3, 0xC - cmp r0, 0 - bge _080AB5BC - pop {r0} - bx r0 - .align 2, 0 -_080AB5D0: .4byte gGroundLivesMeta - thumb_func_end sub_80AB5A4 - - thumb_func_start sub_80AB5D4 -sub_80AB5D4: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x2C - mov r9, r0 - ldr r4, _080AB6BC - movs r2, 0x9E - lsls r2, 1 - add r2, r9 - movs r0, 0 - ldrsh r1, [r2, r0] - lsls r0, r1, 1 - adds r0, r1 - lsls r0, 2 - ldr r3, [r4] - adds r0, r3 - mov r8, r0 - adds r0, r1, 0 - adds r5, r4, 0 - cmp r0, 0 - bne _080AB604 - b _080AB9E6 -_080AB604: - movs r1, 0xAF - lsls r1, 1 - add r1, r9 - movs r0, 0xC0 - lsls r0, 2 - strh r0, [r1] - movs r1, 0xB0 - lsls r1, 1 - add r1, r9 - movs r0, 0x1 - strh r0, [r1] - movs r0, 0x8E - lsls r0, 1 - add r0, r9 - ldr r2, [r0] - movs r0, 0x80 - lsls r0, 6 - ands r2, r0 - cmp r2, 0 - beq _080AB6D4 - movs r2, 0xA1 - lsls r2, 1 - add r2, r9 - movs r0, 0 - ldrsb r0, [r2, r0] - cmp r0, 0x4 - bne _080AB64C - movs r0, 0xB4 - lsls r0, 1 - add r0, r9 - movs r3, 0 - ldrsh r1, [r0, r3] - movs r0, 0x80 - lsls r0, 4 - cmp r1, r0 - beq _080AB670 -_080AB64C: - movs r1, 0xB2 - lsls r1, 1 - add r1, r9 - movs r0, 0 - str r0, [r1] - movs r1, 0xB4 - lsls r1, 1 - add r1, r9 - movs r0, 0x80 - lsls r0, 4 - strh r0, [r1] - movs r0, 0x4 - strb r0, [r2] - movs r1, 0xAE - lsls r1, 1 - add r1, r9 - movs r0, 0x1 - strb r0, [r1] -_080AB670: - ldr r0, [r5] - adds r2, r0, 0 - adds r2, 0x28 - movs r1, 0 - ldrsb r1, [r2, r1] - movs r0, 0x1 - negs r0, r0 - cmp r1, r0 - beq _080AB69C - movs r2, 0x80 - lsls r2, 1 - mov r0, sp - bl SetVecFromDirectionSpeed - ldr r0, [sp] - ldr r1, [sp, 0x4] - str r0, [sp, 0x8] - str r1, [sp, 0xC] - add r1, sp, 0x8 - mov r0, r9 - bl sub_80A9F94 -_080AB69C: - mov r4, r8 - ldr r0, [r4, 0x8] - cmp r0, 0 - blt _080AB6A6 - b _080AB9E6 -_080AB6A6: - ldr r0, [r5] - ldr r0, [r0, 0x24] - cmp r0, 0 - bge _080AB6B0 - b _080AB9E6 -_080AB6B0: - str r0, [r4, 0x8] - movs r0, 0 - str r0, [r4] - str r0, [r4, 0x4] - b _080AB9E6 - .align 2, 0 -_080AB6BC: .4byte gGroundLivesMeta -_080AB6C0: - ldr r5, [sp, 0x28] - ldr r0, [r5, 0x4] - adds r0, r7, r0 - str r0, [r5, 0x4] - b _080AB7E2 -_080AB6CA: - ldr r1, [sp, 0x28] - ldr r0, [r1, 0x4] - subs r0, r7 - str r0, [r1, 0x4] - b _080AB7E2 -_080AB6D4: - movs r0, 0xA2 - lsls r0, 1 - add r0, r9 - ldr r1, [r0] - mov r5, r9 - ldr r0, [r5, 0x14] - adds r0, r1, r0 - str r0, [sp, 0x20] - movs r0, 0xA4 - lsls r0, 1 - add r0, r9 - ldr r1, [r0] - ldr r0, [r5, 0x18] - adds r0, r1, r0 - str r0, [sp, 0x24] - ldr r0, [sp, 0x20] - ldr r1, [sp, 0x24] - str r0, [sp, 0x10] - str r1, [sp, 0x14] - mov r1, r8 - ldr r0, [r1, 0x8] - cmp r0, 0 - bge _080AB710 - ldr r0, [r3, 0x24] - cmp r0, 0 - bge _080AB70A - b _080AB9E6 -_080AB70A: - str r0, [r1, 0x8] - str r2, [r1] - str r2, [r1, 0x4] -_080AB710: - mov r2, r8 - ldr r7, [r2] - movs r3, 0x1 - mov r10, r3 - mov r5, sp - adds r5, 0x10 - str r5, [sp, 0x28] -_080AB71E: - mov r0, r8 - ldr r1, [r0, 0x8] - lsls r0, r1, 1 - adds r0, r1 - lsls r0, 2 - adds r0, 0x2C - ldr r2, _080AB754 - ldr r1, [r2] - adds r1, r0 - mov r12, r1 - ldr r6, [r1, 0x4] - ldr r5, [sp, 0x10] - subs r4, r6, r5 - adds r2, r4, 0 - ldr r1, [r1, 0x8] - ldr r0, [sp, 0x14] - subs r3, r1, r0 - cmp r4, 0 - ble _080AB75E - cmp r2, r7 - ble _080AB758 - adds r0, r7, r5 - str r0, [sp, 0x10] - movs r4, 0 - mov r10, r4 - b _080AB75A - .align 2, 0 -_080AB754: .4byte gGroundLivesMeta -_080AB758: - str r6, [sp, 0x10] -_080AB75A: - adds r1, r2, 0 - b _080AB778 -_080AB75E: - cmp r4, 0 - bge _080AB776 - cmn r2, r7 - bge _080AB770 - subs r0, r5, r7 - str r0, [sp, 0x10] - movs r5, 0 - mov r10, r5 - b _080AB772 -_080AB770: - str r6, [sp, 0x10] -_080AB772: - negs r1, r2 - b _080AB778 -_080AB776: - movs r1, 0 -_080AB778: - cmp r3, 0 - ble _080AB78E - cmp r3, r7 - bgt _080AB6C0 - mov r4, r12 - ldr r0, [r4, 0x8] - str r0, [sp, 0x14] - cmp r3, r1 - ble _080AB7A2 - adds r1, r3, 0 - b _080AB7A2 -_080AB78E: - cmp r3, 0 - bge _080AB7A2 - cmn r3, r7 - blt _080AB6CA - mov r5, r12 - ldr r0, [r5, 0x8] - str r0, [sp, 0x14] - cmn r3, r1 - bge _080AB7A2 - negs r1, r3 -_080AB7A2: - mov r0, r10 - cmp r0, 0 - beq _080AB7E2 - subs r7, r1 - cmp r7, 0 - ble _080AB7E2 - ldr r1, _080AB7D4 - ldr r0, [r1] - mov r3, r8 - ldr r2, [r3, 0x8] - ldr r0, [r0, 0x24] - cmp r2, r0 - beq _080AB7D8 - adds r1, r2, 0x1 - adds r0, r1, 0 - cmp r1, 0 - bge _080AB7C8 - adds r0, r2, 0 - adds r0, 0x40 -_080AB7C8: - asrs r0, 6 - lsls r0, 6 - subs r0, r1, r0 - mov r4, r8 - str r0, [r4, 0x8] - b _080AB7DC - .align 2, 0 -_080AB7D4: .4byte gGroundLivesMeta -_080AB7D8: - movs r5, 0 - mov r10, r5 -_080AB7DC: - mov r0, r10 - cmp r0, 0 - bne _080AB71E -_080AB7E2: - mov r1, r8 - ldr r0, [r1, 0x8] - bl sub_80ABA00 - adds r6, r0, 0 - ldr r0, _080AB860 - ldr r7, [r0] - movs r2, 0x9E - lsls r2, 1 - add r2, r9 - mov r10, r2 - movs r3, 0 - ldrsh r2, [r2, r3] - subs r1, r2, 0x1 - lsls r0, r1, 1 - adds r0, r1 - lsls r0, 2 - adds r1, r7, 0x4 - adds r1, r0 - ldr r0, _080AB864 - lsls r2, 2 - adds r2, r0 - ldr r1, [r1] - ldr r0, [r2] - adds r1, r0 - mov r12, r1 - mov r4, r8 - ldr r1, [r4, 0x8] - lsls r0, r1, 1 - adds r0, r1 - lsls r0, 2 - adds r0, 0x2C - adds r0, r7, r0 - ldr r3, [r0, 0x4] - ldr r2, [sp, 0x10] - ldr r1, [r0, 0x8] - ldr r5, [sp, 0x28] - ldr r0, [r5, 0x4] - subs r1, r0 - subs r3, r2 - cmp r3, 0 - bge _080AB838 - negs r3, r3 -_080AB838: - adds r4, r3, 0 - cmp r1, 0 - bge _080AB840 - negs r1, r1 -_080AB840: - cmp r1, r4 - bge _080AB846 - adds r1, r3, 0 -_080AB846: - adds r6, r1 - mov r0, r8 - str r6, [r0, 0x4] - cmp r6, r12 - bgt _080AB86C - ldr r0, [r0] - cmp r0, 0 - ble _080AB8B2 - ldr r1, _080AB868 - adds r0, r1 - mov r2, r8 - b _080AB8B0 - .align 2, 0 -_080AB860: .4byte gGroundLivesMeta -_080AB864: .4byte gUnknown_8118050 -_080AB868: .4byte 0xffffff00 -_080AB86C: - mov r3, r10 - movs r4, 0 - ldrsh r1, [r3, r4] - lsls r0, r1, 1 - adds r0, r1 - lsls r0, 11 - cmp r6, r0 - bgt _080AB88E - mov r5, r8 - ldr r0, [r5] - cmp r0, 0xFF - bgt _080AB8B2 - movs r1, 0x80 - lsls r1, 1 - adds r0, r1 - str r0, [r5] - b _080AB8B2 -_080AB88E: - subs r1, 0x1 - lsls r0, r1, 1 - adds r0, r1 - lsls r0, 2 - adds r0, r7, r0 - ldr r0, [r0] - cmp r0, 0xFF - bgt _080AB8A2 - movs r0, 0x80 - lsls r0, 1 -_080AB8A2: - mov r2, r8 - ldr r1, [r2] - cmp r1, r0 - bge _080AB8B2 - movs r3, 0x80 - lsls r3, 1 - adds r0, r1, r3 -_080AB8B0: - str r0, [r2] -_080AB8B2: - ldr r0, _080AB96C - ldr r3, [r0] - mov r4, r8 - ldr r0, [r4, 0x8] - subs r0, 0x40 - ldr r2, [r3, 0x24] - subs r1, r2, r0 - adds r0, r1, 0 - cmp r1, 0 - bge _080AB8C8 - adds r0, 0x3F -_080AB8C8: - asrs r0, 6 - lsls r0, 6 - subs r0, r1, r0 - cmp r0, 0x3B - ble _080AB8FC - adds r1, r2, 0x5 - adds r0, r1, 0 - cmp r1, 0 - bge _080AB8DE - adds r0, r2, 0 - adds r0, 0x44 -_080AB8DE: - asrs r0, 6 - lsls r0, 6 - subs r0, r1, r0 - mov r5, r8 - str r0, [r5, 0x8] - lsls r1, r0, 1 - adds r1, r0 - lsls r1, 2 - adds r0, r3, 0 - adds r0, 0x30 - adds r0, r1 - ldr r1, [r0, 0x4] - ldr r0, [r0] - str r0, [sp, 0x10] - str r1, [sp, 0x14] -_080AB8FC: - mov r0, r9 - ldr r1, [sp, 0x28] - bl sub_80A9F20 - adds r6, r0, 0 - cmp r6, 0 - bne _080AB9E6 - ldr r0, [sp, 0x10] - ldr r1, [sp, 0x20] - subs r0, r1 - str r0, [sp, 0x18] - ldr r2, [sp, 0x28] - ldr r1, [r2, 0x4] - ldr r3, [sp, 0x24] - subs r1, r3 - add r0, sp, 0x18 - str r1, [r0, 0x4] - movs r5, 0xA1 - lsls r5, 1 - add r5, r9 - movs r4, 0 - ldrsb r4, [r5, r4] - bl VecDirection8Radial - adds r1, r0, 0 - lsls r1, 24 - asrs r1, 24 - adds r0, r4, 0 - bl sub_8002B04 - strb r0, [r5] - mov r4, r8 - ldr r0, [r4] - cmp r0, 0 - ble _080AB970 - movs r1, 0xB2 - lsls r1, 1 - add r1, r9 - movs r0, 0x4 - str r0, [r1] - ldr r1, [r4] - movs r0, 0x80 - lsls r0, 2 - movs r2, 0x80 - lsls r2, 4 - cmp r1, r0 - ble _080AB95E - movs r2, 0xA0 - lsls r2, 4 -_080AB95E: - adds r4, r2, 0 - mov r0, r9 - movs r1, 0x1 - bl sub_80AAF68 - b _080AB982 - .align 2, 0 -_080AB96C: .4byte gGroundLivesMeta -_080AB970: - ldr r4, _080AB9F8 - movs r0, 0xB2 - lsls r0, 1 - add r0, r9 - str r6, [r0] - mov r0, r9 - movs r1, 0 - bl sub_80AAF68 -_080AB982: - movs r0, 0xAE - lsls r0, 1 - add r0, r9 - ldrb r0, [r0] - cmp r0, 0 - bne _080AB9B6 - movs r0, 0xB4 - lsls r0, 1 - add r0, r9 - movs r5, 0 - ldrsh r0, [r0, r5] - cmp r4, r0 - bne _080AB9B6 - ldr r1, _080AB9FC - add r1, r9 - movs r0, 0xA1 - lsls r0, 1 - add r0, r9 - ldrb r1, [r1] - lsls r1, 24 - asrs r1, 24 - ldrb r0, [r0] - lsls r0, 24 - asrs r0, 24 - cmp r1, r0 - beq _080AB9E6 -_080AB9B6: - movs r1, 0xAE - lsls r1, 1 - add r1, r9 - movs r0, 0 - strb r0, [r1] - movs r0, 0xB8 - lsls r0, 1 - add r0, r9 - movs r1, 0xB4 - lsls r1, 1 - add r1, r9 - strh r4, [r1] - movs r3, 0xA1 - lsls r3, 1 - add r3, r9 - ldrb r1, [r3] - ldr r2, _080AB9FC - add r2, r9 - strb r1, [r2] - movs r2, 0 - ldrsb r2, [r3, r2] - adds r1, r4, 0 - bl sub_80A6EFC -_080AB9E6: - add sp, 0x2C - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_080AB9F8: .4byte 0x00000807 -_080AB9FC: .4byte 0x0000015d - thumb_func_end sub_80AB5D4 thumb_func_start sub_80ABA00 sub_80ABA00: diff --git a/src/ground_lives.c b/src/ground_lives.c index dfab3ded1..35275f98c 100644 --- a/src/ground_lives.c +++ b/src/ground_lives.c @@ -24,15 +24,22 @@ struct GroundLivesMeta_Sub1 s32 unk8; }; +struct GroundLivesMeta_Sub2C +{ + s32 unk0; + PixelPos unk4; +}; + #define GROUND_LIVES_META_UNK0_COUNT 3 +#define GROUND_LIVES_META_UNK2C_COUNT 64 struct unkStruct_3001B80 { // size: 0x338 struct GroundLivesMeta_Sub1 unk0[GROUND_LIVES_META_UNK0_COUNT]; s32 unk24; - u8 unk28; - struct GroundLivesMeta_Sub1 unk2C[0x40]; + s8 unk28; + struct GroundLivesMeta_Sub2C unk2C[GROUND_LIVES_META_UNK2C_COUNT]; ScriptInfoSmall unk32C; }; IWRAM_INIT struct unkStruct_3001B80 *gGroundLivesMeta = NULL; @@ -98,8 +105,7 @@ void AllocGroundLives(void) gGroundLivesMeta = MemoryAlloc(sizeof(struct unkStruct_3001B80),6); gGroundLives = MemoryAlloc(sizeof(struct unkStruct_3001B84),6); - for(index = 0, ptr = &gGroundLives->array[index]; index < UNK_3001B84_ARR_COUNT; index = (s16)(index + 1), ptr++) - { + for (index = 0, ptr = &gGroundLives->array[index]; index < UNK_3001B84_ARR_COUNT; index = (s16)(index + 1), ptr++) { ptr->unk2 = -1; } GetFunctionScript(0,&gGroundLivesMeta->unk32C,0x19); @@ -109,39 +115,33 @@ void AllocGroundLives(void) void DeleteGroundLives(void) { - int index; - struct unkStruct_3001B84_sub *iVar4; - struct GroundLivesMeta_Sub1 *ptr; + int i; + struct unkStruct_3001B84_sub *iVar4; - - iVar4 = &gGroundLives->array[0]; - for(index = 0; index < UNK_3001B84_ARR_COUNT; index = (s16)(index + 1), iVar4++) - { - if (iVar4->unk2 != -1) { - GroundLives_Delete(index); + iVar4 = &gGroundLives->array[0]; + for (i = 0; i < UNK_3001B84_ARR_COUNT; i = (s16)(i + 1), iVar4++) { + if (iVar4->unk2 != -1) { + GroundLives_Delete(i); + } } - } - gGroundLivesMeta->unk24 = -1; - gGroundLivesMeta->unk28 = -1; + gGroundLivesMeta->unk24 = -1; + gGroundLivesMeta->unk28 = -1; + + for (i = 0; i < GROUND_LIVES_META_UNK0_COUNT; i++) { + struct GroundLivesMeta_Sub1 *ptr0 = &gGroundLivesMeta->unk0[i]; + ptr0->unk8 = -1; + ptr0->unk0 = 0; + ptr0->unk4 = 0; + } - for(index = 0; index < 3; ptr++, index++) - { - ptr = &gGroundLivesMeta->unk0[index]; - ptr->unk8 = -1; - ptr->unk0 = 0; - ptr->unk4 = 0; - } - - - for(index = 0; index < 0x40; ptr++, index++) - { - ptr = &gGroundLivesMeta->unk2C[index]; - ptr->unk0 = 0; - ptr->unk4 = 0; - ptr->unk8 = 0; - } + for (i = 0; i < GROUND_LIVES_META_UNK2C_COUNT; i++) { + struct GroundLivesMeta_Sub2C *ptr2C = &gGroundLivesMeta->unk2C[i]; + ptr2C->unk0 = 0; + ptr2C->unk4.x = 0; + ptr2C->unk4.y = 0; + } } void FreeGroundLives(void) @@ -862,7 +862,7 @@ void GroundLives_Delete(s32 id_) } extern void sub_80A6688(struct UnkGroundSpriteStruct *ptr, s32 a0); -extern void sub_80AB5A4(void); +void sub_80AB5A4(void); void sub_80A86C8(s32 id_, u32 flags) { @@ -2754,12 +2754,12 @@ void GroundLives_Action(void) if (prevUnk24 < 0) { s32 i; struct GroundLivesMeta_Sub1 *loopPtr; - struct GroundLivesMeta_Sub1 *metaSub = &gGroundLivesMeta->unk2C[0]; + struct GroundLivesMeta_Sub2C *metaSub = &gGroundLivesMeta->unk2C[0]; gGroundLivesMeta->unk24 = 0; gGroundLivesMeta->unk2C[0].unk0 = 0; - metaSub->unk4 = livesPtr->unk144.x + livesPtr->unk14.x; - metaSub->unk8 = livesPtr->unk144.y + livesPtr->unk14.y; + metaSub->unk4.x = livesPtr->unk144.x + livesPtr->unk14.x; + metaSub->unk4.y = livesPtr->unk144.y + livesPtr->unk14.y; loopPtr = &gGroundLivesMeta->unk0[0]; for (i = 0; i < GROUND_LIVES_META_UNK0_COUNT; i++, loopPtr++) { loopPtr->unk8 = 0; @@ -2769,16 +2769,16 @@ void GroundLives_Action(void) } else { PixelPos subbed, absed; - struct GroundLivesMeta_Sub1 *prev; - struct GroundLivesMeta_Sub1 *metaSub; + struct GroundLivesMeta_Sub2C *prev; + struct GroundLivesMeta_Sub2C *metaSub; s32 nextUnk24 = (prevUnk24 + 1) % 64; gGroundLivesMeta->unk24 = nextUnk24; metaSub = &gGroundLivesMeta->unk2C[gGroundLivesMeta->unk24]; - metaSub->unk4 = livesPtr->unk144.x + livesPtr->unk14.x; - metaSub->unk8 = livesPtr->unk144.y + livesPtr->unk14.y; + metaSub->unk4.x = livesPtr->unk144.x + livesPtr->unk14.x; + metaSub->unk4.y = livesPtr->unk144.y + livesPtr->unk14.y; prev = &gGroundLivesMeta->unk2C[prevUnk24]; - subbed = (PixelPos) {metaSub->unk4- prev->unk4, metaSub->unk8 - prev->unk8}; + subbed = (PixelPos) {metaSub->unk4.x - prev->unk4.x, metaSub->unk4.y - prev->unk4.y}; absed = (PixelPos) {abs(subbed.x), abs(subbed.y)}; metaSub->unk0 = max(absed.x, absed.y); @@ -2795,4 +2795,201 @@ void GroundLives_Action(void) } } +void sub_80AB5A4(void) +{ + struct GroundLivesMeta_Sub1 *loopPtr; + s32 i; + + gGroundLivesMeta->unk24 = -1; + gGroundLivesMeta->unk28 = -1; + + loopPtr = &gGroundLivesMeta->unk0[0]; + for (i = 0; i < GROUND_LIVES_META_UNK0_COUNT; i++, loopPtr++) { + loopPtr->unk8 = -1; + loopPtr->unk0 = 0; + loopPtr->unk4 = 0; + } +} + +s32 sub_80ABA00(s32); + +extern const s32 gUnknown_8118050[]; + +void sub_80AB5D4(struct unkStruct_3001B84_sub *livesPtr) +{ + struct GroundLivesMeta_Sub1 *metaPtr = &gGroundLivesMeta->unk0[livesPtr->unk13C]; + + if (livesPtr->unk13C == 0) + return; + + livesPtr->unk15E = 0x300; + livesPtr->unk160 = 1; + if (livesPtr->unk11C & 0x2000) { + if (livesPtr->unk142 != 4 || livesPtr->unk168 != 0x800) { + livesPtr->unk164 = 0; + livesPtr->unk168 = 0x800; + livesPtr->unk142 = 4; + livesPtr->unk15C = 1; + } + if (gGroundLivesMeta->unk28 != -1) { + PixelPos pixPos = SetVecFromDirectionSpeed(gGroundLivesMeta->unk28, 0x100); + sub_80A9F94(livesPtr, &pixPos); + } + if (metaPtr->unk8 < 0 && gGroundLivesMeta->unk24 >= 0) { + metaPtr->unk8 = gGroundLivesMeta->unk24; + metaPtr->unk0 = 0; + metaPtr->unk4 = 0; + } + } + else { + PixelPos subbed, absed; + struct GroundLivesMeta_Sub2C *unkMeta; + s32 r12; + s32 r6; + s32 r7; + bool8 loop; + PixelPos pixPos32 = { livesPtr->unk144.x + livesPtr->unk14.x, livesPtr->unk144.y + livesPtr->unk14.y }; + PixelPos pixPos16 = pixPos32; + + if (metaPtr->unk8 < 0) { + if (gGroundLivesMeta->unk24 < 0) + return; + metaPtr->unk8 = gGroundLivesMeta->unk24; + metaPtr->unk0 = 0; + metaPtr->unk4 = 0; + } + + r7 = metaPtr->unk0; + loop = TRUE; + while (loop) { + s32 r1; + struct GroundLivesMeta_Sub2C *meta2CPtr = &gGroundLivesMeta->unk2C[metaPtr->unk8]; + PixelPos subbedPos = { meta2CPtr->unk4.x - pixPos16.x, meta2CPtr->unk4.y - pixPos16.y }; + + if (subbedPos.x > 0) { + if (subbedPos.x > r7) { + pixPos16.x = r7 + pixPos16.x; + loop = FALSE; + } + else { + pixPos16.x = meta2CPtr->unk4.x; + } + r1 = subbedPos.x; + } + else if (subbedPos.x < 0) { + if (subbedPos.x < -r7) { + pixPos16.x -= r7; + loop = FALSE; + } + else { + pixPos16.x = meta2CPtr->unk4.x; + } + r1 = -subbedPos.x; + } + else { + r1 = 0; + } + + if (subbedPos.y > 0) { + if (subbedPos.y > r7) { + pixPos16.y += r7; + loop = FALSE; + } + else { + pixPos16.y = meta2CPtr->unk4.y; + if (subbedPos.y > r1) { + r1 = subbedPos.y; + } + } + } + else if (subbedPos.y < 0) { + if (subbedPos.y < -r7) { + pixPos16.y -= r7; + loop = FALSE; + } + else { + pixPos16.y = meta2CPtr->unk4.y; + if (subbedPos.y < -r1) { + r1 = -subbedPos.y; + } + } + } + + if (loop) { + r7 -= r1; + if (r7 <= 0) { + loop = FALSE; + } + else if (metaPtr->unk8 != gGroundLivesMeta->unk24) { + metaPtr->unk8 = (metaPtr->unk8 + 1) % 64; + } + else { + loop = FALSE; + } + } + } + + r6 = sub_80ABA00(metaPtr->unk8); + r12 = gGroundLivesMeta->unk0[livesPtr->unk13C - 1].unk4 + gUnknown_8118050[livesPtr->unk13C]; + unkMeta = &gGroundLivesMeta->unk2C[metaPtr->unk8]; + subbed = (PixelPos) {unkMeta->unk4.x - pixPos16.x, unkMeta->unk4.y - pixPos16.y}; + absed = (PixelPos) {abs(subbed.x), abs(subbed.y)}; + + r6 += max(absed.x, absed.y); + metaPtr->unk4 = r6; + if (r6 <= r12) { + if (metaPtr->unk0 > 0) { + metaPtr->unk0 -= 256; + } + } + else if (r6 <= livesPtr->unk13C * 0x1800) { + if (metaPtr->unk0 < 256) { + metaPtr->unk0 += 256; + } + } + else { + s32 val = gGroundLivesMeta->unk0[livesPtr->unk13C - 1].unk0; + if (val < 256) { + val = 256; + } + if (metaPtr->unk0 < val) { + metaPtr->unk0 += 256; + } + } + + if (((gGroundLivesMeta->unk24 + 64) - metaPtr->unk8) % 64 >= 60) { + metaPtr->unk8 = (gGroundLivesMeta->unk24 + 5) % 64; + pixPos16 = gGroundLivesMeta->unk2C[metaPtr->unk8].unk4; + } + + if (sub_80A9F20(livesPtr, &pixPos16) == 0) { + s32 r4; + PixelPos pixPos24 = { pixPos16.x - pixPos32.x, pixPos16.y - pixPos32.y}; + livesPtr->unk142 = sub_8002B04(livesPtr->unk142, (s8) VecDirection8Radial(&pixPos24)); + if (metaPtr->unk0 > 0) { + s16 asS16; + + livesPtr->unk164 = 4; + asS16 = (metaPtr->unk0 > 0x200) ? 0xA00 : 0x800; + r4 = asS16; + sub_80AAF68(livesPtr, 1); + } + else { + r4 = 0x807; + livesPtr->unk164 = 0; + sub_80AAF68(livesPtr, 0); + } + + if (livesPtr->unk15C != 0 || r4 != livesPtr->unk168 || livesPtr->unk15D != livesPtr->unk142) { + struct UnkGroundSpriteStruct *groundSpritePtr; + + livesPtr->unk15C = 0; + groundSpritePtr = &livesPtr->unk170; + livesPtr->unk168 = r4; + sub_80A6EFC(groundSpritePtr, r4, (livesPtr->unk15D = livesPtr->unk142)); + } + } + } +} + //