diff options
author | PikalaxALT <pikalaxalt@gmail.com> | 2020-02-28 15:19:50 -0500 |
---|---|---|
committer | PikalaxALT <pikalaxalt@gmail.com> | 2020-02-28 15:19:50 -0500 |
commit | 0c492c087eca215e7dd29a90b8a3e9232ffe3bf6 (patch) | |
tree | d67a1d8ad00648e501ba82e7db8527d73899bbca | |
parent | 410aaa00ff6bb8d0e9dae755b60e216be24b9660 (diff) |
Show Mon field effect
-rw-r--r-- | asm/field_effect.s | 1177 | ||||
-rw-r--r-- | data/field_effect.s | 20 | ||||
-rw-r--r-- | include/global.fieldmap.h | 9 | ||||
-rw-r--r-- | include/overworld.h | 1 | ||||
-rw-r--r-- | src/field_effect.c | 541 |
5 files changed, 494 insertions, 1254 deletions
diff --git a/asm/field_effect.s b/asm/field_effect.s index 825682f09..de72a2657 100644 --- a/asm/field_effect.s +++ b/asm/field_effect.s @@ -5,1183 +5,6 @@ .text - thumb_func_start FldEff_FieldMoveShowMon -FldEff_FieldMoveShowMon: @ 8086028 - push {r4,lr} - bl GetCurrentMapType - lsls r0, 24 - lsrs r0, 24 - bl IsMapTypeOutdoors - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _08086048 - ldr r0, _08086044 @ =Task_ShowMon_Outdoors - b _0808604A - .align 2, 0 -_08086044: .4byte Task_ShowMon_Outdoors -_08086048: - ldr r0, _08086078 @ =Task_ShowMon_Indoors -_0808604A: - movs r1, 0xFF - bl CreateTask - lsls r0, 24 - lsrs r4, r0, 24 - ldr r2, _0808607C @ =gFieldEffectArguments - ldr r0, [r2] - ldr r1, [r2, 0x4] - ldr r2, [r2, 0x8] - bl sub_8086860 - ldr r2, _08086080 @ =gTasks - lsls r1, r4, 2 - adds r1, r4 - lsls r1, 3 - adds r1, r2 - lsls r0, 24 - lsrs r0, 24 - strh r0, [r1, 0x26] - movs r0, 0 - pop {r4} - pop {r1} - bx r1 - .align 2, 0 -_08086078: .4byte Task_ShowMon_Indoors -_0808607C: .4byte gFieldEffectArguments -_08086080: .4byte gTasks - thumb_func_end FldEff_FieldMoveShowMon - - thumb_func_start FldEff_FieldMoveShowMonInit -FldEff_FieldMoveShowMonInit: @ 8086084 - push {r4-r6,lr} - ldr r5, _080860D8 @ =gFieldEffectArguments - ldr r0, [r5] - movs r6, 0x80 - lsls r6, 24 - ands r6, r0 - lsls r0, 24 - lsrs r0, 24 - movs r1, 0x64 - adds r4, r0, 0 - muls r4, r1 - ldr r0, _080860DC @ =gPlayerParty - adds r4, r0 - adds r0, r4, 0 - movs r1, 0xB - bl GetMonData - str r0, [r5] - adds r0, r4, 0 - movs r1, 0x1 - bl GetMonData - str r0, [r5, 0x4] - adds r0, r4, 0 - movs r1, 0 - bl GetMonData - str r0, [r5, 0x8] - ldr r0, [r5] - orrs r0, r6 - str r0, [r5] - movs r0, 0x6 - bl FieldEffectStart - movs r0, 0x3B - bl FieldEffectActiveListRemove - movs r0, 0 - pop {r4-r6} - pop {r1} - bx r1 - .align 2, 0 -_080860D8: .4byte gFieldEffectArguments -_080860DC: .4byte gPlayerParty - thumb_func_end FldEff_FieldMoveShowMonInit - - thumb_func_start Task_ShowMon_Outdoors -Task_ShowMon_Outdoors: @ 80860E0 - push {lr} - adds r1, r0, 0 - lsls r1, 24 - lsrs r1, 24 - ldr r3, _08086108 @ =sShowMonOutdoorsEffectFuncs - ldr r2, _0808610C @ =gTasks - lsls r0, r1, 2 - adds r0, r1 - lsls r0, 3 - adds r0, r2 - movs r2, 0x8 - ldrsh r1, [r0, r2] - lsls r1, 2 - adds r1, r3 - ldr r1, [r1] - bl _call_via_r1 - pop {r0} - bx r0 - .align 2, 0 -_08086108: .4byte sShowMonOutdoorsEffectFuncs -_0808610C: .4byte gTasks - thumb_func_end Task_ShowMon_Outdoors - - thumb_func_start ShowMonEffect_Outdoors_1 -ShowMonEffect_Outdoors_1: @ 8086110 - push {r4,lr} - adds r4, r0, 0 - movs r0, 0x48 - bl GetGpuReg - strh r0, [r4, 0x1E] - movs r0, 0x4A - bl GetGpuReg - strh r0, [r4, 0x20] - adds r0, r4, 0 - adds r0, 0x22 - ldr r1, _08086170 @ =gMain - ldr r1, [r1, 0xC] - bl StoreWordInTwoHalfwords - ldr r1, _08086174 @ =0x0000f0f1 - strh r1, [r4, 0xA] - ldr r0, _08086178 @ =0x00005051 - strh r0, [r4, 0xC] - movs r0, 0x3F - strh r0, [r4, 0xE] - movs r0, 0x3E - strh r0, [r4, 0x10] - movs r0, 0x40 - bl SetGpuReg - ldrh r1, [r4, 0xC] - movs r0, 0x44 - bl SetGpuReg - ldrh r1, [r4, 0xE] - movs r0, 0x48 - bl SetGpuReg - ldrh r1, [r4, 0x10] - movs r0, 0x4A - bl SetGpuReg - ldr r0, _0808617C @ =VBlankCB_ShowMonEffect_Outdoors - bl SetVBlankCallback - ldrh r0, [r4, 0x8] - adds r0, 0x1 - strh r0, [r4, 0x8] - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_08086170: .4byte gMain -_08086174: .4byte 0x0000f0f1 -_08086178: .4byte 0x00005051 -_0808617C: .4byte VBlankCB_ShowMonEffect_Outdoors - thumb_func_end ShowMonEffect_Outdoors_1 - - thumb_func_start ShowMonEffect_Outdoors_2 -ShowMonEffect_Outdoors_2: @ 8086180 - push {r4-r6,lr} - mov r6, r8 - push {r6} - sub sp, 0x4 - mov r8, r0 - movs r0, 0x8 - bl GetGpuReg - adds r4, r0, 0 - lsls r4, 16 - lsrs r4, 18 - lsls r4, 30 - lsrs r4, 16 - movs r0, 0x8 - bl GetGpuReg - adds r5, r0, 0 - lsls r5, 16 - lsrs r5, 24 - lsls r5, 27 - lsrs r5, 16 - ldr r0, _080861F0 @ =gUnknown_83CB5F0 - movs r6, 0xC0 - lsls r6, 19 - adds r4, r6 - movs r2, 0x80 - lsls r2, 1 - adds r1, r4, 0 - bl CpuSet - movs r0, 0 - str r0, [sp] - adds r6, r5, r6 - ldr r2, _080861F4 @ =0x05000200 - mov r0, sp - adds r1, r6, 0 - bl CpuSet - ldr r0, _080861F8 @ =gUnknown_83CB7F0 - movs r1, 0xF0 - movs r2, 0x20 - bl LoadPalette - adds r0, r5, 0 - bl sub_8086428 - mov r1, r8 - ldrh r0, [r1, 0x8] - adds r0, 0x1 - strh r0, [r1, 0x8] - add sp, 0x4 - pop {r3} - mov r8, r3 - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_080861F0: .4byte gUnknown_83CB5F0 -_080861F4: .4byte 0x05000200 -_080861F8: .4byte gUnknown_83CB7F0 - thumb_func_end ShowMonEffect_Outdoors_2 - - thumb_func_start ShowMonEffect_Outdoors_3 -ShowMonEffect_Outdoors_3: @ 80861FC - push {r4-r7,lr} - adds r3, r0, 0 - ldrh r0, [r3, 0x12] - subs r0, 0x10 - strh r0, [r3, 0x12] - ldrh r6, [r3, 0xA] - ldrh r2, [r3, 0xC] - movs r7, 0xFF - lsrs r1, r6, 8 - subs r1, 0x10 - lsls r1, 16 - lsrs r0, r2, 8 - subs r0, 0x2 - lsls r0, 16 - lsrs r4, r0, 16 - adds r0, r7, 0 - ands r0, r2 - adds r5, r0, 0x2 - lsrs r2, r1, 16 - cmp r1, 0 - bge _08086228 - movs r2, 0 -_08086228: - lsls r0, r4, 16 - asrs r0, 16 - cmp r0, 0x27 - bgt _08086232 - movs r4, 0x28 -_08086232: - cmp r5, 0x78 - ble _08086238 - movs r5, 0x78 -_08086238: - lsls r2, 16 - asrs r2, 16 - lsls r1, r2, 8 - adds r0, r7, 0 - ands r0, r6 - orrs r1, r0 - strh r1, [r3, 0xA] - lsls r0, r4, 16 - asrs r4, r0, 16 - lsls r0, r4, 8 - adds r1, r5, 0 - orrs r0, r1 - strh r0, [r3, 0xC] - cmp r2, 0 - bne _08086278 - cmp r4, 0x28 - bne _08086278 - cmp r1, 0x78 - bne _08086278 - ldr r2, _08086280 @ =gSprites - movs r0, 0x26 - ldrsh r1, [r3, r0] - lsls r0, r1, 4 - adds r0, r1 - lsls r0, 2 - adds r2, 0x1C - adds r0, r2 - ldr r1, _08086284 @ =sub_80868C0 - str r1, [r0] - ldrh r0, [r3, 0x8] - adds r0, 0x1 - strh r0, [r3, 0x8] -_08086278: - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08086280: .4byte gSprites -_08086284: .4byte sub_80868C0 - thumb_func_end ShowMonEffect_Outdoors_3 - - thumb_func_start ShowMonEffect_Outdoors_4 -ShowMonEffect_Outdoors_4: @ 8086288 - push {lr} - adds r3, r0, 0 - ldrh r0, [r3, 0x12] - subs r0, 0x10 - strh r0, [r3, 0x12] - ldr r2, _080862B4 @ =gSprites - movs r0, 0x26 - ldrsh r1, [r3, r0] - lsls r0, r1, 4 - adds r0, r1 - lsls r0, 2 - adds r0, r2 - movs r1, 0x3C - ldrsh r0, [r0, r1] - cmp r0, 0 - beq _080862AE - ldrh r0, [r3, 0x8] - adds r0, 0x1 - strh r0, [r3, 0x8] -_080862AE: - pop {r0} - bx r0 - .align 2, 0 -_080862B4: .4byte gSprites - thumb_func_end ShowMonEffect_Outdoors_4 - - thumb_func_start ShowMonEffect_Outdoors_5 -ShowMonEffect_Outdoors_5: @ 80862B8 - push {r4,lr} - adds r3, r0, 0 - ldrh r0, [r3, 0x12] - subs r0, 0x10 - strh r0, [r3, 0x12] - ldrh r2, [r3, 0xC] - lsls r1, r2, 16 - movs r0, 0xFF - asrs r1, 24 - adds r1, 0x6 - lsls r1, 16 - ands r0, r2 - subs r0, 0x6 - lsls r0, 16 - lsrs r2, r0, 16 - lsrs r4, r1, 16 - asrs r1, 16 - cmp r1, 0x50 - ble _080862E0 - movs r4, 0x50 -_080862E0: - lsls r0, r2, 16 - asrs r0, 16 - cmp r0, 0x50 - bgt _080862EA - movs r2, 0x51 -_080862EA: - lsls r0, r4, 16 - asrs r0, 16 - lsls r1, r0, 8 - lsls r2, 16 - asrs r2, 16 - orrs r1, r2 - strh r1, [r3, 0xC] - cmp r0, 0x50 - bne _08086306 - cmp r2, 0x51 - bne _08086306 - ldrh r0, [r3, 0x8] - adds r0, 0x1 - strh r0, [r3, 0x8] -_08086306: - pop {r4} - pop {r0} - bx r0 - thumb_func_end ShowMonEffect_Outdoors_5 - - thumb_func_start ShowMonEffect_Outdoors_6 -ShowMonEffect_Outdoors_6: @ 808630C - push {r4,lr} - sub sp, 0x4 - adds r4, r0, 0 - movs r0, 0x8 - bl GetGpuReg - adds r1, r0, 0 - lsls r1, 16 - lsrs r1, 24 - lsls r1, 27 - lsrs r1, 16 - movs r0, 0 - str r0, [sp] - movs r0, 0xC0 - lsls r0, 19 - adds r1, r0 - ldr r2, _08086354 @ =0x05000200 - mov r0, sp - bl CpuSet - movs r0, 0xF1 - strh r0, [r4, 0xA] - movs r0, 0xA1 - strh r0, [r4, 0xC] - ldrh r0, [r4, 0x1E] - strh r0, [r4, 0xE] - ldrh r0, [r4, 0x20] - strh r0, [r4, 0x10] - ldrh r0, [r4, 0x8] - adds r0, 0x1 - strh r0, [r4, 0x8] - add sp, 0x4 - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_08086354: .4byte 0x05000200 - thumb_func_end ShowMonEffect_Outdoors_6 - - thumb_func_start ShowMonEffect_Outdoors_7 -ShowMonEffect_Outdoors_7: @ 8086358 - push {r4,lr} - sub sp, 0x4 - adds r4, r0, 0 - adds r0, 0x22 - mov r1, sp - bl LoadWordFromTwoHalfwords - ldr r0, [sp] - bl SetVBlankCallback - movs r0, 0 - movs r1, 0 - movs r2, 0 - bl ChangeBgX - movs r0, 0 - movs r1, 0 - movs r2, 0 - bl ChangeBgY - bl Menu_LoadStdPal - movs r0, 0x26 - ldrsh r1, [r4, r0] - lsls r0, r1, 4 - adds r0, r1 - lsls r0, 2 - ldr r1, _080863B8 @ =gSprites - adds r0, r1 - ldrh r1, [r4, 0x26] - lsls r1, 24 - lsrs r1, 24 - bl FreeResourcesAndDestroySprite - movs r0, 0x6 - bl FieldEffectActiveListRemove - ldr r0, _080863BC @ =Task_ShowMon_Outdoors - bl FindTaskIdByFunc - lsls r0, 24 - lsrs r0, 24 - bl DestroyTask - add sp, 0x4 - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_080863B8: .4byte gSprites -_080863BC: .4byte Task_ShowMon_Outdoors - thumb_func_end ShowMonEffect_Outdoors_7 - - thumb_func_start VBlankCB_ShowMonEffect_Outdoors -VBlankCB_ShowMonEffect_Outdoors: @ 80863C0 - push {r4,lr} - sub sp, 0x4 - ldr r0, _08086420 @ =Task_ShowMon_Outdoors - bl FindTaskIdByFunc - lsls r0, 24 - lsrs r0, 24 - lsls r4, r0, 2 - adds r4, r0 - lsls r4, 3 - ldr r0, _08086424 @ =gTasks - adds r4, r0 - adds r0, r4, 0 - adds r0, 0x22 - mov r1, sp - bl LoadWordFromTwoHalfwords - ldr r0, [sp] - bl _call_via_r0 - ldrh r1, [r4, 0xA] - movs r0, 0x40 - bl SetGpuReg - ldrh r1, [r4, 0xC] - movs r0, 0x44 - bl SetGpuReg - ldrh r1, [r4, 0xE] - movs r0, 0x48 - bl SetGpuReg - ldrh r1, [r4, 0x10] - movs r0, 0x4A - bl SetGpuReg - ldrh r1, [r4, 0x12] - movs r0, 0x10 - bl SetGpuReg - ldrh r1, [r4, 0x14] - movs r0, 0x12 - bl SetGpuReg - add sp, 0x4 - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_08086420: .4byte Task_ShowMon_Outdoors -_08086424: .4byte gTasks - thumb_func_end VBlankCB_ShowMonEffect_Outdoors - - thumb_func_start sub_8086428 -sub_8086428: @ 8086428 - push {r4,r5,lr} - lsls r0, 16 - lsrs r0, 16 - ldr r1, _0808645C @ =0x06000140 - adds r2, r0, r1 - movs r1, 0 - ldr r5, _08086460 @ =gUnknown_83CB810 - movs r0, 0xF0 - lsls r0, 8 - adds r4, r0, 0 - ldr r3, _08086464 @ =0x0000013f -_0808643E: - lsls r0, r1, 1 - adds r0, r5 - ldrh r0, [r0] - orrs r0, r4 - strh r0, [r2] - adds r0, r1, 0x1 - lsls r0, 16 - lsrs r1, r0, 16 - adds r2, 0x2 - cmp r1, r3 - bls _0808643E - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_0808645C: .4byte 0x06000140 -_08086460: .4byte gUnknown_83CB810 -_08086464: .4byte 0x0000013f - thumb_func_end sub_8086428 - - thumb_func_start Task_ShowMon_Indoors -Task_ShowMon_Indoors: @ 8086468 - push {lr} - adds r1, r0, 0 - lsls r1, 24 - lsrs r1, 24 - ldr r3, _08086490 @ =sShowMonIndoorsEffectFuncs - ldr r2, _08086494 @ =gTasks - lsls r0, r1, 2 - adds r0, r1 - lsls r0, 3 - adds r0, r2 - movs r2, 0x8 - ldrsh r1, [r0, r2] - lsls r1, 2 - adds r1, r3 - ldr r1, [r1] - bl _call_via_r1 - pop {r0} - bx r0 - .align 2, 0 -_08086490: .4byte sShowMonIndoorsEffectFuncs -_08086494: .4byte gTasks - thumb_func_end Task_ShowMon_Indoors - - thumb_func_start ShowMonEffect_Indoors_1 -ShowMonEffect_Indoors_1: @ 8086498 - push {r4,lr} - adds r4, r0, 0 - ldrh r1, [r4, 0xA] - movs r0, 0x10 - bl SetGpuReg - ldrh r1, [r4, 0xC] - movs r0, 0x12 - bl SetGpuReg - adds r0, r4, 0 - adds r0, 0x22 - ldr r1, _080864CC @ =gMain - ldr r1, [r1, 0xC] - bl StoreWordInTwoHalfwords - ldr r0, _080864D0 @ =VBlankCB_ShowMonEffect_Indoors - bl SetVBlankCallback - ldrh r0, [r4, 0x8] - adds r0, 0x1 - strh r0, [r4, 0x8] - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_080864CC: .4byte gMain -_080864D0: .4byte VBlankCB_ShowMonEffect_Indoors - thumb_func_end ShowMonEffect_Indoors_1 - - thumb_func_start ShowMonEffect_Indoors_2 -ShowMonEffect_Indoors_2: @ 80864D4 - push {r4-r6,lr} - mov r6, r9 - mov r5, r8 - push {r5,r6} - sub sp, 0x4 - mov r9, r0 - movs r0, 0x8 - bl GetGpuReg - adds r5, r0, 0 - lsls r5, 16 - lsrs r5, 18 - lsls r5, 30 - lsrs r5, 16 - movs r0, 0x8 - bl GetGpuReg - adds r4, r0, 0 - lsls r4, 16 - lsrs r4, 24 - lsls r4, 27 - lsrs r4, 16 - movs r0, 0 - mov r8, r0 - mov r1, r9 - strh r4, [r1, 0x20] - ldr r0, _08086548 @ =gUnknown_83CBA90 - movs r6, 0xC0 - lsls r6, 19 - adds r5, r6 - adds r1, r5, 0 - movs r2, 0x40 - bl CpuSet - mov r0, r8 - str r0, [sp] - adds r4, r6 - ldr r2, _0808654C @ =0x05000200 - mov r0, sp - adds r1, r4, 0 - bl CpuSet - ldr r0, _08086550 @ =gUnknown_83CBB10 - movs r1, 0xF0 - movs r2, 0x20 - bl LoadPalette - mov r1, r9 - ldrh r0, [r1, 0x8] - adds r0, 0x1 - strh r0, [r1, 0x8] - add sp, 0x4 - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_08086548: .4byte gUnknown_83CBA90 -_0808654C: .4byte 0x05000200 -_08086550: .4byte gUnknown_83CBB10 - thumb_func_end ShowMonEffect_Indoors_2 - - thumb_func_start ShowMonEffect_Indoors_3 -ShowMonEffect_Indoors_3: @ 8086554 - push {r4,lr} - adds r4, r0, 0 - bl sub_8086738 - lsls r0, 24 - cmp r0, 0 - beq _080865A6 - movs r0, 0x48 - bl GetGpuReg - strh r0, [r4, 0x12] - movs r1, 0xFF - ands r1, r0 - movs r2, 0x88 - lsls r2, 5 - adds r0, r2, 0 - orrs r1, r0 - movs r0, 0x48 - bl SetGpuReg - movs r0, 0x42 - movs r1, 0xF0 - bl SetGpuReg - ldr r1, _080865B4 @ =0x00002878 - movs r0, 0x46 - bl SetGpuReg - ldr r2, _080865B8 @ =gSprites - movs r0, 0x26 - ldrsh r1, [r4, r0] - lsls r0, r1, 4 - adds r0, r1 - lsls r0, 2 - adds r2, 0x1C - adds r0, r2 - ldr r1, _080865BC @ =sub_80868C0 - str r1, [r0] - ldrh r0, [r4, 0x8] - adds r0, 0x1 - strh r0, [r4, 0x8] -_080865A6: - adds r0, r4, 0 - bl sub_8086728 - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_080865B4: .4byte 0x00002878 -_080865B8: .4byte gSprites -_080865BC: .4byte sub_80868C0 - thumb_func_end ShowMonEffect_Indoors_3 - - thumb_func_start ShowMonEffect_Indoors_4 -ShowMonEffect_Indoors_4: @ 80865C0 - push {r4,lr} - adds r4, r0, 0 - bl sub_8086728 - ldr r2, _080865EC @ =gSprites - movs r0, 0x26 - ldrsh r1, [r4, r0] - lsls r0, r1, 4 - adds r0, r1 - lsls r0, 2 - adds r0, r2 - movs r1, 0x3C - ldrsh r0, [r0, r1] - cmp r0, 0 - beq _080865E4 - ldrh r0, [r4, 0x8] - adds r0, 0x1 - strh r0, [r4, 0x8] -_080865E4: - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_080865EC: .4byte gSprites - thumb_func_end ShowMonEffect_Indoors_4 - - thumb_func_start ShowMonEffect_Indoors_5 -ShowMonEffect_Indoors_5: @ 80865F0 - push {r4,r5,lr} - adds r4, r0, 0 - bl sub_8086728 - ldrh r1, [r4, 0xA] - movs r0, 0x7 - ands r0, r1 - movs r1, 0 - strh r0, [r4, 0xE] - strh r1, [r4, 0x10] - ldr r5, _0808662C @ =0x0000ffff - movs r0, 0x42 - adds r1, r5, 0 - bl SetGpuReg - movs r0, 0x46 - adds r1, r5, 0 - bl SetGpuReg - ldrh r1, [r4, 0x12] - movs r0, 0x48 - bl SetGpuReg - ldrh r0, [r4, 0x8] - adds r0, 0x1 - strh r0, [r4, 0x8] - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_0808662C: .4byte 0x0000ffff - thumb_func_end ShowMonEffect_Indoors_5 - - thumb_func_start ShowMonEffect_Indoors_6 -ShowMonEffect_Indoors_6: @ 8086630 - push {r4,lr} - adds r4, r0, 0 - bl sub_8086728 - adds r0, r4, 0 - bl sub_80867F0 - lsls r0, 24 - cmp r0, 0 - beq _0808664A - ldrh r0, [r4, 0x8] - adds r0, 0x1 - strh r0, [r4, 0x8] -_0808664A: - pop {r4} - pop {r0} - bx r0 - thumb_func_end ShowMonEffect_Indoors_6 - - thumb_func_start ShowMonEffect_Indoors_7 -ShowMonEffect_Indoors_7: @ 8086650 - push {r4,lr} - sub sp, 0x8 - adds r4, r0, 0 - movs r0, 0x8 - bl GetGpuReg - adds r1, r0, 0 - lsls r1, 16 - lsrs r1, 24 - lsls r1, 27 - lsrs r1, 16 - movs r0, 0 - str r0, [sp] - movs r0, 0xC0 - lsls r0, 19 - adds r1, r0 - ldr r2, _080866D4 @ =0x05000200 - mov r0, sp - bl CpuSet - adds r0, r4, 0 - adds r0, 0x22 - add r1, sp, 0x4 - bl LoadWordFromTwoHalfwords - ldr r0, [sp, 0x4] - bl SetVBlankCallback - movs r0, 0 - movs r1, 0 - movs r2, 0 - bl ChangeBgX - movs r0, 0 - movs r1, 0 - movs r2, 0 - bl ChangeBgY - bl Menu_LoadStdPal - movs r0, 0x26 - ldrsh r1, [r4, r0] - lsls r0, r1, 4 - adds r0, r1 - lsls r0, 2 - ldr r1, _080866D8 @ =gSprites - adds r0, r1 - ldrh r1, [r4, 0x26] - lsls r1, 24 - lsrs r1, 24 - bl FreeResourcesAndDestroySprite - movs r0, 0x6 - bl FieldEffectActiveListRemove - ldr r0, _080866DC @ =Task_ShowMon_Indoors - bl FindTaskIdByFunc - lsls r0, 24 - lsrs r0, 24 - bl DestroyTask - add sp, 0x8 - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_080866D4: .4byte 0x05000200 -_080866D8: .4byte gSprites -_080866DC: .4byte Task_ShowMon_Indoors - thumb_func_end ShowMonEffect_Indoors_7 - - thumb_func_start VBlankCB_ShowMonEffect_Indoors -VBlankCB_ShowMonEffect_Indoors: @ 80866E0 - push {r4,lr} - sub sp, 0x4 - ldr r0, _08086720 @ =Task_ShowMon_Indoors - bl FindTaskIdByFunc - lsls r0, 24 - lsrs r0, 24 - lsls r4, r0, 2 - adds r4, r0 - lsls r4, 3 - ldr r0, _08086724 @ =gTasks - adds r4, r0 - adds r0, r4, 0 - adds r0, 0x22 - mov r1, sp - bl LoadWordFromTwoHalfwords - ldr r0, [sp] - bl _call_via_r0 - ldrh r1, [r4, 0xA] - movs r0, 0x10 - bl SetGpuReg - ldrh r1, [r4, 0xC] - movs r0, 0x12 - bl SetGpuReg - add sp, 0x4 - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_08086720: .4byte Task_ShowMon_Indoors -_08086724: .4byte gTasks - thumb_func_end VBlankCB_ShowMonEffect_Indoors - - thumb_func_start sub_8086728 -sub_8086728: @ 8086728 - ldrh r1, [r0, 0xA] - subs r1, 0x10 - strh r1, [r0, 0xA] - ldrh r1, [r0, 0xE] - adds r1, 0x10 - strh r1, [r0, 0xE] - bx lr - thumb_func_end sub_8086728 - - thumb_func_start sub_8086738 -sub_8086738: @ 8086738 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x4 - adds r5, r0, 0 - ldrh r2, [r5, 0x10] - movs r1, 0x10 - ldrsh r0, [r5, r1] - cmp r0, 0x1F - ble _08086754 - movs r0, 0x1 - b _080867D8 -_08086754: - ldrh r0, [r5, 0xE] - lsls r0, 16 - asrs r3, r0, 19 - movs r1, 0x1F - ands r3, r1 - movs r4, 0x10 - ldrsh r0, [r5, r4] - cmp r3, r0 - blt _080867D6 - movs r0, 0x20 - subs r3, r0, r3 - ands r3, r1 - subs r0, r2 - mov r12, r0 - mov r7, r12 - ands r7, r1 - mov r12, r7 - ldrh r0, [r5, 0x20] - ldr r1, _080867E8 @ =0x06000140 - adds r1, r0 - mov r8, r1 - movs r4, 0 - ldr r7, _080867EC @ =gUnknown_83CBB30 - mov r10, r7 - movs r0, 0xF0 - lsls r0, 8 - mov r9, r0 - adds r1, r3, 0x1 - movs r0, 0x1F - ands r1, r0 - str r1, [sp] - mov r6, r12 - adds r6, 0x1 - ands r6, r0 -_08086798: - lsls r1, r4, 5 - adds r2, r1, r3 - lsls r2, 1 - add r2, r8 - mov r7, r12 - adds r0, r7, r1 - lsls r0, 1 - add r0, r10 - ldrh r0, [r0] - mov r7, r9 - orrs r0, r7 - strh r0, [r2] - ldr r0, [sp] - adds r2, r1, r0 - lsls r2, 1 - add r2, r8 - adds r1, r6, r1 - lsls r1, 1 - add r1, r10 - ldrh r0, [r1] - mov r1, r9 - orrs r0, r1 - strh r0, [r2] - adds r0, r4, 0x1 - lsls r0, 16 - lsrs r4, r0, 16 - cmp r4, 0x9 - bls _08086798 - ldrh r0, [r5, 0x10] - adds r0, 0x2 - strh r0, [r5, 0x10] -_080867D6: - movs r0, 0 -_080867D8: - add sp, 0x4 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_080867E8: .4byte 0x06000140 -_080867EC: .4byte gUnknown_83CBB30 - thumb_func_end sub_8086738 - - thumb_func_start sub_80867F0 -sub_80867F0: @ 80867F0 - push {r4-r7,lr} - adds r5, r0, 0 - movs r1, 0x10 - ldrsh r0, [r5, r1] - cmp r0, 0x1F - ble _08086800 - movs r0, 0x1 - b _08086854 -_08086800: - ldrh r0, [r5, 0xE] - lsls r0, 16 - asrs r0, 19 - lsls r0, 16 - lsrs r2, r0, 16 - movs r1, 0x10 - ldrsh r0, [r5, r1] - cmp r2, r0 - blt _08086852 - ldrh r0, [r5, 0xA] - lsls r0, 16 - asrs r2, r0, 19 - movs r0, 0x1F - ands r2, r0 - ldrh r0, [r5, 0x20] - ldr r1, _0808685C @ =0x06000140 - adds r6, r0, r1 - movs r3, 0 - movs r0, 0xF0 - lsls r0, 8 - adds r7, r0, 0 - adds r4, r2, 0x1 - movs r0, 0x1F - ands r4, r0 -_08086830: - lsls r0, r3, 5 - adds r1, r0, r2 - lsls r1, 1 - adds r1, r6 - strh r7, [r1] - adds r0, r4 - lsls r0, 1 - adds r0, r6 - strh r7, [r0] - adds r0, r3, 0x1 - lsls r0, 16 - lsrs r3, r0, 16 - cmp r3, 0x9 - bls _08086830 - ldrh r0, [r5, 0x10] - adds r0, 0x2 - strh r0, [r5, 0x10] -_08086852: - movs r0, 0 -_08086854: - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_0808685C: .4byte 0x06000140 - thumb_func_end sub_80867F0 - - thumb_func_start sub_8086860 -sub_8086860: @ 8086860 - push {r4-r6,lr} - sub sp, 0x8 - adds r6, r0, 0 - movs r5, 0x80 - lsls r5, 24 - ands r5, r6 - lsrs r5, 16 - lsls r5, 16 - lsrs r5, 16 - ldr r0, _080868B4 @ =0x7fffffff - ands r6, r0 - lsls r0, r6, 16 - lsrs r0, 16 - movs r3, 0xA0 - lsls r3, 1 - movs r4, 0x50 - str r4, [sp] - movs r4, 0 - str r4, [sp, 0x4] - bl CreateMonSprite_FieldMove - lsls r0, 24 - lsrs r0, 24 - lsls r2, r0, 4 - adds r2, r0 - lsls r2, 2 - ldr r1, _080868B8 @ =gSprites - adds r2, r1 - ldr r1, _080868BC @ =SpriteCallbackDummy - str r1, [r2, 0x1C] - ldrb r3, [r2, 0x5] - movs r1, 0xD - negs r1, r1 - ands r1, r3 - strb r1, [r2, 0x5] - strh r6, [r2, 0x2E] - strh r5, [r2, 0x3A] - add sp, 0x8 - pop {r4-r6} - pop {r1} - bx r1 - .align 2, 0 -_080868B4: .4byte 0x7fffffff -_080868B8: .4byte gSprites -_080868BC: .4byte SpriteCallbackDummy - thumb_func_end sub_8086860 - - thumb_func_start sub_80868C0 -sub_80868C0: @ 80868C0 - push {lr} - adds r1, r0, 0 - ldrh r0, [r1, 0x20] - subs r0, 0x14 - strh r0, [r1, 0x20] - lsls r0, 16 - asrs r0, 16 - cmp r0, 0x78 - bgt _08086900 - movs r0, 0x78 - strh r0, [r1, 0x20] - movs r0, 0x1E - strh r0, [r1, 0x30] - ldr r0, _080868F4 @ =sub_8086904 - str r0, [r1, 0x1C] - movs r2, 0x3A - ldrsh r0, [r1, r2] - cmp r0, 0 - beq _080868F8 - ldrh r0, [r1, 0x2E] - movs r1, 0 - movs r2, 0x7D - movs r3, 0xA - bl PlayCry2 - b _08086900 - .align 2, 0 -_080868F4: .4byte sub_8086904 -_080868F8: - ldrh r0, [r1, 0x2E] - movs r1, 0 - bl PlayCry1 -_08086900: - pop {r0} - bx r0 - thumb_func_end sub_80868C0 - - thumb_func_start sub_8086904 -sub_8086904: @ 8086904 - push {lr} - adds r1, r0, 0 - ldrh r0, [r1, 0x30] - subs r0, 0x1 - strh r0, [r1, 0x30] - lsls r0, 16 - cmp r0, 0 - bne _08086918 - ldr r0, _0808691C @ =sub_8086920 - str r0, [r1, 0x1C] -_08086918: - pop {r0} - bx r0 - .align 2, 0 -_0808691C: .4byte sub_8086920 - thumb_func_end sub_8086904 - - thumb_func_start sub_8086920 -sub_8086920: @ 8086920 - push {lr} - adds r2, r0, 0 - ldrh r3, [r2, 0x20] - movs r0, 0x20 - ldrsh r1, [r2, r0] - movs r0, 0x40 - negs r0, r0 - cmp r1, r0 - bge _08086938 - movs r0, 0x1 - strh r0, [r2, 0x3C] - b _0808693E -_08086938: - adds r0, r3, 0 - subs r0, 0x14 - strh r0, [r2, 0x20] -_0808693E: - pop {r0} - bx r0 - thumb_func_end sub_8086920 - thumb_func_start FldEff_UseSurf FldEff_UseSurf: @ 8086944 push {r4,lr} diff --git a/data/field_effect.s b/data/field_effect.s index 3629040b3..004dd555a 100644 --- a/data/field_effect.s +++ b/data/field_effect.s @@ -7,26 +7,6 @@ .align 2 .align 2 -sShowMonOutdoorsEffectFuncs:: @ 83CC11C dataptr - .4byte ShowMonEffect_Outdoors_1 - .4byte ShowMonEffect_Outdoors_2 - .4byte ShowMonEffect_Outdoors_3 - .4byte ShowMonEffect_Outdoors_4 - .4byte ShowMonEffect_Outdoors_5 - .4byte ShowMonEffect_Outdoors_6 - .4byte ShowMonEffect_Outdoors_7 - - .align 2 -sShowMonIndoorsEffectFuncs:: @ 83CC138 dataptr - .4byte ShowMonEffect_Indoors_1 - .4byte ShowMonEffect_Indoors_2 - .4byte ShowMonEffect_Indoors_3 - .4byte ShowMonEffect_Indoors_4 - .4byte ShowMonEffect_Indoors_5 - .4byte ShowMonEffect_Indoors_6 - .4byte ShowMonEffect_Indoors_7 - - .align 2 sUseSurfEffectFuncs:: @ 83CC154 dataptr .4byte UseSurfEffect_1 .4byte UseSurfEffect_2 diff --git a/include/global.fieldmap.h b/include/global.fieldmap.h index aa1bb43ee..c1a4e775e 100644 --- a/include/global.fieldmap.h +++ b/include/global.fieldmap.h @@ -4,6 +4,13 @@ #define OBJECT_EVENTS_COUNT 16 #define METATILE_COLLISION_MASK 0x0C00 +#define METATILE_ID_MASK 0x03FF +#define METATILE_ID_UNDEFINED 0x03FF +#define METATILE_ELEVATION_SHIFT 12 +#define METATILE_COLLISION_SHIFT 10 +#define METATILE_ELEVATION_MASK 0xF000 + +#define METATILE_ID(tileset, name) (METATILE_##tileset##_##name) enum { @@ -17,8 +24,6 @@ enum typedef void (*TilesetCB)(void); -#define METATILE_ID(tileset, name) (METATILE_##tileset##_##name) - struct Tileset { /*0x00*/ bool8 isCompressed; diff --git a/include/overworld.h b/include/overworld.h index 51e94fe63..3b7fd7bc1 100644 --- a/include/overworld.h +++ b/include/overworld.h @@ -84,6 +84,7 @@ void sub_8084E80(s8, s8, s8, s8, s8); void sub_8084EBC(s16, s16); void sub_80555E0(void); void copy_saved_warp3_bank_and_enter_x_to_warp1(void); +u8 IsMapTypeOutdoors(u8 mapType); void player_avatar_init_params_reset(void); diff --git a/src/field_effect.c b/src/field_effect.c index 6657265dd..ecdc834ae 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -14,6 +14,7 @@ #include "fieldmap.h" #include "help_system.h" #include "metatile_behavior.h" +#include "new_menu_helpers.h" #include "overworld.h" #include "party_menu.h" #include "quest_log.h" @@ -22,6 +23,7 @@ #include "task.h" #include "trainer_pokemon_sprites.h" #include "trig.h" +#include "util.h" #include "constants/metatile_behaviors.h" #include "constants/songs.h" @@ -57,12 +59,12 @@ const u16 gUnknown_83CAFB0[] = INCBIN_U16("graphics/field_effects/unk_83CAFB0.gb const u16 gUnknown_83CAFD0[] = INCBIN_U16("graphics/field_effects/unk_83CAFD0.4bpp"); const u16 gUnknown_83CB3D0[] = INCBIN_U16("graphics/field_effects/unk_83CB3D0.gbapal"); const u16 gUnknown_83CB3F0[] = INCBIN_U16("graphics/field_effects/unk_83CB3F0.4bpp"); -const u16 gUnknown_83CB5F0[] = INCBIN_U16("graphics/field_effects/unk_83CB5F0.4bpp"); -const u16 gUnknown_83CB7F0[] = INCBIN_U16("graphics/field_effects/unk_83CB7F0.gbapal"); -const u16 gUnknown_83CB810[] = INCBIN_U16("graphics/field_effects/unk_83CB810.bin"); -const u16 gUnknown_83CBA90[] = INCBIN_U16("graphics/field_effects/unk_83CBA90.4bpp"); -const u16 gUnknown_83CBB10[] = INCBIN_U16("graphics/field_effects/unk_83CBB10.gbapal"); -const u16 gUnknown_83CBB30[] = INCBIN_U16("graphics/field_effects/unk_83CBB30.bin"); +const u16 gFieldMoveStreaksTiles[] = INCBIN_U16("graphics/field_effects/unk_83CB5F0.4bpp"); +const u16 gFieldMoveStreaksPalette[] = INCBIN_U16("graphics/field_effects/unk_83CB7F0.gbapal"); +const u16 gFieldMoveStreaksTilemap[] = INCBIN_U16("graphics/field_effects/unk_83CB810.bin"); +const u16 gDarknessFieldMoveStreaksTiles[] = INCBIN_U16("graphics/field_effects/unk_83CBA90.4bpp"); +const u16 gDarknessFieldMoveStreaksPalette[] = INCBIN_U16("graphics/field_effects/unk_83CBB10.gbapal"); +const u16 gDarknessFieldMoveStreaksTilemap[] = INCBIN_U16("graphics/field_effects/unk_83CBB30.bin"); const u16 gUnknown_83CBDB0[] = INCBIN_U16("graphics/field_effects/unk_83CBDB0.4bpp"); bool8 (*const sFldEffScrcmdTable[])(const u8 **script, u32 *result) = { @@ -591,10 +593,10 @@ u8 CreateMonSprite_PicBox(u16 species, s16 x, s16 y, u8 subpriority) return spriteId; } -u8 CreateMonSprite_FieldMove(u16 species, u32 d, u32 g, s16 x, s16 y, u8 subpriority) +u8 CreateMonSprite_FieldMove(u16 species, u32 otId, u32 personality, s16 x, s16 y, u8 subpriority) { - const struct CompressedSpritePalette * spritePalette = GetMonSpritePalStructFromOtIdPersonality(species, d, g); - u16 spriteId = CreateMonPicSprite_HandleDeoxys(species, d, g, 1, x, y, 0, spritePalette->tag); + const struct CompressedSpritePalette * spritePalette = GetMonSpritePalStructFromOtIdPersonality(species, otId, personality); + u16 spriteId = CreateMonPicSprite_HandleDeoxys(species, otId, personality, 1, x, y, 0, spritePalette->tag); PreservePaletteInWeather(IndexOfSpritePaletteTag(spritePalette->tag) + 0x10); if (spriteId == 0xFFFF) return MAX_SPRITES; @@ -1346,9 +1348,9 @@ bool8 EscalatorWarpEffect_6(struct Task * task) } -void Escalator_AnimatePlayerGoingDown(struct Task *task) +void Escalator_AnimatePlayerGoingDown(struct Task * task) { - struct Sprite *sprite; + struct Sprite * sprite; sprite = &gSprites[gPlayerAvatar.spriteId]; sprite->pos2.x = Cos(0x84, task->data[2]); sprite->pos2.y = Sin(0x94, task->data[2]); @@ -1359,9 +1361,9 @@ void Escalator_AnimatePlayerGoingDown(struct Task *task) } } -void Escalator_AnimatePlayerGoingUp(struct Task *task) +void Escalator_AnimatePlayerGoingUp(struct Task * task) { - struct Sprite *sprite; + struct Sprite * sprite; sprite = &gSprites[gPlayerAvatar.spriteId]; sprite->pos2.x = Cos(0x7c, task->data[2]); sprite->pos2.y = Sin(0x76, task->data[2]); @@ -1418,9 +1420,9 @@ void Task_EscalatorWarpInFieldEffect(u8 taskId) ; } -bool8 EscalatorWarpInEffect_1(struct Task *task) +bool8 EscalatorWarpInEffect_1(struct Task * task) { - struct ObjectEvent *objectEvent; + struct ObjectEvent * objectEvent; s16 x; s16 y; u8 behavior; @@ -1443,9 +1445,9 @@ bool8 EscalatorWarpInEffect_1(struct Task *task) return TRUE; } -bool8 EscalatorWarpInEffect_2(struct Task *task) +bool8 EscalatorWarpInEffect_2(struct Task * task) { - struct Sprite *sprite; + struct Sprite * sprite; sprite = &gSprites[gPlayerAvatar.spriteId]; sprite->pos2.x = Cos(0x84, task->data[1]); sprite->pos2.y = Sin(0x94, task->data[1]); @@ -1453,9 +1455,9 @@ bool8 EscalatorWarpInEffect_2(struct Task *task) return FALSE; } -bool8 EscalatorWarpInEffect_3(struct Task *task) +bool8 EscalatorWarpInEffect_3(struct Task * task) { - struct Sprite *sprite; + struct Sprite * sprite; sprite = &gSprites[gPlayerAvatar.spriteId]; sprite->pos2.x = Cos(0x84, task->data[1]); sprite->pos2.y = Sin(0x94, task->data[1]); @@ -1474,9 +1476,9 @@ bool8 EscalatorWarpInEffect_3(struct Task *task) } -bool8 EscalatorWarpInEffect_4(struct Task *task) +bool8 EscalatorWarpInEffect_4(struct Task * task) { - struct Sprite *sprite; + struct Sprite * sprite; sprite = &gSprites[gPlayerAvatar.spriteId]; sprite->pos2.x = Cos(0x7c, task->data[1]); sprite->pos2.y = Sin(0x76, task->data[1]); @@ -1484,9 +1486,9 @@ bool8 EscalatorWarpInEffect_4(struct Task *task) return FALSE; } -bool8 EscalatorWarpInEffect_5(struct Task *task) +bool8 EscalatorWarpInEffect_5(struct Task * task) { - struct Sprite *sprite; + struct Sprite * sprite; sprite = &gSprites[gPlayerAvatar.spriteId]; sprite->pos2.x = Cos(0x7c, task->data[1]); sprite->pos2.y = Sin(0x76, task->data[1]); @@ -1504,7 +1506,7 @@ bool8 EscalatorWarpInEffect_5(struct Task *task) return FALSE; } -bool8 EscalatorWarpInEffect_6(struct Task *task) +bool8 EscalatorWarpInEffect_6(struct Task * task) { if (IsEscalatorMoving()) { @@ -1515,9 +1517,9 @@ bool8 EscalatorWarpInEffect_6(struct Task *task) return TRUE; } -bool8 EscalatorWarpInEffect_7(struct Task *task) +bool8 EscalatorWarpInEffect_7(struct Task * task) { - struct ObjectEvent *objectEvent; + struct ObjectEvent * objectEvent; objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; if (ObjectEventClearHeldMovementIfFinished(objectEvent)) { @@ -1876,13 +1878,13 @@ bool8 LavaridgeGymB1FWarpExitEffect_4(struct Task * task, struct ObjectEvent * o } void Task_LavaridgeGym1FWarp(u8 taskId); -bool8 LavaridgeGym1FWarpEffect_1(struct Task *task, struct ObjectEvent *objectEvent, struct Sprite *sprite); -bool8 LavaridgeGym1FWarpEffect_2(struct Task *task, struct ObjectEvent *objectEvent, struct Sprite *sprite); -bool8 LavaridgeGym1FWarpEffect_3(struct Task *task, struct ObjectEvent *objectEvent, struct Sprite *sprite); -bool8 LavaridgeGym1FWarpEffect_4(struct Task *task, struct ObjectEvent *objectEvent, struct Sprite *sprite); -bool8 LavaridgeGym1FWarpEffect_5(struct Task *task, struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 LavaridgeGym1FWarpEffect_1(struct Task * task, struct ObjectEvent * objectEvent, struct Sprite * sprite); +bool8 LavaridgeGym1FWarpEffect_2(struct Task * task, struct ObjectEvent * objectEvent, struct Sprite * sprite); +bool8 LavaridgeGym1FWarpEffect_3(struct Task * task, struct ObjectEvent * objectEvent, struct Sprite * sprite); +bool8 LavaridgeGym1FWarpEffect_4(struct Task * task, struct ObjectEvent * objectEvent, struct Sprite * sprite); +bool8 LavaridgeGym1FWarpEffect_5(struct Task * task, struct ObjectEvent * objectEvent, struct Sprite * sprite); -bool8 (*const sLavaridgeGym1FWarpEffectFuncs[])(struct Task *task, struct ObjectEvent *objectEvent, struct Sprite *sprite) = { +bool8 (*const sLavaridgeGym1FWarpEffectFuncs[])(struct Task * task, struct ObjectEvent * objectEvent, struct Sprite * sprite) = { LavaridgeGym1FWarpEffect_1, LavaridgeGym1FWarpEffect_2, LavaridgeGym1FWarpEffect_3, @@ -1901,7 +1903,7 @@ u8 FldEff_LavaridgeGymWarp(void) return spriteId; } -void SpriteCB_LavaridgeGymWarp(struct Sprite *sprite) +void SpriteCB_LavaridgeGymWarp(struct Sprite * sprite) { if (sprite->animEnded) { @@ -1919,7 +1921,7 @@ void Task_LavaridgeGym1FWarp(u8 taskId) while(sLavaridgeGym1FWarpEffectFuncs[gTasks[taskId].data[0]](&gTasks[taskId], &gObjectEvents[gPlayerAvatar.objectEventId], &gSprites[gPlayerAvatar.spriteId])); } -bool8 LavaridgeGym1FWarpEffect_1(struct Task *task, struct ObjectEvent *objectEvent, struct Sprite *sprite) +bool8 LavaridgeGym1FWarpEffect_1(struct Task * task, struct ObjectEvent * objectEvent, struct Sprite * sprite) { FreezeObjectEvents(); CameraObjectReset2(); @@ -1929,7 +1931,7 @@ bool8 LavaridgeGym1FWarpEffect_1(struct Task *task, struct ObjectEvent *objectEv return FALSE; } -bool8 LavaridgeGym1FWarpEffect_2(struct Task *task, struct ObjectEvent *objectEvent, struct Sprite *sprite) +bool8 LavaridgeGym1FWarpEffect_2(struct Task * task, struct ObjectEvent * objectEvent, struct Sprite * sprite) { if (ObjectEventClearHeldMovementIfFinished(objectEvent)) { @@ -1951,7 +1953,7 @@ bool8 LavaridgeGym1FWarpEffect_2(struct Task *task, struct ObjectEvent *objectEv return FALSE; } -bool8 LavaridgeGym1FWarpEffect_3(struct Task *task, struct ObjectEvent *objectEvent, struct Sprite *sprite) +bool8 LavaridgeGym1FWarpEffect_3(struct Task * task, struct ObjectEvent * objectEvent, struct Sprite * sprite) { if (gSprites[task->data[1]].animCmdIndex == 2) { @@ -1961,7 +1963,7 @@ bool8 LavaridgeGym1FWarpEffect_3(struct Task *task, struct ObjectEvent *objectEv return FALSE; } -bool8 LavaridgeGym1FWarpEffect_4(struct Task *task, struct ObjectEvent *objectEvent, struct Sprite *sprite) +bool8 LavaridgeGym1FWarpEffect_4(struct Task * task, struct ObjectEvent * objectEvent, struct Sprite * sprite) { if (!FieldEffectActiveListContains(FLDEFF_POP_OUT_OF_ASH)) { @@ -1972,7 +1974,7 @@ bool8 LavaridgeGym1FWarpEffect_4(struct Task *task, struct ObjectEvent *objectEv return FALSE; } -bool8 LavaridgeGym1FWarpEffect_5(struct Task *task, struct ObjectEvent *objectEvent, struct Sprite *sprite) +bool8 LavaridgeGym1FWarpEffect_5(struct Task * task, struct ObjectEvent * objectEvent, struct Sprite * sprite) { if (!gPaletteFade.active && BGMusicStopped() == TRUE) { @@ -1994,7 +1996,7 @@ u8 FldEff_PopOutOfAsh(void) return spriteId; } -void SpriteCB_PopOutOfAsh(struct Sprite *sprite) +void SpriteCB_PopOutOfAsh(struct Sprite * sprite) { if (sprite->animEnded) { @@ -2240,7 +2242,7 @@ void TeleportInFieldEffectTask1(struct Task * task); void TeleportInFieldEffectTask2(struct Task * task); void TeleportInFieldEffectTask3(struct Task * task); -void (*const sTeleportEffectFuncs[])(struct Task *) = { +void (*const sTeleportEffectFuncs[])(struct Task * ) = { TeleportFieldEffectTask1, TeleportFieldEffectTask2, TeleportFieldEffectTask3, @@ -2257,7 +2259,7 @@ void Task_DoTeleportFieldEffect(u8 taskId) sTeleportEffectFuncs[gTasks[taskId].data[0]](&gTasks[taskId]); } -void TeleportFieldEffectTask1(struct Task *task) +void TeleportFieldEffectTask1(struct Task * task) { ScriptContext2_Enable(); FreezeObjectEvents(); @@ -2266,7 +2268,7 @@ void TeleportFieldEffectTask1(struct Task *task) task->data[0]++; } -void TeleportFieldEffectTask2(struct Task *task) +void TeleportFieldEffectTask2(struct Task * task) { u8 spinDirections[5] = { [DIR_NONE] = DIR_SOUTH, @@ -2275,7 +2277,7 @@ void TeleportFieldEffectTask2(struct Task *task) [DIR_NORTH] = DIR_EAST, [DIR_EAST] = DIR_SOUTH }; - struct ObjectEvent *objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; + struct ObjectEvent * objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; if (task->data[1] == 0 || (--task->data[1]) == 0) { ObjectEventTurn(objectEvent, spinDirections[objectEvent->facingDirection]); @@ -2292,11 +2294,11 @@ void TeleportFieldEffectTask2(struct Task *task) } } -void TeleportFieldEffectTask3(struct Task *task) +void TeleportFieldEffectTask3(struct Task * task) { u8 spinDirections[5] = {DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH}; - struct ObjectEvent *objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; - struct Sprite *sprite = &gSprites[gPlayerAvatar.spriteId]; + struct ObjectEvent * objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; + struct Sprite * sprite = &gSprites[gPlayerAvatar.spriteId]; if ((--task->data[1]) <= 0) { task->data[1] = 4; @@ -2320,7 +2322,7 @@ void TeleportFieldEffectTask3(struct Task *task) } } -void TeleportFieldEffectTask4(struct Task *task) +void TeleportFieldEffectTask4(struct Task * task) { if (!gPaletteFade.active) { @@ -2335,7 +2337,7 @@ void TeleportFieldEffectTask4(struct Task *task) } } -void (*const sTeleportInEffectFuncs[])(struct Task *) = { +void (*const sTeleportInEffectFuncs[])(struct Task * ) = { TeleportInFieldEffectTask1, TeleportInFieldEffectTask2, TeleportInFieldEffectTask3 @@ -2359,9 +2361,9 @@ void Task_DoTeleportInFieldEffect(u8 taskId) sTeleportInEffectFuncs[gTasks[taskId].data[0]](&gTasks[taskId]); } -void TeleportInFieldEffectTask1(struct Task *task) +void TeleportInFieldEffectTask1(struct Task * task) { - struct Sprite *sprite; + struct Sprite * sprite; s16 centerToCornerVecY; if (IsWeatherNotFadingIn()) { @@ -2378,11 +2380,11 @@ void TeleportInFieldEffectTask1(struct Task *task) } } -void TeleportInFieldEffectTask2(struct Task *task) +void TeleportInFieldEffectTask2(struct Task * task) { u8 spinDirections[5] = {1, 3, 4, 2, 1}; - struct ObjectEvent *objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; - struct Sprite *sprite = &gSprites[gPlayerAvatar.spriteId]; + struct ObjectEvent * objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; + struct Sprite * sprite = &gSprites[gPlayerAvatar.spriteId]; if ((sprite->pos2.y += task->data[1]) >= -8) { if (task->data[13] == 0) @@ -2417,10 +2419,10 @@ void TeleportInFieldEffectTask2(struct Task *task) } } -void TeleportInFieldEffectTask3(struct Task *task) +void TeleportInFieldEffectTask3(struct Task * task) { u8 spinDirections[5] = {1, 3, 4, 2, 1}; - struct ObjectEvent *objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; + struct ObjectEvent * objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; if ((--task->data[1]) == 0) { ObjectEventTurn(objectEvent, spinDirections[objectEvent->facingDirection]); @@ -2434,3 +2436,432 @@ void TeleportInFieldEffectTask3(struct Task *task) } } } + +void Task_ShowMon_Outdoors(u8 taskId); +void ShowMonEffect_Outdoors_1(struct Task * task); +void ShowMonEffect_Outdoors_2(struct Task * task); +void ShowMonEffect_Outdoors_3(struct Task * task); +void ShowMonEffect_Outdoors_4(struct Task * task); +void ShowMonEffect_Outdoors_5(struct Task * task); +void ShowMonEffect_Outdoors_6(struct Task * task); +void ShowMonEffect_Outdoors_7(struct Task * task); +void VBlankCB_ShowMonEffect_Outdoors(void); +void LoadFieldMoveStreaksTilemapToVram(u16 screenbase); +void Task_ShowMon_Indoors(u8 taskId); +void ShowMonEffect_Indoors_1(struct Task * task); +void ShowMonEffect_Indoors_2(struct Task * task); +void ShowMonEffect_Indoors_3(struct Task * task); +void ShowMonEffect_Indoors_4(struct Task * task); +void ShowMonEffect_Indoors_5(struct Task * task); +void ShowMonEffect_Indoors_6(struct Task * task); +void ShowMonEffect_Indoors_7(struct Task * task); +void VBlankCB_ShowMonEffect_Indoors(void); +void sub_8086728(struct Task * task); +bool8 sub_8086738(struct Task * task); +bool8 sub_80867F0(struct Task * task); +u8 sub_8086860(u32 species, u32 otId, u32 personality); +void sub_80868C0(struct Sprite * sprite); +void sub_8086904(struct Sprite * sprite); +void sub_8086920(struct Sprite * sprite); + +void (*const sShowMonOutdoorsEffectFuncs[])(struct Task * task) = { + ShowMonEffect_Outdoors_1, + ShowMonEffect_Outdoors_2, + ShowMonEffect_Outdoors_3, + ShowMonEffect_Outdoors_4, + ShowMonEffect_Outdoors_5, + ShowMonEffect_Outdoors_6, + ShowMonEffect_Outdoors_7 +}; + +u32 FldEff_FieldMoveShowMon(void) +{ + u8 taskId; + if (IsMapTypeOutdoors(GetCurrentMapType()) == TRUE) + taskId = CreateTask(Task_ShowMon_Outdoors, 0xFF); + else + taskId = CreateTask(Task_ShowMon_Indoors, 0xFF); + gTasks[taskId].data[15] = sub_8086860(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + return 0; +} + +u32 FldEff_FieldMoveShowMonInit(void) +{ + u32 r6 = gFieldEffectArguments[0] & 0x80000000; + u8 partyIdx = gFieldEffectArguments[0]; + gFieldEffectArguments[0] = GetMonData(&gPlayerParty[partyIdx], MON_DATA_SPECIES); + gFieldEffectArguments[1] = GetMonData(&gPlayerParty[partyIdx], MON_DATA_OT_ID); + gFieldEffectArguments[2] = GetMonData(&gPlayerParty[partyIdx], MON_DATA_PERSONALITY); + gFieldEffectArguments[0] |= r6; + FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON); + FieldEffectActiveListRemove(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); + return 0; +} + +void Task_ShowMon_Outdoors(u8 taskId) +{ + sShowMonOutdoorsEffectFuncs[gTasks[taskId].data[0]](&gTasks[taskId]); +} + +void ShowMonEffect_Outdoors_1(struct Task * task) +{ + task->data[11] = GetGpuReg(REG_OFFSET_WININ); + task->data[12] = GetGpuReg(REG_OFFSET_WINOUT); + StoreWordInTwoHalfwords((u16*)&task->data[13], (u32)gMain.vblankCallback); + task->data[1] = 0xf0f1; + task->data[2] = 0x5051; + task->data[3] = 0x3f; + task->data[4] = 0x3e; + SetGpuReg(REG_OFFSET_WIN0H, task->data[1]); + SetGpuReg(REG_OFFSET_WIN0V, task->data[2]); + SetGpuReg(REG_OFFSET_WININ, task->data[3]); + SetGpuReg(REG_OFFSET_WINOUT, task->data[4]); + SetVBlankCallback(VBlankCB_ShowMonEffect_Outdoors); + task->data[0]++; +} + +void ShowMonEffect_Outdoors_2(struct Task * task) +{ + u16 charbase = ((GetGpuReg(REG_OFFSET_BG0CNT) >> 2) << 14); + u16 screenbase = ((GetGpuReg(REG_OFFSET_BG0CNT) >> 8) << 11); + CpuCopy16(gFieldMoveStreaksTiles, (void *)(VRAM + charbase), 0x200); + CpuFill32(0, (void *)(VRAM + screenbase), 0x800); + LoadPalette(gFieldMoveStreaksPalette, 0xf0, 0x20); + LoadFieldMoveStreaksTilemapToVram(screenbase); + task->data[0]++; +} + +void ShowMonEffect_Outdoors_3(struct Task * task) +{ + s16 v0; + s16 v2; + s16 v3; + task->data[5] -= 16; + v0 = ((u16)task->data[1] >> 8); + v2 = ((u16)task->data[2] >> 8); + v3 = ((u16)task->data[2] & 0xff); + v0 -= 16; + v2 -= 2; + v3 += 2; + if (v0 < 0) + { + v0 = 0; + } + if (v2 < 0x28) + { + v2 = 0x28; + } + if (v3 > 0x78) + { + v3 = 0x78; + } + task->data[1] = (v0 << 8) | (task->data[1] & 0xff); + task->data[2] = (v2 << 8) | v3; + if (v0 == 0 && v2 == 0x28 && v3 == 0x78) + { + gSprites[task->data[15]].callback = sub_80868C0; + task->data[0]++; + } +} + +void ShowMonEffect_Outdoors_4(struct Task * task) +{ + task->data[5] -= 16; + if (gSprites[task->data[15]].data[7]) + { + task->data[0]++; + } +} + +void ShowMonEffect_Outdoors_5(struct Task * task) +{ + s16 v2; + s16 v3; + task->data[5] -= 16; + v2 = (task->data[2] >> 8); + v3 = (task->data[2] & 0xff); + v2 += 6; + v3 -= 6; + if (v2 > 0x50) + { + v2 = 0x50; + } + if (v3 < 0x51) + { + v3 = 0x51; + } + task->data[2] = (v2 << 8) | v3; + if (v2 == 0x50 && v3 == 0x51) + { + task->data[0]++; + } +} + +void ShowMonEffect_Outdoors_6(struct Task * task) +{ + u16 bg0cnt = (GetGpuReg(REG_OFFSET_BG0CNT) >> 8) << 11; + CpuFill32(0, (void *)VRAM + bg0cnt, 0x800); + task->data[1] = 0xf1; + task->data[2] = 0xa1; + task->data[3] = task->data[11]; + task->data[4] = task->data[12]; + task->data[0]++; +} + +void ShowMonEffect_Outdoors_7(struct Task * task) +{ + IntrCallback callback; + LoadWordFromTwoHalfwords((u16 *)&task->data[13], (u32 *)&callback); + SetVBlankCallback(callback); + ChangeBgX(0, 0, 0); + ChangeBgY(0, 0, 0); + Menu_LoadStdPal(); + FreeResourcesAndDestroySprite(&gSprites[task->data[15]], task->data[15]); + FieldEffectActiveListRemove(FLDEFF_FIELD_MOVE_SHOW_MON); + DestroyTask(FindTaskIdByFunc(Task_ShowMon_Outdoors)); +} + +void VBlankCB_ShowMonEffect_Outdoors(void) +{ + IntrCallback callback; + struct Task * task = &gTasks[FindTaskIdByFunc(Task_ShowMon_Outdoors)]; + LoadWordFromTwoHalfwords((u16 *)&task->data[13], (u32 *)&callback); + callback(); + SetGpuReg(REG_OFFSET_WIN0H, task->data[1]); + SetGpuReg(REG_OFFSET_WIN0V, task->data[2]); + SetGpuReg(REG_OFFSET_WININ, task->data[3]); + SetGpuReg(REG_OFFSET_WINOUT, task->data[4]); + SetGpuReg(REG_OFFSET_BG0HOFS, task->data[5]); + SetGpuReg(REG_OFFSET_BG0VOFS, task->data[6]); +} + +void LoadFieldMoveStreaksTilemapToVram(u16 screenbase) +{ + u16 i; + u16 *dest; + dest = (u16 *)(VRAM + (10 * 32) + screenbase); + for (i = 0; i < (10 * 32); i++, dest++) + { + *dest = gFieldMoveStreaksTilemap[i] | METATILE_ELEVATION_MASK; + } +} + +void (*const sShowMonIndoorsEffectFuncs[])(struct Task * ) = { + ShowMonEffect_Indoors_1, + ShowMonEffect_Indoors_2, + ShowMonEffect_Indoors_3, + ShowMonEffect_Indoors_4, + ShowMonEffect_Indoors_5, + ShowMonEffect_Indoors_6, + ShowMonEffect_Indoors_7 +}; + +void Task_ShowMon_Indoors(u8 taskId) +{ + sShowMonIndoorsEffectFuncs[gTasks[taskId].data[0]](&gTasks[taskId]); +} + +void ShowMonEffect_Indoors_1(struct Task * task) +{ + SetGpuReg(REG_OFFSET_BG0HOFS, task->data[1]); + SetGpuReg(REG_OFFSET_BG0VOFS, task->data[2]); + StoreWordInTwoHalfwords((u16 *)&task->data[13], (u32)gMain.vblankCallback); + SetVBlankCallback(VBlankCB_ShowMonEffect_Indoors); + task->data[0]++; +} + +void ShowMonEffect_Indoors_2(struct Task * task) +{ + u16 charbase; + u16 screenbase; + charbase = ((GetGpuReg(REG_OFFSET_BG0CNT) >> 2) << 14); + screenbase = ((GetGpuReg(REG_OFFSET_BG0CNT) >> 8) << 11); + task->data[12] = screenbase; + CpuCopy16(gDarknessFieldMoveStreaksTiles, (void *)(VRAM + charbase), 0x80); + CpuFill32(0, (void *)(VRAM + screenbase), 0x800); + LoadPalette(gDarknessFieldMoveStreaksPalette, 0xf0, 0x20); + task->data[0]++; +} + +void ShowMonEffect_Indoors_3(struct Task * task) +{ + if (sub_8086738(task)) + { + task->data[5] = GetGpuReg(REG_OFFSET_WININ); + SetGpuReg(REG_OFFSET_WININ, (task->data[5] & 0xFF) | 0x1100); + SetGpuReg(REG_OFFSET_WIN1H, 0x00f0); + SetGpuReg(REG_OFFSET_WIN1V, 0x2878); + gSprites[task->data[15]].callback = sub_80868C0; + task->data[0]++; + } + sub_8086728(task); +} + +void ShowMonEffect_Indoors_4(struct Task * task) +{ + sub_8086728(task); + if (gSprites[task->data[15]].data[7]) + { + task->data[0]++; + } +} + +void ShowMonEffect_Indoors_5(struct Task * task) +{ + sub_8086728(task); + task->data[3] = task->data[1] & 7; + task->data[4] = 0; + SetGpuReg(REG_OFFSET_WIN1H, 0xffff); + SetGpuReg(REG_OFFSET_WIN1V, 0xffff); + SetGpuReg(REG_OFFSET_WININ, task->data[5]); + task->data[0]++; +} + +void ShowMonEffect_Indoors_6(struct Task * task) +{ + sub_8086728(task); + if (sub_80867F0(task)) + { + task->data[0]++; + } +} + +void ShowMonEffect_Indoors_7(struct Task * task) +{ + IntrCallback intrCallback; + u16 charbase; + charbase = (GetGpuReg(REG_OFFSET_BG0CNT) >> 8) << 11; + CpuFill32(0, (void *)VRAM + charbase, 0x800); + LoadWordFromTwoHalfwords((u16 *)&task->data[13], (u32 *)&intrCallback); + SetVBlankCallback(intrCallback); + ChangeBgX(0, 0, 0); + ChangeBgY(0, 0, 0); + Menu_LoadStdPal(); + FreeResourcesAndDestroySprite(&gSprites[task->data[15]], task->data[15]); + FieldEffectActiveListRemove(FLDEFF_FIELD_MOVE_SHOW_MON); + DestroyTask(FindTaskIdByFunc(Task_ShowMon_Indoors)); +} + +void VBlankCB_ShowMonEffect_Indoors(void) +{ + IntrCallback intrCallback; + struct Task * task; + task = &gTasks[FindTaskIdByFunc(Task_ShowMon_Indoors)]; + LoadWordFromTwoHalfwords((u16 *)&task->data[13], (u32 *)&intrCallback); + intrCallback(); + SetGpuReg(REG_OFFSET_BG0HOFS, task->data[1]); + SetGpuReg(REG_OFFSET_BG0VOFS, task->data[2]); +} + +void sub_8086728(struct Task * task) +{ + task->data[1] -= 16; + task->data[3] += 16; +} + +bool8 sub_8086738(struct Task * task) +{ + u16 i; + u16 srcOffs; + u16 dstOffs; + u16 *dest; + if (task->data[4] >= 32) + { + return TRUE; + } + dstOffs = (task->data[3] >> 3) & 0x1f; + if (dstOffs >= task->data[4]) + { + dstOffs = (32 - dstOffs) & 0x1f; + srcOffs = (32 - task->data[4]) & 0x1f; + dest = (u16 *)(VRAM + 0x140 + (u16)task->data[12]); + for (i = 0; i < 10; i++) + { + dest[dstOffs + i * 32] = gDarknessFieldMoveStreaksTilemap[srcOffs + i * 32]; + dest[dstOffs + i * 32] |= 0xf000; + + dest[((dstOffs + 1) & 0x1f) + i * 32] = gDarknessFieldMoveStreaksTilemap[((srcOffs + 1) & 0x1f) + i * 32] | 0xf000; + dest[((dstOffs + 1) & 0x1f) + i * 32] |= 0xf000; + } + task->data[4] += 2; + } + return FALSE; +} + +bool8 sub_80867F0(struct Task * task) +{ + u16 i; + u16 dstOffs; + u16 *dest; + if (task->data[4] >= 32) + { + return TRUE; + } + dstOffs = task->data[3] >> 3; + if (dstOffs >= task->data[4]) + { + dstOffs = (task->data[1] >> 3) & 0x1f; + dest = (u16 *)(VRAM + 0x140 + (u16)task->data[12]); + for (i = 0; i < 10; i++) + { + dest[dstOffs + i * 32] = 0xf000; + dest[((dstOffs + 1) & 0x1f) + i * 32] = 0xf000; + } + task->data[4] += 2; + } + return FALSE; +} + +u8 sub_8086860(u32 species, u32 otId, u32 personality) +{ + bool16 playCry; + u8 monSprite; + struct Sprite * sprite; + playCry = (species & 0x80000000) >> 16; + species &= 0x7fffffff; + monSprite = CreateMonSprite_FieldMove(species, otId, personality, 0x140, 0x50, 0); + sprite = &gSprites[monSprite]; + sprite->callback = SpriteCallbackDummy; + sprite->oam.priority = 0; + sprite->data[0] = species; + sprite->data[6] = playCry; + return monSprite; +} + +void sub_80868C0(struct Sprite * sprite) +{ + if ((sprite->pos1.x -= 20) <= 0x78) + { + sprite->pos1.x = 0x78; + sprite->data[1] = 30; + sprite->callback = sub_8086904; + if (sprite->data[6]) + { + PlayCry2(sprite->data[0], 0, 0x7d, 0xa); + } + else + { + PlayCry1(sprite->data[0], 0); + } + } +} + +void sub_8086904(struct Sprite * sprite) +{ + if ((--sprite->data[1]) == 0) + { + sprite->callback = sub_8086920; + } +} + +void sub_8086920(struct Sprite * sprite) +{ + if (sprite->pos1.x < -0x40) + { + sprite->data[7] = 1; + } + else + { + sprite->pos1.x -= 20; + } +} |