From 5adb839124412d5054630cf12020423e18161031 Mon Sep 17 00:00:00 2001 From: Touched Date: Mon, 21 Aug 2017 21:40:28 +0200 Subject: Decompile asm/field_ground_effect.s --- asm/field_ground_effect.s | 1302 --------------------------------------- include/field_effect_helpers.h | 3 + include/field_map_obj_helpers.h | 2 + ld_script.txt | 1 - src/field_ground_effect.c | 712 ++++++++++++++++++++- 5 files changed, 695 insertions(+), 1325 deletions(-) delete mode 100644 asm/field_ground_effect.s diff --git a/asm/field_ground_effect.s b/asm/field_ground_effect.s deleted file mode 100644 index 47c4b4c60..000000000 --- a/asm/field_ground_effect.s +++ /dev/null @@ -1,1302 +0,0 @@ - .include "constants/gba_constants.inc" - .include "constants/species_constants.inc" - .include "asm/macros.inc" - - .syntax unified - - .text - - thumb_func_start FieldObjectCheckForReflectiveSurface -FieldObjectCheckForReflectiveSurface: @ 8063A44 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x8 - adds r5, r0, 0 - ldrb r0, [r5, 0x5] - bl GetFieldObjectGraphicsInfo - movs r2, 0x8 - ldrsh r1, [r0, r2] - adds r1, 0x8 - lsls r1, 12 - lsrs r1, 16 - str r1, [sp] - movs r1, 0xA - ldrsh r0, [r0, r1] - adds r0, 0x8 - lsls r0, 12 - movs r4, 0 - lsrs r2, r0, 16 - str r2, [sp, 0x4] - asrs r0, 16 - cmp r4, r0 - blt _08063A7A - b _08063B80 -_08063A7A: - movs r0, 0x1 - mov r10, r0 -_08063A7E: - movs r1, 0x10 - ldrsh r0, [r5, r1] - movs r2, 0x12 - ldrsh r1, [r5, r2] - add r1, r10 - lsls r4, 16 - asrs r6, r4, 16 - adds r1, r6 - bl MapGridGetMetatileBehaviorAt - lsls r0, 24 - lsrs r0, 24 - bl GetReflectionTypeByMetatileBehavior - lsls r0, 24 - lsrs r0, 24 - mov r9, r4 - cmp r0, 0 - bne _08063B82 - movs r1, 0x14 - ldrsh r0, [r5, r1] - movs r2, 0x16 - ldrsh r1, [r5, r2] - add r1, r10 - adds r1, r6 - bl MapGridGetMetatileBehaviorAt - lsls r0, 24 - lsrs r0, 24 - bl GetReflectionTypeByMetatileBehavior - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0 - bne _08063B82 - movs r2, 0x1 - ldr r1, [sp] - lsls r0, r1, 16 - asrs r1, r0, 16 - mov r8, r0 - cmp r2, r1 - bge _08063B6E - movs r0, 0x80 - lsls r0, 9 - asrs r7, r0, 16 -_08063AD8: - movs r1, 0x10 - ldrsh r0, [r5, r1] - lsls r1, r2, 16 - asrs r4, r1, 16 - adds r0, r4 - movs r2, 0x12 - ldrsh r1, [r5, r2] - adds r1, r7 - adds r1, r6 - bl MapGridGetMetatileBehaviorAt - lsls r0, 24 - lsrs r0, 24 - bl GetReflectionTypeByMetatileBehavior - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0 - bne _08063B82 - movs r1, 0x10 - ldrsh r0, [r5, r1] - subs r0, r4 - movs r2, 0x12 - ldrsh r1, [r5, r2] - adds r1, r7 - adds r1, r6 - bl MapGridGetMetatileBehaviorAt - lsls r0, 24 - lsrs r0, 24 - bl GetReflectionTypeByMetatileBehavior - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0 - bne _08063B82 - movs r1, 0x14 - ldrsh r0, [r5, r1] - adds r0, r4 - movs r2, 0x16 - ldrsh r1, [r5, r2] - adds r1, r7 - adds r1, r6 - bl MapGridGetMetatileBehaviorAt - lsls r0, 24 - lsrs r0, 24 - bl GetReflectionTypeByMetatileBehavior - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0 - bne _08063B82 - movs r1, 0x14 - ldrsh r0, [r5, r1] - subs r0, r4 - movs r2, 0x16 - ldrsh r1, [r5, r2] - adds r1, r7 - adds r1, r6 - bl MapGridGetMetatileBehaviorAt - lsls r0, 24 - lsrs r0, 24 - bl GetReflectionTypeByMetatileBehavior - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0 - bne _08063B82 - adds r0, r4, 0x1 - lsls r0, 16 - lsrs r2, r0, 16 - cmp r0, r8 - blt _08063AD8 -_08063B6E: - movs r1, 0x80 - lsls r1, 9 - add r1, r9 - lsrs r4, r1, 16 - ldr r2, [sp, 0x4] - lsls r0, r2, 16 - cmp r1, r0 - bge _08063B80 - b _08063A7E -_08063B80: - movs r0, 0 -_08063B82: - add sp, 0x8 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end FieldObjectCheckForReflectiveSurface - - thumb_func_start GetReflectionTypeByMetatileBehavior -GetReflectionTypeByMetatileBehavior: @ 8063B94 - push {r4,lr} - lsls r0, 24 - lsrs r4, r0, 24 - adds r0, r4, 0 - bl MetatileBehavior_IsIce - lsls r0, 24 - cmp r0, 0 - beq _08063BAA - movs r0, 0x1 - b _08063BBC -_08063BAA: - adds r0, r4, 0 - bl MetatileBehavior_IsReflective - lsls r0, 24 - cmp r0, 0 - bne _08063BBA - movs r0, 0 - b _08063BBC -_08063BBA: - movs r0, 0x2 -_08063BBC: - pop {r4} - pop {r1} - bx r1 - thumb_func_end GetReflectionTypeByMetatileBehavior - - thumb_func_start GetLedgeJumpDirection -GetLedgeJumpDirection: @ 8063BC4 - push {r4,lr} - lsls r0, 16 - lsrs r3, r0, 16 - lsls r1, 16 - lsrs r1, 16 - lsls r2, 24 - lsrs r4, r2, 24 - cmp r4, 0 - beq _08063C0A - cmp r4, 0x4 - bls _08063BE0 - subs r0, r4, 0x4 - lsls r0, 24 - lsrs r4, r0, 24 -_08063BE0: - subs r0, r4, 0x1 - lsls r0, 24 - lsrs r4, r0, 24 - lsls r0, r3, 16 - asrs r0, 16 - lsls r1, 16 - asrs r1, 16 - bl MapGridGetMetatileBehaviorAt - lsls r0, 24 - lsrs r0, 24 - ldr r2, _08063C10 @ =gUnknown_08376040 - lsls r1, r4, 2 - adds r1, r2 - ldr r1, [r1] - bl _call_via_r1 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - beq _08063C14 -_08063C0A: - movs r0, 0 - b _08063C1A - .align 2, 0 -_08063C10: .4byte gUnknown_08376040 -_08063C14: - adds r0, r4, 0x1 - lsls r0, 24 - lsrs r0, 24 -_08063C1A: - pop {r4} - pop {r1} - bx r1 - thumb_func_end GetLedgeJumpDirection - - thumb_func_start FieldObjectSetSpriteOamTableForLongGrass -FieldObjectSetSpriteOamTableForLongGrass: @ 8063C20 - push {r4-r6,lr} - adds r5, r0, 0 - adds r4, r1, 0 - ldrb r0, [r5] - lsls r0, 27 - cmp r0, 0 - blt _08063C74 - ldrb r0, [r5, 0x1E] - bl MetatileBehavior_IsLongGrass - lsls r0, 24 - cmp r0, 0 - beq _08063C74 - ldrb r0, [r5, 0x1F] - bl MetatileBehavior_IsLongGrass - lsls r0, 24 - cmp r0, 0 - beq _08063C74 - adds r4, 0x42 - ldrb r1, [r4] - movs r6, 0x40 - negs r6, r6 - adds r0, r6, 0 - ands r0, r1 - movs r1, 0x4 - orrs r0, r1 - strb r0, [r4] - ldrb r0, [r5, 0xB] - lsrs r0, 4 - bl ZCoordToPriority - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _08063C74 - ldrb r0, [r4] - adds r1, r6, 0 - ands r1, r0 - movs r0, 0x5 - orrs r1, r0 - strb r1, [r4] -_08063C74: - pop {r4-r6} - pop {r0} - bx r0 - thumb_func_end FieldObjectSetSpriteOamTableForLongGrass - - thumb_func_start IsZCoordMismatchAt -IsZCoordMismatchAt: @ 8063C7C - push {r4,lr} - lsls r0, 24 - lsrs r4, r0, 24 - lsls r1, 16 - lsrs r0, r1, 16 - lsls r2, 16 - lsrs r1, r2, 16 - cmp r4, 0 - beq _08063CAA - lsls r0, 16 - asrs r0, 16 - lsls r1, 16 - asrs r1, 16 - bl MapGridGetZCoordAt - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0 - beq _08063CAA - cmp r0, 0xF - beq _08063CAA - cmp r0, r4 - bne _08063CAE -_08063CAA: - movs r0, 0 - b _08063CB0 -_08063CAE: - movs r0, 0x1 -_08063CB0: - pop {r4} - pop {r1} - bx r1 - thumb_func_end IsZCoordMismatchAt - - thumb_func_start FieldObjectUpdateZCoordAndPriority -FieldObjectUpdateZCoordAndPriority: @ 8063CB8 - push {r4,r5,lr} - adds r4, r0, 0 - adds r5, r1, 0 - ldrb r0, [r4, 0x3] - lsls r0, 29 - cmp r0, 0 - blt _08063D06 - adds r0, r4, 0 - bl FieldObjectUpdateZCoord - ldr r1, _08063D0C @ =gFieldObjectPriorities_08376070 - ldrb r2, [r4, 0xB] - lsls r2, 24 - lsrs r0, r2, 28 - adds r0, r1 - ldrb r0, [r0] - adds r4, r5, 0 - adds r4, 0x42 - movs r1, 0x3F - ands r1, r0 - ldrb r3, [r4] - movs r0, 0x40 - negs r0, r0 - ands r0, r3 - orrs r0, r1 - strb r0, [r4] - ldr r0, _08063D10 @ =gFieldObjectPriorities_08376060 - lsrs r2, 28 - adds r2, r0 - movs r0, 0x3 - ldrb r1, [r2] - ands r1, r0 - lsls r1, 2 - ldrb r2, [r5, 0x5] - movs r0, 0xD - negs r0, r0 - ands r0, r2 - orrs r0, r1 - strb r0, [r5, 0x5] -_08063D06: - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_08063D0C: .4byte gFieldObjectPriorities_08376070 -_08063D10: .4byte gFieldObjectPriorities_08376060 - thumb_func_end FieldObjectUpdateZCoordAndPriority - - thumb_func_start InitObjectPriorityByZCoord -InitObjectPriorityByZCoord: @ 8063D14 - push {r4,lr} - lsls r1, 24 - lsrs r1, 24 - ldr r2, _08063D58 @ =gFieldObjectPriorities_08376070 - adds r2, r1, r2 - ldrb r2, [r2] - movs r3, 0x42 - adds r3, r0 - mov r12, r3 - movs r3, 0x3F - ands r3, r2 - mov r2, r12 - ldrb r4, [r2] - movs r2, 0x40 - negs r2, r2 - ands r2, r4 - orrs r2, r3 - mov r3, r12 - strb r2, [r3] - ldr r2, _08063D5C @ =gFieldObjectPriorities_08376060 - adds r1, r2 - movs r3, 0x3 - ldrb r2, [r1] - ands r2, r3 - lsls r2, 2 - ldrb r3, [r0, 0x5] - movs r1, 0xD - negs r1, r1 - ands r1, r3 - orrs r1, r2 - strb r1, [r0, 0x5] - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_08063D58: .4byte gFieldObjectPriorities_08376070 -_08063D5C: .4byte gFieldObjectPriorities_08376060 - thumb_func_end InitObjectPriorityByZCoord - - thumb_func_start ZCoordToPriority -ZCoordToPriority: @ 8063D60 - lsls r0, 24 - lsrs r0, 24 - ldr r1, _08063D6C @ =gFieldObjectPriorities_08376060 - adds r0, r1 - ldrb r0, [r0] - bx lr - .align 2, 0 -_08063D6C: .4byte gFieldObjectPriorities_08376060 - thumb_func_end ZCoordToPriority - - thumb_func_start FieldObjectUpdateZCoord -FieldObjectUpdateZCoord: @ 8063D70 - push {r4,r5,lr} - adds r4, r0, 0 - movs r1, 0x10 - ldrsh r0, [r4, r1] - movs r2, 0x12 - ldrsh r1, [r4, r2] - bl MapGridGetZCoordAt - lsls r0, 24 - lsrs r5, r0, 24 - movs r1, 0x14 - ldrsh r0, [r4, r1] - movs r2, 0x16 - ldrsh r1, [r4, r2] - bl MapGridGetZCoordAt - lsls r0, 24 - lsrs r0, 24 - cmp r5, 0xF - beq _08063DBE - cmp r0, 0xF - beq _08063DBE - movs r3, 0xF - adds r0, r5, 0 - ands r0, r3 - ldrb r1, [r4, 0xB] - movs r2, 0x10 - negs r2, r2 - ands r2, r1 - orrs r2, r0 - strb r2, [r4, 0xB] - cmp r5, 0 - beq _08063DBE - cmp r5, 0xF - beq _08063DBE - lsls r0, r5, 4 - ands r2, r3 - orrs r2, r0 - strb r2, [r4, 0xB] -_08063DBE: - pop {r4,r5} - pop {r0} - bx r0 - thumb_func_end FieldObjectUpdateZCoord - - thumb_func_start SetObjectSubpriorityByZCoord -SetObjectSubpriorityByZCoord: @ 8063DC4 - push {r4,r5,lr} - lsls r0, 24 - lsrs r0, 24 - lsls r2, 24 - lsrs r2, 24 - adds r3, r1, 0 - adds r3, 0x29 - movs r5, 0 - ldrsb r5, [r3, r5] - ldrh r4, [r1, 0x22] - ldr r3, _08063E04 @ =gSpriteCoordOffsetY - subs r4, r5 - ldrh r3, [r3] - adds r4, r3 - adds r4, 0x8 - movs r3, 0xFF - ands r4, r3 - lsrs r4, 4 - movs r3, 0x10 - subs r3, r4 - lsls r3, 17 - ldr r4, _08063E08 @ =gUnknown_08376050 - adds r0, r4 - lsrs r3, 16 - ldrb r0, [r0] - adds r3, r0 - adds r2, r3 - adds r1, 0x43 - strb r2, [r1] - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_08063E04: .4byte gSpriteCoordOffsetY -_08063E08: .4byte gUnknown_08376050 - thumb_func_end SetObjectSubpriorityByZCoord - - thumb_func_start FieldObjectUpdateSubpriority -FieldObjectUpdateSubpriority: @ 8063E0C - push {lr} - adds r2, r0, 0 - ldrb r0, [r2, 0x3] - lsls r0, 29 - cmp r0, 0 - blt _08063E22 - ldrb r0, [r2, 0xB] - lsrs r0, 4 - movs r2, 0x1 - bl SetObjectSubpriorityByZCoord -_08063E22: - pop {r0} - bx r0 - thumb_func_end FieldObjectUpdateSubpriority - - thumb_func_start AreZCoordsCompatible -AreZCoordsCompatible: @ 8063E28 - push {lr} - lsls r0, 24 - lsrs r0, 24 - lsls r1, 24 - lsrs r1, 24 - cmp r0, 0 - beq _08063E3E - cmp r1, 0 - beq _08063E3E - cmp r0, r1 - bne _08063E42 -_08063E3E: - movs r0, 0x1 - b _08063E44 -_08063E42: - movs r0, 0 -_08063E44: - pop {r1} - bx r1 - thumb_func_end AreZCoordsCompatible - - thumb_func_start GroundEffect_SpawnOnTallGrass -GroundEffect_SpawnOnTallGrass: @ 8063E48 - push {lr} - ldr r3, _08063E8C @ =gUnknown_0202FF84 - movs r2, 0x10 - ldrsh r1, [r0, r2] - str r1, [r3] - movs r2, 0x12 - ldrsh r1, [r0, r2] - str r1, [r3, 0x4] - ldrb r1, [r0, 0xB] - lsrs r1, 4 - str r1, [r3, 0x8] - movs r1, 0x2 - str r1, [r3, 0xC] - ldrb r1, [r0, 0x8] - lsls r1, 8 - ldrb r2, [r0, 0x9] - orrs r1, r2 - str r1, [r3, 0x10] - ldrb r0, [r0, 0xA] - str r0, [r3, 0x14] - ldr r1, _08063E90 @ =gSaveBlock1 - ldrb r0, [r1, 0x5] - lsls r0, 8 - ldrb r1, [r1, 0x4] - orrs r0, r1 - str r0, [r3, 0x18] - movs r0, 0x1 - str r0, [r3, 0x1C] - movs r0, 0x4 - bl FieldEffectStart - pop {r0} - bx r0 - .align 2, 0 -_08063E8C: .4byte gUnknown_0202FF84 -_08063E90: .4byte gSaveBlock1 - thumb_func_end GroundEffect_SpawnOnTallGrass - - thumb_func_start sub_8063E94 -sub_8063E94: @ 8063E94 - push {lr} - ldr r3, _08063ED8 @ =gUnknown_0202FF84 - movs r2, 0x10 - ldrsh r1, [r0, r2] - str r1, [r3] - movs r2, 0x12 - ldrsh r1, [r0, r2] - str r1, [r3, 0x4] - ldrb r1, [r0, 0xB] - lsrs r1, 4 - str r1, [r3, 0x8] - movs r1, 0x2 - str r1, [r3, 0xC] - ldrb r1, [r0, 0x8] - lsls r1, 8 - ldrb r2, [r0, 0x9] - orrs r1, r2 - str r1, [r3, 0x10] - ldrb r0, [r0, 0xA] - str r0, [r3, 0x14] - ldr r1, _08063EDC @ =gSaveBlock1 - ldrb r0, [r1, 0x5] - lsls r0, 8 - ldrb r1, [r1, 0x4] - orrs r0, r1 - str r0, [r3, 0x18] - movs r0, 0 - str r0, [r3, 0x1C] - movs r0, 0x4 - bl FieldEffectStart - pop {r0} - bx r0 - .align 2, 0 -_08063ED8: .4byte gUnknown_0202FF84 -_08063EDC: .4byte gSaveBlock1 - thumb_func_end sub_8063E94 - - thumb_func_start sub_8063EE0 -sub_8063EE0: @ 8063EE0 - push {lr} - ldr r3, _08063F24 @ =gUnknown_0202FF84 - movs r2, 0x10 - ldrsh r1, [r0, r2] - str r1, [r3] - movs r2, 0x12 - ldrsh r1, [r0, r2] - str r1, [r3, 0x4] - ldrb r1, [r0, 0xB] - lsrs r1, 4 - str r1, [r3, 0x8] - movs r1, 0x2 - str r1, [r3, 0xC] - ldrb r1, [r0, 0x8] - lsls r1, 8 - ldrb r2, [r0, 0x9] - orrs r1, r2 - str r1, [r3, 0x10] - ldrb r0, [r0, 0xA] - str r0, [r3, 0x14] - ldr r1, _08063F28 @ =gSaveBlock1 - ldrb r0, [r1, 0x5] - lsls r0, 8 - ldrb r1, [r1, 0x4] - orrs r0, r1 - str r0, [r3, 0x18] - movs r0, 0x1 - str r0, [r3, 0x1C] - movs r0, 0x11 - bl FieldEffectStart - pop {r0} - bx r0 - .align 2, 0 -_08063F24: .4byte gUnknown_0202FF84 -_08063F28: .4byte gSaveBlock1 - thumb_func_end sub_8063EE0 - - thumb_func_start sub_8063F2C -sub_8063F2C: @ 8063F2C - push {lr} - ldr r3, _08063F70 @ =gUnknown_0202FF84 - movs r2, 0x10 - ldrsh r1, [r0, r2] - str r1, [r3] - movs r2, 0x12 - ldrsh r1, [r0, r2] - str r1, [r3, 0x4] - ldrb r1, [r0, 0xB] - lsrs r1, 4 - str r1, [r3, 0x8] - movs r1, 0x2 - str r1, [r3, 0xC] - ldrb r1, [r0, 0x8] - lsls r1, 8 - ldrb r2, [r0, 0x9] - orrs r1, r2 - str r1, [r3, 0x10] - ldrb r0, [r0, 0xA] - str r0, [r3, 0x14] - ldr r1, _08063F74 @ =gSaveBlock1 - ldrb r0, [r1, 0x5] - lsls r0, 8 - ldrb r1, [r1, 0x4] - orrs r0, r1 - str r0, [r3, 0x18] - movs r0, 0 - str r0, [r3, 0x1C] - movs r0, 0x11 - bl FieldEffectStart - pop {r0} - bx r0 - .align 2, 0 -_08063F70: .4byte gUnknown_0202FF84 -_08063F74: .4byte gSaveBlock1 - thumb_func_end sub_8063F2C - - thumb_func_start GroundEffect_WaterReflection -GroundEffect_WaterReflection: @ 8063F78 - push {lr} - movs r2, 0 - bl SetUpReflection - pop {r0} - bx r0 - thumb_func_end GroundEffect_WaterReflection - - thumb_func_start GroundEffect_IceReflection -GroundEffect_IceReflection: @ 8063F84 - push {lr} - movs r2, 0x1 - bl SetUpReflection - pop {r0} - bx r0 - thumb_func_end GroundEffect_IceReflection - - thumb_func_start GroundEffect_FlowingWater -GroundEffect_FlowingWater: @ 8063F90 - push {lr} - adds r1, r0, 0 - movs r0, 0x22 - bl oe_exec_and_other_stuff - pop {r0} - bx r0 - thumb_func_end GroundEffect_FlowingWater - - thumb_func_start sub_8063FA0 -sub_8063FA0: @ 8063FA0 - push {r4,r5,lr} - adds r4, r0, 0 - adds r5, r1, 0 - ldrb r0, [r4, 0x5] - bl GetFieldObjectGraphicsInfo - ldr r1, _08063FC8 @ =gUnknown_08376080 - ldrb r0, [r0, 0xD] - lsls r0, 2 - adds r0, r1 - ldr r3, [r0] - adds r0, r4, 0 - adds r1, r5, 0 - movs r2, 0 - bl _call_via_r3 - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_08063FC8: .4byte gUnknown_08376080 - thumb_func_end sub_8063FA0 - - thumb_func_start sub_8063FCC -sub_8063FCC: @ 8063FCC - push {r4,r5,lr} - adds r4, r0, 0 - adds r5, r1, 0 - ldrb r0, [r4, 0x5] - bl GetFieldObjectGraphicsInfo - ldr r1, _08063FF4 @ =gUnknown_08376080 - ldrb r0, [r0, 0xD] - lsls r0, 2 - adds r0, r1 - ldr r3, [r0] - adds r0, r4, 0 - adds r1, r5, 0 - movs r2, 0x1 - bl _call_via_r3 - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_08063FF4: .4byte gUnknown_08376080 - thumb_func_end sub_8063FCC - - thumb_func_start nullsub_50 -nullsub_50: @ 8063FF8 - bx lr - thumb_func_end nullsub_50 - - thumb_func_start DoTracksGroundEffect_Footprints -DoTracksGroundEffect_Footprints: @ 8063FFC - push {r4,r5,lr} - sub sp, 0x4 - adds r5, r0, 0 - lsls r4, r2, 24 - lsrs r4, 24 - ldr r1, _08064044 @ =gSandFootprints_FieldEffectData - mov r0, sp - movs r2, 0x4 - bl memcpy - ldr r1, _08064048 @ =gUnknown_0202FF84 - movs r2, 0x14 - ldrsh r0, [r5, r2] - str r0, [r1] - movs r2, 0x16 - ldrsh r0, [r5, r2] - str r0, [r1, 0x4] - movs r0, 0x95 - str r0, [r1, 0x8] - movs r0, 0x2 - str r0, [r1, 0xC] - ldrb r0, [r5, 0x18] - lsls r0, 28 - lsrs r0, 28 - str r0, [r1, 0x10] - lsls r4, 1 - mov r1, sp - adds r0, r1, r4 - ldrb r0, [r0] - bl FieldEffectStart - add sp, 0x4 - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_08064044: .4byte gSandFootprints_FieldEffectData -_08064048: .4byte gUnknown_0202FF84 - thumb_func_end DoTracksGroundEffect_Footprints - - thumb_func_start DoTracksGroundEffect_BikeTireTracks -DoTracksGroundEffect_BikeTireTracks: @ 806404C - push {r4,lr} - adds r4, r0, 0 - ldr r1, [r4, 0x10] - ldr r0, [r4, 0x14] - cmp r1, r0 - beq _0806408E - ldr r2, _08064094 @ =gUnknown_0202FF84 - movs r1, 0x14 - ldrsh r0, [r4, r1] - str r0, [r2] - movs r1, 0x16 - ldrsh r0, [r4, r1] - str r0, [r2, 0x4] - movs r0, 0x95 - str r0, [r2, 0x8] - movs r0, 0x2 - str r0, [r2, 0xC] - ldr r3, _08064098 @ =gBikeTireTracks_Transitions - ldrb r1, [r4, 0x18] - lsls r1, 28 - lsrs r1, 28 - adds r0, r4, 0 - adds r0, 0x20 - ldrb r0, [r0] - lsls r0, 2 - subs r0, 0x5 - adds r1, r0 - adds r1, r3 - ldrb r0, [r1] - str r0, [r2, 0x10] - movs r0, 0x23 - bl FieldEffectStart -_0806408E: - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_08064094: .4byte gUnknown_0202FF84 -_08064098: .4byte gBikeTireTracks_Transitions - thumb_func_end DoTracksGroundEffect_BikeTireTracks - - thumb_func_start GroundEffect_Ripple -GroundEffect_Ripple: @ 806409C - push {lr} - bl DoRippleFieldEffect - pop {r0} - bx r0 - thumb_func_end GroundEffect_Ripple - - thumb_func_start GroundEffect_StepOnPuddle -GroundEffect_StepOnPuddle: @ 80640A8 - push {lr} - adds r1, r0, 0 - movs r0, 0xF - bl oe_exec_and_other_stuff - pop {r0} - bx r0 - thumb_func_end GroundEffect_StepOnPuddle - - thumb_func_start GroundEffect_SandPile -GroundEffect_SandPile: @ 80640B8 - push {lr} - adds r1, r0, 0 - movs r0, 0x27 - bl oe_exec_and_other_stuff - pop {r0} - bx r0 - thumb_func_end GroundEffect_SandPile - - thumb_func_start GroundEffect_JumpOnTallGrass -GroundEffect_JumpOnTallGrass: @ 80640C8 - push {r4-r7,lr} - sub sp, 0x4 - adds r5, r0, 0 - adds r6, r1, 0 - ldr r1, _0806411C @ =gUnknown_0202FF84 - movs r2, 0x10 - ldrsh r0, [r5, r2] - str r0, [r1] - movs r4, 0x12 - ldrsh r0, [r5, r4] - str r0, [r1, 0x4] - ldrb r0, [r5, 0xB] - lsrs r0, 4 - str r0, [r1, 0x8] - movs r0, 0x2 - str r0, [r1, 0xC] - movs r0, 0xC - bl FieldEffectStart - ldrb r0, [r5, 0x8] - ldrb r1, [r5, 0x9] - ldrb r2, [r5, 0xA] - movs r7, 0x10 - ldrsh r3, [r5, r7] - movs r7, 0x12 - ldrsh r4, [r5, r7] - str r4, [sp] - bl sub_8126FF0 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x40 - bne _08064112 - adds r0, r5, 0 - adds r1, r6, 0 - bl GroundEffect_SpawnOnTallGrass -_08064112: - add sp, 0x4 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0806411C: .4byte gUnknown_0202FF84 - thumb_func_end GroundEffect_JumpOnTallGrass - - thumb_func_start GroundEffect_JumpOnLongGrass -GroundEffect_JumpOnLongGrass: @ 8064120 - push {lr} - ldr r2, _08064144 @ =gUnknown_0202FF84 - movs r3, 0x10 - ldrsh r1, [r0, r3] - str r1, [r2] - movs r3, 0x12 - ldrsh r1, [r0, r3] - str r1, [r2, 0x4] - ldrb r0, [r0, 0xB] - lsrs r0, 4 - str r0, [r2, 0x8] - movs r0, 0x2 - str r0, [r2, 0xC] - movs r0, 0x12 - bl FieldEffectStart - pop {r0} - bx r0 - .align 2, 0 -_08064144: .4byte gUnknown_0202FF84 - thumb_func_end GroundEffect_JumpOnLongGrass - - thumb_func_start GroundEffect_JumpOnShallowWater -GroundEffect_JumpOnShallowWater: @ 8064148 - push {r4,lr} - ldr r3, _08064174 @ =gUnknown_0202FF84 - movs r4, 0x10 - ldrsh r2, [r0, r4] - str r2, [r3] - movs r4, 0x12 - ldrsh r2, [r0, r4] - str r2, [r3, 0x4] - ldrb r0, [r0, 0xB] - lsrs r0, 4 - str r0, [r3, 0x8] - ldrb r0, [r1, 0x5] - lsls r0, 28 - lsrs r0, 30 - str r0, [r3, 0xC] - movs r0, 0x10 - bl FieldEffectStart - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_08064174: .4byte gUnknown_0202FF84 - thumb_func_end GroundEffect_JumpOnShallowWater - - thumb_func_start GroundEffect_JumpOnWater -GroundEffect_JumpOnWater: @ 8064178 - push {r4,lr} - ldr r3, _080641A4 @ =gUnknown_0202FF84 - movs r4, 0x10 - ldrsh r2, [r0, r4] - str r2, [r3] - movs r4, 0x12 - ldrsh r2, [r0, r4] - str r2, [r3, 0x4] - ldrb r0, [r0, 0xB] - lsrs r0, 4 - str r0, [r3, 0x8] - ldrb r0, [r1, 0x5] - lsls r0, 28 - lsrs r0, 30 - str r0, [r3, 0xC] - movs r0, 0xE - bl FieldEffectStart - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_080641A4: .4byte gUnknown_0202FF84 - thumb_func_end GroundEffect_JumpOnWater - - thumb_func_start GroundEffect_JumpLandingDust -GroundEffect_JumpLandingDust: @ 80641A8 - push {r4,lr} - ldr r3, _080641D4 @ =gUnknown_0202FF84 - movs r4, 0x10 - ldrsh r2, [r0, r4] - str r2, [r3] - movs r4, 0x12 - ldrsh r2, [r0, r4] - str r2, [r3, 0x4] - ldrb r0, [r0, 0xB] - lsrs r0, 4 - str r0, [r3, 0x8] - ldrb r0, [r1, 0x5] - lsls r0, 28 - lsrs r0, 30 - str r0, [r3, 0xC] - movs r0, 0xA - bl FieldEffectStart - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_080641D4: .4byte gUnknown_0202FF84 - thumb_func_end GroundEffect_JumpLandingDust - - thumb_func_start GroundEffect_ShortGrass -GroundEffect_ShortGrass: @ 80641D8 - push {lr} - adds r1, r0, 0 - movs r0, 0x29 - bl oe_exec_and_other_stuff - pop {r0} - bx r0 - thumb_func_end GroundEffect_ShortGrass - - thumb_func_start GroundEffect_HotSprings -GroundEffect_HotSprings: @ 80641E8 - push {lr} - adds r1, r0, 0 - movs r0, 0x2A - bl oe_exec_and_other_stuff - pop {r0} - bx r0 - thumb_func_end GroundEffect_HotSprings - - thumb_func_start GroundEffect_Seaweed -GroundEffect_Seaweed: @ 80641F8 - push {lr} - ldr r2, _08064214 @ =gUnknown_0202FF84 - movs r3, 0x10 - ldrsh r1, [r0, r3] - str r1, [r2] - movs r1, 0x12 - ldrsh r0, [r0, r1] - str r0, [r2, 0x4] - movs r0, 0x35 - bl FieldEffectStart - pop {r0} - bx r0 - .align 2, 0 -_08064214: .4byte gUnknown_0202FF84 - thumb_func_end GroundEffect_Seaweed - - thumb_func_start sub_8064218 -sub_8064218: @ 8064218 - push {r4-r7,lr} - mov r7, r8 - push {r7} - adds r7, r0, 0 - adds r6, r1, 0 - adds r5, r2, 0 - movs r4, 0 - ldr r0, _08064258 @ =gUnknown_083760A0 - mov r8, r0 -_0806422A: - movs r0, 0x1 - ands r0, r5 - cmp r0, 0 - beq _08064240 - lsls r0, r4, 2 - add r0, r8 - ldr r2, [r0] - adds r0, r7, 0 - adds r1, r6, 0 - bl _call_via_r2 -_08064240: - adds r0, r4, 0x1 - lsls r0, 24 - lsrs r4, r0, 24 - lsrs r5, 1 - cmp r4, 0x13 - bls _0806422A - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08064258: .4byte gUnknown_083760A0 - thumb_func_end sub_8064218 - - thumb_func_start filters_out_some_ground_effects -filters_out_some_ground_effects: @ 806425C - push {lr} - adds r2, r0, 0 - adds r3, r1, 0 - ldrb r0, [r2] - lsls r0, 27 - cmp r0, 0 - bge _0806428A - ldrb r1, [r2, 0x2] - movs r0, 0x5 - negs r0, r0 - ands r0, r1 - movs r1, 0x11 - negs r1, r1 - ands r0, r1 - adds r1, 0x8 - ands r0, r1 - subs r1, 0x18 - ands r0, r1 - strb r0, [r2, 0x2] - ldr r0, [r3] - ldr r1, _08064290 @ =0xfff9f7bd - ands r0, r1 - str r0, [r3] -_0806428A: - pop {r0} - bx r0 - .align 2, 0 -_08064290: .4byte 0xfff9f7bd - thumb_func_end filters_out_some_ground_effects - - thumb_func_start FilterOutStepOnPuddleGroundEffectIfJumping -FilterOutStepOnPuddleGroundEffectIfJumping: @ 8064294 - push {lr} - adds r2, r1, 0 - ldrb r0, [r0] - lsls r0, 26 - cmp r0, 0 - bge _080642A8 - ldr r0, [r2] - ldr r1, _080642AC @ =0xfffffbff - ands r0, r1 - str r0, [r2] -_080642A8: - pop {r0} - bx r0 - .align 2, 0 -_080642AC: .4byte 0xfffffbff - thumb_func_end FilterOutStepOnPuddleGroundEffectIfJumping - - thumb_func_start DoGroundEffects_OnSpawn -DoGroundEffects_OnSpawn: @ 80642B0 - push {r4,r5,lr} - sub sp, 0x4 - adds r4, r0, 0 - adds r5, r1, 0 - ldrb r0, [r4] - lsls r0, 29 - cmp r0, 0 - bge _080642F4 - movs r0, 0 - str r0, [sp] - adds r0, r4, 0 - bl FieldObjectUpdateZCoordAndPriority - adds r0, r4, 0 - mov r1, sp - bl GetAllGroundEffectFlags_OnSpawn - adds r0, r4, 0 - adds r1, r5, 0 - bl FieldObjectSetSpriteOamTableForLongGrass - ldr r2, [sp] - adds r0, r4, 0 - adds r1, r5, 0 - bl sub_8064218 - ldrb r1, [r4] - movs r0, 0x5 - negs r0, r0 - ands r0, r1 - movs r1, 0x11 - negs r1, r1 - ands r0, r1 - strb r0, [r4] -_080642F4: - add sp, 0x4 - pop {r4,r5} - pop {r0} - bx r0 - thumb_func_end DoGroundEffects_OnSpawn - - thumb_func_start DoGroundEffects_OnBeginStep -DoGroundEffects_OnBeginStep: @ 80642FC - push {r4,r5,lr} - sub sp, 0x4 - adds r4, r0, 0 - adds r5, r1, 0 - ldrb r0, [r4] - lsls r0, 29 - cmp r0, 0 - bge _08064348 - movs r0, 0 - str r0, [sp] - adds r0, r4, 0 - bl FieldObjectUpdateZCoordAndPriority - adds r0, r4, 0 - mov r1, sp - bl GetAllGroundEffectFlags_OnBeginStep - adds r0, r4, 0 - adds r1, r5, 0 - bl FieldObjectSetSpriteOamTableForLongGrass - adds r0, r4, 0 - mov r1, sp - bl filters_out_some_ground_effects - ldr r2, [sp] - adds r0, r4, 0 - adds r1, r5, 0 - bl sub_8064218 - ldrb r1, [r4] - movs r0, 0x5 - negs r0, r0 - ands r0, r1 - movs r1, 0x11 - negs r1, r1 - ands r0, r1 - strb r0, [r4] -_08064348: - add sp, 0x4 - pop {r4,r5} - pop {r0} - bx r0 - thumb_func_end DoGroundEffects_OnBeginStep - - thumb_func_start DoGroundEffects_OnFinishStep -DoGroundEffects_OnFinishStep: @ 8064350 - push {r4,r5,lr} - sub sp, 0x4 - adds r4, r0, 0 - adds r5, r1, 0 - ldrb r0, [r4] - lsls r0, 28 - cmp r0, 0 - bge _0806439C - movs r0, 0 - str r0, [sp] - adds r0, r4, 0 - bl FieldObjectUpdateZCoordAndPriority - adds r0, r4, 0 - mov r1, sp - bl GetAllGroundEffectFlags_OnFinishStep - adds r0, r4, 0 - adds r1, r5, 0 - bl FieldObjectSetSpriteOamTableForLongGrass - adds r0, r4, 0 - mov r1, sp - bl FilterOutStepOnPuddleGroundEffectIfJumping - ldr r2, [sp] - adds r0, r4, 0 - adds r1, r5, 0 - bl sub_8064218 - ldrb r1, [r4] - movs r0, 0x9 - negs r0, r0 - ands r0, r1 - movs r1, 0x21 - negs r1, r1 - ands r0, r1 - strb r0, [r4] -_0806439C: - add sp, 0x4 - pop {r4,r5} - pop {r0} - bx r0 - thumb_func_end DoGroundEffects_OnFinishStep - - .align 2, 0 @ Don't pad with nop. diff --git a/include/field_effect_helpers.h b/include/field_effect_helpers.h index a1dd53a2b..11e96254d 100644 --- a/include/field_effect_helpers.h +++ b/include/field_effect_helpers.h @@ -27,5 +27,8 @@ void sub_8127ED0(u8, u8); void sub_8127F28(u8, u8, s16); u8 sub_8128124(u8 id); void ash(s16, s16, u16, u8); +void SetUpReflection(struct MapObject *mapObj, struct Sprite *sprite, u8 a); +u32 oe_exec_and_other_stuff(u8 fieldEffectId, struct MapObject *mapObject); +u8 sub_8126FF0(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y); #endif // GUARD_FIELD_EFFECT_HELPERS_H diff --git a/include/field_map_obj_helpers.h b/include/field_map_obj_helpers.h index fd29a9a7f..f760bf153 100644 --- a/include/field_map_obj_helpers.h +++ b/include/field_map_obj_helpers.h @@ -18,4 +18,6 @@ void DoShadowFieldEffect(struct MapObject *mapObject); u8 sub_8064704(struct Sprite *); u8 sub_806478C(struct Sprite *); void obj_anim_image_set_and_seek(struct Sprite *sprite, u8 a2, u8 a3); +void DoRippleFieldEffect(struct MapObject *mapObj, struct Sprite *sprite); + #endif diff --git a/ld_script.txt b/ld_script.txt index c60aa3729..231951647 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -96,7 +96,6 @@ SECTIONS { asm/field_map_obj.o(.text); src/field_map_obj.o(.text_fmocb2_c); src/field_ground_effect.o(.text); - asm/field_ground_effect.o(.text); src/field_map_obj_helpers.o(.text); src/field_message_box.o(.text); src/map_obj_lock.o(.text); diff --git a/src/field_ground_effect.c b/src/field_ground_effect.c index 42862d0ff..79729471c 100644 --- a/src/field_ground_effect.c +++ b/src/field_ground_effect.c @@ -1,9 +1,22 @@ #include "global.h" #include "field_ground_effect.h" +#include "field_effect.h" +#include "field_effect_helpers.h" +#include "field_map_obj_helpers.h" #include "fieldmap.h" #include "metatile_behavior.h" extern u32 gUnknown_08376008[]; +extern u8 (*gUnknown_08376040[4])(u32 a); +extern const u8 gFieldObjectPriorities_08376070[]; +extern const u8 gFieldObjectPriorities_08376060[]; +extern const u8 gUnknown_08376050[]; +extern void (*gUnknown_08376080[3])(struct MapObject *mapObj, struct Sprite *sprite, u8 a); +extern const u8 gSandFootprints_FieldEffectData[4]; +extern const u8 gBikeTireTracks_Transitions[4][4]; +extern void (*gUnknown_083760A0[0x14])(struct MapObject *mapObj, struct Sprite *sprite); + +#define NUM_GROUND_EFFECTS (sizeof(gUnknown_083760A0) / sizeof(gUnknown_083760A0[0])) void GetAllGroundEffectFlags_OnSpawn(struct MapObject *mapObj, u32 *flags) { @@ -100,8 +113,8 @@ void GetGroundEffectFlags_Tracks(struct MapObject *mapObj, u32 *flags) { *flags |= 0x100; } - else if (MetatileBehavior_IsSandOrDeepSand(mapObj->mapobj_unk_1F) - || MetatileBehavior_IsUnusedFootprintMetatile(mapObj->mapobj_unk_1F)) + else if (MetatileBehavior_IsSandOrDeepSand(mapObj->mapobj_unk_1F) || + MetatileBehavior_IsUnusedFootprintMetatile(mapObj->mapobj_unk_1F)) { *flags |= 0x80; } @@ -109,8 +122,8 @@ void GetGroundEffectFlags_Tracks(struct MapObject *mapObj, u32 *flags) void GetGroundEffectFlags_SandPile(struct MapObject *mapObj, u32 *flags) { - if (MetatileBehavior_IsDeepSand(mapObj->mapobj_unk_1E) - && MetatileBehavior_IsDeepSand(mapObj->mapobj_unk_1F)) + if (MetatileBehavior_IsDeepSand(mapObj->mapobj_unk_1E) && + MetatileBehavior_IsDeepSand(mapObj->mapobj_unk_1F)) { if (!mapObj->mapobj_bit_20) { @@ -127,8 +140,10 @@ void GetGroundEffectFlags_SandPile(struct MapObject *mapObj, u32 *flags) void GetGroundEffectFlags_ShallowFlowingWater(struct MapObject *mapObj, u32 *flags) { - if ((MetatileBehavior_IsShallowFlowingWater(mapObj->mapobj_unk_1E) && MetatileBehavior_IsShallowFlowingWater(mapObj->mapobj_unk_1F)) - || (MetatileBehavior_IsPacifidlogLog(mapObj->mapobj_unk_1E) && MetatileBehavior_IsPacifidlogLog(mapObj->mapobj_unk_1F))) + if ((MetatileBehavior_IsShallowFlowingWater(mapObj->mapobj_unk_1E) && + MetatileBehavior_IsShallowFlowingWater(mapObj->mapobj_unk_1F)) || + (MetatileBehavior_IsPacifidlogLog(mapObj->mapobj_unk_1E) && + MetatileBehavior_IsPacifidlogLog(mapObj->mapobj_unk_1F))) { if (!mapObj->mapobj_bit_19) { @@ -145,8 +160,8 @@ void GetGroundEffectFlags_ShallowFlowingWater(struct MapObject *mapObj, u32 *fla void GetGroundEffectFlags_Puddle(struct MapObject *mapObj, u32 *flags) { - if (MetatileBehavior_IsPuddle(mapObj->mapobj_unk_1E) - && MetatileBehavior_IsPuddle(mapObj->mapobj_unk_1F)) + if (MetatileBehavior_IsPuddle(mapObj->mapobj_unk_1E) && + MetatileBehavior_IsPuddle(mapObj->mapobj_unk_1F)) { *flags |= 0x400; } @@ -160,8 +175,8 @@ void GetGroundEffectFlags_Ripple(struct MapObject *mapObj, u32 *flags) void GetGroundEffectFlags_ShortGrass(struct MapObject *mapObj, u32 *flags) { - if (MetatileBehavior_IsShortGrass(mapObj->mapobj_unk_1E) - && MetatileBehavior_IsShortGrass(mapObj->mapobj_unk_1F)) + if (MetatileBehavior_IsShortGrass(mapObj->mapobj_unk_1E) && + MetatileBehavior_IsShortGrass(mapObj->mapobj_unk_1F)) { if (!mapObj->mapobj_bit_18) { @@ -178,8 +193,8 @@ void GetGroundEffectFlags_ShortGrass(struct MapObject *mapObj, u32 *flags) void GetGroundEffectFlags_HotSprings(struct MapObject *mapObj, u32 *flags) { - if (MetatileBehavior_IsHotSprings(mapObj->mapobj_unk_1E) - && MetatileBehavior_IsHotSprings(mapObj->mapobj_unk_1F)) + if (MetatileBehavior_IsHotSprings(mapObj->mapobj_unk_1E) && + MetatileBehavior_IsHotSprings(mapObj->mapobj_unk_1F)) { if (!mapObj->mapobj_bit_21) { @@ -204,8 +219,7 @@ void GetGroundEffectFlags_JumpLanding(struct MapObject *mapObj, u32 *flags) { typedef bool8 (*MetatileFunc)(u8); - static const MetatileFunc metatileFuncs[] = - { + static const MetatileFunc metatileFuncs[] = { MetatileBehavior_IsTallGrass, MetatileBehavior_IsLongGrass, MetatileBehavior_IsPuddle, @@ -214,14 +228,13 @@ void GetGroundEffectFlags_JumpLanding(struct MapObject *mapObj, u32 *flags) MetatileBehavior_IsATile, }; - static const u32 jumpLandingFlags[] = - { - 0x00001000, // Landing in tall grass - 0x00002000, // Landing in long grass - 0x00004000, // Landing on puddle - 0x00008000, // Landing on surfable water or underwater - 0x00004000, // Landing on shallow flowing water - 0x00010000, // Landing on any other type of ground + static const u32 jumpLandingFlags[] = { + 0x00001000, // Landing in tall grass + 0x00002000, // Landing in long grass + 0x00004000, // Landing on puddle + 0x00008000, // Landing on surfable water or underwater + 0x00004000, // Landing on shallow flowing water + 0x00010000, // Landing on any other type of ground }; if (mapObj->mapobj_bit_5 && !mapObj->mapobj_bit_25) @@ -238,3 +251,658 @@ void GetGroundEffectFlags_JumpLanding(struct MapObject *mapObj, u32 *flags) } } } + +#ifdef NONMATCHING +u8 FieldObjectCheckForReflectiveSurface(struct MapObject *mapObj) +{ + const struct MapObjectGraphicsInfo *info = GetFieldObjectGraphicsInfo(mapObj->graphicsId); + + // ceil div by tile width? + s16 width = (info->width + 8) >> 4; + s16 height = (info->height + 8) >> 4; + s16 i; + s16 j; + u8 result; + u8 b; + register u32 a asm("r10"); + register s32 aa asm("r7"); + + for (i = 0; i < height; i++) + { + a = 1; + b = MapGridGetMetatileBehaviorAt(mapObj->coords2.x, mapObj->coords2.y + a + i); + result = GetReflectionTypeByMetatileBehavior(b); + + if (result) + return result; + + b = MapGridGetMetatileBehaviorAt(mapObj->coords3.x, mapObj->coords3.y + a + i); + result = GetReflectionTypeByMetatileBehavior(b); + + if (result) + return result; + + for (j = 1; j < width; j++) + { + aa = 1; + + b = MapGridGetMetatileBehaviorAt(mapObj->coords2.x + j, mapObj->coords2.y + aa + i); + result = GetReflectionTypeByMetatileBehavior(b); + + if (result) + return result; + + b = MapGridGetMetatileBehaviorAt(mapObj->coords2.x - j, mapObj->coords2.y + aa + i); + result = GetReflectionTypeByMetatileBehavior(b); + + if (result) + return result; + + b = MapGridGetMetatileBehaviorAt(mapObj->coords3.x + j, mapObj->coords3.y + aa + i); + result = GetReflectionTypeByMetatileBehavior(b); + + if (result) + return result; + + b = MapGridGetMetatileBehaviorAt(mapObj->coords3.x - j, mapObj->coords3.y + aa + i); + result = GetReflectionTypeByMetatileBehavior(b); + + if (result) + return result; + } + } + + return 0; +} +#else +__attribute__((naked)) u8 FieldObjectCheckForReflectiveSurface(struct MapObject *mapObj) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x8\n\ + adds r5, r0, 0\n\ + ldrb r0, [r5, 0x5]\n\ + bl GetFieldObjectGraphicsInfo\n\ + movs r2, 0x8\n\ + ldrsh r1, [r0, r2]\n\ + adds r1, 0x8\n\ + lsls r1, 12\n\ + lsrs r1, 16\n\ + str r1, [sp]\n\ + movs r1, 0xA\n\ + ldrsh r0, [r0, r1]\n\ + adds r0, 0x8\n\ + lsls r0, 12\n\ + movs r4, 0\n\ + lsrs r2, r0, 16\n\ + str r2, [sp, 0x4]\n\ + asrs r0, 16\n\ + cmp r4, r0\n\ + blt _08063A7A\n\ + b _08063B80\n\ +_08063A7A:\n\ + movs r0, 0x1\n\ + mov r10, r0\n\ +_08063A7E:\n\ + movs r1, 0x10\n\ + ldrsh r0, [r5, r1]\n\ + movs r2, 0x12\n\ + ldrsh r1, [r5, r2]\n\ + add r1, r10\n\ + lsls r4, 16\n\ + asrs r6, r4, 16\n\ + adds r1, r6\n\ + bl MapGridGetMetatileBehaviorAt\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + bl GetReflectionTypeByMetatileBehavior\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + mov r9, r4\n\ + cmp r0, 0\n\ + bne _08063B82\n\ + movs r1, 0x14\n\ + ldrsh r0, [r5, r1]\n\ + movs r2, 0x16\n\ + ldrsh r1, [r5, r2]\n\ + add r1, r10\n\ + adds r1, r6\n\ + bl MapGridGetMetatileBehaviorAt\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + bl GetReflectionTypeByMetatileBehavior\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0\n\ + bne _08063B82\n\ + movs r2, 0x1\n\ + ldr r1, [sp]\n\ + lsls r0, r1, 16\n\ + asrs r1, r0, 16\n\ + mov r8, r0\n\ + cmp r2, r1\n\ + bge _08063B6E\n\ + movs r0, 0x80\n\ + lsls r0, 9\n\ + asrs r7, r0, 16\n\ +_08063AD8:\n\ + movs r1, 0x10\n\ + ldrsh r0, [r5, r1]\n\ + lsls r1, r2, 16\n\ + asrs r4, r1, 16\n\ + adds r0, r4\n\ + movs r2, 0x12\n\ + ldrsh r1, [r5, r2]\n\ + adds r1, r7\n\ + adds r1, r6\n\ + bl MapGridGetMetatileBehaviorAt\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + bl GetReflectionTypeByMetatileBehavior\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0\n\ + bne _08063B82\n\ + movs r1, 0x10\n\ + ldrsh r0, [r5, r1]\n\ + subs r0, r4\n\ + movs r2, 0x12\n\ + ldrsh r1, [r5, r2]\n\ + adds r1, r7\n\ + adds r1, r6\n\ + bl MapGridGetMetatileBehaviorAt\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + bl GetReflectionTypeByMetatileBehavior\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0\n\ + bne _08063B82\n\ + movs r1, 0x14\n\ + ldrsh r0, [r5, r1]\n\ + adds r0, r4\n\ + movs r2, 0x16\n\ + ldrsh r1, [r5, r2]\n\ + adds r1, r7\n\ + adds r1, r6\n\ + bl MapGridGetMetatileBehaviorAt\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + bl GetReflectionTypeByMetatileBehavior\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0\n\ + bne _08063B82\n\ + movs r1, 0x14\n\ + ldrsh r0, [r5, r1]\n\ + subs r0, r4\n\ + movs r2, 0x16\n\ + ldrsh r1, [r5, r2]\n\ + adds r1, r7\n\ + adds r1, r6\n\ + bl MapGridGetMetatileBehaviorAt\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + bl GetReflectionTypeByMetatileBehavior\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0\n\ + bne _08063B82\n\ + adds r0, r4, 0x1\n\ + lsls r0, 16\n\ + lsrs r2, r0, 16\n\ + cmp r0, r8\n\ + blt _08063AD8\n\ +_08063B6E:\n\ + movs r1, 0x80\n\ + lsls r1, 9\n\ + add r1, r9\n\ + lsrs r4, r1, 16\n\ + ldr r2, [sp, 0x4]\n\ + lsls r0, r2, 16\n\ + cmp r1, r0\n\ + bge _08063B80\n\ + b _08063A7E\n\ +_08063B80:\n\ + movs r0, 0\n\ +_08063B82:\n\ + add sp, 0x8\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\ +.syntax divided\n"); +} +#endif + +u8 GetReflectionTypeByMetatileBehavior(u32 behavior) +{ + if (MetatileBehavior_IsIce(behavior)) + return 1; + else if (MetatileBehavior_IsReflective(behavior)) + return 2; + else + return 0; +} + +u8 GetLedgeJumpDirection(s16 x, s16 y, u8 z) +{ + u8 b; + u8 index = z; + + if (index == 0) + return 0; + else if (index > 4) + index -= 4; + + index--; + b = MapGridGetMetatileBehaviorAt(x, y); + + if (gUnknown_08376040[index](b) == 1) + return index + 1; + + return 0; +} + +void FieldObjectSetSpriteOamTableForLongGrass(struct MapObject *mapObj, struct Sprite *sprite) +{ + if (mapObj->mapobj_bit_4) + return; + + if (!MetatileBehavior_IsLongGrass(mapObj->mapobj_unk_1E)) + return; + + if (!MetatileBehavior_IsLongGrass(mapObj->mapobj_unk_1F)) + return; + + sprite->subspriteTableNum = 4; + + if (ZCoordToPriority(mapObj->elevation) == 1) + sprite->subspriteTableNum = 5; +} + +bool8 IsZCoordMismatchAt(u8 z, s16 x, s16 y) +{ + u8 mapZ; + + if (z == 0) + return 0; + + mapZ = MapGridGetZCoordAt(x, y); + + if (mapZ == 0 || mapZ == 0xF) + return 0; + + if (mapZ != z) + return 1; + + return 0; +} + +void FieldObjectUpdateZCoordAndPriority(struct MapObject *mapObj, struct Sprite *sprite) +{ + if (mapObj->mapobj_bit_26) + return; + + FieldObjectUpdateZCoord(mapObj); + + sprite->subspriteTableNum = gFieldObjectPriorities_08376070[mapObj->elevation]; + sprite->oam.priority = gFieldObjectPriorities_08376060[mapObj->elevation]; +} + +void InitObjectPriorityByZCoord(struct Sprite *sprite, u8 z) +{ + sprite->subspriteTableNum = gFieldObjectPriorities_08376070[z]; + sprite->oam.priority = gFieldObjectPriorities_08376060[z]; +} + +u8 ZCoordToPriority(u8 z) +{ + return gFieldObjectPriorities_08376060[z]; +} + +void FieldObjectUpdateZCoord(struct MapObject *mapObj) +{ + u8 z = MapGridGetZCoordAt(mapObj->coords2.x, mapObj->coords2.y); + u8 z2 = MapGridGetZCoordAt(mapObj->coords3.x, mapObj->coords3.y); + + if (z == 0xF || z2 == 0xF) + return; + + mapObj->mapobj_unk_0B_0 = z; + + if (z != 0 && z != 0xF) + mapObj->elevation = z; +} + +void SetObjectSubpriorityByZCoord(u8 a, struct Sprite *sprite, u8 b) +{ + s32 tmp = sprite->centerToCornerVecY; + u32 tmpa = *(u16 *)&sprite->pos1.y; + u32 tmpb = *(u16 *)&gSpriteCoordOffsetY; + s32 tmp2 = (tmpa - tmp) + tmpb; + u16 tmp3 = (0x10 - ((((u32)tmp2 + 8) & 0xFF) >> 4)) * 2; + sprite->subpriority = tmp3 + gUnknown_08376050[a] + b; +} + +void FieldObjectUpdateSubpriority(struct MapObject *mapObj, struct Sprite *sprite) +{ + if (mapObj->mapobj_bit_26) + return; + + SetObjectSubpriorityByZCoord(mapObj->elevation, sprite, 1); +} + +bool8 AreZCoordsCompatible(u8 a, u8 b) +{ + if (a == 0 || b == 0) + return TRUE; + + if (a != b) + return FALSE; + + return TRUE; +} + +#define READ8(ptr, s, member) ((ptr)[offsetof(s, member)]) + +void GroundEffect_SpawnOnTallGrass(struct MapObject *mapObj, struct Sprite *sprite) +{ + u8 *ptr; + + gUnknown_0202FF84[0] = mapObj->coords2.x; + gUnknown_0202FF84[1] = mapObj->coords2.y; + gUnknown_0202FF84[2] = mapObj->elevation; + gUnknown_0202FF84[3] = 2; + gUnknown_0202FF84[4] = (mapObj->localId << 8) | mapObj->mapNum; + gUnknown_0202FF84[5] = mapObj->mapGroup; + + ptr = (u8 *)&gSaveBlock1; + gUnknown_0202FF84[6] = READ8(ptr, struct SaveBlock1, location.mapNum) << 8 | + READ8(ptr, struct SaveBlock1, location.mapGroup); + + gUnknown_0202FF84[7] = 1; + FieldEffectStart(4); +} + +void sub_8063E94(struct MapObject *mapObj) +{ + u8 *ptr; + + gUnknown_0202FF84[0] = mapObj->coords2.x; + gUnknown_0202FF84[1] = mapObj->coords2.y; + gUnknown_0202FF84[2] = mapObj->elevation; + gUnknown_0202FF84[3] = 2; + gUnknown_0202FF84[4] = (mapObj->localId << 8) | mapObj->mapNum; + gUnknown_0202FF84[5] = mapObj->mapGroup; + + ptr = (u8 *)&gSaveBlock1; + gUnknown_0202FF84[6] = READ8(ptr, struct SaveBlock1, location.mapNum) << 8 | + READ8(ptr, struct SaveBlock1, location.mapGroup); + + gUnknown_0202FF84[7] = 0; + FieldEffectStart(4); +} + +void sub_8063EE0(struct MapObject *mapObj) +{ + u8 *ptr; + + gUnknown_0202FF84[0] = mapObj->coords2.x; + gUnknown_0202FF84[1] = mapObj->coords2.y; + gUnknown_0202FF84[2] = mapObj->elevation; + gUnknown_0202FF84[3] = 2; + gUnknown_0202FF84[4] = (mapObj->localId << 8) | mapObj->mapNum; + gUnknown_0202FF84[5] = mapObj->mapGroup; + + ptr = (u8 *)&gSaveBlock1; + gUnknown_0202FF84[6] = READ8(ptr, struct SaveBlock1, location.mapNum) << 8 | + READ8(ptr, struct SaveBlock1, location.mapGroup); + + gUnknown_0202FF84[7] = 1; + FieldEffectStart(17); +} + +void sub_8063F2C(struct MapObject *mapObj) +{ + u8 *ptr; + + gUnknown_0202FF84[0] = mapObj->coords2.x; + gUnknown_0202FF84[1] = mapObj->coords2.y; + gUnknown_0202FF84[2] = mapObj->elevation; + gUnknown_0202FF84[3] = 2; + gUnknown_0202FF84[4] = (mapObj->localId << 8) | mapObj->mapNum; + gUnknown_0202FF84[5] = mapObj->mapGroup; + + ptr = (u8 *)&gSaveBlock1; + gUnknown_0202FF84[6] = READ8(ptr, struct SaveBlock1, location.mapNum) << 8 | + READ8(ptr, struct SaveBlock1, location.mapGroup); + + gUnknown_0202FF84[7] = 0; + FieldEffectStart(17); +} + +void GroundEffect_WaterReflection(struct MapObject *mapObj, struct Sprite *sprite) +{ + SetUpReflection(mapObj, sprite, 0); +} + +void GroundEffect_IceReflection(struct MapObject *mapObj, struct Sprite *sprite) +{ + SetUpReflection(mapObj, sprite, 1); +} + +void GroundEffect_FlowingWater(struct MapObject *mapObj) +{ + oe_exec_and_other_stuff(FLDEFF_FEET_IN_FLOWING_WATER, mapObj); +} + +void sub_8063FA0(struct MapObject *mapObj, struct Sprite *sprite) +{ + const struct MapObjectGraphicsInfo *info = GetFieldObjectGraphicsInfo(mapObj->graphicsId); + gUnknown_08376080[info->tracks](mapObj, sprite, 0); +} + +void sub_8063FCC(struct MapObject *mapObj, struct Sprite *sprite) +{ + const struct MapObjectGraphicsInfo *info = GetFieldObjectGraphicsInfo(mapObj->graphicsId); + gUnknown_08376080[info->tracks](mapObj, sprite, 1); +} + +void nullsub_50(struct MapObject *mapObj, struct Sprite *sprite, u8 a) +{ +} + +void DoTracksGroundEffect_Footprints(struct MapObject *mapObj, struct Sprite *sprite, u8 a) +{ + u16 buf[2]; + memcpy(&buf, gSandFootprints_FieldEffectData, sizeof(gSandFootprints_FieldEffectData)); + gUnknown_0202FF84[0] = mapObj->coords3.x; + gUnknown_0202FF84[1] = mapObj->coords3.y; + gUnknown_0202FF84[2] = 149; + gUnknown_0202FF84[3] = 2; + gUnknown_0202FF84[4] = mapObj->mapobj_unk_18; + FieldEffectStart(buf[a]); +} + +void DoTracksGroundEffect_BikeTireTracks(struct MapObject *mapObj, struct Sprite *sprite, u8 a) +{ + if (mapObj->coords2.x != mapObj->coords3.x || mapObj->coords2.y != mapObj->coords3.y) + { + gUnknown_0202FF84[0] = mapObj->coords3.x; + gUnknown_0202FF84[1] = mapObj->coords3.y; + gUnknown_0202FF84[2] = 149; + gUnknown_0202FF84[3] = 2; + gUnknown_0202FF84[4] = + gBikeTireTracks_Transitions[mapObj->mapobj_unk_20][mapObj->mapobj_unk_18 - 5]; + FieldEffectStart(FLDEFF_BIKE_TIRE_TRACKS); + } +} + +void GroundEffect_Ripple(struct MapObject *mapObj, struct Sprite *sprite) +{ + DoRippleFieldEffect(mapObj, sprite); +} + +void GroundEffect_StepOnPuddle(struct MapObject *mapObj, struct Sprite *sprite) +{ + oe_exec_and_other_stuff(FLDEFF_SPLASH, mapObj); +} + +void GroundEffect_SandPile(struct MapObject *mapObj, struct Sprite *sprite) +{ + oe_exec_and_other_stuff(FLDEFF_SAND_PILE, mapObj); +} + +void GroundEffect_JumpOnTallGrass(struct MapObject *mapObj, struct Sprite *sprite) +{ + u8 spriteId; + + gUnknown_0202FF84[0] = mapObj->coords2.x; + gUnknown_0202FF84[1] = mapObj->coords2.y; + gUnknown_0202FF84[2] = mapObj->elevation; + gUnknown_0202FF84[3] = 2; + FieldEffectStart(FLDEFF_JUMP_TALL_GRASS); + + spriteId = sub_8126FF0( + mapObj->localId, mapObj->mapNum, mapObj->mapGroup, mapObj->coords2.x, mapObj->coords2.y); + + if (spriteId == MAX_SPRITES) + GroundEffect_SpawnOnTallGrass(mapObj, sprite); +} + +void GroundEffect_JumpOnLongGrass(struct MapObject *mapObj, struct Sprite *sprite) +{ + gUnknown_0202FF84[0] = mapObj->coords2.x; + gUnknown_0202FF84[1] = mapObj->coords2.y; + gUnknown_0202FF84[2] = mapObj->elevation; + gUnknown_0202FF84[3] = 2; + FieldEffectStart(FLDEFF_JUMP_LONG_GRASS); +} + +void GroundEffect_JumpOnShallowWater(struct MapObject *mapObj, struct Sprite *sprite) +{ + gUnknown_0202FF84[0] = mapObj->coords2.x; + gUnknown_0202FF84[1] = mapObj->coords2.y; + gUnknown_0202FF84[2] = mapObj->elevation; + gUnknown_0202FF84[3] = sprite->oam.priority; + FieldEffectStart(FLDEFF_JUMP_SMALL_SPLASH); +} + +void GroundEffect_JumpOnWater(struct MapObject *mapObj, struct Sprite *sprite) +{ + gUnknown_0202FF84[0] = mapObj->coords2.x; + gUnknown_0202FF84[1] = mapObj->coords2.y; + gUnknown_0202FF84[2] = mapObj->elevation; + gUnknown_0202FF84[3] = sprite->oam.priority; + FieldEffectStart(FLDEFF_JUMP_BIG_SPLASH); +} + +void GroundEffect_JumpLandingDust(struct MapObject *mapObj, struct Sprite *sprite) +{ + gUnknown_0202FF84[0] = mapObj->coords2.x; + gUnknown_0202FF84[1] = mapObj->coords2.y; + gUnknown_0202FF84[2] = mapObj->elevation; + gUnknown_0202FF84[3] = sprite->oam.priority; + FieldEffectStart(FLDEFF_DUST); +} + +void GroundEffect_ShortGrass(struct MapObject *mapObj, struct Sprite *sprite) +{ + oe_exec_and_other_stuff(FLDEFF_SHORT_GRASS, mapObj); +} + +void GroundEffect_HotSprings(struct MapObject *mapObj, struct Sprite *sprite) +{ + oe_exec_and_other_stuff(FLDEFF_HOT_SPRINGS_WATER, mapObj); +} + +void GroundEffect_Seaweed(struct MapObject *mapObj, struct Sprite *sprite) +{ + gUnknown_0202FF84[0] = mapObj->coords2.x; + gUnknown_0202FF84[1] = mapObj->coords2.y; + FieldEffectStart(FLDEFF_BUBBLES); +} + +void sub_8064218(struct MapObject *mapObj, struct Sprite *sprite, u32 flags) +{ + u8 i; + for (i = 0; i < NUM_GROUND_EFFECTS; i++, flags >>= 1) + if (flags & 1) + gUnknown_083760A0[i](mapObj, sprite); +} + +void filters_out_some_ground_effects(struct MapObject *mapObj, u32 *flags) +{ + if (mapObj->mapobj_bit_4) + { + mapObj->mapobj_bit_18 = 0; + mapObj->mapobj_bit_20 = 0; + mapObj->mapobj_bit_19 = 0; + mapObj->mapobj_bit_21 = 0; + *flags &= 0xFFF9F7BD; + } +} + +void FilterOutStepOnPuddleGroundEffectIfJumping(struct MapObject *mapObj, u32 *flags) +{ + if (mapObj->mapobj_bit_5) + *flags &= 0xFFFFFBFF; +} + +void DoGroundEffects_OnSpawn(struct MapObject *mapObj, struct Sprite *sprite) +{ + u32 flags; + + if (mapObj->mapobj_bit_2) + { + flags = 0; + FieldObjectUpdateZCoordAndPriority(mapObj, sprite); + GetAllGroundEffectFlags_OnSpawn(mapObj, &flags); + FieldObjectSetSpriteOamTableForLongGrass(mapObj, sprite); + sub_8064218(mapObj, sprite, flags); + mapObj->mapobj_bit_2 = 0; + mapObj->mapobj_bit_4 = 0; + } +} + +void DoGroundEffects_OnBeginStep(struct MapObject *mapObj, struct Sprite *sprite) +{ + u32 flags; + + if (mapObj->mapobj_bit_2) + { + flags = 0; + FieldObjectUpdateZCoordAndPriority(mapObj, sprite); + GetAllGroundEffectFlags_OnBeginStep(mapObj, &flags); + FieldObjectSetSpriteOamTableForLongGrass(mapObj, sprite); + filters_out_some_ground_effects(mapObj, &flags); + sub_8064218(mapObj, sprite, flags); + mapObj->mapobj_bit_2 = 0; + mapObj->mapobj_bit_4 = 0; + } +} + +void DoGroundEffects_OnFinishStep(struct MapObject *mapObj, struct Sprite *sprite) +{ + u32 flags; + + if (mapObj->mapobj_bit_3) + { + flags = 0; + FieldObjectUpdateZCoordAndPriority(mapObj, sprite); + GetAllGroundEffectFlags_OnFinishStep(mapObj, &flags); + FieldObjectSetSpriteOamTableForLongGrass(mapObj, sprite); + FilterOutStepOnPuddleGroundEffectIfJumping(mapObj, &flags); + sub_8064218(mapObj, sprite, flags); + mapObj->mapobj_bit_3 = 0; + mapObj->mapobj_bit_5 = 0; + } +} -- cgit v1.2.3 From e262fb05fb9a4a1fe1f1c3966e2c7e465b446ea9 Mon Sep 17 00:00:00 2001 From: Touched Date: Tue, 22 Aug 2017 18:15:36 +0200 Subject: Convert data/field_ground_effect.s to C --- data/field_ground_effect.s | 72 ------------------- ld_script.txt | 1 - src/field_ground_effect.c | 169 ++++++++++++++++++++++++++++++++++++--------- 3 files changed, 135 insertions(+), 107 deletions(-) delete mode 100644 data/field_ground_effect.s diff --git a/data/field_ground_effect.s b/data/field_ground_effect.s deleted file mode 100644 index d3dbceedb..000000000 --- a/data/field_ground_effect.s +++ /dev/null @@ -1,72 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - - .align 2 -gUnknown_08376040:: @ 8376040 - .4byte MetatileBehavior_IsJumpSouth - .4byte MetatileBehavior_IsJumpNorth - .4byte MetatileBehavior_IsJumpWest - .4byte MetatileBehavior_IsJumpEast - -gUnknown_08376050:: @ 8376050 - .byte 0x73, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x00, 0x00, 0x73 - -@ Each byte corresponds to a sprite priority for a field object. -@ This is directly the inverse of gFieldObjectPriorities_08376070. -gFieldObjectPriorities_08376060:: @ 8376060 - .byte 2, 2, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 0, 0, 2 - -@ Each byte corresponds to a sprite priority for a field object. -@ This is the inverse of gFieldObjectPriorities_08376060. -@ 1 = Above player sprite -@ 2 = Below player sprite -gFieldObjectPriorities_08376070:: @ 8376070 - .byte 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 0, 0, 1 - - .align 2 -gUnknown_08376080:: @ 8376080 - .4byte nullsub_50 - .4byte DoTracksGroundEffect_Footprints - .4byte DoTracksGroundEffect_BikeTireTracks - -@ First byte is a Field Effect script id. (gFieldEffectScriptPointers) -@ Last three bytes are unknown. -gSandFootprints_FieldEffectData:: @ 837608C - .byte 0xD, 0x0, 0x18, 0x0 - -@ Specifies which bike track shape to show next. -@ For example, when the bike turns from up to right, it will show -@ a track that curves to the right. -@ Each 4-byte row corresponds to the initial direction of the bike, and -@ each byte in that row is for the next direction of the bike in the order -@ of down, up, left, right. -gBikeTireTracks_Transitions:: @ 8376090 - .byte 1, 2, 7, 8 - .byte 1, 2, 6, 5 - .byte 5, 8, 3, 4 - .byte 6, 7, 3, 4 - - .align 2 -gUnknown_083760A0:: @ 83760A0 - .4byte GroundEffect_SpawnOnTallGrass - .4byte sub_8063E94 - .4byte sub_8063EE0 - .4byte sub_8063F2C - .4byte GroundEffect_WaterReflection - .4byte GroundEffect_IceReflection - .4byte GroundEffect_FlowingWater - .4byte sub_8063FA0 - .4byte sub_8063FCC - .4byte GroundEffect_Ripple - .4byte GroundEffect_StepOnPuddle - .4byte GroundEffect_SandPile - .4byte GroundEffect_JumpOnTallGrass - .4byte GroundEffect_JumpOnLongGrass - .4byte GroundEffect_JumpOnShallowWater - .4byte GroundEffect_JumpOnWater - .4byte GroundEffect_JumpLandingDust - .4byte GroundEffect_ShortGrass - .4byte GroundEffect_HotSprings - .4byte GroundEffect_Seaweed diff --git a/ld_script.txt b/ld_script.txt index 231951647..89753bc0e 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -351,7 +351,6 @@ SECTIONS { src/field_player_avatar.o(.rodata); src/field_map_obj.o(.rodata); src/field_ground_effect.o(.rodata); - data/field_ground_effect.o(.rodata); data/field_map_obj_helpers.o(.rodata); data/text_window.o(.rodata); src/script.o(.rodata); diff --git a/src/field_ground_effect.c b/src/field_ground_effect.c index 79729471c..1a06b80f6 100644 --- a/src/field_ground_effect.c +++ b/src/field_ground_effect.c @@ -6,15 +6,122 @@ #include "fieldmap.h" #include "metatile_behavior.h" -extern u32 gUnknown_08376008[]; -extern u8 (*gUnknown_08376040[4])(u32 a); -extern const u8 gFieldObjectPriorities_08376070[]; -extern const u8 gFieldObjectPriorities_08376060[]; -extern const u8 gUnknown_08376050[]; -extern void (*gUnknown_08376080[3])(struct MapObject *mapObj, struct Sprite *sprite, u8 a); -extern const u8 gSandFootprints_FieldEffectData[4]; -extern const u8 gBikeTireTracks_Transitions[4][4]; -extern void (*gUnknown_083760A0[0x14])(struct MapObject *mapObj, struct Sprite *sprite); +void nullsub_50(struct MapObject *mapObj, struct Sprite *sprite, u8); +void DoTracksGroundEffect_Footprints(struct MapObject *mapObj, struct Sprite *sprite, u8); +void DoTracksGroundEffect_BikeTireTracks(struct MapObject *mapObj, struct Sprite *sprite, u8); +void GroundEffect_SpawnOnTallGrass(struct MapObject *mapObj, struct Sprite *sprite); +void sub_8063E94(struct MapObject *mapObj, struct Sprite *sprite); +void sub_8063EE0(struct MapObject *mapObj, struct Sprite *sprite); +void sub_8063F2C(struct MapObject *mapObj, struct Sprite *sprite); +void GroundEffect_WaterReflection(struct MapObject *mapObj, struct Sprite *sprite); +void GroundEffect_IceReflection(struct MapObject *mapObj, struct Sprite *sprite); +void GroundEffect_FlowingWater(struct MapObject *mapObj, struct Sprite *sprite); +void sub_8063FA0(struct MapObject *mapObj, struct Sprite *sprite); +void sub_8063FCC(struct MapObject *mapObj, struct Sprite *sprite); +void GroundEffect_Ripple(struct MapObject *mapObj, struct Sprite *sprite); +void GroundEffect_StepOnPuddle(struct MapObject *mapObj, struct Sprite *sprite); +void GroundEffect_SandPile(struct MapObject *mapObj, struct Sprite *sprite); +void GroundEffect_JumpOnTallGrass(struct MapObject *mapObj, struct Sprite *sprite); +void GroundEffect_JumpOnLongGrass(struct MapObject *mapObj, struct Sprite *sprite); +void GroundEffect_JumpOnShallowWater(struct MapObject *mapObj, struct Sprite *sprite); +void GroundEffect_JumpOnWater(struct MapObject *mapObj, struct Sprite *sprite); +void GroundEffect_JumpLandingDust(struct MapObject *mapObj, struct Sprite *sprite); +void GroundEffect_ShortGrass(struct MapObject *mapObj, struct Sprite *sprite); +void GroundEffect_HotSprings(struct MapObject *mapObj, struct Sprite *sprite); +void GroundEffect_Seaweed(struct MapObject *mapObj, struct Sprite *sprite); + +static const u32 sReflectionFlags[2] = { 0x00000020, 0x00000010 }; + +typedef bool8 (*MetatileFunc)(u8); + +static const MetatileFunc metatileFuncs[] = { + MetatileBehavior_IsTallGrass, + MetatileBehavior_IsLongGrass, + MetatileBehavior_IsPuddle, + MetatileBehavior_IsSurfableWaterOrUnderwater, + MetatileBehavior_IsShallowFlowingWater, + MetatileBehavior_IsATile, +}; + +static const u32 jumpLandingFlags[] = { + 0x00001000, // Landing in tall grass + 0x00002000, // Landing in long grass + 0x00004000, // Landing on puddle + 0x00008000, // Landing on surfable water or underwater + 0x00004000, // Landing on shallow flowing water + 0x00010000, // Landing on any other type of ground +}; + +bool8 (*const gUnknown_08376040[])(u8) = { + MetatileBehavior_IsJumpSouth, + MetatileBehavior_IsJumpNorth, + MetatileBehavior_IsJumpWest, + MetatileBehavior_IsJumpEast, +}; + +const u8 gUnknown_08376050[] = { + 0x73, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x00, 0x00, 0x73 +}; + +// Each byte corresponds to a sprite priority for a field object. +// This is directly the inverse of gFieldObjectPriorities_08376070. +const u8 gFieldObjectPriorities_08376060[] = { + 2, 2, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 0, 0, 2 +}; + +// Each byte corresponds to a sprite priority for a field object. +// This is the inverse of gFieldObjectPriorities_08376060. +// 1 = Above player sprite +// 2 = Below player sprite +const u8 gFieldObjectPriorities_08376070[] = { + 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 0, 0, 1, +}; + +void (*const gUnknown_08376080[3])(struct MapObject *mapObj, struct Sprite *sprite, u8 a) = { + nullsub_50, + DoTracksGroundEffect_Footprints, + DoTracksGroundEffect_BikeTireTracks, +}; + +// First byte is a Field Effect script id. (gFieldEffectScriptPointers) +// Last three bytes are unknown. +const u8 gSandFootprints_FieldEffectData[4] = { 0xD, 0x0, 0x18, 0x0 }; + +// Specifies which bike track shape to show next. +// For example, when the bike turns from up to right, it will show +// a track that curves to the right. +// Each 4-byte row corresponds to the initial direction of the bike, and +// each byte in that row is for the next direction of the bike in the order +// of down, up, left, right. +const u8 gBikeTireTracks_Transitions[4][4] = { + 1, 2, 7, 8, + 1, 2, 6, 5, + 5, 8, 3, 4, + 6, 7, 3, 4, +}; + +void (*const gUnknown_083760A0[0x14])(struct MapObject *mapObj, struct Sprite *sprite) = { + GroundEffect_SpawnOnTallGrass, + sub_8063E94, + sub_8063EE0, + sub_8063F2C, + GroundEffect_WaterReflection, + GroundEffect_IceReflection, + GroundEffect_FlowingWater, + sub_8063FA0, + sub_8063FCC, + GroundEffect_Ripple, + GroundEffect_StepOnPuddle, + GroundEffect_SandPile, + GroundEffect_JumpOnTallGrass, + GroundEffect_JumpOnLongGrass, + GroundEffect_JumpOnShallowWater, + GroundEffect_JumpOnWater, + GroundEffect_JumpLandingDust, + GroundEffect_ShortGrass, + GroundEffect_HotSprings, + GroundEffect_Seaweed +}; #define NUM_GROUND_EFFECTS (sizeof(gUnknown_083760A0) / sizeof(gUnknown_083760A0[0])) @@ -65,8 +172,18 @@ void FieldObjectUpdateMetatileBehaviors(struct MapObject *mapObj) void GetGroundEffectFlags_Reflection(struct MapObject *mapObj, u32 *flags) { - u32 reflectionFlags[2] = { 0x00000020, 0x00000010 }; - u8 type = FieldObjectCheckForReflectiveSurface(mapObj); + u32 reflectionFlags[2]; + u32 a; u32 b; + u8 type; + + // Declaring sReflectionFlags inside the function is a neater match than + // this. + b = sReflectionFlags[1]; + a = sReflectionFlags[0]; + reflectionFlags[0] = a; + reflectionFlags[1] = b; + + type = FieldObjectCheckForReflectiveSurface(mapObj); if (type) { @@ -217,25 +334,7 @@ void GetGroundEffectFlags_Seaweed(struct MapObject *mapObj, u32 *flags) void GetGroundEffectFlags_JumpLanding(struct MapObject *mapObj, u32 *flags) { - typedef bool8 (*MetatileFunc)(u8); - - static const MetatileFunc metatileFuncs[] = { - MetatileBehavior_IsTallGrass, - MetatileBehavior_IsLongGrass, - MetatileBehavior_IsPuddle, - MetatileBehavior_IsSurfableWaterOrUnderwater, - MetatileBehavior_IsShallowFlowingWater, - MetatileBehavior_IsATile, - }; - - static const u32 jumpLandingFlags[] = { - 0x00001000, // Landing in tall grass - 0x00002000, // Landing in long grass - 0x00004000, // Landing on puddle - 0x00008000, // Landing on surfable water or underwater - 0x00004000, // Landing on shallow flowing water - 0x00010000, // Landing on any other type of ground - }; + if (mapObj->mapobj_bit_5 && !mapObj->mapobj_bit_25) { @@ -632,7 +731,7 @@ void GroundEffect_SpawnOnTallGrass(struct MapObject *mapObj, struct Sprite *spri FieldEffectStart(4); } -void sub_8063E94(struct MapObject *mapObj) +void sub_8063E94(struct MapObject *mapObj, struct Sprite *sprite) { u8 *ptr; @@ -651,7 +750,7 @@ void sub_8063E94(struct MapObject *mapObj) FieldEffectStart(4); } -void sub_8063EE0(struct MapObject *mapObj) +void sub_8063EE0(struct MapObject *mapObj, struct Sprite *sprite) { u8 *ptr; @@ -670,7 +769,7 @@ void sub_8063EE0(struct MapObject *mapObj) FieldEffectStart(17); } -void sub_8063F2C(struct MapObject *mapObj) +void sub_8063F2C(struct MapObject *mapObj, struct Sprite *sprite) { u8 *ptr; @@ -699,7 +798,7 @@ void GroundEffect_IceReflection(struct MapObject *mapObj, struct Sprite *sprite) SetUpReflection(mapObj, sprite, 1); } -void GroundEffect_FlowingWater(struct MapObject *mapObj) +void GroundEffect_FlowingWater(struct MapObject *mapObj, struct Sprite *sprite) { oe_exec_and_other_stuff(FLDEFF_FEET_IN_FLOWING_WATER, mapObj); } @@ -906,3 +1005,5 @@ void DoGroundEffects_OnFinishStep(struct MapObject *mapObj, struct Sprite *sprit mapObj->mapobj_bit_5 = 0; } } + + -- cgit v1.2.3 From 8f0198a5e77a9493af0b39ecc64b2d64a0944476 Mon Sep 17 00:00:00 2001 From: Touched Date: Tue, 22 Aug 2017 18:22:54 +0200 Subject: Format src/field_ground_effect.c --- src/field_ground_effect.c | 60 +++++++++++++++++++++-------------------------- 1 file changed, 27 insertions(+), 33 deletions(-) diff --git a/src/field_ground_effect.c b/src/field_ground_effect.c index 1a06b80f6..7aae07996 100644 --- a/src/field_ground_effect.c +++ b/src/field_ground_effect.c @@ -6,9 +6,10 @@ #include "fieldmap.h" #include "metatile_behavior.h" -void nullsub_50(struct MapObject *mapObj, struct Sprite *sprite, u8); -void DoTracksGroundEffect_Footprints(struct MapObject *mapObj, struct Sprite *sprite, u8); -void DoTracksGroundEffect_BikeTireTracks(struct MapObject *mapObj, struct Sprite *sprite, u8); +static void nullsub(struct MapObject *mapObj, struct Sprite *sprite, u8); +static void DoTracksGroundEffect_Footprints(struct MapObject *mapObj, struct Sprite *sprite, u8); +static void DoTracksGroundEffect_BikeTireTracks( + struct MapObject *mapObj, struct Sprite *sprite, u8); void GroundEffect_SpawnOnTallGrass(struct MapObject *mapObj, struct Sprite *sprite); void sub_8063E94(struct MapObject *mapObj, struct Sprite *sprite); void sub_8063EE0(struct MapObject *mapObj, struct Sprite *sprite); @@ -30,7 +31,7 @@ void GroundEffect_ShortGrass(struct MapObject *mapObj, struct Sprite *sprite); void GroundEffect_HotSprings(struct MapObject *mapObj, struct Sprite *sprite); void GroundEffect_Seaweed(struct MapObject *mapObj, struct Sprite *sprite); -static const u32 sReflectionFlags[2] = { 0x00000020, 0x00000010 }; +static const u32 sReflectionFlags[] = { 0x00000020, 0x00000010 }; typedef bool8 (*MetatileFunc)(u8); @@ -52,20 +53,20 @@ static const u32 jumpLandingFlags[] = { 0x00010000, // Landing on any other type of ground }; -bool8 (*const gUnknown_08376040[])(u8) = { +static bool8 (*const gUnknown_08376040[])(u8) = { MetatileBehavior_IsJumpSouth, MetatileBehavior_IsJumpNorth, MetatileBehavior_IsJumpWest, MetatileBehavior_IsJumpEast, }; -const u8 gUnknown_08376050[] = { +static const u8 gUnknown_08376050[] = { 0x73, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x00, 0x00, 0x73 }; // Each byte corresponds to a sprite priority for a field object. // This is directly the inverse of gFieldObjectPriorities_08376070. -const u8 gFieldObjectPriorities_08376060[] = { +static const u8 gFieldObjectPriorities_08376060[] = { 2, 2, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 0, 0, 2 }; @@ -73,19 +74,17 @@ const u8 gFieldObjectPriorities_08376060[] = { // This is the inverse of gFieldObjectPriorities_08376060. // 1 = Above player sprite // 2 = Below player sprite -const u8 gFieldObjectPriorities_08376070[] = { +static const u8 gFieldObjectPriorities_08376070[] = { 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 0, 0, 1, }; -void (*const gUnknown_08376080[3])(struct MapObject *mapObj, struct Sprite *sprite, u8 a) = { - nullsub_50, - DoTracksGroundEffect_Footprints, - DoTracksGroundEffect_BikeTireTracks, +static void (*const gUnknown_08376080[])(struct MapObject *mapObj, struct Sprite *sprite, u8 a) = { + nullsub, DoTracksGroundEffect_Footprints, DoTracksGroundEffect_BikeTireTracks, }; // First byte is a Field Effect script id. (gFieldEffectScriptPointers) // Last three bytes are unknown. -const u8 gSandFootprints_FieldEffectData[4] = { 0xD, 0x0, 0x18, 0x0 }; +static const u8 gSandFootprints_FieldEffectData[] = { 0xD, 0x0, 0x18, 0x0 }; // Specifies which bike track shape to show next. // For example, when the bike turns from up to right, it will show @@ -93,15 +92,12 @@ const u8 gSandFootprints_FieldEffectData[4] = { 0xD, 0x0, 0x18, 0x0 }; // Each 4-byte row corresponds to the initial direction of the bike, and // each byte in that row is for the next direction of the bike in the order // of down, up, left, right. -const u8 gBikeTireTracks_Transitions[4][4] = { - 1, 2, 7, 8, - 1, 2, 6, 5, - 5, 8, 3, 4, - 6, 7, 3, 4, +static const u8 gBikeTireTracks_Transitions[4][4] = { + 1, 2, 7, 8, 1, 2, 6, 5, 5, 8, 3, 4, 6, 7, 3, 4, }; -void (*const gUnknown_083760A0[0x14])(struct MapObject *mapObj, struct Sprite *sprite) = { - GroundEffect_SpawnOnTallGrass, +static void (*const gUnknown_083760A0[])( + struct MapObject *mapObj, struct Sprite *sprite) = { GroundEffect_SpawnOnTallGrass, sub_8063E94, sub_8063EE0, sub_8063F2C, @@ -120,12 +116,11 @@ void (*const gUnknown_083760A0[0x14])(struct MapObject *mapObj, struct Sprite *s GroundEffect_JumpLandingDust, GroundEffect_ShortGrass, GroundEffect_HotSprings, - GroundEffect_Seaweed -}; + GroundEffect_Seaweed }; #define NUM_GROUND_EFFECTS (sizeof(gUnknown_083760A0) / sizeof(gUnknown_083760A0[0])) -void GetAllGroundEffectFlags_OnSpawn(struct MapObject *mapObj, u32 *flags) +static void GetAllGroundEffectFlags_OnSpawn(struct MapObject *mapObj, u32 *flags) { FieldObjectUpdateMetatileBehaviors(mapObj); GetGroundEffectFlags_Reflection(mapObj, flags); @@ -137,7 +132,7 @@ void GetAllGroundEffectFlags_OnSpawn(struct MapObject *mapObj, u32 *flags) GetGroundEffectFlags_HotSprings(mapObj, flags); } -void GetAllGroundEffectFlags_OnBeginStep(struct MapObject *mapObj, u32 *flags) +static void GetAllGroundEffectFlags_OnBeginStep(struct MapObject *mapObj, u32 *flags) { FieldObjectUpdateMetatileBehaviors(mapObj); GetGroundEffectFlags_Reflection(mapObj, flags); @@ -151,7 +146,7 @@ void GetAllGroundEffectFlags_OnBeginStep(struct MapObject *mapObj, u32 *flags) GetGroundEffectFlags_HotSprings(mapObj, flags); } -void GetAllGroundEffectFlags_OnFinishStep(struct MapObject *mapObj, u32 *flags) +static void GetAllGroundEffectFlags_OnFinishStep(struct MapObject *mapObj, u32 *flags) { FieldObjectUpdateMetatileBehaviors(mapObj); GetGroundEffectFlags_ShallowFlowingWater(mapObj, flags); @@ -173,11 +168,12 @@ void FieldObjectUpdateMetatileBehaviors(struct MapObject *mapObj) void GetGroundEffectFlags_Reflection(struct MapObject *mapObj, u32 *flags) { u32 reflectionFlags[2]; - u32 a; u32 b; + u32 a; + u32 b; u8 type; // Declaring sReflectionFlags inside the function is a neater match than - // this. + // this. b = sReflectionFlags[1]; a = sReflectionFlags[0]; reflectionFlags[0] = a; @@ -335,7 +331,6 @@ void GetGroundEffectFlags_Seaweed(struct MapObject *mapObj, u32 *flags) void GetGroundEffectFlags_JumpLanding(struct MapObject *mapObj, u32 *flags) { - if (mapObj->mapobj_bit_5 && !mapObj->mapobj_bit_25) { u8 i; @@ -815,11 +810,11 @@ void sub_8063FCC(struct MapObject *mapObj, struct Sprite *sprite) gUnknown_08376080[info->tracks](mapObj, sprite, 1); } -void nullsub_50(struct MapObject *mapObj, struct Sprite *sprite, u8 a) +static void nullsub(struct MapObject *mapObj, struct Sprite *sprite, u8 a) { } -void DoTracksGroundEffect_Footprints(struct MapObject *mapObj, struct Sprite *sprite, u8 a) +static void DoTracksGroundEffect_Footprints(struct MapObject *mapObj, struct Sprite *sprite, u8 a) { u16 buf[2]; memcpy(&buf, gSandFootprints_FieldEffectData, sizeof(gSandFootprints_FieldEffectData)); @@ -831,7 +826,8 @@ void DoTracksGroundEffect_Footprints(struct MapObject *mapObj, struct Sprite *sp FieldEffectStart(buf[a]); } -void DoTracksGroundEffect_BikeTireTracks(struct MapObject *mapObj, struct Sprite *sprite, u8 a) +static void DoTracksGroundEffect_BikeTireTracks( + struct MapObject *mapObj, struct Sprite *sprite, u8 a) { if (mapObj->coords2.x != mapObj->coords3.x || mapObj->coords2.y != mapObj->coords3.y) { @@ -1005,5 +1001,3 @@ void DoGroundEffects_OnFinishStep(struct MapObject *mapObj, struct Sprite *sprit mapObj->mapobj_bit_5 = 0; } } - - -- cgit v1.2.3 From 8b9e9128b32b253d0b6d0be5b23c72d2fbb74530 Mon Sep 17 00:00:00 2001 From: Touched Date: Sat, 26 Aug 2017 00:03:07 +0200 Subject: Requested fixes for field_ground_effect --- src/field_ground_effect.c | 45 +++++++++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/src/field_ground_effect.c b/src/field_ground_effect.c index 7aae07996..594fe9fd9 100644 --- a/src/field_ground_effect.c +++ b/src/field_ground_effect.c @@ -93,7 +93,10 @@ static const u8 gSandFootprints_FieldEffectData[] = { 0xD, 0x0, 0x18, 0x0 }; // each byte in that row is for the next direction of the bike in the order // of down, up, left, right. static const u8 gBikeTireTracks_Transitions[4][4] = { - 1, 2, 7, 8, 1, 2, 6, 5, 5, 8, 3, 4, 6, 7, 3, 4, + 1, 2, 7, 8, + 1, 2, 6, 5, + 5, 8, 3, 4, + 6, 7, 3, 4, }; static void (*const gUnknown_083760A0[])( @@ -118,8 +121,6 @@ static void (*const gUnknown_083760A0[])( GroundEffect_HotSprings, GroundEffect_Seaweed }; -#define NUM_GROUND_EFFECTS (sizeof(gUnknown_083760A0) / sizeof(gUnknown_083760A0[0])) - static void GetAllGroundEffectFlags_OnSpawn(struct MapObject *mapObj, u32 *flags) { FieldObjectUpdateMetatileBehaviors(mapObj); @@ -226,8 +227,8 @@ void GetGroundEffectFlags_Tracks(struct MapObject *mapObj, u32 *flags) { *flags |= 0x100; } - else if (MetatileBehavior_IsSandOrDeepSand(mapObj->mapobj_unk_1F) || - MetatileBehavior_IsUnusedFootprintMetatile(mapObj->mapobj_unk_1F)) + else if (MetatileBehavior_IsSandOrDeepSand(mapObj->mapobj_unk_1F) + || MetatileBehavior_IsUnusedFootprintMetatile(mapObj->mapobj_unk_1F)) { *flags |= 0x80; } @@ -235,8 +236,8 @@ void GetGroundEffectFlags_Tracks(struct MapObject *mapObj, u32 *flags) void GetGroundEffectFlags_SandPile(struct MapObject *mapObj, u32 *flags) { - if (MetatileBehavior_IsDeepSand(mapObj->mapobj_unk_1E) && - MetatileBehavior_IsDeepSand(mapObj->mapobj_unk_1F)) + if (MetatileBehavior_IsDeepSand(mapObj->mapobj_unk_1E) + && MetatileBehavior_IsDeepSand(mapObj->mapobj_unk_1F)) { if (!mapObj->mapobj_bit_20) { @@ -253,10 +254,10 @@ void GetGroundEffectFlags_SandPile(struct MapObject *mapObj, u32 *flags) void GetGroundEffectFlags_ShallowFlowingWater(struct MapObject *mapObj, u32 *flags) { - if ((MetatileBehavior_IsShallowFlowingWater(mapObj->mapobj_unk_1E) && - MetatileBehavior_IsShallowFlowingWater(mapObj->mapobj_unk_1F)) || - (MetatileBehavior_IsPacifidlogLog(mapObj->mapobj_unk_1E) && - MetatileBehavior_IsPacifidlogLog(mapObj->mapobj_unk_1F))) + if ((MetatileBehavior_IsShallowFlowingWater(mapObj->mapobj_unk_1E) + && MetatileBehavior_IsShallowFlowingWater(mapObj->mapobj_unk_1F)) + || (MetatileBehavior_IsPacifidlogLog(mapObj->mapobj_unk_1E) + && MetatileBehavior_IsPacifidlogLog(mapObj->mapobj_unk_1F))) { if (!mapObj->mapobj_bit_19) { @@ -273,8 +274,8 @@ void GetGroundEffectFlags_ShallowFlowingWater(struct MapObject *mapObj, u32 *fla void GetGroundEffectFlags_Puddle(struct MapObject *mapObj, u32 *flags) { - if (MetatileBehavior_IsPuddle(mapObj->mapobj_unk_1E) && - MetatileBehavior_IsPuddle(mapObj->mapobj_unk_1F)) + if (MetatileBehavior_IsPuddle(mapObj->mapobj_unk_1E) + && MetatileBehavior_IsPuddle(mapObj->mapobj_unk_1F)) { *flags |= 0x400; } @@ -288,8 +289,8 @@ void GetGroundEffectFlags_Ripple(struct MapObject *mapObj, u32 *flags) void GetGroundEffectFlags_ShortGrass(struct MapObject *mapObj, u32 *flags) { - if (MetatileBehavior_IsShortGrass(mapObj->mapobj_unk_1E) && - MetatileBehavior_IsShortGrass(mapObj->mapobj_unk_1F)) + if (MetatileBehavior_IsShortGrass(mapObj->mapobj_unk_1E) + && MetatileBehavior_IsShortGrass(mapObj->mapobj_unk_1F)) { if (!mapObj->mapobj_bit_18) { @@ -306,8 +307,8 @@ void GetGroundEffectFlags_ShortGrass(struct MapObject *mapObj, u32 *flags) void GetGroundEffectFlags_HotSprings(struct MapObject *mapObj, u32 *flags) { - if (MetatileBehavior_IsHotSprings(mapObj->mapobj_unk_1E) && - MetatileBehavior_IsHotSprings(mapObj->mapobj_unk_1F)) + if (MetatileBehavior_IsHotSprings(mapObj->mapobj_unk_1E) + && MetatileBehavior_IsHotSprings(mapObj->mapobj_unk_1F)) { if (!mapObj->mapobj_bit_21) { @@ -627,17 +628,17 @@ bool8 IsZCoordMismatchAt(u8 z, s16 x, s16 y) u8 mapZ; if (z == 0) - return 0; + return FALSE; mapZ = MapGridGetZCoordAt(x, y); if (mapZ == 0 || mapZ == 0xF) - return 0; + return FALSE; if (mapZ != z) - return 1; + return TRUE; - return 0; + return FALSE; } void FieldObjectUpdateZCoordAndPriority(struct MapObject *mapObj, struct Sprite *sprite) @@ -929,7 +930,7 @@ void GroundEffect_Seaweed(struct MapObject *mapObj, struct Sprite *sprite) void sub_8064218(struct MapObject *mapObj, struct Sprite *sprite, u32 flags) { u8 i; - for (i = 0; i < NUM_GROUND_EFFECTS; i++, flags >>= 1) + for (i = 0; i < ARRAY_COUNT(gUnknown_083760A0); i++, flags >>= 1) if (flags & 1) gUnknown_083760A0[i](mapObj, sprite); } -- cgit v1.2.3 From a2b2f48dee099a3cf1e439af694678f6f046844f Mon Sep 17 00:00:00 2001 From: Touched Date: Sat, 26 Aug 2017 00:36:05 +0200 Subject: Format field_group_effect --- src/field_ground_effect.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/field_ground_effect.c b/src/field_ground_effect.c index 594fe9fd9..cb8b5e479 100644 --- a/src/field_ground_effect.c +++ b/src/field_ground_effect.c @@ -99,8 +99,8 @@ static const u8 gBikeTireTracks_Transitions[4][4] = { 6, 7, 3, 4, }; -static void (*const gUnknown_083760A0[])( - struct MapObject *mapObj, struct Sprite *sprite) = { GroundEffect_SpawnOnTallGrass, +static void (*const gUnknown_083760A0[])(struct MapObject *mapObj, struct Sprite *sprite) = { + GroundEffect_SpawnOnTallGrass, sub_8063E94, sub_8063EE0, sub_8063F2C, @@ -119,7 +119,8 @@ static void (*const gUnknown_083760A0[])( GroundEffect_JumpLandingDust, GroundEffect_ShortGrass, GroundEffect_HotSprings, - GroundEffect_Seaweed }; + GroundEffect_Seaweed +}; static void GetAllGroundEffectFlags_OnSpawn(struct MapObject *mapObj, u32 *flags) { @@ -720,8 +721,8 @@ void GroundEffect_SpawnOnTallGrass(struct MapObject *mapObj, struct Sprite *spri gUnknown_0202FF84[5] = mapObj->mapGroup; ptr = (u8 *)&gSaveBlock1; - gUnknown_0202FF84[6] = READ8(ptr, struct SaveBlock1, location.mapNum) << 8 | - READ8(ptr, struct SaveBlock1, location.mapGroup); + gUnknown_0202FF84[6] = READ8(ptr, struct SaveBlock1, location.mapNum) << 8 + | READ8(ptr, struct SaveBlock1, location.mapGroup); gUnknown_0202FF84[7] = 1; FieldEffectStart(4); @@ -739,8 +740,8 @@ void sub_8063E94(struct MapObject *mapObj, struct Sprite *sprite) gUnknown_0202FF84[5] = mapObj->mapGroup; ptr = (u8 *)&gSaveBlock1; - gUnknown_0202FF84[6] = READ8(ptr, struct SaveBlock1, location.mapNum) << 8 | - READ8(ptr, struct SaveBlock1, location.mapGroup); + gUnknown_0202FF84[6] = READ8(ptr, struct SaveBlock1, location.mapNum) << 8 + | READ8(ptr, struct SaveBlock1, location.mapGroup); gUnknown_0202FF84[7] = 0; FieldEffectStart(4); @@ -758,8 +759,8 @@ void sub_8063EE0(struct MapObject *mapObj, struct Sprite *sprite) gUnknown_0202FF84[5] = mapObj->mapGroup; ptr = (u8 *)&gSaveBlock1; - gUnknown_0202FF84[6] = READ8(ptr, struct SaveBlock1, location.mapNum) << 8 | - READ8(ptr, struct SaveBlock1, location.mapGroup); + gUnknown_0202FF84[6] = READ8(ptr, struct SaveBlock1, location.mapNum) << 8 + | READ8(ptr, struct SaveBlock1, location.mapGroup); gUnknown_0202FF84[7] = 1; FieldEffectStart(17); @@ -777,8 +778,8 @@ void sub_8063F2C(struct MapObject *mapObj, struct Sprite *sprite) gUnknown_0202FF84[5] = mapObj->mapGroup; ptr = (u8 *)&gSaveBlock1; - gUnknown_0202FF84[6] = READ8(ptr, struct SaveBlock1, location.mapNum) << 8 | - READ8(ptr, struct SaveBlock1, location.mapGroup); + gUnknown_0202FF84[6] = READ8(ptr, struct SaveBlock1, location.mapNum) << 8 + | READ8(ptr, struct SaveBlock1, location.mapGroup); gUnknown_0202FF84[7] = 0; FieldEffectStart(17); -- cgit v1.2.3 From 88f3eac7445af904ef7f4852b505c933171fef3f Mon Sep 17 00:00:00 2001 From: Touched Date: Sat, 26 Aug 2017 16:01:52 +0200 Subject: Fix non-matching C in field_ground_effect --- src/field_ground_effect.c | 245 +++++----------------------------------------- 1 file changed, 25 insertions(+), 220 deletions(-) diff --git a/src/field_ground_effect.c b/src/field_ground_effect.c index cb8b5e479..1e5f5ba20 100644 --- a/src/field_ground_effect.c +++ b/src/field_ground_effect.c @@ -30,6 +30,7 @@ void GroundEffect_JumpLandingDust(struct MapObject *mapObj, struct Sprite *sprit void GroundEffect_ShortGrass(struct MapObject *mapObj, struct Sprite *sprite); void GroundEffect_HotSprings(struct MapObject *mapObj, struct Sprite *sprite); void GroundEffect_Seaweed(struct MapObject *mapObj, struct Sprite *sprite); +u8 GetReflectionTypeByMetatileBehavior(u32 behavior); static const u32 sReflectionFlags[] = { 0x00000020, 0x00000010 }; @@ -348,7 +349,6 @@ void GetGroundEffectFlags_JumpLanding(struct MapObject *mapObj, u32 *flags) } } -#ifdef NONMATCHING u8 FieldObjectCheckForReflectiveSurface(struct MapObject *mapObj) { const struct MapObjectGraphicsInfo *info = GetFieldObjectGraphicsInfo(mapObj->graphicsId); @@ -360,223 +360,30 @@ u8 FieldObjectCheckForReflectiveSurface(struct MapObject *mapObj) s16 j; u8 result; u8 b; - register u32 a asm("r10"); - register s32 aa asm("r7"); + s16 one; - for (i = 0; i < height; i++) - { - a = 1; - b = MapGridGetMetatileBehaviorAt(mapObj->coords2.x, mapObj->coords2.y + a + i); - result = GetReflectionTypeByMetatileBehavior(b); - - if (result) - return result; - - b = MapGridGetMetatileBehaviorAt(mapObj->coords3.x, mapObj->coords3.y + a + i); - result = GetReflectionTypeByMetatileBehavior(b); - - if (result) - return result; +#define RETURN_REFLECTION_TYPE_AT(x, y) \ + b = MapGridGetMetatileBehaviorAt(x, y); \ + result = GetReflectionTypeByMetatileBehavior(b); \ + if (result != 0) \ + return result; + for (i = 0, one = 1; i < height; i++) + { + RETURN_REFLECTION_TYPE_AT(mapObj->coords2.x, mapObj->coords2.y + one + i) + RETURN_REFLECTION_TYPE_AT(mapObj->coords3.x, mapObj->coords3.y + one + i) for (j = 1; j < width; j++) { - aa = 1; - - b = MapGridGetMetatileBehaviorAt(mapObj->coords2.x + j, mapObj->coords2.y + aa + i); - result = GetReflectionTypeByMetatileBehavior(b); - - if (result) - return result; - - b = MapGridGetMetatileBehaviorAt(mapObj->coords2.x - j, mapObj->coords2.y + aa + i); - result = GetReflectionTypeByMetatileBehavior(b); - - if (result) - return result; - - b = MapGridGetMetatileBehaviorAt(mapObj->coords3.x + j, mapObj->coords3.y + aa + i); - result = GetReflectionTypeByMetatileBehavior(b); - - if (result) - return result; - - b = MapGridGetMetatileBehaviorAt(mapObj->coords3.x - j, mapObj->coords3.y + aa + i); - result = GetReflectionTypeByMetatileBehavior(b); - - if (result) - return result; + RETURN_REFLECTION_TYPE_AT(mapObj->coords2.x + j, mapObj->coords2.y + one + i) + RETURN_REFLECTION_TYPE_AT(mapObj->coords2.x - j, mapObj->coords2.y + one + i) + RETURN_REFLECTION_TYPE_AT(mapObj->coords3.x + j, mapObj->coords3.y + one + i) + RETURN_REFLECTION_TYPE_AT(mapObj->coords3.x - j, mapObj->coords3.y + one + i) } } - return 0; + +#undef RETURN_REFLECTION_TYPE_AT } -#else -__attribute__((naked)) u8 FieldObjectCheckForReflectiveSurface(struct MapObject *mapObj) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x8\n\ - adds r5, r0, 0\n\ - ldrb r0, [r5, 0x5]\n\ - bl GetFieldObjectGraphicsInfo\n\ - movs r2, 0x8\n\ - ldrsh r1, [r0, r2]\n\ - adds r1, 0x8\n\ - lsls r1, 12\n\ - lsrs r1, 16\n\ - str r1, [sp]\n\ - movs r1, 0xA\n\ - ldrsh r0, [r0, r1]\n\ - adds r0, 0x8\n\ - lsls r0, 12\n\ - movs r4, 0\n\ - lsrs r2, r0, 16\n\ - str r2, [sp, 0x4]\n\ - asrs r0, 16\n\ - cmp r4, r0\n\ - blt _08063A7A\n\ - b _08063B80\n\ -_08063A7A:\n\ - movs r0, 0x1\n\ - mov r10, r0\n\ -_08063A7E:\n\ - movs r1, 0x10\n\ - ldrsh r0, [r5, r1]\n\ - movs r2, 0x12\n\ - ldrsh r1, [r5, r2]\n\ - add r1, r10\n\ - lsls r4, 16\n\ - asrs r6, r4, 16\n\ - adds r1, r6\n\ - bl MapGridGetMetatileBehaviorAt\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - bl GetReflectionTypeByMetatileBehavior\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - mov r9, r4\n\ - cmp r0, 0\n\ - bne _08063B82\n\ - movs r1, 0x14\n\ - ldrsh r0, [r5, r1]\n\ - movs r2, 0x16\n\ - ldrsh r1, [r5, r2]\n\ - add r1, r10\n\ - adds r1, r6\n\ - bl MapGridGetMetatileBehaviorAt\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - bl GetReflectionTypeByMetatileBehavior\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0\n\ - bne _08063B82\n\ - movs r2, 0x1\n\ - ldr r1, [sp]\n\ - lsls r0, r1, 16\n\ - asrs r1, r0, 16\n\ - mov r8, r0\n\ - cmp r2, r1\n\ - bge _08063B6E\n\ - movs r0, 0x80\n\ - lsls r0, 9\n\ - asrs r7, r0, 16\n\ -_08063AD8:\n\ - movs r1, 0x10\n\ - ldrsh r0, [r5, r1]\n\ - lsls r1, r2, 16\n\ - asrs r4, r1, 16\n\ - adds r0, r4\n\ - movs r2, 0x12\n\ - ldrsh r1, [r5, r2]\n\ - adds r1, r7\n\ - adds r1, r6\n\ - bl MapGridGetMetatileBehaviorAt\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - bl GetReflectionTypeByMetatileBehavior\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0\n\ - bne _08063B82\n\ - movs r1, 0x10\n\ - ldrsh r0, [r5, r1]\n\ - subs r0, r4\n\ - movs r2, 0x12\n\ - ldrsh r1, [r5, r2]\n\ - adds r1, r7\n\ - adds r1, r6\n\ - bl MapGridGetMetatileBehaviorAt\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - bl GetReflectionTypeByMetatileBehavior\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0\n\ - bne _08063B82\n\ - movs r1, 0x14\n\ - ldrsh r0, [r5, r1]\n\ - adds r0, r4\n\ - movs r2, 0x16\n\ - ldrsh r1, [r5, r2]\n\ - adds r1, r7\n\ - adds r1, r6\n\ - bl MapGridGetMetatileBehaviorAt\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - bl GetReflectionTypeByMetatileBehavior\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0\n\ - bne _08063B82\n\ - movs r1, 0x14\n\ - ldrsh r0, [r5, r1]\n\ - subs r0, r4\n\ - movs r2, 0x16\n\ - ldrsh r1, [r5, r2]\n\ - adds r1, r7\n\ - adds r1, r6\n\ - bl MapGridGetMetatileBehaviorAt\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - bl GetReflectionTypeByMetatileBehavior\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0\n\ - bne _08063B82\n\ - adds r0, r4, 0x1\n\ - lsls r0, 16\n\ - lsrs r2, r0, 16\n\ - cmp r0, r8\n\ - blt _08063AD8\n\ -_08063B6E:\n\ - movs r1, 0x80\n\ - lsls r1, 9\n\ - add r1, r9\n\ - lsrs r4, r1, 16\n\ - ldr r2, [sp, 0x4]\n\ - lsls r0, r2, 16\n\ - cmp r1, r0\n\ - bge _08063B80\n\ - b _08063A7E\n\ -_08063B80:\n\ - movs r0, 0\n\ -_08063B82:\n\ - add sp, 0x8\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\ -.syntax divided\n"); -} -#endif u8 GetReflectionTypeByMetatileBehavior(u32 behavior) { @@ -707,8 +514,6 @@ bool8 AreZCoordsCompatible(u8 a, u8 b) return TRUE; } -#define READ8(ptr, s, member) ((ptr)[offsetof(s, member)]) - void GroundEffect_SpawnOnTallGrass(struct MapObject *mapObj, struct Sprite *sprite) { u8 *ptr; @@ -721,8 +526,8 @@ void GroundEffect_SpawnOnTallGrass(struct MapObject *mapObj, struct Sprite *spri gUnknown_0202FF84[5] = mapObj->mapGroup; ptr = (u8 *)&gSaveBlock1; - gUnknown_0202FF84[6] = READ8(ptr, struct SaveBlock1, location.mapNum) << 8 - | READ8(ptr, struct SaveBlock1, location.mapGroup); + gUnknown_0202FF84[6] = ((u8)gSaveBlock1.location.mapNum << 8) + | (u8)gSaveBlock1.location.mapGroup; gUnknown_0202FF84[7] = 1; FieldEffectStart(4); @@ -740,8 +545,8 @@ void sub_8063E94(struct MapObject *mapObj, struct Sprite *sprite) gUnknown_0202FF84[5] = mapObj->mapGroup; ptr = (u8 *)&gSaveBlock1; - gUnknown_0202FF84[6] = READ8(ptr, struct SaveBlock1, location.mapNum) << 8 - | READ8(ptr, struct SaveBlock1, location.mapGroup); + gUnknown_0202FF84[6] = ((u8)gSaveBlock1.location.mapNum << 8) + | (u8)gSaveBlock1.location.mapGroup; gUnknown_0202FF84[7] = 0; FieldEffectStart(4); @@ -759,8 +564,8 @@ void sub_8063EE0(struct MapObject *mapObj, struct Sprite *sprite) gUnknown_0202FF84[5] = mapObj->mapGroup; ptr = (u8 *)&gSaveBlock1; - gUnknown_0202FF84[6] = READ8(ptr, struct SaveBlock1, location.mapNum) << 8 - | READ8(ptr, struct SaveBlock1, location.mapGroup); + gUnknown_0202FF84[6] = ((u8)gSaveBlock1.location.mapNum << 8) + | (u8)gSaveBlock1.location.mapGroup; gUnknown_0202FF84[7] = 1; FieldEffectStart(17); @@ -778,8 +583,8 @@ void sub_8063F2C(struct MapObject *mapObj, struct Sprite *sprite) gUnknown_0202FF84[5] = mapObj->mapGroup; ptr = (u8 *)&gSaveBlock1; - gUnknown_0202FF84[6] = READ8(ptr, struct SaveBlock1, location.mapNum) << 8 - | READ8(ptr, struct SaveBlock1, location.mapGroup); + gUnknown_0202FF84[6] = ((u8)gSaveBlock1.location.mapNum << 8) + | (u8)gSaveBlock1.location.mapGroup; gUnknown_0202FF84[7] = 0; FieldEffectStart(17); -- cgit v1.2.3 From b767f1fae9ec77dfe7da67d4fc4ecdccb6723965 Mon Sep 17 00:00:00 2001 From: Touched Date: Sun, 3 Sep 2017 19:05:38 +0200 Subject: Intersperse data with functions --- src/field_ground_effect.c | 213 +++++++++++++++++++++------------------------- 1 file changed, 98 insertions(+), 115 deletions(-) diff --git a/src/field_ground_effect.c b/src/field_ground_effect.c index 1e5f5ba20..b9935463b 100644 --- a/src/field_ground_effect.c +++ b/src/field_ground_effect.c @@ -32,97 +32,6 @@ void GroundEffect_HotSprings(struct MapObject *mapObj, struct Sprite *sprite); void GroundEffect_Seaweed(struct MapObject *mapObj, struct Sprite *sprite); u8 GetReflectionTypeByMetatileBehavior(u32 behavior); -static const u32 sReflectionFlags[] = { 0x00000020, 0x00000010 }; - -typedef bool8 (*MetatileFunc)(u8); - -static const MetatileFunc metatileFuncs[] = { - MetatileBehavior_IsTallGrass, - MetatileBehavior_IsLongGrass, - MetatileBehavior_IsPuddle, - MetatileBehavior_IsSurfableWaterOrUnderwater, - MetatileBehavior_IsShallowFlowingWater, - MetatileBehavior_IsATile, -}; - -static const u32 jumpLandingFlags[] = { - 0x00001000, // Landing in tall grass - 0x00002000, // Landing in long grass - 0x00004000, // Landing on puddle - 0x00008000, // Landing on surfable water or underwater - 0x00004000, // Landing on shallow flowing water - 0x00010000, // Landing on any other type of ground -}; - -static bool8 (*const gUnknown_08376040[])(u8) = { - MetatileBehavior_IsJumpSouth, - MetatileBehavior_IsJumpNorth, - MetatileBehavior_IsJumpWest, - MetatileBehavior_IsJumpEast, -}; - -static const u8 gUnknown_08376050[] = { - 0x73, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x00, 0x00, 0x73 -}; - -// Each byte corresponds to a sprite priority for a field object. -// This is directly the inverse of gFieldObjectPriorities_08376070. -static const u8 gFieldObjectPriorities_08376060[] = { - 2, 2, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 0, 0, 2 -}; - -// Each byte corresponds to a sprite priority for a field object. -// This is the inverse of gFieldObjectPriorities_08376060. -// 1 = Above player sprite -// 2 = Below player sprite -static const u8 gFieldObjectPriorities_08376070[] = { - 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 0, 0, 1, -}; - -static void (*const gUnknown_08376080[])(struct MapObject *mapObj, struct Sprite *sprite, u8 a) = { - nullsub, DoTracksGroundEffect_Footprints, DoTracksGroundEffect_BikeTireTracks, -}; - -// First byte is a Field Effect script id. (gFieldEffectScriptPointers) -// Last three bytes are unknown. -static const u8 gSandFootprints_FieldEffectData[] = { 0xD, 0x0, 0x18, 0x0 }; - -// Specifies which bike track shape to show next. -// For example, when the bike turns from up to right, it will show -// a track that curves to the right. -// Each 4-byte row corresponds to the initial direction of the bike, and -// each byte in that row is for the next direction of the bike in the order -// of down, up, left, right. -static const u8 gBikeTireTracks_Transitions[4][4] = { - 1, 2, 7, 8, - 1, 2, 6, 5, - 5, 8, 3, 4, - 6, 7, 3, 4, -}; - -static void (*const gUnknown_083760A0[])(struct MapObject *mapObj, struct Sprite *sprite) = { - GroundEffect_SpawnOnTallGrass, - sub_8063E94, - sub_8063EE0, - sub_8063F2C, - GroundEffect_WaterReflection, - GroundEffect_IceReflection, - GroundEffect_FlowingWater, - sub_8063FA0, - sub_8063FCC, - GroundEffect_Ripple, - GroundEffect_StepOnPuddle, - GroundEffect_SandPile, - GroundEffect_JumpOnTallGrass, - GroundEffect_JumpOnLongGrass, - GroundEffect_JumpOnShallowWater, - GroundEffect_JumpOnWater, - GroundEffect_JumpLandingDust, - GroundEffect_ShortGrass, - GroundEffect_HotSprings, - GroundEffect_Seaweed -}; - static void GetAllGroundEffectFlags_OnSpawn(struct MapObject *mapObj, u32 *flags) { FieldObjectUpdateMetatileBehaviors(mapObj); @@ -170,19 +79,8 @@ void FieldObjectUpdateMetatileBehaviors(struct MapObject *mapObj) void GetGroundEffectFlags_Reflection(struct MapObject *mapObj, u32 *flags) { - u32 reflectionFlags[2]; - u32 a; - u32 b; - u8 type; - - // Declaring sReflectionFlags inside the function is a neater match than - // this. - b = sReflectionFlags[1]; - a = sReflectionFlags[0]; - reflectionFlags[0] = a; - reflectionFlags[1] = b; - - type = FieldObjectCheckForReflectiveSurface(mapObj); + u32 reflectionFlags[2] = { 0x00000020, 0x00000010 }; + u8 type = FieldObjectCheckForReflectiveSurface(mapObj); if (type) { @@ -333,6 +231,25 @@ void GetGroundEffectFlags_Seaweed(struct MapObject *mapObj, u32 *flags) void GetGroundEffectFlags_JumpLanding(struct MapObject *mapObj, u32 *flags) { + typedef bool8 (*MetatileFunc)(u8); + + static const MetatileFunc metatileFuncs[] = { + MetatileBehavior_IsTallGrass, + MetatileBehavior_IsLongGrass, + MetatileBehavior_IsPuddle, + MetatileBehavior_IsSurfableWaterOrUnderwater, + MetatileBehavior_IsShallowFlowingWater, + MetatileBehavior_IsATile, + }; + + static const u32 jumpLandingFlags[] = { + 0x00001000, // Landing in tall grass + 0x00002000, // Landing in long grass + 0x00004000, // Landing on puddle + 0x00008000, // Landing on surfable water or underwater + 0x00004000, // Landing on shallow flowing water + 0x00010000, // Landing on any other type of ground + }; if (mapObj->mapobj_bit_5 && !mapObj->mapobj_bit_25) { @@ -397,6 +314,13 @@ u8 GetReflectionTypeByMetatileBehavior(u32 behavior) u8 GetLedgeJumpDirection(s16 x, s16 y, u8 z) { + static bool8 (*const unknown_08376040[])(u8) = { + MetatileBehavior_IsJumpSouth, + MetatileBehavior_IsJumpNorth, + MetatileBehavior_IsJumpWest, + MetatileBehavior_IsJumpEast, + }; + u8 b; u8 index = z; @@ -408,7 +332,7 @@ u8 GetLedgeJumpDirection(s16 x, s16 y, u8 z) index--; b = MapGridGetMetatileBehaviorAt(x, y); - if (gUnknown_08376040[index](b) == 1) + if (unknown_08376040[index](b) == 1) return index + 1; return 0; @@ -449,6 +373,24 @@ bool8 IsZCoordMismatchAt(u8 z, s16 x, s16 y) return FALSE; } +static const u8 sUnknown_08376050[] = { + 0x73, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x00, 0x00, 0x73 +}; + +// Each byte corresponds to a sprite priority for a field object. +// This is directly the inverse of gFieldObjectPriorities_08376070. +static const u8 sFieldObjectPriorities_08376060[] = { + 2, 2, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 0, 0, 2 +}; + +// Each byte corresponds to a sprite priority for a field object. +// This is the inverse of gFieldObjectPriorities_08376060. +// 1 = Above player sprite +// 2 = Below player sprite +static const u8 sFieldObjectPriorities_08376070[] = { + 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 0, 0, 1, +}; + void FieldObjectUpdateZCoordAndPriority(struct MapObject *mapObj, struct Sprite *sprite) { if (mapObj->mapobj_bit_26) @@ -456,19 +398,19 @@ void FieldObjectUpdateZCoordAndPriority(struct MapObject *mapObj, struct Sprite FieldObjectUpdateZCoord(mapObj); - sprite->subspriteTableNum = gFieldObjectPriorities_08376070[mapObj->elevation]; - sprite->oam.priority = gFieldObjectPriorities_08376060[mapObj->elevation]; + sprite->subspriteTableNum = sFieldObjectPriorities_08376070[mapObj->elevation]; + sprite->oam.priority = sFieldObjectPriorities_08376060[mapObj->elevation]; } void InitObjectPriorityByZCoord(struct Sprite *sprite, u8 z) { - sprite->subspriteTableNum = gFieldObjectPriorities_08376070[z]; - sprite->oam.priority = gFieldObjectPriorities_08376060[z]; + sprite->subspriteTableNum = sFieldObjectPriorities_08376070[z]; + sprite->oam.priority = sFieldObjectPriorities_08376060[z]; } u8 ZCoordToPriority(u8 z) { - return gFieldObjectPriorities_08376060[z]; + return sFieldObjectPriorities_08376060[z]; } void FieldObjectUpdateZCoord(struct MapObject *mapObj) @@ -492,7 +434,7 @@ void SetObjectSubpriorityByZCoord(u8 a, struct Sprite *sprite, u8 b) u32 tmpb = *(u16 *)&gSpriteCoordOffsetY; s32 tmp2 = (tmpa - tmp) + tmpb; u16 tmp3 = (0x10 - ((((u32)tmp2 + 8) & 0xFF) >> 4)) * 2; - sprite->subpriority = tmp3 + gUnknown_08376050[a] + b; + sprite->subpriority = tmp3 + sUnknown_08376050[a] + b; } void FieldObjectUpdateSubpriority(struct MapObject *mapObj, struct Sprite *sprite) @@ -605,6 +547,10 @@ void GroundEffect_FlowingWater(struct MapObject *mapObj, struct Sprite *sprite) oe_exec_and_other_stuff(FLDEFF_FEET_IN_FLOWING_WATER, mapObj); } +static void (*const gUnknown_08376080[])(struct MapObject *mapObj, struct Sprite *sprite, u8 a) = { + nullsub, DoTracksGroundEffect_Footprints, DoTracksGroundEffect_BikeTireTracks, +}; + void sub_8063FA0(struct MapObject *mapObj, struct Sprite *sprite) { const struct MapObjectGraphicsInfo *info = GetFieldObjectGraphicsInfo(mapObj->graphicsId); @@ -623,19 +569,33 @@ static void nullsub(struct MapObject *mapObj, struct Sprite *sprite, u8 a) static void DoTracksGroundEffect_Footprints(struct MapObject *mapObj, struct Sprite *sprite, u8 a) { - u16 buf[2]; - memcpy(&buf, gSandFootprints_FieldEffectData, sizeof(gSandFootprints_FieldEffectData)); + // First half-word is a Field Effect script id. (gFieldEffectScriptPointers) + u16 sandFootprints_FieldEffectData[2] = { 0xD, 0x18 }; + gUnknown_0202FF84[0] = mapObj->coords3.x; gUnknown_0202FF84[1] = mapObj->coords3.y; gUnknown_0202FF84[2] = 149; gUnknown_0202FF84[3] = 2; gUnknown_0202FF84[4] = mapObj->mapobj_unk_18; - FieldEffectStart(buf[a]); + FieldEffectStart(sandFootprints_FieldEffectData[a]); } static void DoTracksGroundEffect_BikeTireTracks( struct MapObject *mapObj, struct Sprite *sprite, u8 a) { + // Specifies which bike track shape to show next. + // For example, when the bike turns from up to right, it will show + // a track that curves to the right. + // Each 4-byte row corresponds to the initial direction of the bike, and + // each byte in that row is for the next direction of the bike in the order + // of down, up, left, right. + static const u8 bikeTireTracks_Transitions[4][4] = { + 1, 2, 7, 8, + 1, 2, 6, 5, + 5, 8, 3, 4, + 6, 7, 3, 4, + }; + if (mapObj->coords2.x != mapObj->coords3.x || mapObj->coords2.y != mapObj->coords3.y) { gUnknown_0202FF84[0] = mapObj->coords3.x; @@ -643,7 +603,7 @@ static void DoTracksGroundEffect_BikeTireTracks( gUnknown_0202FF84[2] = 149; gUnknown_0202FF84[3] = 2; gUnknown_0202FF84[4] = - gBikeTireTracks_Transitions[mapObj->mapobj_unk_20][mapObj->mapobj_unk_18 - 5]; + bikeTireTracks_Transitions[mapObj->mapobj_unk_20][mapObj->mapobj_unk_18 - 5]; FieldEffectStart(FLDEFF_BIKE_TIRE_TRACKS); } } @@ -733,6 +693,29 @@ void GroundEffect_Seaweed(struct MapObject *mapObj, struct Sprite *sprite) FieldEffectStart(FLDEFF_BUBBLES); } +static void (*const gUnknown_083760A0[])(struct MapObject *mapObj, struct Sprite *sprite) = { + GroundEffect_SpawnOnTallGrass, + sub_8063E94, + sub_8063EE0, + sub_8063F2C, + GroundEffect_WaterReflection, + GroundEffect_IceReflection, + GroundEffect_FlowingWater, + sub_8063FA0, + sub_8063FCC, + GroundEffect_Ripple, + GroundEffect_StepOnPuddle, + GroundEffect_SandPile, + GroundEffect_JumpOnTallGrass, + GroundEffect_JumpOnLongGrass, + GroundEffect_JumpOnShallowWater, + GroundEffect_JumpOnWater, + GroundEffect_JumpLandingDust, + GroundEffect_ShortGrass, + GroundEffect_HotSprings, + GroundEffect_Seaweed +}; + void sub_8064218(struct MapObject *mapObj, struct Sprite *sprite, u32 flags) { u8 i; -- cgit v1.2.3