2025-01-12 15:33:05 -08:00
|
|
|
import type BattleScene from "#app/battle-scene";
|
2024-09-13 22:05:58 -04:00
|
|
|
import { getPokemonSpecies } from "#app/data/pokemon-species";
|
2025-01-12 15:33:05 -08:00
|
|
|
import { PlayerPokemon } from "#app/field/pokemon";
|
|
|
|
import { ModifierTier } from "#app/modifier/modifier-tier";
|
|
|
|
import type { CustomModifierSettings } from "#app/modifier/modifier-type";
|
|
|
|
import { ModifierTypeOption, modifierTypes } from "#app/modifier/modifier-type";
|
2024-09-13 22:05:58 -04:00
|
|
|
import { SelectModifierPhase } from "#app/phases/select-modifier-phase";
|
2025-01-12 15:33:05 -08:00
|
|
|
import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler";
|
|
|
|
import { Mode } from "#app/ui/ui";
|
|
|
|
import { shiftCharCodes } from "#app/utils";
|
|
|
|
import { Abilities } from "#enums/abilities";
|
|
|
|
import { Button } from "#enums/buttons";
|
|
|
|
import { Moves } from "#enums/moves";
|
|
|
|
import { Species } from "#enums/species";
|
2025-02-22 22:52:07 -06:00
|
|
|
import GameManager from "#test/testUtils/gameManager";
|
|
|
|
import { initSceneWithoutEncounterPhase } from "#test/testUtils/gameManagerUtils";
|
2025-01-12 15:33:05 -08:00
|
|
|
import Phaser from "phaser";
|
|
|
|
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
|
2024-09-13 22:05:58 -04:00
|
|
|
|
|
|
|
describe("SelectModifierPhase", () => {
|
|
|
|
let phaserGame: Phaser.Game;
|
|
|
|
let game: GameManager;
|
|
|
|
let scene: BattleScene;
|
|
|
|
|
|
|
|
beforeAll(() => {
|
|
|
|
phaserGame = new Phaser.Game({
|
|
|
|
type: Phaser.HEADLESS,
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
beforeEach(() => {
|
|
|
|
game = new GameManager(phaserGame);
|
|
|
|
scene = game.scene;
|
|
|
|
|
2025-01-12 15:33:05 -08:00
|
|
|
game.override
|
|
|
|
.moveset([ Moves.FISSURE, Moves.SPLASH ])
|
|
|
|
.ability(Abilities.NO_GUARD)
|
|
|
|
.startingLevel(200)
|
|
|
|
.enemySpecies(Species.MAGIKARP);
|
2024-09-13 22:05:58 -04:00
|
|
|
});
|
|
|
|
|
|
|
|
afterEach(() => {
|
|
|
|
game.phaseInterceptor.restoreOg();
|
|
|
|
|
|
|
|
vi.clearAllMocks();
|
|
|
|
});
|
|
|
|
|
|
|
|
it("should start a select modifier phase", async () => {
|
2025-01-12 15:33:05 -08:00
|
|
|
initSceneWithoutEncounterPhase(scene, [ Species.ABRA, Species.VOLCARONA ]);
|
|
|
|
const selectModifierPhase = new SelectModifierPhase();
|
2024-09-13 22:05:58 -04:00
|
|
|
scene.pushPhase(selectModifierPhase);
|
|
|
|
await game.phaseInterceptor.run(SelectModifierPhase);
|
|
|
|
|
|
|
|
expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT);
|
|
|
|
});
|
|
|
|
|
|
|
|
it("should generate random modifiers", async () => {
|
2025-01-12 15:33:05 -08:00
|
|
|
await game.classicMode.startBattle([ Species.ABRA, Species.VOLCARONA ]);
|
|
|
|
game.move.select(Moves.FISSURE);
|
|
|
|
await game.phaseInterceptor.to("SelectModifierPhase");
|
2024-09-13 22:05:58 -04:00
|
|
|
|
|
|
|
expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT);
|
|
|
|
const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler;
|
|
|
|
expect(modifierSelectHandler.options.length).toEqual(3);
|
|
|
|
});
|
|
|
|
|
|
|
|
it("should modify reroll cost", async () => {
|
2025-01-12 15:33:05 -08:00
|
|
|
initSceneWithoutEncounterPhase(scene, [ Species.ABRA, Species.VOLCARONA ]);
|
2024-09-13 22:05:58 -04:00
|
|
|
const options = [
|
|
|
|
new ModifierTypeOption(modifierTypes.POTION(), 0, 100),
|
|
|
|
new ModifierTypeOption(modifierTypes.ETHER(), 0, 400),
|
|
|
|
new ModifierTypeOption(modifierTypes.REVIVE(), 0, 1000)
|
|
|
|
];
|
|
|
|
|
2025-01-12 15:33:05 -08:00
|
|
|
const selectModifierPhase1 = new SelectModifierPhase(0, undefined, { guaranteedModifierTypeOptions: options });
|
|
|
|
const selectModifierPhase2 = new SelectModifierPhase(0, undefined, { guaranteedModifierTypeOptions: options, rerollMultiplier: 2 });
|
2024-09-13 22:05:58 -04:00
|
|
|
|
2024-10-15 18:06:56 -07:00
|
|
|
const cost1 = selectModifierPhase1.getRerollCost(false);
|
|
|
|
const cost2 = selectModifierPhase2.getRerollCost(false);
|
2024-09-13 22:05:58 -04:00
|
|
|
expect(cost2).toEqual(cost1 * 2);
|
|
|
|
});
|
|
|
|
|
2025-01-12 15:33:05 -08:00
|
|
|
it.todo("should generate random modifiers from reroll", async () => {
|
|
|
|
await game.classicMode.startBattle([ Species.ABRA, Species.VOLCARONA ]);
|
|
|
|
scene.money = 1000000;
|
|
|
|
scene.shopCursorTarget = 0;
|
|
|
|
|
|
|
|
game.move.select(Moves.FISSURE);
|
|
|
|
await game.phaseInterceptor.to("SelectModifierPhase");
|
2024-09-13 22:05:58 -04:00
|
|
|
|
2025-01-12 15:33:05 -08:00
|
|
|
// TODO: nagivate the ui to reroll somehow
|
|
|
|
//const smphase = scene.getCurrentPhase() as SelectModifierPhase;
|
2024-09-13 22:05:58 -04:00
|
|
|
expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT);
|
|
|
|
const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler;
|
|
|
|
expect(modifierSelectHandler.options.length).toEqual(3);
|
|
|
|
|
2025-01-12 15:33:05 -08:00
|
|
|
modifierSelectHandler.processInput(Button.ACTION);
|
2024-09-13 22:05:58 -04:00
|
|
|
|
2025-01-12 15:33:05 -08:00
|
|
|
expect(scene.money).toBe(1000000 - 250);
|
2024-09-13 22:05:58 -04:00
|
|
|
expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT);
|
|
|
|
expect(modifierSelectHandler.options.length).toEqual(3);
|
|
|
|
});
|
|
|
|
|
2025-01-12 15:33:05 -08:00
|
|
|
it.todo("should generate random modifiers of same tier for reroll with reroll lock", async () => {
|
|
|
|
game.override.startingModifier([{ name: "LOCK_CAPSULE" }]);
|
|
|
|
await game.classicMode.startBattle([ Species.ABRA, Species.VOLCARONA ]);
|
|
|
|
scene.money = 1000000;
|
2024-09-13 22:05:58 -04:00
|
|
|
// Just use fully random seed for this test
|
|
|
|
vi.spyOn(scene, "resetSeed").mockImplementation(() => {
|
2025-01-12 15:33:05 -08:00
|
|
|
scene.waveSeed = shiftCharCodes(scene.seed, 5);
|
2024-10-04 13:08:31 +08:00
|
|
|
Phaser.Math.RND.sow([ scene.waveSeed ]);
|
2024-09-13 22:05:58 -04:00
|
|
|
console.log("Wave Seed:", scene.waveSeed, 5);
|
|
|
|
scene.rngCounter = 0;
|
|
|
|
});
|
|
|
|
|
2025-01-12 15:33:05 -08:00
|
|
|
game.move.select(Moves.FISSURE);
|
|
|
|
await game.phaseInterceptor.to("SelectModifierPhase");
|
2024-09-13 22:05:58 -04:00
|
|
|
|
|
|
|
expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT);
|
|
|
|
const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler;
|
|
|
|
expect(modifierSelectHandler.options.length).toEqual(3);
|
|
|
|
const firstRollTiers: ModifierTier[] = modifierSelectHandler.options.map(o => o.modifierTypeOption.type.tier);
|
|
|
|
|
2025-01-12 15:33:05 -08:00
|
|
|
// TODO: nagivate ui to reroll with lock capsule enabled
|
2024-09-13 22:05:58 -04:00
|
|
|
|
|
|
|
expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT);
|
|
|
|
expect(modifierSelectHandler.options.length).toEqual(3);
|
|
|
|
// Reroll with lock can still upgrade
|
|
|
|
expect(modifierSelectHandler.options[0].modifierTypeOption.type.tier - modifierSelectHandler.options[0].modifierTypeOption.upgradeCount).toEqual(firstRollTiers[0]);
|
|
|
|
expect(modifierSelectHandler.options[1].modifierTypeOption.type.tier - modifierSelectHandler.options[1].modifierTypeOption.upgradeCount).toEqual(firstRollTiers[1]);
|
|
|
|
expect(modifierSelectHandler.options[2].modifierTypeOption.type.tier - modifierSelectHandler.options[2].modifierTypeOption.upgradeCount).toEqual(firstRollTiers[2]);
|
|
|
|
});
|
|
|
|
|
|
|
|
it("should generate custom modifiers", async () => {
|
2025-01-12 15:33:05 -08:00
|
|
|
await game.classicMode.startBattle([ Species.ABRA, Species.VOLCARONA ]);
|
|
|
|
scene.money = 1000000;
|
2024-09-13 22:05:58 -04:00
|
|
|
const customModifiers: CustomModifierSettings = {
|
2024-10-04 13:08:31 +08:00
|
|
|
guaranteedModifierTypeFuncs: [ modifierTypes.MEMORY_MUSHROOM, modifierTypes.TM_ULTRA, modifierTypes.LEFTOVERS, modifierTypes.AMULET_COIN, modifierTypes.GOLDEN_PUNCH ]
|
2024-09-13 22:05:58 -04:00
|
|
|
};
|
2025-01-12 15:33:05 -08:00
|
|
|
const selectModifierPhase = new SelectModifierPhase(0, undefined, customModifiers);
|
|
|
|
scene.unshiftPhase(selectModifierPhase);
|
|
|
|
game.move.select(Moves.SPLASH);
|
|
|
|
await game.phaseInterceptor.to("SelectModifierPhase");
|
2024-09-13 22:05:58 -04:00
|
|
|
|
|
|
|
expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT);
|
|
|
|
const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler;
|
|
|
|
expect(modifierSelectHandler.options.length).toEqual(5);
|
|
|
|
expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toEqual("MEMORY_MUSHROOM");
|
|
|
|
expect(modifierSelectHandler.options[1].modifierTypeOption.type.id).toEqual("TM_ULTRA");
|
|
|
|
expect(modifierSelectHandler.options[2].modifierTypeOption.type.id).toEqual("LEFTOVERS");
|
|
|
|
expect(modifierSelectHandler.options[3].modifierTypeOption.type.id).toEqual("AMULET_COIN");
|
|
|
|
expect(modifierSelectHandler.options[4].modifierTypeOption.type.id).toEqual("GOLDEN_PUNCH");
|
|
|
|
});
|
|
|
|
|
|
|
|
it("should generate custom modifier tiers that can upgrade from luck", async () => {
|
2025-01-12 15:33:05 -08:00
|
|
|
await game.classicMode.startBattle([ Species.ABRA, Species.VOLCARONA ]);
|
|
|
|
scene.money = 1000000;
|
2024-09-13 22:05:58 -04:00
|
|
|
const customModifiers: CustomModifierSettings = {
|
2024-10-04 13:08:31 +08:00
|
|
|
guaranteedModifierTiers: [ ModifierTier.COMMON, ModifierTier.GREAT, ModifierTier.ULTRA, ModifierTier.ROGUE, ModifierTier.MASTER ]
|
2024-09-13 22:05:58 -04:00
|
|
|
};
|
2025-01-12 15:33:05 -08:00
|
|
|
const pokemon = new PlayerPokemon(getPokemonSpecies(Species.BULBASAUR), 10, undefined, 0, undefined, true, 2);
|
2024-09-13 22:05:58 -04:00
|
|
|
|
|
|
|
// Fill party with max shinies
|
2024-11-03 18:53:52 -08:00
|
|
|
while (scene.getPlayerParty().length > 0) {
|
|
|
|
scene.getPlayerParty().pop();
|
2024-09-13 22:05:58 -04:00
|
|
|
}
|
2024-11-03 18:53:52 -08:00
|
|
|
scene.getPlayerParty().push(pokemon, pokemon, pokemon, pokemon, pokemon, pokemon);
|
2024-09-13 22:05:58 -04:00
|
|
|
|
2025-01-12 15:33:05 -08:00
|
|
|
const selectModifierPhase = new SelectModifierPhase(0, undefined, customModifiers);
|
|
|
|
scene.unshiftPhase(selectModifierPhase);
|
|
|
|
game.move.select(Moves.SPLASH);
|
|
|
|
await game.phaseInterceptor.to("SelectModifierPhase");
|
2024-09-13 22:05:58 -04:00
|
|
|
|
|
|
|
expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT);
|
|
|
|
const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler;
|
|
|
|
expect(modifierSelectHandler.options.length).toEqual(5);
|
|
|
|
expect(modifierSelectHandler.options[0].modifierTypeOption.type.tier - modifierSelectHandler.options[0].modifierTypeOption.upgradeCount).toEqual(ModifierTier.COMMON);
|
|
|
|
expect(modifierSelectHandler.options[1].modifierTypeOption.type.tier - modifierSelectHandler.options[1].modifierTypeOption.upgradeCount).toEqual(ModifierTier.GREAT);
|
|
|
|
expect(modifierSelectHandler.options[2].modifierTypeOption.type.tier - modifierSelectHandler.options[2].modifierTypeOption.upgradeCount).toEqual(ModifierTier.ULTRA);
|
|
|
|
expect(modifierSelectHandler.options[3].modifierTypeOption.type.tier - modifierSelectHandler.options[3].modifierTypeOption.upgradeCount).toEqual(ModifierTier.ROGUE);
|
|
|
|
expect(modifierSelectHandler.options[4].modifierTypeOption.type.tier - modifierSelectHandler.options[4].modifierTypeOption.upgradeCount).toEqual(ModifierTier.MASTER);
|
|
|
|
});
|
|
|
|
|
|
|
|
it("should generate custom modifiers and modifier tiers together", async () => {
|
2025-01-12 15:33:05 -08:00
|
|
|
await game.classicMode.startBattle([ Species.ABRA, Species.VOLCARONA ]);
|
|
|
|
scene.money = 1000000;
|
2024-09-13 22:05:58 -04:00
|
|
|
const customModifiers: CustomModifierSettings = {
|
2024-10-04 13:08:31 +08:00
|
|
|
guaranteedModifierTypeFuncs: [ modifierTypes.MEMORY_MUSHROOM, modifierTypes.TM_COMMON ],
|
|
|
|
guaranteedModifierTiers: [ ModifierTier.MASTER, ModifierTier.MASTER ]
|
2024-09-13 22:05:58 -04:00
|
|
|
};
|
2025-01-12 15:33:05 -08:00
|
|
|
const selectModifierPhase = new SelectModifierPhase(0, undefined, customModifiers);
|
|
|
|
scene.unshiftPhase(selectModifierPhase);
|
|
|
|
game.move.select(Moves.SPLASH);
|
2024-09-13 22:05:58 -04:00
|
|
|
await game.phaseInterceptor.run(SelectModifierPhase);
|
|
|
|
|
|
|
|
|
|
|
|
expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT);
|
|
|
|
const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler;
|
|
|
|
expect(modifierSelectHandler.options.length).toEqual(4);
|
|
|
|
expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toEqual("MEMORY_MUSHROOM");
|
|
|
|
expect(modifierSelectHandler.options[1].modifierTypeOption.type.id).toEqual("TM_COMMON");
|
|
|
|
expect(modifierSelectHandler.options[2].modifierTypeOption.type.tier).toEqual(ModifierTier.MASTER);
|
|
|
|
expect(modifierSelectHandler.options[3].modifierTypeOption.type.tier).toEqual(ModifierTier.MASTER);
|
|
|
|
});
|
|
|
|
|
|
|
|
it("should fill remaining modifiers if fillRemaining is true with custom modifiers", async () => {
|
2025-01-12 15:33:05 -08:00
|
|
|
await game.classicMode.startBattle([ Species.ABRA, Species.VOLCARONA ]);
|
|
|
|
scene.money = 1000000;
|
2024-09-13 22:05:58 -04:00
|
|
|
const customModifiers: CustomModifierSettings = {
|
2024-10-04 13:08:31 +08:00
|
|
|
guaranteedModifierTypeFuncs: [ modifierTypes.MEMORY_MUSHROOM ],
|
|
|
|
guaranteedModifierTiers: [ ModifierTier.MASTER ],
|
2024-09-13 22:05:58 -04:00
|
|
|
fillRemaining: true
|
|
|
|
};
|
2025-01-12 15:33:05 -08:00
|
|
|
const selectModifierPhase = new SelectModifierPhase(0, undefined, customModifiers);
|
|
|
|
scene.unshiftPhase(selectModifierPhase);
|
|
|
|
game.move.select(Moves.SPLASH);
|
2024-09-13 22:05:58 -04:00
|
|
|
await game.phaseInterceptor.run(SelectModifierPhase);
|
|
|
|
|
|
|
|
|
|
|
|
expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT);
|
|
|
|
const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler;
|
|
|
|
expect(modifierSelectHandler.options.length).toEqual(3);
|
|
|
|
expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toEqual("MEMORY_MUSHROOM");
|
|
|
|
expect(modifierSelectHandler.options[1].modifierTypeOption.type.tier).toEqual(ModifierTier.MASTER);
|
|
|
|
});
|
|
|
|
});
|