Skip to content
Permalink
master
Switch branches/tags
Go to file
 
 
Cannot retrieve contributors at this time
INCLUDE "constants.asm"
; BattleTransitionJumptable.Jumptable indexes
BATTLETRANSITION_WAVY EQU $01
BATTLETRANSITION_WIPE_UNUSED EQU $08
BATTLETRANSITION_SCANLINE EQU $0f
BATTLETRANSITION_SPIN EQU $16
BATTLETRANSITION_SCATTER EQU $1d
BATTLETRANSITION_FINISH EQU $24
BATTLETRANSITION_END EQU $80
BATTLETRANSITION_BLACK EQU $ff
SECTION "engine/battle/battle_transitions.asm", ROMX
DoBattleTransition:
ld a, %11100011
ldh [rLCDC], a
call .InitGFX
.loop
ld a, [wJumptableIndex]
bit 7, a ; BATTLETRANSITION_END?
jr nz, .done
call BattleTransitionJumptable
call DelayFrame
jr .loop
.done
ld a, %11111111
ldh [rBGP], a ; cut to black
xor a
ldh [hLCDCPointer], a
ldh [hLYOverrideStart], a
ldh [hLYOverrideEnd], a
ldh [hSCY], a
ld a, %10100011
ldh [rLCDC], a
ret
.InitGFX:
callba ReanchorBGMap_NoOAMUpdate
call UpdateSprites
call ConvertTrainerBattlePokeballTilesTo2bpp
call WaitBGMap
ld a, SCREEN_HEIGHT_PX
ldh [hWY], a
call DelayFrame
xor a
ldh [hBGMapMode], a
ld hl, wJumptableIndex
xor a
ld [hli], a
ld [hli], a
ld [hl], a
call WipeLYOverrides
ret
ConvertTrainerBattlePokeballTilesTo2bpp:
ld hl, wOverworldMapBlocks
ld bc, $28 tiles
.loop
ld [hl], BATTLETRANSITION_BLACK
inc hl
dec bc
ld a, c
or b
jr nz, .loop
ld de, wOverworldMapBlocks
hlbgcoord 0, 0, vBGMap0
ld b, BANK(@)
ld c, $28
call Request2bpp
ld de, .BlackTile
ldh a, [hOverworldFlashlightEffect]
and a
jr z, .got_tile
ld de, .GrayTile
.got_tile
ld hl, vChars0 tile BATTLETRANSITION_BLACK
ld b, BANK(@)
ld c, 1
call Request2bpp
ret
.BlackTile:
rept 8
dw `33333333
endr
.GrayTile:
rept 8
dw `22222222
endr
BattleTransitionJumptable:
jumptable .Jumptable, wJumptableIndex
.Jumptable:
dw StartTrainerBattle_DetermineWhichAnimation ; 00
; BATTLETRANSITION_WAVY
dw StartTrainerBattle_LoadPokeBallGraphics ; 01
dw StartTrainerBattle_SetUpBGMap ; 02
dw StartTrainerBattle_Flash ; 03
dw StartTrainerBattle_Flash ; 04
dw StartTrainerBattle_Flash ; 05
dw StartTrainerBattle_SetUpForWavyOutro ; 06
dw StartTrainerBattle_SineWave ; 07
; BATTLETRANSITION_WIPE_UNUSED
dw StartTrainerBattle_LoadPokeBallGraphics ; 08
dw StartTrainerBattle_SetUpBGMap ; 09
dw StartTrainerBattle_Flash ; 0a
dw StartTrainerBattle_Flash ; 0b
dw StartTrainerBattle_Flash ; 0c
dw StartTrainerBattle_SetUpForWipeOutro ; 0d
dw StartTrainerBattle_WipeOutro ; 0e
; BATTLETRANSITION_SCANLINE
dw StartTrainerBattle_LoadPokeBallGraphics ; 0f
dw StartTrainerBattle_SetUpBGMap ; 10
dw StartTrainerBattle_Flash ; 11
dw StartTrainerBattle_Flash ; 12
dw StartTrainerBattle_Flash ; 13
dw StartTrainerBattle_SetUpForScanlineOutro ; 14
dw StartTrainerBattle_Scanlines ; 15
; BATTLETRANSITION_SPIN
dw StartTrainerBattle_LoadPokeBallGraphics ; 16
dw StartTrainerBattle_SetUpBGMap ; 17
dw StartTrainerBattle_Flash ; 18
dw StartTrainerBattle_Flash ; 19
dw StartTrainerBattle_Flash ; 1a
dw StartTrainerBattle_SetUpForSpinOutro ; 1b
dw StartTrainerBattle_SpinToBlack ; 1c
; BATTLETRANSITION_SCATTER
dw StartTrainerBattle_LoadPokeBallGraphics ; 1d
dw StartTrainerBattle_SetUpBGMap ; 1e
dw StartTrainerBattle_Flash ; 1f
dw StartTrainerBattle_Flash ; 20
dw StartTrainerBattle_Flash ; 21
dw StartTrainerBattle_SetUpForRandomScatterOutro ; 22
dw StartTrainerBattle_SpeckleToBlack ; 23
; BATTLETRANSITION_FINISH
dw StartTrainerBattle_Finish ; 24
StartTrainerBattle_DetermineWhichAnimation:
; Picks an arbitrary animation depending on [hVBlankCounter] % 4.
ldh a, [hVBlankCounter]
and a, %11
ld e, a
ld d, 0
ld hl, .StartingPoints
add hl, de
ld a, [hl]
ld [wJumptableIndex], a
ret
.StartingPoints:
db BATTLETRANSITION_WAVY
db BATTLETRANSITION_SCATTER
db BATTLETRANSITION_SCANLINE
db BATTLETRANSITION_SPIN
StartTrainerBattle_Finish:
call ClearSprites
ld a, BATTLETRANSITION_END
ld [wJumptableIndex], a
ret
StartTrainerBattle_NextScene:
ld hl, wJumptableIndex
inc [hl]
ret
StartTrainerBattle_SetUpBGMap:
call StartTrainerBattle_NextScene
xor a
ld [wBattleTransitionCounter], a
ldh [hBGMapMode], a
ret
StartTrainerBattle_Flash:
call .DoFlashAnimation
ret nc
call StartTrainerBattle_NextScene
ret
.DoFlashAnimation:
ld hl, wBattleTransitionCounter
ld a, [hl]
inc [hl]
srl a
ld e, a
ld d, 0
ld hl, .pals
add hl, de
ld a, [hl]
cp %00000001
jr z, .done
ldh [rBGP], a
and a
ret
.done
xor a
ld [wBattleTransitionCounter], a
scf
ret
.pals:
dc 3, 3, 2, 1
dc 3, 3, 3, 2
dc 3, 3, 3, 3
dc 3, 3, 3, 2
dc 3, 3, 2, 1
dc 3, 2, 1, 0
dc 2, 1, 0, 0
dc 1, 0, 0, 0
dc 0, 0, 0, 0
dc 1, 0, 0, 0
dc 2, 1, 0, 0
dc 3, 2, 1, 0
dc 0, 0, 0, 1
StartTrainerBattle_SetUpForWavyOutro:
call StartTrainerBattle_NextScene
ld a, LOW(rSCX)
ldh [hLCDCPointer], a
xor a
ldh [hLYOverrideStart], a
ld a, SCREEN_HEIGHT_PX
ldh [hLYOverrideEnd], a
xor a
ld [wBattleTransitionCounter], a
ld [wBattleTransitionSineWaveOffset], a
ret
StartTrainerBattle_SineWave:
ld a, [wBattleTransitionCounter]
cp $60
jr nc, .end
call .DoSineWave
ret
.end
ld a, BATTLETRANSITION_FINISH
ld [wJumptableIndex], a
ret
.DoSineWave:
ld hl, wBattleTransitionSineWaveOffset
ld a, [hl]
inc [hl]
ld hl, wBattleTransitionCounter
ld d, [hl]
add [hl]
ld [hl], a
ld a, wLYOverridesEnd - wLYOverrides
ld bc, wLYOverrides
ld e, 0
.loop
push af
push de
ld a, e
call StartTrainerBattle_DrawSineWave
ld [bc], a
inc bc
pop de
ld a, e
add 2
ld e, a
pop af
dec a
jr nz, .loop
ret
StartTrainerBattle_SetUpForWipeOutro:
call StartTrainerBattle_NextScene
ld a, LOW(rSCY)
ldh [hLCDCPointer], a
xor a
ldh [hLYOverrideStart], a
ld a, SCREEN_HEIGHT_PX
ldh [hLYOverrideEnd], a
xor a
ld [wBattleTransitionCounter], a
ld a, SCREEN_HEIGHT_PX + 1
ldh [hSCY], a
ret
StartTrainerBattle_WipeOutro:
ld hl, wBattleTransitionCounter
ld a, [hl]
cp $48
jr nc, .end
inc [hl]
srl a
ld e, a
ld d, 0
ld hl, wLYOverrides
add hl, de
call .DoWipeOutro
ret
.end
ld a, BATTLETRANSITION_FINISH
ld [wJumptableIndex], a
ret
.DoWipeOutro:
ld c, 4
ld de, SCREEN_HEIGHT_PX / 4
ld b, SCREEN_HEIGHT_PX + 1
.loop
ld a, b
sub l
ld [hl], a
add hl, de
dec c
jr nz, .loop
ld hl, wLYOverridesEnd + 1
ld [hl], SCREEN_HEIGHT_PX + 1
ret
StartTrainerBattle_SetUpForScanlineOutro:
call StartTrainerBattle_NextScene
ld a, LOW(rSCX)
ldh [hLCDCPointer], a
xor a
ld [wBattleTransitionCounter], a
call WipeLYOverrides
ret
StartTrainerBattle_Scanlines:
ld hl, wBattleTransitionCounter
ld a, [hl]
cp $50
jr nc, .end
inc [hl]
ld e, a
xor $ff ; switch scroll direction
inc a
ld d, a
call .SplitEvenOdd
ret
.end
ld a, BATTLETRANSITION_FINISH
ld [wJumptableIndex], a
ret
.SplitEvenOdd:
ld hl, wLYOverrides
ld c, $48
.loop
ld [hl], e
inc hl
ld [hl], d
inc hl
dec c
jr nz, .loop
ret
StartTrainerBattle_SetUpForSpinOutro:
call StartTrainerBattle_NextScene
xor a
ld [wBattleTransitionCounter], a
ret
StartTrainerBattle_SpinToBlack:
xor a
ldh [hBGMapMode], a
ld a, [wBattleTransitionCounter]
ld e, a
ld d, 0
ld hl, .spin_quadrants
rept 5
add hl, de
endr
ld a, [hli]
cp -1
jr z, .end
ld [wBattleTransitionSpinQuadrant], a
call .load
ld a, 1
ldh [hBGMapMode], a
call DelayFrame
call DelayFrame
ld hl, wBattleTransitionCounter
inc [hl]
ret
.end
ld a, 1
ldh [hBGMapMode], a
call DelayFrame
call DelayFrame
call DelayFrame
xor a
ldh [hBGMapMode], a
ld a, BATTLETRANSITION_FINISH
ld [wJumptableIndex], a
ret
; quadrants
const_def
const UPPER_LEFT
const UPPER_RIGHT
const LOWER_LEFT
const LOWER_RIGHT
; quadrant bits
RIGHT_QUADRANT_F EQU 0 ; bit set in UPPER_RIGHT and LOWER_RIGHT
LOWER_QUADRANT_F EQU 1 ; bit set in LOWER_LEFT and LOWER_RIGHT
.spin_quadrants:
spin_quadrant: MACRO
db \1
dw \2
dwcoord \3, \4
ENDM
spin_quadrant UPPER_LEFT, .wedge1, 1, 6
spin_quadrant UPPER_LEFT, .wedge2, 0, 3
spin_quadrant UPPER_LEFT, .wedge3, 1, 0
spin_quadrant UPPER_LEFT, .wedge4, 5, 0
spin_quadrant UPPER_LEFT, .wedge5, 9, 0
spin_quadrant UPPER_RIGHT, .wedge5, 10, 0
spin_quadrant UPPER_RIGHT, .wedge4, 14, 0
spin_quadrant UPPER_RIGHT, .wedge3, 18, 0
spin_quadrant UPPER_RIGHT, .wedge2, 19, 3
spin_quadrant UPPER_RIGHT, .wedge1, 18, 6
spin_quadrant LOWER_RIGHT, .wedge1, 18, 11
spin_quadrant LOWER_RIGHT, .wedge2, 19, 14
spin_quadrant LOWER_RIGHT, .wedge3, 18, 17
spin_quadrant LOWER_RIGHT, .wedge4, 14, 17
spin_quadrant LOWER_RIGHT, .wedge5, 10, 17
spin_quadrant LOWER_LEFT, .wedge5, 9, 17
spin_quadrant LOWER_LEFT, .wedge4, 5, 17
spin_quadrant LOWER_LEFT, .wedge3, 1, 17
spin_quadrant LOWER_LEFT, .wedge2, 0, 14
spin_quadrant LOWER_LEFT, .wedge1, 1, 11
db -1
.load:
ld a, [hli]
ld e, a
ld a, [hli]
ld d, a
ld a, [hli]
ld h, [hl]
ld l, a
.loop
push hl
ld a, [de]
ld c, a
inc de
.loop1
ld [hl], BATTLETRANSITION_BLACK
ld a, [wBattleTransitionSpinQuadrant]
bit RIGHT_QUADRANT_F, a
jr z, .leftside
inc hl
jr .okay1
.leftside
dec hl
.okay1
dec c
jr nz, .loop1
pop hl
ld a, [wBattleTransitionSpinQuadrant]
bit LOWER_QUADRANT_F, a
ld bc, SCREEN_WIDTH
jr z, .upper
ld bc, -SCREEN_WIDTH
.upper
add hl, bc
ld a, [de]
inc de
cp -1
ret z
and a
jr z, .loop
ld c, a
.loop2
ld a, [wBattleTransitionSpinQuadrant]
bit RIGHT_QUADRANT_F, a
jr z, .leftside2
dec hl
jr .okay2
.leftside2
inc hl
.okay2
dec c
jr nz, .loop2
jr .loop
.wedge1: db 2, 3, 5, 4, 9, -1
.wedge2: db 1, 1, 2, 2, 4, 2, 4, 2, 3, -1
.wedge3: db 2, 1, 3, 1, 4, 1, 4, 1, 4, 1, 3, 1, 2, 1, 1, 1, 1, -1
.wedge4: db 4, 1, 4, 0, 3, 1, 3, 0, 2, 1, 2, 0, 1, -1
.wedge5: db 4, 0, 3, 0, 3, 0, 2, 0, 2, 0, 1, 0, 1, 0, 1, -1
StartTrainerBattle_SetUpForRandomScatterOutro:
call StartTrainerBattle_NextScene
ld a, $10
ld [wBattleTransitionCounter], a
ld a, 1
ldh [hBGMapMode], a
ret
StartTrainerBattle_SpeckleToBlack:
ld hl, wBattleTransitionCounter
ld a, [hl]
and a
jr z, .done
dec [hl]
ld c, 12
.loop
push bc
call .BlackOutRandomTile
pop bc
dec c
jr nz, .loop
ret
.done
ld a, 1
ldh [hBGMapMode], a
call DelayFrame
call DelayFrame
call DelayFrame
xor a
ldh [hBGMapMode], a
ld a, BATTLETRANSITION_FINISH
ld [wJumptableIndex], a
ret
.BlackOutRandomTile:
.y_loop
call Random
cp SCREEN_HEIGHT
jr nc, .y_loop
ld b, a
.x_loop
call Random
cp SCREEN_WIDTH
jr nc, .x_loop
ld c, a
hlcoord 0, -1
ld de, SCREEN_WIDTH
inc b
.row_loop
add hl, de
dec b
jr nz, .row_loop
add hl, bc
; If the tile has already been blacked out,
; sample a new tile
ld a, [hl]
cp BATTLETRANSITION_BLACK
jr z, .y_loop
ld [hl], BATTLETRANSITION_BLACK
ret
StartTrainerBattle_LoadPokeBallGraphics:
xor a
ldh [hBGMapMode], a
hlcoord 2, 1
ld de, .PokeBallTransition
ld b, SCREEN_WIDTH - 4
.tile_loop
push hl
ld c, 2
.row_loop
push hl
ld a, [de]
inc de
.col_loop
; Loading is done bit by bit
and a
jr z, .done
sla a
jr nc, .no_load
ld [hl], BATTLETRANSITION_BLACK
.no_load
inc hl
jr .col_loop
.done
pop hl
push bc
ld bc, (SCREEN_WIDTH - 4) / 2
add hl, bc
pop bc
dec c
jr nz, .row_loop
pop hl
push bc
ld bc, SCREEN_WIDTH
add hl, bc
pop bc
dec b
jr nz, .tile_loop
ld a, 1
ldh [hBGMapMode], a
call DelayFrame
call DelayFrame
call StartTrainerBattle_NextScene
ret
.PokeBallTransition:
; 16x16 overlay of a Poke Ball
pusho
opt b.X ; . = 0, X = 1
bigdw %................
bigdw %......XXXX......
bigdw %....XXXXXXXX....
bigdw %...XXXXXXXXXX...
bigdw %..XXXXXXXXXXXX..
bigdw %..XXXXXXXXXXXX..
bigdw %.XXXXXX..XXXXXX.
bigdw %.XXXXX....XXXXX.
bigdw %.X....X..X....X.
bigdw %.X.....XX.....X.
bigdw %..X..........X..
bigdw %..X..........X..
bigdw %...X........X...
bigdw %....XX....XX....
bigdw %......XXXX......
bigdw %................
popo
WipeLYOverrides:
ld hl, wLYOverrides
xor a
ld c, SCREEN_HEIGHT_PX
.loop
ld [hli], a
dec c
jr nz, .loop
ret
StartTrainerBattle_DrawSineWave:
calc_sine_wave