From f7fc91d8afa642e7a0fb63bc430777abcb5b55ce Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Sun, 25 May 2025 15:58:58 -0700 Subject: [PATCH 01/11] more work on ground_object --- asm/ground_object.s | 972 -------------------------------------------- src/ground_object.c | 734 ++++++++++++++++++++++++++++++++- src/ground_script.c | 35 +- 3 files changed, 747 insertions(+), 994 deletions(-) diff --git a/asm/ground_object.s b/asm/ground_object.s index 127ae7d22..502ce5237 100644 --- a/asm/ground_object.s +++ b/asm/ground_object.s @@ -5,978 +5,6 @@ .text - thumb_func_start GroundObject_Add -GroundObject_Add: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x14 - mov r8, r1 - lsls r0, 16 - asrs r7, r0, 16 - lsls r2, 16 - asrs r2, 16 - mov r10, r2 - lsls r3, 24 - asrs r3, 24 - mov r9, r3 - ldrb r4, [r1] - cmp r4, 0x1A - bne _080ABDDA - movs r0, 0 - movs r1, 0x28 - bl GetScriptVarValue - cmp r0, 0x1 - bgt _080ABDBC - movs r4, 0x1B - b _080ABDDA -_080ABDBC: - movs r0, 0 - movs r1, 0x29 - bl GetScriptVarValue - cmp r0, 0 - bne _080ABDD4 - movs r0, 0 - movs r1, 0x27 - bl GetScriptVarValue - adds r0, 0x1C - b _080ABDD6 -_080ABDD4: - adds r0, 0x2B -_080ABDD6: - lsls r0, 16 - asrs r4, r0, 16 -_080ABDDA: - lsls r1, r4, 2 - ldr r0, _080ABE10 - adds r6, r1, r0 - cmp r7, 0 - bge _080ABE40 - cmp r4, 0xE - bgt _080ABDF4 - cmp r4, 0xD - blt _080ABDF4 - adds r0, r4, 0 - bl sub_80ABD48 - adds r7, r0, 0 -_080ABDF4: - cmp r7, 0 - bge _080ABE40 - movs r3, 0 - ldr r0, _080ABE14 - ldr r5, [r0] - movs r0, 0x6 - ldrsh r1, [r5, r0] - movs r0, 0x1 - negs r0, r0 - cmp r1, r0 - bne _080ABE18 - movs r7, 0 - b _080ABE40 - .align 2, 0 -_080ABE10: .4byte gGroundObjectTypes -_080ABE14: .4byte gGroundObjects -_080ABE18: - adds r0, r3, 0x1 - lsls r0, 16 - asrs r3, r0, 16 - movs r1, 0xE2 - lsls r1, 1 - adds r5, r1 - cmp r3, 0xF - bgt _080ABE36 - movs r2, 0x6 - ldrsh r1, [r5, r2] - movs r0, 0x1 - negs r0, r0 - cmp r1, r0 - bne _080ABE18 - adds r7, r3, 0 -_080ABE36: - cmp r7, 0 - bge _080ABE40 - movs r0, 0x1 - negs r0, r0 - b _080AC142 -_080ABE40: - ldr r1, _080ABEA8 - lsls r0, r7, 3 - subs r0, r7 - lsls r0, 4 - adds r0, r7 - lsls r0, 2 - ldr r1, [r1] - adds r5, r1, r0 - ldr r1, _080ABEAC - mov r3, r8 - ldrb r0, [r3] - str r0, [sp] - movs r2, 0 - ldrsh r0, [r6, r2] - str r0, [sp, 0x4] - mov r3, r10 - str r3, [sp, 0x8] - mov r0, r9 - str r0, [sp, 0xC] - movs r0, 0 - adds r2, r7, 0 - adds r3, r4, 0 - bl Log - movs r2, 0 - movs r3, 0x6 - ldrsh r1, [r5, r3] - movs r0, 0x1 - negs r0, r0 - cmp r1, r0 - bne _080ABE80 - movs r2, 0x1 -_080ABE80: - str r2, [sp, 0x10] - strh r7, [r5, 0x4] - strh r4, [r5, 0x6] - mov r0, r10 - strh r0, [r5, 0x8] - mov r1, r9 - strb r1, [r5, 0xA] - ldrh r0, [r6] - subs r0, 0x1 - lsls r0, 16 - asrs r0, 16 - cmp r0, 0xE - bls _080ABE9C - b _080ABF8C -_080ABE9C: - lsls r0, 2 - ldr r1, _080ABEB0 - adds r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_080ABEA8: .4byte gGroundObjects -_080ABEAC: .4byte gUnknown_8118448 -_080ABEB0: .4byte _080ABEB4 - .align 2, 0 -_080ABEB4: - .4byte _080ABEF0 - .4byte _080ABF7C - .4byte _080ABF46 - .4byte _080ABF54 - .4byte _080ABF54 - .4byte _080ABF5E - .4byte _080ABF68 - .4byte _080ABF72 - .4byte _080ABF3C - .4byte _080ABEFA - .4byte _080ABEF0 - .4byte _080ABF06 - .4byte _080ABF2C - .4byte _080ABF1E - .4byte _080ABF12 -_080ABEF0: - movs r2, 0x8E - lsls r2, 1 - adds r1, r5, r2 - movs r0, 0 - b _080ABF94 -_080ABEFA: - movs r3, 0x8E - lsls r3, 1 - adds r1, r5, r3 - movs r0, 0x80 - lsls r0, 10 - b _080ABF94 -_080ABF06: - movs r0, 0x8E - lsls r0, 1 - adds r1, r5, r0 - movs r0, 0x80 - lsls r0, 11 - b _080ABF94 -_080ABF12: - movs r2, 0x8E - lsls r2, 1 - adds r1, r5, r2 - movs r0, 0x83 - lsls r0, 18 - b _080ABF94 -_080ABF1E: - movs r3, 0x8E - lsls r3, 1 - adds r1, r5, r3 - ldr r0, _080ABF28 - b _080ABF94 - .align 2, 0 -_080ABF28: .4byte 0x220c0000 -_080ABF2C: - movs r0, 0x8E - lsls r0, 1 - adds r1, r5, r0 - ldr r0, _080ABF38 - b _080ABF94 - .align 2, 0 -_080ABF38: .4byte 0x20010000 -_080ABF3C: - movs r2, 0x8E - lsls r2, 1 - adds r1, r5, r2 - movs r0, 0x5 - b _080ABF94 -_080ABF46: - movs r3, 0x8E - lsls r3, 1 - adds r1, r5, r3 - ldr r0, _080ABF50 - b _080ABF94 - .align 2, 0 -_080ABF50: .4byte 0x22000184 -_080ABF54: - movs r0, 0x8E - lsls r0, 1 - adds r1, r5, r0 - adds r0, 0x68 - b _080ABF94 -_080ABF5E: - movs r2, 0x8E - lsls r2, 1 - adds r1, r5, r2 - movs r0, 0x44 - b _080ABF94 -_080ABF68: - movs r3, 0x8E - lsls r3, 1 - adds r1, r5, r3 - movs r0, 0x84 - b _080ABF94 -_080ABF72: - movs r0, 0x8E - lsls r0, 1 - adds r1, r5, r0 - adds r0, 0x64 - b _080ABF94 -_080ABF7C: - movs r2, 0x8E - lsls r2, 1 - adds r1, r5, r2 - ldr r0, _080ABF88 - b _080ABF94 - .align 2, 0 -_080ABF88: .4byte 0x020000c4 -_080ABF8C: - movs r3, 0x8E - lsls r3, 1 - adds r1, r5, r3 - ldr r0, _080ABFA8 -_080ABF94: - str r0, [r1] - ldrb r0, [r6, 0x2] - cmp r0, 0 - bne _080ABFAC - mov r1, r8 - ldrb r0, [r1, 0x2] - lsls r0, 11 - str r0, [r5, 0xC] - ldrb r0, [r1, 0x3] - b _080ABFB4 - .align 2, 0 -_080ABFA8: .4byte 0x02000185 -_080ABFAC: - ldrb r0, [r6, 0x2] - lsls r0, 11 - str r0, [r5, 0xC] - ldrb r0, [r6, 0x3] -_080ABFB4: - lsls r0, 11 - str r0, [r5, 0x10] - ldr r0, [r5, 0xC] - lsrs r1, r0, 31 - adds r0, r1 - asrs r0, 1 - str r0, [r5, 0x14] - ldr r0, [r5, 0x10] - lsrs r1, r0, 31 - adds r0, r1 - asrs r0, 1 - str r0, [r5, 0x18] - mov r2, r8 - ldrb r0, [r2, 0x1] - strb r0, [r5, 0x1C] - adds r2, 0x4 - adds r4, r5, 0 - adds r4, 0x20 - ldrb r1, [r2, 0x2] - movs r0, 0x4 - ands r0, r1 - cmp r0, 0 - bne _080ABFFC - mov r3, r8 - ldrb r0, [r3, 0x4] - lsls r3, r0, 11 - str r3, [r5, 0x20] - ldrb r1, [r2, 0x2] - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - beq _080ABFFC - movs r1, 0x80 - lsls r1, 3 - adds r0, r3, r1 - str r0, [r5, 0x20] -_080ABFFC: - ldrb r1, [r2, 0x3] - movs r0, 0x4 - ands r0, r1 - cmp r0, 0 - bne _080AC01E - ldrb r0, [r2, 0x1] - lsls r3, r0, 11 - str r3, [r4, 0x4] - ldrb r1, [r2, 0x3] - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - beq _080AC01E - movs r2, 0x80 - lsls r2, 3 - adds r0, r3, r2 - str r0, [r4, 0x4] -_080AC01E: - ldr r3, [sp, 0x10] - cmp r3, 0 - beq _080AC076 - ldrb r1, [r5, 0x1C] - movs r2, 0x90 - lsls r2, 1 - adds r0, r5, r2 - movs r3, 0 - strb r1, [r0] - movs r0, 0x92 - lsls r0, 1 - adds r2, r5, r0 - ldr r0, [r5, 0x20] - ldr r1, [r5, 0x14] - subs r0, r1 - str r0, [r2] - movs r1, 0x96 - lsls r1, 1 - adds r2, r5, r1 - ldr r0, [r5, 0x20] - ldr r1, [r5, 0x14] - adds r0, r1 - str r0, [r2] - movs r0, 0x94 - lsls r0, 1 - adds r2, r5, r0 - ldr r0, [r5, 0x24] - ldr r1, [r5, 0x18] - subs r0, r1 - str r0, [r2] - movs r1, 0x98 - lsls r1, 1 - adds r2, r5, r1 - ldr r0, [r5, 0x24] - ldr r1, [r5, 0x18] - adds r0, r1 - str r0, [r2] - movs r2, 0x9A - lsls r2, 1 - adds r1, r5, r2 - adds r2, 0x4 - adds r0, r5, r2 - str r3, [r0] - str r3, [r1] -_080AC076: - adds r0, r5, 0 - adds r0, 0x28 - adds r1, r5, 0 - adds r1, 0x30 - bl GetCurrentDungeonBounds - ldr r3, [sp, 0x10] - cmp r3, 0 - beq _080AC0C0 - movs r0, 0x9F - lsls r0, 1 - adds r1, r5, r0 - movs r2, 0 - movs r0, 0x80 - lsls r0, 4 - strh r0, [r1] - movs r3, 0x9E - lsls r3, 1 - adds r1, r5, r3 - movs r0, 0x1 - strb r0, [r1] - movs r1, 0xA0 - lsls r1, 1 - adds r0, r5, r1 - strh r2, [r0] - movs r2, 0xA2 - lsls r2, 1 - adds r0, r5, r2 - movs r3, 0x6 - ldrsh r2, [r5, r3] - movs r3, 0x8E - lsls r3, 1 - adds r1, r5, r3 - ldr r3, [r1] - adds r1, r7, 0 - bl sub_80A75CC -_080AC0C0: - adds r4, r5, 0 - adds r4, 0x38 - ldr r1, _080AC154 - mov r0, r9 - str r0, [sp] - adds r0, r4, 0 - adds r2, r5, 0 - mov r3, r10 - bl InitActionWithParams - adds r6, r4, 0 - mov r1, r8 - ldr r2, [r1, 0xC] - cmp r2, 0 - bne _080AC0F2 - movs r2, 0xA2 - lsls r2, 1 - adds r0, r5, r2 - bl SpriteHasPokemonSize_80A66A4 - lsls r0, 24 - ldr r2, _080AC158 - cmp r0, 0 - beq _080AC0F2 - ldr r2, _080AC15C -_080AC0F2: - adds r0, r6, 0 - movs r1, 0x1 - bl SetPredefinedScript - adds r1, r4, 0 - mov r3, r8 - ldr r2, [r3, 0x10] - cmp r2, 0 - bne _080AC108 - ldr r0, _080AC160 - ldr r2, [r0, 0x38] -_080AC108: - adds r0, r1, 0 - movs r1, 0x2 - bl SetPredefinedScript - mov r0, r8 - ldr r2, [r0, 0x14] - cmp r2, 0 - bne _080AC11C - ldr r0, _080AC160 - ldr r2, [r0, 0x68] -_080AC11C: - adds r0, r4, 0 - movs r1, 0x3 - bl SetPredefinedScript - mov r1, r8 - ldr r2, [r1, 0x8] - cmp r2, 0 - beq _080AC140 - adds r0, r4, 0 - movs r1, 0 - bl SetPredefinedScript - ldr r3, _080AC164 - adds r0, r4, 0 - movs r1, 0 - movs r2, 0 - bl ExecutePredefinedScript -_080AC140: - adds r0, r7, 0 -_080AC142: - add sp, 0x14 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_080AC154: .4byte gGroundObjectCallbacks -_080AC158: .4byte gUnknown_81182F4 -_080AC15C: .4byte gUnknown_8118350 -_080AC160: .4byte gFunctionScriptTable -_080AC164: .4byte gUnknown_81184A4 - thumb_func_end GroundObject_Add - - thumb_func_start GroundObject_Delete -GroundObject_Delete: - push {r4,lr} - adds r2, r0, 0 - lsls r2, 16 - asrs r2, 16 - ldr r1, _080AC1A4 - lsls r0, r2, 3 - subs r0, r2 - lsls r0, 4 - adds r0, r2 - lsls r0, 2 - ldr r1, [r1] - adds r4, r1, r0 - ldr r1, _080AC1A8 - movs r0, 0 - bl Log - movs r1, 0xA2 - lsls r1, 1 - adds r0, r4, r1 - bl sub_80A7658 - adds r0, r4, 0 - adds r0, 0x38 - bl InitAction2 - ldr r0, _080AC1AC - strh r0, [r4, 0x6] - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_080AC1A4: .4byte gGroundObjects -_080AC1A8: .4byte gUnknown_81184B0 -_080AC1AC: .4byte 0x0000ffff - thumb_func_end GroundObject_Delete - - thumb_func_start sub_80AC1B0 -sub_80AC1B0: - push {lr} - adds r3, r1, 0 - lsls r0, 16 - asrs r0, 16 - ldr r2, _080AC1F0 - lsls r1, r0, 3 - subs r1, r0 - lsls r1, 4 - adds r1, r0 - lsls r1, 2 - ldr r0, [r2] - adds r2, r0, r1 - movs r0, 0x6 - ldrsh r1, [r2, r0] - movs r0, 0x1 - negs r0, r0 - cmp r1, r0 - beq _080AC1EA - movs r1, 0x8E - lsls r1, 1 - adds r0, r2, r1 - ldr r1, [r0] - orrs r1, r3 - str r1, [r0] - movs r3, 0xA2 - lsls r3, 1 - adds r0, r2, r3 - bl sub_80A6688 -_080AC1EA: - pop {r0} - bx r0 - .align 2, 0 -_080AC1F0: .4byte gGroundObjects - thumb_func_end sub_80AC1B0 - - thumb_func_start sub_80AC1F4 -sub_80AC1F4: - push {r4,lr} - adds r4, r1, 0 - lsls r0, 16 - asrs r0, 16 - ldr r2, _080AC238 - lsls r1, r0, 3 - subs r1, r0 - lsls r1, 4 - adds r1, r0 - lsls r1, 2 - ldr r0, [r2] - adds r3, r0, r1 - movs r0, 0x6 - ldrsh r1, [r3, r0] - movs r0, 0x1 - negs r0, r0 - cmp r1, r0 - beq _080AC232 - movs r0, 0x8E - lsls r0, 1 - adds r2, r3, r0 - ldr r0, _080AC23C - eors r0, r4 - ldr r1, [r2] - ands r1, r0 - str r1, [r2] - movs r2, 0xA2 - lsls r2, 1 - adds r0, r3, r2 - bl sub_80A6688 -_080AC232: - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_080AC238: .4byte gGroundObjects -_080AC23C: .4byte 0x337fffff - thumb_func_end sub_80AC1F4 - - thumb_func_start sub_80AC240 -sub_80AC240: - push {lr} - lsls r0, 16 - asrs r0, 16 - ldr r2, _080AC268 - lsls r1, r0, 3 - subs r1, r0 - lsls r1, 4 - adds r1, r0 - lsls r1, 2 - ldr r0, [r2] - adds r2, r0, r1 - movs r0, 0x6 - ldrsh r1, [r2, r0] - movs r0, 0x1 - negs r0, r0 - cmp r1, r0 - bne _080AC26C - movs r0, 0 - b _080AC270 - .align 2, 0 -_080AC268: .4byte gGroundObjects -_080AC26C: - adds r0, r2, 0 - adds r0, 0x38 -_080AC270: - pop {r1} - bx r1 - thumb_func_end sub_80AC240 - - thumb_func_start sub_80AC274 -sub_80AC274: - push {r4,lr} - adds r4, r1, 0 - lsls r0, 16 - asrs r0, 16 - lsls r2, 16 - asrs r3, r2, 16 - ldr r2, _080AC2A0 - lsls r1, r0, 3 - subs r1, r0 - lsls r1, 4 - adds r1, r0 - lsls r1, 2 - ldr r0, [r2] - adds r2, r0, r1 - movs r0, 0x6 - ldrsh r1, [r2, r0] - movs r0, 0x1 - negs r0, r0 - cmp r1, r0 - bne _080AC2A4 - movs r0, 0 - b _080AC2B4 - .align 2, 0 -_080AC2A0: .4byte gGroundObjects -_080AC2A4: - adds r0, r2, 0 - adds r0, 0x38 - adds r1, r4, 0 - adds r2, r3, 0 - bl GetPredefinedScript - lsls r0, 24 - lsrs r0, 24 -_080AC2B4: - pop {r4} - pop {r1} - bx r1 - thumb_func_end sub_80AC274 - - thumb_func_start GroundObject_ExecuteScript -GroundObject_ExecuteScript: - push {r4-r6,lr} - adds r3, r0, 0 - adds r5, r1, 0 - adds r6, r2, 0 - lsls r3, 16 - asrs r3, 16 - ldr r1, _080AC2F4 - lsls r0, r3, 3 - subs r0, r3 - lsls r0, 4 - adds r0, r3 - lsls r0, 2 - ldr r1, [r1] - adds r4, r1, r0 - ldr r1, _080AC2F8 - movs r0, 0 - adds r2, r3, 0 - bl Log - movs r0, 0x6 - ldrsh r1, [r4, r0] - movs r0, 0x1 - negs r0, r0 - cmp r1, r0 - bne _080AC2FC - movs r0, 0 - b _080AC314 - .align 2, 0 -_080AC2F4: .4byte gGroundObjects -_080AC2F8: .4byte gUnknown_81184CC -_080AC2FC: - adds r0, r4, 0 - adds r0, 0x38 - ldr r3, _080AC31C - adds r1, r5, 0 - adds r2, r6, 0 - bl GroundScript_ExecutePP - movs r0, 0x9E - lsls r0, 1 - adds r1, r4, r0 - movs r0, 0x1 - strb r0, [r1] -_080AC314: - pop {r4-r6} - pop {r1} - bx r1 - .align 2, 0 -_080AC31C: .4byte gUnknown_8118504 - thumb_func_end GroundObject_ExecuteScript - - thumb_func_start GroundObjectsNotifyAll -GroundObjectsNotifyAll: - push {r4-r7,lr} - mov r7, r8 - push {r7} - lsls r0, 16 - asrs r7, r0, 16 - ldr r0, _080AC374 - ldr r4, [r0] - movs r5, 0 - movs r0, 0x1 - negs r0, r0 - mov r8, r0 - movs r6, 0x80 - lsls r6, 9 -_080AC33A: - movs r1, 0x6 - ldrsh r0, [r4, r1] - cmp r0, r8 - beq _080AC352 - adds r0, r4, 0 - adds r0, 0x38 - adds r1, r7, 0 - bl GroundScriptNotify - orrs r5, r0 - lsls r0, r5, 24 - lsrs r5, r0, 24 -_080AC352: - adds r0, r6, 0 - movs r1, 0x80 - lsls r1, 9 - adds r6, r1 - asrs r0, 16 - movs r1, 0xE2 - lsls r1, 1 - adds r4, r1 - cmp r0, 0xF - ble _080AC33A - adds r0, r5, 0 - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_080AC374: .4byte gGroundObjects - thumb_func_end GroundObjectsNotifyAll - - thumb_func_start GroundObjectsCancellAll -GroundObjectsCancellAll: - push {r4-r7,lr} - ldr r0, _080AC3BC - ldr r4, [r0] - movs r5, 0 - movs r7, 0x1 - negs r7, r7 - movs r6, 0x80 - lsls r6, 9 -_080AC388: - movs r1, 0x6 - ldrsh r0, [r4, r1] - cmp r0, r7 - beq _080AC39E - adds r0, r4, 0 - adds r0, 0x38 - bl GroundScript_Cancel - orrs r5, r0 - lsls r0, r5, 24 - lsrs r5, r0, 24 -_080AC39E: - adds r0, r6, 0 - movs r1, 0x80 - lsls r1, 9 - adds r6, r1 - asrs r0, 16 - movs r1, 0xE2 - lsls r1, 1 - adds r4, r1 - cmp r0, 0xF - ble _080AC388 - adds r0, r5, 0 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_080AC3BC: .4byte gGroundObjects - thumb_func_end GroundObjectsCancellAll - - thumb_func_start sub_80AC3C0 -sub_80AC3C0: - lsls r0, 16 - asrs r0, 16 - ldr r2, _080AC3DC - lsls r1, r0, 3 - subs r1, r0 - lsls r1, 4 - adds r1, r0 - lsls r1, 2 - ldr r0, [r2] - adds r0, r1 - movs r1, 0x6 - ldrsh r0, [r0, r1] - bx lr - .align 2, 0 -_080AC3DC: .4byte gGroundObjects - thumb_func_end sub_80AC3C0 - - thumb_func_start sub_80AC3E0 -sub_80AC3E0: - lsls r0, 16 - asrs r0, 16 - ldr r3, _080AC404 - lsls r2, r0, 3 - subs r2, r0 - lsls r2, 4 - adds r2, r0 - lsls r2, 2 - ldr r0, [r3] - adds r0, r2 - movs r3, 0x8E - lsls r3, 1 - adds r2, r0, r3 - ldr r2, [r2] - str r2, [r1] - movs r1, 0x6 - ldrsh r0, [r0, r1] - bx lr - .align 2, 0 -_080AC404: .4byte gGroundObjects - thumb_func_end sub_80AC3E0 - - thumb_func_start sub_80AC408 -sub_80AC408: - push {lr} - adds r3, r1, 0 - lsls r0, 16 - asrs r0, 16 - ldr r2, _080AC434 - lsls r1, r0, 3 - subs r1, r0 - lsls r1, 4 - adds r1, r0 - lsls r1, 2 - ldr r0, [r2] - adds r2, r0, r1 - movs r0, 0x6 - ldrsh r1, [r2, r0] - movs r0, 0x1 - negs r0, r0 - cmp r1, r0 - bne _080AC438 - movs r0, 0 - str r0, [r3] - str r0, [r3, 0x4] - b _080AC440 - .align 2, 0 -_080AC434: .4byte gGroundObjects -_080AC438: - ldr r0, [r2, 0xC] - ldr r1, [r2, 0x10] - str r0, [r3] - str r1, [r3, 0x4] -_080AC440: - movs r1, 0x6 - ldrsh r0, [r2, r1] - pop {r1} - bx r1 - thumb_func_end sub_80AC408 - - thumb_func_start sub_80AC448 -sub_80AC448: - push {lr} - adds r3, r1, 0 - lsls r0, 16 - asrs r0, 16 - ldr r2, _080AC474 - lsls r1, r0, 3 - subs r1, r0 - lsls r1, 4 - adds r1, r0 - lsls r1, 2 - ldr r0, [r2] - adds r2, r0, r1 - movs r0, 0x6 - ldrsh r1, [r2, r0] - movs r0, 0x1 - negs r0, r0 - cmp r1, r0 - bne _080AC478 - movs r0, 0 - str r0, [r3] - b _080AC492 - .align 2, 0 -_080AC474: .4byte gGroundObjects -_080AC478: - movs r1, 0x92 - lsls r1, 1 - adds r0, r2, r1 - ldr r0, [r0] - ldr r1, [r2, 0x14] - adds r0, r1 - str r0, [r3] - movs r1, 0x94 - lsls r1, 1 - adds r0, r2, r1 - ldr r0, [r0] - ldr r1, [r2, 0x18] - adds r0, r1 -_080AC492: - str r0, [r3, 0x4] - movs r1, 0x6 - ldrsh r0, [r2, r1] - pop {r1} - bx r1 - thumb_func_end sub_80AC448 - - thumb_func_start sub_80AC49C -sub_80AC49C: - push {r4,lr} - lsls r0, 16 - asrs r0, 16 - ldr r3, _080AC4C4 - lsls r2, r0, 3 - subs r2, r0 - lsls r2, 4 - adds r2, r0 - lsls r2, 2 - ldr r4, [r3] - adds r4, r2 - adds r0, r4, 0 - bl TryMoveObjectRelative_80AC6AC - movs r1, 0x6 - ldrsh r0, [r4, r1] - pop {r4} - pop {r1} - bx r1 - .align 2, 0 -_080AC4C4: .4byte gGroundObjects - thumb_func_end sub_80AC49C - thumb_func_start sub_80AC4C8 sub_80AC4C8: push {r4-r7,lr} diff --git a/src/ground_object.c b/src/ground_object.c index 3711a764a..bbf6e1a77 100644 --- a/src/ground_object.c +++ b/src/ground_object.c @@ -1,7 +1,15 @@ +#include "gba/types.h" #include "global.h" +#include "structs/str_ground_script.h" #include "ground_script.h" +#include "ground_sprite.h" #include "memory.h" +// TODO: figure out if this is used anywhere else +struct GroundObjectSub { + s32 a0[2]; +}; + typedef struct GroundObject { // size: 0x1C4 u8 unk0[4]; @@ -9,15 +17,26 @@ typedef struct GroundObject { s16 unk6; // kind s16 unk8; // scriptID / group s8 unkA; // sector - u8 fillB[0x14 - 0xB]; - u32 unk14; - u32 unk18; - u8 fill1C[0x38 - 0x1C]; + u8 unkB; + struct GroundObjectSub unkC; + PixelPos unk14; + //s32 unk18; + u8 unk1C; + PixelPos unk20; + s32 unk28[2]; + s32 unk30[2]; Action unk38; - u8 unk11C[0x124 - 0x11C]; - u32 unk124[2]; - u8 unk12C[0x144 - 0x12C]; - u8 unk144[0x1C4 - 0x144]; + u32 flags; + u8 unk120; + PixelPos unk124; + u32 unk12C; + u32 unk130; + PixelPos unk134; + //u32 unk138; + u8 unk13C; + u16 unk13E; + u16 unk140; + struct UnkGroundSpriteStruct unk144; } GroundObject; IWRAM_INIT GroundObject *gGroundObjects = NULL; @@ -25,13 +44,19 @@ IWRAM_INIT GroundObject *gGroundObjects = NULL; void DeleteGroundObjects(void); void GroundObject_Delete(s32); -extern u8 gUnknown_811842C[]; -extern u8 gUnknown_8118414[]; -extern u8 gUnknown_81183F0[]; -s16 GroundObject_Add(s32 id, const GroundObjectData*, s32 group, s32 sector); extern DebugLocation gUnknown_81183E4; +extern u8 gUnknown_81183F0[]; +extern u8 gUnknown_8118414[]; +extern u8 gUnknown_811842C[]; +extern u8 gUnknown_81184B0[]; + const struct GroundScriptHeader *GetGroundScript(s16 a0, DebugLocation *); -bool8 IsOnscreen_80A675C(u8 *, u32 *); +void sub_80A7658(struct UnkGroundSpriteStruct *); +extern bool8 GroundScriptNotify(Action*, s32); +extern bool8 GroundScript_Cancel(Action *r0); + + +s16 GroundObject_Add(s32 id, const GroundObjectData*, s32 group, s32 sector); void AllocGroundObjects(void) { @@ -125,7 +150,7 @@ void GroundObject_CancelBlank(void) { s32 index; GroundObject *ptr; - u32 stack[2]; + PixelPos stack; Log('\0',gUnknown_811842C); @@ -135,9 +160,9 @@ void GroundObject_CancelBlank(void) { if(ptr->unk6 != -1) { - stack[0] = ptr->unk124[0] + ptr->unk14; - stack[1] = ptr->unk124[1] + ptr->unk18; - if(!IsOnscreen_80A675C(ptr->unk144, stack)) + stack.x = ptr->unk124.x + ptr->unk14.x; + stack.y = ptr->unk124.y + ptr->unk14.y; + if(!IsOnscreen_80A675C(&ptr->unk144, &stack)) GroundObject_Delete(index); } } @@ -159,3 +184,678 @@ s32 sub_80ABD48(s32 r0) return -1; } + +NAKED +s16 GroundObject_Add(s32 id, const GroundObjectData *objectData, s32 group, s32 sector) +{ + asm_unified( +" push {r4-r7,lr} \n" +" mov r7, r10 \n" +" mov r6, r9 \n" +" mov r5, r8 \n" +" push {r5-r7} \n" +" sub sp, 0x14 \n" +" mov r8, r1 \n" +" lsls r0, 16 \n" +" asrs r7, r0, 16 \n" +" lsls r2, 16 \n" +" asrs r2, 16 \n" +" mov r10, r2 \n" +" lsls r3, 24 \n" +" asrs r3, 24 \n" +" mov r9, r3 \n" +" ldrb r4, [r1] \n" +" cmp r4, 0x1A \n" +" bne _080ABDDA \n" +" movs r0, 0 \n" +" movs r1, 0x28 \n" +" bl GetScriptVarValue \n" +" cmp r0, 0x1 \n" +" bgt _080ABDBC \n" +" movs r4, 0x1B \n" +" b _080ABDDA \n" +"_080ABDBC: \n" +" movs r0, 0 \n" +" movs r1, 0x29 \n" +" bl GetScriptVarValue \n" +" cmp r0, 0 \n" +" bne _080ABDD4 \n" +" movs r0, 0 \n" +" movs r1, 0x27 \n" +" bl GetScriptVarValue \n" +" adds r0, 0x1C \n" +" b _080ABDD6 \n" +"_080ABDD4: \n" +" adds r0, 0x2B \n" +"_080ABDD6: \n" +" lsls r0, 16 \n" +" asrs r4, r0, 16 \n" +"_080ABDDA: \n" +" lsls r1, r4, 2 \n" +" ldr r0, _080ABE10 \n" +" adds r6, r1, r0 \n" +" cmp r7, 0 \n" +" bge _080ABE40 \n" +" cmp r4, 0xE \n" +" bgt _080ABDF4 \n" +" cmp r4, 0xD \n" +" blt _080ABDF4 \n" +" adds r0, r4, 0 \n" +" bl sub_80ABD48 \n" +" adds r7, r0, 0 \n" +"_080ABDF4: \n" +" cmp r7, 0 \n" +" bge _080ABE40 \n" +" movs r3, 0 \n" +" ldr r0, _080ABE14 \n" +" ldr r5, [r0] \n" +" movs r0, 0x6 \n" +" ldrsh r1, [r5, r0] \n" +" movs r0, 0x1 \n" +" negs r0, r0 \n" +" cmp r1, r0 \n" +" bne _080ABE18 \n" +" movs r7, 0 \n" +" b _080ABE40 \n" +" .align 2, 0 \n" +"_080ABE10: .4byte gGroundObjectTypes\n" +"_080ABE14: .4byte gGroundObjects \n" +"_080ABE18: \n" +" adds r0, r3, 0x1 \n" +" lsls r0, 16 \n" +" asrs r3, r0, 16 \n" +" movs r1, 0xE2 \n" +" lsls r1, 1 \n" +" adds r5, r1 \n" +" cmp r3, 0xF \n" +" bgt _080ABE36 \n" +" movs r2, 0x6 \n" +" ldrsh r1, [r5, r2] \n" +" movs r0, 0x1 \n" +" negs r0, r0 \n" +" cmp r1, r0 \n" +" bne _080ABE18 \n" +" adds r7, r3, 0 \n" +"_080ABE36: \n" +" cmp r7, 0 \n" +" bge _080ABE40 \n" +" movs r0, 0x1 \n" +" negs r0, r0 \n" +" b _080AC142 \n" +"_080ABE40: \n" +" ldr r1, _080ABEA8 \n" +" lsls r0, r7, 3 \n" +" subs r0, r7 \n" +" lsls r0, 4 \n" +" adds r0, r7 \n" +" lsls r0, 2 \n" +" ldr r1, [r1] \n" +" adds r5, r1, r0 \n" +" ldr r1, _080ABEAC \n" +" mov r3, r8 \n" +" ldrb r0, [r3] \n" +" str r0, [sp] \n" +" movs r2, 0 \n" +" ldrsh r0, [r6, r2] \n" +" str r0, [sp, 0x4] \n" +" mov r3, r10 \n" +" str r3, [sp, 0x8] \n" +" mov r0, r9 \n" +" str r0, [sp, 0xC] \n" +" movs r0, 0 \n" +" adds r2, r7, 0 \n" +" adds r3, r4, 0 \n" +" bl Log \n" +" movs r2, 0 \n" +" movs r3, 0x6 \n" +" ldrsh r1, [r5, r3] \n" +" movs r0, 0x1 \n" +" negs r0, r0 \n" +" cmp r1, r0 \n" +" bne _080ABE80 \n" +" movs r2, 0x1 \n" +"_080ABE80: \n" +" str r2, [sp, 0x10] \n" +" strh r7, [r5, 0x4] \n" +" strh r4, [r5, 0x6] \n" +" mov r0, r10 \n" +" strh r0, [r5, 0x8] \n" +" mov r1, r9 \n" +" strb r1, [r5, 0xA] \n" +" ldrh r0, [r6] \n" +" subs r0, 0x1 \n" +" lsls r0, 16 \n" +" asrs r0, 16 \n" +" cmp r0, 0xE \n" +" bls _080ABE9C \n" +" b _080ABF8C \n" +"_080ABE9C: \n" +" lsls r0, 2 \n" +" ldr r1, _080ABEB0 \n" +" adds r0, r1 \n" +" ldr r0, [r0] \n" +" mov pc, r0 \n" +" .align 2, 0 \n" +"_080ABEA8: .4byte gGroundObjects \n" +"_080ABEAC: .4byte gUnknown_8118448\n" +"_080ABEB0: .4byte _080ABEB4 \n" +" .align 2, 0 \n" +"_080ABEB4: \n" +" .4byte _080ABEF0 \n" +" .4byte _080ABF7C \n" +" .4byte _080ABF46 \n" +" .4byte _080ABF54 \n" +" .4byte _080ABF54 \n" +" .4byte _080ABF5E \n" +" .4byte _080ABF68 \n" +" .4byte _080ABF72 \n" +" .4byte _080ABF3C \n" +" .4byte _080ABEFA \n" +" .4byte _080ABEF0 \n" +" .4byte _080ABF06 \n" +" .4byte _080ABF2C \n" +" .4byte _080ABF1E \n" +" .4byte _080ABF12 \n" +"_080ABEF0: \n" +" movs r2, 0x8E \n" +" lsls r2, 1 \n" +" adds r1, r5, r2 \n" +" movs r0, 0 \n" +" b _080ABF94 \n" +"_080ABEFA: \n" +" movs r3, 0x8E \n" +" lsls r3, 1 \n" +" adds r1, r5, r3 \n" +" movs r0, 0x80 \n" +" lsls r0, 10 \n" +" b _080ABF94 \n" +"_080ABF06: \n" +" movs r0, 0x8E \n" +" lsls r0, 1 \n" +" adds r1, r5, r0 \n" +" movs r0, 0x80 \n" +" lsls r0, 11 \n" +" b _080ABF94 \n" +"_080ABF12: \n" +" movs r2, 0x8E \n" +" lsls r2, 1 \n" +" adds r1, r5, r2 \n" +" movs r0, 0x83 \n" +" lsls r0, 18 \n" +" b _080ABF94 \n" +"_080ABF1E: \n" +" movs r3, 0x8E \n" +" lsls r3, 1 \n" +" adds r1, r5, r3 \n" +" ldr r0, _080ABF28 \n" +" b _080ABF94 \n" +" .align 2, 0 \n" +"_080ABF28: .4byte 0x220c0000 \n" +"_080ABF2C: \n" +" movs r0, 0x8E \n" +" lsls r0, 1 \n" +" adds r1, r5, r0 \n" +" ldr r0, _080ABF38 \n" +" b _080ABF94 \n" +" .align 2, 0 \n" +"_080ABF38: .4byte 0x20010000 \n" +"_080ABF3C: \n" +" movs r2, 0x8E \n" +" lsls r2, 1 \n" +" adds r1, r5, r2 \n" +" movs r0, 0x5 \n" +" b _080ABF94 \n" +"_080ABF46: \n" +" movs r3, 0x8E \n" +" lsls r3, 1 \n" +" adds r1, r5, r3 \n" +" ldr r0, _080ABF50 \n" +" b _080ABF94 \n" +" .align 2, 0 \n" +"_080ABF50: .4byte 0x22000184 \n" +"_080ABF54: \n" +" movs r0, 0x8E \n" +" lsls r0, 1 \n" +" adds r1, r5, r0 \n" +" adds r0, 0x68 \n" +" b _080ABF94 \n" +"_080ABF5E: \n" +" movs r2, 0x8E \n" +" lsls r2, 1 \n" +" adds r1, r5, r2 \n" +" movs r0, 0x44 \n" +" b _080ABF94 \n" +"_080ABF68: \n" +" movs r3, 0x8E \n" +" lsls r3, 1 \n" +" adds r1, r5, r3 \n" +" movs r0, 0x84 \n" +" b _080ABF94 \n" +"_080ABF72: \n" +" movs r0, 0x8E \n" +" lsls r0, 1 \n" +" adds r1, r5, r0 \n" +" adds r0, 0x64 \n" +" b _080ABF94 \n" +"_080ABF7C: \n" +" movs r2, 0x8E \n" +" lsls r2, 1 \n" +" adds r1, r5, r2 \n" +" ldr r0, _080ABF88 \n" +" b _080ABF94 \n" +" .align 2, 0 \n" +"_080ABF88: .4byte 0x020000c4 \n" +"_080ABF8C: \n" +" movs r3, 0x8E \n" +" lsls r3, 1 \n" +" adds r1, r5, r3 \n" +" ldr r0, _080ABFA8 \n" +"_080ABF94: \n" +" str r0, [r1] \n" +" ldrb r0, [r6, 0x2] \n" +" cmp r0, 0 \n" +" bne _080ABFAC \n" +" mov r1, r8 \n" +" ldrb r0, [r1, 0x2] \n" +" lsls r0, 11 \n" +" str r0, [r5, 0xC] \n" +" ldrb r0, [r1, 0x3] \n" +" b _080ABFB4 \n" +" .align 2, 0 \n" +"_080ABFA8: .4byte 0x02000185 \n" +"_080ABFAC: \n" +" ldrb r0, [r6, 0x2] \n" +" lsls r0, 11 \n" +" str r0, [r5, 0xC] \n" +" ldrb r0, [r6, 0x3] \n" +"_080ABFB4: \n" +" lsls r0, 11 \n" +" str r0, [r5, 0x10] \n" +" ldr r0, [r5, 0xC] \n" +" lsrs r1, r0, 31 \n" +" adds r0, r1 \n" +" asrs r0, 1 \n" +" str r0, [r5, 0x14] \n" +" ldr r0, [r5, 0x10] \n" +" lsrs r1, r0, 31 \n" +" adds r0, r1 \n" +" asrs r0, 1 \n" +" str r0, [r5, 0x18] \n" +" mov r2, r8 \n" +" ldrb r0, [r2, 0x1] \n" +" strb r0, [r5, 0x1C] \n" +" adds r2, 0x4 \n" +" adds r4, r5, 0 \n" +" adds r4, 0x20 \n" +" ldrb r1, [r2, 0x2] \n" +" movs r0, 0x4 \n" +" ands r0, r1 \n" +" cmp r0, 0 \n" +" bne _080ABFFC \n" +" mov r3, r8 \n" +" ldrb r0, [r3, 0x4] \n" +" lsls r3, r0, 11 \n" +" str r3, [r5, 0x20] \n" +" ldrb r1, [r2, 0x2] \n" +" movs r0, 0x2 \n" +" ands r0, r1 \n" +" cmp r0, 0 \n" +" beq _080ABFFC \n" +" movs r1, 0x80 \n" +" lsls r1, 3 \n" +" adds r0, r3, r1 \n" +" str r0, [r5, 0x20] \n" +"_080ABFFC: \n" +" ldrb r1, [r2, 0x3] \n" +" movs r0, 0x4 \n" +" ands r0, r1 \n" +" cmp r0, 0 \n" +" bne _080AC01E \n" +" ldrb r0, [r2, 0x1] \n" +" lsls r3, r0, 11 \n" +" str r3, [r4, 0x4] \n" +" ldrb r1, [r2, 0x3] \n" +" movs r0, 0x2 \n" +" ands r0, r1 \n" +" cmp r0, 0 \n" +" beq _080AC01E \n" +" movs r2, 0x80 \n" +" lsls r2, 3 \n" +" adds r0, r3, r2 \n" +" str r0, [r4, 0x4] \n" +"_080AC01E: \n" +" ldr r3, [sp, 0x10] \n" +" cmp r3, 0 \n" +" beq _080AC076 \n" +" ldrb r1, [r5, 0x1C] \n" +" movs r2, 0x90 \n" +" lsls r2, 1 \n" +" adds r0, r5, r2 \n" +" movs r3, 0 \n" +" strb r1, [r0] \n" +" movs r0, 0x92 \n" +" lsls r0, 1 \n" +" adds r2, r5, r0 \n" +" ldr r0, [r5, 0x20] \n" +" ldr r1, [r5, 0x14] \n" +" subs r0, r1 \n" +" str r0, [r2] \n" +" movs r1, 0x96 \n" +" lsls r1, 1 \n" +" adds r2, r5, r1 \n" +" ldr r0, [r5, 0x20] \n" +" ldr r1, [r5, 0x14] \n" +" adds r0, r1 \n" +" str r0, [r2] \n" +" movs r0, 0x94 \n" +" lsls r0, 1 \n" +" adds r2, r5, r0 \n" +" ldr r0, [r5, 0x24] \n" +" ldr r1, [r5, 0x18] \n" +" subs r0, r1 \n" +" str r0, [r2] \n" +" movs r1, 0x98 \n" +" lsls r1, 1 \n" +" adds r2, r5, r1 \n" +" ldr r0, [r5, 0x24] \n" +" ldr r1, [r5, 0x18] \n" +" adds r0, r1 \n" +" str r0, [r2] \n" +" movs r2, 0x9A \n" +" lsls r2, 1 \n" +" adds r1, r5, r2 \n" +" adds r2, 0x4 \n" +" adds r0, r5, r2 \n" +" str r3, [r0] \n" +" str r3, [r1] \n" +"_080AC076: \n" +" adds r0, r5, 0 \n" +" adds r0, 0x28 \n" +" adds r1, r5, 0 \n" +" adds r1, 0x30 \n" +" bl GetCurrentDungeonBounds \n" +" ldr r3, [sp, 0x10] \n" +" cmp r3, 0 \n" +" beq _080AC0C0 \n" +" movs r0, 0x9F \n" +" lsls r0, 1 \n" +" adds r1, r5, r0 \n" +" movs r2, 0 \n" +" movs r0, 0x80 \n" +" lsls r0, 4 \n" +" strh r0, [r1] \n" +" movs r3, 0x9E \n" +" lsls r3, 1 \n" +" adds r1, r5, r3 \n" +" movs r0, 0x1 \n" +" strb r0, [r1] \n" +" movs r1, 0xA0 \n" +" lsls r1, 1 \n" +" adds r0, r5, r1 \n" +" strh r2, [r0] \n" +" movs r2, 0xA2 \n" +" lsls r2, 1 \n" +" adds r0, r5, r2 \n" +" movs r3, 0x6 \n" +" ldrsh r2, [r5, r3] \n" +" movs r3, 0x8E \n" +" lsls r3, 1 \n" +" adds r1, r5, r3 \n" +" ldr r3, [r1] \n" +" adds r1, r7, 0 \n" +" bl sub_80A75CC \n" +"_080AC0C0: \n" +" adds r4, r5, 0 \n" +" adds r4, 0x38 \n" +" ldr r1, _080AC154 \n" +" mov r0, r9 \n" +" str r0, [sp] \n" +" adds r0, r4, 0 \n" +" adds r2, r5, 0 \n" +" mov r3, r10 \n" +" bl InitActionWithParams \n" +" adds r6, r4, 0 \n" +" mov r1, r8 \n" +" ldr r2, [r1, 0xC] \n" +" cmp r2, 0 \n" +" bne _080AC0F2 \n" +" movs r2, 0xA2 \n" +" lsls r2, 1 \n" +" adds r0, r5, r2 \n" +" bl SpriteHasPokemonSize_80A66A4\n" +" lsls r0, 24 \n" +" ldr r2, _080AC158 \n" +" cmp r0, 0 \n" +" beq _080AC0F2 \n" +" ldr r2, _080AC15C \n" +"_080AC0F2: \n" +" adds r0, r6, 0 \n" +" movs r1, 0x1 \n" +" bl SetPredefinedScript \n" +" adds r1, r4, 0 \n" +" mov r3, r8 \n" +" ldr r2, [r3, 0x10] \n" +" cmp r2, 0 \n" +" bne _080AC108 \n" +" ldr r0, _080AC160 \n" +" ldr r2, [r0, 0x38] \n" +"_080AC108: \n" +" adds r0, r1, 0 \n" +" movs r1, 0x2 \n" +" bl SetPredefinedScript \n" +" mov r0, r8 \n" +" ldr r2, [r0, 0x14] \n" +" cmp r2, 0 \n" +" bne _080AC11C \n" +" ldr r0, _080AC160 \n" +" ldr r2, [r0, 0x68] \n" +"_080AC11C: \n" +" adds r0, r4, 0 \n" +" movs r1, 0x3 \n" +" bl SetPredefinedScript \n" +" mov r1, r8 \n" +" ldr r2, [r1, 0x8] \n" +" cmp r2, 0 \n" +" beq _080AC140 \n" +" adds r0, r4, 0 \n" +" movs r1, 0 \n" +" bl SetPredefinedScript \n" +" ldr r3, _080AC164 \n" +" adds r0, r4, 0 \n" +" movs r1, 0 \n" +" movs r2, 0 \n" +" bl ExecutePredefinedScript \n" +"_080AC140: \n" +" adds r0, r7, 0 \n" +"_080AC142: \n" +" add sp, 0x14 \n" +" pop {r3-r5} \n" +" mov r8, r3 \n" +" mov r9, r4 \n" +" mov r10, r5 \n" +" pop {r4-r7} \n" +" pop {r1} \n" +" bx r1 \n" +" .align 2, 0 \n" +"_080AC154: .4byte gGroundObjectCallbacks\n" +"_080AC158: .4byte gUnknown_81182F4\n" +"_080AC15C: .4byte gUnknown_8118350\n" +"_080AC160: .4byte gFunctionScriptTable\n" +"_080AC164: .4byte gUnknown_81184A4"); +} + +void sub_80A6688(struct UnkGroundSpriteStruct *, s32); + +void GroundObject_Delete(s32 index_) { + s32 index = (s16)index_; + GroundObject *parent = &gGroundObjects[index]; + + Log(0, gUnknown_81184B0, index); + sub_80A7658(&parent->unk144); + InitAction2(&parent->unk38); + parent->unk6 = -1; +} + +void sub_80AC1B0(s32 index_, s32 flag) +{ + s32 index = (s16)index_; + GroundObject *parent = &gGroundObjects[index]; + + if(parent->unk6 != -1) + { + parent->flags |= flag; + sub_80A6688(&parent->unk144, parent->flags); + } +} + +void sub_80AC1F4(s32 index_, s32 flag) +{ + s32 index = (s16)index_; + GroundObject *parent = &gGroundObjects[index]; + + if(parent->unk6 != -1) + { + parent->flags &= (0x337fffff ^ flag); + sub_80A6688(&parent->unk144, parent->flags); + } +} + +Action *sub_80AC240(s32 index_) +{ + s32 index = (s16)index_; + GroundObject *parent = &gGroundObjects[index]; + + if(parent->unk6 != -1) + return &parent->unk38; + else + return NULL; +} + +extern bool8 GetPredefinedScript(Action *param_1, ScriptInfoSmall *script, s32 _index); + + +bool8 sub_80AC274(s32 index_, ScriptInfoSmall *scriptInfo, s32 a2_) +{ + s32 index = (s16)index_; + s32 a2 = (s16)a2_; + GroundObject *parent = &gGroundObjects[index]; + + if(parent->unk6 != -1) + return GetPredefinedScript(&parent->unk38, scriptInfo, a2); + else + return FALSE; +} + +extern u8 gUnknown_81184CC[]; +extern DebugLocation gUnknown_8118504; + +bool8 GroundObject_ExecuteScript(s32 index_, void *a1, ScriptInfoSmall *script) +{ + s32 index = (s16)index_; + GroundObject *parent = &gGroundObjects[index]; + + Log(0, gUnknown_81184CC, index); + + if(parent->unk6 != -1) + { + GroundScript_ExecutePP(&parent->unk38, (ActionUnkIds *)a1, script, &gUnknown_8118504); + parent->unk13C = 1; + return 1; + } + else { + return 0; + } +} + +bool8 GroundObjectsNotifyAll(s32 index_) +{ + s32 index = (s16)index_; + s32 counter; + GroundObject *parent = &gGroundObjects[0]; + bool8 flag = FALSE; + + for(counter = 0; counter < 0x10; counter = (s16)(counter + 1), parent++) + { + if(parent->unk6 != -1) + flag |= GroundScriptNotify(&parent->unk38, index); + } + + return flag; +} + +bool8 GroundObjectsCancelAll(void) +{ + s32 counter; + GroundObject *parent = &gGroundObjects[0]; + bool8 flag = FALSE; + + for(counter = 0; counter < 0x10; counter = (s16)(counter + 1), parent++) + { + if(parent->unk6 != -1) + flag |= GroundScript_Cancel(&parent->unk38); + } + + return flag; +} + +static UNUSED s16 sub_80AC3C0(s32 index_) +{ + s32 index = (s16)index_; + GroundObject *parent = &gGroundObjects[index]; + return parent->unk6; +} + +s16 sub_80AC3E0(s32 index_, s32 *a1) +{ + s32 index = (s16)index_; + GroundObject *parent = &gGroundObjects[index]; + *a1 = parent->flags; + return parent->unk6; +} + +static UNUSED s16 sub_80AC408(s32 index_, struct GroundObjectSub *a1) +{ + s32 index = (s16)index_; + GroundObject *parent = &gGroundObjects[index]; + if(parent->unk6 == -1) + { + a1->a0[0] = 0; + a1->a0[1] = 0; + } + else + { + *a1 = parent->unkC; + } + return parent->unk6; +} + +s16 sub_80AC448(s32 index_, PixelPos *pos) +{ + s32 index = (s16)index_; + GroundObject *parent = &gGroundObjects[index]; + + if(parent->unk6 == -1) + { + pos->x = 0; + pos->y = 0; + } + else { + pos->x = parent->unk124.x + parent->unk14.x; + pos->y = parent->unk124.y + parent->unk14.y; + } + + return parent->unk6; +} + +extern void TryMoveObjectRelative_80AC6AC(void *, PixelPos *); + + +s16 sub_80AC49C(s32 index_, PixelPos *pos) +{ + s32 index = (s16)index_; + GroundObject *parent = &gGroundObjects[index]; + + TryMoveObjectRelative_80AC6AC(parent, pos); + + return parent->unk6; +} diff --git a/src/ground_script.c b/src/ground_script.c index b08b5785c..f67de6249 100644 --- a/src/ground_script.c +++ b/src/ground_script.c @@ -128,17 +128,42 @@ bool8 sub_809D234(void); s32 sub_80A14E8(Action *, u8, u32, s32); u8 sub_80990EC(struct DungeonSetupInfo *param_1, s32 param_2); -extern u8 GroundObjectsCancellAll(void); +extern u8 GroundObjectsCancelAll(void); extern u8 GroundEffectsCancelAll(void); extern u8 GroundLivesCancelAll(void); extern u8 IsTextboxOpen_809A750(void); -extern Action *sub_80A882C(s16); -extern Action *sub_80AC240(s16); -extern Action *sub_80AD158(s16); +extern Action *sub_80A882C(s32); +extern Action *sub_80AC240(s32); +extern Action *sub_80AD158(s32); extern void sub_809AB4C(s32, s32); extern void sub_809ABB4(s32, s32); extern void sub_809AC18(s32, s32); extern s16 sub_80A8BBC(s32 id_); +extern char gUnknown_81165D4[]; +extern char gUnknown_81165F4[]; +extern char gUnknown_811660C[]; +extern char gUnknown_8116628[]; +extern char gUnknown_8116644[]; +extern char gUnknown_8116664[]; +extern char gUnknown_8116684[]; +extern char gUnknown_81166C0[]; +extern char gUnknown_81166D8[]; + +extern const CallbackData gGroundScriptTriggerCallbacks; +extern DebugLocation gUnknown_81166B4; +extern DebugLocation gUnknown_81166F8; +extern DebugLocation gUnknown_8116704; + +extern const DebugLocation gUnknown_8116588; +extern const DebugLocation gUnknown_8116538; +extern const DebugLocation gUnknown_8116560; +extern u8 gUnknown_8116594[]; +extern u8 gUnknown_8116544[]; +extern u8 gUnknown_811656C[]; + +extern DebugLocation gUnknown_81165C8; + +extern u8 gUnknown_8116848[]; bool8 GroundLivesNotifyAll(s16); bool8 GroundObjectsNotifyAll(s16); @@ -528,7 +553,7 @@ u8 GroundCancelAllEntities(void) u8 ret; ret = GroundLivesCancelAll(); - ret |= GroundObjectsCancellAll(); + ret |= GroundObjectsCancelAll(); ret |= GroundEffectsCancelAll(); return ret; } From 49622ce1592a7254195f2d6eb33367f987b972bd Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Thu, 29 May 2025 20:53:53 -0700 Subject: [PATCH 02/11] match GroundObject_Add thanks to @DizzyEggg --- src/ground_object.c | 707 ++++++++++++-------------------------------- 1 file changed, 195 insertions(+), 512 deletions(-) diff --git a/src/ground_object.c b/src/ground_object.c index bbf6e1a77..7c97858ae 100644 --- a/src/ground_object.c +++ b/src/ground_object.c @@ -2,14 +2,10 @@ #include "global.h" #include "structs/str_ground_script.h" #include "ground_script.h" +#include "event_flag.h" #include "ground_sprite.h" #include "memory.h" -// TODO: figure out if this is used anywhere else -struct GroundObjectSub { - s32 a0[2]; -}; - typedef struct GroundObject { // size: 0x1C4 u8 unk0[4]; @@ -18,21 +14,18 @@ typedef struct GroundObject { s16 unk8; // scriptID / group s8 unkA; // sector u8 unkB; - struct GroundObjectSub unkC; + PixelPos unkC; PixelPos unk14; - //s32 unk18; u8 unk1C; PixelPos unk20; - s32 unk28[2]; - s32 unk30[2]; + PixelPos unk28; + PixelPos unk30; Action unk38; u32 flags; u8 unk120; PixelPos unk124; - u32 unk12C; - u32 unk130; + PixelPos unk12C; PixelPos unk134; - //u32 unk138; u8 unk13C; u16 unk13E; u16 unk140; @@ -41,6 +34,17 @@ typedef struct GroundObject { IWRAM_INIT GroundObject *gGroundObjects = NULL; +struct GroundObjectTypeData +{ + s16 unk0; + u8 unk2; + u8 unk3; +}; + +extern struct GroundObjectTypeData gGroundObjectTypes[]; + +extern CallbackData gGroundObjectCallbacks[]; + void DeleteGroundObjects(void); void GroundObject_Delete(s32); @@ -49,14 +53,24 @@ extern u8 gUnknown_81183F0[]; extern u8 gUnknown_8118414[]; extern u8 gUnknown_811842C[]; extern u8 gUnknown_81184B0[]; +extern DebugLocation gUnknown_81184A4; +extern ScriptCommand gUnknown_8118350; +extern ScriptCommand gUnknown_81182F4; +extern u8 gUnknown_8118448[]; const struct GroundScriptHeader *GetGroundScript(s16 a0, DebugLocation *); void sub_80A7658(struct UnkGroundSpriteStruct *); extern bool8 GroundScriptNotify(Action*, s32); extern bool8 GroundScript_Cancel(Action *r0); +void SetPredefinedScript(Action *param_1, s16 index, const ScriptCommand *param_3); +bool8 ExecutePredefinedScript(Action *param_1, s32 *param_2, s16 index, DebugLocation *debug); + +extern bool8 GetCurrentDungeonBounds(PixelPos *a0, PixelPos *a1); +void sub_80A75CC(void *, s32, s32, s32); +bool8 SpriteHasPokemonSize_80A66A4(struct UnkGroundSpriteStruct *ptr); -s16 GroundObject_Add(s32 id, const GroundObjectData*, s32 group, s32 sector); +s32 GroundObject_Add(s32 id_,const GroundObjectData *objectData,s32 group_,s32 sector_); void AllocGroundObjects(void) { @@ -185,505 +199,174 @@ s32 sub_80ABD48(s32 r0) return -1; } -NAKED -s16 GroundObject_Add(s32 id, const GroundObjectData *objectData, s32 group, s32 sector) +s32 GroundObject_Add(s32 id_,const GroundObjectData *objectData,s32 group_,s32 sector_) { - asm_unified( -" push {r4-r7,lr} \n" -" mov r7, r10 \n" -" mov r6, r9 \n" -" mov r5, r8 \n" -" push {r5-r7} \n" -" sub sp, 0x14 \n" -" mov r8, r1 \n" -" lsls r0, 16 \n" -" asrs r7, r0, 16 \n" -" lsls r2, 16 \n" -" asrs r2, 16 \n" -" mov r10, r2 \n" -" lsls r3, 24 \n" -" asrs r3, 24 \n" -" mov r9, r3 \n" -" ldrb r4, [r1] \n" -" cmp r4, 0x1A \n" -" bne _080ABDDA \n" -" movs r0, 0 \n" -" movs r1, 0x28 \n" -" bl GetScriptVarValue \n" -" cmp r0, 0x1 \n" -" bgt _080ABDBC \n" -" movs r4, 0x1B \n" -" b _080ABDDA \n" -"_080ABDBC: \n" -" movs r0, 0 \n" -" movs r1, 0x29 \n" -" bl GetScriptVarValue \n" -" cmp r0, 0 \n" -" bne _080ABDD4 \n" -" movs r0, 0 \n" -" movs r1, 0x27 \n" -" bl GetScriptVarValue \n" -" adds r0, 0x1C \n" -" b _080ABDD6 \n" -"_080ABDD4: \n" -" adds r0, 0x2B \n" -"_080ABDD6: \n" -" lsls r0, 16 \n" -" asrs r4, r0, 16 \n" -"_080ABDDA: \n" -" lsls r1, r4, 2 \n" -" ldr r0, _080ABE10 \n" -" adds r6, r1, r0 \n" -" cmp r7, 0 \n" -" bge _080ABE40 \n" -" cmp r4, 0xE \n" -" bgt _080ABDF4 \n" -" cmp r4, 0xD \n" -" blt _080ABDF4 \n" -" adds r0, r4, 0 \n" -" bl sub_80ABD48 \n" -" adds r7, r0, 0 \n" -"_080ABDF4: \n" -" cmp r7, 0 \n" -" bge _080ABE40 \n" -" movs r3, 0 \n" -" ldr r0, _080ABE14 \n" -" ldr r5, [r0] \n" -" movs r0, 0x6 \n" -" ldrsh r1, [r5, r0] \n" -" movs r0, 0x1 \n" -" negs r0, r0 \n" -" cmp r1, r0 \n" -" bne _080ABE18 \n" -" movs r7, 0 \n" -" b _080ABE40 \n" -" .align 2, 0 \n" -"_080ABE10: .4byte gGroundObjectTypes\n" -"_080ABE14: .4byte gGroundObjects \n" -"_080ABE18: \n" -" adds r0, r3, 0x1 \n" -" lsls r0, 16 \n" -" asrs r3, r0, 16 \n" -" movs r1, 0xE2 \n" -" lsls r1, 1 \n" -" adds r5, r1 \n" -" cmp r3, 0xF \n" -" bgt _080ABE36 \n" -" movs r2, 0x6 \n" -" ldrsh r1, [r5, r2] \n" -" movs r0, 0x1 \n" -" negs r0, r0 \n" -" cmp r1, r0 \n" -" bne _080ABE18 \n" -" adds r7, r3, 0 \n" -"_080ABE36: \n" -" cmp r7, 0 \n" -" bge _080ABE40 \n" -" movs r0, 0x1 \n" -" negs r0, r0 \n" -" b _080AC142 \n" -"_080ABE40: \n" -" ldr r1, _080ABEA8 \n" -" lsls r0, r7, 3 \n" -" subs r0, r7 \n" -" lsls r0, 4 \n" -" adds r0, r7 \n" -" lsls r0, 2 \n" -" ldr r1, [r1] \n" -" adds r5, r1, r0 \n" -" ldr r1, _080ABEAC \n" -" mov r3, r8 \n" -" ldrb r0, [r3] \n" -" str r0, [sp] \n" -" movs r2, 0 \n" -" ldrsh r0, [r6, r2] \n" -" str r0, [sp, 0x4] \n" -" mov r3, r10 \n" -" str r3, [sp, 0x8] \n" -" mov r0, r9 \n" -" str r0, [sp, 0xC] \n" -" movs r0, 0 \n" -" adds r2, r7, 0 \n" -" adds r3, r4, 0 \n" -" bl Log \n" -" movs r2, 0 \n" -" movs r3, 0x6 \n" -" ldrsh r1, [r5, r3] \n" -" movs r0, 0x1 \n" -" negs r0, r0 \n" -" cmp r1, r0 \n" -" bne _080ABE80 \n" -" movs r2, 0x1 \n" -"_080ABE80: \n" -" str r2, [sp, 0x10] \n" -" strh r7, [r5, 0x4] \n" -" strh r4, [r5, 0x6] \n" -" mov r0, r10 \n" -" strh r0, [r5, 0x8] \n" -" mov r1, r9 \n" -" strb r1, [r5, 0xA] \n" -" ldrh r0, [r6] \n" -" subs r0, 0x1 \n" -" lsls r0, 16 \n" -" asrs r0, 16 \n" -" cmp r0, 0xE \n" -" bls _080ABE9C \n" -" b _080ABF8C \n" -"_080ABE9C: \n" -" lsls r0, 2 \n" -" ldr r1, _080ABEB0 \n" -" adds r0, r1 \n" -" ldr r0, [r0] \n" -" mov pc, r0 \n" -" .align 2, 0 \n" -"_080ABEA8: .4byte gGroundObjects \n" -"_080ABEAC: .4byte gUnknown_8118448\n" -"_080ABEB0: .4byte _080ABEB4 \n" -" .align 2, 0 \n" -"_080ABEB4: \n" -" .4byte _080ABEF0 \n" -" .4byte _080ABF7C \n" -" .4byte _080ABF46 \n" -" .4byte _080ABF54 \n" -" .4byte _080ABF54 \n" -" .4byte _080ABF5E \n" -" .4byte _080ABF68 \n" -" .4byte _080ABF72 \n" -" .4byte _080ABF3C \n" -" .4byte _080ABEFA \n" -" .4byte _080ABEF0 \n" -" .4byte _080ABF06 \n" -" .4byte _080ABF2C \n" -" .4byte _080ABF1E \n" -" .4byte _080ABF12 \n" -"_080ABEF0: \n" -" movs r2, 0x8E \n" -" lsls r2, 1 \n" -" adds r1, r5, r2 \n" -" movs r0, 0 \n" -" b _080ABF94 \n" -"_080ABEFA: \n" -" movs r3, 0x8E \n" -" lsls r3, 1 \n" -" adds r1, r5, r3 \n" -" movs r0, 0x80 \n" -" lsls r0, 10 \n" -" b _080ABF94 \n" -"_080ABF06: \n" -" movs r0, 0x8E \n" -" lsls r0, 1 \n" -" adds r1, r5, r0 \n" -" movs r0, 0x80 \n" -" lsls r0, 11 \n" -" b _080ABF94 \n" -"_080ABF12: \n" -" movs r2, 0x8E \n" -" lsls r2, 1 \n" -" adds r1, r5, r2 \n" -" movs r0, 0x83 \n" -" lsls r0, 18 \n" -" b _080ABF94 \n" -"_080ABF1E: \n" -" movs r3, 0x8E \n" -" lsls r3, 1 \n" -" adds r1, r5, r3 \n" -" ldr r0, _080ABF28 \n" -" b _080ABF94 \n" -" .align 2, 0 \n" -"_080ABF28: .4byte 0x220c0000 \n" -"_080ABF2C: \n" -" movs r0, 0x8E \n" -" lsls r0, 1 \n" -" adds r1, r5, r0 \n" -" ldr r0, _080ABF38 \n" -" b _080ABF94 \n" -" .align 2, 0 \n" -"_080ABF38: .4byte 0x20010000 \n" -"_080ABF3C: \n" -" movs r2, 0x8E \n" -" lsls r2, 1 \n" -" adds r1, r5, r2 \n" -" movs r0, 0x5 \n" -" b _080ABF94 \n" -"_080ABF46: \n" -" movs r3, 0x8E \n" -" lsls r3, 1 \n" -" adds r1, r5, r3 \n" -" ldr r0, _080ABF50 \n" -" b _080ABF94 \n" -" .align 2, 0 \n" -"_080ABF50: .4byte 0x22000184 \n" -"_080ABF54: \n" -" movs r0, 0x8E \n" -" lsls r0, 1 \n" -" adds r1, r5, r0 \n" -" adds r0, 0x68 \n" -" b _080ABF94 \n" -"_080ABF5E: \n" -" movs r2, 0x8E \n" -" lsls r2, 1 \n" -" adds r1, r5, r2 \n" -" movs r0, 0x44 \n" -" b _080ABF94 \n" -"_080ABF68: \n" -" movs r3, 0x8E \n" -" lsls r3, 1 \n" -" adds r1, r5, r3 \n" -" movs r0, 0x84 \n" -" b _080ABF94 \n" -"_080ABF72: \n" -" movs r0, 0x8E \n" -" lsls r0, 1 \n" -" adds r1, r5, r0 \n" -" adds r0, 0x64 \n" -" b _080ABF94 \n" -"_080ABF7C: \n" -" movs r2, 0x8E \n" -" lsls r2, 1 \n" -" adds r1, r5, r2 \n" -" ldr r0, _080ABF88 \n" -" b _080ABF94 \n" -" .align 2, 0 \n" -"_080ABF88: .4byte 0x020000c4 \n" -"_080ABF8C: \n" -" movs r3, 0x8E \n" -" lsls r3, 1 \n" -" adds r1, r5, r3 \n" -" ldr r0, _080ABFA8 \n" -"_080ABF94: \n" -" str r0, [r1] \n" -" ldrb r0, [r6, 0x2] \n" -" cmp r0, 0 \n" -" bne _080ABFAC \n" -" mov r1, r8 \n" -" ldrb r0, [r1, 0x2] \n" -" lsls r0, 11 \n" -" str r0, [r5, 0xC] \n" -" ldrb r0, [r1, 0x3] \n" -" b _080ABFB4 \n" -" .align 2, 0 \n" -"_080ABFA8: .4byte 0x02000185 \n" -"_080ABFAC: \n" -" ldrb r0, [r6, 0x2] \n" -" lsls r0, 11 \n" -" str r0, [r5, 0xC] \n" -" ldrb r0, [r6, 0x3] \n" -"_080ABFB4: \n" -" lsls r0, 11 \n" -" str r0, [r5, 0x10] \n" -" ldr r0, [r5, 0xC] \n" -" lsrs r1, r0, 31 \n" -" adds r0, r1 \n" -" asrs r0, 1 \n" -" str r0, [r5, 0x14] \n" -" ldr r0, [r5, 0x10] \n" -" lsrs r1, r0, 31 \n" -" adds r0, r1 \n" -" asrs r0, 1 \n" -" str r0, [r5, 0x18] \n" -" mov r2, r8 \n" -" ldrb r0, [r2, 0x1] \n" -" strb r0, [r5, 0x1C] \n" -" adds r2, 0x4 \n" -" adds r4, r5, 0 \n" -" adds r4, 0x20 \n" -" ldrb r1, [r2, 0x2] \n" -" movs r0, 0x4 \n" -" ands r0, r1 \n" -" cmp r0, 0 \n" -" bne _080ABFFC \n" -" mov r3, r8 \n" -" ldrb r0, [r3, 0x4] \n" -" lsls r3, r0, 11 \n" -" str r3, [r5, 0x20] \n" -" ldrb r1, [r2, 0x2] \n" -" movs r0, 0x2 \n" -" ands r0, r1 \n" -" cmp r0, 0 \n" -" beq _080ABFFC \n" -" movs r1, 0x80 \n" -" lsls r1, 3 \n" -" adds r0, r3, r1 \n" -" str r0, [r5, 0x20] \n" -"_080ABFFC: \n" -" ldrb r1, [r2, 0x3] \n" -" movs r0, 0x4 \n" -" ands r0, r1 \n" -" cmp r0, 0 \n" -" bne _080AC01E \n" -" ldrb r0, [r2, 0x1] \n" -" lsls r3, r0, 11 \n" -" str r3, [r4, 0x4] \n" -" ldrb r1, [r2, 0x3] \n" -" movs r0, 0x2 \n" -" ands r0, r1 \n" -" cmp r0, 0 \n" -" beq _080AC01E \n" -" movs r2, 0x80 \n" -" lsls r2, 3 \n" -" adds r0, r3, r2 \n" -" str r0, [r4, 0x4] \n" -"_080AC01E: \n" -" ldr r3, [sp, 0x10] \n" -" cmp r3, 0 \n" -" beq _080AC076 \n" -" ldrb r1, [r5, 0x1C] \n" -" movs r2, 0x90 \n" -" lsls r2, 1 \n" -" adds r0, r5, r2 \n" -" movs r3, 0 \n" -" strb r1, [r0] \n" -" movs r0, 0x92 \n" -" lsls r0, 1 \n" -" adds r2, r5, r0 \n" -" ldr r0, [r5, 0x20] \n" -" ldr r1, [r5, 0x14] \n" -" subs r0, r1 \n" -" str r0, [r2] \n" -" movs r1, 0x96 \n" -" lsls r1, 1 \n" -" adds r2, r5, r1 \n" -" ldr r0, [r5, 0x20] \n" -" ldr r1, [r5, 0x14] \n" -" adds r0, r1 \n" -" str r0, [r2] \n" -" movs r0, 0x94 \n" -" lsls r0, 1 \n" -" adds r2, r5, r0 \n" -" ldr r0, [r5, 0x24] \n" -" ldr r1, [r5, 0x18] \n" -" subs r0, r1 \n" -" str r0, [r2] \n" -" movs r1, 0x98 \n" -" lsls r1, 1 \n" -" adds r2, r5, r1 \n" -" ldr r0, [r5, 0x24] \n" -" ldr r1, [r5, 0x18] \n" -" adds r0, r1 \n" -" str r0, [r2] \n" -" movs r2, 0x9A \n" -" lsls r2, 1 \n" -" adds r1, r5, r2 \n" -" adds r2, 0x4 \n" -" adds r0, r5, r2 \n" -" str r3, [r0] \n" -" str r3, [r1] \n" -"_080AC076: \n" -" adds r0, r5, 0 \n" -" adds r0, 0x28 \n" -" adds r1, r5, 0 \n" -" adds r1, 0x30 \n" -" bl GetCurrentDungeonBounds \n" -" ldr r3, [sp, 0x10] \n" -" cmp r3, 0 \n" -" beq _080AC0C0 \n" -" movs r0, 0x9F \n" -" lsls r0, 1 \n" -" adds r1, r5, r0 \n" -" movs r2, 0 \n" -" movs r0, 0x80 \n" -" lsls r0, 4 \n" -" strh r0, [r1] \n" -" movs r3, 0x9E \n" -" lsls r3, 1 \n" -" adds r1, r5, r3 \n" -" movs r0, 0x1 \n" -" strb r0, [r1] \n" -" movs r1, 0xA0 \n" -" lsls r1, 1 \n" -" adds r0, r5, r1 \n" -" strh r2, [r0] \n" -" movs r2, 0xA2 \n" -" lsls r2, 1 \n" -" adds r0, r5, r2 \n" -" movs r3, 0x6 \n" -" ldrsh r2, [r5, r3] \n" -" movs r3, 0x8E \n" -" lsls r3, 1 \n" -" adds r1, r5, r3 \n" -" ldr r3, [r1] \n" -" adds r1, r7, 0 \n" -" bl sub_80A75CC \n" -"_080AC0C0: \n" -" adds r4, r5, 0 \n" -" adds r4, 0x38 \n" -" ldr r1, _080AC154 \n" -" mov r0, r9 \n" -" str r0, [sp] \n" -" adds r0, r4, 0 \n" -" adds r2, r5, 0 \n" -" mov r3, r10 \n" -" bl InitActionWithParams \n" -" adds r6, r4, 0 \n" -" mov r1, r8 \n" -" ldr r2, [r1, 0xC] \n" -" cmp r2, 0 \n" -" bne _080AC0F2 \n" -" movs r2, 0xA2 \n" -" lsls r2, 1 \n" -" adds r0, r5, r2 \n" -" bl SpriteHasPokemonSize_80A66A4\n" -" lsls r0, 24 \n" -" ldr r2, _080AC158 \n" -" cmp r0, 0 \n" -" beq _080AC0F2 \n" -" ldr r2, _080AC15C \n" -"_080AC0F2: \n" -" adds r0, r6, 0 \n" -" movs r1, 0x1 \n" -" bl SetPredefinedScript \n" -" adds r1, r4, 0 \n" -" mov r3, r8 \n" -" ldr r2, [r3, 0x10] \n" -" cmp r2, 0 \n" -" bne _080AC108 \n" -" ldr r0, _080AC160 \n" -" ldr r2, [r0, 0x38] \n" -"_080AC108: \n" -" adds r0, r1, 0 \n" -" movs r1, 0x2 \n" -" bl SetPredefinedScript \n" -" mov r0, r8 \n" -" ldr r2, [r0, 0x14] \n" -" cmp r2, 0 \n" -" bne _080AC11C \n" -" ldr r0, _080AC160 \n" -" ldr r2, [r0, 0x68] \n" -"_080AC11C: \n" -" adds r0, r4, 0 \n" -" movs r1, 0x3 \n" -" bl SetPredefinedScript \n" -" mov r1, r8 \n" -" ldr r2, [r1, 0x8] \n" -" cmp r2, 0 \n" -" beq _080AC140 \n" -" adds r0, r4, 0 \n" -" movs r1, 0 \n" -" bl SetPredefinedScript \n" -" ldr r3, _080AC164 \n" -" adds r0, r4, 0 \n" -" movs r1, 0 \n" -" movs r2, 0 \n" -" bl ExecutePredefinedScript \n" -"_080AC140: \n" -" adds r0, r7, 0 \n" -"_080AC142: \n" -" add sp, 0x14 \n" -" pop {r3-r5} \n" -" mov r8, r3 \n" -" mov r9, r4 \n" -" mov r10, r5 \n" -" pop {r4-r7} \n" -" pop {r1} \n" -" bx r1 \n" -" .align 2, 0 \n" -"_080AC154: .4byte gGroundObjectCallbacks\n" -"_080AC158: .4byte gUnknown_81182F4\n" -"_080AC15C: .4byte gUnknown_8118350\n" -"_080AC160: .4byte gFunctionScriptTable\n" -"_080AC164: .4byte gUnknown_81184A4"); + s32 sVar3; + s32 sVar4; + + int index; + s32 kind; + GroundObject *parent; + register s32 id; + register s32 group; + register s32 sector; + bool8 bVar12; + struct GroundObjectTypeData *typeDataPtr; + + id = (s16)id_; + group = (s16)group_; + sector = (s8)sector_; + + + + kind = objectData->kind; + if (kind == 0x1a) { + if (GetScriptVarValue(NULL,0x28) < 2) { // BASE_LEVEL + kind = 0x1b; + } + else { + sVar4 = GetScriptVarValue(NULL,0x29); // FLAG_KIND + if (sVar4 == 0) { + sVar3 = GetScriptVarValue(NULL,0x27) + 0x1c; // BASE_KIND + } + else { + sVar3 = sVar4 + 0x2b; + } + kind = (s16)sVar3; + } + } + + typeDataPtr = &gGroundObjectTypes[kind]; + + if (id < 0) { + + switch(kind) + { + case 0xD: + case 0xE: + id = sub_80ABD48(kind); + break; + + } + + if (id < 0) { + for(index = 0, parent = gGroundObjects; index < 0x10; index = (s16)(index + 1), parent++) + { + if(parent->unk6 == -1) + { + id = index; + break; + } + } + + } + if (id < 0) { + return -1; + } + } + parent = &gGroundObjects[id]; + Log('\0',gUnknown_8118448,id,kind,objectData->kind,typeDataPtr->unk0,group,sector); + bVar12 = (parent->unk6 == -1); + parent->unk4 = id; + parent->unk6 = kind; + parent->unk8 = group; + parent->unkA = sector; + switch(typeDataPtr->unk0) { + case 1: + case 0xB: + parent->flags = 0; + break; + case 0xA: + parent->flags = 0x20000; + break; + case 0xC: + parent->flags = 0x40000; + break; + case 0xF: + parent->flags = 0x20C0000; + break; + case 0xE: + parent->flags = 0x220C0000; + break; + case 0xD: + parent->flags = 0x20010000; + break; + case 9: + parent->flags = 5; + break; + case 3: + parent->flags = 0x22000184; + break; + case 4: + case 5: + parent->flags = 0x184; + break; + case 6: + parent->flags = 0x44; + break; + case 7: + parent->flags = 0x84; + break; + case 0x8: + parent->flags = 0x180; + break; + case 0x2: + parent->flags = 0x20000C4; + break; + default: + parent->flags = 0x2000185; + break; + } + + if (typeDataPtr->unk2 == '\0') { + parent->unkC.x = objectData->width << 0xb; + parent->unkC.y = objectData->height << 0xb; + } + else { + parent->unkC.x = typeDataPtr->unk2 << 0xb; + parent->unkC.y = typeDataPtr->unk3 << 0xb; + } + + parent->unk14.x = parent->unkC.x / 2; + parent->unk14.y = parent->unkC.y / 2; + parent->unk1C = objectData->unk1; + + SetUnkInGroundEvent(&objectData->pos, &parent->unk20); + + if (bVar12) { + parent->unk120 = parent->unk1C; + parent->unk124.x = parent->unk20.x - parent->unk14.x; + parent->unk12C.x = parent->unk20.x + parent->unk14.x; + parent->unk124.y = parent->unk20.y - parent->unk14.y; + parent->unk12C.y = parent->unk20.y + parent->unk14.y; + parent->unk134.x = parent->unk134.y = 0; + } + GetCurrentDungeonBounds(&parent->unk28,&parent->unk30); + if (bVar12) { + parent->unk13E = 0x800; + parent->unk13C = 1; + parent->unk140 = 0; + sub_80A75CC(&(parent->unk144),id,parent->unk6, parent->flags); + } + + InitActionWithParams(&parent->unk38,gGroundObjectCallbacks,parent,group,sector); + + // What an ugly way of coding that... + SetPredefinedScript(&parent->unk38,1, (objectData->scripts[1] != NULL) ? objectData->scripts[1] + : (SpriteHasPokemonSize_80A66A4(&parent->unk144)) ? &gUnknown_8118350 : &gUnknown_81182F4); + SetPredefinedScript(&parent->unk38,2,(objectData->scripts[2] != NULL) ? objectData->scripts[2] + : gFunctionScriptTable[4].script); + SetPredefinedScript(&parent->unk38,3,(objectData->scripts[3] != NULL) ? objectData->scripts[3] + : gFunctionScriptTable[8].script); + + if (objectData->scripts[0] != NULL) { + SetPredefinedScript(&parent->unk38,0,objectData->scripts[0]); + ExecutePredefinedScript(&parent->unk38,NULL,0,&gUnknown_81184A4); + } + return id; } + void sub_80A6688(struct UnkGroundSpriteStruct *, s32); void GroundObject_Delete(s32 index_) { @@ -813,14 +496,14 @@ s16 sub_80AC3E0(s32 index_, s32 *a1) return parent->unk6; } -static UNUSED s16 sub_80AC408(s32 index_, struct GroundObjectSub *a1) +static UNUSED s16 sub_80AC408(s32 index_, PixelPos *a1) { s32 index = (s16)index_; GroundObject *parent = &gGroundObjects[index]; if(parent->unk6 == -1) { - a1->a0[0] = 0; - a1->a0[1] = 0; + a1->x = 0; + a1->y = 0; } else { From f86970c62b6452720ca75daef3c24df4c9b460f8 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Thu, 29 May 2025 20:59:24 -0700 Subject: [PATCH 03/11] decomp sub_80AC4C8 --- asm/ground_object.s | 75 --------------------------------------------- src/ground_object.c | 22 +++++++++++++ 2 files changed, 22 insertions(+), 75 deletions(-) diff --git a/asm/ground_object.s b/asm/ground_object.s index 502ce5237..6af726781 100644 --- a/asm/ground_object.s +++ b/asm/ground_object.s @@ -5,81 +5,6 @@ .text - thumb_func_start sub_80AC4C8 -sub_80AC4C8: - push {r4-r7,lr} - adds r7, r0, 0 - adds r4, r1, 0 - ldr r0, _080AC530 - ldr r3, [r0] - movs r5, 0 - movs r0, 0x1 - negs r0, r0 - mov r12, r0 - movs r6, 0x80 - lsls r6, 9 -_080AC4DE: - movs r1, 0x6 - ldrsh r0, [r3, r1] - cmp r0, r12 - beq _080AC534 - movs r1, 0x8E - lsls r1, 1 - adds r0, r3, r1 - ldr r0, [r0] - ands r0, r7 - cmp r0, 0 - beq _080AC534 - adds r1, 0x8 - adds r0, r3, r1 - ldr r1, [r0] - ldr r0, [r2] - cmp r1, r0 - bge _080AC534 - movs r1, 0x96 - lsls r1, 1 - adds r0, r3, r1 - ldr r1, [r0] - ldr r0, [r4] - cmp r1, r0 - ble _080AC534 - movs r1, 0x94 - lsls r1, 1 - adds r0, r3, r1 - ldr r1, [r0] - ldr r0, [r2, 0x4] - cmp r1, r0 - bge _080AC534 - movs r1, 0x98 - lsls r1, 1 - adds r0, r3, r1 - ldr r1, [r0] - ldr r0, [r4, 0x4] - cmp r1, r0 - ble _080AC534 - adds r0, r5, 0 - b _080AC54C - .align 2, 0 -_080AC530: .4byte gGroundObjects -_080AC534: - adds r0, r6, 0 - movs r1, 0x80 - lsls r1, 9 - adds r6, r1 - asrs r5, r0, 16 - movs r0, 0xE2 - lsls r0, 1 - adds r3, r0 - cmp r5, 0xF - ble _080AC4DE - movs r0, 0x1 - negs r0, r0 -_080AC54C: - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end sub_80AC4C8 - thumb_func_start sub_80AC554 sub_80AC554: push {r4-r7,lr} diff --git a/src/ground_object.c b/src/ground_object.c index 7c97858ae..532eea7fe 100644 --- a/src/ground_object.c +++ b/src/ground_object.c @@ -542,3 +542,25 @@ s16 sub_80AC49C(s32 index_, PixelPos *pos) return parent->unk6; } + +s32 sub_80AC4C8(s32 index, PixelPos *a0, PixelPos *a1) { + GroundObject *parent = &gGroundObjects[0]; + s32 counter; + + for(counter = 0; counter < 0x10; counter = (s16)(counter + 1), parent++) + { + if(parent->unk6 != -1) + { + if(parent->flags & index) + { + if((parent->unk124.x < a1->x) && (parent->unk12C.x > a0->x)) + { + if((parent->unk124.y < a1->y) && (parent->unk12C.y > a0->y)) + return counter; + } + } + } + } + + return -1; +} From 698ea72f6c7d9978ba46ca58baeebce6fb699a71 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Sun, 8 Jun 2025 14:15:44 -0700 Subject: [PATCH 04/11] more decomp and move some data to src for ground_object --- asm/ground_object.s | 509 ------------------------------------------ data/data_8115F5C_1.s | 124 +--------- ld_script.ld | 1 + src/ground_object.c | 413 +++++++++++++++++++++++++++++++--- 4 files changed, 383 insertions(+), 664 deletions(-) diff --git a/asm/ground_object.s b/asm/ground_object.s index 6af726781..cdd1f84de 100644 --- a/asm/ground_object.s +++ b/asm/ground_object.s @@ -5,515 +5,6 @@ .text - thumb_func_start sub_80AC554 -sub_80AC554: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - mov r8, r0 - mov r10, r1 - adds r4, r2, 0 - ldr r0, _080AC5C8 - ldr r0, [r0] - mov r12, r0 - movs r6, 0 - movs r0, 0x1 - negs r0, r0 - mov r9, r0 - movs r7, 0x80 - lsls r7, 9 -_080AC576: - mov r1, r12 - movs r2, 0x6 - ldrsh r0, [r1, r2] - cmp r0, r9 - beq _080AC5CC - movs r0, 0x8E - lsls r0, 1 - add r0, r12 - ldr r0, [r0] - mov r5, r8 - ands r0, r5 - cmp r0, 0 - beq _080AC5CC - movs r0, 0x92 - lsls r0, 1 - add r0, r12 - ldr r1, [r0] - mov r5, r12 - ldr r0, [r5, 0x14] - adds r2, r1, r0 - movs r0, 0x94 - lsls r0, 1 - add r0, r12 - ldr r1, [r0] - ldr r0, [r5, 0x18] - adds r3, r1, r0 - ldr r0, [r4] - cmp r2, r0 - bge _080AC5CC - mov r1, r10 - ldr r0, [r1] - cmp r2, r0 - ble _080AC5CC - ldr r0, [r4, 0x4] - cmp r3, r0 - bge _080AC5CC - ldr r0, [r1, 0x4] - cmp r3, r0 - ble _080AC5CC - adds r0, r6, 0 - b _080AC5E4 - .align 2, 0 -_080AC5C8: .4byte gGroundObjects -_080AC5CC: - adds r0, r7, 0 - movs r2, 0x80 - lsls r2, 9 - adds r7, r2 - asrs r6, r0, 16 - movs r5, 0xE2 - lsls r5, 1 - add r12, r5 - cmp r6, 0xF - ble _080AC576 - movs r0, 0x1 - negs r0, r0 -_080AC5E4: - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end sub_80AC554 - - thumb_func_start GetObjectCollision_80AC5F4 -GetObjectCollision_80AC5F4: - push {r4-r7,lr} - mov r7, r8 - push {r7} - sub sp, 0x10 - mov r8, r0 - adds r5, r1, 0 - adds r6, r2, 0 - ldr r0, [r5] - cmp r0, 0 - bge _080AC60C - ldr r1, _080AC670 - adds r0, r1 -_080AC60C: - asrs r0, 11 - mov r12, r0 - str r0, [sp] - ldr r0, [r5, 0x4] - cmp r0, 0 - bge _080AC61C - ldr r3, _080AC670 - adds r0, r3 -_080AC61C: - asrs r4, r0, 11 - str r4, [sp, 0x4] - ldr r3, [r6] - subs r0, r3, 0x1 - cmp r0, 0 - bge _080AC62C - ldr r7, _080AC674 - adds r0, r3, r7 -_080AC62C: - asrs r1, r0, 11 - ldr r3, [r6, 0x4] - subs r0, r3, 0x1 - cmp r0, 0 - bge _080AC63A - ldr r7, _080AC674 - adds r0, r3, r7 -_080AC63A: - 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 r0, 0x8E - lsls r0, 1 - add r0, r8 - ldr r0, [r0] - movs r1, 0x1 - ands r0, r1 - cmp r0, 0 - beq _080AC678 - mov r0, sp - adds r1, r2, 0 - bl CheckMapCollision_80A585C - lsls r0, 24 - cmp r0, 0 - beq _080AC678 - movs r0, 0x1 - b _080AC6A0 - .align 2, 0 -_080AC670: .4byte 0x000007ff -_080AC674: .4byte 0x000007fe -_080AC678: - movs r0, 0x8E - lsls r0, 1 - add r0, r8 - ldr r0, [r0] - movs r1, 0x4 - ands r0, r1 - cmp r0, 0 - beq _080AC69E - movs r0, 0x1 - negs r0, r0 - adds r2, r5, 0 - adds r3, r6, 0 - bl GetLivesCollision_80A92A0 - lsls r0, 16 - cmp r0, 0 - blt _080AC69E - movs r0, 0x4 - b _080AC6A0 -_080AC69E: - movs r0, 0 -_080AC6A0: - add sp, 0x10 - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end GetObjectCollision_80AC5F4 - - thumb_func_start TryMoveObjectRelative_80AC6AC -TryMoveObjectRelative_80AC6AC: - push {r4,r5,lr} - sub sp, 0x10 - adds r5, r0, 0 - ldr r2, [r1] - ldr r4, [r5, 0x14] - subs r0, r2, r4 - str r0, [sp] - ldr r3, [r1, 0x4] - ldr r1, [r5, 0x18] - subs r0, r3, r1 - str r0, [sp, 0x4] - adds r2, r4 - str r2, [sp, 0x8] - adds r3, r1 - add r2, sp, 0x8 - str r3, [r2, 0x4] - ldr r1, [r5, 0x28] - ldr r0, [sp] - cmp r0, r1 - blt _080AC6EA - ldr r1, [r5, 0x30] - ldr r0, [sp, 0x8] - cmp r0, r1 - bge _080AC6EA - ldr r1, [r5, 0x2C] - ldr r0, [sp, 0x4] - cmp r0, r1 - blt _080AC6EA - ldr r0, [r5, 0x34] - cmp r3, r0 - blt _080AC6EE -_080AC6EA: - movs r0, 0x1 - b _080AC718 -_080AC6EE: - adds r0, r5, 0 - mov r1, sp - bl GetObjectCollision_80AC5F4 - cmp r0, 0 - bne _080AC718 - movs r0, 0x92 - lsls r0, 1 - adds r2, r5, r0 - ldr r0, [sp] - ldr r1, [sp, 0x4] - str r0, [r2] - str r1, [r2, 0x4] - movs r0, 0x96 - lsls r0, 1 - adds r2, r5, r0 - ldr r0, [sp, 0x8] - ldr r1, [sp, 0xC] - str r0, [r2] - str r1, [r2, 0x4] - movs r0, 0 -_080AC718: - add sp, 0x10 - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end TryMoveObjectRelative_80AC6AC - - thumb_func_start TryMoveRelative_80AC720 -TryMoveRelative_80AC720: - push {r4,r5,lr} - sub sp, 0x10 - adds r4, r0, 0 - movs r2, 0x92 - lsls r2, 1 - adds r0, r4, r2 - ldr r0, [r0] - ldr r2, [r1] - adds r0, r2 - str r0, [sp] - movs r3, 0x94 - 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, 0x98 - lsls r2, 1 - adds r0, r4, r2 - ldr r0, [r0] - adds r0, r1 - add r1, sp, 0x8 - str r0, [r1, 0x4] - movs r5, 0 - ldr r3, [r4, 0x28] - ldr r0, [sp] - adds r2, r1, 0 - cmp r0, r3 - bge _080AC770 - str r3, [sp] - ldr r0, [r4, 0xC] - adds r0, r3, r0 - str r0, [sp, 0x8] - b _080AC780 -_080AC770: - ldr r1, [r4, 0x30] - ldr r0, [sp, 0x8] - cmp r0, r1 - blt _080AC782 - ldr r0, [r4, 0xC] - subs r0, r1, r0 - str r0, [sp] - str r1, [sp, 0x8] -_080AC780: - movs r5, 0x1 -_080AC782: - ldr r1, [r4, 0x2C] - ldr r0, [sp, 0x4] - cmp r0, r1 - bge _080AC794 - str r1, [sp, 0x4] - ldr r0, [r4, 0x10] - adds r0, r1, r0 - str r0, [r2, 0x4] - b _080AC7A4 -_080AC794: - ldr r1, [r4, 0x34] - ldr r0, [r2, 0x4] - cmp r0, r1 - blt _080AC7A6 - ldr r0, [r4, 0x10] - subs r0, r1, r0 - str r0, [sp, 0x4] - str r1, [r2, 0x4] -_080AC7A4: - movs r5, 0x1 -_080AC7A6: - adds r0, r4, 0 - mov r1, sp - bl GetObjectCollision_80AC5F4 - cmp r0, 0 - bne _080AC7D8 - movs r3, 0x92 - lsls r3, 1 - adds r2, r4, r3 - ldr r0, [sp] - ldr r1, [sp, 0x4] - str r0, [r2] - str r1, [r2, 0x4] - movs r0, 0x96 - lsls r0, 1 - adds r2, r4, r0 - ldr r0, [sp, 0x8] - ldr r1, [sp, 0xC] - str r0, [r2] - str r1, [r2, 0x4] - cmp r5, 0 - bne _080AC7D6 - movs r0, 0 - b _080AC7D8 -_080AC7D6: - movs r0, 0x1 -_080AC7D8: - add sp, 0x10 - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end TryMoveRelative_80AC720 - - thumb_func_start CallbackObjectGetIndex -CallbackObjectGetIndex: - movs r1, 0x4 - ldrsh r0, [r0, r1] - bx lr - thumb_func_end CallbackObjectGetIndex - - thumb_func_start CallbackObjectGetSize -CallbackObjectGetSize: - ldr r2, [r0, 0xC] - ldr r3, [r0, 0x10] - str r2, [r1] - str r3, [r1, 0x4] - bx lr - thumb_func_end CallbackObjectGetSize - - thumb_func_start CallbackObjectSetHitboxPos -CallbackObjectSetHitboxPos: - push {r4,lr} - adds r3, r0, 0 - adds r4, r1, 0 - cmp r4, 0 - beq _080AC834 - movs r0, 0x92 - lsls r0, 1 - adds r2, r3, r0 - ldr r1, [r4] - ldr r0, [r3, 0x14] - subs r0, r1, r0 - str r0, [r2] - movs r0, 0x96 - lsls r0, 1 - adds r2, r3, r0 - ldr r0, [r3, 0x14] - adds r1, r0 - str r1, [r2] - movs r0, 0x94 - lsls r0, 1 - adds r2, r3, r0 - ldr r1, [r4, 0x4] - ldr r0, [r3, 0x18] - subs r0, r1, r0 - str r0, [r2] - movs r0, 0x98 - lsls r0, 1 - adds r2, r3, r0 - ldr r0, [r3, 0x18] - adds r1, r0 - str r1, [r2] - b _080AC89A -_080AC834: - movs r0, 0x92 - lsls r0, 1 - adds r2, r3, r0 - ldr r0, [r3, 0x20] - ldr r1, [r3, 0x14] - subs r0, r1 - str r0, [r2] - movs r0, 0x96 - lsls r0, 1 - adds r2, r3, r0 - ldr r0, [r3, 0x20] - ldr r1, [r3, 0x14] - adds r0, r1 - str r0, [r2] - movs r0, 0x94 - lsls r0, 1 - adds r2, r3, r0 - ldr r0, [r3, 0x24] - ldr r1, [r3, 0x18] - subs r0, r1 - str r0, [r2] - movs r0, 0x98 - lsls r0, 1 - adds r2, r3, r0 - ldr r0, [r3, 0x24] - ldr r1, [r3, 0x18] - adds r0, r1 - str r0, [r2] - movs r2, 0x9A - lsls r2, 1 - adds r1, r3, r2 - adds r2, 0x4 - adds r0, r3, r2 - str r4, [r0] - str r4, [r1] - movs r0, 0x90 - lsls r0, 1 - adds r2, r3, r0 - movs r1, 0 - ldrsb r1, [r2, r1] - movs r0, 0x1C - ldrsb r0, [r3, r0] - cmp r1, r0 - beq _080AC896 - movs r0, 0x9E - lsls r0, 1 - adds r1, r3, r0 - movs r0, 0x1 - strb r0, [r1] -_080AC896: - ldrb r0, [r3, 0x1C] - strb r0, [r2] -_080AC89A: - pop {r4} - pop {r0} - bx r0 - thumb_func_end CallbackObjectSetHitboxPos - - thumb_func_start CallbackObjectSetPositionBounds -CallbackObjectSetPositionBounds: - push {r4,lr} - ldr r3, [r1] - ldr r4, [r1, 0x4] - str r3, [r0, 0x28] - str r4, [r0, 0x2C] - ldr r1, [r2] - ldr r2, [r2, 0x4] - str r1, [r0, 0x30] - str r2, [r0, 0x34] - pop {r4} - pop {r0} - bx r0 - thumb_func_end CallbackObjectSetPositionBounds - - thumb_func_start CallbackObjectGetHitboxCenter -CallbackObjectGetHitboxCenter: - adds r3, r0, 0 - movs r2, 0x92 - lsls r2, 1 - adds r0, r3, r2 - ldr r0, [r0] - ldr r2, [r3, 0x14] - adds r0, r2 - str r0, [r1] - movs r2, 0x94 - lsls r2, 1 - adds r0, r3, r2 - ldr r0, [r0] - ldr r2, [r3, 0x18] - adds r0, r2 - str r0, [r1, 0x4] - bx lr - thumb_func_end CallbackObjectGetHitboxCenter - - thumb_func_start CallbackObjectMoveReal -CallbackObjectMoveReal: - push {lr} - bl TryMoveObjectRelative_80AC6AC - pop {r1} - bx r1 - thumb_func_end CallbackObjectMoveReal - thumb_func_start CallbackObjectGetPosHeightAndUnk CallbackObjectGetPosHeightAndUnk: push {r4,lr} diff --git a/data/data_8115F5C_1.s b/data/data_8115F5C_1.s index 8059f3343..f136dea21 100644 --- a/data/data_8115F5C_1.s +++ b/data/data_8115F5C_1.s @@ -2,126 +2,6 @@ .align 2 - - - -.string "pksdir0\0" -.align 2,0 - -.global gGroundObjectCallbacks -gGroundObjectCallbacks: @ 81182A0 -@ replacing .incbin "baserom.gba", 0x1182A0, 0x54 -.byte 0x02, 0x00, 0x00, 0x00 -.4byte CallbackObjectGetIndex -.4byte CallbackObjectGetSize -.4byte CallbackObjectGetHitboxCenter -.4byte CallbackObjectGetPosHeightAndUnk -.4byte CallbackObjectGetDirection -.4byte CallbackObjectGetFlags -.4byte CallbackObjectSetHitboxPos -.4byte CallbackObjectSetPositionBounds -.4byte CallbackObjectMoveReal -.4byte CallbackObjectSetPosHeight -.4byte CallbackObjectSetDirection -.4byte CallbackObjectSetEventIndex -.byte 0x00, 0x00, 0x00, 0x00 -.4byte CallbackObjectSetUnk_80AC998 -.4byte CallbackObjectSetFlags -.4byte CallbackObjectClearFlags -.byte 0x00, 0x00, 0x00, 0x00 -.4byte CallbackObjectMoveRelative -.4byte CallbackObjectSpriteRelatedCheck_80AC9B8 -.4byte CallbackObjectSpriteRelated_80AC9DC - -.global gUnknown_81182F4 -gUnknown_81182F4: @ 81182F4 -.byte 0xF6, 0x0, 0x9F, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x34, 0x83, 0x11, 0x8, 0xF4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xDB, 0x0, 0x78, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xE7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 - -.global GroundObjectFile_Text -GroundObjectFile_Text: @ Text - -.global gUnknown_8118334 -gUnknown_8118334: @ 8118334 -.string "../ground/ground_object.c" -.align 2,0 - -.global gUnknown_8118350 -gUnknown_8118350: @ 8118350 -@ replacing .incbin "baserom.gba", 0x118350, 0x50 -.byte 0xf6, 0x00, 0xa6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -.4byte gUnknown_8118334 -.byte 0x54, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -.byte 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -.byte 0xdb, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -.byte 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - -.global gUnknown_81183A0 -gUnknown_81183A0: @ 81183A0 -.byte 0xFF, 0xFF, 0x0, 0x8, 0x1, 0x8, 0x0, 0x10, 0x1, 0x10, 0x2, 0x10, 0x3, 0x10, 0x0, 0x8, 0x1, 0x8, 0x2, 0x8, 0x3, 0x8, 0x4, 0x8, 0x5, 0x8, 0x6, 0x8, 0x7, 0x8, 0x8, 0x8, 0x9, 0x8, 0xA, 0x8, 0xB, 0x8, 0xC, 0x8, 0xD, 0x8, 0xE, 0x8, 0xF, 0x8, 0x0, 0x0 - -.global GroundObject_Select_Text -GroundObject_Select_Text: @ Select -.string "GroundObject_Select" -.align 2,0 - -.global gUnknown_81183E4 -gUnknown_81183E4: @ 81183E4 -.4byte GroundObjectFile_Text -.4byte 0x126 -.4byte GroundObject_Select_Text - -.global gUnknown_81183F0 -gUnknown_81183F0: @ 81183F0 -.string "GroundObject Select %3d %3d %3d\0" -.align 2,0 - -.global gUnknown_8118414 -gUnknown_8118414: @ 8118414 -.string "GroundObject Cancel %3d\0" -.align 2,0 - -.global gUnknown_811842C -gUnknown_811842C: @ 811842C -.string "GroundObject CancelBlank\0" -.align 2,0 - -.global gUnknown_8118448 -gUnknown_8118448: @ 8118448 -.string "GroundObject Add id %3d kind %3d[%3d] type %3d group %3d sector %3d\0" -.align 2,0 - -.global GroundObject_AddText -GroundObject_AddText: @ AddText -.string "GroundObject_Add\0" -.align 2,0 - -.global gUnknown_81184A4 -gUnknown_81184A4: @ 81184A4 -.4byte GroundObjectFile_Text -.4byte 0x283 -.4byte GroundObject_AddText - -.global gUnknown_81184B0 -gUnknown_81184B0: @ 81184B0 -.string "GroundObject Delete id %3d\0" -.align 2,0 - -.global gUnknown_81184CC -gUnknown_81184CC: @ 81184CC -.string "GroundObject Execute %3d \0" -.align 2,0 - -.global GroundObject_ExecuteScript_Text -GroundObject_ExecuteScript_Text: @ ExecuteScript -.string "GroundObject_ExecuteScript\0" -.align 2,0 - -.global gUnknown_8118504 -gUnknown_8118504: @ 8118504 -.4byte GroundObjectFile_Text -.4byte 0x303 -.4byte GroundObject_ExecuteScript_Text - .global GroundObject_Action_Text GroundObject_Action_Text: @ Action .string "GroundObject_Action\0" @@ -129,13 +9,13 @@ GroundObject_Action_Text: @ Action .global gUnknown_8118524 gUnknown_8118524: @ 8118524 -.4byte GroundObjectFile_Text +.4byte gUnknown_8118334 .4byte 0x60D .4byte GroundObject_Action_Text .global gUnknown_8118530 gUnknown_8118530: @ 8118530 -.4byte GroundObjectFile_Text +.4byte gUnknown_8118334 .4byte 0x617 .4byte GroundObject_Action_Text .string "pksdir0\0" diff --git a/ld_script.ld b/ld_script.ld index 89e92ac9d..54961e824 100755 --- a/ld_script.ld +++ b/ld_script.ld @@ -737,6 +737,7 @@ SECTIONS { data/pksdir_6.o(.rodata); src/ground_script_file.o(.rodata); src/ground_lives.o(.rodata); + src/ground_object.o(.rodata); data/data_8115F5C_1.o(.rodata); src/ground_link.o(.rodata); src/ground_event.o(.rodata); diff --git a/src/ground_object.c b/src/ground_object.c index 532eea7fe..636b367e1 100644 --- a/src/ground_object.c +++ b/src/ground_object.c @@ -1,8 +1,10 @@ -#include "gba/types.h" #include "global.h" +#include "globaldata.h" #include "structs/str_ground_script.h" -#include "ground_script.h" +#include "debug.h" +#include "data_script.h" #include "event_flag.h" +#include "ground_script.h" #include "ground_sprite.h" #include "memory.h" @@ -16,13 +18,13 @@ typedef struct GroundObject { u8 unkB; PixelPos unkC; PixelPos unk14; - u8 unk1C; + s8 unk1C; PixelPos unk20; PixelPos unk28; PixelPos unk30; Action unk38; u32 flags; - u8 unk120; + s8 unk120; PixelPos unk124; PixelPos unk12C; PixelPos unk134; @@ -43,27 +45,14 @@ struct GroundObjectTypeData extern struct GroundObjectTypeData gGroundObjectTypes[]; -extern CallbackData gGroundObjectCallbacks[]; - void DeleteGroundObjects(void); void GroundObject_Delete(s32); -extern DebugLocation gUnknown_81183E4; -extern u8 gUnknown_81183F0[]; -extern u8 gUnknown_8118414[]; -extern u8 gUnknown_811842C[]; -extern u8 gUnknown_81184B0[]; -extern DebugLocation gUnknown_81184A4; -extern ScriptCommand gUnknown_8118350; -extern ScriptCommand gUnknown_81182F4; -extern u8 gUnknown_8118448[]; - const struct GroundScriptHeader *GetGroundScript(s16 a0, DebugLocation *); void sub_80A7658(struct UnkGroundSpriteStruct *); extern bool8 GroundScriptNotify(Action*, s32); extern bool8 GroundScript_Cancel(Action *r0); void SetPredefinedScript(Action *param_1, s16 index, const ScriptCommand *param_3); -bool8 ExecutePredefinedScript(Action *param_1, s32 *param_2, s16 index, DebugLocation *debug); extern bool8 GetCurrentDungeonBounds(PixelPos *a0, PixelPos *a1); void sub_80A75CC(void *, s32, s32, s32); @@ -72,6 +61,119 @@ bool8 SpriteHasPokemonSize_80A66A4(struct UnkGroundSpriteStruct *ptr); s32 GroundObject_Add(s32 id_,const GroundObjectData *objectData,s32 group_,s32 sector_); +static s16 CallbackObjectGetIndex(void *ptr); +static void CallbackObjectGetSize(void *objectPtr_, PixelPos *out); +static void CallbackObjectSetHitboxPos(void *objectPtr_, PixelPos *posOrNull); +static void CallbackObjectSetPositionBounds(void *objectPtr_, PixelPos *from, PixelPos *to); +static void CallbackObjectGetHitboxCenter(void *objectPtr_, PixelPos *out); +static s32 CallbackObjectMoveReal(void *objectPtr_, PixelPos *pos); +extern void CallbackObjectGetPosHeightAndUnk(void *objectPtr_, u32 *height, u32 *unk); +extern void CallbackObjectSetPosHeight(void *objectPtr_, u32 height); +extern void CallbackObjectGetDirection(void *objectPtr_, s8 *dir); +extern void CallbackObjectSetDirection(void *objectPtr_, s32 dir_); +extern void CallbackObjectSetEventIndex(void *objectPtr_, u16 a1); +extern void CallbackObjectSetUnk_80AC998(void *objectPtr_, s32 a1_, s32 a2); +extern bool8 CallbackObjectSpriteRelatedCheck_80AC9B8(void *objectPtr_); +extern bool8 CallbackObjectSpriteRelated_80AC9DC(void *objectPtr_); +extern void CallbackObjectGetFlags(void *objectPtr_, u32 *flags); +extern void CallbackObjectSetFlags(void *objectPtr_, u32 flags); +extern void CallbackObjectClearFlags(void *objectPtr_, u32 flags); +extern s32 CallbackObjectMoveRelative(void *objectPtr_, PixelPos *pos); + + +static const CallbackData gGroundObjectCallbacks = { + .maybeId = 2, + .getIndex = CallbackObjectGetIndex, + .getSize = CallbackObjectGetSize, + .getHitboxCenter = CallbackObjectGetHitboxCenter, + .getPosHeightAndUnk = CallbackObjectGetPosHeightAndUnk, + .getDirection = CallbackObjectGetDirection, + .getFlags = CallbackObjectGetFlags, + .setHitboxPos = CallbackObjectSetHitboxPos, + .setPositionBounds = CallbackObjectSetPositionBounds, + .moveReal = CallbackObjectMoveReal, + .setPosHeight = CallbackObjectSetPosHeight, + .setDirection = CallbackObjectSetDirection, + .setEventIndex = CallbackObjectSetEventIndex, + .livesOnlyNullsub = NULL, + .func38 = CallbackObjectSetUnk_80AC998, + .setFlags = CallbackObjectSetFlags, + .clearFlags = CallbackObjectClearFlags, + .func44_livesOnlySpriteRelated = NULL, + .moveRelative = CallbackObjectMoveRelative, + .func4C_spriteRelatedCheck = CallbackObjectSpriteRelatedCheck_80AC9B8, + .func50_spriteRelated = CallbackObjectSpriteRelated_80AC9DC, +}; +const u8 gUnknown_8118334[]; +#define FAKE_FILENAME gUnknown_8118334 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +static const struct ScriptCommand gUnknown_81182F4[] = { + DEBUGINFO, // Needs to be line 159 + LABEL(0), + WAIT(0x78), + JUMP_LABEL(0), +}; +ALIGNED(4) const u8 gUnknown_8118334[] = "../ground/ground_object.c"; +static const struct ScriptCommand gUnknown_8118350[] = { + DEBUGINFO, // Needs to be line 166 + { 0x54, 0, 1, 0, 0, NULL }, + LABEL(0), + WAIT(0x78), + JUMP_LABEL(0), +}; + +const u8 gUnknown_81183A0[] = { +0xFF, 0xFF, 0x0, 0x8, 0x1, 0x8, 0x0, 0x10, 0x1, 0x10, 0x2, 0x10, 0x3, 0x10, 0x0, 0x8, 0x1, 0x8, 0x2, 0x8, 0x3, 0x8, 0x4, 0x8, 0x5, 0x8, 0x6, 0x8, 0x7, 0x8, 0x8, 0x8, 0x9, 0x8, 0xA, 0x8, 0xB, 0x8, 0xC, 0x8, 0xD, 0x8, 0xE, 0x8, 0xF, 0x8, 0x0, 0x0}; + void AllocGroundObjects(void) { @@ -123,8 +225,8 @@ void GroundObject_Select(s32 scriptID, s32 group, s32 sector) scriptID_s32 = (s16)scriptID; group_s32 = (s16)group; sector_s32 = (s8)sector; - scriptPtr = GetGroundScript(scriptID_s32, &gUnknown_81183E4); - Log('\0',gUnknown_81183F0, scriptID_s32, group_s32, sector_s32); + scriptPtr = GetGroundScript(scriptID_s32, DEBUG_LOC_PTR(gUnknown_8118334, 0x126, "GroundObject_Select")); + Log(0,"GroundObject Select %3d %3d %3d", scriptID_s32, group_s32, sector_s32); groupPtr = &scriptPtr->groups[group_s32]; sectorPtr = &groupPtr->sectors[sector_s32]; @@ -148,7 +250,7 @@ void GroundObject_Cancel(s32 scriptID, s32 sector) sector_s32 = (s8) sector; - Log('\0',gUnknown_8118414, scriptID_s32); + Log(0,"GroundObject Cancel %3d", scriptID_s32); index = 0; ptr = &gGroundObjects[0]; @@ -166,7 +268,7 @@ void GroundObject_CancelBlank(void) GroundObject *ptr; PixelPos stack; - Log('\0',gUnknown_811842C); + Log(0,"GroundObject CancelBlank"); index = 0; ptr = &gGroundObjects[0]; @@ -221,13 +323,13 @@ s32 GroundObject_Add(s32 id_,const GroundObjectData *objectData,s32 group_,s32 s kind = objectData->kind; if (kind == 0x1a) { - if (GetScriptVarValue(NULL,0x28) < 2) { // BASE_LEVEL + if (GetScriptVarValue(NULL,BASE_LEVEL) < 2) { kind = 0x1b; } else { - sVar4 = GetScriptVarValue(NULL,0x29); // FLAG_KIND + sVar4 = GetScriptVarValue(NULL,FLAG_KIND); if (sVar4 == 0) { - sVar3 = GetScriptVarValue(NULL,0x27) + 0x1c; // BASE_KIND + sVar3 = GetScriptVarValue(NULL,BASE_KIND) + 0x1c; } else { sVar3 = sVar4 + 0x2b; @@ -265,7 +367,7 @@ s32 GroundObject_Add(s32 id_,const GroundObjectData *objectData,s32 group_,s32 s } } parent = &gGroundObjects[id]; - Log('\0',gUnknown_8118448,id,kind,objectData->kind,typeDataPtr->unk0,group,sector); + Log(0,"GroundObject Add id %3d kind %3d[%3d] type %3d group %3d sector %3d",id,kind,objectData->kind,typeDataPtr->unk0,group,sector); bVar12 = (parent->unk6 == -1); parent->unk4 = id; parent->unk6 = kind; @@ -349,11 +451,11 @@ s32 GroundObject_Add(s32 id_,const GroundObjectData *objectData,s32 group_,s32 s sub_80A75CC(&(parent->unk144),id,parent->unk6, parent->flags); } - InitActionWithParams(&parent->unk38,gGroundObjectCallbacks,parent,group,sector); + InitActionWithParams(&parent->unk38,&gGroundObjectCallbacks,parent,group,sector); // What an ugly way of coding that... SetPredefinedScript(&parent->unk38,1, (objectData->scripts[1] != NULL) ? objectData->scripts[1] - : (SpriteHasPokemonSize_80A66A4(&parent->unk144)) ? &gUnknown_8118350 : &gUnknown_81182F4); + : (SpriteHasPokemonSize_80A66A4(&parent->unk144)) ? gUnknown_8118350 : gUnknown_81182F4); SetPredefinedScript(&parent->unk38,2,(objectData->scripts[2] != NULL) ? objectData->scripts[2] : gFunctionScriptTable[4].script); SetPredefinedScript(&parent->unk38,3,(objectData->scripts[3] != NULL) ? objectData->scripts[3] @@ -361,7 +463,7 @@ s32 GroundObject_Add(s32 id_,const GroundObjectData *objectData,s32 group_,s32 s if (objectData->scripts[0] != NULL) { SetPredefinedScript(&parent->unk38,0,objectData->scripts[0]); - ExecutePredefinedScript(&parent->unk38,NULL,0,&gUnknown_81184A4); + ExecutePredefinedScript(&parent->unk38,NULL,0,DEBUG_LOC_PTR(gUnknown_8118334, 0x283, "GroundObject_Add")); } return id; } @@ -373,7 +475,7 @@ void GroundObject_Delete(s32 index_) { s32 index = (s16)index_; GroundObject *parent = &gGroundObjects[index]; - Log(0, gUnknown_81184B0, index); + Log(0, "GroundObject Delete id %3d", index); sub_80A7658(&parent->unk144); InitAction2(&parent->unk38); parent->unk6 = -1; @@ -429,7 +531,6 @@ bool8 sub_80AC274(s32 index_, ScriptInfoSmall *scriptInfo, s32 a2_) return FALSE; } -extern u8 gUnknown_81184CC[]; extern DebugLocation gUnknown_8118504; bool8 GroundObject_ExecuteScript(s32 index_, void *a1, ScriptInfoSmall *script) @@ -437,11 +538,11 @@ bool8 GroundObject_ExecuteScript(s32 index_, void *a1, ScriptInfoSmall *script) s32 index = (s16)index_; GroundObject *parent = &gGroundObjects[index]; - Log(0, gUnknown_81184CC, index); + Log(0, "GroundObject Execute %3d ", index); if(parent->unk6 != -1) { - GroundScript_ExecutePP(&parent->unk38, (ActionUnkIds *)a1, script, &gUnknown_8118504); + GroundScript_ExecutePP(&parent->unk38, (ActionUnkIds *)a1, script, DEBUG_LOC_PTR(gUnknown_8118334, 0x303, "GroundObject_ExecuteScript")); parent->unk13C = 1; return 1; } @@ -530,7 +631,7 @@ s16 sub_80AC448(s32 index_, PixelPos *pos) return parent->unk6; } -extern void TryMoveObjectRelative_80AC6AC(void *, PixelPos *); +extern s32 TryMoveObjectRelative_80AC6AC(GroundObject *, PixelPos *); s16 sub_80AC49C(s32 index_, PixelPos *pos) @@ -564,3 +665,249 @@ s32 sub_80AC4C8(s32 index, PixelPos *a0, PixelPos *a1) { return -1; } + + +// https://decomp.me/scratch/VEJ5Z (96.09% matched) +NAKED +s32 sub_80AC554(s32 flag, PixelPos *param_2, PixelPos *param_3) { + asm_unified( + "\tpush {r4-r7,lr}\n" + "\tmov r7, r10\n" + "\tmov r6, r9\n" + "\tmov r5, r8\n" + "\tpush {r5-r7}\n" + "\tmov r8, r0\n" + "\tmov r10, r1\n" + "\tadds r4, r2, 0\n" + "\tldr r0, _080AC5C8\n" + "\tldr r0, [r0]\n" + "\tmov r12, r0\n" + "\tmovs r6, 0\n" + "\tmovs r0, 0x1\n" + "\tnegs r0, r0\n" + "\tmov r9, r0\n" + "\tmovs r7, 0x80\n" + "\tlsls r7, 9\n" +"_080AC576:\n" + "\tmov r1, r12\n" + "\tmovs r2, 0x6\n" + "\tldrsh r0, [r1, r2]\n" + "\tcmp r0, r9\n" + "\tbeq _080AC5CC\n" + "\tmovs r0, 0x8E\n" + "\tlsls r0, 1\n" + "\tadd r0, r12\n" + "\tldr r0, [r0]\n" + "\tmov r5, r8\n" + "\tands r0, r5\n" + "\tcmp r0, 0\n" + "\tbeq _080AC5CC\n" + "\tmovs r0, 0x92\n" + "\tlsls r0, 1\n" + "\tadd r0, r12\n" + "\tldr r1, [r0]\n" + "\tmov r5, r12\n" + "\tldr r0, [r5, 0x14]\n" + "\tadds r2, r1, r0\n" + "\tmovs r0, 0x94\n" + "\tlsls r0, 1\n" + "\tadd r0, r12\n" + "\tldr r1, [r0]\n" + "\tldr r0, [r5, 0x18]\n" + "\tadds r3, r1, r0\n" + "\tldr r0, [r4]\n" + "\tcmp r2, r0\n" + "\tbge _080AC5CC\n" + "\tmov r1, r10\n" + "\tldr r0, [r1]\n" + "\tcmp r2, r0\n" + "\tble _080AC5CC\n" + "\tldr r0, [r4, 0x4]\n" + "\tcmp r3, r0\n" + "\tbge _080AC5CC\n" + "\tldr r0, [r1, 0x4]\n" + "\tcmp r3, r0\n" + "\tble _080AC5CC\n" + "\tadds r0, r6, 0\n" + "\tb _080AC5E4\n" + "\t.align 2, 0\n" +"_080AC5C8: .4byte gGroundObjects\n" +"_080AC5CC:\n" + "\tadds r0, r7, 0\n" + "\tmovs r2, 0x80\n" + "\tlsls r2, 9\n" + "\tadds r7, r2\n" + "\tasrs r6, r0, 16\n" + "\tmovs r5, 0xE2\n" + "\tlsls r5, 1\n" + "\tadd r12, r5\n" + "\tcmp r6, 0xF\n" + "\tble _080AC576\n" + "\tmovs r0, 0x1\n" + "\tnegs r0, r0\n" +"_080AC5E4:\n" + "\tpop {r3-r5}\n" + "\tmov r8, r3\n" + "\tmov r9, r4\n" + "\tmov r10, r5\n" + "\tpop {r4-r7}\n" + "\tpop {r1}\n" + "\tbx r1"); +} + +bool8 CheckMapCollision_80A585C(PixelPos *, PixelPos *); +s32 GetLivesCollision_80A92A0(s32 id, u32 flags, PixelPos *, PixelPos *); + +s32 GetObjectCollision_80AC5F4(GroundObject *param_1, PixelPos *param_2, PixelPos *param_3) +{ + PixelPos local_28 = { param_2->x / 2048 , param_2->y / 2048 }; + PixelPos iVar1 = { (param_3->x - 1) / 2048, (param_3->y - 1) / 2048 }; + PixelPos local_20 = { (iVar1.x - local_28.x) + 1, (iVar1.y - local_28.y) + 1 }; + + if (param_1->flags & 1) + { + if(CheckMapCollision_80A585C(&local_28,&local_20)) + return 1; + } + if (((param_1->flags & 4))) { + if(((s16)GetLivesCollision_80A92A0(-1,4,param_2,param_3) >= 0)) + return 4; + } + return 0; +} + +s32 TryMoveObjectRelative_80AC6AC(GroundObject *param_1,PixelPos *param_2) +{ + PixelPos local_1c; + PixelPos local_14; + + local_1c.x = param_2->x - (param_1->unk14).x; + local_1c.y = param_2->y - (param_1->unk14).y; + local_14.x = param_2->x + (param_1->unk14).x; + local_14.y = param_2->y + (param_1->unk14).y; + if ((((local_1c.x < param_1->unk28.x) || (local_14.x >= param_1->unk30.x)) || + (local_1c.y < param_1->unk28.y)) || (local_14.y >= param_1->unk30.y)) { + return 1; + } + else { + s32 ret = GetObjectCollision_80AC5F4(param_1,&local_1c,&local_14); + if (ret == 0) { + (param_1->unk124) = local_1c; + param_1->unk12C = local_14; + return 0; + } + return ret; + } +} + +s32 TryMoveRelative_80AC720(GroundObject *param_1,PixelPos *param_2) +{ + s32 ret; + bool8 bVar1; + PixelPos iVar2; + PixelPos uVar4; + + iVar2.x = (param_1->unk124).x + param_2->x; + iVar2.y = (param_1->unk124).y + param_2->y; + uVar4.x = param_1->unk12C.x + param_2->x; + uVar4.y = param_1->unk12C.y + param_2->y; + + bVar1 = 0; + + + if (iVar2.x < param_1->unk28.x) { + iVar2.x = param_1->unk28.x; + uVar4.x = param_1->unk28.x + param_1->unkC.x; + bVar1 = 1; + } + else { + if (uVar4.x >= param_1->unk30.x) { + iVar2.x = param_1->unk30.x - param_1->unkC.x; + uVar4.x = param_1->unk30.x; + bVar1 = 1; + } + } + + if (iVar2.y < param_1->unk28.y) { + iVar2.y = param_1->unk28.y; + uVar4.y = param_1->unk28.y + param_1->unkC.y; + bVar1 = 1; + } + else { + if (uVar4.y >= param_1->unk30.y){ + iVar2.y = param_1->unk30.y - param_1->unkC.y; + uVar4.y = param_1->unk30.y; + bVar1 = 1; + } + } + + ret = GetObjectCollision_80AC5F4(param_1,&iVar2,&uVar4); + if (ret == 0) { + (param_1->unk124) = iVar2; + param_1->unk12C = uVar4; + if (!bVar1) { + return 0; + } + else { + return 1; + } + } + return ret; +} + +static s16 CallbackObjectGetIndex(void *ptr) +{ + struct GroundObject *groundObject = ptr; + return groundObject->unk4; +} + +static void CallbackObjectGetSize(void *objectPtr_, PixelPos *out) +{ + struct GroundObject *objectPtr = objectPtr_; + *out = objectPtr->unkC; +} + +static void CallbackObjectSetHitboxPos(void *objectPtr_, PixelPos *posOrNull) +{ + struct GroundObject *objectPtr = objectPtr_; + + if (posOrNull != NULL) { + objectPtr->unk124.x = posOrNull->x - objectPtr->unk14.x; + objectPtr->unk12C.x = posOrNull->x + objectPtr->unk14.x; + objectPtr->unk124.y = posOrNull->y - objectPtr->unk14.y; + objectPtr->unk12C.y = posOrNull->y + objectPtr->unk14.y; + } + else { + objectPtr->unk124.x = objectPtr->unk20.x - objectPtr->unk14.x; + objectPtr->unk12C.x = objectPtr->unk20.x + objectPtr->unk14.x; + objectPtr->unk124.y = objectPtr->unk20.y - objectPtr->unk14.y; + objectPtr->unk12C.y = objectPtr->unk20.y + objectPtr->unk14.y; + objectPtr->unk134.x = objectPtr->unk134.y = 0; + if (objectPtr->unk120 != objectPtr->unk1C) { + objectPtr->unk13C = TRUE; + } + objectPtr->unk120 = objectPtr->unk1C; + } +} + +static void CallbackObjectSetPositionBounds(void *objectPtr_, PixelPos *from, PixelPos *to) +{ + struct GroundObject *objectPtr = objectPtr_; + + objectPtr->unk28 = *from; + objectPtr->unk30 = *to; +} + +static void CallbackObjectGetHitboxCenter(void *objectPtr_, PixelPos *out) +{ + struct GroundObject *objectPtr = objectPtr_; + + out->x = objectPtr->unk124.x + objectPtr->unk14.x; + out->y = objectPtr->unk124.y + objectPtr->unk14.y; +} + +static s32 CallbackObjectMoveReal(void *objectPtr_, PixelPos *pos) +{ + struct GroundObject *objectPtr = objectPtr_; + return TryMoveObjectRelative_80AC6AC(objectPtr, pos); +} From 30ec2de7b2d2941c4dd40bd20c586bfb59817426 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Sun, 22 Jun 2025 11:20:37 -0700 Subject: [PATCH 05/11] more ground object decomp --- asm/ground_object.s | 295 ------------------------------------ src/ground_object.c | 360 +++++++++++++++++++++++++++++++++----------- 2 files changed, 271 insertions(+), 384 deletions(-) diff --git a/asm/ground_object.s b/asm/ground_object.s index cdd1f84de..06a2ffe4e 100644 --- a/asm/ground_object.s +++ b/asm/ground_object.s @@ -5,301 +5,6 @@ .text - thumb_func_start CallbackObjectGetPosHeightAndUnk -CallbackObjectGetPosHeightAndUnk: - push {r4,lr} - adds r3, r0, 0 - movs r4, 0x9A - lsls r4, 1 - adds r0, r3, r4 - ldr r0, [r0] - str r0, [r1] - movs r1, 0x9C - lsls r1, 1 - adds r0, r3, r1 - ldr r0, [r0] - str r0, [r2] - pop {r4} - pop {r0} - bx r0 - thumb_func_end CallbackObjectGetPosHeightAndUnk - - thumb_func_start CallbackObjectSetPosHeight -CallbackObjectSetPosHeight: - movs r2, 0x9A - lsls r2, 1 - adds r0, r2 - str r1, [r0] - bx lr - thumb_func_end CallbackObjectSetPosHeight - - thumb_func_start CallbackObjectGetDirection -CallbackObjectGetDirection: - movs r2, 0x90 - lsls r2, 1 - adds r0, r2 - ldrb r0, [r0] - strb r0, [r1] - bx lr - thumb_func_end CallbackObjectGetDirection - - thumb_func_start CallbackObjectSetDirection -CallbackObjectSetDirection: - push {lr} - adds r2, r0, 0 - lsls r1, 24 - asrs r1, 24 - movs r0, 0x1 - negs r0, r0 - cmp r1, r0 - beq _080AC934 - movs r3, 0x90 - lsls r3, 1 - adds r0, r2, r3 - strb r1, [r0] -_080AC934: - pop {r0} - bx r0 - thumb_func_end CallbackObjectSetDirection - - thumb_func_start CallbackObjectSetEventIndex -CallbackObjectSetEventIndex: - push {r4,r5,lr} - lsls r1, 16 - adds r3, r0, 0 - movs r0, 0xFF - lsls r0, 16 - ands r0, r1 - lsrs r0, 16 - cmp r0, 0 - beq _080AC958 - ldr r1, _080AC954 - lsls r0, 1 - adds r0, r1 - b _080AC95E - .align 2, 0 -_080AC954: .4byte gUnknown_81183A0 -_080AC958: - movs r5, 0x9F - lsls r5, 1 - adds r0, r3, r5 -_080AC95E: - movs r1, 0 - ldrsh r2, [r0, r1] - movs r5, 0x9F - lsls r5, 1 - adds r1, r3, r5 - ldrh r4, [r1] - movs r5, 0 - ldrsh r0, [r1, r5] - cmp r0, r2 - beq _080AC97C - strh r2, [r1] - movs r0, 0x9E - lsls r0, 1 - adds r1, r3, r0 - b _080AC98C -_080AC97C: - movs r0, 0x80 - lsls r0, 5 - ands r0, r4 - cmp r0, 0 - beq _080AC990 - movs r5, 0x9E - lsls r5, 1 - adds r1, r3, r5 -_080AC98C: - movs r0, 0x1 - strb r0, [r1] -_080AC990: - pop {r4,r5} - pop {r0} - bx r0 - thumb_func_end CallbackObjectSetEventIndex - - thumb_func_start CallbackObjectSetUnk_80AC998 -CallbackObjectSetUnk_80AC998: - push {lr} - lsls r1, 16 - asrs r1, 16 - adds r2, r1, 0 - cmp r1, 0 - bne _080AC9AA - movs r1, 0xE0 - lsls r1, 1 - adds r2, r1, 0 -_080AC9AA: - movs r1, 0xA0 - lsls r1, 1 - adds r0, r1 - strh r2, [r0] - pop {r0} - bx r0 - thumb_func_end CallbackObjectSetUnk_80AC998 - - thumb_func_start CallbackObjectSpriteRelatedCheck_80AC9B8 -CallbackObjectSpriteRelatedCheck_80AC9B8: - push {lr} - adds r1, r0, 0 - movs r2, 0x9E - lsls r2, 1 - adds r0, r1, r2 - ldrb r0, [r0] - cmp r0, 0 - bne _080AC9D6 - adds r2, 0x8 - adds r0, r1, r2 - bl sub_80A66F8 - lsls r0, 24 - lsrs r0, 24 - b _080AC9D8 -_080AC9D6: - movs r0, 0x1 -_080AC9D8: - pop {r1} - bx r1 - thumb_func_end CallbackObjectSpriteRelatedCheck_80AC9B8 - - thumb_func_start CallbackObjectSpriteRelated_80AC9DC -CallbackObjectSpriteRelated_80AC9DC: - push {lr} - adds r1, r0, 0 - movs r2, 0xA0 - lsls r2, 1 - adds r0, r1, r2 - movs r2, 0 - ldrsh r0, [r0, r2] - cmp r0, 0 - bne _080AC9FE - movs r2, 0xA2 - lsls r2, 1 - adds r0, r1, r2 - bl sub_80A671C - lsls r0, 24 - lsrs r0, 24 - b _080ACA00 -_080AC9FE: - movs r0, 0x1 -_080ACA00: - pop {r1} - bx r1 - thumb_func_end CallbackObjectSpriteRelated_80AC9DC - - thumb_func_start CallbackObjectGetFlags -CallbackObjectGetFlags: - movs r2, 0x8E - lsls r2, 1 - adds r0, r2 - ldr r0, [r0] - str r0, [r1] - bx lr - thumb_func_end CallbackObjectGetFlags - - thumb_func_start CallbackObjectSetFlags -CallbackObjectSetFlags: - push {lr} - movs r2, 0x4 - ldrsh r0, [r0, r2] - bl sub_80AC1B0 - pop {r0} - bx r0 - thumb_func_end CallbackObjectSetFlags - - thumb_func_start CallbackObjectClearFlags -CallbackObjectClearFlags: - push {lr} - movs r2, 0x4 - ldrsh r0, [r0, r2] - bl sub_80AC1F4 - pop {r0} - bx r0 - thumb_func_end CallbackObjectClearFlags - - thumb_func_start CallbackObjectMoveRelative -CallbackObjectMoveRelative: - push {lr} - bl TryMoveRelative_80AC720 - pop {r1} - bx r1 - thumb_func_end CallbackObjectMoveRelative - - thumb_func_start GroundObject_Action -GroundObject_Action: - push {r4-r7,lr} - mov r7, r8 - push {r7} - ldr r0, _080ACA7C - ldr r5, [r0] - movs r7, 0 - movs r0, 0x1 - negs r0, r0 - mov r8, r0 - movs r1, 0x9E - lsls r1, 1 - adds r6, r5, r1 -_080ACA54: - movs r3, 0x6 - ldrsh r0, [r5, r3] - cmp r0, r8 - beq _080ACAB2 - adds r4, r5, 0 - adds r4, 0x38 - adds r0, r4, 0 - ldr r1, _080ACA80 - bl HandleAction - lsls r0, 16 - asrs r0, 16 - cmp r0, 0 - beq _080ACA84 - cmp r0, 0x4 - bne _080ACA90 - adds r0, r7, 0 - bl GroundObject_Delete - b _080ACAB2 - .align 2, 0 -_080ACA7C: .4byte gGroundObjects -_080ACA80: .4byte gUnknown_8118524 -_080ACA84: - adds r0, r4, 0 - movs r1, 0 - movs r2, 0x1 - ldr r3, _080ACAD0 - bl ExecutePredefinedScript -_080ACA90: - ldrb r0, [r6] - cmp r0, 0 - beq _080ACAB2 - movs r0, 0 - strb r0, [r6] - movs r1, 0xA2 - lsls r1, 1 - adds r0, r5, r1 - ldrh r2, [r6, 0x2] - movs r3, 0xF8 - lsls r3, 5 - adds r1, r3, 0 - ands r1, r2 - lsls r2, 24 - asrs r2, 24 - bl sub_80A6EFC -_080ACAB2: - adds r0, r7, 0x1 - lsls r0, 16 - asrs r7, r0, 16 - movs r0, 0xE2 - lsls r0, 1 - adds r6, r0 - adds r5, r0 - cmp r7, 0xF - ble _080ACA54 - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_080ACAD0: .4byte gUnknown_8118530 - thumb_func_end GroundObject_Action thumb_func_start sub_80ACAD4 sub_80ACAD4: diff --git a/src/ground_object.c b/src/ground_object.c index 636b367e1..7a5ccefa6 100644 --- a/src/ground_object.c +++ b/src/ground_object.c @@ -11,7 +11,7 @@ typedef struct GroundObject { // size: 0x1C4 u8 unk0[4]; - s16 unk4; + s16 id; s16 unk6; // kind s16 unk8; // scriptID / group s8 unkA; // sector @@ -24,13 +24,13 @@ typedef struct GroundObject { PixelPos unk30; Action unk38; u32 flags; - s8 unk120; + s8 direction; PixelPos unk124; PixelPos unk12C; PixelPos unk134; - u8 unk13C; - u16 unk13E; - u16 unk140; + u8 directionRelated; + s16 unk13E; + s16 unk140; struct UnkGroundSpriteStruct unk144; } GroundObject; @@ -67,18 +67,18 @@ static void CallbackObjectSetHitboxPos(void *objectPtr_, PixelPos *posOrNull); static void CallbackObjectSetPositionBounds(void *objectPtr_, PixelPos *from, PixelPos *to); static void CallbackObjectGetHitboxCenter(void *objectPtr_, PixelPos *out); static s32 CallbackObjectMoveReal(void *objectPtr_, PixelPos *pos); -extern void CallbackObjectGetPosHeightAndUnk(void *objectPtr_, u32 *height, u32 *unk); -extern void CallbackObjectSetPosHeight(void *objectPtr_, u32 height); -extern void CallbackObjectGetDirection(void *objectPtr_, s8 *dir); -extern void CallbackObjectSetDirection(void *objectPtr_, s32 dir_); -extern void CallbackObjectSetEventIndex(void *objectPtr_, u16 a1); -extern void CallbackObjectSetUnk_80AC998(void *objectPtr_, s32 a1_, s32 a2); -extern bool8 CallbackObjectSpriteRelatedCheck_80AC9B8(void *objectPtr_); -extern bool8 CallbackObjectSpriteRelated_80AC9DC(void *objectPtr_); -extern void CallbackObjectGetFlags(void *objectPtr_, u32 *flags); -extern void CallbackObjectSetFlags(void *objectPtr_, u32 flags); -extern void CallbackObjectClearFlags(void *objectPtr_, u32 flags); -extern s32 CallbackObjectMoveRelative(void *objectPtr_, PixelPos *pos); +static void CallbackObjectGetPosHeightAndUnk(void *objectPtr_, u32 *height, u32 *unk); +static void CallbackObjectSetPosHeight(void *objectPtr_, u32 height); +static void CallbackObjectGetDirection(void *objectPtr_, s8 *dir); +static void CallbackObjectSetDirection(void *objectPtr_, s32 dir_); +static void CallbackObjectSetEventIndex(void *objectPtr_, u16 a1); +static void CallbackObjectSetUnk_80AC998(void *objectPtr_, s32 a1_, s32 a2); +static bool8 CallbackObjectSpriteRelatedCheck_80AC9B8(void *objectPtr_); +static bool8 CallbackObjectSpriteRelated_80AC9DC(void *objectPtr_); +static void CallbackObjectGetFlags(void *objectPtr_, u32 *flags); +static void CallbackObjectSetFlags(void *objectPtr_, u32 flags); +static void CallbackObjectClearFlags(void *objectPtr_, u32 flags); +static s32 CallbackObjectMoveRelative(void *objectPtr_, PixelPos *pos); static const CallbackData gGroundObjectCallbacks = { @@ -153,7 +153,6 @@ const u8 gUnknown_8118334[]; - static const struct ScriptCommand gUnknown_81182F4[] = { @@ -171,8 +170,31 @@ static const struct ScriptCommand gUnknown_8118350[] = { JUMP_LABEL(0), }; -const u8 gUnknown_81183A0[] = { -0xFF, 0xFF, 0x0, 0x8, 0x1, 0x8, 0x0, 0x10, 0x1, 0x10, 0x2, 0x10, 0x3, 0x10, 0x0, 0x8, 0x1, 0x8, 0x2, 0x8, 0x3, 0x8, 0x4, 0x8, 0x5, 0x8, 0x6, 0x8, 0x7, 0x8, 0x8, 0x8, 0x9, 0x8, 0xA, 0x8, 0xB, 0x8, 0xC, 0x8, 0xD, 0x8, 0xE, 0x8, 0xF, 0x8, 0x0, 0x0}; +const s16 gUnknown_81183A0[] = { +0xFFFF, +0x800, +0x801, +0x1000, +0x1001, +0x1002, +0x1003, +0x800, +0x801, +0x802, +0x803, +0x804, +0x805, +0x806, +0x807, +0x808, +0x809, +0x80A, +0x80B, +0x80C, +0x80D, +0x80E, +0x80F, +0}; void AllocGroundObjects(void) { @@ -369,7 +391,7 @@ s32 GroundObject_Add(s32 id_,const GroundObjectData *objectData,s32 group_,s32 s parent = &gGroundObjects[id]; Log(0,"GroundObject Add id %3d kind %3d[%3d] type %3d group %3d sector %3d",id,kind,objectData->kind,typeDataPtr->unk0,group,sector); bVar12 = (parent->unk6 == -1); - parent->unk4 = id; + parent->id = id; parent->unk6 = kind; parent->unk8 = group; parent->unkA = sector; @@ -436,7 +458,7 @@ s32 GroundObject_Add(s32 id_,const GroundObjectData *objectData,s32 group_,s32 s SetUnkInGroundEvent(&objectData->pos, &parent->unk20); if (bVar12) { - parent->unk120 = parent->unk1C; + parent->direction = parent->unk1C; parent->unk124.x = parent->unk20.x - parent->unk14.x; parent->unk12C.x = parent->unk20.x + parent->unk14.x; parent->unk124.y = parent->unk20.y - parent->unk14.y; @@ -446,7 +468,7 @@ s32 GroundObject_Add(s32 id_,const GroundObjectData *objectData,s32 group_,s32 s GetCurrentDungeonBounds(&parent->unk28,&parent->unk30); if (bVar12) { parent->unk13E = 0x800; - parent->unk13C = 1; + parent->directionRelated = 1; parent->unk140 = 0; sub_80A75CC(&(parent->unk144),id,parent->unk6, parent->flags); } @@ -543,7 +565,7 @@ bool8 GroundObject_ExecuteScript(s32 index_, void *a1, ScriptInfoSmall *script) if(parent->unk6 != -1) { GroundScript_ExecutePP(&parent->unk38, (ActionUnkIds *)a1, script, DEBUG_LOC_PTR(gUnknown_8118334, 0x303, "GroundObject_ExecuteScript")); - parent->unk13C = 1; + parent->directionRelated = 1; return 1; } else { @@ -778,87 +800,87 @@ s32 GetObjectCollision_80AC5F4(GroundObject *param_1, PixelPos *param_2, PixelPo s32 TryMoveObjectRelative_80AC6AC(GroundObject *param_1,PixelPos *param_2) { - PixelPos local_1c; - PixelPos local_14; + PixelPos local_1c; + PixelPos local_14; - local_1c.x = param_2->x - (param_1->unk14).x; - local_1c.y = param_2->y - (param_1->unk14).y; - local_14.x = param_2->x + (param_1->unk14).x; - local_14.y = param_2->y + (param_1->unk14).y; - if ((((local_1c.x < param_1->unk28.x) || (local_14.x >= param_1->unk30.x)) || - (local_1c.y < param_1->unk28.y)) || (local_14.y >= param_1->unk30.y)) { - return 1; - } - else { - s32 ret = GetObjectCollision_80AC5F4(param_1,&local_1c,&local_14); - if (ret == 0) { - (param_1->unk124) = local_1c; - param_1->unk12C = local_14; - return 0; + local_1c.x = param_2->x - (param_1->unk14).x; + local_1c.y = param_2->y - (param_1->unk14).y; + local_14.x = param_2->x + (param_1->unk14).x; + local_14.y = param_2->y + (param_1->unk14).y; + if ((((local_1c.x < param_1->unk28.x) || (local_14.x >= param_1->unk30.x)) || + (local_1c.y < param_1->unk28.y)) || (local_14.y >= param_1->unk30.y)) { + return 1; + } + else { + s32 ret = GetObjectCollision_80AC5F4(param_1,&local_1c,&local_14); + if (ret == 0) { + (param_1->unk124) = local_1c; + param_1->unk12C = local_14; + return 0; + } + return ret; } - return ret; - } } s32 TryMoveRelative_80AC720(GroundObject *param_1,PixelPos *param_2) { - s32 ret; - bool8 bVar1; - PixelPos iVar2; - PixelPos uVar4; - - iVar2.x = (param_1->unk124).x + param_2->x; - iVar2.y = (param_1->unk124).y + param_2->y; - uVar4.x = param_1->unk12C.x + param_2->x; - uVar4.y = param_1->unk12C.y + param_2->y; - - bVar1 = 0; - + s32 ret; + bool8 bVar1; + PixelPos iVar2; + PixelPos uVar4; - if (iVar2.x < param_1->unk28.x) { - iVar2.x = param_1->unk28.x; - uVar4.x = param_1->unk28.x + param_1->unkC.x; - bVar1 = 1; - } - else { - if (uVar4.x >= param_1->unk30.x) { - iVar2.x = param_1->unk30.x - param_1->unkC.x; - uVar4.x = param_1->unk30.x; - bVar1 = 1; - } - } + iVar2.x = (param_1->unk124).x + param_2->x; + iVar2.y = (param_1->unk124).y + param_2->y; + uVar4.x = param_1->unk12C.x + param_2->x; + uVar4.y = param_1->unk12C.y + param_2->y; - if (iVar2.y < param_1->unk28.y) { - iVar2.y = param_1->unk28.y; - uVar4.y = param_1->unk28.y + param_1->unkC.y; - bVar1 = 1; - } - else { - if (uVar4.y >= param_1->unk30.y){ - iVar2.y = param_1->unk30.y - param_1->unkC.y; - uVar4.y = param_1->unk30.y; + bVar1 = 0; + + + if (iVar2.x < param_1->unk28.x) { + iVar2.x = param_1->unk28.x; + uVar4.x = param_1->unk28.x + param_1->unkC.x; bVar1 = 1; } - } + else { + if (uVar4.x >= param_1->unk30.x) { + iVar2.x = param_1->unk30.x - param_1->unkC.x; + uVar4.x = param_1->unk30.x; + bVar1 = 1; + } + } - ret = GetObjectCollision_80AC5F4(param_1,&iVar2,&uVar4); - if (ret == 0) { - (param_1->unk124) = iVar2; - param_1->unk12C = uVar4; - if (!bVar1) { - return 0; + if (iVar2.y < param_1->unk28.y) { + iVar2.y = param_1->unk28.y; + uVar4.y = param_1->unk28.y + param_1->unkC.y; + bVar1 = 1; } else { - return 1; + if (uVar4.y >= param_1->unk30.y){ + iVar2.y = param_1->unk30.y - param_1->unkC.y; + uVar4.y = param_1->unk30.y; + bVar1 = 1; + } } - } - return ret; + + ret = GetObjectCollision_80AC5F4(param_1,&iVar2,&uVar4); + if (ret == 0) { + (param_1->unk124) = iVar2; + param_1->unk12C = uVar4; + if (!bVar1) { + return 0; + } + else { + return 1; + } + } + return ret; } static s16 CallbackObjectGetIndex(void *ptr) { struct GroundObject *groundObject = ptr; - return groundObject->unk4; + return groundObject->id; } static void CallbackObjectGetSize(void *objectPtr_, PixelPos *out) @@ -883,10 +905,10 @@ static void CallbackObjectSetHitboxPos(void *objectPtr_, PixelPos *posOrNull) objectPtr->unk124.y = objectPtr->unk20.y - objectPtr->unk14.y; objectPtr->unk12C.y = objectPtr->unk20.y + objectPtr->unk14.y; objectPtr->unk134.x = objectPtr->unk134.y = 0; - if (objectPtr->unk120 != objectPtr->unk1C) { - objectPtr->unk13C = TRUE; + if (objectPtr->direction != objectPtr->unk1C) { + objectPtr->directionRelated = TRUE; } - objectPtr->unk120 = objectPtr->unk1C; + objectPtr->direction = objectPtr->unk1C; } } @@ -911,3 +933,163 @@ static s32 CallbackObjectMoveReal(void *objectPtr_, PixelPos *pos) struct GroundObject *objectPtr = objectPtr_; return TryMoveObjectRelative_80AC6AC(objectPtr, pos); } + +static void CallbackObjectGetPosHeightAndUnk(void *objectPtr_, u32 *height, u32 *unk) +{ + struct GroundObject *objectPtr = objectPtr_; + + *height = objectPtr->unk134.x; + *unk= objectPtr->unk134.y; +} + +static void CallbackObjectSetPosHeight(void *objectPtr_, u32 height) +{ + struct GroundObject *objectPtr = objectPtr_; + objectPtr->unk134.x = height; + +} + +static void CallbackObjectGetDirection(void *objectPtr_, s8 *dir) +{ + struct GroundObject *objectPtr = objectPtr_; + *dir = objectPtr->direction; + +} + +static void CallbackObjectSetDirection(void *livesPtr_, s32 direction) +{ + struct GroundObject *livesPtr = livesPtr_; + s32 dir = (s8) direction; + + if (dir != -1) { + livesPtr->direction = dir; + } +} + +static void CallbackObjectSetEventIndex(void *livesPtr_, u16 a1) { + struct GroundObject *livesPtr = livesPtr_; + + u32 r1; + u16 f1 = a1 & 0xFF; + + if (f1 != 0) + { + r1 = gUnknown_81183A0[f1]; + } + else + { + r1 = livesPtr->unk13E; + } + + if(livesPtr->unk13E != (s16) r1) + { + livesPtr->unk13E = r1; + livesPtr->directionRelated = 1; + } + else if((livesPtr->unk13E & 0x1000)) + livesPtr->directionRelated = 1; +} + + +static void CallbackObjectSetUnk_80AC998(void *objectPtr_, s32 a1_, s32 a2) { + struct GroundObject *livesPtr = objectPtr_; + + s32 a1Match = (s16) a1_; + #ifndef NONMATCHING + register s16 a1 asm("r2") = a1Match; + #else + s32 a1 = a1Match; + #endif + + if (a1Match == 0) { + a1 = 448; + } + + livesPtr->unk140 = a1; +} + +extern bool8 sub_80A66F8(struct UnkGroundSpriteStruct *ptr); +extern bool8 sub_80A671C(struct UnkGroundSpriteStruct *ptr); + +static bool8 CallbackObjectSpriteRelatedCheck_80AC9B8(void *objectPtr_) +{ + struct GroundObject *livesPtr = objectPtr_; + + if (livesPtr->directionRelated) { + return TRUE; + } + else { + return sub_80A66F8(&livesPtr->unk144); + } +} + +static bool8 CallbackObjectSpriteRelated_80AC9DC(void *objectPtr_) +{ + struct GroundObject *livesPtr = objectPtr_; + + if (livesPtr->unk140 != 0) { + return TRUE; + } + else { + return sub_80A671C(&livesPtr->unk144); + } +} + +static void CallbackObjectGetFlags(void *livesPtr_, u32 *flags) +{ + struct GroundObject *livesPtr = livesPtr_; + + *flags = livesPtr->flags; +} + +static void CallbackObjectSetFlags(void *livesPtr_, u32 flags) +{ + struct GroundObject *livesPtr = livesPtr_; + + sub_80AC1B0(livesPtr->id, flags); +} + +static void CallbackObjectClearFlags(void *livesPtr_, u32 flags) +{ + struct GroundObject *livesPtr = livesPtr_; + + sub_80AC1F4(livesPtr->id, flags); +} + +static s32 CallbackObjectMoveRelative(void *livesPtr_, PixelPos *pos) +{ + struct GroundObject *livesPtr = livesPtr_; + + return TryMoveRelative_80AC720(livesPtr, pos); +} + +extern DebugLocation gUnknown_8118524; +extern DebugLocation gUnknown_8118530; +extern s16 HandleAction(Action *action, DebugLocation *debug); + +void GroundObject_Action(void) +{ + GroundObject *objectPtr; + s32 i; + + for (objectPtr = &gGroundObjects[0], i = 0; i < 0x10; i = (s16)(i + 1), objectPtr++) + { + if (objectPtr->unk6 != -1) { + + switch(HandleAction(&objectPtr->unk38, &gUnknown_8118524)) + { + case 4: + GroundObject_Delete(i); + continue; + case 0: + ExecutePredefinedScript(&objectPtr->unk38, NULL, 1, &gUnknown_8118530); + break; + } + + if (objectPtr->directionRelated) { + objectPtr->directionRelated = FALSE; + sub_80A6EFC(&objectPtr->unk144,objectPtr->unk13E & 0x1f00,(s8)objectPtr->unk13E); + } + } + } +} From babf28675f8f1aca33e02bd933ae265fd3029566 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Sun, 22 Jun 2025 14:39:48 -0700 Subject: [PATCH 06/11] Match sub_80AC554 thanks to @DizzyEggg --- src/ground_object.c | 105 ++++++++------------------------------------ 1 file changed, 19 insertions(+), 86 deletions(-) diff --git a/src/ground_object.c b/src/ground_object.c index 7a5ccefa6..73efeb265 100644 --- a/src/ground_object.c +++ b/src/ground_object.c @@ -688,93 +688,26 @@ s32 sub_80AC4C8(s32 index, PixelPos *a0, PixelPos *a1) { return -1; } +s32 sub_80AC554(s32 flag, PixelPos *param_2,PixelPos *param_3) +{ + s32 i; + GroundObject *parent; + + parent = &gGroundObjects[0]; + for(i = 0; i < 0x10; i = (s16)(i + 1), parent++) { + if ((parent->unk6 != -1)) + { + if((parent->flags & flag)) { + PixelPos pos = {(parent->unk124).x + (parent->unk14).x, (parent->unk124).y + (parent->unk14).y}; + if ((pos.x < param_3->x) && (((pos.x > param_2->x)))) + if(((pos.y < param_3->y)) && (pos.y > param_2->y)) { + return i; + } + } + } -// https://decomp.me/scratch/VEJ5Z (96.09% matched) -NAKED -s32 sub_80AC554(s32 flag, PixelPos *param_2, PixelPos *param_3) { - asm_unified( - "\tpush {r4-r7,lr}\n" - "\tmov r7, r10\n" - "\tmov r6, r9\n" - "\tmov r5, r8\n" - "\tpush {r5-r7}\n" - "\tmov r8, r0\n" - "\tmov r10, r1\n" - "\tadds r4, r2, 0\n" - "\tldr r0, _080AC5C8\n" - "\tldr r0, [r0]\n" - "\tmov r12, r0\n" - "\tmovs r6, 0\n" - "\tmovs r0, 0x1\n" - "\tnegs r0, r0\n" - "\tmov r9, r0\n" - "\tmovs r7, 0x80\n" - "\tlsls r7, 9\n" -"_080AC576:\n" - "\tmov r1, r12\n" - "\tmovs r2, 0x6\n" - "\tldrsh r0, [r1, r2]\n" - "\tcmp r0, r9\n" - "\tbeq _080AC5CC\n" - "\tmovs r0, 0x8E\n" - "\tlsls r0, 1\n" - "\tadd r0, r12\n" - "\tldr r0, [r0]\n" - "\tmov r5, r8\n" - "\tands r0, r5\n" - "\tcmp r0, 0\n" - "\tbeq _080AC5CC\n" - "\tmovs r0, 0x92\n" - "\tlsls r0, 1\n" - "\tadd r0, r12\n" - "\tldr r1, [r0]\n" - "\tmov r5, r12\n" - "\tldr r0, [r5, 0x14]\n" - "\tadds r2, r1, r0\n" - "\tmovs r0, 0x94\n" - "\tlsls r0, 1\n" - "\tadd r0, r12\n" - "\tldr r1, [r0]\n" - "\tldr r0, [r5, 0x18]\n" - "\tadds r3, r1, r0\n" - "\tldr r0, [r4]\n" - "\tcmp r2, r0\n" - "\tbge _080AC5CC\n" - "\tmov r1, r10\n" - "\tldr r0, [r1]\n" - "\tcmp r2, r0\n" - "\tble _080AC5CC\n" - "\tldr r0, [r4, 0x4]\n" - "\tcmp r3, r0\n" - "\tbge _080AC5CC\n" - "\tldr r0, [r1, 0x4]\n" - "\tcmp r3, r0\n" - "\tble _080AC5CC\n" - "\tadds r0, r6, 0\n" - "\tb _080AC5E4\n" - "\t.align 2, 0\n" -"_080AC5C8: .4byte gGroundObjects\n" -"_080AC5CC:\n" - "\tadds r0, r7, 0\n" - "\tmovs r2, 0x80\n" - "\tlsls r2, 9\n" - "\tadds r7, r2\n" - "\tasrs r6, r0, 16\n" - "\tmovs r5, 0xE2\n" - "\tlsls r5, 1\n" - "\tadd r12, r5\n" - "\tcmp r6, 0xF\n" - "\tble _080AC576\n" - "\tmovs r0, 0x1\n" - "\tnegs r0, r0\n" -"_080AC5E4:\n" - "\tpop {r3-r5}\n" - "\tmov r8, r3\n" - "\tmov r9, r4\n" - "\tmov r10, r5\n" - "\tpop {r4-r7}\n" - "\tpop {r1}\n" - "\tbx r1"); + } + return -1; } bool8 CheckMapCollision_80A585C(PixelPos *, PixelPos *); From 5157ca6e5c0aab34d3b7ecd3ac625978fcd9c06b Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Sun, 22 Jun 2025 14:41:29 -0700 Subject: [PATCH 07/11] Address review comments --- src/ground_object.c | 2 +- src/ground_script.c | 25 ------------------------- 2 files changed, 1 insertion(+), 26 deletions(-) diff --git a/src/ground_object.c b/src/ground_object.c index 73efeb265..02cd9bf9b 100644 --- a/src/ground_object.c +++ b/src/ground_object.c @@ -171,7 +171,7 @@ static const struct ScriptCommand gUnknown_8118350[] = { }; const s16 gUnknown_81183A0[] = { -0xFFFF, +-1, 0x800, 0x801, 0x1000, diff --git a/src/ground_script.c b/src/ground_script.c index f67de6249..a8aec2b14 100644 --- a/src/ground_script.c +++ b/src/ground_script.c @@ -139,31 +139,6 @@ extern void sub_809AB4C(s32, s32); extern void sub_809ABB4(s32, s32); extern void sub_809AC18(s32, s32); extern s16 sub_80A8BBC(s32 id_); -extern char gUnknown_81165D4[]; -extern char gUnknown_81165F4[]; -extern char gUnknown_811660C[]; -extern char gUnknown_8116628[]; -extern char gUnknown_8116644[]; -extern char gUnknown_8116664[]; -extern char gUnknown_8116684[]; -extern char gUnknown_81166C0[]; -extern char gUnknown_81166D8[]; - -extern const CallbackData gGroundScriptTriggerCallbacks; -extern DebugLocation gUnknown_81166B4; -extern DebugLocation gUnknown_81166F8; -extern DebugLocation gUnknown_8116704; - -extern const DebugLocation gUnknown_8116588; -extern const DebugLocation gUnknown_8116538; -extern const DebugLocation gUnknown_8116560; -extern u8 gUnknown_8116594[]; -extern u8 gUnknown_8116544[]; -extern u8 gUnknown_811656C[]; - -extern DebugLocation gUnknown_81165C8; - -extern u8 gUnknown_8116848[]; bool8 GroundLivesNotifyAll(s16); bool8 GroundObjectsNotifyAll(s16); From ee3eb67bbaa34e170d87f595592ee2df0e852d3a Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Sun, 22 Jun 2025 16:05:33 -0700 Subject: [PATCH 08/11] finish moving ground object data --- data/data_8115F5C_1.s | 17 +---------------- src/ground_object.c | 21 ++++++++++----------- 2 files changed, 11 insertions(+), 27 deletions(-) diff --git a/data/data_8115F5C_1.s b/data/data_8115F5C_1.s index f136dea21..c2043e91e 100644 --- a/data/data_8115F5C_1.s +++ b/data/data_8115F5C_1.s @@ -2,22 +2,7 @@ .align 2 -.global GroundObject_Action_Text -GroundObject_Action_Text: @ Action -.string "GroundObject_Action\0" -.align 2,0 - -.global gUnknown_8118524 -gUnknown_8118524: @ 8118524 -.4byte gUnknown_8118334 -.4byte 0x60D -.4byte GroundObject_Action_Text - -.global gUnknown_8118530 -gUnknown_8118530: @ 8118530 -.4byte gUnknown_8118334 -.4byte 0x617 -.4byte GroundObject_Action_Text +@ ground_effect.c .string "pksdir0\0" .align 2,0 diff --git a/src/ground_object.c b/src/ground_object.c index 02cd9bf9b..b2f100549 100644 --- a/src/ground_object.c +++ b/src/ground_object.c @@ -104,8 +104,8 @@ static const CallbackData gGroundObjectCallbacks = { .func4C_spriteRelatedCheck = CallbackObjectSpriteRelatedCheck_80AC9B8, .func50_spriteRelated = CallbackObjectSpriteRelated_80AC9DC, }; -const u8 gUnknown_8118334[]; -#define FAKE_FILENAME gUnknown_8118334 +const u8 gGroundObjectFileName[]; +#define FAKE_FILENAME gGroundObjectFileName @@ -161,7 +161,7 @@ static const struct ScriptCommand gUnknown_81182F4[] = { WAIT(0x78), JUMP_LABEL(0), }; -ALIGNED(4) const u8 gUnknown_8118334[] = "../ground/ground_object.c"; +ALIGNED(4) const u8 gGroundObjectFileName[] = "../ground/ground_object.c"; static const struct ScriptCommand gUnknown_8118350[] = { DEBUGINFO, // Needs to be line 166 { 0x54, 0, 1, 0, 0, NULL }, @@ -247,7 +247,7 @@ void GroundObject_Select(s32 scriptID, s32 group, s32 sector) scriptID_s32 = (s16)scriptID; group_s32 = (s16)group; sector_s32 = (s8)sector; - scriptPtr = GetGroundScript(scriptID_s32, DEBUG_LOC_PTR(gUnknown_8118334, 0x126, "GroundObject_Select")); + scriptPtr = GetGroundScript(scriptID_s32, DEBUG_LOC_PTR(gGroundObjectFileName, 0x126, "GroundObject_Select")); Log(0,"GroundObject Select %3d %3d %3d", scriptID_s32, group_s32, sector_s32); groupPtr = &scriptPtr->groups[group_s32]; @@ -485,7 +485,7 @@ s32 GroundObject_Add(s32 id_,const GroundObjectData *objectData,s32 group_,s32 s if (objectData->scripts[0] != NULL) { SetPredefinedScript(&parent->unk38,0,objectData->scripts[0]); - ExecutePredefinedScript(&parent->unk38,NULL,0,DEBUG_LOC_PTR(gUnknown_8118334, 0x283, "GroundObject_Add")); + ExecutePredefinedScript(&parent->unk38,NULL,0,DEBUG_LOC_PTR(gGroundObjectFileName, 0x283, "GroundObject_Add")); } return id; } @@ -564,7 +564,7 @@ bool8 GroundObject_ExecuteScript(s32 index_, void *a1, ScriptInfoSmall *script) if(parent->unk6 != -1) { - GroundScript_ExecutePP(&parent->unk38, (ActionUnkIds *)a1, script, DEBUG_LOC_PTR(gUnknown_8118334, 0x303, "GroundObject_ExecuteScript")); + GroundScript_ExecutePP(&parent->unk38, (ActionUnkIds *)a1, script, DEBUG_LOC_PTR(gGroundObjectFileName, 0x303, "GroundObject_ExecuteScript")); parent->directionRelated = 1; return 1; } @@ -996,26 +996,25 @@ static s32 CallbackObjectMoveRelative(void *livesPtr_, PixelPos *pos) return TryMoveRelative_80AC720(livesPtr, pos); } -extern DebugLocation gUnknown_8118524; -extern DebugLocation gUnknown_8118530; extern s16 HandleAction(Action *action, DebugLocation *debug); void GroundObject_Action(void) { GroundObject *objectPtr; s32 i; + s32 ret; for (objectPtr = &gGroundObjects[0], i = 0; i < 0x10; i = (s16)(i + 1), objectPtr++) { if (objectPtr->unk6 != -1) { - - switch(HandleAction(&objectPtr->unk38, &gUnknown_8118524)) + ret = HandleAction(&objectPtr->unk38, DEBUG_LOC_PTR(gGroundObjectFileName, 0x60D, "GroundObject_Action")); + switch(ret) { case 4: GroundObject_Delete(i); continue; case 0: - ExecutePredefinedScript(&objectPtr->unk38, NULL, 1, &gUnknown_8118530); + ExecutePredefinedScript(&objectPtr->unk38, NULL, 1, DEBUG_LOC_PTR(gGroundObjectFileName, 0x617, "GroundObject_Action")); break; } From fc0c2181247f53eae68e8dadae0cc1669a9c5e47 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Wed, 25 Jun 2025 20:48:50 -0700 Subject: [PATCH 09/11] nonmatch sub_80ACAD4 for now --- asm/ground_object.s | 106 -------------------------------------------- ld_script.ld | 1 - src/ground_object.c | 103 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 103 insertions(+), 107 deletions(-) delete mode 100644 asm/ground_object.s diff --git a/asm/ground_object.s b/asm/ground_object.s deleted file mode 100644 index 06a2ffe4e..000000000 --- a/asm/ground_object.s +++ /dev/null @@ -1,106 +0,0 @@ - #include "asm/constants/gba_constants.inc" - #include "asm/macros.inc" - - .syntax unified - - .text - - - thumb_func_start sub_80ACAD4 -sub_80ACAD4: - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - sub sp, 0x8 - ldr r0, _080ACB8C - ldr r6, [r0] - movs r0, 0 - mov r8, r0 - movs r1, 0x1 - negs r1, r1 - mov r9, r1 - movs r2, 0x90 - lsls r2, 1 - adds r4, r6, r2 -_080ACAF2: - movs r0, 0x6 - ldrsh r1, [r6, r0] - mov r2, r9 - lsls r0, r2, 16 - asrs r0, 16 - cmp r1, r0 - beq _080ACB64 - ldr r0, [r4, 0x4] - ldr r1, [r6, 0x14] - adds r0, r1 - str r0, [sp] - ldr r0, [r4, 0x8] - ldr r1, [r6, 0x18] - adds r0, r1 - str r0, [sp, 0x4] - ldr r1, [r4, 0x14] - ldr r0, [r4, 0x18] - adds r7, r1, r0 - movs r0, 0xA2 - lsls r0, 1 - adds r5, r6, r0 - adds r0, r5, 0 - bl sub_80A66D4 - lsls r0, 24 - cmp r0, 0 - beq _080ACB40 - movs r0, 0 - strb r0, [r4, 0x1C] - ldrh r2, [r4, 0x1E] - movs r0, 0xF8 - lsls r0, 5 - adds r1, r0, 0 - ands r1, r2 - lsls r2, 24 - asrs r2, 24 - adds r0, r5, 0 - bl sub_80A6EFC -_080ACB40: - movs r1, 0x20 - ldrsh r0, [r4, r1] - cmp r0, 0 - beq _080ACB5A - adds r1, r0, 0 - movs r2, 0 - ldrsb r2, [r4, r2] - adds r0, r5, 0 - movs r3, 0 - bl sub_80A7040 - movs r0, 0 - strh r0, [r4, 0x20] -_080ACB5A: - adds r0, r5, 0 - mov r1, sp - adds r2, r7, 0 - bl sub_80A7664 -_080ACB64: - mov r0, r8 - adds r0, 0x1 - lsls r0, 16 - asrs r0, 16 - mov r8, r0 - movs r0, 0xE2 - lsls r0, 1 - adds r4, r0 - adds r6, r0 - mov r1, r8 - cmp r1, 0xF - ble _080ACAF2 - add sp, 0x8 - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_080ACB8C: .4byte gGroundObjects - thumb_func_end sub_80ACAD4 - - .align 2,0 diff --git a/ld_script.ld b/ld_script.ld index 54961e824..570af83c7 100755 --- a/ld_script.ld +++ b/ld_script.ld @@ -356,7 +356,6 @@ SECTIONS { src/ground_script_file.o(.text); src/ground_lives.o(.text); src/ground_object.o(.text); - asm/ground_object.o(.text); src/ground_effect.o(.text); asm/ground_effect.o(.text); src/ground_link.o(.text); diff --git a/src/ground_object.c b/src/ground_object.c index b2f100549..d4cd994c7 100644 --- a/src/ground_object.c +++ b/src/ground_object.c @@ -1025,3 +1025,106 @@ void GroundObject_Action(void) } } } + +void sub_80A7664(struct UnkGroundSpriteStruct *ptr, PixelPos *pixelPos, s32 a2); +extern bool8 sub_80A66D4(struct UnkGroundSpriteStruct *ptr); + +// https://decomp.me/scratch/QjggT - 94.61% matched (Seth) +NAKED +void sub_80ACAD4(void) { + asm_unified( + "\tpush {r4-r7,lr}\n" + "\tmov r7, r9\n" + "\tmov r6, r8\n" + "\tpush {r6,r7}\n" + "\tsub sp, 0x8\n" + "\tldr r0, _080ACB8C\n" + "\tldr r6, [r0]\n" + "\tmovs r0, 0\n" + "\tmov r8, r0\n" + "\tmovs r1, 0x1\n" + "\tnegs r1, r1\n" + "\tmov r9, r1\n" + "\tmovs r2, 0x90\n" + "\tlsls r2, 1\n" + "\tadds r4, r6, r2\n" +"_080ACAF2:\n" + "\tmovs r0, 0x6\n" + "\tldrsh r1, [r6, r0]\n" + "\tmov r2, r9\n" + "\tlsls r0, r2, 16\n" + "\tasrs r0, 16\n" + "\tcmp r1, r0\n" + "\tbeq _080ACB64\n" + "\tldr r0, [r4, 0x4]\n" + "\tldr r1, [r6, 0x14]\n" + "\tadds r0, r1\n" + "\tstr r0, [sp]\n" + "\tldr r0, [r4, 0x8]\n" + "\tldr r1, [r6, 0x18]\n" + "\tadds r0, r1\n" + "\tstr r0, [sp, 0x4]\n" + "\tldr r1, [r4, 0x14]\n" + "\tldr r0, [r4, 0x18]\n" + "\tadds r7, r1, r0\n" + "\tmovs r0, 0xA2\n" + "\tlsls r0, 1\n" + "\tadds r5, r6, r0\n" + "\tadds r0, r5, 0\n" + "\tbl sub_80A66D4\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbeq _080ACB40\n" + "\tmovs r0, 0\n" + "\tstrb r0, [r4, 0x1C]\n" + "\tldrh r2, [r4, 0x1E]\n" + "\tmovs r0, 0xF8\n" + "\tlsls r0, 5\n" + "\tadds r1, r0, 0\n" + "\tands r1, r2\n" + "\tlsls r2, 24\n" + "\tasrs r2, 24\n" + "\tadds r0, r5, 0\n" + "\tbl sub_80A6EFC\n" +"_080ACB40:\n" + "\tmovs r1, 0x20\n" + "\tldrsh r0, [r4, r1]\n" + "\tcmp r0, 0\n" + "\tbeq _080ACB5A\n" + "\tadds r1, r0, 0\n" + "\tmovs r2, 0\n" + "\tldrsb r2, [r4, r2]\n" + "\tadds r0, r5, 0\n" + "\tmovs r3, 0\n" + "\tbl sub_80A7040\n" + "\tmovs r0, 0\n" + "\tstrh r0, [r4, 0x20]\n" +"_080ACB5A:\n" + "\tadds r0, r5, 0\n" + "\tmov r1, sp\n" + "\tadds r2, r7, 0\n" + "\tbl sub_80A7664\n" +"_080ACB64:\n" + "\tmov r0, r8\n" + "\tadds r0, 0x1\n" + "\tlsls r0, 16\n" + "\tasrs r0, 16\n" + "\tmov r8, r0\n" + "\tmovs r0, 0xE2\n" + "\tlsls r0, 1\n" + "\tadds r4, r0\n" + "\tadds r6, r0\n" + "\tmov r1, r8\n" + "\tcmp r1, 0xF\n" + "\tble _080ACAF2\n" + "\tadd sp, 0x8\n" + "\tpop {r3,r4}\n" + "\tmov r8, r3\n" + "\tmov r9, r4\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" +"_080ACB8C: .4byte gGroundObjects"); +} + From db7e5fb6734af895decbfdd0e643fcd6660a06d5 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Sat, 28 Jun 2025 11:18:21 -0700 Subject: [PATCH 10/11] Match sub_80ACAD4 thanks to @DizzyEggg --- src/ground_object.c | 121 +++++++++----------------------------------- 1 file changed, 23 insertions(+), 98 deletions(-) diff --git a/src/ground_object.c b/src/ground_object.c index d4cd994c7..9e50ce456 100644 --- a/src/ground_object.c +++ b/src/ground_object.c @@ -1029,102 +1029,27 @@ void GroundObject_Action(void) void sub_80A7664(struct UnkGroundSpriteStruct *ptr, PixelPos *pixelPos, s32 a2); extern bool8 sub_80A66D4(struct UnkGroundSpriteStruct *ptr); -// https://decomp.me/scratch/QjggT - 94.61% matched (Seth) -NAKED -void sub_80ACAD4(void) { - asm_unified( - "\tpush {r4-r7,lr}\n" - "\tmov r7, r9\n" - "\tmov r6, r8\n" - "\tpush {r6,r7}\n" - "\tsub sp, 0x8\n" - "\tldr r0, _080ACB8C\n" - "\tldr r6, [r0]\n" - "\tmovs r0, 0\n" - "\tmov r8, r0\n" - "\tmovs r1, 0x1\n" - "\tnegs r1, r1\n" - "\tmov r9, r1\n" - "\tmovs r2, 0x90\n" - "\tlsls r2, 1\n" - "\tadds r4, r6, r2\n" -"_080ACAF2:\n" - "\tmovs r0, 0x6\n" - "\tldrsh r1, [r6, r0]\n" - "\tmov r2, r9\n" - "\tlsls r0, r2, 16\n" - "\tasrs r0, 16\n" - "\tcmp r1, r0\n" - "\tbeq _080ACB64\n" - "\tldr r0, [r4, 0x4]\n" - "\tldr r1, [r6, 0x14]\n" - "\tadds r0, r1\n" - "\tstr r0, [sp]\n" - "\tldr r0, [r4, 0x8]\n" - "\tldr r1, [r6, 0x18]\n" - "\tadds r0, r1\n" - "\tstr r0, [sp, 0x4]\n" - "\tldr r1, [r4, 0x14]\n" - "\tldr r0, [r4, 0x18]\n" - "\tadds r7, r1, r0\n" - "\tmovs r0, 0xA2\n" - "\tlsls r0, 1\n" - "\tadds r5, r6, r0\n" - "\tadds r0, r5, 0\n" - "\tbl sub_80A66D4\n" - "\tlsls r0, 24\n" - "\tcmp r0, 0\n" - "\tbeq _080ACB40\n" - "\tmovs r0, 0\n" - "\tstrb r0, [r4, 0x1C]\n" - "\tldrh r2, [r4, 0x1E]\n" - "\tmovs r0, 0xF8\n" - "\tlsls r0, 5\n" - "\tadds r1, r0, 0\n" - "\tands r1, r2\n" - "\tlsls r2, 24\n" - "\tasrs r2, 24\n" - "\tadds r0, r5, 0\n" - "\tbl sub_80A6EFC\n" -"_080ACB40:\n" - "\tmovs r1, 0x20\n" - "\tldrsh r0, [r4, r1]\n" - "\tcmp r0, 0\n" - "\tbeq _080ACB5A\n" - "\tadds r1, r0, 0\n" - "\tmovs r2, 0\n" - "\tldrsb r2, [r4, r2]\n" - "\tadds r0, r5, 0\n" - "\tmovs r3, 0\n" - "\tbl sub_80A7040\n" - "\tmovs r0, 0\n" - "\tstrh r0, [r4, 0x20]\n" -"_080ACB5A:\n" - "\tadds r0, r5, 0\n" - "\tmov r1, sp\n" - "\tadds r2, r7, 0\n" - "\tbl sub_80A7664\n" -"_080ACB64:\n" - "\tmov r0, r8\n" - "\tadds r0, 0x1\n" - "\tlsls r0, 16\n" - "\tasrs r0, 16\n" - "\tmov r8, r0\n" - "\tmovs r0, 0xE2\n" - "\tlsls r0, 1\n" - "\tadds r4, r0\n" - "\tadds r6, r0\n" - "\tmov r1, r8\n" - "\tcmp r1, 0xF\n" - "\tble _080ACAF2\n" - "\tadd sp, 0x8\n" - "\tpop {r3,r4}\n" - "\tmov r8, r3\n" - "\tmov r9, r4\n" - "\tpop {r4-r7}\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.align 2, 0\n" -"_080ACB8C: .4byte gGroundObjects"); -} +void sub_80ACAD4(void) +{ + GroundObject *objectPtr; + int i; + // s16 memes + s32 minus1; + for (objectPtr = &gGroundObjects[0], i = 0, minus1 = -1; i < 0x10; i = (s16)(i + 1), objectPtr++) { + minus1 = (s16) minus1; + if (objectPtr->unk6 != (s16) minus1) { + PixelPos pos = {objectPtr->unk124.x + (objectPtr->unk14).x, objectPtr->unk124.y + (objectPtr->unk14).y}; + s32 num = objectPtr->unk134.x + objectPtr->unk134.y; + if ((sub_80A66D4(&objectPtr->unk144))) { + objectPtr->directionRelated = 0; + sub_80A6EFC(&objectPtr->unk144,objectPtr->unk13E & 0x1f00,(s8)objectPtr->unk13E); + } + if (objectPtr->unk140 != 0) { + sub_80A7040(&objectPtr->unk144,objectPtr->unk140,objectPtr->direction,0); + objectPtr->unk140 = 0; + } + sub_80A7664(&objectPtr->unk144,&pos,num); + } + } +} From 25d68e40c8a4b95c84ab0083b3b45208661cb950 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Sat, 28 Jun 2025 11:52:25 -0700 Subject: [PATCH 11/11] Little more documentation --- src/ground_lives.c | 10 +-- src/ground_object.c | 152 ++++++++++++++++++++++---------------------- src/ground_script.c | 4 +- 3 files changed, 83 insertions(+), 83 deletions(-) diff --git a/src/ground_lives.c b/src/ground_lives.c index f5bd30138..aa988ff48 100644 --- a/src/ground_lives.c +++ b/src/ground_lives.c @@ -114,7 +114,7 @@ extern void sub_80A6EC8(struct UnkGroundSpriteStruct *ptr, 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); -extern void sub_80AC3E0(s32 id, s32 *a1); +extern void GroundObject_GetFlags(s32 id, s32 *a1); extern PixelPos SetVecFromDirectionSpeed(s32 r1, u32 r2); extern u8 sub_80A5934(s32 param_1, PixelPos *, PixelPos *); extern bool8 CheckMapCollision_80A585C(PixelPos *, PixelPos *); @@ -123,7 +123,7 @@ extern s32 sub_80AC4C8(u32 a0, PixelPos *, PixelPos *); extern bool8 sub_809B1C0(s32 a0, u32 kind, Pokemon *a2); extern bool8 GetPredefinedScript(Action *param_1, ScriptInfoSmall *script, s32 _index); extern bool8 sub_809D678(Action *action); -extern bool8 sub_80AC274(s32 a0, ScriptInfoSmall *scriptInfo, s32 a2); +extern bool8 GroundObject_GetScript(s32 a0, ScriptInfoSmall *scriptInfo, s32 a2); extern void GroundObject_ExecuteScript(s32, void *, ScriptInfoSmall *); extern bool8 sub_80ADC64(s32 id, ScriptInfoSmall *dst); extern bool8 GroundScriptNotify(Action *param_1, s32 param_2); @@ -1132,11 +1132,11 @@ bool8 sub_80A8A5C(s32 id1_, s32 id2_) ScriptInfoSmall scriptInfo1; struct GroundLive *livesPtr1 = &gGroundLives->array[id1]; - if (sub_80AC274(id2, &scriptInfo1, 2)) { + if (GroundObject_GetScript(id2, &scriptInfo1, 2)) { ScriptInfoSmall scriptInfo2; ActionUnkIds sp = {2, id2}; - sub_80AC274(id2, &scriptInfo2, 3); + GroundObject_GetScript(id2, &scriptInfo2, 3); GroundObject_ExecuteScript(id2, &livesPtr1->action.unk8, &scriptInfo2); return _ExecutePlayerScript(livesPtr1, &sp, &scriptInfo1); } @@ -1695,7 +1695,7 @@ s32 sub_80A95AC(struct GroundLive *livesPtr, PixelPos *posArg1, PixelPos *posArg if (id2 >= 0) { s32 sp; - sub_80AC3E0(id2, &sp); + GroundObject_GetFlags(id2, &sp); if ((sp & 0x40) && sub_80A8A5C(livesPtr->id, id2)) return 2; return 1; diff --git a/src/ground_object.c b/src/ground_object.c index 9e50ce456..5256462ed 100644 --- a/src/ground_object.c +++ b/src/ground_object.c @@ -12,17 +12,17 @@ typedef struct GroundObject { // size: 0x1C4 u8 unk0[4]; s16 id; - s16 unk6; // kind - s16 unk8; // scriptID / group - s8 unkA; // sector - u8 unkB; + s16 kind; // kind + s16 group; // scriptID / group + s8 sector; // sector + u8 unused; PixelPos unkC; PixelPos unk14; - s8 unk1C; + s8 direction1; PixelPos unk20; PixelPos unk28; PixelPos unk30; - Action unk38; + Action action; u32 flags; s8 direction; PixelPos unk124; @@ -35,6 +35,7 @@ typedef struct GroundObject { } GroundObject; IWRAM_INIT GroundObject *gGroundObjects = NULL; +#define NUM_GROUND_OBJECTS 0x10 struct GroundObjectTypeData { @@ -152,7 +153,6 @@ const u8 gGroundObjectFileName[]; - static const struct ScriptCommand gUnknown_81182F4[] = { @@ -202,11 +202,11 @@ void AllocGroundObjects(void) GroundObject *ptr; s32 index; - gGroundObjects = MemoryAlloc(sizeof(GroundObject) * 0x10, 6); + gGroundObjects = MemoryAlloc(sizeof(GroundObject) * NUM_GROUND_OBJECTS, 6); - for(index = 0, ptr = &gGroundObjects[index]; index < 0x10; index = (s16)(index + 1), ptr++) + for(index = 0, ptr = &gGroundObjects[index]; index < NUM_GROUND_OBJECTS; index = (s16)(index + 1), ptr++) { - ptr->unk6 |= -1; + ptr->kind |= -1; } DeleteGroundObjects(); } @@ -217,9 +217,9 @@ void DeleteGroundObjects(void) s32 index; ptr = &gGroundObjects[0]; - for(index = 0; index < 0x10; index = (s16)(index + 1), ptr++) + for(index = 0; index < NUM_GROUND_OBJECTS; index = (s16)(index + 1), ptr++) { - if(ptr->unk6 != -1) + if(ptr->kind != -1) GroundObject_Delete(index); } } @@ -276,10 +276,10 @@ void GroundObject_Cancel(s32 scriptID, s32 sector) index = 0; ptr = &gGroundObjects[0]; - for(; index < 0x10; index = (s16)(index + 1), ptr++) + for(; index < NUM_GROUND_OBJECTS; index = (s16)(index + 1), ptr++) { - if((ptr->unk6 != -1) && (ptr->unk8 == scriptID_s32)) - if(sector_s32 < 0 || ptr->unkA == sector_s32) + if((ptr->kind != -1) && (ptr->group == scriptID_s32)) + if(sector_s32 < 0 || ptr->sector == sector_s32) GroundObject_Delete(index); } } @@ -294,9 +294,9 @@ void GroundObject_CancelBlank(void) index = 0; ptr = &gGroundObjects[0]; - for(; index < 0x10; index = (s16)(index + 1), ptr++) + for(; index < NUM_GROUND_OBJECTS; index = (s16)(index + 1), ptr++) { - if(ptr->unk6 != -1) + if(ptr->kind != -1) { stack.x = ptr->unk124.x + ptr->unk14.x; stack.y = ptr->unk124.y + ptr->unk14.y; @@ -306,18 +306,18 @@ void GroundObject_CancelBlank(void) } } -s32 sub_80ABD48(s32 r0) +static s32 GroundObject_Find(s32 kind) { s32 index; GroundObject *ptr; - s32 r0_s32 = (s16)r0; + s32 kind_s32 = (s16)kind; index = 0; ptr = &gGroundObjects[0]; - for(; index < 0x10; index = (s16)(index + 1), ptr++) + for(; index < NUM_GROUND_OBJECTS; index = (s16)(index + 1), ptr++) { - if(ptr->unk6 == r0_s32) return index; + if(ptr->kind == kind_s32) return index; } return -1; @@ -368,15 +368,15 @@ s32 GroundObject_Add(s32 id_,const GroundObjectData *objectData,s32 group_,s32 s { case 0xD: case 0xE: - id = sub_80ABD48(kind); + id = GroundObject_Find(kind); break; } if (id < 0) { - for(index = 0, parent = gGroundObjects; index < 0x10; index = (s16)(index + 1), parent++) + for(index = 0, parent = gGroundObjects; index < NUM_GROUND_OBJECTS; index = (s16)(index + 1), parent++) { - if(parent->unk6 == -1) + if(parent->kind == -1) { id = index; break; @@ -390,11 +390,11 @@ s32 GroundObject_Add(s32 id_,const GroundObjectData *objectData,s32 group_,s32 s } parent = &gGroundObjects[id]; Log(0,"GroundObject Add id %3d kind %3d[%3d] type %3d group %3d sector %3d",id,kind,objectData->kind,typeDataPtr->unk0,group,sector); - bVar12 = (parent->unk6 == -1); + bVar12 = (parent->kind == -1); parent->id = id; - parent->unk6 = kind; - parent->unk8 = group; - parent->unkA = sector; + parent->kind = kind; + parent->group = group; + parent->sector = sector; switch(typeDataPtr->unk0) { case 1: case 0xB: @@ -453,12 +453,12 @@ s32 GroundObject_Add(s32 id_,const GroundObjectData *objectData,s32 group_,s32 s parent->unk14.x = parent->unkC.x / 2; parent->unk14.y = parent->unkC.y / 2; - parent->unk1C = objectData->unk1; + parent->direction1 = objectData->unk1; SetUnkInGroundEvent(&objectData->pos, &parent->unk20); if (bVar12) { - parent->direction = parent->unk1C; + parent->direction = parent->direction1; parent->unk124.x = parent->unk20.x - parent->unk14.x; parent->unk12C.x = parent->unk20.x + parent->unk14.x; parent->unk124.y = parent->unk20.y - parent->unk14.y; @@ -470,22 +470,22 @@ s32 GroundObject_Add(s32 id_,const GroundObjectData *objectData,s32 group_,s32 s parent->unk13E = 0x800; parent->directionRelated = 1; parent->unk140 = 0; - sub_80A75CC(&(parent->unk144),id,parent->unk6, parent->flags); + sub_80A75CC(&(parent->unk144),id,parent->kind, parent->flags); } - InitActionWithParams(&parent->unk38,&gGroundObjectCallbacks,parent,group,sector); + InitActionWithParams(&parent->action,&gGroundObjectCallbacks,parent,group,sector); // What an ugly way of coding that... - SetPredefinedScript(&parent->unk38,1, (objectData->scripts[1] != NULL) ? objectData->scripts[1] + SetPredefinedScript(&parent->action,1, (objectData->scripts[1] != NULL) ? objectData->scripts[1] : (SpriteHasPokemonSize_80A66A4(&parent->unk144)) ? gUnknown_8118350 : gUnknown_81182F4); - SetPredefinedScript(&parent->unk38,2,(objectData->scripts[2] != NULL) ? objectData->scripts[2] + SetPredefinedScript(&parent->action,2,(objectData->scripts[2] != NULL) ? objectData->scripts[2] : gFunctionScriptTable[4].script); - SetPredefinedScript(&parent->unk38,3,(objectData->scripts[3] != NULL) ? objectData->scripts[3] + SetPredefinedScript(&parent->action,3,(objectData->scripts[3] != NULL) ? objectData->scripts[3] : gFunctionScriptTable[8].script); if (objectData->scripts[0] != NULL) { - SetPredefinedScript(&parent->unk38,0,objectData->scripts[0]); - ExecutePredefinedScript(&parent->unk38,NULL,0,DEBUG_LOC_PTR(gGroundObjectFileName, 0x283, "GroundObject_Add")); + SetPredefinedScript(&parent->action,0,objectData->scripts[0]); + ExecutePredefinedScript(&parent->action,NULL,0,DEBUG_LOC_PTR(gGroundObjectFileName, 0x283, "GroundObject_Add")); } return id; } @@ -499,8 +499,8 @@ void GroundObject_Delete(s32 index_) { Log(0, "GroundObject Delete id %3d", index); sub_80A7658(&parent->unk144); - InitAction2(&parent->unk38); - parent->unk6 = -1; + InitAction2(&parent->action); + parent->kind = -1; } void sub_80AC1B0(s32 index_, s32 flag) @@ -508,7 +508,7 @@ void sub_80AC1B0(s32 index_, s32 flag) s32 index = (s16)index_; GroundObject *parent = &gGroundObjects[index]; - if(parent->unk6 != -1) + if(parent->kind != -1) { parent->flags |= flag; sub_80A6688(&parent->unk144, parent->flags); @@ -520,20 +520,20 @@ void sub_80AC1F4(s32 index_, s32 flag) s32 index = (s16)index_; GroundObject *parent = &gGroundObjects[index]; - if(parent->unk6 != -1) + if(parent->kind != -1) { parent->flags &= (0x337fffff ^ flag); sub_80A6688(&parent->unk144, parent->flags); } } -Action *sub_80AC240(s32 index_) +Action *GroundObject_GetAction(s32 index_) { s32 index = (s16)index_; GroundObject *parent = &gGroundObjects[index]; - if(parent->unk6 != -1) - return &parent->unk38; + if(parent->kind != -1) + return &parent->action; else return NULL; } @@ -541,14 +541,14 @@ Action *sub_80AC240(s32 index_) extern bool8 GetPredefinedScript(Action *param_1, ScriptInfoSmall *script, s32 _index); -bool8 sub_80AC274(s32 index_, ScriptInfoSmall *scriptInfo, s32 a2_) +bool8 GroundObject_GetScript(s32 index_, ScriptInfoSmall *scriptInfo, s32 a2_) { s32 index = (s16)index_; s32 a2 = (s16)a2_; GroundObject *parent = &gGroundObjects[index]; - if(parent->unk6 != -1) - return GetPredefinedScript(&parent->unk38, scriptInfo, a2); + if(parent->kind != -1) + return GetPredefinedScript(&parent->action, scriptInfo, a2); else return FALSE; } @@ -562,9 +562,9 @@ bool8 GroundObject_ExecuteScript(s32 index_, void *a1, ScriptInfoSmall *script) Log(0, "GroundObject Execute %3d ", index); - if(parent->unk6 != -1) + if(parent->kind != -1) { - GroundScript_ExecutePP(&parent->unk38, (ActionUnkIds *)a1, script, DEBUG_LOC_PTR(gGroundObjectFileName, 0x303, "GroundObject_ExecuteScript")); + GroundScript_ExecutePP(&parent->action, (ActionUnkIds *)a1, script, DEBUG_LOC_PTR(gGroundObjectFileName, 0x303, "GroundObject_ExecuteScript")); parent->directionRelated = 1; return 1; } @@ -580,10 +580,10 @@ bool8 GroundObjectsNotifyAll(s32 index_) GroundObject *parent = &gGroundObjects[0]; bool8 flag = FALSE; - for(counter = 0; counter < 0x10; counter = (s16)(counter + 1), parent++) + for(counter = 0; counter < NUM_GROUND_OBJECTS; counter = (s16)(counter + 1), parent++) { - if(parent->unk6 != -1) - flag |= GroundScriptNotify(&parent->unk38, index); + if(parent->kind != -1) + flag |= GroundScriptNotify(&parent->action, index); } return flag; @@ -595,10 +595,10 @@ bool8 GroundObjectsCancelAll(void) GroundObject *parent = &gGroundObjects[0]; bool8 flag = FALSE; - for(counter = 0; counter < 0x10; counter = (s16)(counter + 1), parent++) + for(counter = 0; counter < NUM_GROUND_OBJECTS; counter = (s16)(counter + 1), parent++) { - if(parent->unk6 != -1) - flag |= GroundScript_Cancel(&parent->unk38); + if(parent->kind != -1) + flag |= GroundScript_Cancel(&parent->action); } return flag; @@ -608,22 +608,22 @@ static UNUSED s16 sub_80AC3C0(s32 index_) { s32 index = (s16)index_; GroundObject *parent = &gGroundObjects[index]; - return parent->unk6; + return parent->kind; } -s16 sub_80AC3E0(s32 index_, s32 *a1) +s16 GroundObject_GetFlags(s32 index_, s32 *flags) { s32 index = (s16)index_; GroundObject *parent = &gGroundObjects[index]; - *a1 = parent->flags; - return parent->unk6; + *flags = parent->flags; + return parent->kind; } static UNUSED s16 sub_80AC408(s32 index_, PixelPos *a1) { s32 index = (s16)index_; GroundObject *parent = &gGroundObjects[index]; - if(parent->unk6 == -1) + if(parent->kind == -1) { a1->x = 0; a1->y = 0; @@ -632,7 +632,7 @@ static UNUSED s16 sub_80AC408(s32 index_, PixelPos *a1) { *a1 = parent->unkC; } - return parent->unk6; + return parent->kind; } s16 sub_80AC448(s32 index_, PixelPos *pos) @@ -640,7 +640,7 @@ s16 sub_80AC448(s32 index_, PixelPos *pos) s32 index = (s16)index_; GroundObject *parent = &gGroundObjects[index]; - if(parent->unk6 == -1) + if(parent->kind == -1) { pos->x = 0; pos->y = 0; @@ -650,7 +650,7 @@ s16 sub_80AC448(s32 index_, PixelPos *pos) pos->y = parent->unk124.y + parent->unk14.y; } - return parent->unk6; + return parent->kind; } extern s32 TryMoveObjectRelative_80AC6AC(GroundObject *, PixelPos *); @@ -663,16 +663,16 @@ s16 sub_80AC49C(s32 index_, PixelPos *pos) TryMoveObjectRelative_80AC6AC(parent, pos); - return parent->unk6; + return parent->kind; } s32 sub_80AC4C8(s32 index, PixelPos *a0, PixelPos *a1) { GroundObject *parent = &gGroundObjects[0]; s32 counter; - for(counter = 0; counter < 0x10; counter = (s16)(counter + 1), parent++) + for(counter = 0; counter < NUM_GROUND_OBJECTS; counter = (s16)(counter + 1), parent++) { - if(parent->unk6 != -1) + if(parent->kind != -1) { if(parent->flags & index) { @@ -694,8 +694,8 @@ s32 sub_80AC554(s32 flag, PixelPos *param_2,PixelPos *param_3) GroundObject *parent; parent = &gGroundObjects[0]; - for(i = 0; i < 0x10; i = (s16)(i + 1), parent++) { - if ((parent->unk6 != -1)) + for(i = 0; i < NUM_GROUND_OBJECTS; i = (s16)(i + 1), parent++) { + if ((parent->kind != -1)) { if((parent->flags & flag)) { PixelPos pos = {(parent->unk124).x + (parent->unk14).x, (parent->unk124).y + (parent->unk14).y}; @@ -838,10 +838,10 @@ static void CallbackObjectSetHitboxPos(void *objectPtr_, PixelPos *posOrNull) objectPtr->unk124.y = objectPtr->unk20.y - objectPtr->unk14.y; objectPtr->unk12C.y = objectPtr->unk20.y + objectPtr->unk14.y; objectPtr->unk134.x = objectPtr->unk134.y = 0; - if (objectPtr->direction != objectPtr->unk1C) { + if (objectPtr->direction != objectPtr->direction1) { objectPtr->directionRelated = TRUE; } - objectPtr->direction = objectPtr->unk1C; + objectPtr->direction = objectPtr->direction1; } } @@ -1004,17 +1004,17 @@ void GroundObject_Action(void) s32 i; s32 ret; - for (objectPtr = &gGroundObjects[0], i = 0; i < 0x10; i = (s16)(i + 1), objectPtr++) + for (objectPtr = &gGroundObjects[0], i = 0; i < NUM_GROUND_OBJECTS; i = (s16)(i + 1), objectPtr++) { - if (objectPtr->unk6 != -1) { - ret = HandleAction(&objectPtr->unk38, DEBUG_LOC_PTR(gGroundObjectFileName, 0x60D, "GroundObject_Action")); + if (objectPtr->kind != -1) { + ret = HandleAction(&objectPtr->action, DEBUG_LOC_PTR(gGroundObjectFileName, 0x60D, "GroundObject_Action")); switch(ret) { case 4: GroundObject_Delete(i); continue; case 0: - ExecutePredefinedScript(&objectPtr->unk38, NULL, 1, DEBUG_LOC_PTR(gGroundObjectFileName, 0x617, "GroundObject_Action")); + ExecutePredefinedScript(&objectPtr->action, NULL, 1, DEBUG_LOC_PTR(gGroundObjectFileName, 0x617, "GroundObject_Action")); break; } @@ -1036,9 +1036,9 @@ void sub_80ACAD4(void) // s16 memes s32 minus1; - for (objectPtr = &gGroundObjects[0], i = 0, minus1 = -1; i < 0x10; i = (s16)(i + 1), objectPtr++) { + for (objectPtr = &gGroundObjects[0], i = 0, minus1 = -1; i < NUM_GROUND_OBJECTS; i = (s16)(i + 1), objectPtr++) { minus1 = (s16) minus1; - if (objectPtr->unk6 != (s16) minus1) { + if (objectPtr->kind != (s16) minus1) { PixelPos pos = {objectPtr->unk124.x + (objectPtr->unk14).x, objectPtr->unk124.y + (objectPtr->unk14).y}; s32 num = objectPtr->unk134.x + objectPtr->unk134.y; if ((sub_80A66D4(&objectPtr->unk144))) { diff --git a/src/ground_script.c b/src/ground_script.c index a8aec2b14..d644af274 100644 --- a/src/ground_script.c +++ b/src/ground_script.c @@ -133,7 +133,7 @@ extern u8 GroundEffectsCancelAll(void); extern u8 GroundLivesCancelAll(void); extern u8 IsTextboxOpen_809A750(void); extern Action *sub_80A882C(s32); -extern Action *sub_80AC240(s32); +extern Action *GroundObject_GetAction(s32); extern Action *sub_80AD158(s32); extern void sub_809AB4C(s32, s32); extern void sub_809ABB4(s32, s32); @@ -265,7 +265,7 @@ static Action *sub_809D52C(ActionUnkIds *a0) switch (a0->unk0) { case 0: return 0; case 1: return sub_80A882C(a0->unk2); - case 2: return sub_80AC240(a0->unk2); + case 2: return GroundObject_GetAction(a0->unk2); case 3: return sub_80AD158(a0->unk2); } return NULL;