summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/field_effect.s1177
-rw-r--r--data/field_effect.s20
-rw-r--r--include/global.fieldmap.h9
-rw-r--r--include/overworld.h1
-rw-r--r--src/field_effect.c541
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;
+ }
+}