2024-09-07 21:37:37 -07:00
import BattleScene from "#app/battle-scene" ;
import { getCharVariantFromDialogue } from "#app/data/dialogue" ;
import { TrainerType } from "#app/enums/trainer-type" ;
import { modifierTypes } from "#app/modifier/modifier-type" ;
import { vouchers } from "#app/system/voucher" ;
2024-08-19 03:23:52 +01:00
import i18next from "i18next" ;
2024-09-07 21:37:37 -07:00
import * as Utils from "#app/utils" ;
2024-08-19 03:23:52 +01:00
import { BattlePhase } from "./battle-phase" ;
import { ModifierRewardPhase } from "./modifier-reward-phase" ;
import { MoneyRewardPhase } from "./money-reward-phase" ;
2024-08-25 19:52:07 +02:00
import { TrainerSlot } from "#app/data/trainer-config" ;
2024-08-19 03:23:52 +01:00
export class TrainerVictoryPhase extends BattlePhase {
constructor ( scene : BattleScene ) {
super ( scene ) ;
}
start() {
this . scene . disableMenu = true ;
this . scene . playBgm ( this . scene . currentBattle . trainer ? . config . victoryBgm ) ;
this . scene . unshiftPhase ( new MoneyRewardPhase ( this . scene , this . scene . currentBattle . trainer ? . config . moneyMultiplier ! ) ) ; // TODO: is this bang correct?
const modifierRewardFuncs = this . scene . currentBattle . trainer ? . config . modifierRewardFuncs ! ; // TODO: is this bang correct?
for ( const modifierRewardFunc of modifierRewardFuncs ) {
this . scene . unshiftPhase ( new ModifierRewardPhase ( this . scene , modifierRewardFunc ) ) ;
}
2024-10-26 17:14:17 +01:00
if ( this . scene . eventManager . isEventActive ( ) ) {
for ( const rewardFunc of this . scene . currentBattle . trainer ? . config . eventRewardFuncs ! ) {
this . scene . unshiftPhase ( new ModifierRewardPhase ( this . scene , rewardFunc ) ) ;
}
}
2024-08-19 03:23:52 +01:00
const trainerType = this . scene . currentBattle . trainer ? . config . trainerType ! ; // TODO: is this bang correct?
if ( vouchers . hasOwnProperty ( TrainerType [ trainerType ] ) ) {
if ( ! this . scene . validateVoucher ( vouchers [ TrainerType [ trainerType ] ] ) && this . scene . currentBattle . trainer ? . config . isBoss ) {
2024-10-04 13:08:31 +08:00
this . scene . unshiftPhase ( new ModifierRewardPhase ( this . scene , [ modifierTypes . VOUCHER , modifierTypes . VOUCHER , modifierTypes . VOUCHER_PLUS , modifierTypes . VOUCHER_PREMIUM ] [ vouchers [ TrainerType [ trainerType ] ] . voucherType ] ) ) ;
2024-08-19 03:23:52 +01:00
}
}
this . scene . ui . showText ( i18next . t ( "battle:trainerDefeated" , { trainerName : this.scene.currentBattle.trainer?.getName ( TrainerSlot . NONE , true ) } ) , null , ( ) = > {
const victoryMessages = this . scene . currentBattle . trainer ? . getVictoryMessages ( ) ! ; // TODO: is this bang correct?
let message : string ;
this . scene . executeWithSeedOffset ( ( ) = > message = Utils . randSeedItem ( victoryMessages ) , this . scene . currentBattle . waveIndex ) ;
message = message ! ; // tell TS compiler it's defined now
const showMessage = ( ) = > {
const originalFunc = showMessageOrEnd ;
2024-08-25 19:52:07 +02:00
showMessageOrEnd = ( ) = > this . scene . ui . showDialogue ( message , this . scene . currentBattle . trainer ? . getName ( TrainerSlot . TRAINER , true ) , null , originalFunc ) ;
2024-08-19 03:23:52 +01:00
showMessageOrEnd ( ) ;
} ;
let showMessageOrEnd = ( ) = > this . end ( ) ;
if ( victoryMessages ? . length ) {
if ( this . scene . currentBattle . trainer ? . config . hasCharSprite && ! this . scene . ui . shouldSkipDialogue ( message ) ) {
const originalFunc = showMessageOrEnd ;
showMessageOrEnd = ( ) = > this . scene . charSprite . hide ( ) . then ( ( ) = > this . scene . hideFieldOverlay ( 250 ) . then ( ( ) = > originalFunc ( ) ) ) ;
this . scene . showFieldOverlay ( 500 ) . then ( ( ) = > this . scene . charSprite . showCharacter ( this . scene . currentBattle . trainer ? . getKey ( ) ! , getCharVariantFromDialogue ( victoryMessages [ 0 ] ) ) . then ( ( ) = > showMessage ( ) ) ) ; // TODO: is this bang correct?
} else {
showMessage ( ) ;
}
} else {
showMessageOrEnd ( ) ;
}
} , null , true ) ;
this . showEnemyTrainer ( ) ;
}
}