2024-08-06 07:06:25 -07:00
import { afterEach , beforeAll , beforeEach , describe , expect , test } from "vitest" ;
2024-08-03 12:20:19 -07:00
import Phaser from "phaser" ;
2024-08-06 07:06:25 -07:00
import GameManager from "#test/utils/gameManager" ;
import { TurnEndPhase } from "#app/phases" ;
import { getMovePosition } from "#test/utils/gameManagerUtils" ;
2024-08-03 12:20:19 -07:00
import { Moves } from "#enums/moves" ;
import { Species } from "#enums/species" ;
import { BattleStat } from "#app/data/battle-stat" ;
2024-08-06 07:06:25 -07:00
import { SPLASH_ONLY } from "#test/utils/testUtils" ;
2024-08-03 12:20:19 -07:00
const TIMEOUT = 20 * 1000 ;
2024-08-06 07:06:25 -07:00
/** HP Cost of Move */
2024-08-03 12:20:19 -07:00
const RATIO = 3 ;
2024-08-06 07:06:25 -07:00
/** Amount of extra HP lost */
2024-08-03 12:20:19 -07:00
const PREDAMAGE = 15 ;
describe ( "Moves - CLANGOROUS_SOUL" , ( ) = > {
let phaserGame : Phaser.Game ;
let game : GameManager ;
beforeAll ( ( ) = > {
phaserGame = new Phaser . Game ( {
type : Phaser . HEADLESS ,
} ) ;
} ) ;
afterEach ( ( ) = > {
game . phaseInterceptor . restoreOg ( ) ;
} ) ;
beforeEach ( ( ) = > {
game = new GameManager ( phaserGame ) ;
2024-08-06 07:06:25 -07:00
game . override . starterSpecies ( Species . MAGIKARP ) ;
game . override . enemySpecies ( Species . SNORLAX ) ;
game . override . startingLevel ( 100 ) ;
game . override . enemyLevel ( 100 ) ;
2024-08-03 12:20:19 -07:00
game . override . moveset ( [ Moves . CLANGOROUS_SOUL ] ) ;
2024-08-06 07:06:25 -07:00
game . override . enemyMoveset ( SPLASH_ONLY ) ;
2024-08-03 12:20:19 -07:00
} ) ;
//Bulbapedia Reference: https://bulbapedia.bulbagarden.net/wiki/Clangorous_Soul_(move)
test ( "Clangorous Soul raises the user's Attack, Defense, Special Attack, Special Defense and Speed by one stage each, at the cost of 1/3 of its maximum HP" ,
async ( ) = > {
await game . startBattle ( [ Species . MAGIKARP ] ) ;
const leadPokemon = game . scene . getPlayerPokemon ( ) ;
const hpLost = Math . floor ( leadPokemon . getMaxHp ( ) / RATIO ) ;
game . doAttack ( getMovePosition ( game . scene , 0 , Moves . CLANGOROUS_SOUL ) ) ;
await game . phaseInterceptor . to ( TurnEndPhase ) ;
expect ( leadPokemon . hp ) . toBe ( leadPokemon . getMaxHp ( ) - hpLost ) ;
expect ( leadPokemon . summonData . battleStats [ BattleStat . ATK ] ) . toBe ( 1 ) ;
expect ( leadPokemon . summonData . battleStats [ BattleStat . DEF ] ) . toBe ( 1 ) ;
expect ( leadPokemon . summonData . battleStats [ BattleStat . SPATK ] ) . toBe ( 1 ) ;
expect ( leadPokemon . summonData . battleStats [ BattleStat . SPDEF ] ) . toBe ( 1 ) ;
expect ( leadPokemon . summonData . battleStats [ BattleStat . SPD ] ) . toBe ( 1 ) ;
} , TIMEOUT
) ;
test ( "Clangorous Soul will still take effect if one or more of the involved stats are not at max" ,
async ( ) = > {
await game . startBattle ( [ Species . MAGIKARP ] ) ;
const leadPokemon = game . scene . getPlayerPokemon ( ) ;
const hpLost = Math . floor ( leadPokemon . getMaxHp ( ) / RATIO ) ;
//Here - BattleStat.SPD -> 0 and BattleStat.SPDEF -> 4
leadPokemon . summonData . battleStats [ BattleStat . ATK ] = 6 ;
leadPokemon . summonData . battleStats [ BattleStat . DEF ] = 6 ;
leadPokemon . summonData . battleStats [ BattleStat . SPATK ] = 6 ;
leadPokemon . summonData . battleStats [ BattleStat . SPDEF ] = 4 ;
game . doAttack ( getMovePosition ( game . scene , 0 , Moves . CLANGOROUS_SOUL ) ) ;
await game . phaseInterceptor . to ( TurnEndPhase ) ;
expect ( leadPokemon . hp ) . toBe ( leadPokemon . getMaxHp ( ) - hpLost ) ;
expect ( leadPokemon . summonData . battleStats [ BattleStat . ATK ] ) . toBe ( 6 ) ;
expect ( leadPokemon . summonData . battleStats [ BattleStat . DEF ] ) . toBe ( 6 ) ;
expect ( leadPokemon . summonData . battleStats [ BattleStat . SPATK ] ) . toBe ( 6 ) ;
expect ( leadPokemon . summonData . battleStats [ BattleStat . SPDEF ] ) . toBe ( 5 ) ;
expect ( leadPokemon . summonData . battleStats [ BattleStat . SPD ] ) . toBe ( 1 ) ;
} , TIMEOUT
) ;
test ( "Clangorous Soul fails if all stats involved are at max" ,
async ( ) = > {
await game . startBattle ( [ Species . MAGIKARP ] ) ;
const leadPokemon = game . scene . getPlayerPokemon ( ) ;
leadPokemon . summonData . battleStats [ BattleStat . ATK ] = 6 ;
leadPokemon . summonData . battleStats [ BattleStat . DEF ] = 6 ;
leadPokemon . summonData . battleStats [ BattleStat . SPATK ] = 6 ;
leadPokemon . summonData . battleStats [ BattleStat . SPDEF ] = 6 ;
leadPokemon . summonData . battleStats [ BattleStat . SPD ] = 6 ;
game . doAttack ( getMovePosition ( game . scene , 0 , Moves . CLANGOROUS_SOUL ) ) ;
await game . phaseInterceptor . to ( TurnEndPhase ) ;
expect ( leadPokemon . hp ) . toBe ( leadPokemon . getMaxHp ( ) ) ;
expect ( leadPokemon . summonData . battleStats [ BattleStat . ATK ] ) . toBe ( 6 ) ;
expect ( leadPokemon . summonData . battleStats [ BattleStat . DEF ] ) . toBe ( 6 ) ;
expect ( leadPokemon . summonData . battleStats [ BattleStat . SPATK ] ) . toBe ( 6 ) ;
expect ( leadPokemon . summonData . battleStats [ BattleStat . SPDEF ] ) . toBe ( 6 ) ;
expect ( leadPokemon . summonData . battleStats [ BattleStat . SPD ] ) . toBe ( 6 ) ;
} , TIMEOUT
) ;
test ( "Clangorous Soul fails if the user's health is less than 1/3" ,
async ( ) = > {
await game . startBattle ( [ Species . MAGIKARP ] ) ;
const leadPokemon = game . scene . getPlayerPokemon ( ) ;
const hpLost = Math . floor ( leadPokemon . getMaxHp ( ) / RATIO ) ;
leadPokemon . hp = hpLost - PREDAMAGE ;
game . doAttack ( getMovePosition ( game . scene , 0 , Moves . CLANGOROUS_SOUL ) ) ;
await game . phaseInterceptor . to ( TurnEndPhase ) ;
expect ( leadPokemon . hp ) . toBe ( hpLost - PREDAMAGE ) ;
expect ( leadPokemon . summonData . battleStats [ BattleStat . ATK ] ) . toBe ( 0 ) ;
expect ( leadPokemon . summonData . battleStats [ BattleStat . DEF ] ) . toBe ( 0 ) ;
expect ( leadPokemon . summonData . battleStats [ BattleStat . SPATK ] ) . toBe ( 0 ) ;
expect ( leadPokemon . summonData . battleStats [ BattleStat . SPDEF ] ) . toBe ( 0 ) ;
expect ( leadPokemon . summonData . battleStats [ BattleStat . SPD ] ) . toBe ( 0 ) ;
} , TIMEOUT
) ;
} ) ;