From e649cabbd36eaf2f7c10ad94cab9e1a8bbad5980 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 15 May 2025 12:32:24 +0200 Subject: [PATCH] sub_80A6EFC --- asm/ground_sprite.s | 770 ---------------------------------------- include/ground_sprite.h | 2 +- src/ground_sprite.c | 284 +++++++++++++-- 3 files changed, 255 insertions(+), 801 deletions(-) diff --git a/asm/ground_sprite.s b/asm/ground_sprite.s index b72e62b27..3de9aa7fd 100644 --- a/asm/ground_sprite.s +++ b/asm/ground_sprite.s @@ -7,776 +7,6 @@ - thumb_func_start GroundSprite_ExtendPaletteAdd -GroundSprite_ExtendPaletteAdd: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x14 - mov r10, r0 - lsls r1, 16 - lsrs r2, r1, 16 - adds r5, r2, 0 - movs r0, 0xC0 - lsls r0, 2 - ands r0, r2 - cmp r0, 0 - bne _080A6AB0 - b _080A6C6C -_080A6AB0: - movs r0, 0x80 - lsls r0, 3 - ands r0, r2 - cmp r0, 0 - beq _080A6AD8 - ldr r0, _080A6AD4 - ldr r1, [r0] - movs r3, 0x86 - lsls r3, 1 - adds r4, r1, r3 - ldrh r1, [r4] - adds r3, r0, 0 - cmp r1, r2 - bne _080A6B36 - ldrh r0, [r4, 0x2] - adds r0, 0x1 - strh r0, [r4, 0x2] - b _080A6C78 - .align 2, 0 -_080A6AD4: .4byte gUnknown_3001B7C -_080A6AD8: - movs r0, 0 - mov r8, r0 - ldr r1, _080A6B1C - ldr r0, [r1] - movs r2, 0x84 - lsls r2, 1 - adds r4, r0, r2 - adds r3, r1, 0 - movs r1, 0xE8 - lsls r1, 13 -_080A6AEC: - ldrh r0, [r4] - cmp r0, r5 - bne _080A6B24 - lsrs r1, 16 - adds r3, r1, 0 - ldrh r0, [r4, 0x2] - adds r0, 0x1 - strh r0, [r4, 0x2] - mov r0, r10 - cmp r0, 0 - beq _080A6B08 - subs r1, 0x10 - adds r0, 0x68 - strh r1, [r0] -_080A6B08: - adds r0, r3, 0 - subs r0, 0x10 - str r0, [sp] - str r5, [sp, 0x4] - movs r0, 0 - ldr r1, _080A6B20 - mov r2, r8 - bl Log - b _080A6C78 - .align 2, 0 -_080A6B1C: .4byte gUnknown_3001B7C -_080A6B20: .4byte gUnknown_81177F4 -_080A6B24: - movs r2, 0x80 - lsls r2, 9 - adds r1, r2 - movs r0, 0x1 - add r8, r0 - adds r4, 0x4 - mov r2, r8 - cmp r2, 0x1 - ble _080A6AEC -_080A6B36: - movs r0, 0x80 - lsls r0, 3 - ands r0, r5 - cmp r0, 0 - beq _080A6B68 - movs r0, 0x1 - mov r8, r0 - ldr r0, [r3] - movs r1, 0x86 - lsls r1, 1 - adds r4, r0, r1 - movs r2, 0x2 - ldrsh r0, [r4, r2] - cmp r0, 0 - ble _080A6BA8 - ldr r0, _080A6B60 - ldr r1, _080A6B64 - adds r2, r5, 0 - bl FatalError - .align 2, 0 -_080A6B60: .4byte gUnknown_8117858 -_080A6B64: .4byte gUnknown_8117864 -_080A6B68: - movs r0, 0 - mov r8, r0 - ldr r0, [r3] - movs r1, 0x84 - lsls r1, 1 - adds r4, r0, r1 - movs r2, 0x2 - ldrsh r0, [r4, r2] - cmp r0, 0 - ble _080A6B90 -_080A6B7C: - movs r3, 0x1 - add r8, r3 - adds r4, 0x4 - mov r0, r8 - cmp r0, 0x1 - bgt _080A6B96 - movs r1, 0x2 - ldrsh r0, [r4, r1] - cmp r0, 0 - bgt _080A6B7C -_080A6B90: - mov r2, r8 - cmp r2, 0x1 - ble _080A6BA8 -_080A6B96: - ldr r0, _080A6BA0 - ldr r1, _080A6BA4 - adds r2, r5, 0 - bl FatalError - .align 2, 0 -_080A6BA0: .4byte gUnknown_8117888 -_080A6BA4: .4byte gUnknown_8117864 -_080A6BA8: - mov r0, r8 - adds r0, 0x1D - lsls r0, 16 - lsrs r0, 16 - str r0, [sp, 0xC] - mov r3, r8 - lsls r0, r3, 20 - movs r1, 0xE8 - lsls r1, 17 - adds r0, r1 - lsrs r0, 16 - str r0, [sp, 0x10] - movs r0, 0x80 - lsls r0, 2 - ands r0, r5 - cmp r0, 0 - beq _080A6BE8 - ldr r0, _080A6BE0 - ldr r1, _080A6BE4 - bl OpenFileAndGetFileDataPtr - mov r9, r0 - ldr r7, [r0, 0x4] - movs r0, 0xFF - ands r0, r5 - lsls r0, 6 - adds r7, r0 - b _080A6BFE - .align 2, 0 -_080A6BE0: .4byte gUnknown_81177EC -_080A6BE4: .4byte gMonsterFileArchive -_080A6BE8: - movs r0, 0xFF - ands r0, r5 - lsls r0, 2 - ldr r1, _080A6C60 - adds r0, r1 - ldr r0, [r0] - ldr r1, _080A6C64 - bl OpenFileAndGetFileDataPtr - mov r9, r0 - ldr r7, [r0, 0x4] -_080A6BFE: - movs r0, 0x80 - lsls r0, 5 - ands r0, r5 - lsls r0, 16 - lsrs r0, 16 - negs r0, r0 - lsrs r6, r0, 31 - movs r0, 0x80 - lsls r0, 6 - ands r0, r5 - cmp r0, 0 - beq _080A6C1A - movs r0, 0x2 - orrs r6, r0 -_080A6C1A: - ldr r0, [sp, 0xC] - adds r1, r6, 0 - bl sub_80997F4 - ldr r0, [sp, 0x10] - adds r1, r7, 0 - movs r2, 0x10 - bl sub_809971C - strh r5, [r4] - movs r0, 0x1 - strh r0, [r4, 0x2] - ldr r2, [sp, 0xC] - subs r2, 0x10 - mov r3, r10 - cmp r3, 0 - beq _080A6C42 - mov r0, r10 - adds r0, 0x68 - strh r2, [r0] -_080A6C42: - ldr r1, _080A6C68 - str r2, [sp] - str r5, [sp, 0x4] - str r6, [sp, 0x8] - movs r0, 0 - mov r2, r8 - ldr r3, [sp, 0xC] - bl Log - mov r0, r9 - cmp r0, 0 - beq _080A6C78 - bl CloseFile - b _080A6C78 - .align 2, 0 -_080A6C60: .4byte gUnknown_81178F4 -_080A6C64: .4byte gOrnamentFileArchive -_080A6C68: .4byte gUnknown_8117894 -_080A6C6C: - mov r1, r10 - cmp r1, 0 - beq _080A6C78 - mov r0, r10 - adds r0, 0x68 - strh r5, [r0] -_080A6C78: - add sp, 0x14 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end GroundSprite_ExtendPaletteAdd - - thumb_func_start GroundSprite_ExtendPaletteDelete -GroundSprite_ExtendPaletteDelete: - push {r4-r6,lr} - adds r2, r0, 0 - cmp r2, 0 - beq _080A6C9E - adds r0, 0x68 - ldrh r0, [r0] - adds r5, r0, 0 - subs r5, 0xD - cmp r5, 0 - blt _080A6CE6 - b _080A6CA0 -_080A6C9E: - movs r5, 0x1 -_080A6CA0: - ldr r0, _080A6CEC - lsls r1, r5, 2 - movs r3, 0x84 - lsls r3, 1 - adds r1, r3 - ldr r0, [r0] - adds r4, r0, r1 - cmp r2, 0 - beq _080A6CBA - adds r1, r2, 0 - adds r1, 0x68 - movs r0, 0 - strh r0, [r1] -_080A6CBA: - ldrh r0, [r4, 0x2] - subs r0, 0x1 - movs r6, 0 - strh r0, [r4, 0x2] - lsls r0, 16 - cmp r0, 0 - bgt _080A6CE6 - ldr r1, _080A6CF0 - ldrh r3, [r4] - movs r0, 0 - adds r2, r5, 0 - bl Log - strh r6, [r4] - strh r6, [r4, 0x2] - adds r0, r5, 0 - adds r0, 0x1D - lsls r0, 16 - lsrs r0, 16 - movs r1, 0 - bl sub_80997F4 -_080A6CE6: - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_080A6CEC: .4byte gUnknown_3001B7C -_080A6CF0: .4byte gUnknown_81178C0 - thumb_func_end GroundSprite_ExtendPaletteDelete - - thumb_func_start sub_80A6CF4 -sub_80A6CF4: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x68 - movs r1, 0 - mov r8, r1 - movs r1, 0 - ldrsh r2, [r0, r1] - mov r9, r2 - movs r2, 0 - mov r10, r2 - movs r0, 0x1 - negs r0, r0 - str r0, [sp, 0x60] - str r0, [sp, 0x64] - add r4, sp, 0x58 - adds r0, r4, 0 - bl sub_809D248 - movs r7, 0 - ldr r0, _080A6D70 - ldr r3, [r0] - movs r1, 0x80 - lsls r1, 6 - mov r12, r1 - mov r4, sp -_080A6D2C: - ldr r0, [r3] - cmp r0, 0x1 - bne _080A6DB4 - ldr r2, [r3, 0x8] - adds r0, r2, 0 - adds r0, 0x50 - ldrh r1, [r0] - mov r0, r12 - ands r0, r1 - cmp r0, 0 - bne _080A6DB4 - ldr r0, [r2, 0x7C] - cmp r0, 0 - blt _080A6DB4 - ldr r1, [r2, 0x74] - cmp r1, 0 - bge _080A6D50 - adds r1, 0xFF -_080A6D50: - asrs r1, 8 - ldr r0, [sp, 0x58] - subs r5, r1, r0 - ldr r1, [r2, 0x78] - cmp r1, 0 - bge _080A6D5E - adds r1, 0xFF -_080A6D5E: - asrs r1, 8 - ldr r0, [sp, 0x5C] - subs r1, r0 - adds r6, r1, 0 - cmp r1, 0 - ble _080A6D74 - adds r0, r6, 0 - adds r0, 0x28 - b _080A6D78 - .align 2, 0 -_080A6D70: .4byte gUnknown_3001B7C -_080A6D74: - movs r0, 0x28 - subs r0, r6 -_080A6D78: - str r0, [r2, 0x7C] - cmp r5, 0 - ble _080A6D88 - ldr r0, [r2, 0x7C] - cmp r5, r0 - ble _080A6D92 - str r5, [r2, 0x7C] - b _080A6D92 -_080A6D88: - negs r1, r5 - ldr r0, [r2, 0x7C] - cmp r1, r0 - ble _080A6D92 - str r1, [r2, 0x7C] -_080A6D92: - adds r0, r2, 0 - adds r0, 0x48 - movs r1, 0 - ldrsh r0, [r0, r1] - add r10, r0 - cmp r0, r9 - blt _080A6DAE - ldr r0, [r2, 0x7C] - ldr r1, [sp, 0x64] - cmp r1, r0 - bge _080A6DAE - mov r1, r8 - str r1, [sp, 0x60] - str r0, [sp, 0x64] -_080A6DAE: - stm r4!, {r2} - movs r2, 0x1 - add r8, r2 -_080A6DB4: - adds r0, r7, 0x1 - lsls r0, 16 - asrs r7, r0, 16 - adds r3, 0xC - cmp r7, 0x15 - ble _080A6D2C - cmp r10, r9 - blt _080A6E54 - ldr r0, [sp, 0x60] - cmp r0, 0 - blt _080A6DD8 - lsls r0, 2 - add r0, sp - ldr r0, [r0] - bl sub_80A69FC - movs r0, 0x1 - b _080A6E56 -_080A6DD8: - mov r1, r8 - cmp r1, 0 - ble _080A6E54 -_080A6DDE: - movs r5, 0x1 - negs r5, r5 - adds r3, r5, 0 - movs r6, 0 - mov r7, r8 - subs r7, 0x1 - mov r2, r8 - cmp r2, 0 - ble _080A6E08 - mov r2, sp - mov r1, r8 -_080A6DF4: - ldr r0, [r2] - ldr r0, [r0, 0x7C] - cmp r3, r0 - bge _080A6E00 - mov r5, r8 - adds r3, r0, 0 -_080A6E00: - adds r2, 0x4 - subs r1, 0x1 - cmp r1, 0 - bne _080A6DF4 -_080A6E08: - lsls r0, r5, 2 - mov r1, sp - adds r4, r1, r0 - ldr r0, [r4] - bl sub_80A69FC - mov r8, r7 - adds r1, r5, 0 - cmp r1, r8 - bge _080A6E28 - adds r2, r4, 0 -_080A6E1E: - ldr r0, [r2, 0x4] - stm r2!, {r0} - adds r1, 0x1 - cmp r1, r8 - blt _080A6E1E -_080A6E28: - movs r1, 0 - ldr r0, _080A6E40 - ldr r3, [r0] -_080A6E2E: - ldr r0, [r3] - cmp r0, 0 - bne _080A6E44 - adds r6, 0x1 - cmp r6, r9 - blt _080A6E46 - movs r0, 0x1 - b _080A6E56 - .align 2, 0 -_080A6E40: .4byte gUnknown_3001B7C -_080A6E44: - movs r6, 0 -_080A6E46: - adds r1, 0x1 - adds r3, 0xC - cmp r1, 0x15 - ble _080A6E2E - mov r2, r8 - cmp r2, 0 - bgt _080A6DDE -_080A6E54: - movs r0, 0 -_080A6E56: - add sp, 0x68 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end sub_80A6CF4 - - thumb_func_start sub_80A6E68 -sub_80A6E68: - push {lr} - movs r0, 0 - bl ResetSprites - movs r0, 0 - bl nullsub_10 - bl sub_800E970 - pop {r0} - bx r0 - thumb_func_end sub_80A6E68 - - thumb_func_start sub_80A6E80 -sub_80A6E80: - push {r4,lr} - sub sp, 0x4 - ldr r4, _080A6EC4 - adds r0, r4, 0 - bl sub_809D248 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0 - bne _080A6E98 - str r0, [r4] - str r0, [r4, 0x4] -_080A6E98: - bl sub_80ABA7C - bl sub_80ACAD4 - bl sub_80AD7AC - ldrh r1, [r4, 0x4] - lsls r1, 16 - ldrh r0, [r4] - orrs r0, r1 - str r0, [sp] - mov r0, sp - bl sub_800E90C - bl sub_8005180 - bl nullsub_12 - add sp, 0x4 - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_080A6EC4: .4byte gUnknown_2039DD8 - thumb_func_end sub_80A6E80 - - thumb_func_start sub_80A6EC8 -sub_80A6EC8: - push {lr} - adds r2, r0, 0 - adds r0, 0x52 - movs r3, 0 - ldrsh r0, [r0, r3] - cmp r0, 0 - ble _080A6EF6 - adds r0, r2, 0 - adds r0, 0x48 - movs r3, 0 - ldrsh r0, [r0, r3] - cmp r1, r0 - bgt _080A6EE4 - adds r1, r0, 0 -_080A6EE4: - adds r0, r2, 0 - adds r0, 0x64 - movs r3, 0 - ldrsh r0, [r0, r3] - cmp r0, r1 - beq _080A6EF6 - adds r0, r2, 0 - adds r0, 0x66 - strh r1, [r0] -_080A6EF6: - pop {r0} - bx r0 - thumb_func_end sub_80A6EC8 - - thumb_func_start sub_80A6EFC -sub_80A6EFC: - push {r4-r7,lr} - sub sp, 0xC - adds r4, r0, 0 - lsls r1, 16 - asrs r7, r1, 16 - lsls r2, 24 - asrs r6, r2, 24 - adds r0, 0x52 - movs r1, 0 - ldrsh r0, [r0, r1] - cmp r0, 0 - bge _080A6F48 - adds r5, r4, 0 - adds r5, 0x66 - movs r2, 0 - ldrsh r0, [r5, r2] - cmp r0, 0 - blt _080A6F28 - adds r1, r4, 0 - adds r1, 0x48 - adds r2, r0, 0 - b _080A6F62 -_080A6F28: - adds r1, r4, 0 - adds r1, 0x48 - movs r2, 0 - ldrsh r0, [r1, r2] - cmp r0, 0 - bgt _080A6F36 - b _080A7038 -_080A6F36: - movs r2, 0x1 - negs r2, r2 - adds r0, r4, 0 - bl sub_80A68F8 - lsls r0, 24 - cmp r0, 0 - beq _080A7038 - b _080A6F72 -_080A6F48: - adds r5, r4, 0 - adds r5, 0x66 - movs r1, 0 - ldrsh r0, [r5, r1] - cmp r0, 0 - blt _080A6F72 - adds r0, r4, 0 - bl sub_80A69FC - adds r1, r4, 0 - adds r1, 0x48 - movs r0, 0 - ldrsh r2, [r5, r0] -_080A6F62: - adds r0, r4, 0 - bl sub_80A68F8 - lsls r0, 24 - cmp r0, 0 - beq _080A7038 - ldr r0, _080A6F8C - strh r0, [r5] -_080A6F72: - movs r0, 0x80 - lsls r0, 3 - ands r0, r7 - lsls r0, 16 - asrs r3, r0, 16 - cmp r3, 0 - beq _080A6F94 - ldrh r1, [r4] - ldr r0, _080A6F90 - ands r0, r1 - strh r0, [r4] - b _080A7038 - .align 2, 0 -_080A6F8C: .4byte 0x0000ffff -_080A6F90: .4byte 0x0000efff -_080A6F94: - ldr r2, _080A6FE0 - adds r0, r4, 0 - adds r0, 0x52 - movs r5, 0 - ldrsh r1, [r0, r5] - lsls r0, r1, 1 - adds r0, r1 - lsls r0, 2 - ldr r1, [r2] - adds r1, r0 - mov r12, r1 - adds r1, r4, 0 - adds r1, 0x70 - movs r0, 0x1 - strb r0, [r1] - subs r0, 0x2 - str r0, [r4, 0x7C] - movs r1, 0xE0 - lsls r1, 3 - ands r1, r7 - movs r0, 0x80 - lsls r0, 1 - cmp r1, r0 - beq _080A6FE4 - cmp r1, r0 - ble _080A6FEE - movs r0, 0x80 - lsls r0, 2 - cmp r1, r0 - beq _080A6FFA - movs r0, 0xC0 - lsls r0, 2 - cmp r1, r0 - bne _080A6FEE - adds r0, r4, 0 - adds r0, 0x6C - strh r3, [r0] - b _080A7000 - .align 2, 0 -_080A6FE0: .4byte gUnknown_3001B7C -_080A6FE4: - adds r1, r4, 0 - adds r1, 0x6C - movs r0, 0x80 - strh r0, [r1] - b _080A7000 -_080A6FEE: - adds r1, r4, 0 - adds r1, 0x6C - movs r0, 0x80 - lsls r0, 1 - strh r0, [r1] - b _080A7000 -_080A6FFA: - adds r0, r4, 0 - adds r0, 0x6C - strh r1, [r0] -_080A7000: - adds r0, r4, 0 - adds r0, 0x6E - movs r1, 0 - strh r1, [r0] - ldr r5, [r4, 0x4C] - movs r0, 0xFF - ands r0, r7 - adds r2, r6, 0 - cmp r6, 0 - bge _080A7016 - adds r2, r6, 0x7 -_080A7016: - asrs r2, 3 - adds r2, r0, r2 - movs r3, 0x7 - ands r3, r6 - mov r6, r12 - ldr r0, [r6, 0x4] - str r0, [sp] - str r1, [sp, 0x4] - lsls r0, r7, 16 - lsrs r0, 27 - movs r1, 0x1 - ands r0, r1 - str r0, [sp, 0x8] - adds r0, r4, 0 - adds r1, r5, 0 - bl AxResInit -_080A7038: - add sp, 0xC - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_80A6EFC thumb_func_start sub_80A7040 sub_80A7040: diff --git a/include/ground_sprite.h b/include/ground_sprite.h index 6138c24d6..8366f502a 100644 --- a/include/ground_sprite.h +++ b/include/ground_sprite.h @@ -25,7 +25,7 @@ struct UnkGroundSpriteStruct u8 unk5A; s32 unk5C; s32 unk60; - u16 unk64; + s16 unk64; s16 unk66; u16 unk68; u16 unk6A; diff --git a/src/ground_sprite.c b/src/ground_sprite.c index 41e89f3ee..438821a9d 100644 --- a/src/ground_sprite.c +++ b/src/ground_sprite.c @@ -24,10 +24,16 @@ EWRAM_DATA u32 gUnknown_2039DD4 = {0}; EWRAM_INIT OpenedFile *gUnknown_203B4B4 = {NULL}; // data_8115F5C.s -extern const u8 gUnknown_81177CC[]; -extern const u8 gUnknown_81177D8[]; -extern const u8 gUnknown_81177EC[]; -extern const u8 *gUnknown_81178F4[]; +extern const char gUnknown_81177CC[]; +extern const char gUnknown_81177D8[]; +extern const char gUnknown_81177F4[]; +extern const char gUnknown_8117864[]; +extern const char gUnknown_81177EC[]; +extern const char gUnknown_8117894[]; +extern const char gUnknown_81178C0[]; +extern const char *gUnknown_81178F4[]; +extern const DebugLocation gUnknown_8117858; +extern const DebugLocation gUnknown_8117888; // code_8098BDC.s extern void sub_809971C(u16, const u8 *, s16); @@ -160,7 +166,8 @@ void sub_80A64A4(void) r2 = file->data + (r5 & 0xFF) * 0x40; } else { - file = OpenFileAndGetFileDataPtr((r5 & 0xFF)[gUnknown_81178F4], &gOrnamentFileArchive); + u32 id = r5 & 0xFF; + file = OpenFileAndGetFileDataPtr(id[gUnknown_81178F4], &gOrnamentFileArchive); r2 = file->data; } @@ -452,28 +459,21 @@ void sub_80A69FC(struct UnkGroundSpriteStruct *ptr) } } -extern const char gUnknown_81177F4[]; -extern const char gUnknown_8117864[]; -extern const char gUnknown_81177EC[]; -extern const char *gUnknown_81178F4[]; -extern const DebugLocation gUnknown_8117858; -extern const DebugLocation gUnknown_8117888; - void GroundSprite_ExtendPaletteAdd(struct UnkGroundSpriteStruct *ptr, u16 a1) { OpenedFile *file; - s32 r1, r8; + s32 r8; unkStruct_3001B7C_sub108 *sub108Ptr; - s32 var_24; - s32 var_28; - s32 r6; + u16 var_28; + u16 var_24; + u16 r6; const void *r7; s32 r2; if (a1 & (0x100 | 0x200)) { if (a1 & 0x400) { - sub108Ptr = &gUnknown_3001B7C->unk108[0]; - if (sub108Ptr->unk0 != a1) { + sub108Ptr = &gUnknown_3001B7C->unk108[1]; + if (sub108Ptr->unk0 == a1) { sub108Ptr->unk2++; return; } @@ -481,14 +481,14 @@ void GroundSprite_ExtendPaletteAdd(struct UnkGroundSpriteStruct *ptr, u16 a1) else { r8 = 0; sub108Ptr = &gUnknown_3001B7C->unk108[0]; - r1 = 29; - for (; r8 < UNK_3001B7C_SUB108_COUNT; r1 = (s16)(r1 + 1), r8++, sub108Ptr++) { + for (; r8 < UNK_3001B7C_SUB108_COUNT; r8++, sub108Ptr++) { if (sub108Ptr->unk0 == a1) { + u16 r1 = r8 + 29; sub108Ptr->unk2++; if (ptr != NULL) { - ptr->unk68 = id - 16; + ptr->unk68 = r1 - 16; } - Log(0, gUnknown_81177F4, r8, r1 - 16, a1); + Log(0, gUnknown_81177F4, r8, r1, r1 - 16, a1); return; } } @@ -496,8 +496,8 @@ void GroundSprite_ExtendPaletteAdd(struct UnkGroundSpriteStruct *ptr, u16 a1) if (a1 & 0x400) { r8 = 1; - sub108Ptr = &gUnknown_3001B7C->unk108[0]; - if (sub108Ptr.unk2 < 0) { + sub108Ptr = &gUnknown_3001B7C->unk108[1]; + if (sub108Ptr->unk2 > 0) { FatalError(&gUnknown_8117858, gUnknown_8117864, a1); } } @@ -505,25 +505,26 @@ void GroundSprite_ExtendPaletteAdd(struct UnkGroundSpriteStruct *ptr, u16 a1) r8 = 0; sub108Ptr = &gUnknown_3001B7C->unk108[0]; for (; r8 < UNK_3001B7C_SUB108_COUNT; r8++, sub108Ptr++) { - if (sub108Ptr.unk2 < 0) { + if (sub108Ptr->unk2 <= 0) { break; } } - if (r8 >= UNK_3001B7C_SUB0_COUNT) { + if (r8 >= UNK_3001B7C_SUB108_COUNT) { FatalError(&gUnknown_8117888, gUnknown_8117864, a1); } } - var_28 = (u16)(r8 + 29); - var_24 = (u16)((r8 * 16) + 29); + var_28 = r8 + 29; + var_24 = (r8 * 16) + 464; if (a1 & 0x200) { file = OpenFileAndGetFileDataPtr(gUnknown_81177EC, &gMonsterFileArchive); r7 = file->data; - r7 += (a1 & 0xFF) * 32; + r7 += (a1 & 0xFF) * 64; } else { - file = OpenFileAndGetFileDataPtr(gUnknown_81178F4[a1 & 0xFF], &gMonsterFileArchive); + u32 id = a1 & 0xff; + file = OpenFileAndGetFileDataPtr(id[gUnknown_81178F4], &gOrnamentFileArchive); r7 = file->data; } @@ -557,3 +558,226 @@ void GroundSprite_ExtendPaletteAdd(struct UnkGroundSpriteStruct *ptr, u16 a1) } } } + +void GroundSprite_ExtendPaletteDelete(struct UnkGroundSpriteStruct *ptr) +{ + s32 r5; + unkStruct_3001B7C_sub108 *sub108Ptr; + + if (ptr != NULL) { + r5 = ptr->unk68 - 13; + if (r5 < 0) + return; + } + else { + r5 = 1; + } + + sub108Ptr = &gUnknown_3001B7C->unk108[r5]; + if (ptr != NULL) { + ptr->unk68 = 0; + } + + if (--sub108Ptr->unk2 <= 0) { + Log(0, gUnknown_81178C0, r5, sub108Ptr->unk0); + sub108Ptr->unk0 = 0; + sub108Ptr->unk2 = 0; + sub_80997F4(r5 + 29, 0); + } +} + +bool8 sub_80A6CF4(struct UnkGroundSpriteSubStructx48 *a0) +{ + struct UnkGroundSpriteStruct *spArray[UNK_3001B7C_SUB0_COUNT]; + s32 i; + unkStruct_3001B7C_sub0 *sub0Ptr; + PixelPos pixelPos; + s32 count = 0; + s32 r9 = a0->unk0; + s32 r10 = 0; + s32 var_28 = -1; + s32 var_24 = -1; + + sub_809D248(&pixelPos); + for (i = 0, sub0Ptr = &gUnknown_3001B7C->unk0[0]; i < UNK_3001B7C_SUB0_COUNT; i = (s16)(i+1), sub0Ptr++) { + if (sub0Ptr->unk0 == 1) { + struct UnkGroundSpriteStruct *ptr = sub0Ptr->unk8; + + if (!(ptr->unk50 & 0x2000) && ptr->unk7C >= 0) { + PixelPos resultPos; + resultPos.x = (sub0Ptr->unk8->unk74 / 256) - pixelPos.x; + resultPos.y = (sub0Ptr->unk8->unk78 / 256) - pixelPos.y; + + if (resultPos.y > 0) { + ptr->unk7C = 0x28 + resultPos.y; + } + else { + ptr->unk7C = 0x28 - resultPos.y; + } + + if (resultPos.x > 0) { + if (resultPos.x > ptr->unk7C) { + ptr->unk7C = resultPos.x; + } + } + else { + if (-resultPos.x > ptr->unk7C) { + ptr->unk7C = -resultPos.x; + } + } + + r10 += ptr->unk48.unk0; + if (ptr->unk48.unk0 >= r9 && var_24 < ptr->unk7C) { + var_28 = count; + var_24 = ptr->unk7C; + } + spArray[count++] = ptr; + } + } + } + + if (r10 < r9) + return FALSE; + if (var_28 >= 0) { + sub_80A69FC(spArray[var_28]); + return TRUE; + } + + while (count > 0) { + s32 i; + s32 r5 = -1; + s32 r3 = -1; + s32 r6 = 0; + + for (i = 0; i < count; i++) { + if (r3 < spArray[i]->unk7C) { + r5 = count; // This looks like a mistake to me? I believe it should be r5 = i instead, however I cannot verify the behavior in-game as I can't find where, if anywhere, this function runs. + r3 = spArray[i]->unk7C; + } + } + sub_80A69FC(spArray[r5]); + + count--; + for (i = r5; i < count; i++) { + spArray[i] = spArray[i + 1]; + } + + for (i = 0, sub0Ptr = &gUnknown_3001B7C->unk0[0]; i < UNK_3001B7C_SUB0_COUNT; i++, sub0Ptr++) { + if (sub0Ptr->unk0 == 0) { + if (++r6 >= r9) { + return TRUE; + } + } + else { + r6 = 0; + } + } + } + + return FALSE; +} + +extern void sub_800E970(void); + +extern PixelPos gUnknown_2039DD8; + +void sub_80A6E68(void) +{ + ResetSprites(FALSE); + nullsub_10(FALSE); + sub_800E970(); +} + +void sub_80ABA7C(void); +void sub_80ACAD4(void); +void sub_80AD7AC(void); + +void sub_80A6E80(void) +{ + DungeonPos pos; + + if (!sub_809D248(&gUnknown_2039DD8)) { + gUnknown_2039DD8.x = 0; + gUnknown_2039DD8.y = 0; + } + sub_80ABA7C(); + sub_80ACAD4(); + sub_80AD7AC(); + pos.x = gUnknown_2039DD8.x; + pos.y = gUnknown_2039DD8.y; + sub_800E90C(&pos); + sub_8005180(); + nullsub_12(); +} + +void sub_80A6EC8(struct UnkGroundSpriteStruct *ptr, s32 a1) +{ + if (ptr->unk52 > 0) { + if (a1 <= ptr->unk48.unk0) { + a1 = ptr->unk48.unk0; + } + if (ptr->unk64 != a1) { + ptr->unk66 = a1; + } + } +} + +void sub_80A6EFC(struct UnkGroundSpriteStruct *ptr, s32 a1_, s32 a2_) +{ + s32 flagResult; + unkStruct_3001B7C_sub0 *sub0Ptr; + s32 a1 = (s16) a1_; + s32 a2 = (s8) a2_; + + if (ptr->unk52 < 0) { + if (ptr->unk66 >= 0) { + if (!sub_80A68F8(ptr, &ptr->unk48, ptr->unk66)) + return; + ptr->unk66 = -1; + } + else { + if (ptr->unk48.unk0 <= 0) + return; + if (!sub_80A68F8(ptr, &ptr->unk48, -1)) + return; + + } + } + else { + if (ptr->unk66 >= 0) { + sub_80A69FC(ptr); + if (!sub_80A68F8(ptr, &ptr->unk48, ptr->unk66)) + return; + ptr->unk66 = -1; + } + } + + // s16 memes... + flagResult = a1 & 0x400; + if ((s16)flagResult) { + ptr->unk0 &= ~(0x1000); + return; + } + + sub0Ptr = &gUnknown_3001B7C->unk0[ptr->unk52]; + ptr->unk70 = 1; + ptr->unk7C = -1; + switch ((a1 & 0x700)) { + case 0x300: + ptr->unk6C = 0; + break; + case 0x100: + ptr->unk6C = 0x80; + break; + case 0: + default: + ptr->unk6C = 0x100; + break; + case 0x200: + ptr->unk6C = 0x200; + break; + } + + ptr->unk6E = 0; + AxResInit((void *)ptr, (void *) ptr->unk48.unk4, (a1 & 0xFF) + a2 / 8, a2 & 7, sub0Ptr->unk4, 0, ((u16)a1 & 0x800) != 0); // TODO: fix... +}