diff options
Diffstat (limited to 'engine/battle/battle_transitions.asm')
-rw-r--r-- | engine/battle/battle_transitions.asm | 815 |
1 files changed, 815 insertions, 0 deletions
diff --git a/engine/battle/battle_transitions.asm b/engine/battle/battle_transitions.asm new file mode 100644 index 00000000..f1aa4161 --- /dev/null +++ b/engine/battle/battle_transitions.asm @@ -0,0 +1,815 @@ +BattleTransition: ; 7096d (1c:496d) + ld a, $1 + ld [H_AUTOBGTRANSFERENABLED], a + call Delay3 + xor a + ld [hWY], a + dec a + ld [wUpdateSpritesEnabled], a + call DelayFrame + ld hl, wSpriteStateData1 + 2 + ld a, [H_DOWNARROWBLINKCNT2] + ld c, a + ld b, $0 + ld de, $10 +.loop1 + ld a, [hl] + cp $ff + jr z, .skip1 + inc b +.skip1 + add hl, de + dec c + jr nz, .loop1 + ld hl, wOAMBuffer + $10 + ld c, $9 +.loop2 + ld a, b + swap a + cp l + jr z, .skip2 + push hl + push bc + ld bc, $10 + xor a + call FillMemory + pop bc + pop hl +.skip2 + ld de, $10 + add hl, de + dec c + jr nz, .loop2 + call Delay3 + call LoadBattleTransitionTile + ld bc, $0 + ld a, [wLinkState] + cp LINK_STATE_BATTLING + jr z, .linkBattle + call GetBattleTransitionID_WildOrTrainer + call GetBattleTransitionID_CompareLevels + call GetBattleTransitionID_IsDungeonMap +.linkBattle + ld hl, BattleTransitions + add hl, bc + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a + jp [hl] + +; the three GetBattleTransitionID functions set the first +; three bits of c, which determines what transition animation +; to play at the beginning of a battle +; bit 0: set if trainer battle +; bit 1: set if enemy is at least 3 levels higher than player +; bit 2: set if dungeon map +BattleTransitions: ; 709d2 (1c:49d2) + dw BattleTransition_DoubleCircle ; %000 + dw BattleTransition_Spiral ; %001 + dw BattleTransition_Circle ; %010 + dw BattleTransition_Spiral ; %011 + dw BattleTransition_HorizontalStripes ; %100 + dw BattleTransition_Shrink ; %101 + dw BattleTransition_VerticalStripes ; %110 + dw BattleTransition_Split ; %111 + +GetBattleTransitionID_WildOrTrainer: ; 709e2 (1c:49e2) + ld a, [W_CUROPPONENT] + cp $c8 + jr nc, .trainer + res 0, c + ret +.trainer + set 0, c + ret + +GetBattleTransitionID_CompareLevels: ; 709ef (1c:49ef) + ld hl, wPartyMon1HP +.faintedLoop + ld a, [hli] + or [hl] + jr nz, .notFainted + ld de, wPartyMon2 - (wPartyMon1 + 1) + add hl, de + jr .faintedLoop +.notFainted + ld de, wPartyMon1Level - (wPartyMon1HP + 1) + add hl, de + ld a, [hl] + add $3 + ld e, a + ld a, [W_CURENEMYLVL] + sub e + jr nc, .highLevelEnemy + res 1, c + ld a, $1 + ld [wcd47], a + ret +.highLevelEnemy + set 1, c + xor a + ld [wcd47], a + ret + +; fails to recognize VICTORY_ROAD_2, VICTORY_ROAD_3, all ROCKET_HIDEOUT maps, +; MANSION_1, SEAFOAM_ISLANDS_[2-5], POWER_PLANT, DIGLETTS_CAVE +; and SILPH_CO_[9-11]F as dungeon maps +GetBattleTransitionID_IsDungeonMap: ; 70a19 (1c:4a19) + ld a, [W_CURMAP] + ld e, a + ld hl, DungeonMaps1 +.loop1 + ld a, [hli] + cp $ff + jr z, .noMatch1 + cp e + jr nz, .loop1 +.match + set 2, c + ret +.noMatch1 + ld hl, DungeonMaps2 +.loop2 + ld a, [hli] + cp $ff + jr z, .noMatch2 + ld d, a + ld a, [hli] + cp e + jr c, .loop2 + ld a, e + cp d + jr nc, .match +.noMatch2 + res 2, c + ret + +; GetBattleTransitionID_IsDungeonMap checks if W_CURMAP +; is equal to one of these maps +DungeonMaps1: ; 70a3f (1c:4a3f) + db VIRIDIAN_FOREST + db ROCK_TUNNEL_1 + db SEAFOAM_ISLANDS_1 + db ROCK_TUNNEL_2 + db $FF + +; GetBattleTransitionID_IsDungeonMap checks if W_CURMAP +; is in between or equal to each pair of maps +DungeonMaps2: ; 70a44 (1c:4a44) + ; all MT_MOON maps + db MT_MOON_1 + db MT_MOON_3 + + ; all SS_ANNE maps, VICTORY_ROAD_1, LANCES_ROOM, and HALL_OF_FAME + db SS_ANNE_1 + db HALL_OF_FAME + + ; all POKEMONTOWER maps and Lavender Town buildings + db LAVENDER_POKECENTER + db LAVENDER_HOUSE_2 + + ; SILPH_CO_[2-8]F, MANSION[2-4], SAFARI_ZONE, and UNKNOWN_DUNGEON maps, + ; except for SILPH_CO_1F + db SILPH_CO_2F + db UNKNOWN_DUNGEON_1 + db $FF + +LoadBattleTransitionTile: ; 70a4d (1c:4a4d) + ld hl, vChars1 + $7f0 + ld de, BattleTransitionTile + ld bc, (BANK(BattleTransitionTile) << 8) + $01 + jp CopyVideoData + +BattleTransitionTile: ; 70a59 (1c:4a59) + INCBIN "gfx/battle_transition.2bpp" + +BattleTransition_BlackScreen: ; 70a69 (1c:4a69) + ld a, $ff + ld [rBGP], a + ld [rOBP0], a + ld [rOBP1], a + ret + +; for non-dungeon trainer battles +; called regardless of mon levels, but does an +; outward spiral if enemy is at least 3 levels +; higher than player and does an inward spiral otherwise +BattleTransition_Spiral: ; 70a72 (1c:4a72) + ld a, [wcd47] + and a + jr z, .outwardSpiral + call BattleTransition_InwardSpiral + jr .done +.outwardSpiral + hlCoord 10, 10 + ld a, $3 + ld [wd09f], a + ld a, l + ld [wd09b], a + ld a, h + ld [wd09a], a + ld b, $78 +.loop1 + ld c, $3 +.loop2 + push bc + call BattleTransition_OutwardSpiral_ + pop bc + dec c + jr nz, .loop2 + call DelayFrame + dec b + jr nz, .loop1 +.done + call BattleTransition_BlackScreen + xor a + ld [wd09b], a + ld [wd09a], a + ret + +BattleTransition_InwardSpiral: ; 70aaa (1c:4aaa) + ld a, $7 + ld [wWhichTrade], a + ld hl, wTileMap + ld c, $11 + ld de, $14 + call BattleTransition_InwardSpiral_ + inc c + jr .skip +.loop + ld de, $14 + call BattleTransition_InwardSpiral_ +.skip + inc c + ld de, $1 + call BattleTransition_InwardSpiral_ + dec c + dec c + ld de, $ffec + call BattleTransition_InwardSpiral_ + inc c + ld de, rIE + call BattleTransition_InwardSpiral_ + dec c + dec c + ld a, c + and a + jr nz, .loop + ret + +BattleTransition_InwardSpiral_: ; 70ae0 (1c:4ae0) + push bc +.loop + ld [hl], $ff + add hl, de + push bc + ld a, [wWhichTrade] + dec a + jr nz, .skip + call BattleTransition_TransferDelay3 + ld a, $7 +.skip + ld [wWhichTrade], a + pop bc + dec c + jr nz, .loop + pop bc + ret + +BattleTransition_OutwardSpiral_: ; 70af9 (1c:4af9) + ld bc, $ffec + ld de, $14 + ld a, [wd09b] + ld l, a + ld a, [wd09a] + ld h, a + ld a, [wd09f] + cp $0 + jr z, .zero + cp $1 + jr z, .one + cp $2 + jr z, .two + cp $3 + jr z, .three +.done1 + ld [hl], $ff +.done2_ + ld a, l + ld [wd09b], a + ld a, h + ld [wd09a], a + ret +.zero + dec hl + ld a, [hl] + cp $ff + jr nz, .done2 + inc hl + add hl, bc + jr .done1 +.one + add hl, de + ld a, [hl] + cp $ff + jr nz, .done2 + add hl, bc + dec hl + jr .done1 +.two + inc hl + ld a, [hl] + cp $ff + jr nz, .done2 + dec hl + add hl, de + jr .done1 +.three + add hl, bc + ld a, [hl] + cp $ff + jr nz, .done2 + add hl, de + inc hl + jr .done1 +.done2 + ld [hl], $ff + ld a, [wd09f] + inc a + cp $4 + jr nz, .skip + xor a +.skip + ld [wd09f], a + jr .done2_ + +FlashScreen: +BattleTransition_FlashScreen_: ; 70b5d (1c:4b5d) + ld hl, BattleTransition_FlashScreenPalettes +.loop + ld a, [hli] + cp $1 + jr z, .done + ld [rBGP], a + ld c, $2 + call DelayFrames + jr .loop +.done + dec b + jr nz, BattleTransition_FlashScreen_ + ret + +BattleTransition_FlashScreenPalettes: ; 70b72 (1c:4b72) + db $F9,$FE,$FF,$FE,$F9,$E4,$90,$40,$00,$40,$90,$E4 + db $01 ; terminator + +; used for low level trainer dungeon battles +BattleTransition_Shrink: ; 70b7f (1c:4b7f) + ld c, $9 +.loop + push bc + xor a + ld [H_AUTOBGTRANSFERENABLED], a + hlCoord 0, 7 + deCoord 0, 8 + ld bc, $ffd8 + call BattleTransition_CopyTiles1 + hlCoord 0, 10 + deCoord 0, 9 + ld bc, $28 + call BattleTransition_CopyTiles1 + hlCoord 8, 0 + deCoord 9, 0 + ld bc, $fffe + call BattleTransition_CopyTiles2 + hlCoord 11, 0 + deCoord 10, 0 + ld bc, $2 + call BattleTransition_CopyTiles2 + ld a, $1 + ld [H_AUTOBGTRANSFERENABLED], a + ld c, $6 + call DelayFrames + pop bc + dec c + jr nz, .loop + call BattleTransition_BlackScreen + ld c, $a + jp DelayFrames + +; used for high level trainer dungeon battles +BattleTransition_Split: ; 70bca (1c:4bca) + ld c, $9 + xor a + ld [H_AUTOBGTRANSFERENABLED], a +.loop + push bc + hlCoord 0, 16 + deCoord 0, 17 + ld bc, $ffd8 + call BattleTransition_CopyTiles1 + hlCoord 0, 1 + ld de, wTileMap + ld bc, $28 + call BattleTransition_CopyTiles1 + hlCoord 18, 0 + deCoord 19, 0 + ld bc, $fffe + call BattleTransition_CopyTiles2 + hlCoord 1, 0 + ld de, wTileMap + ld bc, $2 + call BattleTransition_CopyTiles2 + call BattleTransition_TransferDelay3 + call Delay3 + pop bc + dec c + jr nz, .loop + call BattleTransition_BlackScreen + ld c, $a + jp DelayFrames + +BattleTransition_CopyTiles1: ; 70c12 (1c:4c12) + ld a, c + ld [wWhichTrade], a + ld a, b + ld [wTrainerEngageDistance], a + ld c, $8 +.loop1 + push bc + push hl + push de + ld bc, $14 + call CopyData + pop hl + pop de + ld a, [wWhichTrade] + ld c, a + ld a, [wTrainerEngageDistance] + ld b, a + add hl, bc + pop bc + dec c + jr nz, .loop1 + ld l, e + ld h, d + ld a, $ff + ld c, $14 +.loop2 + ld [hli], a + dec c + jr nz, .loop2 + ret + +BattleTransition_CopyTiles2: ; 70c3f (1c:4c3f) + ld a, c + ld [wWhichTrade], a + ld a, b + ld [wTrainerEngageDistance], a + ld c, $9 +.loop1 + push bc + push hl + push de + ld c, $12 +.loop2 + ld a, [hl] + ld [de], a + ld a, e + add $14 + jr nc, .noCarry1 + inc d +.noCarry1 + ld e, a + ld a, l + add $14 + jr nc, .noCarry2 + inc h +.noCarry2 + ld l, a + dec c + jr nz, .loop2 + pop hl + pop de + ld a, [wWhichTrade] + ld c, a + ld a, [wTrainerEngageDistance] + ld b, a + add hl, bc + pop bc + dec c + jr nz, .loop1 + ld l, e + ld h, d + ld de, $14 + ld c, $12 +.loop3 + ld [hl], $ff + add hl, de + dec c + jr nz, .loop3 + ret + +; used for high level wild dungeon battles +BattleTransition_VerticalStripes: ; 70c7e (1c:4c7e) + ld c, $12 + ld hl, wTileMap + deCoord 1, 17 + xor a + ld [H_AUTOBGTRANSFERENABLED], a +.loop + push bc + push hl + push de + push de + call BattleTransition_VerticalStripes_ + pop hl + call BattleTransition_VerticalStripes_ + call BattleTransition_TransferDelay3 + pop hl + ld bc, $ffec + add hl, bc + ld e, l + ld d, h + pop hl + ld bc, $14 + add hl, bc + pop bc + dec c + jr nz, .loop + jp BattleTransition_BlackScreen + +BattleTransition_VerticalStripes_: ; 70caa (1c:4caa) + ld c, $a +.loop + ld [hl], $ff + inc hl + inc hl + dec c + jr nz, .loop + ret + +; used for low level wild dungeon battles +BattleTransition_HorizontalStripes: ; 70cb4 (1c:4cb4) + ld c, $14 + ld hl, wTileMap + deCoord 19, 1 + xor a + ld [H_AUTOBGTRANSFERENABLED], a +.loop + push bc + push hl + push de + push de + call BattleTransition_HorizontalStripes_ + pop hl + call BattleTransition_HorizontalStripes_ + call BattleTransition_TransferDelay3 + pop de + pop hl + pop bc + inc hl + dec de + dec c + jr nz, .loop + jp BattleTransition_BlackScreen + +BattleTransition_HorizontalStripes_: ; 70cd8 (1c:4cd8) + ld c, $9 + ld de, $28 +.loop + ld [hl], $ff + add hl, de + dec c + jr nz, .loop + ret + +; used for high level wild non-dungeon battles +; makes one full circle around the screen +; by animating each half circle one at a time +BattleTransition_Circle: ; 70ce4 (1c:4ce4) + call BattleTransition_FlashScreen + ld bc, $000a + ld hl, BattleTransition_HalfCircle1 + call BattleTransition_Circle_Sub1 + ld c, $a + ld b, $1 + ld hl, BattleTransition_HalfCircle2 + call BattleTransition_Circle_Sub1 + jp BattleTransition_BlackScreen + +BattleTransition_FlashScreen: ; 70cfd (1c:4cfd) + ld b, $3 + call BattleTransition_FlashScreen_ + xor a + ld [H_AUTOBGTRANSFERENABLED], a + ret + +BattleTransition_Circle_Sub1: ; 70d06 (1c:4d06) + push bc + push hl + ld a, b + call BattleTransition_Circle_Sub2 + pop hl + ld bc, $0005 + add hl, bc + call BattleTransition_TransferDelay3 + pop bc + dec c + jr nz, BattleTransition_Circle_Sub1 + ret + +BattleTransition_TransferDelay3: ; 70d19 (1c:4d19) + ld a, $1 + ld [H_AUTOBGTRANSFERENABLED], a + call Delay3 + xor a + ld [H_AUTOBGTRANSFERENABLED], a + ret + +; used for low level wild non-dungeon battles +; makes two half circles around the screen +; by animating both half circles at the same time +BattleTransition_DoubleCircle: ; 70d24 (1c:4d24) + call BattleTransition_FlashScreen + ld c, $a + ld hl, BattleTransition_HalfCircle1 + ld de, BattleTransition_HalfCircle2 +.loop + push bc + push hl + push de + push de + xor a + call BattleTransition_Circle_Sub2 + pop hl + ld a, $1 + call BattleTransition_Circle_Sub2 + pop hl + ld bc, $5 + add hl, bc + ld e, l + ld d, h + pop hl + add hl, bc + call BattleTransition_TransferDelay3 + pop bc + dec c + jr nz, .loop + jp BattleTransition_BlackScreen + +BattleTransition_Circle_Sub2: ; 70d50 (1c:4d50) + ld [wWhichTrade], a + ld a, [hli] + ld [wTrainerEngageDistance], a + ld a, [hli] + ld e, a + ld a, [hli] + ld d, a + ld a, [hli] + ld h, [hl] + ld l, a + jp BattleTransition_Circle_Sub3 + +BattleTransition_HalfCircle1: ; 70d61 (1c:4d61) + db $01 + dw BattleTransition_CircleData1 + dwCoord 18, 6 + + db $01 + dw BattleTransition_CircleData2 + dwCoord 19, 3 + + db $01 + dw BattleTransition_CircleData3 + dwCoord 18, 0 + + db $01 + dw BattleTransition_CircleData4 + dwCoord 14, 0 + + db $01 + dw BattleTransition_CircleData5 + dwCoord 10, 0 + + db $00 + dw BattleTransition_CircleData5 + dwCoord 9, 0 + + db $00 + dw BattleTransition_CircleData4 + dwCoord 5, 0 + + db $00 + dw BattleTransition_CircleData3 + dwCoord 1, 0 + + db $00 + dw BattleTransition_CircleData2 + dwCoord 0, 3 + + db $00 + dw BattleTransition_CircleData1 + dwCoord 1, 6 + +BattleTransition_HalfCircle2: ; 70d93 (1c:4d93) + db $00 + dw BattleTransition_CircleData1 + dwCoord 1, 11 + + db $00 + dw BattleTransition_CircleData2 + dwCoord 0, 14 + + db $00 + dw BattleTransition_CircleData3 + dwCoord 1, 17 + + db $00 + dw BattleTransition_CircleData4 + dwCoord 5, 17 + + db $00 + dw BattleTransition_CircleData5 + dwCoord 9, 17 + + db $01 + dw BattleTransition_CircleData5 + dwCoord 10, 17 + + db $01 + dw BattleTransition_CircleData4 + dwCoord 14, 17 + + db $01 + dw BattleTransition_CircleData3 + dwCoord 18, 17 + + db $01 + dw BattleTransition_CircleData2 + dwCoord 19, 14 + + db $01 + dw BattleTransition_CircleData1 + dwCoord 18, 11 + +BattleTransition_Circle_Sub3: ; 70dc5 (1c:4dc5) + push hl + ld a, [de] + ld c, a + inc de +.loop1 + ld [hl], $ff + ld a, [wTrainerEngageDistance] + and a + jr z, .skip1 + inc hl + jr .skip2 +.skip1 + dec hl +.skip2 + dec c + jr nz, .loop1 + pop hl + ld a, [wWhichTrade] + and a + ld bc, $14 + jr z, .skip3 + ld bc, $ffec +.skip3 + add hl, bc + ld a, [de] + inc de + cp $ff + ret z + and a + jr z, BattleTransition_Circle_Sub3 + ld c, a +.loop2 + ld a, [wTrainerEngageDistance] + and a + jr z, .skip4 + dec hl + jr .skip5 +.skip4 + inc hl +.skip5 + dec c + jr nz, .loop2 + jr BattleTransition_Circle_Sub3 + +BattleTransition_CircleData1: ; 70dfe (1c:4dfe) + db $02,$03,$05,$04,$09,$FF + +BattleTransition_CircleData2: ; 70e04 (1c:4e04) + db $01,$01,$02,$02,$04,$02,$04,$02,$03,$FF + +BattleTransition_CircleData3: ; 70e0e (1c:4e0e) + db $02,$01,$03,$01,$04,$01,$04,$01,$04,$01,$03,$01,$02,$01,$01,$01,$01,$FF + +BattleTransition_CircleData4: ; 70e20 (1c:4e20) + db $04,$01,$04,$00,$03,$01,$03,$00,$02,$01,$02,$00,$01,$FF + +BattleTransition_CircleData5: ; 70e2e (1c:4e2e) + db $04,$00,$03,$00,$03,$00,$02,$00,$02,$00,$01,$00,$01,$00,$01,$FF |