From 397115b1c8a9ccb6a7942c80c91474f81514bc8a Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 21 May 2025 10:16:18 +0200 Subject: [PATCH] sub_80AA3F8 --- asm/ground_lives.s | 904 --------------------------------------------- src/ground_lives.c | 299 ++++++++++++++- 2 files changed, 298 insertions(+), 905 deletions(-) diff --git a/asm/ground_lives.s b/asm/ground_lives.s index 807055f5b..aaee42433 100644 --- a/asm/ground_lives.s +++ b/asm/ground_lives.s @@ -7,910 +7,6 @@ - thumb_func_start sub_80A9F94 -sub_80A9F94: - push {r4-r6,lr} - sub sp, 0x10 - adds r4, r0, 0 - movs r2, 0xA2 - lsls r2, 1 - adds r0, r4, r2 - ldr r0, [r0] - ldr r2, [r1] - adds r0, r2 - str r0, [sp] - movs r3, 0xA4 - lsls r3, 1 - adds r0, r4, r3 - ldr r0, [r0] - ldr r1, [r1, 0x4] - adds r0, r1 - str r0, [sp, 0x4] - adds r3, 0x4 - adds r0, r4, r3 - ldr r0, [r0] - adds r0, r2 - str r0, [sp, 0x8] - movs r2, 0xA8 - lsls r2, 1 - adds r0, r4, r2 - ldr r0, [r0] - adds r0, r1 - add r1, sp, 0x8 - str r0, [r1, 0x4] - movs r6, 0 - ldr r3, [r4, 0x28] - ldr r0, [sp] - adds r2, r1, 0 - cmp r0, r3 - bge _080A9FE4 - str r3, [sp] - ldr r0, [r4, 0xC] - adds r0, r3, r0 - str r0, [sp, 0x8] - b _080A9FF4 -_080A9FE4: - ldr r1, [r4, 0x30] - ldr r0, [sp, 0x8] - cmp r0, r1 - blt _080A9FF6 - ldr r0, [r4, 0xC] - subs r0, r1, r0 - str r0, [sp] - str r1, [sp, 0x8] -_080A9FF4: - movs r6, 0x1 -_080A9FF6: - ldr r1, [r4, 0x2C] - ldr r0, [sp, 0x4] - cmp r0, r1 - bge _080AA008 - str r1, [sp, 0x4] - ldr r0, [r4, 0x10] - adds r0, r1, r0 - str r0, [r2, 0x4] - b _080AA018 -_080AA008: - ldr r1, [r4, 0x34] - ldr r0, [r2, 0x4] - cmp r0, r1 - blt _080AA01A - ldr r0, [r4, 0x10] - subs r0, r1, r0 - str r0, [sp, 0x4] - str r1, [r2, 0x4] -_080AA018: - movs r6, 0x1 -_080AA01A: - adds r0, r4, 0 - mov r1, sp - bl sub_80A9488 - adds r5, r0, 0 - cmp r5, 0 - beq _080AA034 - adds r0, r4, 0 - movs r1, 0 - bl sub_80AAF68 - adds r0, r5, 0 - b _080AA06A -_080AA034: - movs r3, 0xA2 - lsls r3, 1 - adds r2, r4, r3 - ldr r0, [sp] - ldr r1, [sp, 0x4] - str r0, [r2] - str r1, [r2, 0x4] - movs r0, 0xA6 - lsls r0, 1 - adds r2, r4, r0 - ldr r0, [sp, 0x8] - ldr r1, [sp, 0xC] - str r0, [r2] - str r1, [r2, 0x4] - cmp r6, 0 - bne _080AA060 - adds r0, r4, 0 - movs r1, 0x1 - bl sub_80AAF68 - movs r0, 0 - b _080AA06A -_080AA060: - adds r0, r4, 0 - movs r1, 0 - bl sub_80AAF68 - movs r0, 0x1 -_080AA06A: - add sp, 0x10 - pop {r4-r6} - pop {r1} - bx r1 - thumb_func_end sub_80A9F94 - - thumb_func_start sub_80AA074 -sub_80AA074: - push {r4-r7,lr} - sub sp, 0x10 - adds r4, r0, 0 - movs r2, 0xA2 - lsls r2, 1 - adds r0, r4, r2 - ldr r0, [r0] - ldr r2, [r1] - adds r0, r2 - str r0, [sp] - movs r3, 0xA4 - lsls r3, 1 - adds r0, r4, r3 - ldr r0, [r0] - ldr r1, [r1, 0x4] - adds r0, r1 - str r0, [sp, 0x4] - adds r3, 0x4 - adds r0, r4, r3 - ldr r0, [r0] - adds r0, r2 - str r0, [sp, 0x8] - movs r2, 0xA8 - lsls r2, 1 - adds r0, r4, r2 - ldr r0, [r0] - adds r0, r1 - add r1, sp, 0x8 - str r0, [r1, 0x4] - ldr r3, [r4, 0x28] - ldr r0, [sp] - adds r5, r1, 0 - cmp r0, r3 - bge _080AA0C2 - str r3, [sp] - ldr r0, [r4, 0xC] - adds r0, r3, r0 - str r0, [sp, 0x8] - b _080AA0D2 -_080AA0C2: - ldr r1, [r4, 0x30] - ldr r0, [sp, 0x8] - cmp r0, r1 - blt _080AA0D2 - ldr r0, [r4, 0xC] - subs r0, r1, r0 - str r0, [sp] - str r1, [sp, 0x8] -_080AA0D2: - ldr r1, [r4, 0x2C] - ldr r0, [sp, 0x4] - cmp r0, r1 - bge _080AA0E4 - str r1, [sp, 0x4] - ldr r0, [r4, 0x10] - adds r0, r1, r0 - str r0, [r5, 0x4] - b _080AA0F4 -_080AA0E4: - ldr r1, [r4, 0x34] - ldr r0, [r5, 0x4] - cmp r0, r1 - blt _080AA0F4 - ldr r0, [r4, 0x10] - subs r0, r1, r0 - str r0, [sp, 0x4] - str r1, [r5, 0x4] -_080AA0F4: - adds r0, r4, 0 - mov r1, sp - adds r2, r5, 0 - bl sub_80A95AC - adds r6, r0, 0 - cmp r6, 0 - bne _080AA170 - movs r3, 0xA2 - lsls r3, 1 - adds r2, r4, r3 - ldr r0, [sp] - ldr r1, [sp, 0x4] - str r0, [r2] - str r1, [r2, 0x4] - movs r0, 0xA6 - lsls r0, 1 - adds r2, r4, r0 - ldr r0, [sp, 0x8] - ldr r1, [sp, 0xC] - str r0, [r2] - str r1, [r2, 0x4] - movs r1, 0x8E - lsls r1, 1 - adds r0, r4, r1 - ldr r0, [r0] - movs r1, 0x10 - ands r0, r1 - cmp r0, 0 - beq _080AA170 - movs r0, 0x20 - mov r1, sp - adds r2, r5, 0 - bl FindGroundEvent - lsls r0, 16 - asrs r5, r0, 16 - cmp r5, 0 - blt _080AA166 - movs r2, 0x9F - lsls r2, 1 - adds r7, r4, r2 - movs r3, 0 - ldrsh r0, [r7, r3] - cmp r0, r5 - beq _080AA170 - movs r1, 0 - ldrsh r0, [r4, r1] - adds r1, r5, 0 - bl sub_80A8ACC - lsls r0, 24 - cmp r0, 0 - beq _080AA170 - strh r5, [r7] - movs r6, 0x2 - b _080AA170 -_080AA166: - movs r2, 0x9F - lsls r2, 1 - adds r1, r4, r2 - ldr r0, _080AA17C - strh r0, [r1] -_080AA170: - adds r0, r6, 0 - add sp, 0x10 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_080AA17C: .4byte 0x0000ffff - thumb_func_end sub_80AA074 - - thumb_func_start sub_80AA180 -sub_80AA180: - push {r4-r7,lr} - sub sp, 0x10 - adds r4, r0, 0 - adds r5, r1, 0 - adds r6, r2, 0 - adds r7, r3, 0 - movs r0, 0x4 - ands r0, r5 - cmp r0, 0 - beq _080AA220 - movs r1, 0 - ldrsh r0, [r4, r1] - movs r1, 0x80 - bl sub_80A9344 - lsls r0, 16 - asrs r0, 16 - cmp r0, 0 - blt _080AA220 - mov r1, sp - bl sub_80A8FD8 - movs r2, 0xA2 - lsls r2, 1 - adds r0, r4, r2 - ldr r1, [r0] - ldr r0, [r4, 0x14] - adds r1, r0 - ldr r0, [sp] - subs r0, r1 - str r0, [sp, 0x8] - movs r3, 0xA4 - lsls r3, 1 - adds r0, r4, r3 - ldr r0, [r0] - ldr r1, [r4, 0x18] - adds r0, r1 - ldr r1, [sp, 0x4] - subs r1, r0 - add r0, sp, 0x8 - str r1, [r0, 0x4] - bl VecDirection8Radial - lsls r0, 24 - asrs r1, r0, 24 - movs r0, 0x1 - negs r0, r0 - cmp r1, r0 - beq _080AA2B2 - movs r0, 0xA1 - lsls r0, 1 - adds r2, r4, r0 - lsls r0, r1, 24 - lsrs r0, 24 - strb r0, [r2] - ldr r3, _080AA21C - adds r1, r4, r3 - ldrb r1, [r1] - lsls r1, 24 - asrs r1, 24 - lsls r0, 24 - asrs r0, 24 - cmp r1, r0 - beq _080AA20A - movs r0, 0xAE - lsls r0, 1 - adds r1, r4, r0 - movs r0, 0x1 - strb r0, [r1] -_080AA20A: - movs r1, 0 - ldrsb r1, [r2, r1] - adds r0, r4, 0 - bl sub_80AA3F8 - lsls r0, 24 - cmp r0, 0 - bne _080AA2AE - b _080AA2B2 - .align 2, 0 -_080AA21C: .4byte 0x0000015d -_080AA220: - movs r0, 0x8 - ands r0, r5 - cmp r0, 0 - beq _080AA2B2 - movs r0, 0x80 - adds r1, r6, 0 - adds r2, r7, 0 - bl sub_80AC554 - lsls r0, 16 - asrs r0, 16 - cmp r0, 0 - blt _080AA2B2 - mov r1, sp - bl sub_80AC448 - movs r1, 0xA2 - lsls r1, 1 - adds r0, r4, r1 - ldr r1, [r0] - ldr r0, [r4, 0x14] - adds r1, r0 - ldr r0, [sp] - subs r0, r1 - str r0, [sp, 0x8] - add r0, sp, 0x8 - movs r2, 0xA4 - lsls r2, 1 - adds r1, r4, r2 - ldr r2, [r1] - ldr r1, [r4, 0x18] - adds r2, r1 - ldr r1, [sp, 0x4] - subs r1, r2 - str r1, [r0, 0x4] - bl VecDirection8Radial - lsls r0, 24 - asrs r1, r0, 24 - movs r0, 0x1 - negs r0, r0 - cmp r1, r0 - beq _080AA2B2 - movs r3, 0xA1 - lsls r3, 1 - adds r2, r4, r3 - lsls r0, r1, 24 - lsrs r0, 24 - strb r0, [r2] - adds r3, 0x1B - adds r1, r4, r3 - ldrb r1, [r1] - lsls r1, 24 - asrs r1, 24 - lsls r0, 24 - asrs r0, 24 - cmp r1, r0 - beq _080AA29E - movs r0, 0xAE - lsls r0, 1 - adds r1, r4, r0 - movs r0, 0x1 - strb r0, [r1] -_080AA29E: - movs r1, 0 - ldrsb r1, [r2, r1] - adds r0, r4, 0 - bl sub_80AA3F8 - lsls r0, 24 - cmp r0, 0 - beq _080AA2B2 -_080AA2AE: - movs r0, 0x3 - b _080AA2B4 -_080AA2B2: - movs r0, 0 -_080AA2B4: - add sp, 0x10 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end sub_80AA180 - - thumb_func_start sub_80AA2BC -sub_80AA2BC: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x20 - adds r7, r0, 0 - mov r8, r1 - ldr r0, [r2] - ldr r1, [r2, 0x4] - str r0, [sp] - str r1, [sp, 0x4] - ldr r0, [r3] - ldr r1, [r3, 0x4] - str r0, [sp, 0x10] - str r1, [sp, 0x14] - ldr r0, [sp] - cmp r0, 0 - bge _080AA2E6 - ldr r1, _080AA3C4 - adds r0, r1 -_080AA2E6: - asrs r0, 11 - str r0, [sp, 0x8] - ldr r0, [sp, 0x4] - cmp r0, 0 - bge _080AA2F4 - ldr r2, _080AA3C4 - adds r0, r2 -_080AA2F4: - asrs r0, 11 - add r1, sp, 0x8 - str r0, [r1, 0x4] - ldr r4, [sp, 0x10] - subs r0, r4, 0x1 - mov r10, r1 - cmp r0, 0 - bge _080AA308 - ldr r1, _080AA3C8 - adds r0, r4, r1 -_080AA308: - asrs r2, r0, 11 - add r0, sp, 0x10 - ldr r4, [r0, 0x4] - subs r1, r4, 0x1 - mov r9, r0 - cmp r1, 0 - bge _080AA31A - ldr r0, _080AA3C8 - adds r1, r4, r0 -_080AA31A: - asrs r3, r1, 11 - ldr r0, [sp, 0x8] - subs r0, r2, r0 - adds r0, 0x1 - str r0, [sp, 0x18] - mov r1, r10 - ldr r0, [r1, 0x4] - subs r0, r3, r0 - adds r0, 0x1 - add r1, sp, 0x18 - str r0, [r1, 0x4] - movs r0, 0x4 - mov r2, r8 - ands r0, r2 - cmp r0, 0 - beq _080AA394 - movs r1, 0 - ldrsh r0, [r7, r1] - movs r1, 0x80 - mov r2, sp - mov r3, r9 - bl GetLivesCollision_80A92A0 - lsls r0, 16 - asrs r5, r0, 16 - cmp r5, 0 - blt _080AA394 - ldr r1, _080AA3CC - lsls r0, r5, 5 - subs r0, r5 - lsls r0, 4 - ldr r1, [r1] - adds r6, r1, r0 - movs r2, 0x8E - lsls r2, 1 - adds r0, r6, r2 - ldr r0, [r0] - movs r1, 0x80 - lsls r1, 2 - ands r0, r1 - cmp r0, 0 - beq _080AA384 - movs r4, 0xA1 - lsls r4, 1 - adds r0, r7, r4 - ldrb r0, [r0] - lsls r0, 24 - asrs r0, 24 - movs r1, 0x5 - bl sub_8002984 - adds r4, r6, r4 - strb r0, [r4] -_080AA384: - movs r1, 0 - ldrsh r0, [r7, r1] - adds r1, r5, 0 - bl GroundLives_ExecutePlayerScriptActionLives - lsls r0, 24 - cmp r0, 0 - bne _080AA3BE -_080AA394: - movs r0, 0x8 - mov r2, r8 - ands r0, r2 - cmp r0, 0 - beq _080AA3D0 - movs r0, 0x80 - mov r1, sp - mov r2, r9 - bl sub_80AC4C8 - lsls r0, 16 - asrs r1, r0, 16 - cmp r1, 0 - blt _080AA3D0 - movs r2, 0 - ldrsh r0, [r7, r2] - bl sub_80A8A5C - lsls r0, 24 - cmp r0, 0 - beq _080AA3D0 -_080AA3BE: - movs r0, 0x3 - b _080AA3E6 - .align 2, 0 -_080AA3C4: .4byte 0x000007ff -_080AA3C8: .4byte 0x000007fe -_080AA3CC: .4byte gGroundLives -_080AA3D0: - movs r0, 0x10 - mov r1, r10 - add r2, sp, 0x18 - bl sub_80A595C - lsls r0, 24 - cmp r0, 0 - bne _080AA3E4 - movs r0, 0 - b _080AA3E6 -_080AA3E4: - movs r0, 0x6 -_080AA3E6: - add sp, 0x20 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end sub_80AA2BC - - thumb_func_start sub_80AA3F8 -sub_80AA3F8: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x40 - adds r6, r0, 0 - lsls r1, 24 - asrs r1, 24 - str r1, [sp, 0x28] - movs r2, 0x80 - lsls r2, 1 - mov r0, sp - bl SetVecFromDirectionSpeed - ldr r4, [sp] - ldr r5, [sp, 0x4] - movs r0, 0xA2 - lsls r0, 1 - adds r0, r6 - mov r9, r0 - ldr r0, [r0] - adds r0, r4 - str r0, [sp, 0x8] - movs r1, 0xA4 - lsls r1, 1 - adds r1, r6 - mov r10, r1 - ldr r0, [r1] - adds r0, r5 - add r2, sp, 0x8 - str r0, [r2, 0x4] - movs r1, 0xA6 - lsls r1, 1 - adds r0, r6, r1 - ldr r0, [r0] - adds r0, r4 - str r0, [sp, 0x10] - adds r1, 0x4 - adds r0, r6, r1 - ldr r0, [r0] - adds r0, r5 - add r3, sp, 0x10 - str r0, [r3, 0x4] - adds r0, r6, 0 - movs r1, 0xC - bl sub_80AA2BC - adds r7, r0, 0 - cmp r7, 0x3 - bne _080AA462 -_080AA45E: - movs r0, 0x1 - b _080AA650 -_080AA462: - ldr r0, [r6, 0xC] - lsrs r1, r0, 31 - adds r0, r1 - asrs r0, 1 - movs r2, 0x80 - lsls r2, 2 - mov r8, r2 - add r0, r8 - muls r0, r4 - cmp r0, 0 - bge _080AA47A - adds r0, 0xFF -_080AA47A: - asrs r0, 8 - str r0, [sp, 0x2C] - ldr r0, [r6, 0x10] - lsrs r1, r0, 31 - adds r0, r1 - asrs r0, 1 - add r0, r8 - muls r0, r5 - cmp r0, 0 - bge _080AA490 - adds r0, 0xFF -_080AA490: - asrs r0, 8 - str r0, [sp, 0x30] - mov r1, r9 - ldr r0, [r1] - ldr r1, [r6, 0x14] - adds r0, r1 - ldr r2, [sp, 0x2C] - adds r0, r2 - ldr r2, _080AA4F4 - adds r0, r2 - str r0, [sp, 0x18] - mov r1, r10 - ldr r0, [r1] - ldr r1, [r6, 0x18] - adds r0, r1 - ldr r1, [sp, 0x30] - adds r0, r1 - adds r0, r2 - add r2, sp, 0x18 - str r0, [r2, 0x4] - movs r1, 0xC0 - lsls r1, 3 - ldr r0, [sp, 0x18] - adds r0, r1 - str r0, [sp, 0x20] - ldr r0, [r2, 0x4] - adds r0, r1 - add r3, sp, 0x20 - str r0, [r3, 0x4] - ldr r0, _080AA4F8 - mov r9, r0 - ldr r0, [sp, 0x28] - lsls r1, r0, 2 - add r9, r1 - mov r0, r9 - ldr r0, [r0] - str r0, [sp, 0x34] - ldr r0, _080AA4FC - adds r0, r1, r0 - ldr r0, [r0] - str r0, [sp, 0x38] - ldr r0, _080AA500 - adds r1, r0 - ldr r1, [r1] - str r1, [sp, 0x3C] - mov r10, r8 - mov r9, r2 - mov r8, r3 - b _080AA568 - .align 2, 0 -_080AA4F4: .4byte 0xfffffd00 -_080AA4F8: .4byte gUnknown_8117FF0 -_080AA4FC: .4byte gUnknown_8118010 -_080AA500: .4byte gUnknown_8118030 -_080AA504: - ldr r1, [r6, 0x28] - ldr r0, [sp, 0x18] - cmp r0, r1 - bge _080AA50E - b _080AA64E -_080AA50E: - ldr r1, [r6, 0x30] - ldr r0, [sp, 0x20] - cmp r0, r1 - blt _080AA518 - b _080AA64E -_080AA518: - ldr r1, [r6, 0x2C] - mov r2, r9 - ldr r0, [r2, 0x4] - cmp r0, r1 - bge _080AA524 - b _080AA64E -_080AA524: - ldr r1, [r6, 0x34] - mov r2, r8 - ldr r0, [r2, 0x4] - cmp r0, r1 - blt _080AA530 - b _080AA64E -_080AA530: - adds r0, r6, 0 - movs r1, 0xC - mov r2, r9 - mov r3, r8 - bl sub_80AA2BC - adds r7, r0, 0 - cmp r7, 0x3 - beq _080AA45E - ldr r0, [sp, 0x18] - adds r0, r4 - str r0, [sp, 0x18] - mov r1, r9 - ldr r0, [r1, 0x4] - adds r0, r5 - str r0, [r1, 0x4] - ldr r0, [sp, 0x20] - adds r0, r4 - str r0, [sp, 0x20] - mov r2, r8 - ldr r0, [r2, 0x4] - adds r0, r5 - str r0, [r2, 0x4] - cmp r7, 0x6 - beq _080AA572 - movs r0, 0x80 - lsls r0, 1 - add r10, r0 -_080AA568: - ldr r1, [sp, 0x34] - cmp r10, r1 - blt _080AA504 - cmp r7, 0x6 - bne _080AA64E -_080AA572: - ldr r2, [sp, 0x38] - cmp r10, r2 - bge _080AA5DC -_080AA578: - ldr r1, [sp, 0x18] - ldr r0, [r6, 0x28] - cmp r1, r0 - blt _080AA64E - ldr r1, [sp, 0x20] - ldr r0, [r6, 0x30] - cmp r1, r0 - bge _080AA64E - mov r0, r9 - ldr r1, [r0, 0x4] - ldr r0, [r6, 0x2C] - cmp r1, r0 - blt _080AA64E - mov r2, r8 - ldr r1, [r2, 0x4] - ldr r0, [r6, 0x34] - cmp r1, r0 - bge _080AA64E - adds r0, r6, 0 - movs r1, 0x4 - mov r2, r9 - mov r3, r8 - bl sub_80AA2BC - adds r7, r0, 0 - cmp r7, 0x3 - bne _080AA5B0 - b _080AA45E -_080AA5B0: - ldr r0, [sp, 0x18] - adds r0, r4 - str r0, [sp, 0x18] - mov r1, r9 - ldr r0, [r1, 0x4] - adds r0, r5 - str r0, [r1, 0x4] - ldr r0, [sp, 0x20] - adds r0, r4 - str r0, [sp, 0x20] - mov r2, r8 - ldr r0, [r2, 0x4] - adds r0, r5 - str r0, [r2, 0x4] - cmp r7, 0x6 - bne _080AA5E0 - movs r0, 0x80 - lsls r0, 1 - add r10, r0 - ldr r1, [sp, 0x38] - cmp r10, r1 - blt _080AA578 -_080AA5DC: - cmp r7, 0x6 - beq _080AA64E -_080AA5E0: - movs r2, 0 - mov r10, r2 - ldr r0, [sp, 0x3C] - cmp r10, r0 - bge _080AA64E -_080AA5EA: - ldr r1, [sp, 0x18] - ldr r0, [r6, 0x28] - cmp r1, r0 - blt _080AA64E - ldr r1, [sp, 0x20] - ldr r0, [r6, 0x30] - cmp r1, r0 - bge _080AA64E - mov r2, r9 - ldr r1, [r2, 0x4] - ldr r0, [r6, 0x2C] - cmp r1, r0 - blt _080AA64E - mov r0, r8 - ldr r1, [r0, 0x4] - ldr r0, [r6, 0x34] - cmp r1, r0 - bge _080AA64E - adds r0, r6, 0 - movs r1, 0x4 - mov r2, r9 - mov r3, r8 - bl sub_80AA2BC - adds r7, r0, 0 - cmp r7, 0x3 - bne _080AA622 - b _080AA45E -_080AA622: - cmp r7, 0x6 - beq _080AA64E - ldr r0, [sp, 0x18] - adds r0, r4 - str r0, [sp, 0x18] - mov r1, r9 - ldr r0, [r1, 0x4] - adds r0, r5 - str r0, [r1, 0x4] - ldr r0, [sp, 0x20] - adds r0, r4 - str r0, [sp, 0x20] - mov r2, r8 - ldr r0, [r2, 0x4] - adds r0, r5 - str r0, [r2, 0x4] - movs r0, 0x80 - lsls r0, 1 - add r10, r0 - ldr r1, [sp, 0x3C] - cmp r10, r1 - blt _080AA5EA -_080AA64E: - movs r0, 0 -_080AA650: - add sp, 0x40 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end sub_80AA3F8 - thumb_func_start sub_80AA660 sub_80AA660: push {r4,lr} diff --git a/src/ground_lives.c b/src/ground_lives.c index 0eedd5ca8..2b0156251 100644 --- a/src/ground_lives.c +++ b/src/ground_lives.c @@ -1593,7 +1593,7 @@ s32 sub_80A9488(struct unkStruct_3001B84_sub *livesPtr, PixelPos *posArg1, Pixel } extern void sub_80AC3E0(s32 id, s32 *a1); - +extern PixelPos SetVecFromDirectionSpeed(s8 r1, u32 r2); s32 sub_80A95AC(struct unkStruct_3001B84_sub *livesPtr, PixelPos *posArg1, PixelPos *posArg2) { @@ -1786,4 +1786,301 @@ s32 sub_80A9F20(struct unkStruct_3001B84_sub *livesPtr, PixelPos *pixelPosArg) } } +void sub_80AAF68(struct unkStruct_3001B84_sub *livesPtr, u32 unused); + +s32 sub_80A9F94(struct unkStruct_3001B84_sub *livesPtr, PixelPos *pixelPosArg) +{ + s32 ret; + bool8 changed; + PixelPos pixPos1, pixPos2; + + pixPos1.x = livesPtr->unk144.x + pixelPosArg->x; + pixPos1.y = livesPtr->unk144.y + pixelPosArg->y; + + pixPos2.x = livesPtr->unk14C.x + pixelPosArg->x; + pixPos2.y = livesPtr->unk14C.y + pixelPosArg->y; + + changed = FALSE; + if (pixPos1.x < livesPtr->unk28.x) { + pixPos1.x = livesPtr->unk28.x; + pixPos2.x = livesPtr->unk28.x + livesPtr->unkC.x; + changed = TRUE; + } + else if (pixPos2.x >= livesPtr->unk30.x) { + pixPos1.x = livesPtr->unk30.x - livesPtr->unkC.x; + pixPos2.x = livesPtr->unk30.x; + changed = TRUE; + } + + if (pixPos1.y < livesPtr->unk28.y) { + pixPos1.y = livesPtr->unk28.y; + pixPos2.y = livesPtr->unk28.y + livesPtr->unkC.y; + changed = TRUE; + } + else if (pixPos2.y >= livesPtr->unk30.y) { + pixPos1.y = livesPtr->unk30.y - livesPtr->unkC.y; + pixPos2.y = livesPtr->unk30.y; + changed = TRUE; + } + + ret = sub_80A9488(livesPtr, &pixPos1, &pixPos2); + if (ret != 0) { + sub_80AAF68(livesPtr, 0); + return ret; + } + + livesPtr->unk144 = pixPos1; + livesPtr->unk14C = pixPos2; + if (changed) { + sub_80AAF68(livesPtr, 0); + return 1; + } + else { + sub_80AAF68(livesPtr, 1); + return 0; + } +} + +s32 sub_80AA074(struct unkStruct_3001B84_sub *livesPtr, PixelPos *pixelPosArg) +{ + s32 ret; + PixelPos pixPos1, pixPos2; + + pixPos1.x = livesPtr->unk144.x + pixelPosArg->x; + pixPos1.y = livesPtr->unk144.y + pixelPosArg->y; + + pixPos2.x = livesPtr->unk14C.x + pixelPosArg->x; + pixPos2.y = livesPtr->unk14C.y + pixelPosArg->y; + + if (pixPos1.x < livesPtr->unk28.x) { + pixPos1.x = livesPtr->unk28.x; + pixPos2.x = livesPtr->unk28.x + livesPtr->unkC.x; + } + else if (pixPos2.x >= livesPtr->unk30.x) { + pixPos1.x = livesPtr->unk30.x - livesPtr->unkC.x; + pixPos2.x = livesPtr->unk30.x; + } + + if (pixPos1.y < livesPtr->unk28.y) { + pixPos1.y = livesPtr->unk28.y; + pixPos2.y = livesPtr->unk28.y + livesPtr->unkC.y; + } + else if (pixPos2.y >= livesPtr->unk30.y) { + pixPos1.y = livesPtr->unk30.y - livesPtr->unkC.y; + pixPos2.y = livesPtr->unk30.y; + } + + ret = sub_80A95AC(livesPtr, &pixPos1, &pixPos2); + if (ret == 0) { + livesPtr->unk144 = pixPos1; + livesPtr->unk14C = pixPos2; + if (livesPtr->unk11C & 0x10) { + s32 id = (s16) FindGroundEvent(0x20, &pixPos1, &pixPos2); + if (id >= 0) { + if (livesPtr->unk13E != id && sub_80A8ACC(livesPtr->unk0, id)) { + livesPtr->unk13E = id; + ret = 2; + } + } + else { + livesPtr->unk13E = -1; + } + } + ASM_MATCH_TRICK(ret); + } + + return ret; +} + +bool8 sub_80AA3F8(struct unkStruct_3001B84_sub *livesPtr, s32 a1); +extern s32 sub_80AC554(u32 a0, PixelPos *pixelPosArg1, PixelPos *pixelPosArg2); +extern s32 sub_80AC448(s32 id_, PixelPos *pixelPos); +extern bool8 sub_80A595C(u32 a0, PixelPos *pixelPosArg1, PixelPos *pixelPosArg2); + +s32 sub_80AA180(struct unkStruct_3001B84_sub *livesPtr, u32 flags, PixelPos *pixelPosArg1, PixelPos *pixelPosArg2) +{ + PixelPos pixPos1, pixPos2; + + if (flags & 4) { + s32 id = (s16) sub_80A9344(livesPtr->unk0, 0x80, pixelPosArg1, pixelPosArg2); + if (id >= 0) { + s32 dir; + + sub_80A8FD8(id, &pixPos1); + pixPos2.x = pixPos1.x - (livesPtr->unk144.x + livesPtr->unk14.x); + pixPos2.y = pixPos1.y - (livesPtr->unk144.y + livesPtr->unk14.y); + dir = VecDirection8Radial(&pixPos2); + if (dir != -1) { + // s8 memes + s8 *dirDst = &livesPtr->unk142; + s8 dirS8 = (s8) dir; + *dirDst = dirS8; + if (livesPtr->unk15D != dirS8) { + livesPtr->unk15C = 1; + } + if (sub_80AA3F8(livesPtr, livesPtr->unk142)) + return 3; + } + return 0; + } + } + if (flags & 8) { + s32 id = (s16) sub_80AC554(0x80, pixelPosArg1, pixelPosArg2); + if (id >= 0) { + s32 dir; + + sub_80AC448(id, &pixPos1); + pixPos2.x = pixPos1.x - (livesPtr->unk144.x + livesPtr->unk14.x); + pixPos2.y = pixPos1.y - (livesPtr->unk144.y + livesPtr->unk14.y); + dir = VecDirection8Radial(&pixPos2); + if (dir != -1) { + // s8 memes + s8 *dirDst = &livesPtr->unk142; + s8 dirS8 = (s8) dir; + *dirDst = dirS8; + if (livesPtr->unk15D != dirS8) { + livesPtr->unk15C = 1; + } + if (sub_80AA3F8(livesPtr, livesPtr->unk142)) + return 3; + } + return 0; + } + } + + return 0; +} + +s32 sub_80AA2BC(struct unkStruct_3001B84_sub *livesPtr, u32 flags, PixelPos *pixelPosArg1, PixelPos *pixelPosArg2) +{ + PixelPos pixPos1, pixPos2, pixPos3; + PixelPos posTemp; + PixelPos pixPos4; + + pixPos1 = *pixelPosArg1; + pixPos3 = *pixelPosArg2; + + pixPos2.x = pixPos1.x / 2048; + pixPos2.y = pixPos1.y / 2048; + posTemp = (PixelPos) {((pixPos3.x - 1) / 2048), ((pixPos3.y - 1) / 2048)}; + pixPos4 = (PixelPos) {(posTemp.x- pixPos2.x) + 1, (posTemp.y -pixPos2.y) + 1}; + + if (flags & 4) { + s32 id2 = (s16) GetLivesCollision_80A92A0(livesPtr->unk0, 0x80, &pixPos1, &pixPos3); + if (id2 >= 0) { + struct unkStruct_3001B84_sub *ptr2 = &gGroundLives->array[id2]; + if (ptr2->unk11C & 0x200) { + ptr2->unk142 = sub_8002984(livesPtr->unk142, 5); + } + if (GroundLives_ExecutePlayerScriptActionLives(livesPtr->unk0, id2)) + return 3; + } + } + if (flags & 8) { + s32 id2 = (s16) sub_80AC4C8(0x80, &pixPos1, &pixPos3); + if (id2 >= 0) { + if (sub_80A8A5C(livesPtr->unk0, id2)) + return 3; + } + } + if (sub_80A595C(0x10, &pixPos2, &pixPos4)) { + return 6; + } + + return 0; +} + +extern const s32 gUnknown_8117FF0[]; +extern const s32 gUnknown_8118010[]; +extern const s32 gUnknown_8118030[]; + +bool8 sub_80AA3F8(struct unkStruct_3001B84_sub *livesPtr, s32 a1_) +{ + s32 i; + s32 a1 = (s8) a1_; + PixelPos pixPos1 = SetVecFromDirectionSpeed(a1, 0x100); + PixelPos pixPos2 = { livesPtr->unk144.x + pixPos1.x, livesPtr->unk144.y + pixPos1.y }; + PixelPos pixPos3 = { livesPtr->unk14C.x + pixPos1.x, livesPtr->unk14C.y + pixPos1.y }; + PixelPos pixPos4, pixPos5, pixPos6; + s32 r7 = sub_80AA2BC(livesPtr, 0xC, &pixPos2, &pixPos3); + s32 var_2C, var_28, var_24; + + if (r7 == 3) + return TRUE; + + pixPos6.x = (((livesPtr->unkC.x / 2) + 0x200) * pixPos1.x) / 256; + pixPos6.y = (((livesPtr->unkC.y / 2) + 0x200) * pixPos1.y) / 256; + + pixPos4.x = (livesPtr->unk144.x + livesPtr->unk14.x + pixPos6.x) - 768; + pixPos4.y = (livesPtr->unk144.y + livesPtr->unk14.y + pixPos6.y) - 768; + + pixPos5 = (PixelPos) { pixPos4.x + 0x600, pixPos4.y + 0x600}; + + var_2C = gUnknown_8117FF0[a1]; + var_28 = gUnknown_8118010[a1]; + var_24 = gUnknown_8118030[a1]; + + for (i = 0x200; i < var_2C; i += 0x100) { + if (pixPos4.x < livesPtr->unk28.x || pixPos5.x >= livesPtr->unk30.x) + return FALSE; + if (pixPos4.y < livesPtr->unk28.y || pixPos5.y >= livesPtr->unk30.y) + return FALSE; + + r7 = sub_80AA2BC(livesPtr, 0xC, &pixPos4, &pixPos5); + if (r7 == 3) + return TRUE; + + pixPos4.x += pixPos1.x; + pixPos4.y += pixPos1.y; + pixPos5.x += pixPos1.x; + pixPos5.y += pixPos1.y; + + if (r7 == 6) + break; + } + if (r7 != 6) + return FALSE; + + for (; i < var_28; i += 0x100) { + if (pixPos4.x < livesPtr->unk28.x || pixPos5.x >= livesPtr->unk30.x) + return FALSE; + if (pixPos4.y < livesPtr->unk28.y || pixPos5.y >= livesPtr->unk30.y) + return FALSE; + + r7 = sub_80AA2BC(livesPtr, 4, &pixPos4, &pixPos5); + if (r7 == 3) + return TRUE; + + pixPos4.x += pixPos1.x; + pixPos4.y += pixPos1.y; + pixPos5.x += pixPos1.x; + pixPos5.y += pixPos1.y; + + if (r7 != 6) + break; + } + if (r7 == 6) + return FALSE; + + for (i = 0; i < var_24; i += 0x100) { + if (pixPos4.x < livesPtr->unk28.x || pixPos5.x >= livesPtr->unk30.x) + return FALSE; + if (pixPos4.y < livesPtr->unk28.y || pixPos5.y >= livesPtr->unk30.y) + return FALSE; + + r7 = sub_80AA2BC(livesPtr, 4, &pixPos4, &pixPos5); + if (r7 == 3) + return TRUE; + if (r7 == 6) + return FALSE; + + pixPos4.x += pixPos1.x; + pixPos4.y += pixPos1.y; + pixPos5.x += pixPos1.x; + pixPos5.y += pixPos1.y; + } + + return FALSE; +} + //