[Bug][Move] Refactor moves that call a random move (#3380)
* Combine moveset from allies and uses it to get a move
* Clearer implementation of combining user and teammates' moves
* Refactor assist and sleep talk to use metronome's attribute for calling a move
* Refactor move filtering in RandomMovesetMoveAttr, creates arrays with invalid moves for assist/sleep talk
* Refactor RandomMoveAttr to set moveId in condition, places reused code in callMove in RandomMoveAttr
* Correct invalid move lists, adds Max/Z moves to metronome's list
* Remove ignoresVirtual from beta merge
* Remove Max/Z moves per frutescens' comment
* Fix bug with metronome/copycat/assist/sleep talk targeting ally
* Experimental async/await to be tested
* Refactor other attributes to extend CallMoveAttr
* Replace QueuedMove with TurnMove, refactor to attempt two-turn move fix for metronome
* Fix Swallow test due to TurnMove refactor
* Further fixes for TurnMove refactor
* Fix metronome two turn moves for enemy pokemon
* Replace nested ternary with if-else block per DayKev's comment
* Minor fixes
* Adjust command phase args handling
* Create metronome test, refactor RandomMoveAttr for easier testing
* Add unit test for recharge moves
* Refactor Copycat and Mirror Move, adjust move targeting
* Add unit test for ally targeting with Aromatic Mist
* Add tests for secondary effects and recharge moves for metronome
* Add test for Roar, remove test for Acupressure
* Create test for Assist
* Add test for assist failing
* Add sleep talk unit test coverage
* Adjust move-phase to better track last move for copycat, write and update unit tests for assist/copycat
* Create moveHistory in Battle to track all moves used, adjust mirror move to use this, writes unit tests
* Correct mirror move implementation, rewrite unit test to adjust
* Add docs to attrs, update assist to only grab allies sets
* Update assist unit test to match expected functionality
* Update metronome unit test to use getMoveOverride
* Update copycat unit test to use metronome getMoveOverride mock
* Fix phase interception
* Add docs from missed conversations
* Update assist tests to use manual moveset overrides
Minor fixes to other tests
* Remove `export` from `CallMoveAttr`
* Add missing `.unimplemented()` to some Max- and Z-Moves
---------
Co-authored-by: Tempoanon <163687446+Tempo-anon@users.noreply.github.com>
Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com>
2025-01-14 18:26:35 -05:00
import { Stat } from "#app/enums/stat" ;
import { StatusEffect } from "#app/enums/status-effect" ;
import { MoveResult } from "#app/field/pokemon" ;
import { Abilities } from "#enums/abilities" ;
import { Moves } from "#enums/moves" ;
import { Species } from "#enums/species" ;
2025-02-22 22:52:07 -06:00
import GameManager from "#test/testUtils/gameManager" ;
[Bug][Move] Refactor moves that call a random move (#3380)
* Combine moveset from allies and uses it to get a move
* Clearer implementation of combining user and teammates' moves
* Refactor assist and sleep talk to use metronome's attribute for calling a move
* Refactor move filtering in RandomMovesetMoveAttr, creates arrays with invalid moves for assist/sleep talk
* Refactor RandomMoveAttr to set moveId in condition, places reused code in callMove in RandomMoveAttr
* Correct invalid move lists, adds Max/Z moves to metronome's list
* Remove ignoresVirtual from beta merge
* Remove Max/Z moves per frutescens' comment
* Fix bug with metronome/copycat/assist/sleep talk targeting ally
* Experimental async/await to be tested
* Refactor other attributes to extend CallMoveAttr
* Replace QueuedMove with TurnMove, refactor to attempt two-turn move fix for metronome
* Fix Swallow test due to TurnMove refactor
* Further fixes for TurnMove refactor
* Fix metronome two turn moves for enemy pokemon
* Replace nested ternary with if-else block per DayKev's comment
* Minor fixes
* Adjust command phase args handling
* Create metronome test, refactor RandomMoveAttr for easier testing
* Add unit test for recharge moves
* Refactor Copycat and Mirror Move, adjust move targeting
* Add unit test for ally targeting with Aromatic Mist
* Add tests for secondary effects and recharge moves for metronome
* Add test for Roar, remove test for Acupressure
* Create test for Assist
* Add test for assist failing
* Add sleep talk unit test coverage
* Adjust move-phase to better track last move for copycat, write and update unit tests for assist/copycat
* Create moveHistory in Battle to track all moves used, adjust mirror move to use this, writes unit tests
* Correct mirror move implementation, rewrite unit test to adjust
* Add docs to attrs, update assist to only grab allies sets
* Update assist unit test to match expected functionality
* Update metronome unit test to use getMoveOverride
* Update copycat unit test to use metronome getMoveOverride mock
* Fix phase interception
* Add docs from missed conversations
* Update assist tests to use manual moveset overrides
Minor fixes to other tests
* Remove `export` from `CallMoveAttr`
* Add missing `.unimplemented()` to some Max- and Z-Moves
---------
Co-authored-by: Tempoanon <163687446+Tempo-anon@users.noreply.github.com>
Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com>
2025-01-14 18:26:35 -05:00
import Phaser from "phaser" ;
import { afterEach , beforeAll , beforeEach , describe , expect , it } from "vitest" ;
describe ( "Moves - Sleep Talk" , ( ) = > {
let phaserGame : Phaser.Game ;
let game : GameManager ;
beforeAll ( ( ) = > {
phaserGame = new Phaser . Game ( {
type : Phaser . HEADLESS ,
} ) ;
} ) ;
afterEach ( ( ) = > {
game . phaseInterceptor . restoreOg ( ) ;
} ) ;
beforeEach ( ( ) = > {
game = new GameManager ( phaserGame ) ;
game . override
. moveset ( [ Moves . SPLASH , Moves . SLEEP_TALK ] )
. statusEffect ( StatusEffect . SLEEP )
. ability ( Abilities . BALL_FETCH )
. battleType ( "single" )
. disableCrits ( )
. enemySpecies ( Species . MAGIKARP )
. enemyAbility ( Abilities . BALL_FETCH )
. enemyMoveset ( Moves . SPLASH )
. enemyLevel ( 100 ) ;
} ) ;
it ( "should fail when the user is not asleep" , async ( ) = > {
game . override . statusEffect ( StatusEffect . NONE ) ;
await game . classicMode . startBattle ( [ Species . FEEBAS ] ) ;
game . move . select ( Moves . SLEEP_TALK ) ;
await game . toNextTurn ( ) ;
expect ( game . scene . getPlayerPokemon ( ) ! . getLastXMoves ( ) [ 0 ] . result ) . toBe ( MoveResult . FAIL ) ;
} ) ;
it ( "should fail if the user has no valid moves" , async ( ) = > {
game . override . moveset ( [ Moves . SLEEP_TALK , Moves . DIG , Moves . METRONOME , Moves . SOLAR_BEAM ] ) ;
await game . classicMode . startBattle ( [ Species . FEEBAS ] ) ;
game . move . select ( Moves . SLEEP_TALK ) ;
await game . toNextTurn ( ) ;
expect ( game . scene . getPlayerPokemon ( ) ! . getLastXMoves ( ) [ 0 ] . result ) . toBe ( MoveResult . FAIL ) ;
} ) ;
it ( "should call a random valid move if the user is asleep" , async ( ) = > {
game . override . moveset ( [ Moves . SLEEP_TALK , Moves . DIG , Moves . FLY , Moves . SWORDS_DANCE ] ) ; // Dig and Fly are invalid moves, Swords Dance should always be called
await game . classicMode . startBattle ( [ Species . FEEBAS ] ) ;
game . move . select ( Moves . SLEEP_TALK ) ;
await game . toNextTurn ( ) ;
expect ( game . scene . getPlayerPokemon ( ) ! . getStatStage ( Stat . ATK ) ) ;
} ) ;
it ( "should apply secondary effects of a move" , async ( ) = > {
game . override . moveset ( [ Moves . SLEEP_TALK , Moves . DIG , Moves . FLY , Moves . WOOD_HAMMER ] ) ; // Dig and Fly are invalid moves, Wood Hammer should always be called
await game . classicMode . startBattle ( ) ;
game . move . select ( Moves . SLEEP_TALK ) ;
await game . toNextTurn ( ) ;
expect ( game . scene . getPlayerPokemon ( ) ! . isFullHp ( ) ) . toBeFalsy ( ) ; // Wood Hammer recoil effect should be applied
} ) ;
} ) ;