summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjiangzhengwenjz <jiangzhengwenjzw@qq.com>2019-07-24 14:52:07 +0800
committerjiangzhengwenjz <jiangzhengwenjzw@qq.com>2019-07-24 14:52:07 +0800
commit25661400cc57bc3511945d9d05c324ceec5839e2 (patch)
tree9a558bb6f20f47b630892a1a9232964495cd1bf0
parent4677efabdbe6769c8e35a9c003c42855678de81f (diff)
thru BT_Phase2AntiClockwiseSpiral
-rw-r--r--asm/battle_transition.s1689
-rw-r--r--include/field_effect.h1
-rw-r--r--src/battle_transition.c560
3 files changed, 555 insertions, 1695 deletions
diff --git a/asm/battle_transition.s b/asm/battle_transition.s
index b6b365db4..64b5686db 100644
--- a/asm/battle_transition.s
+++ b/asm/battle_transition.s
@@ -5,1695 +5,6 @@
.text
- thumb_func_start BT_Phase2BigPokeball_CircleEffect
-BT_Phase2BigPokeball_CircleEffect: @ 80D1220
- push {r4,lr}
- adds r4, r0, 0
- ldr r0, _080D12C4 @ =sTransitionStructPtr
- ldr r0, [r0]
- ldrb r1, [r0]
- movs r3, 0
- strb r3, [r0]
- ldrh r2, [r4, 0xC]
- movs r0, 0xC
- ldrsh r1, [r4, r0]
- ldr r0, _080D12C8 @ =0x000007ff
- cmp r1, r0
- bgt _080D1242
- movs r1, 0x80
- lsls r1, 1
- adds r0, r2, r1
- strh r0, [r4, 0xC]
-_080D1242:
- ldrh r1, [r4, 0xA]
- movs r2, 0xA
- ldrsh r0, [r4, r2]
- cmp r0, 0
- beq _080D125E
- ldrh r0, [r4, 0xC]
- lsls r0, 16
- asrs r0, 24
- subs r0, r1, r0
- strh r0, [r4, 0xA]
- lsls r0, 16
- cmp r0, 0
- bge _080D125E
- strh r3, [r4, 0xA]
-_080D125E:
- ldr r0, _080D12CC @ =gScanlineEffectRegBuffers
- movs r1, 0xA
- ldrsh r3, [r4, r1]
- movs r1, 0x78
- movs r2, 0x50
- bl BT_GenerateCircle
- movs r2, 0xA
- ldrsh r0, [r4, r2]
- cmp r0, 0
- bne _080D129A
- ldr r1, _080D12D0 @ =0x040000b0
- ldrh r2, [r1, 0xA]
- ldr r0, _080D12D4 @ =0x0000c5ff
- ands r0, r2
- strh r0, [r1, 0xA]
- ldrh r2, [r1, 0xA]
- ldr r0, _080D12D8 @ =0x00007fff
- ands r0, r2
- strh r0, [r1, 0xA]
- ldrh r0, [r1, 0xA]
- bl BT_BlendPalettesToBlack
- ldr r0, _080D12DC @ =BT_Phase2BigPokeball
- bl FindTaskIdByFunc
- lsls r0, 24
- lsrs r0, 24
- bl DestroyTask
-_080D129A:
- ldrh r1, [r4, 0xE]
- movs r2, 0xE
- ldrsh r0, [r4, r2]
- cmp r0, 0
- bne _080D12AE
- adds r0, r1, 0x1
- strh r0, [r4, 0xE]
- ldr r0, _080D12E0 @ =VBCB_BT_Phase2BigPokeball2
- bl SetVBlankCallback
-_080D12AE:
- ldr r0, _080D12C4 @ =sTransitionStructPtr
- ldr r1, [r0]
- ldrb r0, [r1]
- adds r0, 0x1
- ldrb r2, [r1]
- strb r0, [r1]
- movs r0, 0
- pop {r4}
- pop {r1}
- bx r1
- .align 2, 0
-_080D12C4: .4byte sTransitionStructPtr
-_080D12C8: .4byte 0x000007ff
-_080D12CC: .4byte gScanlineEffectRegBuffers
-_080D12D0: .4byte 0x040000b0
-_080D12D4: .4byte 0x0000c5ff
-_080D12D8: .4byte 0x00007fff
-_080D12DC: .4byte BT_Phase2BigPokeball
-_080D12E0: .4byte VBCB_BT_Phase2BigPokeball2
- thumb_func_end BT_Phase2BigPokeball_CircleEffect
-
- thumb_func_start BT_VBStopDma0SyncSrcBufferSetLcdRegs
-BT_VBStopDma0SyncSrcBufferSetLcdRegs: @ 80D12E4
- push {r4,lr}
- ldr r1, _080D1354 @ =0x040000b0
- ldrh r2, [r1, 0xA]
- ldr r0, _080D1358 @ =0x0000c5ff
- ands r0, r2
- strh r0, [r1, 0xA]
- ldrh r2, [r1, 0xA]
- ldr r0, _080D135C @ =0x00007fff
- ands r0, r2
- strh r0, [r1, 0xA]
- ldrh r0, [r1, 0xA]
- bl BT_VBSyncOamAndPltt
- ldr r4, _080D1360 @ =sTransitionStructPtr
- ldr r0, [r4]
- ldrb r0, [r0]
- cmp r0, 0
- beq _080D131C
- ldr r1, _080D1364 @ =0x040000d4
- ldr r0, _080D1368 @ =gScanlineEffectRegBuffers
- str r0, [r1]
- movs r2, 0xF0
- lsls r2, 3
- adds r0, r2
- str r0, [r1, 0x4]
- ldr r0, _080D136C @ =0x800000a0
- str r0, [r1, 0x8]
- ldr r0, [r1, 0x8]
-_080D131C:
- ldr r0, [r4]
- ldrh r1, [r0, 0x2]
- movs r0, 0x48
- bl SetGpuReg
- ldr r0, [r4]
- ldrh r1, [r0, 0x4]
- movs r0, 0x4A
- bl SetGpuReg
- ldr r0, [r4]
- ldrh r1, [r0, 0x8]
- movs r0, 0x44
- bl SetGpuReg
- ldr r0, [r4]
- ldrh r1, [r0, 0xE]
- movs r0, 0x50
- bl SetGpuReg
- ldr r0, [r4]
- ldrh r1, [r0, 0x10]
- movs r0, 0x52
- bl SetGpuReg
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_080D1354: .4byte 0x040000b0
-_080D1358: .4byte 0x0000c5ff
-_080D135C: .4byte 0x00007fff
-_080D1360: .4byte sTransitionStructPtr
-_080D1364: .4byte 0x040000d4
-_080D1368: .4byte gScanlineEffectRegBuffers
-_080D136C: .4byte 0x800000a0
- thumb_func_end BT_VBStopDma0SyncSrcBufferSetLcdRegs
-
- thumb_func_start VBCB_BT_Phase2BigPokeball1
-VBCB_BT_Phase2BigPokeball1: @ 80D1370
- push {lr}
- bl BT_VBStopDma0SyncSrcBufferSetLcdRegs
- ldr r1, _080D138C @ =0x040000b0
- ldr r0, _080D1390 @ =gScanlineEffectRegBuffers + 0x780
- str r0, [r1]
- ldr r0, _080D1394 @ =0x04000010
- str r0, [r1, 0x4]
- ldr r0, _080D1398 @ =0xa2400001
- str r0, [r1, 0x8]
- ldr r0, [r1, 0x8]
- pop {r0}
- bx r0
- .align 2, 0
-_080D138C: .4byte 0x040000b0
-_080D1390: .4byte gScanlineEffectRegBuffers + 0x780
-_080D1394: .4byte 0x04000010
-_080D1398: .4byte 0xa2400001
- thumb_func_end VBCB_BT_Phase2BigPokeball1
-
- thumb_func_start VBCB_BT_Phase2BigPokeball2
-VBCB_BT_Phase2BigPokeball2: @ 80D139C
- push {lr}
- bl BT_VBStopDma0SyncSrcBufferSetLcdRegs
- ldr r1, _080D13B8 @ =0x040000b0
- ldr r0, _080D13BC @ =gScanlineEffectRegBuffers + 0x780
- str r0, [r1]
- ldr r0, _080D13C0 @ =0x04000040
- str r0, [r1, 0x4]
- ldr r0, _080D13C4 @ =0xa2400001
- str r0, [r1, 0x8]
- ldr r0, [r1, 0x8]
- pop {r0}
- bx r0
- .align 2, 0
-_080D13B8: .4byte 0x040000b0
-_080D13BC: .4byte gScanlineEffectRegBuffers + 0x780
-_080D13C0: .4byte 0x04000040
-_080D13C4: .4byte 0xa2400001
- thumb_func_end VBCB_BT_Phase2BigPokeball2
-
- thumb_func_start BT_Phase2SlidingPokeballs
-BT_Phase2SlidingPokeballs: @ 80D13C8
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r0, 24
- ldr r5, _080D13F8 @ =sBT_Phase2SlidingPokeballsFuncs
- ldr r2, _080D13FC @ =gTasks
- lsls r1, r0, 2
- adds r1, r0
- lsls r1, 3
- adds r4, r1, r2
-_080D13DA:
- 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 _080D13DA
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_080D13F8: .4byte sBT_Phase2SlidingPokeballsFuncs
-_080D13FC: .4byte gTasks
- thumb_func_end BT_Phase2SlidingPokeballs
-
- thumb_func_start BT_Phase2SlidingPokeballs_LoadBgGfx
-BT_Phase2SlidingPokeballs_LoadBgGfx: @ 80D1400
- push {r4,lr}
- sub sp, 0xC
- adds r4, r0, 0
- add r0, sp, 0x4
- add r1, sp, 0x8
- bl BT_GetBg0TilemapAndTilesetBase
- ldr r0, _080D1440 @ =sSlidingPokeballTilemap
- ldr r1, [sp, 0x8]
- movs r2, 0x20
- bl CpuSet
- movs r0, 0
- str r0, [sp]
- ldr r1, [sp, 0x4]
- ldr r2, _080D1444 @ =0x05000200
- mov r0, sp
- bl CpuSet
- ldr r0, _080D1448 @ =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}
- pop {r1}
- bx r1
- .align 2, 0
-_080D1440: .4byte sSlidingPokeballTilemap
-_080D1444: .4byte 0x05000200
-_080D1448: .4byte sSlidingPokeballBigPokeballPalette
- thumb_func_end BT_Phase2SlidingPokeballs_LoadBgGfx
-
- thumb_func_start BT_Phase2SlidingPokeballs_SetupFldeffArgs
-BT_Phase2SlidingPokeballs_SetupFldeffArgs: @ 80D144C
- push {r4-r7,lr}
- mov r7, r8
- push {r7}
- sub sp, 0x10
- adds r7, r0, 0
- ldr r1, _080D14CC @ =gUnknown_83FA400
- mov r0, sp
- movs r2, 0x4
- bl memcpy
- add r4, sp, 0x4
- ldr r1, _080D14D0 @ =gUnknown_83FA404
- adds r0, r4, 0
- movs r2, 0xA
- bl memcpy
- bl Random
- movs r5, 0x1
- ands r5, r0
- movs r1, 0
- mov r8, r4
- ldr r6, _080D14D4 @ =gFieldEffectArguments
-_080D147A:
- lsls r5, 16
- asrs r5, 16
- lsls r0, r5, 1
- add r0, sp
- movs r2, 0
- ldrsh r0, [r0, r2]
- str r0, [r6]
- lsls r4, r1, 16
- asrs r4, 16
- lsls r0, r4, 5
- adds r0, 0x10
- str r0, [r6, 0x4]
- str r5, [r6, 0x8]
- lsls r0, r4, 1
- add r0, r8
- movs r1, 0
- ldrsh r0, [r0, r1]
- str r0, [r6, 0xC]
- movs r0, 0x2D
- bl FieldEffectStart
- adds r4, 0x1
- lsls r4, 16
- movs r0, 0x1
- eors r5, r0
- lsls r5, 16
- lsrs r5, 16
- lsrs r1, r4, 16
- asrs r4, 16
- cmp r4, 0x4
- ble _080D147A
- ldrh r0, [r7, 0x8]
- adds r0, 0x1
- strh r0, [r7, 0x8]
- movs r0, 0
- add sp, 0x10
- pop {r3}
- mov r8, r3
- pop {r4-r7}
- pop {r1}
- bx r1
- .align 2, 0
-_080D14CC: .4byte gUnknown_83FA400
-_080D14D0: .4byte gUnknown_83FA404
-_080D14D4: .4byte gFieldEffectArguments
- thumb_func_end BT_Phase2SlidingPokeballs_SetupFldeffArgs
-
- thumb_func_start BT_Phase2SlidingPokeballs_IsDone
-BT_Phase2SlidingPokeballs_IsDone: @ 80D14D8
- push {lr}
- movs r0, 0x2D
- bl FieldEffectActiveListContains
- lsls r0, 24
- cmp r0, 0
- bne _080D14F8
- bl BT_BlendPalettesToBlack
- ldr r0, _080D1500 @ =BT_Phase2SlidingPokeballs
- bl FindTaskIdByFunc
- lsls r0, 24
- lsrs r0, 24
- bl DestroyTask
-_080D14F8:
- movs r0, 0
- pop {r1}
- bx r1
- .align 2, 0
-_080D1500: .4byte BT_Phase2SlidingPokeballs
- thumb_func_end BT_Phase2SlidingPokeballs_IsDone
-
- thumb_func_start FldEff_Pokeball
-FldEff_Pokeball: @ 80D1504
- push {r4,r5,lr}
- ldr r0, _080D1560 @ =sSpriteTemplate_SlidingPokeball
- ldr r5, _080D1564 @ =gFieldEffectArguments
- movs r2, 0
- ldrsh r1, [r5, r2]
- movs r3, 0x4
- ldrsh r2, [r5, r3]
- movs r3, 0
- bl CreateSpriteAtEnd
- lsls r0, 24
- lsrs r0, 24
- ldr r1, _080D1568 @ =gSprites
- lsls r4, r0, 4
- adds r4, r0
- lsls r4, 2
- adds r4, r1
- ldrb r1, [r4, 0x5]
- movs r0, 0xD
- negs r0, r0
- ands r0, r1
- strb r0, [r4, 0x5]
- ldrb r1, [r4, 0x1]
- movs r0, 0x4
- negs r0, r0
- ands r0, r1
- movs r1, 0x1
- orrs r0, r1
- strb r0, [r4, 0x1]
- ldr r0, [r5, 0x8]
- strh r0, [r4, 0x2E]
- ldr r0, [r5, 0xC]
- strh r0, [r4, 0x30]
- ldr r0, _080D156C @ =0x0000ffff
- strh r0, [r4, 0x32]
- adds r0, r4, 0
- bl InitSpriteAffineAnim
- ldrb r1, [r5, 0x8]
- adds r0, r4, 0
- bl StartSpriteAffineAnim
- movs r0, 0
- pop {r4,r5}
- pop {r1}
- bx r1
- .align 2, 0
-_080D1560: .4byte sSpriteTemplate_SlidingPokeball
-_080D1564: .4byte gFieldEffectArguments
-_080D1568: .4byte gSprites
-_080D156C: .4byte 0x0000ffff
- thumb_func_end FldEff_Pokeball
-
- thumb_func_start SpriteCB_BT_Phase2SlidingPokeballs
-SpriteCB_BT_Phase2SlidingPokeballs: @ 80D1570
- push {r4-r6,lr}
- sub sp, 0x4
- adds r4, r0, 0
- ldr r1, _080D1590 @ =gUnknown_83FA40E
- mov r0, sp
- movs r2, 0x4
- bl memcpy
- ldrh r1, [r4, 0x30]
- movs r2, 0x30
- ldrsh r0, [r4, r2]
- cmp r0, 0
- beq _080D1594
- subs r0, r1, 0x1
- strh r0, [r4, 0x30]
- b _080D162A
- .align 2, 0
-_080D1590: .4byte gUnknown_83FA40E
-_080D1594:
- ldrh r0, [r4, 0x20]
- lsls r1, r0, 16
- lsrs r0, r1, 16
- cmp r0, 0xF0
- bhi _080D1606
- asrs r0, r1, 19
- lsls r0, 16
- ldrh r1, [r4, 0x22]
- lsls r1, 16
- asrs r1, 19
- lsls r1, 16
- lsrs r6, r1, 16
- lsrs r1, r0, 16
- asrs r5, r0, 16
- movs r2, 0x32
- ldrsh r0, [r4, r2]
- cmp r5, r0
- beq _080D1606
- strh r1, [r4, 0x32]
- movs r0, 0x8
- bl GetGpuReg
- lsls r0, 16
- lsrs r0, 24
- movs r1, 0x1F
- ands r0, r1
- lsls r0, 11
- movs r1, 0xC0
- lsls r1, 19
- adds r0, r1
- lsls r2, r6, 16
- asrs r2, 16
- subs r1, r2, 0x2
- lsls r1, 5
- adds r1, r5
- lsls r1, 1
- adds r1, r0
- ldr r6, _080D1634 @ =0x0000f001
- adds r3, r6, 0
- strh r3, [r1]
- subs r1, r2, 0x1
- lsls r1, 5
- adds r1, r5
- lsls r1, 1
- adds r1, r0
- strh r3, [r1]
- lsls r1, r2, 5
- adds r1, r5
- lsls r1, 1
- adds r1, r0
- strh r3, [r1]
- adds r2, 0x1
- lsls r2, 5
- adds r2, r5
- lsls r2, 1
- adds r2, r0
- strh r3, [r2]
-_080D1606:
- movs r1, 0x2E
- ldrsh r0, [r4, r1]
- lsls r0, 1
- add r0, sp
- ldrh r0, [r0]
- ldrh r2, [r4, 0x20]
- adds r0, r2
- strh r0, [r4, 0x20]
- adds r0, 0xF
- lsls r0, 16
- movs r1, 0x87
- lsls r1, 17
- cmp r0, r1
- bls _080D162A
- adds r0, r4, 0
- movs r1, 0x2D
- bl FieldEffectStop
-_080D162A:
- add sp, 0x4
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_080D1634: .4byte 0x0000f001
- thumb_func_end SpriteCB_BT_Phase2SlidingPokeballs
-
- thumb_func_start BT_Phase2ClockwiseBlackFade
-BT_Phase2ClockwiseBlackFade: @ 80D1638
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r0, 24
- ldr r5, _080D1668 @ =sBT_Phase2ClockwiseBlackFadeFuncs
- ldr r2, _080D166C @ =gTasks
- lsls r1, r0, 2
- adds r1, r0
- lsls r1, 3
- adds r4, r1, r2
-_080D164A:
- 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 _080D164A
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_080D1668: .4byte sBT_Phase2ClockwiseBlackFadeFuncs
-_080D166C: .4byte gTasks
- thumb_func_end BT_Phase2ClockwiseBlackFade
-
- thumb_func_start BT_Phase2ClockwiseBlackFade_Init
-BT_Phase2ClockwiseBlackFade_Init: @ 80D1670
- push {r4,lr}
- adds r4, r0, 0
- bl BT_InitCtrlBlk
- bl ScanlineEffect_Clear
- ldr r0, _080D16C4 @ =sTransitionStructPtr
- ldr r1, [r0]
- movs r0, 0
- strh r0, [r1, 0x2]
- movs r0, 0x3F
- strh r0, [r1, 0x4]
- ldr r0, _080D16C8 @ =0x0000f0f1
- strh r0, [r1, 0x6]
- movs r0, 0xA0
- strh r0, [r1, 0x8]
- movs r1, 0
- ldr r3, _080D16CC @ =gScanlineEffectRegBuffers + 0x780
- ldr r2, _080D16D0 @ =0x0000f3f4
-_080D1696:
- 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 _080D1696
- ldr r0, _080D16D4 @ =VBCB_BT_Phase2ClockwiseBlackFade
- bl SetVBlankCallback
- ldr r0, _080D16C4 @ =sTransitionStructPtr
- ldr r1, [r0]
- movs r0, 0x78
- strh r0, [r1, 0x2C]
- ldrh r0, [r4, 0x8]
- adds r0, 0x1
- strh r0, [r4, 0x8]
- movs r0, 0x1
- pop {r4}
- pop {r1}
- bx r1
- .align 2, 0
-_080D16C4: .4byte sTransitionStructPtr
-_080D16C8: .4byte 0x0000f0f1
-_080D16CC: .4byte gScanlineEffectRegBuffers + 0x780
-_080D16D0: .4byte 0x0000f3f4
-_080D16D4: .4byte VBCB_BT_Phase2ClockwiseBlackFade
- thumb_func_end BT_Phase2ClockwiseBlackFade_Init
-
- thumb_func_start BT_Phase2ClockwiseBlackFade_Step1
-BT_Phase2ClockwiseBlackFade_Step1: @ 80D16D8
- push {r4-r7,lr}
- sub sp, 0xC
- adds r6, r0, 0
- ldr r2, _080D1760 @ =sTransitionStructPtr
- ldr r1, [r2]
- ldrb r0, [r1]
- movs r0, 0
- strb r0, [r1]
- ldr r1, [r2]
- adds r0, r1, 0
- adds r0, 0x24
- movs r2, 0x2C
- ldrsh r3, [r1, r2]
- movs r1, 0x1
- negs r1, r1
- str r1, [sp]
- movs r1, 0x1
- str r1, [sp, 0x4]
- str r1, [sp, 0x8]
- movs r1, 0x78
- movs r2, 0x50
- bl BT_DiagonalSegment_InitParams
- ldr r5, _080D1764 @ =gScanlineEffectRegBuffers
-_080D1708:
- ldr r4, _080D1760 @ =sTransitionStructPtr
- ldr r0, [r4]
- movs r7, 0x2A
- ldrsh r3, [r0, r7]
- lsls r3, 1
- adds r3, r5
- ldrh r1, [r0, 0x28]
- adds r1, 0x1
- movs r7, 0xF0
- lsls r7, 7
- adds r2, r7, 0
- orrs r1, r2
- strh r1, [r3]
- adds r0, 0x24
- movs r1, 0x1
- movs r2, 0x1
- bl BT_DiagonalSegment_ComputePointOnSegment
- lsls r0, 24
- cmp r0, 0
- beq _080D1708
- ldr r1, [r4]
- ldrh r0, [r1, 0x2C]
- adds r0, 0x20
- strh r0, [r1, 0x2C]
- lsls r0, 16
- asrs r0, 16
- cmp r0, 0xEF
- ble _080D174C
- movs r0, 0
- strh r0, [r1, 0x2E]
- ldrh r0, [r6, 0x8]
- adds r0, 0x1
- strh r0, [r6, 0x8]
-_080D174C:
- ldr r0, [r4]
- ldrb r1, [r0]
- adds r1, 0x1
- ldrb r2, [r0]
- strb r1, [r0]
- movs r0, 0
- add sp, 0xC
- pop {r4-r7}
- pop {r1}
- bx r1
- .align 2, 0
-_080D1760: .4byte sTransitionStructPtr
-_080D1764: .4byte gScanlineEffectRegBuffers
- thumb_func_end BT_Phase2ClockwiseBlackFade_Step1
-
- thumb_func_start BT_Phase2ClockwiseBlackFade_Step2
-BT_Phase2ClockwiseBlackFade_Step2: @ 80D1768
- push {r4-r7,lr}
- mov r7, r9
- mov r6, r8
- push {r6,r7}
- sub sp, 0x10
- mov r8, r0
- add r1, sp, 0xC
- movs r0, 0
- strb r0, [r1]
- ldr r4, _080D17EC @ =sTransitionStructPtr
- ldr r1, [r4]
- ldrb r0, [r1]
- movs r0, 0
- strb r0, [r1]
- ldr r1, [r4]
- adds r0, r1, 0
- adds r0, 0x24
- movs r2, 0x2E
- ldrsh r1, [r1, r2]
- str r1, [sp]
- movs r1, 0x1
- str r1, [sp, 0x4]
- str r1, [sp, 0x8]
- movs r1, 0x78
- movs r2, 0x50
- movs r3, 0xF0
- bl BT_DiagonalSegment_InitParams
- mov r9, r4
- mov r7, r9
- add r5, sp, 0xC
-_080D17A6:
- movs r1, 0x78
- ldr r3, [r7]
- ldrh r0, [r3, 0x28]
- adds r0, 0x1
- lsls r0, 16
- lsrs r4, r0, 16
- movs r2, 0x2E
- ldrsh r0, [r3, r2]
- cmp r0, 0x4F
- ble _080D17BE
- ldrh r1, [r3, 0x28]
- movs r4, 0xF0
-_080D17BE:
- ldr r6, _080D17F0 @ =gScanlineEffectRegBuffers
- movs r0, 0x2A
- ldrsh r2, [r3, r0]
- lsls r2, 1
- adds r2, r6
- lsls r1, 16
- asrs r1, 8
- lsls r0, r4, 16
- asrs r4, r0, 16
- orrs r4, r1
- strh r4, [r2]
- ldrb r0, [r5]
- cmp r0, 0
- bne _080D17F4
- adds r0, r3, 0
- adds r0, 0x24
- movs r1, 0x1
- movs r2, 0x1
- bl BT_DiagonalSegment_ComputePointOnSegment
- strb r0, [r5]
- b _080D17A6
- .align 2, 0
-_080D17EC: .4byte sTransitionStructPtr
-_080D17F0: .4byte gScanlineEffectRegBuffers
-_080D17F4:
- ldr r1, [r7]
- ldrh r0, [r1, 0x2E]
- adds r0, 0x10
- strh r0, [r1, 0x2E]
- lsls r0, 16
- asrs r2, r0, 16
- cmp r2, 0x9F
- ble _080D1812
- movs r0, 0xF0
- strh r0, [r1, 0x2C]
- mov r1, r8
- ldrh r0, [r1, 0x8]
- adds r0, 0x1
- strh r0, [r1, 0x8]
- b _080D183A
-_080D1812:
- movs r3, 0x2A
- ldrsh r0, [r1, r3]
- cmp r0, r2
- bge _080D183A
- adds r3, r4, 0
- ldr r5, _080D1858 @ =sTransitionStructPtr
-_080D181E:
- ldr r2, [r5]
- ldrh r0, [r2, 0x2A]
- adds r0, 0x1
- strh r0, [r2, 0x2A]
- lsls r0, 16
- asrs r0, 15
- adds r0, r6
- strh r3, [r0]
- movs r4, 0x2A
- ldrsh r1, [r2, r4]
- movs r4, 0x2E
- ldrsh r0, [r2, r4]
- cmp r1, r0
- blt _080D181E
-_080D183A:
- mov r1, r9
- ldr r0, [r1]
- ldrb r1, [r0]
- adds r1, 0x1
- ldrb r2, [r0]
- strb r1, [r0]
- movs r0, 0
- add sp, 0x10
- pop {r3,r4}
- mov r8, r3
- mov r9, r4
- pop {r4-r7}
- pop {r1}
- bx r1
- .align 2, 0
-_080D1858: .4byte sTransitionStructPtr
- thumb_func_end BT_Phase2ClockwiseBlackFade_Step2
-
- thumb_func_start BT_Phase2ClockwiseBlackFade_Step3
-BT_Phase2ClockwiseBlackFade_Step3: @ 80D185C
- push {r4-r6,lr}
- sub sp, 0xC
- adds r6, r0, 0
- ldr r2, _080D18DC @ =sTransitionStructPtr
- ldr r1, [r2]
- ldrb r0, [r1]
- movs r0, 0
- strb r0, [r1]
- ldr r1, [r2]
- adds r0, r1, 0
- adds r0, 0x24
- movs r2, 0x2C
- ldrsh r3, [r1, r2]
- movs r1, 0xA0
- str r1, [sp]
- movs r1, 0x1
- str r1, [sp, 0x4]
- str r1, [sp, 0x8]
- movs r1, 0x78
- movs r2, 0x50
- bl BT_DiagonalSegment_InitParams
- ldr r5, _080D18E0 @ =gScanlineEffectRegBuffers
-_080D188A:
- ldr r4, _080D18DC @ =sTransitionStructPtr
- ldr r0, [r4]
- movs r1, 0x2A
- ldrsh r3, [r0, r1]
- lsls r3, 1
- adds r3, r5
- ldrh r1, [r0, 0x28]
- lsls r1, 8
- movs r2, 0xF0
- orrs r1, r2
- strh r1, [r3]
- adds r0, 0x24
- movs r1, 0x1
- movs r2, 0x1
- bl BT_DiagonalSegment_ComputePointOnSegment
- lsls r0, 24
- cmp r0, 0
- beq _080D188A
- ldr r1, [r4]
- ldrh r0, [r1, 0x2C]
- subs r0, 0x20
- strh r0, [r1, 0x2C]
- lsls r0, 16
- cmp r0, 0
- bgt _080D18C8
- movs r0, 0xA0
- strh r0, [r1, 0x2E]
- ldrh r0, [r6, 0x8]
- adds r0, 0x1
- strh r0, [r6, 0x8]
-_080D18C8:
- ldr r0, [r4]
- ldrb r1, [r0]
- adds r1, 0x1
- ldrb r2, [r0]
- strb r1, [r0]
- movs r0, 0
- add sp, 0xC
- pop {r4-r6}
- pop {r1}
- bx r1
- .align 2, 0
-_080D18DC: .4byte sTransitionStructPtr
-_080D18E0: .4byte gScanlineEffectRegBuffers
- thumb_func_end BT_Phase2ClockwiseBlackFade_Step3
-
- thumb_func_start BT_Phase2ClockwiseBlackFade_Step4
-BT_Phase2ClockwiseBlackFade_Step4: @ 80D18E4
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- sub sp, 0x10
- mov r9, r0
- add r1, sp, 0xC
- movs r0, 0
- strb r0, [r1]
- ldr r4, _080D196C @ =sTransitionStructPtr
- ldr r1, [r4]
- ldrb r0, [r1]
- movs r0, 0
- strb r0, [r1]
- ldr r1, [r4]
- adds r0, r1, 0
- adds r0, 0x24
- movs r2, 0x2E
- ldrsh r1, [r1, r2]
- str r1, [sp]
- movs r1, 0x1
- str r1, [sp, 0x4]
- str r1, [sp, 0x8]
- movs r1, 0x78
- movs r2, 0x50
- movs r3, 0
- bl BT_DiagonalSegment_InitParams
- ldr r7, _080D1970 @ =gScanlineEffectRegBuffers
- mov r10, r7
- ldr r0, _080D196C @ =sTransitionStructPtr
- mov r8, r0
- add r6, sp, 0xC
-_080D1928:
- mov r1, r8
- ldr r4, [r1]
- movs r2, 0x2A
- ldrsh r0, [r4, r2]
- lsls r0, 1
- mov r7, r10
- adds r5, r0, r7
- ldrb r1, [r5]
- ldrh r2, [r4, 0x28]
- adds r3, r2, 0
- movs r7, 0x2E
- ldrsh r0, [r4, r7]
- cmp r0, 0x50
- bgt _080D1948
- movs r2, 0x78
- adds r1, r3, 0
-_080D1948:
- lsls r0, r2, 16
- asrs r0, 8
- lsls r1, 16
- asrs r1, 16
- orrs r1, r0
- movs r7, 0
- strh r1, [r5]
- ldrb r0, [r6]
- cmp r0, 0
- bne _080D1974
- adds r0, r4, 0
- adds r0, 0x24
- movs r1, 0x1
- movs r2, 0x1
- bl BT_DiagonalSegment_ComputePointOnSegment
- strb r0, [r6]
- b _080D1928
- .align 2, 0
-_080D196C: .4byte sTransitionStructPtr
-_080D1970: .4byte gScanlineEffectRegBuffers
-_080D1974:
- mov r0, r8
- ldr r2, [r0]
- ldrh r0, [r2, 0x2E]
- subs r0, 0x10
- strh r0, [r2, 0x2E]
- lsls r0, 16
- asrs r3, r0, 16
- cmp r3, 0
- bgt _080D1992
- strh r7, [r2, 0x2C]
- mov r1, r9
- ldrh r0, [r1, 0x8]
- adds r0, 0x1
- strh r0, [r1, 0x8]
- b _080D19BC
-_080D1992:
- movs r4, 0x2A
- ldrsh r0, [r2, r4]
- cmp r0, r3
- ble _080D19BC
- ldr r6, _080D19DC @ =gScanlineEffectRegBuffers
- adds r3, r1, 0
- ldr r5, _080D19E0 @ =sTransitionStructPtr
-_080D19A0:
- ldr r2, [r5]
- ldrh r0, [r2, 0x2A]
- subs r0, 0x1
- strh r0, [r2, 0x2A]
- lsls r0, 16
- asrs r0, 15
- adds r0, r6
- strh r3, [r0]
- movs r7, 0x2A
- ldrsh r1, [r2, r7]
- movs r4, 0x2E
- ldrsh r0, [r2, r4]
- cmp r1, r0
- bgt _080D19A0
-_080D19BC:
- ldr r7, _080D19E0 @ =sTransitionStructPtr
- ldr r0, [r7]
- ldrb r1, [r0]
- adds r1, 0x1
- ldrb r2, [r0]
- strb r1, [r0]
- movs r0, 0
- add sp, 0x10
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r1}
- bx r1
- .align 2, 0
-_080D19DC: .4byte gScanlineEffectRegBuffers
-_080D19E0: .4byte sTransitionStructPtr
- thumb_func_end BT_Phase2ClockwiseBlackFade_Step4
-
- thumb_func_start BT_Phase2ClockwiseBlackFade_Step5
-BT_Phase2ClockwiseBlackFade_Step5: @ 80D19E4
- push {r4-r7,lr}
- sub sp, 0xC
- adds r7, r0, 0
- ldr r1, _080D1A74 @ =sTransitionStructPtr
- ldr r0, [r1]
- ldrb r2, [r0]
- movs r2, 0
- strb r2, [r0]
- ldr r1, [r1]
- adds r0, r1, 0
- adds r0, 0x24
- movs r4, 0x2C
- ldrsh r3, [r1, r4]
- str r2, [sp]
- movs r1, 0x1
- str r1, [sp, 0x4]
- str r1, [sp, 0x8]
- movs r1, 0x78
- movs r2, 0x50
- bl BT_DiagonalSegment_InitParams
- ldr r6, _080D1A78 @ =gScanlineEffectRegBuffers
-_080D1A10:
- movs r2, 0x78
- ldr r5, _080D1A74 @ =sTransitionStructPtr
- ldr r3, [r5]
- ldrh r4, [r3, 0x28]
- movs r1, 0x28
- ldrsh r0, [r3, r1]
- cmp r0, 0x77
- ble _080D1A24
- movs r2, 0
- movs r4, 0xF0
-_080D1A24:
- movs r0, 0x2A
- ldrsh r1, [r3, r0]
- lsls r1, 1
- adds r1, r6
- lsls r2, 8
- lsls r0, r4, 16
- asrs r0, 16
- orrs r0, r2
- strh r0, [r1]
- adds r0, r3, 0
- adds r0, 0x24
- movs r1, 0x1
- movs r2, 0x1
- bl BT_DiagonalSegment_ComputePointOnSegment
- lsls r0, 24
- cmp r0, 0
- beq _080D1A10
- ldr r0, [r5]
- ldrh r1, [r0, 0x2C]
- adds r1, 0x20
- strh r1, [r0, 0x2C]
- movs r1, 0x28
- ldrsh r0, [r0, r1]
- cmp r0, 0x78
- ble _080D1A5E
- ldrh r0, [r7, 0x8]
- adds r0, 0x1
- strh r0, [r7, 0x8]
-_080D1A5E:
- ldr r0, [r5]
- ldrb r1, [r0]
- adds r1, 0x1
- ldrb r2, [r0]
- strb r1, [r0]
- movs r0, 0
- add sp, 0xC
- pop {r4-r7}
- pop {r1}
- bx r1
- .align 2, 0
-_080D1A74: .4byte sTransitionStructPtr
-_080D1A78: .4byte gScanlineEffectRegBuffers
- thumb_func_end BT_Phase2ClockwiseBlackFade_Step5
-
- thumb_func_start BT_Phase2ClockwiseBlackFade_End
-BT_Phase2ClockwiseBlackFade_End: @ 80D1A7C
- push {lr}
- ldr r1, _080D1AAC @ =0x040000b0
- ldrh r2, [r1, 0xA]
- ldr r0, _080D1AB0 @ =0x0000c5ff
- ands r0, r2
- strh r0, [r1, 0xA]
- ldrh r2, [r1, 0xA]
- ldr r0, _080D1AB4 @ =0x00007fff
- ands r0, r2
- strh r0, [r1, 0xA]
- ldrh r0, [r1, 0xA]
- bl BT_BlendPalettesToBlack
- ldr r0, _080D1AB8 @ =BT_Phase2ClockwiseBlackFade
- bl FindTaskIdByFunc
- lsls r0, 24
- lsrs r0, 24
- bl DestroyTask
- movs r0, 0
- pop {r1}
- bx r1
- .align 2, 0
-_080D1AAC: .4byte 0x040000b0
-_080D1AB0: .4byte 0x0000c5ff
-_080D1AB4: .4byte 0x00007fff
-_080D1AB8: .4byte BT_Phase2ClockwiseBlackFade
- thumb_func_end BT_Phase2ClockwiseBlackFade_End
-
- thumb_func_start VBCB_BT_Phase2ClockwiseBlackFade
-VBCB_BT_Phase2ClockwiseBlackFade: @ 80D1ABC
- push {r4,r5,lr}
- ldr r5, _080D1B34 @ =0x040000b0
- ldrh r1, [r5, 0xA]
- ldr r0, _080D1B38 @ =0x0000c5ff
- ands r0, r1
- strh r0, [r5, 0xA]
- ldrh r1, [r5, 0xA]
- ldr r0, _080D1B3C @ =0x00007fff
- ands r0, r1
- strh r0, [r5, 0xA]
- ldrh r0, [r5, 0xA]
- bl BT_VBSyncOamAndPltt
- ldr r4, _080D1B40 @ =sTransitionStructPtr
- ldr r0, [r4]
- ldrb r0, [r0]
- cmp r0, 0
- beq _080D1AF4
- ldr r1, _080D1B44 @ =0x040000d4
- ldr r0, _080D1B48 @ =gScanlineEffectRegBuffers
- str r0, [r1]
- movs r2, 0xF0
- lsls r2, 3
- adds r0, r2
- str r0, [r1, 0x4]
- ldr r0, _080D1B4C @ =0x800000a0
- str r0, [r1, 0x8]
- ldr r0, [r1, 0x8]
-_080D1AF4:
- ldr r0, [r4]
- ldrh r1, [r0, 0x2]
- movs r0, 0x48
- bl SetGpuReg
- ldr r0, [r4]
- ldrh r1, [r0, 0x4]
- movs r0, 0x4A
- bl SetGpuReg
- ldr r0, [r4]
- ldrh r1, [r0, 0x8]
- movs r0, 0x44
- bl SetGpuReg
- ldr r4, _080D1B48 @ =gScanlineEffectRegBuffers
- movs r0, 0xF0
- lsls r0, 3
- adds r4, r0
- ldrh r1, [r4]
- movs r0, 0x40
- bl SetGpuReg
- str r4, [r5]
- ldr r0, _080D1B50 @ =0x04000040
- str r0, [r5, 0x4]
- ldr r0, _080D1B54 @ =0xa2400001
- str r0, [r5, 0x8]
- ldr r0, [r5, 0x8]
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_080D1B34: .4byte 0x040000b0
-_080D1B38: .4byte 0x0000c5ff
-_080D1B3C: .4byte 0x00007fff
-_080D1B40: .4byte sTransitionStructPtr
-_080D1B44: .4byte 0x040000d4
-_080D1B48: .4byte gScanlineEffectRegBuffers
-_080D1B4C: .4byte 0x800000a0
-_080D1B50: .4byte 0x04000040
-_080D1B54: .4byte 0xa2400001
- thumb_func_end VBCB_BT_Phase2ClockwiseBlackFade
-
- thumb_func_start BT_Phase2FullScreenWave
-BT_Phase2FullScreenWave: @ 80D1B58
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r0, 24
- ldr r5, _080D1B88 @ =sBT_Phase2FullScreenWaveFuncs
- ldr r2, _080D1B8C @ =gTasks
- lsls r1, r0, 2
- adds r1, r0
- lsls r1, 3
- adds r4, r1, r2
-_080D1B6A:
- 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 _080D1B6A
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_080D1B88: .4byte sBT_Phase2FullScreenWaveFuncs
-_080D1B8C: .4byte gTasks
- thumb_func_end BT_Phase2FullScreenWave
-
- thumb_func_start BT_Phase2FullScreenWave_Init
-BT_Phase2FullScreenWave_Init: @ 80D1B90
- push {r4,r5,lr}
- adds r5, r0, 0
- bl BT_InitCtrlBlk
- bl ScanlineEffect_Clear
- movs r2, 0
- ldr r4, _080D1BD8 @ =gScanlineEffectRegBuffers + 0x780
- ldr r3, _080D1BDC @ =sTransitionStructPtr
-_080D1BA2:
- lsls r1, r2, 1
- adds r1, r4
- ldr r0, [r3]
- ldrh r0, [r0, 0x16]
- strh r0, [r1]
- adds r0, r2, 0x1
- lsls r0, 24
- lsrs r2, r0, 24
- cmp r2, 0x9F
- bls _080D1BA2
- ldr r0, _080D1BE0 @ =VBCB_BT_Phase2FullScreenWave
- bl SetVBlankCallback
- ldr r0, _080D1BE4 @ =HBCB_BT_Phase2FullScreenWave
- bl SetHBlankCallback
- movs r0, 0x2
- bl EnableInterrupts
- ldrh r0, [r5, 0x8]
- adds r0, 0x1
- strh r0, [r5, 0x8]
- movs r0, 0x1
- pop {r4,r5}
- pop {r1}
- bx r1
- .align 2, 0
-_080D1BD8: .4byte gScanlineEffectRegBuffers + 0x780
-_080D1BDC: .4byte sTransitionStructPtr
-_080D1BE0: .4byte VBCB_BT_Phase2FullScreenWave
-_080D1BE4: .4byte HBCB_BT_Phase2FullScreenWave
- thumb_func_end BT_Phase2FullScreenWave_Init
-
- thumb_func_start BT_Phase2FullScreenWave_UpdateWave
-BT_Phase2FullScreenWave_UpdateWave: @ 80D1BE8
- push {r4-r7,lr}
- mov r7, r8
- push {r7}
- sub sp, 0x4
- adds r6, r0, 0
- ldr r0, _080D1CB4 @ =sTransitionStructPtr
- ldr r1, [r0]
- ldrb r0, [r1]
- movs r0, 0
- strb r0, [r1]
- ldrh r2, [r6, 0xC]
- lsls r1, r2, 16
- asrs r0, r1, 24
- lsls r0, 16
- lsrs r3, r0, 16
- ldrh r4, [r6, 0xA]
- movs r0, 0xC0
- lsls r0, 1
- mov r8, r0
- movs r5, 0x80
- lsls r5, 3
- adds r0, r4, r5
- strh r0, [r6, 0xA]
- ldr r0, _080D1CB8 @ =0x1fff0000
- cmp r1, r0
- bgt _080D1C24
- movs r1, 0xC0
- lsls r1, 1
- adds r0, r2, r1
- strh r0, [r6, 0xC]
-_080D1C24:
- movs r5, 0
- lsls r7, r3, 16
-_080D1C28:
- lsrs r0, r4, 8
- asrs r1, r7, 16
- bl Sin
- ldr r1, _080D1CBC @ =gScanlineEffectRegBuffers
- lsls r2, r5, 1
- adds r2, r1
- ldr r1, _080D1CB4 @ =sTransitionStructPtr
- ldr r1, [r1]
- ldrh r1, [r1, 0x16]
- adds r0, r1
- strh r0, [r2]
- adds r0, r5, 0x1
- lsls r0, 24
- lsrs r5, r0, 24
- mov r1, r8
- adds r0, r4, r1
- lsls r0, 16
- lsrs r4, r0, 16
- cmp r5, 0x9F
- bls _080D1C28
- ldrh r0, [r6, 0xE]
- adds r0, 0x1
- strh r0, [r6, 0xE]
- lsls r0, 16
- asrs r0, 16
- cmp r0, 0x29
- bne _080D1C78
- ldrh r0, [r6, 0x10]
- adds r0, 0x1
- strh r0, [r6, 0x10]
- movs r0, 0x1
- negs r0, r0
- movs r1, 0x8
- negs r1, r1
- movs r2, 0
- str r2, [sp]
- movs r3, 0x10
- bl BeginNormalPaletteFade
-_080D1C78:
- movs r5, 0x10
- ldrsh r0, [r6, r5]
- cmp r0, 0
- beq _080D1C9A
- ldr r0, _080D1CC0 @ =gPaletteFade
- ldrb r1, [r0, 0x7]
- movs r0, 0x80
- ands r0, r1
- cmp r0, 0
- bne _080D1C9A
- ldr r0, _080D1CC4 @ =BT_Phase2FullScreenWave
- bl FindTaskIdByFunc
- lsls r0, 24
- lsrs r0, 24
- bl DestroyTask
-_080D1C9A:
- ldr r0, _080D1CB4 @ =sTransitionStructPtr
- ldr r1, [r0]
- ldrb r0, [r1]
- adds r0, 0x1
- ldrb r2, [r1]
- strb r0, [r1]
- movs r0, 0
- add sp, 0x4
- pop {r3}
- mov r8, r3
- pop {r4-r7}
- pop {r1}
- bx r1
- .align 2, 0
-_080D1CB4: .4byte sTransitionStructPtr
-_080D1CB8: .4byte 0x1fff0000
-_080D1CBC: .4byte gScanlineEffectRegBuffers
-_080D1CC0: .4byte gPaletteFade
-_080D1CC4: .4byte BT_Phase2FullScreenWave
- thumb_func_end BT_Phase2FullScreenWave_UpdateWave
-
- thumb_func_start VBCB_BT_Phase2FullScreenWave
-VBCB_BT_Phase2FullScreenWave: @ 80D1CC8
- push {lr}
- bl BT_VBSyncOamAndPltt
- ldr r0, _080D1CF0 @ =sTransitionStructPtr
- ldr r0, [r0]
- ldrb r0, [r0]
- cmp r0, 0
- beq _080D1CEC
- ldr r1, _080D1CF4 @ =0x040000d4
- ldr r0, _080D1CF8 @ =gScanlineEffectRegBuffers
- str r0, [r1]
- movs r2, 0xF0
- lsls r2, 3
- adds r0, r2
- str r0, [r1, 0x4]
- ldr r0, _080D1CFC @ =0x800000a0
- str r0, [r1, 0x8]
- ldr r0, [r1, 0x8]
-_080D1CEC:
- pop {r0}
- bx r0
- .align 2, 0
-_080D1CF0: .4byte sTransitionStructPtr
-_080D1CF4: .4byte 0x040000d4
-_080D1CF8: .4byte gScanlineEffectRegBuffers
-_080D1CFC: .4byte 0x800000a0
- thumb_func_end VBCB_BT_Phase2FullScreenWave
-
- thumb_func_start HBCB_BT_Phase2FullScreenWave
-HBCB_BT_Phase2FullScreenWave: @ 80D1D00
- ldr r1, _080D1D20 @ =gScanlineEffectRegBuffers
- ldr r0, _080D1D24 @ =0x04000006
- ldrh r0, [r0]
- lsls r0, 1
- movs r2, 0xF0
- lsls r2, 3
- adds r1, r2
- adds r0, r1
- ldrh r1, [r0]
- ldr r0, _080D1D28 @ =0x04000016
- strh r1, [r0]
- adds r0, 0x4
- strh r1, [r0]
- adds r0, 0x4
- strh r1, [r0]
- bx lr
- .align 2, 0
-_080D1D20: .4byte gScanlineEffectRegBuffers
-_080D1D24: .4byte 0x04000006
-_080D1D28: .4byte 0x04000016
- thumb_func_end HBCB_BT_Phase2FullScreenWave
-
- thumb_func_start BT_Phase2BlackWaveToRight
-BT_Phase2BlackWaveToRight: @ 80D1D2C
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r0, 24
- ldr r5, _080D1D5C @ =sBT_Phase2BlackWaveToRightFuncs
- ldr r2, _080D1D60 @ =gTasks
- lsls r1, r0, 2
- adds r1, r0
- lsls r1, 3
- adds r4, r1, r2
-_080D1D3E:
- 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 _080D1D3E
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_080D1D5C: .4byte sBT_Phase2BlackWaveToRightFuncs
-_080D1D60: .4byte gTasks
- thumb_func_end BT_Phase2BlackWaveToRight
-
- thumb_func_start BT_Phase2BlackWaveToRight_Init
-BT_Phase2BlackWaveToRight_Init: @ 80D1D64
- push {r4,lr}
- adds r4, r0, 0
- bl BT_InitCtrlBlk
- bl ScanlineEffect_Clear
- ldr r0, _080D1DB0 @ =sTransitionStructPtr
- ldr r1, [r0]
- movs r2, 0
- movs r0, 0x3F
- strh r0, [r1, 0x2]
- strh r2, [r1, 0x4]
- movs r0, 0xF0
- strh r0, [r1, 0x6]
- movs r0, 0xA0
- strh r0, [r1, 0x8]
- movs r1, 0
- ldr r3, _080D1DB4 @ =gScanlineEffectRegBuffers + 0x780
- movs r2, 0xF2
-_080D1D8A:
- lsls r0, r1, 1
- adds r0, r3
- strh r2, [r0]
- adds r0, r1, 0x1
- lsls r0, 24
- lsrs r1, r0, 24
- cmp r1, 0x9F
- bls _080D1D8A
- ldr r0, _080D1DB8 @ =VBCB_BT_Phase2BlackWaveToRight
- bl SetVBlankCallback
- ldrh r0, [r4, 0x8]
- adds r0, 0x1
- strh r0, [r4, 0x8]
- movs r0, 0x1
- pop {r4}
- pop {r1}
- bx r1
- .align 2, 0
-_080D1DB0: .4byte sTransitionStructPtr
-_080D1DB4: .4byte gScanlineEffectRegBuffers + 0x780
-_080D1DB8: .4byte VBCB_BT_Phase2BlackWaveToRight
- thumb_func_end BT_Phase2BlackWaveToRight_Init
-
- thumb_func_start BT_Phase2BlackWaveToRight_UpdateWave
-BT_Phase2BlackWaveToRight_UpdateWave: @ 80D1DBC
- push {r4-r7,lr}
- mov r7, r8
- push {r7}
- adds r4, r0, 0
- ldr r0, _080D1E50 @ =sTransitionStructPtr
- ldr r1, [r0]
- ldrb r0, [r1]
- movs r0, 0
- strb r0, [r1]
- ldr r7, _080D1E54 @ =gScanlineEffectRegBuffers
- ldrh r0, [r4, 0xC]
- ldrb r5, [r4, 0xC]
- adds r0, 0x10
- strh r0, [r4, 0xC]
- ldrh r0, [r4, 0xA]
- adds r0, 0x8
- strh r0, [r4, 0xA]
- movs r6, 0
- movs r0, 0x1
- mov r8, r0
-_080D1DE4:
- adds r0, r5, 0
- movs r1, 0x28
- bl Sin
- ldrh r1, [r4, 0xA]
- adds r0, r1
- lsls r0, 16
- lsrs r1, r0, 16
- cmp r0, 0
- bge _080D1DFA
- movs r1, 0
-_080D1DFA:
- lsls r0, r1, 16
- asrs r0, 16
- cmp r0, 0xF0
- ble _080D1E04
- movs r1, 0xF0
-_080D1E04:
- lsls r0, r1, 16
- asrs r0, 16
- lsls r1, r0, 8
- movs r2, 0xF1
- orrs r1, r2
- strh r1, [r7]
- cmp r0, 0xEF
- bgt _080D1E18
- movs r0, 0
- mov r8, r0
-_080D1E18:
- adds r0, r6, 0x1
- lsls r0, 24
- lsrs r6, r0, 24
- adds r0, r5, 0x4
- lsls r0, 24
- lsrs r5, r0, 24
- adds r7, 0x2
- cmp r6, 0x9F
- bls _080D1DE4
- mov r1, r8
- cmp r1, 0
- beq _080D1E36
- ldrh r0, [r4, 0x8]
- adds r0, 0x1
- strh r0, [r4, 0x8]
-_080D1E36:
- ldr r0, _080D1E50 @ =sTransitionStructPtr
- ldr r1, [r0]
- ldrb r0, [r1]
- adds r0, 0x1
- ldrb r2, [r1]
- strb r0, [r1]
- movs r0, 0
- pop {r3}
- mov r8, r3
- pop {r4-r7}
- pop {r1}
- bx r1
- .align 2, 0
-_080D1E50: .4byte sTransitionStructPtr
-_080D1E54: .4byte gScanlineEffectRegBuffers
- thumb_func_end BT_Phase2BlackWaveToRight_UpdateWave
-
- thumb_func_start BT_Phase2BlackWaveToRight_End
-BT_Phase2BlackWaveToRight_End: @ 80D1E58
- push {lr}
- ldr r1, _080D1E88 @ =0x040000b0
- ldrh r2, [r1, 0xA]
- ldr r0, _080D1E8C @ =0x0000c5ff
- ands r0, r2
- strh r0, [r1, 0xA]
- ldrh r2, [r1, 0xA]
- ldr r0, _080D1E90 @ =0x00007fff
- ands r0, r2
- strh r0, [r1, 0xA]
- ldrh r0, [r1, 0xA]
- bl BT_BlendPalettesToBlack
- ldr r0, _080D1E94 @ =BT_Phase2BlackWaveToRight
- bl FindTaskIdByFunc
- lsls r0, 24
- lsrs r0, 24
- bl DestroyTask
- movs r0, 0
- pop {r1}
- bx r1
- .align 2, 0
-_080D1E88: .4byte 0x040000b0
-_080D1E8C: .4byte 0x0000c5ff
-_080D1E90: .4byte 0x00007fff
-_080D1E94: .4byte BT_Phase2BlackWaveToRight
- thumb_func_end BT_Phase2BlackWaveToRight_End
-
- thumb_func_start VBCB_BT_Phase2BlackWaveToRight
-VBCB_BT_Phase2BlackWaveToRight: @ 80D1E98
- push {r4,r5,lr}
- ldr r4, _080D1F04 @ =0x040000b0
- ldrh r1, [r4, 0xA]
- ldr r0, _080D1F08 @ =0x0000c5ff
- ands r0, r1
- strh r0, [r4, 0xA]
- ldrh r1, [r4, 0xA]
- ldr r0, _080D1F0C @ =0x00007fff
- ands r0, r1
- strh r0, [r4, 0xA]
- ldrh r0, [r4, 0xA]
- bl BT_VBSyncOamAndPltt
- ldr r5, _080D1F10 @ =sTransitionStructPtr
- ldr r0, [r5]
- ldrb r0, [r0]
- cmp r0, 0
- beq _080D1ED0
- ldr r1, _080D1F14 @ =0x040000d4
- ldr r0, _080D1F18 @ =gScanlineEffectRegBuffers
- str r0, [r1]
- movs r2, 0xF0
- lsls r2, 3
- adds r0, r2
- str r0, [r1, 0x4]
- ldr r0, _080D1F1C @ =0x800000a0
- str r0, [r1, 0x8]
- ldr r0, [r1, 0x8]
-_080D1ED0:
- ldr r0, [r5]
- ldrh r1, [r0, 0x2]
- movs r0, 0x48
- bl SetGpuReg
- ldr r0, [r5]
- ldrh r1, [r0, 0x4]
- movs r0, 0x4A
- bl SetGpuReg
- ldr r0, [r5]
- ldrh r1, [r0, 0x8]
- movs r0, 0x44
- bl SetGpuReg
- ldr r0, _080D1F20 @ =gScanlineEffectRegBuffers + 0x780
- str r0, [r4]
- ldr r0, _080D1F24 @ =0x04000040
- str r0, [r4, 0x4]
- ldr r0, _080D1F28 @ =0xa2400001
- str r0, [r4, 0x8]
- ldr r0, [r4, 0x8]
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_080D1F04: .4byte 0x040000b0
-_080D1F08: .4byte 0x0000c5ff
-_080D1F0C: .4byte 0x00007fff
-_080D1F10: .4byte sTransitionStructPtr
-_080D1F14: .4byte 0x040000d4
-_080D1F18: .4byte gScanlineEffectRegBuffers
-_080D1F1C: .4byte 0x800000a0
-_080D1F20: .4byte gScanlineEffectRegBuffers + 0x780
-_080D1F24: .4byte 0x04000040
-_080D1F28: .4byte 0xa2400001
- thumb_func_end VBCB_BT_Phase2BlackWaveToRight
-
- thumb_func_start BT_Phase2AntiClockwiseSpiral
-BT_Phase2AntiClockwiseSpiral: @ 80D1F2C
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r0, 24
- ldr r5, _080D1F5C @ =sBT_Phase2AntiClockwiseSpiralFuncs
- ldr r2, _080D1F60 @ =gTasks
- lsls r1, r0, 2
- adds r1, r0
- lsls r1, 3
- adds r4, r1, r2
-_080D1F3E:
- 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 _080D1F3E
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_080D1F5C: .4byte sBT_Phase2AntiClockwiseSpiralFuncs
-_080D1F60: .4byte gTasks
- thumb_func_end BT_Phase2AntiClockwiseSpiral
-
thumb_func_start sub_80D1F64
sub_80D1F64: @ 80D1F64
push {r4-r7,lr}
diff --git a/include/field_effect.h b/include/field_effect.h
index 426f77510..47f35fe86 100644
--- a/include/field_effect.h
+++ b/include/field_effect.h
@@ -83,5 +83,6 @@ void sub_80B69DC(void);
void CreateTeleportFieldEffectTask(void);
void FieldEffectActiveListRemove(u8 id);
void sub_8085620(void);
+void FieldEffectStop(struct Sprite *sprite, u8 id);
#endif //GUARD_FIELD_EFFECTS_H
diff --git a/src/battle_transition.c b/src/battle_transition.c
index 27354292c..311563a95 100644
--- a/src/battle_transition.c
+++ b/src/battle_transition.c
@@ -5,8 +5,10 @@
#include "malloc.h"
#include "palette.h"
#include "trig.h"
+#include "random.h"
#include "gpu_regs.h"
#include "battle_transition.h"
+#include "field_effect.h"
#include "field_weather.h"
#include "scanline_effect.h"
@@ -47,7 +49,7 @@ struct __attribute__((packed)) BlackDoodleSegment
EWRAM_DATA struct TransitionData *sTransitionStructPtr = NULL;
-// TODO: move this declaration to include/event_object_movement.h
+// TODO: Move this declaration to include/event_object_movement.h
extern const struct OamData gEventObjectBaseOam_32x32;
bool8 BT_Phase1_FadeOut(struct Task *task);
@@ -148,6 +150,10 @@ void HBCB_BT_Phase2HorizontalCorrugate(void);
void VBCB_BT_Phase2BigPokeball1(void);
void VBCB_BT_Phase2BigPokeball2(void);
void HBCB_BT_Phase2BigPokeball(void);
+void VBCB_BT_Phase2ClockwiseBlackFade(void);
+void VBCB_BT_Phase2FullScreenWave(void);
+void HBCB_BT_Phase2FullScreenWave(void);
+void VBCB_BT_Phase2BlackWaveToRight(void);
void BT_LaunchTask(u8 transitionId);
void BT_TaskMain(u8 taskId);
@@ -157,7 +163,10 @@ 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);
-
+void BT_GenerateCircle(s16 *buffer, s16 x, s16 y, s16 radius);
+void BT_BlendPalettesToBlack(void);
+void BT_DiagonalSegment_InitParams(s16 *buffer, s16 startPtX, s16 startPtY, s16 endPtX, s16 endPtY, s16 stepX, s16 stepY);
+bool8 BT_DiagonalSegment_ComputePointOnSegment(s16 *data, bool8 checkBoundary1, bool8 checkBoundary2);
const u32 sBigPokeballTileset[] = INCBIN_U32("graphics/battle_transitions/big_pokeball_tileset.4bpp");
const u32 sSlidingPokeballTilemap[] = INCBIN_U32("graphics/battle_transitions/sliding_pokeball_tilemap.bin");
@@ -826,7 +835,7 @@ bool8 BT_Phase2HorizontalCorrugate_UpdateWave(struct Task *task)
amplitude = task->tAmplitude >> 8;
task->tTheta += 4224;
task->tAmplitude += 384;
- for (i = 0; i < 160; i++, theta += 4224)
+ for (i = 0; i < 160; ++i, theta += 4224)
gScanlineEffectRegBuffers[0][i] = sTransitionStructPtr->bg123VOfs + Sin(theta / 256, amplitude);
if (!gPaletteFade.active)
DestroyTask(FindTaskIdByFunc(BT_Phase2HorizontalCorrugate));
@@ -950,6 +959,14 @@ bool8 BT_Phase2BigPokeball_UpdateWave2DecEvb(struct Task *task)
return FALSE;
}
+#undef tEvb
+#undef tEva
+#undef tInterval
+
+#define tRadius data[1]
+#define tDeltaRadius data[2]
+#define tKeepVBCB data[3]
+
bool8 BT_Phase2BigPokeball_UpdateWave3(struct Task *task)
{
sTransitionStructPtr->vblankDma = FALSE;
@@ -966,12 +983,543 @@ bool8 BT_Phase2BigPokeball_UpdateWave3(struct Task *task)
if (task->tAmplitude <= 0)
{
++task->tState;
- task->tEvb = 160;
- task->tEva = 256;
- task->tInterval = 0;
+ task->tRadius = 160;
+ task->tDeltaRadius = 256;
+ task->tKeepVBCB = 0;
+ }
+ ++sTransitionStructPtr->vblankDma;
+ return FALSE;
+}
+
+bool8 BT_Phase2BigPokeball_CircleEffect(struct Task *task)
+{
+ sTransitionStructPtr->vblankDma = FALSE;
+ if (task->tDeltaRadius < 2048)
+ task->tDeltaRadius += 256;
+ if (task->tRadius != 0)
+ {
+ task->tRadius -= (task->tDeltaRadius >> 8);
+ if (task->tRadius < 0)
+ task->tRadius = 0;
+ }
+ BT_GenerateCircle(gScanlineEffectRegBuffers[0], 120, 80, task->tRadius);
+ if (task->tRadius == 0)
+ {
+ DmaStop(0);
+ BT_BlendPalettesToBlack();
+ DestroyTask(FindTaskIdByFunc(BT_Phase2BigPokeball));
+ }
+ if (task->tKeepVBCB == 0)
+ {
+ ++task->tKeepVBCB;
+ SetVBlankCallback(VBCB_BT_Phase2BigPokeball2);
+ }
+ ++sTransitionStructPtr->vblankDma;
+ return FALSE;
+}
+
+void BT_VBStopDma0SyncSrcBufferSetLcdRegs(void)
+{
+ DmaStop(0);
+ BT_VBSyncOamAndPltt();
+ if (sTransitionStructPtr->vblankDma)
+ DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320);
+ SetGpuReg(REG_OFFSET_WININ, sTransitionStructPtr->winIn);
+ SetGpuReg(REG_OFFSET_WINOUT, sTransitionStructPtr->winOut);
+ SetGpuReg(REG_OFFSET_WIN0V, sTransitionStructPtr->win0V);
+ SetGpuReg(REG_OFFSET_BLDCNT, sTransitionStructPtr->bldCnt);
+ SetGpuReg(REG_OFFSET_BLDALPHA, sTransitionStructPtr->bldAlpha);
+}
+
+void VBCB_BT_Phase2BigPokeball1(void)
+{
+ BT_VBStopDma0SyncSrcBufferSetLcdRegs();
+ DmaSet(0, gScanlineEffectRegBuffers[1], &REG_BG0HOFS, ((DMA_ENABLE | DMA_START_HBLANK | DMA_REPEAT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 1);
+}
+
+void VBCB_BT_Phase2BigPokeball2(void)
+{
+ BT_VBStopDma0SyncSrcBufferSetLcdRegs();
+ DmaSet(0, gScanlineEffectRegBuffers[1], &REG_WIN0H, ((DMA_ENABLE | DMA_START_HBLANK | DMA_REPEAT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 1);
+}
+
+#undef tRadius
+#undef tDeltaRadius
+#undef tKeepVBCB
+#undef tTheta
+#undef tAmplitude
+
+// TODO: Document this effect after knowing more about field effects.
+void BT_Phase2SlidingPokeballs(u8 taskId)
+{
+ while (sBT_Phase2SlidingPokeballsFuncs[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+bool8 BT_Phase2SlidingPokeballs_LoadBgGfx(struct Task *task)
+{
+ u16 *tilemapAddr, *tilesetAddr;
+
+ BT_GetBg0TilemapAndTilesetBase(&tilemapAddr, &tilesetAddr);
+ CpuSet(sSlidingPokeballTilemap, tilesetAddr, 0x20);
+ CpuFill32(0, tilemapAddr, 0x800);
+ LoadPalette(sSlidingPokeballBigPokeballPalette, 0xF0, 0x20);
+ ++task->tState;
+ return FALSE;
+}
+
+bool8 BT_Phase2SlidingPokeballs_SetupFldeffArgs(struct Task *task)
+{
+ s16 i, rand;
+ s16 arr0[NELEMS(gUnknown_83FA400)];
+ s16 arr1[NELEMS(gUnknown_83FA404)];
+
+ memcpy(arr0, gUnknown_83FA400, sizeof(gUnknown_83FA400));
+ memcpy(arr1, gUnknown_83FA404, sizeof(gUnknown_83FA404));
+ rand = Random() & 1;
+ for (i = 0; i <= 4; ++i, rand ^= 1)
+ {
+ gFieldEffectArguments[0] = arr0[rand]; // x
+ gFieldEffectArguments[1] = (i * 32) + 16; // y
+ gFieldEffectArguments[2] = rand;
+ gFieldEffectArguments[3] = arr1[i];
+ FieldEffectStart(FLDEFF_POKEBALL);
+ }
+ ++task->tState;
+ return FALSE;
+}
+
+bool8 BT_Phase2SlidingPokeballs_IsDone(struct Task *task)
+{
+ if (!FieldEffectActiveListContains(FLDEFF_POKEBALL))
+ {
+ BT_BlendPalettesToBlack();
+ DestroyTask(FindTaskIdByFunc(BT_Phase2SlidingPokeballs));
+ }
+ return FALSE;
+}
+
+bool8 FldEff_Pokeball(void)
+{
+ u8 spriteId = CreateSpriteAtEnd(&sSpriteTemplate_SlidingPokeball, gFieldEffectArguments[0], gFieldEffectArguments[1], 0);
+
+ gSprites[spriteId].oam.priority = 0;
+ gSprites[spriteId].oam.affineMode = 1;
+ gSprites[spriteId].data[0] = gFieldEffectArguments[2];
+ gSprites[spriteId].data[1] = gFieldEffectArguments[3];
+ gSprites[spriteId].data[2] = -1;
+ InitSpriteAffineAnim(&gSprites[spriteId]);
+ StartSpriteAffineAnim(&gSprites[spriteId], gFieldEffectArguments[2]);
+ return FALSE;
+}
+
+#define SOME_VRAM_STORE(ptr, posY, posX, toStore) \
+{ \
+ u32 index = (posY) * 32 + posX; \
+ ptr[index] = toStore; \
+}
+
+void SpriteCB_BT_Phase2SlidingPokeballs(struct Sprite *sprite)
+{
+ s16 arr0[NELEMS(gUnknown_83FA40E)];
+
+ memcpy(arr0, gUnknown_83FA40E, sizeof(gUnknown_83FA40E));
+ if (sprite->data[1])
+ {
+ --sprite->data[1];
+ }
+ else
+ {
+ if ((u16)sprite->pos1.x <= 240)
+ {
+ s16 posX = sprite->pos1.x >> 3;
+ s16 posY = sprite->pos1.y >> 3;
+
+ if (posX != sprite->data[2])
+ {
+ u32 var;
+ u16 *ptr;
+
+ sprite->data[2] = posX;
+ var = (((GetGpuReg(REG_OFFSET_BG0CNT) >> 8) & 0x1F) << 11);
+ ptr = (u16 *)(VRAM + var);
+ SOME_VRAM_STORE(ptr, posY - 2, posX, 0xF001);
+ SOME_VRAM_STORE(ptr, posY - 1, posX, 0xF001);
+ SOME_VRAM_STORE(ptr, posY - 0, posX, 0xF001);
+ SOME_VRAM_STORE(ptr, posY + 1, posX, 0xF001);
+ }
+ }
+ sprite->pos1.x += arr0[sprite->data[0]];
+ if (sprite->pos1.x < -15 || sprite->pos1.x > 255)
+ FieldEffectStop(sprite, FLDEFF_POKEBALL);
+ }
+}
+
+#define trStartPtX data[0]
+#define trStartPtY data[1]
+#define trCurrentPtX data[2]
+#define trCurrentPtY data[3]
+#define trEndPtX data[4]
+#define trEndPtY data[5]
+
+void BT_Phase2ClockwiseBlackFade(u8 taskId)
+{
+ while (sBT_Phase2ClockwiseBlackFadeFuncs[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+bool8 BT_Phase2ClockwiseBlackFade_Init(struct Task *task)
+{
+ u16 i;
+
+ BT_InitCtrlBlk();
+ ScanlineEffect_Clear();
+ sTransitionStructPtr->winIn = 0;
+ sTransitionStructPtr->winOut = 0x3F;
+ sTransitionStructPtr->win0H = 0xF0F1;
+ sTransitionStructPtr->win0V = 0x00A0;
+ for (i = 0; i < 160; ++i)
+ {
+ gScanlineEffectRegBuffers[1][i] = 0xF3F4;
+ }
+ SetVBlankCallback(VBCB_BT_Phase2ClockwiseBlackFade);
+ sTransitionStructPtr->trEndPtX = 120;
+ ++task->tState;
+ return TRUE;
+}
+
+bool8 BT_Phase2ClockwiseBlackFade_Step1(struct Task *task)
+{
+ sTransitionStructPtr->vblankDma = FALSE;
+ BT_DiagonalSegment_InitParams(sTransitionStructPtr->data, 120, 80, sTransitionStructPtr->trEndPtX, -1, 1, 1);
+ do
+ {
+ gScanlineEffectRegBuffers[0][sTransitionStructPtr->trCurrentPtY] = (sTransitionStructPtr->trCurrentPtX + 1) | 0x7800;
+ }
+ while (!BT_DiagonalSegment_ComputePointOnSegment(sTransitionStructPtr->data, TRUE, TRUE));
+
+ sTransitionStructPtr->trEndPtX += 32;
+ if (sTransitionStructPtr->trEndPtX >= 240)
+ {
+ sTransitionStructPtr->trEndPtY = 0;
+ ++task->tState;
+ }
+ ++sTransitionStructPtr->vblankDma;
+ return FALSE;
+}
+
+bool8 BT_Phase2ClockwiseBlackFade_Step2(struct Task *task)
+{
+ s16 left, right;
+ vu8 finished = FALSE;
+
+ sTransitionStructPtr->vblankDma = FALSE;
+ BT_DiagonalSegment_InitParams(sTransitionStructPtr->data, 120, 80, 240, sTransitionStructPtr->trEndPtY, 1, 1);
+ while (TRUE)
+ {
+ left = 120;
+ right = sTransitionStructPtr->trCurrentPtX + 1;
+ if (sTransitionStructPtr->trEndPtY >= 80)
+ {
+ left = sTransitionStructPtr->trCurrentPtX;
+ right = 240;
+ }
+ gScanlineEffectRegBuffers[0][sTransitionStructPtr->trCurrentPtY] = right | (left << 8);
+ if (finished)
+ break;
+ finished = BT_DiagonalSegment_ComputePointOnSegment(sTransitionStructPtr->data, TRUE, TRUE);
+ }
+ sTransitionStructPtr->trEndPtY += 16;
+ if (sTransitionStructPtr->trEndPtY >= 160)
+ {
+ sTransitionStructPtr->trEndPtX = 240;
+ ++task->tState;
+ }
+ else
+ {
+ while (sTransitionStructPtr->trCurrentPtY < sTransitionStructPtr->trEndPtY)
+ gScanlineEffectRegBuffers[0][++sTransitionStructPtr->trCurrentPtY] = right | (left << 8);
+ }
+ ++sTransitionStructPtr->vblankDma;
+ return FALSE;
+}
+
+bool8 BT_Phase2ClockwiseBlackFade_Step3(struct Task *task)
+{
+ sTransitionStructPtr->vblankDma = FALSE;
+ BT_DiagonalSegment_InitParams(sTransitionStructPtr->data, 120, 80, sTransitionStructPtr->trEndPtX, 160, 1, 1);
+ do
+ {
+ gScanlineEffectRegBuffers[0][sTransitionStructPtr->trCurrentPtY] = (sTransitionStructPtr->trCurrentPtX << 8) | 0xF0;
+ }
+ while (!BT_DiagonalSegment_ComputePointOnSegment(sTransitionStructPtr->data, TRUE, TRUE));
+ sTransitionStructPtr->trEndPtX -= 32;
+ if (sTransitionStructPtr->trEndPtX <= 0)
+ {
+ sTransitionStructPtr->trEndPtY = 160;
+ ++task->tState;
}
++sTransitionStructPtr->vblankDma;
return FALSE;
}
+/*
+ * BUG: The following 2 functions are incorrect. The animation after
+ * the rotation angle reaches 1.5π will not be displayed.
+ *
+ * There're 2 problems which need to be solved in order to correct the logic.
+ * 1. With current setup, nothing is displayed inside WIN0 and everything
+ * is displayed outside WIN0. Thus, if the rotation angle is > 1.5π, it
+ * won't be able to handle the situation.
+ * 2. The programmer sometimes swapped the place of left and right boundary
+ * of WIN0 (see variables left and right), which will sometimes cause right
+ * to be smaller than left. In this way, garbage data will be written to WIN0H.
+ */
+bool8 BT_Phase2ClockwiseBlackFade_Step4(struct Task *task)
+{
+ s16 right, left;
+ u16 win0H;
+ vu8 finished = FALSE;
+
+ sTransitionStructPtr->vblankDma = FALSE;
+ BT_DiagonalSegment_InitParams(sTransitionStructPtr->data, 120, 80, 0, sTransitionStructPtr->trEndPtY, 1, 1);
+ while (TRUE)
+ {
+ right = (gScanlineEffectRegBuffers[0][sTransitionStructPtr->trCurrentPtY]) & 0xFF;
+ left = sTransitionStructPtr->trCurrentPtX;
+ if (sTransitionStructPtr->trEndPtY <= 80)
+ {
+ left = 120;
+ right = sTransitionStructPtr->trCurrentPtX;
+ }
+ win0H = right | (left << 8);
+ gScanlineEffectRegBuffers[0][sTransitionStructPtr->trCurrentPtY] = win0H;
+ if (finished)
+ break;
+ finished = BT_DiagonalSegment_ComputePointOnSegment(sTransitionStructPtr->data, TRUE, TRUE);
+ }
+ sTransitionStructPtr->trEndPtY -= 16;
+ if (sTransitionStructPtr->trEndPtY <= 0)
+ {
+ sTransitionStructPtr->trEndPtX = 0;
+ ++task->tState;
+ }
+ else
+ {
+ while (sTransitionStructPtr->trCurrentPtY > sTransitionStructPtr->trEndPtY)
+ gScanlineEffectRegBuffers[0][--sTransitionStructPtr->trCurrentPtY] = right | (left << 8);
+ }
+ ++sTransitionStructPtr->vblankDma;
+ return FALSE;
+}
+
+bool8 BT_Phase2ClockwiseBlackFade_Step5(struct Task *task)
+{
+ s16 left, right;
+
+ sTransitionStructPtr->vblankDma = FALSE;
+ BT_DiagonalSegment_InitParams(sTransitionStructPtr->data, 120, 80, sTransitionStructPtr->trEndPtX, 0, 1, 1);
+ do
+ {
+ left = 120;
+ right = sTransitionStructPtr->trCurrentPtX;
+ if (sTransitionStructPtr->trCurrentPtX >= 120)
+ {
+ left = 0;
+ right = 240;
+ }
+ gScanlineEffectRegBuffers[0][sTransitionStructPtr->trCurrentPtY] = right | (left << 8);
+ }
+ while (!BT_DiagonalSegment_ComputePointOnSegment(sTransitionStructPtr->data, TRUE, TRUE));
+ sTransitionStructPtr->trEndPtX += 32;
+ if (sTransitionStructPtr->trCurrentPtX > 120)
+ ++task->tState;
+ ++sTransitionStructPtr->vblankDma;
+ return FALSE;
+}
+
+bool8 BT_Phase2ClockwiseBlackFade_End(struct Task *task)
+{
+ DmaStop(0);
+ BT_BlendPalettesToBlack();
+ DestroyTask(FindTaskIdByFunc(BT_Phase2ClockwiseBlackFade));
+ return FALSE;
+}
+
+void VBCB_BT_Phase2ClockwiseBlackFade(void)
+{
+ DmaStop(0);
+ BT_VBSyncOamAndPltt();
+ if (sTransitionStructPtr->vblankDma)
+ DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320);
+ SetGpuReg(REG_OFFSET_WININ, sTransitionStructPtr->winIn);
+ SetGpuReg(REG_OFFSET_WINOUT, sTransitionStructPtr->winOut);
+ SetGpuReg(REG_OFFSET_WIN0V, sTransitionStructPtr->win0V);
+ SetGpuReg(REG_OFFSET_WIN0H, gScanlineEffectRegBuffers[1][0]);
+ DmaSet(0, gScanlineEffectRegBuffers[1], &REG_WIN0H, ((DMA_ENABLE | DMA_START_HBLANK | DMA_REPEAT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 1);
+}
+
+#undef trStartPtX
+#undef trStartPtY
+#undef trCurrentPtX
+#undef trCurrentPtY
+#undef trEndPtX
+#undef trEndPtY
+
+#define tTheta data[1]
+#define tAmplitude data[2]
+#define tDelayForFade data[3]
+#define tStartFade data[4]
+
+void BT_Phase2FullScreenWave(u8 taskId)
+{
+ while (sBT_Phase2FullScreenWaveFuncs[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+bool8 BT_Phase2FullScreenWave_Init(struct Task *task)
+{
+ u8 i;
+
+ BT_InitCtrlBlk();
+ ScanlineEffect_Clear();
+ for (i = 0; i < 160; ++i)
+ gScanlineEffectRegBuffers[1][i] = sTransitionStructPtr->bg123VOfs;
+ SetVBlankCallback(VBCB_BT_Phase2FullScreenWave);
+ SetHBlankCallback(HBCB_BT_Phase2FullScreenWave);
+ EnableInterrupts(INTR_FLAG_HBLANK);
+ ++task->tState;
+ return TRUE;
+}
+
+bool8 BT_Phase2FullScreenWave_UpdateWave(struct Task *task)
+{
+ u8 i;
+ s16 amplitude;
+ u16 theta, frequency;
+
+ sTransitionStructPtr->vblankDma = FALSE;
+ amplitude = task->tAmplitude >> 8;
+ theta = task->tTheta;
+ frequency = 384;
+ task->tTheta += 0x400;
+ if (task->tAmplitude <= 0x1FFF)
+ task->tAmplitude += 384;
+ for (i = 0; i < 160; ++i, theta += frequency)
+ {
+ s16 var = theta >> 8;
+ #ifndef NONMATCHING
+ asm("");
+ #endif
+ gScanlineEffectRegBuffers[0][i] = sTransitionStructPtr->bg123VOfs + Sin(var, amplitude);
+ }
+ if (++task->tDelayForFade == 41)
+ {
+ ++task->tStartFade;
+ BeginNormalPaletteFade(0xFFFFFFFF, -8, 0, 0x10, RGB_BLACK);
+ }
+ if (task->tStartFade && !gPaletteFade.active)
+ DestroyTask(FindTaskIdByFunc(BT_Phase2FullScreenWave));
+ ++sTransitionStructPtr->vblankDma;
+ return FALSE;
+}
+
+void VBCB_BT_Phase2FullScreenWave(void)
+{
+ BT_VBSyncOamAndPltt();
+ if (sTransitionStructPtr->vblankDma)
+ DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320);
+}
+
+void HBCB_BT_Phase2FullScreenWave(void)
+{
+ u16 offset = gScanlineEffectRegBuffers[1][REG_VCOUNT];
+ REG_BG1VOFS = offset;
+ REG_BG2VOFS = offset;
+ REG_BG3VOFS = offset;
+}
+
+#undef tTheta
+#undef tAmplitude
+#undef tDelayForFade
+#undef tStartFade
+
+#define tOffset data[1]
+#define tTheta data[2]
+
+void BT_Phase2BlackWaveToRight(u8 taskId)
+{
+ while (sBT_Phase2BlackWaveToRightFuncs[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+bool8 BT_Phase2BlackWaveToRight_Init(struct Task *task)
+{
+ u8 i;
+
+ BT_InitCtrlBlk();
+ ScanlineEffect_Clear();
+ sTransitionStructPtr->winIn = 0x3F;
+ sTransitionStructPtr->winOut = 0;
+ sTransitionStructPtr->win0H = 240;
+ sTransitionStructPtr->win0V = 160;
+ for (i = 0; i < 160; ++i)
+ gScanlineEffectRegBuffers[1][i] = 242;
+ SetVBlankCallback(VBCB_BT_Phase2BlackWaveToRight);
+ ++task->tState;
+ return TRUE;
+}
+
+bool8 BT_Phase2BlackWaveToRight_UpdateWave(struct Task *task)
+{
+ u8 i, theta;
+ u16* toStore;
+ bool8 nextFunc;
+
+ sTransitionStructPtr->vblankDma = FALSE;
+ toStore = gScanlineEffectRegBuffers[0];
+ theta = task->tTheta;
+ task->tTheta += 16;
+ task->tOffset += 8;
+ for (i = 0, nextFunc = TRUE; i < 160; ++i, theta += 4, ++toStore)
+ {
+ s16 left = task->tOffset + Sin(theta, 40);
+ if (left < 0)
+ left = 0;
+ if (left > 240)
+ left = 240;
+ *toStore = (left << 8) | (0xF1);
+ if (left < 240)
+ nextFunc = FALSE;
+ }
+ if (nextFunc)
+ ++task->tState;
+ ++sTransitionStructPtr->vblankDma;
+ return FALSE;
+}
+
+bool8 BT_Phase2BlackWaveToRight_End(struct Task *task)
+{
+ DmaStop(0);
+ BT_BlendPalettesToBlack();
+ DestroyTask(FindTaskIdByFunc(BT_Phase2BlackWaveToRight));
+ return FALSE;
+}
+
+void VBCB_BT_Phase2BlackWaveToRight(void)
+{
+ DmaStop(0);
+ BT_VBSyncOamAndPltt();
+ if (sTransitionStructPtr->vblankDma)
+ DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320);
+ SetGpuReg(REG_OFFSET_WININ, sTransitionStructPtr->winIn);
+ SetGpuReg(REG_OFFSET_WINOUT, sTransitionStructPtr->winOut);
+ SetGpuReg(REG_OFFSET_WIN0V, sTransitionStructPtr->win0V);
+ DmaSet(0, gScanlineEffectRegBuffers[1], &REG_WIN0H, ((DMA_ENABLE | DMA_START_HBLANK | DMA_REPEAT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 1);
+}
+
+#undef tOffset
+#undef tTheta
+
+void BT_Phase2AntiClockwiseSpiral(u8 taskId)
+{
+ while (sBT_Phase2AntiClockwiseSpiralFuncs[gTasks[taskId].tState](&gTasks[taskId]));
+}
+