summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/battle_transition.s1232
-rw-r--r--include/overworld.h1
-rw-r--r--ld_script.txt1
-rw-r--r--src/battle_transition.c446
4 files changed, 425 insertions, 1255 deletions
diff --git a/asm/battle_transition.s b/asm/battle_transition.s
index 83f03553d..b6b365db4 100644
--- a/asm/battle_transition.s
+++ b/asm/battle_transition.s
@@ -5,1238 +5,6 @@
.text
- thumb_func_start BT_StartOnField
-BT_StartOnField: @ 80D08B8
- push {r4,r5,lr}
- adds r4, r0, 0
- lsls r4, 24
- lsrs r4, 24
- ldr r5, _080D08DC @ =sTransitionStructPtr
- movs r0, 0x3C
- bl AllocZeroed
- str r0, [r5]
- ldr r1, _080D08E0 @ =gMain
- ldr r0, _080D08E4 @ =CB2_OverworldBasic
- str r0, [r1, 0x4]
- adds r0, r4, 0
- bl BT_LaunchTask
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_080D08DC: .4byte sTransitionStructPtr
-_080D08E0: .4byte gMain
-_080D08E4: .4byte CB2_OverworldBasic
- thumb_func_end BT_StartOnField
-
- thumb_func_start BT_StartWithoutAlloc
-BT_StartWithoutAlloc: @ 80D08E8
- push {lr}
- lsls r0, 24
- lsrs r0, 24
- bl BT_LaunchTask
- pop {r0}
- bx r0
- thumb_func_end BT_StartWithoutAlloc
-
- thumb_func_start BT_IsDone
-BT_IsDone: @ 80D08F8
- push {r4,r5,lr}
- ldr r0, _080D091C @ =BT_TaskMain
- bl FindTaskIdByFunc
- lsls r0, 24
- lsrs r5, r0, 24
- ldr r1, _080D0920 @ =gTasks
- lsls r0, r5, 2
- adds r0, r5
- lsls r0, 3
- adds r0, r1
- movs r1, 0x26
- ldrsh r0, [r0, r1]
- cmp r0, 0
- bne _080D0924
- movs r0, 0
- b _080D093C
- .align 2, 0
-_080D091C: .4byte BT_TaskMain
-_080D0920: .4byte gTasks
-_080D0924:
- bl BT_InitCtrlBlk
- ldr r4, _080D0944 @ =sTransitionStructPtr
- ldr r0, [r4]
- bl Free
- movs r0, 0
- str r0, [r4]
- adds r0, r5, 0
- bl DestroyTask
- movs r0, 0x1
-_080D093C:
- pop {r4,r5}
- pop {r1}
- bx r1
- .align 2, 0
-_080D0944: .4byte sTransitionStructPtr
- thumb_func_end BT_IsDone
-
- thumb_func_start BT_LaunchTask
-BT_LaunchTask: @ 80D0948
- push {r4,lr}
- adds r4, r0, 0
- lsls r4, 24
- lsrs r4, 24
- ldr r0, _080D0970 @ =BT_TaskMain
- movs r1, 0x2
- bl CreateTask
- lsls r0, 24
- lsrs r0, 24
- ldr r2, _080D0974 @ =gTasks
- lsls r1, r0, 2
- adds r1, r0
- lsls r1, 3
- adds r1, r2
- strh r4, [r1, 0xA]
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_080D0970: .4byte BT_TaskMain
-_080D0974: .4byte gTasks
- thumb_func_end BT_LaunchTask
-
- thumb_func_start BT_TaskMain
-BT_TaskMain: @ 80D0978
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r0, 24
- ldr r5, _080D09A8 @ =sBT_MainPhases
- ldr r2, _080D09AC @ =gTasks
- lsls r1, r0, 2
- adds r1, r0
- lsls r1, 3
- adds r4, r1, r2
-_080D098A:
- movs r1, 0x8
- ldrsh r0, [r4, r1]
- lsls r0, 2
- adds r0, r5
- ldr r1, [r0]
- adds r0, r4, 0
- bl _call_via_r1
- lsls r0, 24
- cmp r0, 0
- bne _080D098A
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_080D09A8: .4byte sBT_MainPhases
-_080D09AC: .4byte gTasks
- thumb_func_end BT_TaskMain
-
- thumb_func_start BT_Phase1Blink
-BT_Phase1Blink: @ 80D09B0
- push {r4,lr}
- adds r4, r0, 0
- bl SetWeatherScreenFadeOut
- ldr r0, _080D09DC @ =gPlttBufferFaded
- ldr r1, _080D09E0 @ =gPlttBufferUnfaded
- ldr r2, _080D09E4 @ =0x04000100
- bl CpuSet
- ldr r1, _080D09E8 @ =sBT_Phase1Tasks
- movs r2, 0xA
- ldrsh r0, [r4, r2]
- lsls r0, 2
- adds r0, r1
- ldr r0, [r0]
- cmp r0, 0
- bne _080D09EC
- movs r0, 0x2
- strh r0, [r4, 0x8]
- movs r0, 0x1
- b _080D09FA
- .align 2, 0
-_080D09DC: .4byte gPlttBufferFaded
-_080D09E0: .4byte gPlttBufferUnfaded
-_080D09E4: .4byte 0x04000100
-_080D09E8: .4byte sBT_Phase1Tasks
-_080D09EC:
- movs r1, 0x4
- bl CreateTask
- ldrh r0, [r4, 0x8]
- adds r0, 0x1
- strh r0, [r4, 0x8]
- movs r0, 0
-_080D09FA:
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end BT_Phase1Blink
-
- thumb_func_start BT_WaitForPhase1
-BT_WaitForPhase1: @ 80D0A00
- push {r4,lr}
- adds r4, r0, 0
- ldr r1, _080D0A20 @ =sBT_Phase1Tasks
- movs r2, 0xA
- ldrsh r0, [r4, r2]
- lsls r0, 2
- adds r0, r1
- ldr r0, [r0]
- bl FindTaskIdByFunc
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0xFF
- beq _080D0A24
- movs r0, 0
- b _080D0A2C
- .align 2, 0
-_080D0A20: .4byte sBT_Phase1Tasks
-_080D0A24:
- ldrh r0, [r4, 0x8]
- adds r0, 0x1
- strh r0, [r4, 0x8]
- movs r0, 0x1
-_080D0A2C:
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end BT_WaitForPhase1
-
- thumb_func_start BT_Phase2LaunchAnimTask
-BT_Phase2LaunchAnimTask: @ 80D0A34
- push {r4,lr}
- adds r4, r0, 0
- ldr r1, _080D0A58 @ =sBT_Phase2Tasks
- movs r2, 0xA
- ldrsh r0, [r4, r2]
- lsls r0, 2
- adds r0, r1
- ldr r0, [r0]
- movs r1, 0
- bl CreateTask
- ldrh r0, [r4, 0x8]
- adds r0, 0x1
- strh r0, [r4, 0x8]
- movs r0, 0
- pop {r4}
- pop {r1}
- bx r1
- .align 2, 0
-_080D0A58: .4byte sBT_Phase2Tasks
- thumb_func_end BT_Phase2LaunchAnimTask
-
- thumb_func_start BT_WaitForPhase2
-BT_WaitForPhase2: @ 80D0A5C
- push {r4,lr}
- adds r4, r0, 0
- movs r0, 0
- strh r0, [r4, 0x26]
- ldr r1, _080D0A88 @ =sBT_Phase2Tasks
- movs r2, 0xA
- ldrsh r0, [r4, r2]
- lsls r0, 2
- adds r0, r1
- ldr r0, [r0]
- bl FindTaskIdByFunc
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0xFF
- bne _080D0A80
- movs r0, 0x1
- strh r0, [r4, 0x26]
-_080D0A80:
- movs r0, 0
- pop {r4}
- pop {r1}
- bx r1
- .align 2, 0
-_080D0A88: .4byte sBT_Phase2Tasks
- thumb_func_end BT_WaitForPhase2
-
- thumb_func_start BT_Phase1Task
-BT_Phase1Task: @ 80D0A8C
- push {r4,lr}
- sub sp, 0x4
- lsls r0, 24
- lsrs r0, 24
- adds r4, r0, 0
- ldr r1, _080D0AC0 @ =gTasks
- lsls r0, r4, 2
- adds r0, r4
- lsls r0, 3
- adds r1, r0, r1
- ldrh r2, [r1, 0x8]
- movs r3, 0x8
- ldrsh r0, [r1, r3]
- cmp r0, 0
- bne _080D0AC4
- adds r0, r2, 0x1
- strh r0, [r1, 0x8]
- movs r0, 0x2
- str r0, [sp]
- movs r0, 0
- movs r1, 0
- movs r2, 0x2
- movs r3, 0x2
- bl BT_CreatePhase1SubTask
- b _080D0AD4
- .align 2, 0
-_080D0AC0: .4byte gTasks
-_080D0AC4:
- bl BT_IsPhase1Done
- lsls r0, 24
- cmp r0, 0
- beq _080D0AD4
- adds r0, r4, 0
- bl DestroyTask
-_080D0AD4:
- add sp, 0x4
- pop {r4}
- pop {r0}
- bx r0
- thumb_func_end BT_Phase1Task
-
- thumb_func_start BT_Phase2Blur
-BT_Phase2Blur: @ 80D0ADC
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r0, 24
- ldr r5, _080D0B0C @ =sBT_Phase2BlurFuncs
- ldr r2, _080D0B10 @ =gTasks
- lsls r1, r0, 2
- adds r1, r0
- lsls r1, 3
- adds r4, r1, r2
-_080D0AEE:
- movs r1, 0x8
- ldrsh r0, [r4, r1]
- lsls r0, 2
- adds r0, r5
- ldr r1, [r0]
- adds r0, r4, 0
- bl _call_via_r1
- lsls r0, 24
- cmp r0, 0
- bne _080D0AEE
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_080D0B0C: .4byte sBT_Phase2BlurFuncs
-_080D0B10: .4byte gTasks
- thumb_func_end BT_Phase2Blur
-
- thumb_func_start BT_Phase2Blur_InitBgMosaic
-BT_Phase2Blur_InitBgMosaic: @ 80D0B14
- push {r4,lr}
- adds r4, r0, 0
- movs r0, 0x4C
- movs r1, 0
- bl SetGpuReg
- movs r0, 0xA
- movs r1, 0x40
- bl SetGpuRegBits
- movs r0, 0xC
- movs r1, 0x40
- bl SetGpuRegBits
- movs r0, 0xE
- movs r1, 0x40
- bl SetGpuRegBits
- ldrh r0, [r4, 0x8]
- adds r0, 0x1
- strh r0, [r4, 0x8]
- movs r0, 0x1
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end BT_Phase2Blur_InitBgMosaic
-
- thumb_func_start BT_Phase2Blur_Anim
-BT_Phase2Blur_Anim: @ 80D0B48
- push {r4,lr}
- sub sp, 0x4
- adds r4, r0, 0
- ldrh r0, [r4, 0xA]
- movs r1, 0xA
- ldrsh r2, [r4, r1]
- cmp r2, 0
- beq _080D0B5E
- subs r0, 0x1
- strh r0, [r4, 0xA]
- b _080D0B9E
-_080D0B5E:
- movs r0, 0x2
- strh r0, [r4, 0xA]
- ldrh r0, [r4, 0xC]
- adds r0, 0x1
- strh r0, [r4, 0xC]
- lsls r0, 16
- asrs r0, 16
- cmp r0, 0xA
- bne _080D0B80
- movs r1, 0x1
- negs r1, r1
- str r2, [sp]
- adds r0, r1, 0
- movs r2, 0
- movs r3, 0x10
- bl BeginNormalPaletteFade
-_080D0B80:
- ldrh r1, [r4, 0xC]
- movs r0, 0xF
- ands r0, r1
- lsls r1, r0, 4
- orrs r1, r0
- movs r0, 0x4C
- bl SetGpuReg
- movs r1, 0xC
- ldrsh r0, [r4, r1]
- cmp r0, 0xE
- ble _080D0B9E
- ldrh r0, [r4, 0x8]
- adds r0, 0x1
- strh r0, [r4, 0x8]
-_080D0B9E:
- movs r0, 0
- add sp, 0x4
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end BT_Phase2Blur_Anim
-
- thumb_func_start BT_Phase2Blur_IsDone
-BT_Phase2Blur_IsDone: @ 80D0BA8
- push {lr}
- ldr r0, _080D0BCC @ =gPaletteFade
- ldrb r1, [r0, 0x7]
- movs r0, 0x80
- ands r0, r1
- cmp r0, 0
- bne _080D0BC4
- ldr r0, _080D0BD0 @ =BT_Phase2Blur
- bl FindTaskIdByFunc
- lsls r0, 24
- lsrs r0, 24
- bl DestroyTask
-_080D0BC4:
- movs r0, 0
- pop {r1}
- bx r1
- .align 2, 0
-_080D0BCC: .4byte gPaletteFade
-_080D0BD0: .4byte BT_Phase2Blur
- thumb_func_end BT_Phase2Blur_IsDone
-
- thumb_func_start BT_Phase2DistortedWave
-BT_Phase2DistortedWave: @ 80D0BD4
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r0, 24
- ldr r5, _080D0C04 @ =sBT_Phase2DistortedWaveFuncs
- ldr r2, _080D0C08 @ =gTasks
- lsls r1, r0, 2
- adds r1, r0
- lsls r1, 3
- adds r4, r1, r2
-_080D0BE6:
- movs r1, 0x8
- ldrsh r0, [r4, r1]
- lsls r0, 2
- adds r0, r5
- ldr r1, [r0]
- adds r0, r4, 0
- bl _call_via_r1
- lsls r0, 24
- cmp r0, 0
- bne _080D0BE6
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_080D0C04: .4byte sBT_Phase2DistortedWaveFuncs
-_080D0C08: .4byte gTasks
- thumb_func_end BT_Phase2DistortedWave
-
- thumb_func_start BT_Phase2DistortedWave_InitWave
-BT_Phase2DistortedWave_InitWave: @ 80D0C0C
- push {r4,r5,lr}
- sub sp, 0x8
- adds r5, r0, 0
- bl BT_InitCtrlBlk
- bl ScanlineEffect_Clear
- movs r0, 0x1
- negs r0, r0
- movs r4, 0
- str r4, [sp]
- movs r1, 0x4
- movs r2, 0
- movs r3, 0x10
- bl BeginNormalPaletteFade
- ldr r0, _080D0C68 @ =gScanlineEffectRegBuffers + 0x780
- ldr r1, _080D0C6C @ =sTransitionStructPtr
- ldr r1, [r1]
- movs r2, 0x14
- ldrsh r1, [r1, r2]
- str r4, [sp]
- movs r2, 0xA0
- str r2, [sp, 0x4]
- movs r2, 0
- movs r3, 0x2
- bl BT_LoadWaveIntoBuffer
- ldr r0, _080D0C70 @ =VBCB_BT_Phase2DistortedWave
- bl SetVBlankCallback
- ldr r0, _080D0C74 @ =HBCB_BT_Phase2DistortedWave
- bl SetHBlankCallback
- movs r0, 0x3
- bl EnableInterrupts
- ldrh r0, [r5, 0x8]
- adds r0, 0x1
- strh r0, [r5, 0x8]
- movs r0, 0
- add sp, 0x8
- pop {r4,r5}
- pop {r1}
- bx r1
- .align 2, 0
-_080D0C68: .4byte gScanlineEffectRegBuffers + 0x780
-_080D0C6C: .4byte sTransitionStructPtr
-_080D0C70: .4byte VBCB_BT_Phase2DistortedWave
-_080D0C74: .4byte HBCB_BT_Phase2DistortedWave
- thumb_func_end BT_Phase2DistortedWave_InitWave
-
- thumb_func_start BT_Phase2DistortedWave_UpdateWave
-BT_Phase2DistortedWave_UpdateWave: @ 80D0C78
- push {r4,r5,lr}
- sub sp, 0x8
- ldr r4, _080D0CE0 @ =sTransitionStructPtr
- ldr r2, [r4]
- ldrb r1, [r2]
- movs r1, 0
- strb r1, [r2]
- ldrh r1, [r0, 0xA]
- adds r1, 0x4
- strh r1, [r0, 0xA]
- ldrh r1, [r0, 0xC]
- adds r1, 0x8
- strh r1, [r0, 0xC]
- ldr r3, _080D0CE4 @ =gScanlineEffectRegBuffers
- ldr r1, [r4]
- movs r2, 0x14
- ldrsh r1, [r1, r2]
- movs r5, 0xA
- ldrsh r2, [r0, r5]
- movs r5, 0xC
- ldrsh r0, [r0, r5]
- str r0, [sp]
- movs r0, 0xA0
- str r0, [sp, 0x4]
- adds r0, r3, 0
- movs r3, 0x2
- bl BT_LoadWaveIntoBuffer
- ldr r0, _080D0CE8 @ =gPaletteFade
- ldrb r1, [r0, 0x7]
- movs r0, 0x80
- ands r0, r1
- cmp r0, 0
- bne _080D0CCA
- ldr r0, _080D0CEC @ =BT_Phase2DistortedWave
- bl FindTaskIdByFunc
- lsls r0, 24
- lsrs r0, 24
- bl DestroyTask
-_080D0CCA:
- ldr r0, [r4]
- ldrb r1, [r0]
- adds r1, 0x1
- ldrb r2, [r0]
- strb r1, [r0]
- movs r0, 0
- add sp, 0x8
- pop {r4,r5}
- pop {r1}
- bx r1
- .align 2, 0
-_080D0CE0: .4byte sTransitionStructPtr
-_080D0CE4: .4byte gScanlineEffectRegBuffers
-_080D0CE8: .4byte gPaletteFade
-_080D0CEC: .4byte BT_Phase2DistortedWave
- thumb_func_end BT_Phase2DistortedWave_UpdateWave
-
- thumb_func_start VBCB_BT_Phase2DistortedWave
-VBCB_BT_Phase2DistortedWave: @ 80D0CF0
- push {lr}
- bl BT_VBSyncOamAndPltt
- ldr r0, _080D0D18 @ =sTransitionStructPtr
- ldr r0, [r0]
- ldrb r0, [r0]
- cmp r0, 0
- beq _080D0D14
- ldr r1, _080D0D1C @ =0x040000d4
- ldr r0, _080D0D20 @ =gScanlineEffectRegBuffers
- str r0, [r1]
- movs r2, 0xF0
- lsls r2, 3
- adds r0, r2
- str r0, [r1, 0x4]
- ldr r0, _080D0D24 @ =0x800000a0
- str r0, [r1, 0x8]
- ldr r0, [r1, 0x8]
-_080D0D14:
- pop {r0}
- bx r0
- .align 2, 0
-_080D0D18: .4byte sTransitionStructPtr
-_080D0D1C: .4byte 0x040000d4
-_080D0D20: .4byte gScanlineEffectRegBuffers
-_080D0D24: .4byte 0x800000a0
- thumb_func_end VBCB_BT_Phase2DistortedWave
-
- thumb_func_start HBCB_BT_Phase2DistortedWave
-HBCB_BT_Phase2DistortedWave: @ 80D0D28
- ldr r1, _080D0D48 @ =gScanlineEffectRegBuffers
- ldr r0, _080D0D4C @ =0x04000006
- ldrh r0, [r0]
- lsls r0, 1
- movs r2, 0xF0
- lsls r2, 3
- adds r1, r2
- adds r0, r1
- ldrh r1, [r0]
- ldr r0, _080D0D50 @ =0x04000014
- strh r1, [r0]
- adds r0, 0x4
- strh r1, [r0]
- adds r0, 0x4
- strh r1, [r0]
- bx lr
- .align 2, 0
-_080D0D48: .4byte gScanlineEffectRegBuffers
-_080D0D4C: .4byte 0x04000006
-_080D0D50: .4byte 0x04000014
- thumb_func_end HBCB_BT_Phase2DistortedWave
-
- thumb_func_start BT_Phase2HorizontalCorrugate
-BT_Phase2HorizontalCorrugate: @ 80D0D54
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r0, 24
- ldr r5, _080D0D84 @ =sBT_Phase2HorizontalCorrugateFuncs
- ldr r2, _080D0D88 @ =gTasks
- lsls r1, r0, 2
- adds r1, r0
- lsls r1, 3
- adds r4, r1, r2
-_080D0D66:
- movs r1, 0x8
- ldrsh r0, [r4, r1]
- lsls r0, 2
- adds r0, r5
- ldr r1, [r0]
- adds r0, r4, 0
- bl _call_via_r1
- lsls r0, 24
- cmp r0, 0
- bne _080D0D66
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_080D0D84: .4byte sBT_Phase2HorizontalCorrugateFuncs
-_080D0D88: .4byte gTasks
- thumb_func_end BT_Phase2HorizontalCorrugate
-
- thumb_func_start BT_Phase2HorizontalCorrugate_Init
-BT_Phase2HorizontalCorrugate_Init: @ 80D0D8C
- push {r4,lr}
- sub sp, 0x4
- adds r4, r0, 0
- bl BT_InitCtrlBlk
- bl ScanlineEffect_Clear
- movs r0, 0x1
- negs r0, r0
- movs r1, 0
- str r1, [sp]
- movs r1, 0x4
- movs r2, 0
- movs r3, 0x10
- bl BeginNormalPaletteFade
- ldr r0, _080D0DE0 @ =sTransitionStructPtr
- ldr r1, [r0]
- ldr r0, _080D0DE4 @ =gScanlineEffectRegBuffers + 0x780
- movs r2, 0x16
- ldrsh r1, [r1, r2]
- movs r2, 0xA0
- lsls r2, 1
- bl memset
- ldr r0, _080D0DE8 @ =VBCB_BT_Phase2HorizontalCorrugate
- bl SetVBlankCallback
- ldr r0, _080D0DEC @ =HBCB_BT_Phase2HorizontalCorrugate
- bl SetHBlankCallback
- movs r0, 0x3
- bl EnableInterrupts
- ldrh r0, [r4, 0x8]
- adds r0, 0x1
- strh r0, [r4, 0x8]
- movs r0, 0
- add sp, 0x4
- pop {r4}
- pop {r1}
- bx r1
- .align 2, 0
-_080D0DE0: .4byte sTransitionStructPtr
-_080D0DE4: .4byte gScanlineEffectRegBuffers + 0x780
-_080D0DE8: .4byte VBCB_BT_Phase2HorizontalCorrugate
-_080D0DEC: .4byte HBCB_BT_Phase2HorizontalCorrugate
- thumb_func_end BT_Phase2HorizontalCorrugate_Init
-
- thumb_func_start BT_Phase2HorizontalCorrugate_UpdateWave
-BT_Phase2HorizontalCorrugate_UpdateWave: @ 80D0DF0
- push {r4-r7,lr}
- ldr r1, _080D0E70 @ =sTransitionStructPtr
- ldr r2, [r1]
- ldrb r1, [r2]
- movs r1, 0
- strb r1, [r2]
- ldrh r4, [r0, 0xA]
- ldrh r2, [r0, 0xC]
- lsls r3, r2, 16
- asrs r3, 24
- movs r5, 0x84
- lsls r5, 5
- adds r1, r4, r5
- strh r1, [r0, 0xA]
- movs r1, 0xC0
- lsls r1, 1
- adds r2, r1
- strh r2, [r0, 0xC]
- movs r5, 0
- lsls r7, r3, 16
-_080D0E18:
- lsrs r0, r4, 8
- asrs r1, r7, 16
- bl Sin
- ldr r1, _080D0E74 @ =gScanlineEffectRegBuffers
- lsls r2, r5, 1
- adds r2, r1
- ldr r6, _080D0E70 @ =sTransitionStructPtr
- ldr r1, [r6]
- ldrh r1, [r1, 0x16]
- adds r0, r1
- strh r0, [r2]
- adds r0, r5, 0x1
- lsls r0, 24
- lsrs r5, r0, 24
- movs r1, 0x84
- lsls r1, 5
- adds r0, r4, r1
- lsls r0, 16
- lsrs r4, r0, 16
- cmp r5, 0x9F
- bls _080D0E18
- ldr r0, _080D0E78 @ =gPaletteFade
- ldrb r1, [r0, 0x7]
- movs r0, 0x80
- ands r0, r1
- cmp r0, 0
- bne _080D0E5E
- ldr r0, _080D0E7C @ =BT_Phase2HorizontalCorrugate
- bl FindTaskIdByFunc
- lsls r0, 24
- lsrs r0, 24
- bl DestroyTask
-_080D0E5E:
- ldr r0, [r6]
- ldrb r1, [r0]
- adds r1, 0x1
- ldrb r2, [r0]
- strb r1, [r0]
- movs r0, 0
- pop {r4-r7}
- pop {r1}
- bx r1
- .align 2, 0
-_080D0E70: .4byte sTransitionStructPtr
-_080D0E74: .4byte gScanlineEffectRegBuffers
-_080D0E78: .4byte gPaletteFade
-_080D0E7C: .4byte BT_Phase2HorizontalCorrugate
- thumb_func_end BT_Phase2HorizontalCorrugate_UpdateWave
-
- thumb_func_start VBCB_BT_Phase2HorizontalCorrugate
-VBCB_BT_Phase2HorizontalCorrugate: @ 80D0E80
- push {lr}
- bl BT_VBSyncOamAndPltt
- ldr r0, _080D0EA8 @ =sTransitionStructPtr
- ldr r0, [r0]
- ldrb r0, [r0]
- cmp r0, 0
- beq _080D0EA4
- ldr r1, _080D0EAC @ =0x040000d4
- ldr r0, _080D0EB0 @ =gScanlineEffectRegBuffers
- str r0, [r1]
- movs r2, 0xF0
- lsls r2, 3
- adds r0, r2
- str r0, [r1, 0x4]
- ldr r0, _080D0EB4 @ =0x800000a0
- str r0, [r1, 0x8]
- ldr r0, [r1, 0x8]
-_080D0EA4:
- pop {r0}
- bx r0
- .align 2, 0
-_080D0EA8: .4byte sTransitionStructPtr
-_080D0EAC: .4byte 0x040000d4
-_080D0EB0: .4byte gScanlineEffectRegBuffers
-_080D0EB4: .4byte 0x800000a0
- thumb_func_end VBCB_BT_Phase2HorizontalCorrugate
-
- thumb_func_start HBCB_BT_Phase2HorizontalCorrugate
-HBCB_BT_Phase2HorizontalCorrugate: @ 80D0EB8
- ldr r1, _080D0ED8 @ =gScanlineEffectRegBuffers
- ldr r0, _080D0EDC @ =0x04000006
- ldrh r0, [r0]
- lsls r0, 1
- movs r2, 0xF0
- lsls r2, 3
- adds r1, r2
- adds r0, r1
- ldrh r1, [r0]
- ldr r0, _080D0EE0 @ =0x04000016
- strh r1, [r0]
- adds r0, 0x4
- strh r1, [r0]
- adds r0, 0x4
- strh r1, [r0]
- bx lr
- .align 2, 0
-_080D0ED8: .4byte gScanlineEffectRegBuffers
-_080D0EDC: .4byte 0x04000006
-_080D0EE0: .4byte 0x04000016
- thumb_func_end HBCB_BT_Phase2HorizontalCorrugate
-
- thumb_func_start BT_Phase2BigPokeball
-BT_Phase2BigPokeball: @ 80D0EE4
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r0, 24
- ldr r5, _080D0F14 @ =sBT_Phase2BigPokeballFuncs
- ldr r2, _080D0F18 @ =gTasks
- lsls r1, r0, 2
- adds r1, r0
- lsls r1, 3
- adds r4, r1, r2
-_080D0EF6:
- movs r1, 0x8
- ldrsh r0, [r4, r1]
- lsls r0, 2
- adds r0, r5
- ldr r1, [r0]
- adds r0, r4, 0
- bl _call_via_r1
- lsls r0, 24
- cmp r0, 0
- bne _080D0EF6
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_080D0F14: .4byte sBT_Phase2BigPokeballFuncs
-_080D0F18: .4byte gTasks
- thumb_func_end BT_Phase2BigPokeball
-
- thumb_func_start BT_Phase2BigPokeball_Init
-BT_Phase2BigPokeball_Init: @ 80D0F1C
- push {r4-r6,lr}
- sub sp, 0xC
- adds r4, r0, 0
- bl BT_InitCtrlBlk
- bl ScanlineEffect_Clear
- movs r1, 0
- movs r0, 0x10
- strh r0, [r4, 0xA]
- strh r1, [r4, 0xC]
- strh r1, [r4, 0x10]
- movs r0, 0x80
- lsls r0, 7
- strh r0, [r4, 0x12]
- ldr r0, _080D0FB8 @ =sTransitionStructPtr
- ldr r2, [r0]
- movs r0, 0x3F
- strh r0, [r2, 0x2]
- strh r1, [r2, 0x4]
- movs r0, 0xF0
- strh r0, [r2, 0x6]
- movs r0, 0xA0
- strh r0, [r2, 0x8]
- ldr r0, _080D0FBC @ =0x00003f41
- strh r0, [r2, 0xE]
- ldrh r0, [r4, 0xA]
- lsls r0, 8
- ldrh r1, [r4, 0xC]
- orrs r0, r1
- strh r0, [r2, 0x10]
- movs r1, 0
- add r5, sp, 0x4
- add r6, sp, 0x8
- ldr r3, _080D0FC0 @ =gScanlineEffectRegBuffers + 0x780
- movs r2, 0xF0
-_080D0F64:
- lsls r0, r1, 1
- adds r0, r3
- strh r2, [r0]
- adds r0, r1, 0x1
- lsls r0, 16
- lsrs r1, r0, 16
- cmp r1, 0x9F
- bls _080D0F64
- ldr r0, _080D0FC4 @ =VBCB_BT_Phase2BigPokeball1
- bl SetVBlankCallback
- adds r0, r5, 0
- adds r1, r6, 0
- bl BT_GetBg0TilemapAndTilesetBase
- mov r1, sp
- movs r0, 0
- strh r0, [r1]
- ldr r1, [sp, 0x4]
- ldr r2, _080D0FC8 @ =0x01000400
- mov r0, sp
- bl CpuSet
- ldr r0, _080D0FCC @ =sBigPokeballTileset
- ldr r1, [sp, 0x8]
- movs r2, 0xB0
- lsls r2, 2
- bl CpuSet
- ldr r0, _080D0FD0 @ =sSlidingPokeballBigPokeballPalette
- movs r1, 0xF0
- movs r2, 0x20
- bl LoadPalette
- ldrh r0, [r4, 0x8]
- adds r0, 0x1
- strh r0, [r4, 0x8]
- movs r0, 0
- add sp, 0xC
- pop {r4-r6}
- pop {r1}
- bx r1
- .align 2, 0
-_080D0FB8: .4byte sTransitionStructPtr
-_080D0FBC: .4byte 0x00003f41
-_080D0FC0: .4byte gScanlineEffectRegBuffers + 0x780
-_080D0FC4: .4byte VBCB_BT_Phase2BigPokeball1
-_080D0FC8: .4byte 0x01000400
-_080D0FCC: .4byte sBigPokeballTileset
-_080D0FD0: .4byte sSlidingPokeballBigPokeballPalette
- thumb_func_end BT_Phase2BigPokeball_Init
-
- thumb_func_start BT_Phase2BigPokeball_LoadTilemapAndWave
-BT_Phase2BigPokeball_LoadTilemapAndWave: @ 80D0FD4
- push {r4-r7,lr}
- mov r7, r9
- mov r6, r8
- push {r6,r7}
- sub sp, 0x10
- adds r7, r0, 0
- ldr r5, _080D105C @ =sBigPokeballTilemap
- add r1, sp, 0xC
- add r0, sp, 0x8
- bl BT_GetBg0TilemapAndTilesetBase
- movs r1, 0
- ldr r0, [sp, 0x8]
- mov r9, r0
- ldr r6, _080D1060 @ =gScanlineEffectRegBuffers
- mov r8, r6
- movs r0, 0xF0
- lsls r0, 8
- mov r12, r0
-_080D0FFA:
- movs r0, 0
- lsls r3, r1, 16
- asrs r4, r3, 11
-_080D1000:
- lsls r2, r0, 16
- asrs r2, 16
- adds r1, r4, r2
- lsls r1, 1
- add r1, r9
- ldrh r0, [r5]
- mov r6, r12
- orrs r0, r6
- strh r0, [r1]
- adds r2, 0x1
- lsls r2, 16
- adds r5, 0x2
- lsrs r0, r2, 16
- asrs r2, 16
- cmp r2, 0x1D
- ble _080D1000
- movs r1, 0x80
- lsls r1, 9
- adds r0, r3, r1
- lsrs r1, r0, 16
- asrs r0, 16
- cmp r0, 0x13
- ble _080D0FFA
- movs r6, 0x10
- ldrsh r2, [r7, r6]
- movs r1, 0x12
- ldrsh r0, [r7, r1]
- str r0, [sp]
- movs r0, 0xA0
- str r0, [sp, 0x4]
- mov r0, r8
- movs r1, 0
- movs r3, 0x84
- bl BT_LoadWaveIntoBuffer
- ldrh r0, [r7, 0x8]
- adds r0, 0x1
- strh r0, [r7, 0x8]
- movs r0, 0x1
- add sp, 0x10
- pop {r3,r4}
- mov r8, r3
- mov r9, r4
- pop {r4-r7}
- pop {r1}
- bx r1
- .align 2, 0
-_080D105C: .4byte sBigPokeballTilemap
-_080D1060: .4byte gScanlineEffectRegBuffers
- thumb_func_end BT_Phase2BigPokeball_LoadTilemapAndWave
-
- thumb_func_start BT_Phase2BigPokeball_UpdateWave1IncEva
-BT_Phase2BigPokeball_UpdateWave1IncEva: @ 80D1064
- push {r4,r5,lr}
- sub sp, 0x8
- adds r3, r0, 0
- ldr r2, _080D10EC @ =sTransitionStructPtr
- ldr r1, [r2]
- ldrb r0, [r1]
- movs r0, 0
- strb r0, [r1]
- ldrh r1, [r3, 0xE]
- movs r4, 0xE
- ldrsh r0, [r3, r4]
- adds r4, r2, 0
- cmp r0, 0
- beq _080D108A
- subs r0, r1, 0x1
- strh r0, [r3, 0xE]
- lsls r0, 16
- cmp r0, 0
- bne _080D1094
-_080D108A:
- ldrh r0, [r3, 0xC]
- adds r0, 0x1
- strh r0, [r3, 0xC]
- movs r0, 0x1
- strh r0, [r3, 0xE]
-_080D1094:
- ldr r2, [r4]
- ldrh r0, [r3, 0xA]
- lsls r0, 8
- ldrh r1, [r3, 0xC]
- orrs r0, r1
- strh r0, [r2, 0x10]
- movs r5, 0xC
- ldrsh r0, [r3, r5]
- cmp r0, 0xF
- ble _080D10AE
- ldrh r0, [r3, 0x8]
- adds r0, 0x1
- strh r0, [r3, 0x8]
-_080D10AE:
- ldrh r0, [r3, 0x10]
- adds r0, 0xC
- strh r0, [r3, 0x10]
- ldr r0, _080D10F0 @ =0xfffffe80
- adds r1, r0, 0
- ldrh r5, [r3, 0x12]
- adds r1, r5
- strh r1, [r3, 0x12]
- ldr r0, _080D10F4 @ =gScanlineEffectRegBuffers
- movs r5, 0x10
- ldrsh r2, [r3, r5]
- lsls r1, 16
- asrs r1, 24
- str r1, [sp]
- movs r1, 0xA0
- str r1, [sp, 0x4]
- movs r1, 0
- movs r3, 0x84
- bl BT_LoadWaveIntoBuffer
- ldr r1, [r4]
- ldrb r0, [r1]
- adds r0, 0x1
- ldrb r2, [r1]
- strb r0, [r1]
- movs r0, 0
- add sp, 0x8
- pop {r4,r5}
- pop {r1}
- bx r1
- .align 2, 0
-_080D10EC: .4byte sTransitionStructPtr
-_080D10F0: .4byte 0xfffffe80
-_080D10F4: .4byte gScanlineEffectRegBuffers
- thumb_func_end BT_Phase2BigPokeball_UpdateWave1IncEva
-
- thumb_func_start BT_Phase2BigPokeball_UpdateWave2DecEvb
-BT_Phase2BigPokeball_UpdateWave2DecEvb: @ 80D10F8
- push {r4,lr}
- sub sp, 0x8
- adds r3, r0, 0
- ldr r2, _080D1158 @ =sTransitionStructPtr
- ldr r1, [r2]
- ldrb r0, [r1]
- movs r0, 0
- strb r0, [r1]
- ldrh r1, [r3, 0xE]
- movs r4, 0xE
- ldrsh r0, [r3, r4]
- cmp r0, 0
- beq _080D111C
- subs r0, r1, 0x1
- strh r0, [r3, 0xE]
- lsls r0, 16
- cmp r0, 0
- bne _080D1126
-_080D111C:
- ldrh r0, [r3, 0xA]
- subs r0, 0x1
- strh r0, [r3, 0xA]
- movs r0, 0x2
- strh r0, [r3, 0xE]
-_080D1126:
- ldr r2, [r2]
- ldrh r0, [r3, 0xA]
- lsls r0, 8
- ldrh r1, [r3, 0xC]
- orrs r0, r1
- strh r0, [r2, 0x10]
- movs r1, 0xA
- ldrsh r0, [r3, r1]
- cmp r0, 0
- bne _080D1140
- ldrh r0, [r3, 0x8]
- adds r0, 0x1
- strh r0, [r3, 0x8]
-_080D1140:
- ldrh r1, [r3, 0x12]
- movs r2, 0x12
- ldrsh r0, [r3, r2]
- cmp r0, 0
- ble _080D1160
- ldrh r0, [r3, 0x10]
- adds r0, 0xC
- strh r0, [r3, 0x10]
- ldr r4, _080D115C @ =0xfffffe80
- adds r0, r1, r4
- b _080D1162
- .align 2, 0
-_080D1158: .4byte sTransitionStructPtr
-_080D115C: .4byte 0xfffffe80
-_080D1160:
- movs r0, 0
-_080D1162:
- strh r0, [r3, 0x12]
- ldr r0, _080D1194 @ =gScanlineEffectRegBuffers
- movs r1, 0x10
- ldrsh r2, [r3, r1]
- ldrh r1, [r3, 0x12]
- lsls r1, 16
- asrs r1, 24
- str r1, [sp]
- movs r1, 0xA0
- str r1, [sp, 0x4]
- movs r1, 0
- movs r3, 0x84
- bl BT_LoadWaveIntoBuffer
- ldr r0, _080D1198 @ =sTransitionStructPtr
- ldr r1, [r0]
- ldrb r0, [r1]
- adds r0, 0x1
- ldrb r2, [r1]
- strb r0, [r1]
- movs r0, 0
- add sp, 0x8
- pop {r4}
- pop {r1}
- bx r1
- .align 2, 0
-_080D1194: .4byte gScanlineEffectRegBuffers
-_080D1198: .4byte sTransitionStructPtr
- thumb_func_end BT_Phase2BigPokeball_UpdateWave2DecEvb
-
- thumb_func_start BT_Phase2BigPokeball_UpdateWave3
-BT_Phase2BigPokeball_UpdateWave3: @ 80D119C
- push {r4,r5,lr}
- sub sp, 0x8
- adds r4, r0, 0
- ldr r0, _080D11C4 @ =sTransitionStructPtr
- ldr r0, [r0]
- ldrb r1, [r0]
- movs r2, 0
- strb r2, [r0]
- ldrh r1, [r4, 0x12]
- movs r3, 0x12
- ldrsh r0, [r4, r3]
- cmp r0, 0
- ble _080D11CC
- ldrh r0, [r4, 0x10]
- adds r0, 0xC
- strh r0, [r4, 0x10]
- ldr r2, _080D11C8 @ =0xfffffe80
- adds r0, r1, r2
- strh r0, [r4, 0x12]
- b _080D11CE
- .align 2, 0
-_080D11C4: .4byte sTransitionStructPtr
-_080D11C8: .4byte 0xfffffe80
-_080D11CC:
- strh r2, [r4, 0x12]
-_080D11CE:
- ldr r0, _080D1218 @ =gScanlineEffectRegBuffers
- movs r3, 0x10
- ldrsh r2, [r4, r3]
- ldrh r1, [r4, 0x12]
- lsls r1, 16
- asrs r1, 24
- str r1, [sp]
- movs r5, 0xA0
- str r5, [sp, 0x4]
- movs r1, 0
- movs r3, 0x84
- bl BT_LoadWaveIntoBuffer
- movs r1, 0x12
- ldrsh r0, [r4, r1]
- cmp r0, 0
- bgt _080D1202
- ldrh r0, [r4, 0x8]
- adds r0, 0x1
- movs r1, 0
- strh r0, [r4, 0x8]
- strh r5, [r4, 0xA]
- movs r0, 0x80
- lsls r0, 1
- strh r0, [r4, 0xC]
- strh r1, [r4, 0xE]
-_080D1202:
- ldr r0, _080D121C @ =sTransitionStructPtr
- ldr r1, [r0]
- ldrb r0, [r1]
- adds r0, 0x1
- ldrb r2, [r1]
- strb r0, [r1]
- movs r0, 0
- add sp, 0x8
- pop {r4,r5}
- pop {r1}
- bx r1
- .align 2, 0
-_080D1218: .4byte gScanlineEffectRegBuffers
-_080D121C: .4byte sTransitionStructPtr
- thumb_func_end BT_Phase2BigPokeball_UpdateWave3
-
thumb_func_start BT_Phase2BigPokeball_CircleEffect
BT_Phase2BigPokeball_CircleEffect: @ 80D1220
push {r4,lr}
diff --git a/include/overworld.h b/include/overworld.h
index 9a9657006..7c1f34e41 100644
--- a/include/overworld.h
+++ b/include/overworld.h
@@ -106,6 +106,7 @@ extern bool8 (* gFieldCallback2)(void);
void SetLastHealLocationWarp(u8 healLocaionId);
void sub_8055864(u8 mapGroup, u8 mapNum);
void CB2_Overworld(void);
+void CB2_OverworldBasic(void);
void CB2_NewGame(void);
bool8 Overworld_MapTypeAllowsTeleportAndFly(u8 mapType);
void Overworld_ResetStateAfterTeleport(void);
diff --git a/ld_script.txt b/ld_script.txt
index 1dc198e6f..f3f580d0c 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -191,6 +191,7 @@ SECTIONS {
asm/evolution_scene.o(.text);
src/coins.o(.text);
src/fldeff_strength.o(.text);
+ src/battle_transition.o(.text);
asm/battle_transition.o(.text);
asm/battle_controller_link_partner.o(.text);
asm/battle_message.o(.text);
diff --git a/src/battle_transition.c b/src/battle_transition.c
index 7894a5b73..27354292c 100644
--- a/src/battle_transition.c
+++ b/src/battle_transition.c
@@ -1,7 +1,14 @@
#include "global.h"
#include "sprite.h"
#include "task.h"
+#include "overworld.h"
+#include "malloc.h"
+#include "palette.h"
+#include "trig.h"
+#include "gpu_regs.h"
#include "battle_transition.h"
+#include "field_weather.h"
+#include "scanline_effect.h"
typedef bool8 (*TransitionStateFunc)(struct Task *task);
typedef bool8 (*TransitionSpriteCallback)(struct Sprite *sprite);
@@ -105,25 +112,28 @@ bool8 BT_Phase1Blink(struct Task *task);
bool8 BT_WaitForPhase1(struct Task *task);
bool8 BT_Phase2LaunchAnimTask(struct Task *task);
bool8 BT_WaitForPhase2(struct Task *task);
-bool8 BT_Phase2Blur(struct Task *task);
-bool8 BT_Phase2DistortedWave(struct Task *task);
-bool8 BT_Phase2HorizontalCorrugate(struct Task *task);
-bool8 BT_Phase2BigPokeball(struct Task *task);
-bool8 BT_Phase2SlidingPokeballs(struct Task *task);
-bool8 BT_Phase2ClockwiseBlackFade(struct Task *task);
-bool8 BT_Phase2FullScreenWave(struct Task *task);
-bool8 BT_Phase2BlackWaveToRight(struct Task *task);
-bool8 BT_Phase2SlicedScreen(struct Task *task);
-bool8 BT_Phase2WhiteFadeInStripes(struct Task *task);
-bool8 BT_Phase2GridSquares(struct Task *task);
-bool8 BT_Phase2BlackDoodles(struct Task *task);
-bool8 BT_Phase2StartLoreleiMugshot(struct Task *task);
-bool8 BT_Phase2StartBrunoMugshot(struct Task *task);
-bool8 BT_Phase2StartAgathaMugshot(struct Task *task);
-bool8 BT_Phase2StartLanceMugshot(struct Task *task);
-bool8 BT_Phase2StartBlueMugshot(struct Task *task);
-bool8 BT_Phase2AntiClockwiseSpiral(struct Task *task);
-bool8 BT_Phase1Task(struct Task *task);
+void BT_Phase2Blur(u8 taskId);
+void BT_Phase2DistortedWave(u8 taskId);
+void BT_Phase2HorizontalCorrugate(u8 taskId);
+void BT_Phase2BigPokeball(u8 taskId);
+void BT_Phase2SlidingPokeballs(u8 taskId);
+void BT_Phase2ClockwiseBlackFade(u8 taskId);
+void BT_Phase2FullScreenWave(u8 taskId);
+void BT_Phase2BlackWaveToRight(u8 taskId);
+void BT_Phase2SlicedScreen(u8 taskId);
+void BT_Phase2WhiteFadeInStripes(u8 taskId);
+void BT_Phase2GridSquares(u8 taskId);
+void BT_Phase2BlackDoodles(u8 taskId);
+void BT_Phase2StartLoreleiMugshot(u8 taskId);
+void BT_Phase2StartBrunoMugshot(u8 taskId);
+void BT_Phase2StartAgathaMugshot(u8 taskId);
+void BT_Phase2StartLanceMugshot(u8 taskId);
+void BT_Phase2StartBlueMugshot(u8 taskId);
+void BT_Phase2AntiClockwiseSpiral(u8 taskId);
+void BT_Phase1Task(u8 taskId);
+
+void SpriteCB_BT_Phase2Mugshots(struct Sprite *sprite);
+void SpriteCB_BT_Phase2SlidingPokeballs(struct Sprite *sprite);
bool8 BT_Phase2MugshotsSpriteFuncs_Wait(struct Sprite *sprite);
bool8 BT_Phase2MugshotsSpriteFuncs_InitParams(struct Sprite *sprite);
@@ -131,8 +141,23 @@ bool8 BT_Phase2MugshotsSpriteFuncs_SlideSpriteIn(struct Sprite *sprite);
bool8 BT_Phase2MugshotsSpriteFuncs_DecelerateSprite(struct Sprite *sprite);
bool8 BT_Phase2MugshotsSpriteFuncs_DecelerateSprite2(struct Sprite *sprite);
-void SpriteCB_BT_Phase2Mugshots(struct Sprite *sprite);
-void SpriteCB_BT_Phase2SlidingPokeballs(struct Sprite *sprite);
+void VBCB_BT_Phase2DistortedWave(void);
+void HBCB_BT_Phase2DistortedWave(void);
+void VBCB_BT_Phase2HorizontalCorrugate(void);
+void HBCB_BT_Phase2HorizontalCorrugate(void);
+void VBCB_BT_Phase2BigPokeball1(void);
+void VBCB_BT_Phase2BigPokeball2(void);
+void HBCB_BT_Phase2BigPokeball(void);
+
+void BT_LaunchTask(u8 transitionId);
+void BT_TaskMain(u8 taskId);
+void BT_InitCtrlBlk(void);
+void BT_CreatePhase1SubTask(s16 fadeOutDelay, s16 fadeInDelay, s16 blinkTimes, s16 fadeOutSpeed, s16 fadeInSpeed);
+bool8 BT_IsPhase1Done(void);
+void BT_VBSyncOamAndPltt(void);
+void BT_GetBg0TilemapAndTilesetBase(u16 **tilemapPtr, u16 **tilesetPtr);
+void BT_LoadWaveIntoBuffer(s16 *buffer, s16 offset, s16 theta, s16 frequency, s16 amplitude, s16 bufSize);
+
const u32 sBigPokeballTileset[] = INCBIN_U32("graphics/battle_transitions/big_pokeball_tileset.4bpp");
const u32 sSlidingPokeballTilemap[] = INCBIN_U32("graphics/battle_transitions/sliding_pokeball_tilemap.bin");
@@ -142,7 +167,7 @@ const u8 sSpriteImage_UnusedBrendan[] = INCBIN_U8("graphics/battle_transitions/u
const u8 sSpriteImage_UnusedLass[] = INCBIN_U8("graphics/battle_transitions/unused_lass.4bpp");
const u32 sGridSquareTilemap[] = INCBIN_U32("graphics/battle_transitions/grid_square_tilemap.bin");
-const TransitionStateFunc sBT_Phase1Tasks[] =
+const TaskFunc sBT_Phase1Tasks[] =
{
BT_Phase1Task,
BT_Phase1Task,
@@ -164,7 +189,7 @@ const TransitionStateFunc sBT_Phase1Tasks[] =
BT_Phase1Task,
};
-const TransitionStateFunc sBT_Phase2Tasks[] =
+const TaskFunc sBT_Phase2Tasks[] =
{
BT_Phase2Blur,
BT_Phase2DistortedWave,
@@ -575,3 +600,378 @@ const struct SpritePalette sSpritePalette_UnusedTrainer =
const u16 sBigPokeballTilemap[] = INCBIN_U16("graphics/battle_transitions/big_pokeball_tilemap.bin");
const u16 sVsBarTilemap[] = INCBIN_U16("graphics/battle_transitions/vsbar_tilemap.bin");
+
+void BT_StartOnField(u8 transitionId)
+{
+ sTransitionStructPtr = AllocZeroed(sizeof(struct TransitionData));
+ gMain.callback2 = CB2_OverworldBasic;
+ BT_LaunchTask(transitionId);
+}
+
+// not used
+static void BT_StartWithoutAlloc(u8 transitionId)
+{
+ BT_LaunchTask(transitionId);
+}
+
+#define tState data[0]
+#define tTransitionId data[1]
+#define tTransitionDone data[15]
+
+bool8 BT_IsDone(void)
+{
+ u8 taskId = FindTaskIdByFunc(BT_TaskMain);
+ if (gTasks[taskId].tTransitionDone)
+ {
+ BT_InitCtrlBlk();
+ FREE_AND_SET_NULL(sTransitionStructPtr);
+ DestroyTask(taskId);
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+}
+
+void BT_LaunchTask(u8 transitionId)
+{
+ u8 taskId = CreateTask(BT_TaskMain, 2);
+ gTasks[taskId].tTransitionId = transitionId;
+}
+
+void BT_TaskMain(u8 taskId)
+{
+ while (sBT_MainPhases[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+bool8 BT_Phase1Blink(struct Task *task)
+{
+ SetWeatherScreenFadeOut();
+ CpuCopy32(gPlttBufferFaded, gPlttBufferUnfaded, 0x400);
+ if (sBT_Phase1Tasks[task->tTransitionId] != NULL)
+ {
+ CreateTask(sBT_Phase1Tasks[task->tTransitionId], 4);
+ ++task->tState;
+ return FALSE;
+ }
+ else
+ {
+ task->tState = 2;
+ return TRUE;
+ }
+}
+
+bool8 BT_WaitForPhase1(struct Task *task)
+{
+ if (FindTaskIdByFunc(sBT_Phase1Tasks[task->tTransitionId]) == TASK_NONE)
+ {
+ ++task->tState;
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+}
+
+bool8 BT_Phase2LaunchAnimTask(struct Task *task)
+{
+ CreateTask(sBT_Phase2Tasks[task->tTransitionId], 0);
+ ++task->tState;
+ return FALSE;
+}
+
+bool8 BT_WaitForPhase2(struct Task *task)
+{
+ task->tTransitionDone = FALSE;
+ if (FindTaskIdByFunc(sBT_Phase2Tasks[task->tTransitionId]) == TASK_NONE)
+ task->tTransitionDone = TRUE;
+ return FALSE;
+}
+
+void BT_Phase1Task(u8 taskId)
+{
+ if (!gTasks[taskId].tState)
+ {
+ ++gTasks[taskId].tState;
+ BT_CreatePhase1SubTask(0, 0, 2, 2, 2);
+ }
+ else if (BT_IsPhase1Done())
+ {
+ DestroyTask(taskId);
+ }
+}
+
+#define tInterval data[1]
+#define tMosaicSize data[2]
+
+void BT_Phase2Blur(u8 taskId)
+{
+ while (sBT_Phase2BlurFuncs[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+bool8 BT_Phase2Blur_InitBgMosaic(struct Task *task)
+{
+ SetGpuReg(REG_OFFSET_MOSAIC, 0);
+ SetGpuRegBits(REG_OFFSET_BG1CNT, BGCNT_MOSAIC);
+ SetGpuRegBits(REG_OFFSET_BG2CNT, BGCNT_MOSAIC);
+ SetGpuRegBits(REG_OFFSET_BG3CNT, BGCNT_MOSAIC);
+ ++task->tState;
+ return TRUE;
+}
+
+bool8 BT_Phase2Blur_Anim(struct Task *task)
+{
+ if (task->tInterval)
+ {
+ --task->tInterval;
+ }
+ else
+ {
+ task->tInterval = 2;
+ if (++task->tMosaicSize == 10)
+ BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 0x10, RGB_BLACK);
+ // The mosaic size argument is shared by HSIZE and VSIZE
+ SetGpuReg(REG_OFFSET_MOSAIC, (task->tMosaicSize & 0xF) + ((task->tMosaicSize & 0xF) << 4));
+ if (task->tMosaicSize > 14)
+ ++task->tState;
+ }
+ return FALSE;
+}
+
+bool8 BT_Phase2Blur_IsDone(struct Task *task)
+{
+ if (!gPaletteFade.active)
+ DestroyTask(FindTaskIdByFunc(BT_Phase2Blur));
+ return FALSE;
+}
+
+#undef tInterval
+#undef tMosaicSize
+
+#define tTheta data[1]
+#define tAmplitude data[2]
+
+void BT_Phase2DistortedWave(u8 taskId)
+{
+ while (sBT_Phase2DistortedWaveFuncs[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+bool8 BT_Phase2DistortedWave_InitWave(struct Task *task)
+{
+ BT_InitCtrlBlk();
+ ScanlineEffect_Clear();
+ BeginNormalPaletteFade(0xFFFFFFFF, 4, 0, 0x10, RGB_BLACK);
+ BT_LoadWaveIntoBuffer(gScanlineEffectRegBuffers[1], sTransitionStructPtr->bg123HOfs, 0, 2, 0, 160);
+ SetVBlankCallback(VBCB_BT_Phase2DistortedWave);
+ SetHBlankCallback(HBCB_BT_Phase2DistortedWave);
+ EnableInterrupts(INTR_FLAG_VBLANK | INTR_FLAG_HBLANK);
+ ++task->tState;
+ return FALSE;
+}
+
+bool8 BT_Phase2DistortedWave_UpdateWave(struct Task *task)
+{
+ sTransitionStructPtr->vblankDma = FALSE;
+ task->tTheta += 4;
+ task->tAmplitude += 8;
+ BT_LoadWaveIntoBuffer(gScanlineEffectRegBuffers[0], sTransitionStructPtr->bg123HOfs, task->tTheta, 2, task->tAmplitude, 160);
+ if (!gPaletteFade.active)
+ DestroyTask(FindTaskIdByFunc(BT_Phase2DistortedWave));
+ ++sTransitionStructPtr->vblankDma;
+ return FALSE;
+}
+
+void VBCB_BT_Phase2DistortedWave(void)
+{
+ BT_VBSyncOamAndPltt();
+ if (sTransitionStructPtr->vblankDma)
+ DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320);
+}
+
+void HBCB_BT_Phase2DistortedWave(void)
+{
+ s16 offset = gScanlineEffectRegBuffers[1][REG_VCOUNT];
+ REG_BG1HOFS = offset;
+ REG_BG2HOFS = offset;
+ REG_BG3HOFS = offset;
+}
+
+void BT_Phase2HorizontalCorrugate(u8 taskId)
+{
+ while (sBT_Phase2HorizontalCorrugateFuncs[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+bool8 BT_Phase2HorizontalCorrugate_Init(struct Task *task)
+{
+ BT_InitCtrlBlk();
+ ScanlineEffect_Clear();
+ BeginNormalPaletteFade(0xFFFFFFFF, 4, 0, 0x10, RGB_BLACK);
+ memset(gScanlineEffectRegBuffers[1], sTransitionStructPtr->bg123VOfs, 320);
+ SetVBlankCallback(VBCB_BT_Phase2HorizontalCorrugate);
+ SetHBlankCallback(HBCB_BT_Phase2HorizontalCorrugate);
+ EnableInterrupts(INTR_FLAG_VBLANK | INTR_FLAG_HBLANK);
+ ++task->tState;
+ return FALSE;
+}
+
+bool8 BT_Phase2HorizontalCorrugate_UpdateWave(struct Task *task)
+{
+ u8 i;
+ u16 theta, amplitude;
+
+ sTransitionStructPtr->vblankDma = FALSE;
+ theta = task->tTheta;
+ amplitude = task->tAmplitude >> 8;
+ task->tTheta += 4224;
+ task->tAmplitude += 384;
+ for (i = 0; i < 160; i++, theta += 4224)
+ gScanlineEffectRegBuffers[0][i] = sTransitionStructPtr->bg123VOfs + Sin(theta / 256, amplitude);
+ if (!gPaletteFade.active)
+ DestroyTask(FindTaskIdByFunc(BT_Phase2HorizontalCorrugate));
+ ++sTransitionStructPtr->vblankDma;
+ return FALSE;
+}
+
+void VBCB_BT_Phase2HorizontalCorrugate(void)
+{
+ BT_VBSyncOamAndPltt();
+ if (sTransitionStructPtr->vblankDma)
+ DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320);
+}
+
+void HBCB_BT_Phase2HorizontalCorrugate(void)
+{
+ u16 offset = gScanlineEffectRegBuffers[1][REG_VCOUNT];
+ REG_BG1VOFS = offset;
+ REG_BG2VOFS = offset;
+ REG_BG3VOFS = offset;
+}
+
+#undef tTheta
+#undef tAmplitude
+
+#define tEvb data[1]
+#define tEva data[2]
+#define tInterval data[3]
+#define tTheta data[4]
+#define tAmplitude data[5]
+
+void BT_Phase2BigPokeball(u8 taskId)
+{
+ while (sBT_Phase2BigPokeballFuncs[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+bool8 BT_Phase2BigPokeball_Init(struct Task *task)
+{
+ u16 i, *tilemapAddr, *tilesetAddr;
+
+ BT_InitCtrlBlk();
+ ScanlineEffect_Clear();
+ task->tEvb = 16;
+ task->tEva = 0;
+ task-> tTheta = 0;
+ task-> tAmplitude = 0x4000;
+ sTransitionStructPtr->winIn = 0x3F;
+ sTransitionStructPtr->winOut = 0;
+ sTransitionStructPtr->win0H = 240;
+ sTransitionStructPtr->win0V = 160;
+ sTransitionStructPtr->bldCnt = BLDCNT_TGT1_BG0 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ | BLDCNT_TGT2_BD;
+ sTransitionStructPtr->bldAlpha = (task->tEvb << 8) | task->tEva;
+ for (i = 0; i < 160; ++i)
+ gScanlineEffectRegBuffers[1][i] = 240;
+ SetVBlankCallback(VBCB_BT_Phase2BigPokeball1);
+ BT_GetBg0TilemapAndTilesetBase(&tilemapAddr, &tilesetAddr);
+ CpuFill16(0, tilemapAddr, 0x800);
+ CpuCopy16(sBigPokeballTileset, tilesetAddr, 0x580);
+ LoadPalette(sSlidingPokeballBigPokeballPalette, 0xF0, 0x20);
+ ++task->tState;
+ return FALSE;
+}
+
+bool8 BT_Phase2BigPokeball_LoadTilemapAndWave(struct Task *task)
+{
+ s16 i, j;
+ u16 *tilemapAddr, *tilesetAddr;
+ const u16 *BigPokeballMap = sBigPokeballTilemap;
+
+ BT_GetBg0TilemapAndTilesetBase(&tilemapAddr, &tilesetAddr);
+ for (i = 0; i < 20; ++i)
+ for (j = 0; j < 30; ++j, ++BigPokeballMap)
+ tilemapAddr[i * 32 + j] = *BigPokeballMap | 0xF000; // use palette #15
+ BT_LoadWaveIntoBuffer(gScanlineEffectRegBuffers[0], 0, task->tTheta, 132, task->tAmplitude, 160);
+ ++task->tState;
+ return TRUE;
+}
+
+bool8 BT_Phase2BigPokeball_UpdateWave1IncEva(struct Task *task)
+{
+ sTransitionStructPtr->vblankDma = FALSE;
+ if (task->tInterval == 0 || --task->tInterval == 0)
+ {
+ ++task->tEva;
+ task->tInterval = 1; // Broken logic. This makes the condition always TRUE.
+ }
+ sTransitionStructPtr->bldAlpha = (task->tEvb << 8) | task->tEva;
+ // Increment eva until it reaches 50% coeff
+ if (task->tEva > 15)
+ ++task->tState;
+ task->tTheta += 12;
+ task->tAmplitude -= 384;
+ // Assign a very high frequency value so that 2 adjacent values in gScanlineEffectRegBuffers[0] have different sign
+ BT_LoadWaveIntoBuffer(gScanlineEffectRegBuffers[0], 0, task->tTheta, 132, task->tAmplitude >> 8, 160);
+ ++sTransitionStructPtr->vblankDma;
+ return FALSE;
+}
+
+bool8 BT_Phase2BigPokeball_UpdateWave2DecEvb(struct Task *task)
+{
+ sTransitionStructPtr->vblankDma = FALSE;
+ if (task->tInterval == 0 || --task->tInterval == 0)
+ {
+ --task->tEvb;
+ task->tInterval = 2;
+ }
+ sTransitionStructPtr->bldAlpha = (task->tEvb << 8) | task->tEva;
+ if (!task->tEvb)
+ ++task->tState;
+ if (task->tAmplitude > 0)
+ {
+ task->tTheta += 12;
+ task->tAmplitude -= 384;
+ }
+ else
+ {
+ task->tAmplitude = 0;
+ }
+ BT_LoadWaveIntoBuffer(gScanlineEffectRegBuffers[0], 0, task->tTheta, 132, task->tAmplitude >> 8, 160);
+ ++sTransitionStructPtr->vblankDma;
+ return FALSE;
+}
+
+bool8 BT_Phase2BigPokeball_UpdateWave3(struct Task *task)
+{
+ sTransitionStructPtr->vblankDma = FALSE;
+ if (task->tAmplitude > 0)
+ {
+ task->tTheta += 12;
+ task->tAmplitude -= 384;
+ }
+ else
+ {
+ task->tAmplitude = 0;
+ }
+ BT_LoadWaveIntoBuffer(gScanlineEffectRegBuffers[0], 0, task->tTheta, 132, task->tAmplitude >> 8, 160);
+ if (task->tAmplitude <= 0)
+ {
+ ++task->tState;
+ task->tEvb = 160;
+ task->tEva = 256;
+ task->tInterval = 0;
+ }
+ ++sTransitionStructPtr->vblankDma;
+ return FALSE;
+}
+
+