summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--data/predef_pointers.inc2
-rw-r--r--engine/battle/battle_transitions.asm645
-rw-r--r--layout.link2
-rw-r--r--ram/wram.asm5
-rwxr-xr-xshim.sym1
5 files changed, 653 insertions, 2 deletions
diff --git a/data/predef_pointers.inc b/data/predef_pointers.inc
index cd1e2b2..d71e4d7 100644
--- a/data/predef_pointers.inc
+++ b/data/predef_pointers.inc
@@ -90,7 +90,7 @@ GiveItemPredef::
add_predef CheckSGB
add_predef Function928b
add_predef Function8786
- add_predef Function8c4be
+ add_predef DoBattleTransition
add_predef Function8c9c6
add_predef Function8c940 ; 50
add_predef PlayBattleAnim
diff --git a/engine/battle/battle_transitions.asm b/engine/battle/battle_transitions.asm
new file mode 100644
index 0000000..9a84387
--- /dev/null
+++ b/engine/battle/battle_transitions.asm
@@ -0,0 +1,645 @@
+INCLUDE "constants.asm"
+
+; BattleTransitionJumptable.Jumptable indexes
+BATTLETRANSITION_WAVY EQU $01
+BATTLETRANSITION_WIPE 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: ; 23:44be
+ ld a, %11100011
+ ldh [rLCDC], a
+ call .InitGFX
+
+.loop ; 44c5
+ ld a, [wJumptableIndex]
+ bit 7, a ; BATTLETRANSITION_END?
+ jr nz, .done
+ call BattleTransitionJumptable
+ call DelayFrame
+ jr .loop
+
+.done
+ ld a, $FF
+ 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, .skip
+ ld de, .GreyTile
+.skip
+ ld hl, vChars0 tile BATTLETRANSITION_BLACK
+ ld b, BANK(@)
+ ld c, $01
+ call Request2bpp
+ ret
+
+.BlackTile:
+ rept 16
+ db $ff
+ endr
+
+.GreyTile:
+ rept 8
+ db $00, $ff
+ endr
+
+BattleTransitionJumptable:
+ jumptable .Jumptable, wJumptableIndex
+
+.Jumptable ; 456c
+ dw StartTrainerBattle_DetermineWhichAnimation ; 00
+
+; Wavy outro
+ 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
+
+; Wipe outro - 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
+
+; Scanline outro
+ 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
+
+; Spin clockwise
+ 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
+
+; Random 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
+
+ dw StartTrainerBattle_Finish ; 24
+
+StartTrainerBattle_DetermineWhichAnimation:
+ ldh a, [hVBlankCounter]
+ and a, %00000011
+ ld e, a
+ ld d, 0
+ ld hl, .StartingPoints
+ add hl, de
+ ld a, [hl]
+ ld [wJumptableIndex], a
+ ret
+
+.StartingPoints ;45c6
+ 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 [wcb5f], a
+ ldh [hBGMapMode], a
+ ret
+
+StartTrainerBattle_Flash:
+ call .DoFlashAnimation
+ ret nc
+ call StartTrainerBattle_NextScene
+ ret
+
+.DoFlashAnimation:
+ ld hl, wcb5f
+ ld a, [hl]
+ inc [hl]
+ srl a
+ ld e, a
+ ld d, $00
+ ld hl, .pals
+ add hl, de
+ ld a, [hl]
+ cp %00000001
+ jr z, .done
+ ldh [rBGP], a
+ and a
+ ret
+.done
+ xor a
+ ld [wcb5f], a
+ scf
+ ret
+.pals
+ db $f9, $fe, $ff, $fe, $f9, $e4, $90, $40, $00, $40, $90, $e4, $01
+
+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 [wcb5f], a
+ ld [wcb60], a
+ ret
+StartTrainerBattle_SineWave:
+ ld a, [wcb5f]
+ cp $60
+ jr nc, .end
+ call .DoSineWave
+ ret
+.end
+ ld a, BATTLETRANSITION_FINISH
+ ld [wJumptableIndex], a
+ ret
+
+.DoSineWave:
+ ld hl, wcb60
+ ld a, [hl]
+ inc [hl]
+ ld hl, wcb5f
+ ld d, [hl]
+ add [hl]
+ ld [hl], a
+ ld a, SCREEN_HEIGHT_PX
+ 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 $02
+ 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 [wcb5f], a
+ ld a, SCREEN_HEIGHT_PX + 1
+ ldh [hSCY], a
+ ret
+
+StartTrainerBattle_WipeOutro:
+ ld hl, wcb5f
+ ld a, [hl]
+ cp $48
+ jr nc, .end
+ inc [hl]
+ srl a
+ ld e, a
+ ld d, $00
+ ld hl, wLYOverrides
+ add hl, de
+ call Func4692
+ ret
+.end
+ ld a, BATTLETRANSITION_FINISH
+ ld [wJumptableIndex], a
+ ret
+
+Func4692:
+ ld c, $04
+ ld de, $0024
+ ld b, $91
+.loop
+ ld a, b
+ sub l
+ ld [hl], a
+ add hl, de
+ dec c
+ jr nz, .loop
+ ld hl, $c691
+ ld [hl], $91
+ ret
+
+StartTrainerBattle_SetUpForScanlineOutro:
+ call StartTrainerBattle_NextScene
+ ld a, LOW(rSCX)
+ ldh [hLCDCPointer], a
+ xor a
+ ld [wcb5f], a
+ call WipeLYOverrides
+ ret
+
+StartTrainerBattle_Scanlines:
+ ld hl, wcb5f
+ ld a, [hl]
+ cp $50
+ jr nc, .finished
+ inc [hl]
+ ld e, a
+ xor -1 ; switch scroll direction
+ inc a
+ ld d, a
+ call .SplitEvenOdd
+ ret
+.finished
+ 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 [wcb5f], a
+ ret
+
+StartTrainerBattle_SpinToBlack:
+ xor a
+ ldh [hBGMapMode], a
+ ld a, [wcb5f]
+ ld e, a
+ ld d, 0
+ ld hl, .data4723
+rept 5
+ add hl, de
+endr
+ ld a, [hli]
+ cp -1
+ jr z, .end
+ ld [wcb60], a
+ call .load
+ ld a, 1
+ ldh [hBGMapMode], a
+ call DelayFrame
+ call DelayFrame
+ ld hl, wcb5f
+ inc [hl]
+ ret
+.end
+ ld a, $01
+ ldh [hBGMapMode], a
+ call DelayFrame
+ call DelayFrame
+ call DelayFrame
+ xor a
+ ldh [hBGMapMode], a
+ ld a, BATTLETRANSITION_FINISH
+ ld [wJumptableIndex], a
+ ret
+
+.data4723
+ db $00, $cb, $47, $19, $c3
+ db $00, $d1, $47, $dc, $c2
+ db $00, $db, $47, $a1, $c2
+ db $00, $ed, $47, $a5, $c2
+ db $00, $fb, $47, $a9, $c2
+ db $01, $fb, $47, $aa, $c2
+ db $01, $ed, $47, $ae, $c2
+ db $01, $db, $47, $b2, $c2
+ db $01, $d1, $47, $ef, $c2
+ db $01, $cb, $47, $2a, $c3
+ db $03, $cb, $47, $8e, $c3
+ db $03, $d1, $47, $cb, $c3
+ db $03, $db, $47, $06, $c4
+ db $03, $ed, $47, $02, $c4
+ db $03, $fb, $47, $fe, $c3
+ db $02, $fb, $47, $fd, $c3
+ db $02, $ed, $47, $f9, $c3
+ db $02, $db, $47, $f5, $c3
+ db $02, $d1, $47, $b8, $c3
+ db $02, $cb, $47, $7d, $c3
+ 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], $ff
+ ld a, [wcb60]
+ bit 0, a
+ jr z, .leftside
+ inc hl
+ jr .okay1
+.leftside
+ dec hl
+.okay1
+ dec c
+ jr nz, .loop1
+ pop hl
+ ld a, [wcb60]
+ bit 1, 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, [wcb60]
+ bit 0, 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 [wcb5f], a
+ ld a, 1
+ ldh [hBGMapMode], a
+ ret
+
+StartTrainerBattle_SpeckleToBlack:
+ ld hl, wcb5f
+ 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 $12
+ 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
+ ld a, [hl]
+ cp -1
+ jr z, .y_loop
+ ld [hl], $ff
+ 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
+ and a
+ jr z, .done
+ sla a
+ jr nc, .no_load
+ ld [hl], $ff
+.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, $01
+ 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
+.wipe
+ ld [hli], a
+ dec c
+ jr nz, .wipe
+ ret
+
+StartTrainerBattle_DrawSineWave:
+ calc_sine_wave .sine_table
+.sine_table
+ dw $0000
+ dw $0019
+ dw $0032
+ dw $004A
+ dw $0062
+ dw $0079
+ dw $008E
+ dw $00A2
+ dw $00B5
+ dw $00C6
+ dw $00D5
+ dw $00E2
+ dw $00ED
+ dw $00F5
+ dw $00FB
+ dw $00FF
+ dw $0100
+ dw $00FF
+ dw $00FB
+ dw $00F5
+ dw $00ED
+ dw $00E2
+ dw $00D5
+ dw $00C6
+ dw $00B5
+ dw $00A2
+ dw $008E
+ dw $0079
+ dw $0062
+ dw $004A
+ dw $0032
+ dw $0019
diff --git a/layout.link b/layout.link
index 4c0b0a3..e03d166 100644
--- a/layout.link
+++ b/layout.link
@@ -368,6 +368,8 @@ ROMX $23
"engine/palettes.asm@Overworld fade"
org $43d1
"engine/palettes.asm@Palette fading, part 2?"
+ org $44be
+ "engine/battle/battle_transitions.asm"
org $60cc
"gfx.asm@Pokemon Party Sprites"
org $722a
diff --git a/ram/wram.asm b/ram/wram.asm
index 9690975..4405a16 100644
--- a/ram/wram.asm
+++ b/ram/wram.asm
@@ -328,7 +328,12 @@ wNamedObjectTypeBuffer:: db
SECTION "CB5E", WRAM0[$CB5E]
wJumptableIndex:: db
+
+UNION
+wcb5f:: db
+NEXTU
wFlyDestination:: db
+ENDU
wcb60:: ds 1
wcb61:: ds 1
diff --git a/shim.sym b/shim.sym
index 38cc5de..a34e54f 100755
--- a/shim.sym
+++ b/shim.sym
@@ -124,7 +124,6 @@
23:4335 _UpdateTimePals
23:4354 ReplaceTimeOfDayPals
23:4370 GetTimePalette
-23:44BE Function8c4be
23:4940 Function8c940
23:49C6 Function8c9c6
23:4CFD InitEffectObject