From fa95910392e88a88cb096b77c508a1ca6dba2a81 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 21 May 2025 15:56:44 +0200 Subject: [PATCH] sub_80AAAE8 --- asm/ground_lives.s | 1177 -------------------------------------------- src/ground_lives.c | 379 +++++++++++++- 2 files changed, 378 insertions(+), 1178 deletions(-) diff --git a/asm/ground_lives.s b/asm/ground_lives.s index aaee42433..26808de70 100644 --- a/asm/ground_lives.s +++ b/asm/ground_lives.s @@ -6,1183 +6,6 @@ .text - - thumb_func_start sub_80AA660 -sub_80AA660: - push {r4,lr} - adds r4, r0, 0 - movs r0, 0x80 - lsls r0, 1 - bl sub_80AC4C8 - lsls r0, 16 - asrs r1, r0, 16 - cmp r1, 0 - blt _080AA686 - movs r2, 0 - ldrsh r0, [r4, r2] - bl sub_80A8A5C - lsls r0, 24 - cmp r0, 0 - beq _080AA686 - movs r0, 0x4 - b _080AA688 -_080AA686: - movs r0, 0 -_080AA688: - pop {r4} - pop {r1} - bx r1 - thumb_func_end sub_80AA660 - - thumb_func_start sub_80AA690 -sub_80AA690: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x18 - adds r7, r0, 0 - lsls r1, 24 - asrs r1, 24 - mov r9, r1 - movs r2, 0x80 - lsls r2, 1 - mov r0, sp - bl SetVecFromDirectionSpeed - ldr r5, [sp] - ldr r6, [sp, 0x4] - ldr r0, [r7, 0xC] - lsrs r1, r0, 31 - adds r0, r1 - asrs r0, 1 - movs r1, 0x80 - lsls r1, 2 - mov r8, r1 - add r0, r8 - muls r0, r5 - cmp r0, 0 - bge _080AA6CA - adds r0, 0xFF -_080AA6CA: - asrs r3, r0, 8 - ldr r0, [r7, 0x10] - lsrs r1, r0, 31 - adds r0, r1 - asrs r0, 1 - add r0, r8 - muls r0, r6 - cmp r0, 0 - bge _080AA6DE - adds r0, 0xFF -_080AA6DE: - asrs r4, r0, 8 - movs r2, 0xA2 - lsls r2, 1 - adds r0, r7, r2 - ldr r0, [r0] - ldr r1, [r7, 0x14] - adds r0, r1 - adds r0, r3 - ldr r2, _080AA76C - adds r0, r2 - str r0, [sp, 0x8] - movs r1, 0xA4 - lsls r1, 1 - adds r0, r7, r1 - ldr r0, [r0] - ldr r1, [r7, 0x18] - adds r0, r1 - adds r0, r4 - adds r0, r2 - add r2, sp, 0x8 - str r0, [r2, 0x4] - movs r1, 0xC0 - lsls r1, 3 - ldr r0, [sp, 0x8] - adds r0, r1 - str r0, [sp, 0x10] - ldr r0, [r2, 0x4] - adds r0, r1 - add r3, sp, 0x10 - str r0, [r3, 0x4] - ldr r1, _080AA770 - mov r4, r9 - lsls r0, r4, 2 - adds r0, r1 - ldr r0, [r0] - mov r10, r0 - mov r9, r8 - mov r8, r2 - adds r4, r3, 0 - cmp r9, r10 - bge _080AA79C -_080AA730: - ldr r1, [r7, 0x28] - ldr r0, [sp, 0x8] - cmp r0, r1 - blt _080AA79C - ldr r1, [r7, 0x30] - ldr r0, [sp, 0x10] - cmp r0, r1 - bge _080AA79C - ldr r1, [r7, 0x2C] - mov r2, r8 - ldr r0, [r2, 0x4] - cmp r0, r1 - blt _080AA79C - ldr r1, [r7, 0x34] - ldr r0, [r4, 0x4] - cmp r0, r1 - bge _080AA79C - adds r0, r7, 0 - mov r1, r8 - adds r2, r4, 0 - bl sub_80AA660 - cmp r0, 0x4 - beq _080AA774 - cmp r0, 0x4 - bhi _080AA778 - cmp r0, 0 - bne _080AA778 - b _080AA79C - .align 2, 0 -_080AA76C: .4byte 0xfffffd00 -_080AA770: .4byte gUnknown_8117FF0 -_080AA774: - movs r0, 0x1 - b _080AA79E -_080AA778: - ldr r0, [sp, 0x8] - adds r0, r5 - str r0, [sp, 0x8] - mov r1, r8 - ldr r0, [r1, 0x4] - adds r0, r6 - str r0, [r1, 0x4] - ldr r0, [sp, 0x10] - adds r0, r5 - str r0, [sp, 0x10] - ldr r0, [r4, 0x4] - adds r0, r6 - str r0, [r4, 0x4] - movs r2, 0x80 - lsls r2, 1 - add r9, r2 - cmp r9, r10 - blt _080AA730 -_080AA79C: - movs r0, 0 -_080AA79E: - add sp, 0x18 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end sub_80AA690 - - thumb_func_start sub_80AA7B0 -sub_80AA7B0: - push {r4-r7,lr} - mov r7, r8 - push {r7} - sub sp, 0x20 - adds r7, r0, 0 - adds r6, r1, 0 - mov r12, r2 - ldr r2, [sp, 0x38] - ldr r0, [r3] - ldr r1, [r3, 0x4] - str r0, [sp] - str r1, [sp, 0x4] - ldr r0, [r2] - ldr r1, [r2, 0x4] - str r0, [sp, 0x10] - str r1, [sp, 0x14] - ldr r0, [sp] - cmp r0, 0 - bge _080AA7DA - ldr r1, _080AA884 - adds r0, r1 -_080AA7DA: - asrs r0, 11 - str r0, [sp, 0x8] - ldr r0, [sp, 0x4] - cmp r0, 0 - bge _080AA7E8 - ldr r2, _080AA884 - adds r0, r2 -_080AA7E8: - asrs r0, 11 - add r1, sp, 0x8 - str r0, [r1, 0x4] - ldr r4, [sp, 0x10] - subs r0, r4, 0x1 - mov r8, r1 - cmp r0, 0 - bge _080AA7FC - ldr r5, _080AA888 - adds r0, r4, r5 -_080AA7FC: - asrs r2, r0, 11 - add r4, sp, 0x10 - ldr r1, [r4, 0x4] - subs r0, r1, 0x1 - cmp r0, 0 - bge _080AA80C - ldr r5, _080AA888 - adds r0, r1, r5 -_080AA80C: - asrs r3, r0, 11 - ldr r0, [sp, 0x8] - subs r0, r2, r0 - adds r0, 0x1 - str r0, [sp, 0x18] - mov r1, r8 - ldr r0, [r1, 0x4] - subs r0, r3, r0 - adds r0, 0x1 - add r1, sp, 0x18 - str r0, [r1, 0x4] - movs r0, 0x4 - mov r2, r12 - ands r0, r2 - adds r5, r1, 0 - cmp r0, 0 - beq _080AA890 - movs r1, 0 - ldrsh r0, [r7, r1] - movs r1, 0x80 - mov r2, sp - adds r3, r4, 0 - bl GetLivesCollision_80A92A0 - lsls r0, 16 - asrs r4, r0, 16 - cmp r4, 0 - blt _080AA890 - adds r0, r4, 0 - bl sub_80A8BBC - lsls r0, 16 - ldr r2, _080AA88C - adds r0, r2 - lsrs r0, 16 - cmp r0, 0xF - bhi _080AA890 - adds r0, r4, 0 - bl sub_80A8E9C - cmp r0, 0 - beq _080AA890 - strh r4, [r6] - movs r5, 0xA1 - lsls r5, 1 - adds r0, r7, r5 - ldrb r0, [r0] - lsls r0, 24 - asrs r0, 24 - movs r1, 0x5 - bl sub_8002984 - adds r1, r0, 0 - lsls r1, 24 - asrs r1, 24 - adds r0, r4, 0 - bl sub_80A9090 - movs r0, 0x5 - b _080AA8AE - .align 2, 0 -_080AA884: .4byte 0x000007ff -_080AA888: .4byte 0x000007fe -_080AA88C: .4byte 0xfff20000 -_080AA890: - movs r1, 0x1 - negs r1, r1 - adds r0, r1, 0 - strh r0, [r6] - movs r0, 0x10 - mov r1, r8 - adds r2, r5, 0 - bl sub_80A595C - lsls r0, 24 - cmp r0, 0 - bne _080AA8AC - movs r0, 0 - b _080AA8AE -_080AA8AC: - movs r0, 0x6 -_080AA8AE: - add sp, 0x20 - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end sub_80AA7B0 - - thumb_func_start sub_80AA8BC -sub_80AA8BC: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x30 - adds r6, r0, 0 - str r1, [sp, 0x1C] - lsls r2, 24 - asrs r2, 24 - mov r8, r2 - movs r2, 0x80 - lsls r2, 1 - add r0, sp, 0x4 - mov r1, r8 - bl SetVecFromDirectionSpeed - ldr r4, [sp, 0x4] - ldr r5, [sp, 0x8] - ldr r0, [r6, 0xC] - lsrs r1, r0, 31 - adds r0, r1 - asrs r0, 1 - movs r1, 0x80 - lsls r1, 2 - mov r9, r1 - add r0, r9 - muls r0, r4 - cmp r0, 0 - bge _080AA8FA - adds r0, 0xFF -_080AA8FA: - asrs r0, 8 - str r0, [sp, 0x20] - ldr r0, [r6, 0x10] - lsrs r1, r0, 31 - adds r0, r1 - asrs r0, 1 - add r0, r9 - muls r0, r5 - cmp r0, 0 - bge _080AA910 - adds r0, 0xFF -_080AA910: - asrs r0, 8 - str r0, [sp, 0x24] - movs r2, 0xA2 - lsls r2, 1 - adds r0, r6, r2 - ldr r0, [r0] - ldr r1, [r6, 0x14] - adds r0, r1 - ldr r7, [sp, 0x20] - adds r0, r7 - ldr r2, _080AA9F0 - adds r0, r2 - str r0, [sp, 0xC] - movs r1, 0xA4 - lsls r1, 1 - adds r0, r6, r1 - ldr r0, [r0] - ldr r1, [r6, 0x18] - adds r0, r1 - ldr r7, [sp, 0x24] - adds r0, r7 - adds r0, r2 - add r2, sp, 0xC - str r0, [r2, 0x4] - movs r1, 0xC0 - lsls r1, 3 - ldr r0, [sp, 0xC] - adds r0, r1 - str r0, [sp, 0x14] - ldr r0, [r2, 0x4] - adds r0, r1 - add r3, sp, 0x14 - str r0, [r3, 0x4] - ldr r0, _080AA9F4 - mov r7, r8 - lsls r1, r7, 2 - adds r0, r1, r0 - ldr r0, [r0] - mov r10, r0 - ldr r0, _080AA9F8 - adds r0, r1, r0 - ldr r0, [r0] - str r0, [sp, 0x28] - ldr r0, _080AA9FC - adds r1, r0 - ldr r1, [r1] - str r1, [sp, 0x2C] - movs r1, 0 - movs r7, 0x1 - negs r7, r7 - adds r0, r7, 0 - ldr r7, [sp, 0x1C] - strh r0, [r7] - mov r8, r2 - adds r7, r3, 0 - cmp r9, r10 - bge _080AA9E8 -_080AA982: - ldr r1, [r6, 0x28] - ldr r0, [sp, 0xC] - cmp r0, r1 - bge _080AA98C - b _080AAAD4 -_080AA98C: - ldr r1, [r6, 0x30] - ldr r0, [sp, 0x14] - cmp r0, r1 - blt _080AA996 - b _080AAAD4 -_080AA996: - ldr r1, [r6, 0x2C] - mov r2, r8 - ldr r0, [r2, 0x4] - cmp r0, r1 - bge _080AA9A2 - b _080AAAD4 -_080AA9A2: - ldr r1, [r6, 0x34] - ldr r0, [r7, 0x4] - cmp r0, r1 - blt _080AA9AC - b _080AAAD4 -_080AA9AC: - str r7, [sp] - adds r0, r6, 0 - ldr r1, [sp, 0x1C] - movs r2, 0xC - mov r3, r8 - bl sub_80AA7B0 - adds r1, r0, 0 - cmp r1, 0x5 - beq _080AAA66 - ldr r0, [sp, 0xC] - adds r0, r4 - str r0, [sp, 0xC] - mov r2, r8 - ldr r0, [r2, 0x4] - adds r0, r5 - str r0, [r2, 0x4] - ldr r0, [sp, 0x14] - adds r0, r4 - str r0, [sp, 0x14] - ldr r0, [r7, 0x4] - adds r0, r5 - str r0, [r7, 0x4] - cmp r1, 0x6 - beq _080AAA5A - movs r0, 0x80 - lsls r0, 1 - add r9, r0 - cmp r9, r10 - blt _080AA982 -_080AA9E8: - cmp r1, 0x6 - bne _080AAAD4 - b _080AAA5A - .align 2, 0 -_080AA9F0: .4byte 0xfffffd00 -_080AA9F4: .4byte gUnknown_8117FF0 -_080AA9F8: .4byte gUnknown_8118010 -_080AA9FC: .4byte gUnknown_8118030 -_080AAA00: - ldr r1, [sp, 0xC] - ldr r0, [r6, 0x28] - cmp r1, r0 - blt _080AAAD4 - ldr r1, [sp, 0x14] - ldr r0, [r6, 0x30] - cmp r1, r0 - bge _080AAAD4 - mov r0, r8 - ldr r1, [r0, 0x4] - ldr r0, [r6, 0x2C] - cmp r1, r0 - blt _080AAAD4 - ldr r1, [r7, 0x4] - ldr r0, [r6, 0x34] - cmp r1, r0 - bge _080AAAD4 - str r7, [sp] - adds r0, r6, 0 - ldr r1, [sp, 0x1C] - movs r2, 0x4 - mov r3, r8 - bl sub_80AA7B0 - adds r1, r0, 0 - cmp r1, 0x5 - beq _080AAA66 - ldr r0, [sp, 0xC] - adds r0, r4 - str r0, [sp, 0xC] - mov r2, r8 - ldr r0, [r2, 0x4] - adds r0, r5 - str r0, [r2, 0x4] - ldr r0, [sp, 0x14] - adds r0, r4 - str r0, [sp, 0x14] - ldr r0, [r7, 0x4] - adds r0, r5 - str r0, [r7, 0x4] - cmp r1, 0x6 - bne _080AAA6A - movs r0, 0x80 - lsls r0, 1 - add r9, r0 -_080AAA5A: - ldr r2, [sp, 0x28] - cmp r9, r2 - blt _080AAA00 - cmp r1, 0x6 - bne _080AAA6A - b _080AAAD4 -_080AAA66: - movs r0, 0x1 - b _080AAAD6 -_080AAA6A: - movs r0, 0 - mov r9, r0 - ldr r1, [sp, 0x2C] - cmp r9, r1 - bge _080AAAD4 -_080AAA74: - ldr r1, [sp, 0xC] - ldr r0, [r6, 0x28] - cmp r1, r0 - blt _080AAAD4 - ldr r1, [sp, 0x14] - ldr r0, [r6, 0x30] - cmp r1, r0 - bge _080AAAD4 - mov r2, r8 - ldr r1, [r2, 0x4] - ldr r0, [r6, 0x2C] - cmp r1, r0 - blt _080AAAD4 - ldr r1, [r7, 0x4] - ldr r0, [r6, 0x34] - cmp r1, r0 - bge _080AAAD4 - str r7, [sp] - adds r0, r6, 0 - ldr r1, [sp, 0x1C] - movs r2, 0x4 - mov r3, r8 - bl sub_80AA7B0 - adds r1, r0, 0 - cmp r1, 0x5 - beq _080AAA66 - cmp r1, 0x6 - beq _080AAAD4 - ldr r0, [sp, 0xC] - adds r0, r4 - str r0, [sp, 0xC] - mov r1, r8 - ldr r0, [r1, 0x4] - adds r0, r5 - str r0, [r1, 0x4] - ldr r0, [sp, 0x14] - adds r0, r4 - str r0, [sp, 0x14] - ldr r0, [r7, 0x4] - adds r0, r5 - str r0, [r7, 0x4] - movs r2, 0x80 - lsls r2, 1 - add r9, r2 - ldr r0, [sp, 0x2C] - cmp r9, r0 - blt _080AAA74 -_080AAAD4: - movs r0, 0 -_080AAAD6: - add sp, 0x30 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end sub_80AA8BC - - thumb_func_start sub_80AAAE8 -sub_80AAAE8: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x80 - adds r5, r0, 0 - adds r3, r1, 0 - lsls r2, 24 - asrs r4, r2, 24 - movs r0, 0x1 - negs r0, r0 - str r0, [sp, 0x78] - movs r2, 0xAF - lsls r2, 1 - adds r1, r5, r2 - movs r0, 0xC0 - lsls r0, 2 - strh r0, [r1] - movs r6, 0xB0 - lsls r6, 1 - adds r1, r5, r6 - movs r0, 0x1 - strh r0, [r1] - ldr r0, [sp, 0x78] - cmp r4, r0 - beq _080AAB26 - movs r1, 0xA1 - lsls r1, 1 - adds r0, r5, r1 - strb r4, [r0] -_080AAB26: - subs r0, r3, 0x1 - cmp r0, 0x13 - bls _080AAB2E - b _080AAEB8 -_080AAB2E: - lsls r0, 2 - ldr r1, _080AAB38 - adds r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_080AAB38: .4byte _080AAB3C - .align 2, 0 -_080AAB3C: - .4byte _080AAB8C - .4byte _080AAD60 - .4byte _080AAC9C - .4byte _080AAC9C - .4byte _080AAC9C - .4byte _080AAB9E - .4byte _080AAB9E - .4byte _080AAB9E - .4byte _080AAD7C - .4byte _080AADF4 - .4byte _080AAE06 - .4byte _080AAEB8 - .4byte _080AAEB8 - .4byte _080AAEB8 - .4byte _080AAEB8 - .4byte _080AAEB8 - .4byte _080AAEB8 - .4byte _080AAEB8 - .4byte _080AAE32 - .4byte _080AAE9C -_080AAB8C: - movs r4, 0xB2 - lsls r4, 1 - adds r1, r5, r4 - movs r0, 0 - str r0, [r1] - movs r6, 0xC0 - lsls r6, 2 - str r6, [sp, 0x78] - b _080AAD6E -_080AAB9E: - movs r0, 0x1 - negs r0, r0 - cmp r4, r0 - beq _080AAC88 - movs r6, 0 - movs r0, 0xB2 - lsls r0, 1 - adds r1, r5, r0 - movs r0, 0x4 - str r0, [r1] - cmp r3, 0x7 - beq _080AABD2 - cmp r3, 0x7 - bhi _080AABC0 - cmp r3, 0x6 - beq _080AABC6 - b _080AABEA -_080AABC0: - cmp r3, 0x8 - beq _080AABDE - b _080AABEA -_080AABC6: - movs r1, 0x90 - lsls r1, 4 - str r1, [sp, 0x78] - movs r2, 0x1 - str r2, [sp, 0x7C] - b _080AABFC -_080AABD2: - movs r3, 0x80 - lsls r3, 4 - str r3, [sp, 0x78] - movs r0, 0x2 - str r0, [sp, 0x7C] - b _080AABFC -_080AABDE: - movs r1, 0xA0 - lsls r1, 4 - str r1, [sp, 0x78] - movs r2, 0x4 - str r2, [sp, 0x7C] - b _080AABFC -_080AABEA: - movs r3, 0xB2 - lsls r3, 1 - adds r1, r5, r3 - movs r0, 0 - str r0, [r1] - ldr r0, _080AAC20 - str r0, [sp, 0x78] - movs r1, 0 - str r1, [sp, 0x7C] -_080AABFC: - movs r2, 0x80 - lsls r2, 1 - add r0, sp, 0x28 - adds r1, r4, 0 - bl SetVecFromDirectionSpeed - ldr r0, [sp, 0x28] - ldr r1, [sp, 0x2C] - str r0, [sp, 0x38] - str r1, [sp, 0x3C] - movs r2, 0 - mov r10, r2 - add r3, sp, 0x40 - mov r9, r3 - add r4, sp, 0x30 - mov r8, r4 - b _080AAC42 - .align 2, 0 -_080AAC20: .4byte 0x00000807 -_080AAC24: - cmp r6, 0x1 - bne _080AAC3E - ldr r0, [sp, 0x38] - str r0, [sp, 0x30] - mov r6, r8 - str r7, [r6, 0x4] - adds r0, r5, 0 - mov r1, r8 - bl sub_80AA074 - adds r6, r0, 0 - cmp r6, 0x2 - beq _080AAC78 -_080AAC3E: - movs r0, 0x1 - add r10, r0 -_080AAC42: - ldr r1, [sp, 0x7C] - cmp r10, r1 - bge _080AAC74 - add r4, sp, 0x38 - adds r0, r5, 0 - adds r1, r4, 0 - bl sub_80AA074 - adds r6, r0, 0 - cmp r6, 0x2 - beq _080AAC78 - cmp r6, 0x1 - bne _080AAC3E - movs r7, 0 - str r7, [sp, 0x40] - ldr r0, [r4, 0x4] - mov r2, r9 - str r0, [r2, 0x4] - adds r0, r5, 0 - mov r1, r9 - bl sub_80AA074 - adds r6, r0, 0 - cmp r6, 0x2 - bne _080AAC24 -_080AAC74: - cmp r6, 0x2 - bne _080AAC7E -_080AAC78: - movs r3, 0x1 - negs r3, r3 - b _080AAD6C -_080AAC7E: - adds r0, r5, 0 - movs r1, 0x1 - bl sub_80AAF68 - b _080AAEC0 -_080AAC88: - movs r4, 0xB2 - lsls r4, 1 - adds r1, r5, r4 - movs r0, 0 - str r0, [r1] - ldr r6, _080AAC98 - str r6, [sp, 0x78] - b _080AAD6E - .align 2, 0 -_080AAC98: .4byte 0x00000807 -_080AAC9C: - movs r0, 0x1 - negs r0, r0 - cmp r4, r0 - beq _080AAD60 - movs r0, 0xB2 - lsls r0, 1 - adds r1, r5, r0 - movs r0, 0x4 - str r0, [r1] - cmp r3, 0x4 - beq _080AACCE - cmp r3, 0x4 - bhi _080AACBC - cmp r3, 0x3 - beq _080AACC2 - b _080AACE6 -_080AACBC: - cmp r3, 0x5 - beq _080AACDA - b _080AACE6 -_080AACC2: - movs r1, 0x90 - lsls r1, 4 - str r1, [sp, 0x78] - movs r2, 0x1 - mov r9, r2 - b _080AACF6 -_080AACCE: - movs r3, 0x80 - lsls r3, 4 - str r3, [sp, 0x78] - movs r6, 0x2 - mov r9, r6 - b _080AACF6 -_080AACDA: - movs r0, 0xA0 - lsls r0, 4 - str r0, [sp, 0x78] - movs r1, 0x4 - mov r9, r1 - b _080AACF6 -_080AACE6: - movs r2, 0xB2 - lsls r2, 1 - adds r1, r5, r2 - movs r0, 0 - str r0, [r1] - ldr r3, _080AAD5C - str r3, [sp, 0x78] - mov r9, r0 -_080AACF6: - movs r2, 0x80 - lsls r2, 1 - add r0, sp, 0x48 - adds r1, r4, 0 - bl SetVecFromDirectionSpeed - ldr r0, [sp, 0x48] - ldr r1, [sp, 0x4C] - str r0, [sp, 0x50] - str r1, [sp, 0x54] - movs r6, 0 - cmp r6, r9 - bge _080AAD52 - add r4, sp, 0x50 - mov r8, r4 - add r7, sp, 0x58 -_080AAD16: - adds r0, r5, 0 - mov r1, r8 - bl sub_80A9F94 - cmp r0, 0 - beq _080AAD4C - movs r4, 0 - str r4, [sp, 0x58] - mov r1, r8 - ldr r0, [r1, 0x4] - str r0, [r7, 0x4] - adds r0, r5, 0 - adds r1, r7, 0 - bl sub_80A9F94 - cmp r0, 0 - beq _080AAD4C - ldr r0, [sp, 0x50] - str r0, [sp, 0x60] - add r1, sp, 0x60 - str r4, [r1, 0x4] - adds r0, r5, 0 - bl sub_80A9F94 - cmp r0, 0 - beq _080AAD4C - mov r9, r4 -_080AAD4C: - adds r6, 0x1 - cmp r6, r9 - blt _080AAD16 -_080AAD52: - adds r0, r5, 0 - mov r1, r9 - bl sub_80AAF68 - b _080AAEC0 - .align 2, 0 -_080AAD5C: .4byte 0x00000807 -_080AAD60: - movs r2, 0xB2 - lsls r2, 1 - adds r1, r5, r2 - movs r0, 0 - str r0, [r1] - ldr r3, _080AAD78 -_080AAD6C: - str r3, [sp, 0x78] -_080AAD6E: - adds r0, r5, 0 - movs r1, 0 - bl sub_80AAF68 - b _080AAEC0 - .align 2, 0 -_080AAD78: .4byte 0x00000807 -_080AAD7C: - movs r6, 0x8E - lsls r6, 1 - adds r0, r5, r6 - ldr r0, [r0] - movs r1, 0x80 - lsls r1, 5 - ands r0, r1 - cmp r0, 0 - beq _080AAD9C - ldr r0, _080AAD98 - ldr r0, [r0] - adds r0, 0x28 - strb r4, [r0] - b _080AADA6 - .align 2, 0 -_080AAD98: .4byte gGroundLivesMeta -_080AAD9C: - ldr r0, _080AADF0 - ldr r0, [r0] - adds r0, 0x28 - movs r1, 0xFF - strb r1, [r0] -_080AADA6: - movs r1, 0xB2 - lsls r1, 1 - adds r0, r5, r1 - movs r1, 0 - str r1, [r0] - movs r2, 0x80 - lsls r2, 4 - str r2, [sp, 0x78] - movs r3, 0xA1 - lsls r3, 1 - adds r1, r5, r3 - movs r0, 0x4 - strb r0, [r1] - movs r6, 0x1 - negs r6, r6 - cmp r4, r6 - bne _080AADCA - b _080AAEC0 -_080AADCA: - movs r2, 0x80 - lsls r2, 1 - add r0, sp, 0x68 - adds r1, r4, 0 - bl SetVecFromDirectionSpeed - ldr r0, [sp, 0x68] - ldr r1, [sp, 0x6C] - str r0, [sp, 0x70] - str r1, [sp, 0x74] - add r1, sp, 0x70 - adds r0, r5, 0 - bl sub_80AA074 - cmp r0, 0x2 - bne _080AAEC0 - str r6, [sp, 0x78] - b _080AAEC0 - .align 2, 0 -_080AADF0: .4byte gGroundLivesMeta -_080AADF4: - movs r4, 0xA1 - lsls r4, 1 - adds r0, r5, r4 - movs r1, 0 - ldrsb r1, [r0, r1] - adds r0, r5, 0 - bl sub_80AA3F8 - b _080AAEC0 -_080AAE06: - movs r6, 0xA1 - lsls r6, 1 - adds r0, r5, r6 - movs r1, 0 - ldrsb r1, [r0, r1] - adds r0, r5, 0 - bl sub_80AA690 - lsls r0, 24 - cmp r0, 0 - bne _080AAEC0 - movs r0, 0 - mov r1, sp - movs r2, 0x9 - bl GetFunctionScript - adds r0, r5, 0 - movs r1, 0 - mov r2, sp - bl _ExecutePlayerScript - b _080AAEC0 -_080AAE32: - add r6, sp, 0xC - movs r1, 0xA1 - lsls r1, 1 - adds r0, r5, r1 - movs r2, 0 - ldrsb r2, [r0, r2] - adds r0, r5, 0 - adds r1, r6, 0 - bl sub_80AA8BC - lsls r0, 24 - cmp r0, 0 - beq _080AAE84 - add r4, sp, 0x10 - movs r0, 0 - adds r1, r4, 0 - movs r2, 0x6 - bl GetFunctionScript - movs r2, 0 - ldrsh r0, [r6, r2] - adds r1, r5, 0 - adds r1, 0x40 - adds r2, r4, 0 - bl GroundLives_ExecuteScript - adds r0, r5, 0 - movs r1, 0 - movs r2, 0 - bl _ExecutePlayerScript - movs r3, 0 - ldrsh r0, [r6, r3] - bl sub_80A8E9C - adds r2, r0, 0 - movs r0, 0x7 - movs r1, 0 - bl sub_809B1C0 - b _080AAE8E -_080AAE84: - movs r0, 0x7 - movs r1, 0 - movs r2, 0 - bl sub_809B1C0 -_080AAE8E: - movs r4, 0x90 - lsls r4, 1 - adds r0, r5, r4 - movs r1, 0x5 - bl sub_809CD8C - b _080AAEC0 -_080AAE9C: - add r4, sp, 0x1C - ldr r2, _080AAEB4 - movs r0, 0 - adds r1, r4, 0 - bl GetFunctionScript - adds r0, r5, 0 - movs r1, 0 - adds r2, r4, 0 - bl _ExecutePlayerScript - b _080AAEC0 - .align 2, 0 -_080AAEB4: .4byte 0x00000195 -_080AAEB8: - adds r0, r5, 0 - movs r1, 0 - bl sub_80AAF68 -_080AAEC0: - movs r0, 0x1 - negs r0, r0 - ldr r6, [sp, 0x78] - cmp r6, r0 - beq _080AAF04 - movs r0, 0xB4 - lsls r0, 1 - adds r2, r5, r0 - movs r1, 0 - ldrsh r0, [r2, r1] - cmp r6, r0 - beq _080AAF04 - movs r3, 0xAE - lsls r3, 1 - adds r1, r5, r3 - movs r0, 0 - strb r0, [r1] - movs r4, 0xB8 - lsls r4, 1 - adds r0, r5, r4 - strh r6, [r2] - movs r1, 0xA1 - lsls r1, 1 - adds r3, r5, r1 - ldrb r1, [r3] - subs r4, 0x13 - adds r2, r5, r4 - strb r1, [r2] - movs r2, 0 - ldrsb r2, [r3, r2] - ldr r1, [sp, 0x78] - bl sub_80A6EFC - b _080AAF54 -_080AAF04: - movs r6, 0xAE - lsls r6, 1 - adds r2, r5, r6 - ldrb r0, [r2] - cmp r0, 0 - bne _080AAF2A - ldr r0, _080AAF64 - adds r1, r5, r0 - movs r3, 0xA1 - lsls r3, 1 - adds r0, r5, r3 - ldrb r1, [r1] - lsls r1, 24 - asrs r1, 24 - ldrb r0, [r0] - lsls r0, 24 - asrs r0, 24 - cmp r1, r0 - beq _080AAF54 -_080AAF2A: - movs r0, 0 - strb r0, [r2] - movs r4, 0xB8 - lsls r4, 1 - adds r0, r5, r4 - movs r6, 0xB4 - lsls r6, 1 - adds r1, r5, r6 - movs r2, 0 - ldrsh r1, [r1, r2] - movs r3, 0xA1 - lsls r3, 1 - adds r4, r5, r3 - ldrb r2, [r4] - subs r6, 0xB - adds r3, r5, r6 - strb r2, [r3] - movs r2, 0 - ldrsb r2, [r4, r2] - bl sub_80A6EFC -_080AAF54: - add sp, 0x80 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_080AAF64: .4byte 0x0000015d - thumb_func_end sub_80AAAE8 - thumb_func_start sub_80AAF68 sub_80AAF68: push {r4,lr} diff --git a/src/ground_lives.c b/src/ground_lives.c index 2b0156251..4f073e231 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); +extern PixelPos SetVecFromDirectionSpeed(s32 r1, u32 r2); s32 sub_80A95AC(struct unkStruct_3001B84_sub *livesPtr, PixelPos *posArg1, PixelPos *posArg2) { @@ -2083,4 +2083,381 @@ bool8 sub_80AA3F8(struct unkStruct_3001B84_sub *livesPtr, s32 a1_) return FALSE; } +s32 sub_80AA660(struct unkStruct_3001B84_sub *livesPtr, PixelPos *pixelPosArg1, PixelPos *pixelPosArg2) +{ + s32 id = (s16) sub_80AC4C8(0x100, pixelPosArg1, pixelPosArg2); + + if (id >= 0) { + if (sub_80A8A5C(livesPtr->unk0, id)) + return 4; + } + + return 0; +} + +bool8 sub_80AA690(struct unkStruct_3001B84_sub *livesPtr, s32 a1_) +{ + s32 i; + s32 a1 = (s8) a1_; + PixelPos pixPos1 = SetVecFromDirectionSpeed(a1, 0x100); + PixelPos tempPos = { (((livesPtr->unkC.x / 2) + 0x200) * pixPos1.x) / 256, (((livesPtr->unkC.y / 2) + 0x200) * pixPos1.y) / 256 }; + PixelPos pixPos2 = { (livesPtr->unk144.x + livesPtr->unk14.x + tempPos.x) - 768, (livesPtr->unk144.y + livesPtr->unk14.y + tempPos.y) - 768 }; + PixelPos pixPos3 = { pixPos2.x + 0x600, pixPos2.y + 0x600 }; + s32 var; + + var = gUnknown_8117FF0[a1]; + for (i = 0x200; i < var; i += 0x100) { + u32 unk; + + if (pixPos2.x < livesPtr->unk28.x || pixPos3.x >= livesPtr->unk30.x) + return FALSE; + if (pixPos2.y < livesPtr->unk28.y || pixPos3.y >= livesPtr->unk30.y) + return FALSE; + + unk = sub_80AA660(livesPtr, &pixPos2, &pixPos3); + switch (unk) { + case 0: + return FALSE; + case 4: + return TRUE; + case 6: + break; + default: + break; + } + + pixPos2.x += pixPos1.x; + pixPos2.y += pixPos1.y; + pixPos3.x += pixPos1.x; + pixPos3.y += pixPos1.y; + } + + return FALSE; +} + +s32 sub_80AA7B0(struct unkStruct_3001B84_sub *livesPtr, s16 *a1, u32 flags, PixelPos *pixelPosArg1, PixelPos *pixelPosArg2) +{ + PixelPos pixPos1 = *pixelPosArg1; + PixelPos pixPos3 = *pixelPosArg2; + PixelPos pixPos2 = {pixPos1.x / 2048, pixPos1.y / 2048}; + PixelPos tempPos = {(pixPos3.x - 1) / 2048, (pixPos3.y - 1) / 2048}; + PixelPos pixPos4 = {(tempPos.x - pixPos2.x) + 1, (tempPos.y - pixPos2.y) + 1}; + + if (flags & 4) { + s32 id2 = (s16) GetLivesCollision_80A92A0(livesPtr->unk0, 0x80, &pixPos1, &pixPos3); + if (id2 >= 0) { + s16 var = (s16) sub_80A8BBC(id2); + if (var >= 14 && var < 30 && sub_80A8E9C(id2) != NULL) { + *a1 = id2; + sub_80A9090(id2, (s8) sub_8002984(livesPtr->unk142, 5)); + return 5; + } + } + } + + *a1 = -1; + if (sub_80A595C(0x10, &pixPos2, &pixPos4)) { + return 6; + } + + return 0; +} + +bool8 sub_80AA8BC(struct unkStruct_3001B84_sub *livesPtr, s16 *a1, s32 dir_) +{ + s32 i; + s32 dir = (s8) dir_; + PixelPos pixPos1 = SetVecFromDirectionSpeed(dir, 0x100); + PixelPos pixPos5 = { (((livesPtr->unkC.x / 2) + 0x200) * pixPos1.x) / 256, (((livesPtr->unkC.y / 2) + 0x200) * pixPos1.y) / 256 }; + PixelPos pixPos2 = { (livesPtr->unk144.x + livesPtr->unk14.x + pixPos5.x) - 768, (livesPtr->unk144.y + livesPtr->unk14.y + pixPos5.y) - 768 }; + PixelPos pixPos3 = { pixPos2.x + 0x600, pixPos2.y + 0x600 }; + s32 r10 = gUnknown_8117FF0[dir]; + s32 var_28 = gUnknown_8118010[dir]; + s32 var_24 = gUnknown_8118030[dir]; + s32 unk = 0; + + *a1 = -1; + for (i = 0x200; i < r10; i += 0x100) { + if (pixPos2.x < livesPtr->unk28.x || pixPos3.x >= livesPtr->unk30.x) + return FALSE; + if (pixPos2.y < livesPtr->unk28.y || pixPos3.y >= livesPtr->unk30.y) + return FALSE; + + unk = sub_80AA7B0(livesPtr, a1, 0xC, &pixPos2, &pixPos3); + if (unk == 5) + return TRUE; + + pixPos2.x += pixPos1.x; + pixPos2.y += pixPos1.y; + pixPos3.x += pixPos1.x; + pixPos3.y += pixPos1.y; + + if (unk == 6) + break; + } + if (unk != 6) + return FALSE; + + for (; i < var_28; i += 0x100) { + if (pixPos2.x < livesPtr->unk28.x || pixPos3.x >= livesPtr->unk30.x) + return FALSE; + if (pixPos2.y < livesPtr->unk28.y || pixPos3.y >= livesPtr->unk30.y) + return FALSE; + + unk = sub_80AA7B0(livesPtr, a1, 4, &pixPos2, &pixPos3); + if (unk == 5) + return TRUE; + + pixPos2.x += pixPos1.x; + pixPos2.y += pixPos1.y; + pixPos3.x += pixPos1.x; + pixPos3.y += pixPos1.y; + + if (unk != 6) + break; + } + if (unk == 6) + return FALSE; + + for (i = 0; i < var_24; i += 0x100) { + if (pixPos2.x < livesPtr->unk28.x || pixPos3.x >= livesPtr->unk30.x) + return FALSE; + if (pixPos2.y < livesPtr->unk28.y || pixPos3.y >= livesPtr->unk30.y) + return FALSE; + + unk = sub_80AA7B0(livesPtr, a1, 4, &pixPos2, &pixPos3); + if (unk == 5) + return TRUE; + if (unk == 6) + return FALSE; + + pixPos2.x += pixPos1.x; + pixPos2.y += pixPos1.y; + pixPos3.x += pixPos1.x; + pixPos3.y += pixPos1.y; + } + + return FALSE; +} + +void sub_80AAAE8(struct unkStruct_3001B84_sub *livesPtr, u32 a1, s32 dir_) +{ + s32 unk; + s32 dir = (s8) dir_; + s32 var_28 = -1; + + livesPtr->unk15E = 0x300; + livesPtr->unk160 = 1; + if (dir != -1) { + livesPtr->unk142 = dir; + } + + switch (a1) { + case 2: + livesPtr->unk164 = 0; + var_28 = 0x807; + sub_80AAF68(livesPtr, 0); + break; + case 1: + livesPtr->unk164 = 0; + var_28 = 0x300; + sub_80AAF68(livesPtr, 0); + break; + case 6: + case 7: + case 8: + if (dir != -1) { + s32 i; + s32 n; + PixelPos pixPos, pixPos2, pixPos3; + + unk = 0; + livesPtr->unk164 = 4; + switch (a1) { + case 6: + var_28 = 0x900; + n = 1; + break; + case 7: + var_28 = 0x800; + n = 2; + break; + case 8: + var_28 = 0xA00; + n = 4; + break; + // Impossible case + default: + livesPtr->unk164 = 0; + var_28 = 0x807; + n = 0; + break; + } + pixPos = SetVecFromDirectionSpeed(dir, 0x100); + for (i = 0; i < n; i++) { + unk = sub_80AA074(livesPtr, &pixPos); + if (unk == 2) + break; + if (unk != 1) + continue; + + pixPos2.x = 0; + pixPos2.y = pixPos.y; + unk = sub_80AA074(livesPtr, &pixPos2); + if (unk == 2) + break; + if (unk != 1) + continue; + + pixPos3.x = pixPos.x; + pixPos3.y = 0; + unk = sub_80AA074(livesPtr, &pixPos3); + if (unk == 2) + break; + } + if (unk == 2) { + var_28 = -1; + sub_80AAF68(livesPtr, 0); + } + else { + sub_80AAF68(livesPtr, 1); + } + } + else { + livesPtr->unk164 = 0; + var_28 = 0x807; + sub_80AAF68(livesPtr, 0); + } + break; + case 3: + case 4: + case 5: + if (dir != -1) { + s32 i; + s32 n; + PixelPos pixPos, pixPos2, pixPos3; + + livesPtr->unk164 = 4; + switch (a1) { + case 3: + var_28 = 0x900; + n = 1; + break; + case 4: + var_28 = 0x800; + n = 2; + break; + case 5: + var_28 = 0xA00; + n = 4; + break; + // Impossible + default: + livesPtr->unk164 = 0; + var_28 = 0x807; + n = 0; + break; + } + pixPos = SetVecFromDirectionSpeed(dir, 0x100); + for (i = 0; i < n; i++) { + if (sub_80A9F94(livesPtr, &pixPos) != 0) { + pixPos2.x = 0; + pixPos2.y = pixPos.y; + if (sub_80A9F94(livesPtr, &pixPos2) != 0) { + pixPos3.x = pixPos.x; + pixPos3.y = 0; + if (sub_80A9F94(livesPtr, &pixPos3) != 0) { + n = 0; + } + } + } + } + sub_80AAF68(livesPtr, n); + } + else { + livesPtr->unk164 = 0; + var_28 = 0x807; + sub_80AAF68(livesPtr, 0); + } + break; + case 9: + if (livesPtr->unk11C & 0x1000) { + gGroundLivesMeta->unk28 = dir; + } + else { + gGroundLivesMeta->unk28 = -1; + } + livesPtr->unk164 = 0; + var_28 = 0x800; + livesPtr->unk142 = 4; + if (dir != -1) { + PixelPos pixPos = SetVecFromDirectionSpeed(dir, 0x100); + if (sub_80AA074(livesPtr, &pixPos) == 2) { + var_28 = -1; + } + } + break; + case 10: + sub_80AA3F8(livesPtr, livesPtr->unk142); + break; + case 11: + if (!sub_80AA690(livesPtr, livesPtr->unk142)) { + ScriptInfoSmall scriptInfo; + + GetFunctionScript(NULL, &scriptInfo, 9); + _ExecutePlayerScript(livesPtr, NULL, &scriptInfo); + } + break; + case 19: { + s16 sp; + + if (sub_80AA8BC(livesPtr, &sp, livesPtr->unk142)) { + ScriptInfoSmall scriptInfo; + + GetFunctionScript(NULL, &scriptInfo, 6); + GroundLives_ExecuteScript(sp, (void *) &livesPtr->unk38.unk8, &scriptInfo); + _ExecutePlayerScript(livesPtr, NULL, NULL); + sub_809B1C0(7, 0, (void *) sub_80A8E9C(sp)); // TODO: fix + } + else { + sub_809B1C0(7, 0, NULL); + } + sub_809CD8C(&livesPtr->unk120, 5); + break; + } + case 20: { + ScriptInfoSmall scriptInfo; + + GetFunctionScript(NULL, &scriptInfo, 0x195); + _ExecutePlayerScript(livesPtr, NULL, &scriptInfo); + break; + } + default: + sub_80AAF68(livesPtr, 0); + break; + } + + if (var_28 != -1 && var_28 != livesPtr->unk168) { + struct UnkGroundSpriteStruct *groundSpritePtr; + + livesPtr->unk15C = 0; + groundSpritePtr = &livesPtr->unk170; + livesPtr->unk168 = var_28; + livesPtr->unk15D = livesPtr->unk142; + sub_80A6EFC(groundSpritePtr, var_28, livesPtr->unk142); + return; + } + + if (livesPtr->unk15C != 0 || livesPtr->unk15D != livesPtr->unk142) { + struct UnkGroundSpriteStruct *groundSpritePtr; + s32 unk168; + + livesPtr->unk15C = 0; + groundSpritePtr = &livesPtr->unk170; + unk168 = livesPtr->unk168; + livesPtr->unk15D = livesPtr->unk142; + sub_80A6EFC(groundSpritePtr, unk168, livesPtr->unk142); + } +} + //