2024-05-05 16:30:00 +02:00
import BattleScene from "../battle-scene" ;
2024-05-01 02:32:02 +02:00
import { addBBCodeTextObject , addTextObject , getTextColor , TextStyle } from "./text" ;
2024-01-09 23:34:43 -05:00
import { Mode } from "./ui" ;
2023-03-28 14:54:52 -04:00
import * as Utils from "../utils" ;
import MessageUiHandler from "./message-ui-handler" ;
2023-04-20 15:46:05 -04:00
import { getStatName , Stat } from "../data/pokemon-stat" ;
2024-03-31 21:14:35 -04:00
import { addWindow } from "./ui-theme" ;
2024-05-01 09:44:57 -04:00
import BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext" ;
2024-06-13 18:44:23 -04:00
import { Button } from "#enums/buttons" ;
2024-06-17 17:05:33 -04:00
import i18next from "i18next" ;
2023-03-28 14:54:52 -04:00
export default class BattleMessageUiHandler extends MessageUiHandler {
private levelUpStatsContainer : Phaser.GameObjects.Container ;
private levelUpStatsIncrContent : Phaser.GameObjects.Text ;
2024-05-01 02:32:02 +02:00
private levelUpStatsValuesContent : BBCodeText ;
2024-03-21 00:57:28 -04:00
private nameBox : Phaser.GameObjects.NineSlice ;
2023-10-18 18:01:15 -04:00
private nameText : Phaser.GameObjects.Text ;
2023-03-28 14:54:52 -04:00
2024-06-23 12:09:23 -04:00
public bg : Phaser.GameObjects.Sprite ;
2023-12-20 22:22:15 -05:00
public commandWindow : Phaser.GameObjects.NineSlice ;
public movesWindowContainer : Phaser.GameObjects.Container ;
2023-10-18 18:01:15 -04:00
public nameBoxContainer : Phaser.GameObjects.Container ;
2023-03-28 14:54:52 -04:00
constructor ( scene : BattleScene ) {
super ( scene , Mode . MESSAGE ) ;
}
2023-10-18 18:01:15 -04:00
setup ( ) : void {
2023-03-28 14:54:52 -04:00
const ui = this . getUi ( ) ;
this . textTimer = null ;
this . textCallbackTimer = null ;
2024-06-23 12:09:23 -04:00
this . bg = this . scene . add . sprite ( 0 , 0 , "bg" , this . scene . windowType ) ;
this . bg . setName ( "sprite-battle-msg-bg" ) ;
this . bg . setOrigin ( 0 , 1 ) ;
ui . add ( this . bg ) ;
2023-03-28 14:54:52 -04:00
2024-06-23 12:09:23 -04:00
this . commandWindow = addWindow ( this . scene , 202 , 0 , 118 , 48 ) ;
this . commandWindow . setName ( "window-command" ) ;
2023-12-20 22:22:15 -05:00
this . commandWindow . setOrigin ( 0 , 1 ) ;
this . commandWindow . setVisible ( false ) ;
ui . add ( this . commandWindow ) ;
2024-06-23 12:09:23 -04:00
this . movesWindowContainer = this . scene . add . container ( 0 , 0 ) ;
this . movesWindowContainer . setName ( "moves-bg" ) ;
2023-12-20 22:22:15 -05:00
this . movesWindowContainer . setVisible ( false ) ;
2024-06-23 12:09:23 -04:00
const movesWindow = addWindow ( this . scene , 0 , 0 , 243 , 48 ) ;
movesWindow . setName ( "moves-window" ) ;
2023-12-20 22:22:15 -05:00
movesWindow . setOrigin ( 0 , 1 ) ;
2024-06-23 12:09:23 -04:00
const moveDetailsWindow = addWindow ( this . scene , 240 , 0 , 80 , 48 , false , false , - 1 , 132 ) ;
moveDetailsWindow . setName ( "move-details-window" ) ;
2023-12-20 22:22:15 -05:00
moveDetailsWindow . setOrigin ( 0 , 1 ) ;
2024-06-23 12:09:23 -04:00
this . movesWindowContainer . add ( [ movesWindow , moveDetailsWindow ] ) ;
2023-12-20 22:22:15 -05:00
ui . add ( this . movesWindowContainer ) ;
2023-03-28 14:54:52 -04:00
const messageContainer = this . scene . add . container ( 12 , - 39 ) ;
ui . add ( messageContainer ) ;
2024-05-23 17:03:10 +02:00
const message = addTextObject ( this . scene , 0 , 0 , "" , TextStyle . MESSAGE , {
2023-03-28 14:54:52 -04:00
maxLines : 2 ,
wordWrap : {
width : 1780
}
} ) ;
messageContainer . add ( message ) ;
this . message = message ;
2023-10-18 18:01:15 -04:00
this . nameBoxContainer = this . scene . add . container ( 0 , - 16 ) ;
this . nameBoxContainer . setVisible ( false ) ;
2024-05-23 17:03:10 +02:00
this . nameBox = this . scene . add . nineslice ( 0 , 0 , "namebox" , this . scene . windowType , 72 , 16 , 8 , 8 , 5 , 5 ) ;
2024-03-21 00:57:28 -04:00
this . nameBox . setOrigin ( 0 , 0 ) ;
2023-10-18 18:01:15 -04:00
2024-05-23 17:03:10 +02:00
this . nameText = addTextObject ( this . scene , 8 , 0 , "Rival" , TextStyle . MESSAGE , { maxLines : 1 } ) ;
2023-10-18 18:01:15 -04:00
2024-03-21 00:57:28 -04:00
this . nameBoxContainer . add ( this . nameBox ) ;
2023-10-18 18:01:15 -04:00
this . nameBoxContainer . add ( this . nameText ) ;
messageContainer . add ( this . nameBoxContainer ) ;
2024-05-23 17:03:10 +02:00
const prompt = this . scene . add . sprite ( 0 , 0 , "prompt" ) ;
2023-03-28 14:54:52 -04:00
prompt . setVisible ( false ) ;
prompt . setOrigin ( 0 , 0 ) ;
messageContainer . add ( prompt ) ;
this . prompt = prompt ;
const levelUpStatsContainer = this . scene . add . container ( 0 , 0 ) ;
levelUpStatsContainer . setVisible ( false ) ;
ui . add ( levelUpStatsContainer ) ;
this . levelUpStatsContainer = levelUpStatsContainer ;
2024-05-23 17:03:10 +02:00
const levelUpStatsLabelsContent = addTextObject ( this . scene , ( this . scene . game . canvas . width / 6 ) - 73 , - 94 , "" , TextStyle . WINDOW , { maxLines : 6 } ) ;
let levelUpStatsLabelText = "" ;
2023-03-28 14:54:52 -04:00
const stats = Utils . getEnumValues ( Stat ) ;
2024-05-23 17:03:10 +02:00
for ( const s of stats ) {
2023-03-28 14:54:52 -04:00
levelUpStatsLabelText += ` ${ getStatName ( s ) } \ n ` ;
2024-05-23 17:03:10 +02:00
}
2023-03-28 14:54:52 -04:00
levelUpStatsLabelsContent . text = levelUpStatsLabelText ;
2024-05-01 02:32:02 +02:00
levelUpStatsLabelsContent . x -= levelUpStatsLabelsContent . displayWidth ;
const levelUpStatsBg = addWindow ( this . scene , ( this . scene . game . canvas . width / 6 ) , - 100 , 80 + levelUpStatsLabelsContent . displayWidth , 100 ) ;
levelUpStatsBg . setOrigin ( 1 , 0 ) ;
levelUpStatsContainer . add ( levelUpStatsBg ) ;
2023-03-28 14:54:52 -04:00
levelUpStatsContainer . add ( levelUpStatsLabelsContent ) ;
2024-05-23 17:03:10 +02:00
const levelUpStatsIncrContent = addTextObject ( this . scene , ( this . scene . game . canvas . width / 6 ) - 50 , - 94 , "+\n+\n+\n+\n+\n+" , TextStyle . WINDOW , { maxLines : 6 } ) ;
2023-03-28 14:54:52 -04:00
levelUpStatsContainer . add ( levelUpStatsIncrContent ) ;
this . levelUpStatsIncrContent = levelUpStatsIncrContent ;
2024-05-23 17:03:10 +02:00
const levelUpStatsValuesContent = addBBCodeTextObject ( this . scene , ( this . scene . game . canvas . width / 6 ) - 7 , - 94 , "" , TextStyle . WINDOW , { maxLines : 6 , lineSpacing : 5 } ) ;
2023-03-28 14:54:52 -04:00
levelUpStatsValuesContent . setOrigin ( 1 , 0 ) ;
2024-05-23 17:03:10 +02:00
levelUpStatsValuesContent . setAlign ( "right" ) ;
2023-03-28 14:54:52 -04:00
levelUpStatsContainer . add ( levelUpStatsValuesContent ) ;
this . levelUpStatsValuesContent = levelUpStatsValuesContent ;
}
2023-12-30 18:41:25 -05:00
show ( args : any [ ] ) : boolean {
2023-03-28 14:54:52 -04:00
super . show ( args ) ;
2023-12-20 22:22:15 -05:00
this . commandWindow . setVisible ( false ) ;
this . movesWindowContainer . setVisible ( false ) ;
2023-03-28 14:54:52 -04:00
this . message . setWordWrapWidth ( 1780 ) ;
2023-12-30 18:41:25 -05:00
return true ;
2023-03-28 14:54:52 -04:00
}
2023-11-12 00:31:40 -05:00
processInput ( button : Button ) : boolean {
2023-03-28 14:54:52 -04:00
const ui = this . getUi ( ) ;
if ( this . awaitingActionInput ) {
2023-04-11 00:24:55 -04:00
if ( button === Button . CANCEL || button === Button . ACTION ) {
2023-03-28 14:54:52 -04:00
if ( this . onActionInput ) {
ui . playSelect ( ) ;
const originalOnActionInput = this . onActionInput ;
this . onActionInput = null ;
originalOnActionInput ( ) ;
2023-11-12 00:31:40 -05:00
return true ;
2023-03-28 14:54:52 -04:00
}
}
}
2024-08-07 09:23:12 -07:00
return false ;
2023-03-28 14:54:52 -04:00
}
2023-10-29 16:05:17 -04:00
clear() {
2023-03-28 14:54:52 -04:00
super . clear ( ) ;
}
2024-08-07 09:23:12 -07:00
showText ( text : string , delay? : integer | null , callback? : Function | null , callbackDelay? : integer | null , prompt? : boolean | null , promptDelay? : integer | null ) {
2023-10-18 18:01:15 -04:00
this . hideNameText ( ) ;
super . showText ( text , delay , callback , callbackDelay , prompt , promptDelay ) ;
}
2024-08-07 09:23:12 -07:00
showDialogue ( text : string , name? : string , delay? : integer | null , callback? : Function , callbackDelay? : integer , prompt? : boolean , promptDelay? : integer ) {
name && this . showNameText ( name ) ;
2023-10-18 18:01:15 -04:00
super . showDialogue ( text , name , delay , callback , callbackDelay , prompt , promptDelay ) ;
}
2023-11-12 12:49:06 -05:00
promptLevelUpStats ( partyMemberIndex : integer , prevStats : integer [ ] , showTotals : boolean ) : Promise < void > {
return new Promise ( resolve = > {
2024-05-23 17:03:10 +02:00
if ( ! this . scene . showLevelUpStats ) {
2023-11-12 12:49:06 -05:00
return resolve ( ) ;
2024-05-23 17:03:10 +02:00
}
2023-11-12 12:49:06 -05:00
const newStats = ( this . scene as BattleScene ) . getParty ( ) [ partyMemberIndex ] . stats ;
2024-05-23 17:03:10 +02:00
let levelUpStatsValuesText = "" ;
2023-11-12 12:49:06 -05:00
const stats = Utils . getEnumValues ( Stat ) ;
2024-05-23 17:03:10 +02:00
for ( const s of stats ) {
2023-11-12 12:49:06 -05:00
levelUpStatsValuesText += ` ${ showTotals ? newStats [ s ] : newStats [ s ] - prevStats [ s ] } \ n ` ;
2024-05-23 17:03:10 +02:00
}
2023-11-12 12:49:06 -05:00
this . levelUpStatsValuesContent . text = levelUpStatsValuesText ;
this . levelUpStatsIncrContent . setVisible ( ! showTotals ) ;
this . levelUpStatsContainer . setVisible ( true ) ;
this . awaitingActionInput = true ;
this . onActionInput = ( ) = > {
2024-05-23 17:03:10 +02:00
if ( ! showTotals ) {
2024-08-07 09:23:12 -07:00
return this . promptLevelUpStats ( partyMemberIndex , [ ] , true ) . then ( ( ) = > resolve ( ) ) ;
2024-05-23 17:03:10 +02:00
} else {
2023-11-12 12:49:06 -05:00
this . levelUpStatsContainer . setVisible ( false ) ;
resolve ( ) ;
}
} ;
} ) ;
}
promptIvs ( pokemonId : integer , ivs : integer [ ] , shownIvsCount : integer ) : Promise < void > {
return new Promise ( resolve = > {
this . scene . executeWithSeedOffset ( ( ) = > {
2024-05-23 17:03:10 +02:00
let levelUpStatsValuesText = "" ;
2023-11-12 12:49:06 -05:00
const stats = Utils . getEnumValues ( Stat ) ;
2024-08-08 15:04:12 +10:00
const shownStats = this . getTopIvs ( ivs , shownIvsCount ) ;
2024-05-23 17:03:10 +02:00
for ( const s of stats ) {
levelUpStatsValuesText += ` ${ shownStats . indexOf ( s ) > - 1 ? this . getIvDescriptor ( ivs [ s ] , s , pokemonId ) : "???" } \ n ` ;
}
2023-11-12 12:49:06 -05:00
this . levelUpStatsValuesContent . text = levelUpStatsValuesText ;
this . levelUpStatsIncrContent . setVisible ( false ) ;
this . levelUpStatsContainer . setVisible ( true ) ;
this . awaitingActionInput = true ;
this . onActionInput = ( ) = > {
this . levelUpStatsContainer . setVisible ( false ) ;
resolve ( ) ;
} ;
} , pokemonId ) ;
} ) ;
}
2024-08-08 15:04:12 +10:00
getTopIvs ( ivs : integer [ ] , shownIvsCount : integer ) : Stat [ ] {
const stats = Utils . getEnumValues ( Stat ) ;
let shownStats : Stat [ ] = [ ] ;
if ( shownIvsCount < 6 ) {
const statsPool = stats . slice ( 0 ) ;
for ( let i = 0 ; i < shownIvsCount ; i ++ ) {
let shownStat : Stat | null = null ;
let highestIv = - 1 ;
statsPool . map ( s = > {
if ( ivs [ s ] > highestIv ) {
shownStat = s as Stat ;
highestIv = ivs [ s ] ;
}
} ) ;
2024-08-18 15:39:08 +10:00
if ( shownStat !== null && shownStat !== undefined ) {
2024-08-08 15:04:12 +10:00
shownStats . push ( shownStat ) ;
statsPool . splice ( statsPool . indexOf ( shownStat ) , 1 ) ;
}
}
} else {
shownStats = stats ;
}
return shownStats ;
}
2024-05-01 16:50:13 +02:00
getIvDescriptor ( value : integer , typeIv : integer , pokemonId : integer ) : string {
2024-08-08 15:04:12 +10:00
const starterSpecies = this . scene . getPokemonById ( pokemonId ) ! . species . getRootSpeciesId ( ) ; // we are using getRootSpeciesId() here because we want to check against the baby form, not the mid form if it exists
2024-05-01 09:44:57 -04:00
const starterIvs : number [ ] = this . scene . gameData . dexData [ starterSpecies ] . ivs ;
const uiTheme = ( this . scene as BattleScene ) . uiTheme ; // Assuming uiTheme is accessible
2024-05-01 02:32:02 +02:00
// Function to wrap text in color based on comparison
2024-08-08 15:04:12 +10:00
const coloredText = ( text : string , isBetter : boolean , ivValue ) = > {
let textStyle : TextStyle ;
if ( isBetter ) {
if ( ivValue === 31 ) {
textStyle = TextStyle . PERFECT_IV ;
} else {
textStyle = TextStyle . SUMMARY_GREEN ;
}
} else {
textStyle = TextStyle . SUMMARY ;
}
//const textStyle: TextStyle = isBetter ? TextStyle.SUMMARY_GREEN : TextStyle.SUMMARY;
2024-05-01 02:32:02 +02:00
const color = getTextColor ( textStyle , false , uiTheme ) ;
return ` [color= ${ color } ][shadow= ${ getTextColor ( textStyle , true , uiTheme ) } ] ${ text } [/shadow][/color] ` ;
2024-05-23 17:03:10 +02:00
} ;
if ( value > 30 ) {
2024-08-08 15:04:12 +10:00
return coloredText ( i18next . t ( "battleMessageUiHandler:ivBest" ) , value > starterIvs [ typeIv ] , value ) ;
2024-05-23 17:03:10 +02:00
}
if ( value === 30 ) {
2024-08-08 15:04:12 +10:00
return coloredText ( i18next . t ( "battleMessageUiHandler:ivFantastic" ) , value > starterIvs [ typeIv ] , value ) ;
2024-05-23 17:03:10 +02:00
}
if ( value > 20 ) {
2024-08-08 15:04:12 +10:00
return coloredText ( i18next . t ( "battleMessageUiHandler:ivVeryGood" ) , value > starterIvs [ typeIv ] , value ) ;
2024-05-23 17:03:10 +02:00
}
if ( value > 10 ) {
2024-08-08 15:04:12 +10:00
return coloredText ( i18next . t ( "battleMessageUiHandler:ivPrettyGood" ) , value > starterIvs [ typeIv ] , value ) ;
2024-05-23 17:03:10 +02:00
}
if ( value > 0 ) {
2024-08-08 15:04:12 +10:00
return coloredText ( i18next . t ( "battleMessageUiHandler:ivDecent" ) , value > starterIvs [ typeIv ] , value ) ;
2024-05-23 17:03:10 +02:00
}
2024-08-08 15:04:12 +10:00
return coloredText ( i18next . t ( "battleMessageUiHandler:ivNoGood" ) , value > starterIvs [ typeIv ] , value ) ;
2023-03-28 14:54:52 -04:00
}
2023-10-18 18:01:15 -04:00
showNameText ( name : string ) : void {
this . nameBoxContainer . setVisible ( true ) ;
this . nameText . setText ( name ) ;
2024-03-21 00:57:28 -04:00
this . nameBox . width = this . nameText . displayWidth + 16 ;
2023-10-18 18:01:15 -04:00
}
hideNameText ( ) : void {
this . nameBoxContainer . setVisible ( false ) ;
}
2024-05-01 02:32:02 +02:00
}