mirror of
https://github.com/pagefaultgames/pokerogue.git
synced 2025-08-19 22:09:27 +02:00
Compare commits
8 Commits
965665daeb
...
4ef4570663
Author | SHA1 | Date | |
---|---|---|---|
|
4ef4570663 | ||
|
30058ed70e | ||
|
140e4ab142 | ||
|
76d8357d0b | ||
|
552e002110 | ||
|
22f36e7c18 | ||
|
04734bd9bf | ||
|
e97ef78497 |
@ -81,7 +81,7 @@ For example, here is how you could test a scenario where the player Pokemon has
|
|||||||
```typescript
|
```typescript
|
||||||
const overrides = {
|
const overrides = {
|
||||||
ABILITY_OVERRIDE: AbilityId.DROUGHT,
|
ABILITY_OVERRIDE: AbilityId.DROUGHT,
|
||||||
OPP_MOVESET_OVERRIDE: MoveId.WATER_GUN,
|
ENEMY_MOVESET_OVERRIDE: MoveId.WATER_GUN,
|
||||||
} satisfies Partial<InstanceType<typeof DefaultOverrides>>;
|
} satisfies Partial<InstanceType<typeof DefaultOverrides>>;
|
||||||
```
|
```
|
||||||
|
|
||||||
|
BIN
public/images/ui/champion_ribbon_emerald.png
Normal file
BIN
public/images/ui/champion_ribbon_emerald.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 225 B |
BIN
public/images/ui/legacy/champion_ribbon_emerald.png
Normal file
BIN
public/images/ui/legacy/champion_ribbon_emerald.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 225 B |
Binary file not shown.
Before Width: | Height: | Size: 837 B After Width: | Height: | Size: 799 B |
146
public/images/ui/party_slot_main_short.json
Normal file
146
public/images/ui/party_slot_main_short.json
Normal file
@ -0,0 +1,146 @@
|
|||||||
|
{
|
||||||
|
"textures": [
|
||||||
|
{
|
||||||
|
"image": "party_slot_main_short.png",
|
||||||
|
"format": "RGBA8888",
|
||||||
|
"size": {
|
||||||
|
"w": 110,
|
||||||
|
"h": 294
|
||||||
|
},
|
||||||
|
"scale": 1,
|
||||||
|
"frames": [
|
||||||
|
{
|
||||||
|
"filename": "party_slot_main_short",
|
||||||
|
"rotated": false,
|
||||||
|
"trimmed": false,
|
||||||
|
"sourceSize": {
|
||||||
|
"w": 110,
|
||||||
|
"h": 41
|
||||||
|
},
|
||||||
|
"spriteSourceSize": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"w": 110,
|
||||||
|
"h": 41
|
||||||
|
},
|
||||||
|
"frame": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"w": 110,
|
||||||
|
"h": 41
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "party_slot_main_short_sel",
|
||||||
|
"rotated": false,
|
||||||
|
"trimmed": false,
|
||||||
|
"sourceSize": {
|
||||||
|
"w": 110,
|
||||||
|
"h": 41
|
||||||
|
},
|
||||||
|
"spriteSourceSize": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"w": 110,
|
||||||
|
"h": 41
|
||||||
|
},
|
||||||
|
"frame": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 41,
|
||||||
|
"w": 110,
|
||||||
|
"h": 41
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "party_slot_main_short_fnt",
|
||||||
|
"rotated": false,
|
||||||
|
"trimmed": false,
|
||||||
|
"sourceSize": {
|
||||||
|
"w": 110,
|
||||||
|
"h": 41
|
||||||
|
},
|
||||||
|
"spriteSourceSize": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"w": 110,
|
||||||
|
"h": 41
|
||||||
|
},
|
||||||
|
"frame": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 82,
|
||||||
|
"w": 110,
|
||||||
|
"h": 41
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "party_slot_main_short_fnt_sel",
|
||||||
|
"rotated": false,
|
||||||
|
"trimmed": false,
|
||||||
|
"sourceSize": {
|
||||||
|
"w": 110,
|
||||||
|
"h": 41
|
||||||
|
},
|
||||||
|
"spriteSourceSize": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"w": 110,
|
||||||
|
"h": 41
|
||||||
|
},
|
||||||
|
"frame": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 123,
|
||||||
|
"w": 110,
|
||||||
|
"h": 41
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "party_slot_main_short_swap",
|
||||||
|
"rotated": false,
|
||||||
|
"trimmed": false,
|
||||||
|
"sourceSize": {
|
||||||
|
"w": 110,
|
||||||
|
"h": 41
|
||||||
|
},
|
||||||
|
"spriteSourceSize": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"w": 110,
|
||||||
|
"h": 41
|
||||||
|
},
|
||||||
|
"frame": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 164,
|
||||||
|
"w": 110,
|
||||||
|
"h": 41
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "party_slot_main_short_swap_sel",
|
||||||
|
"rotated": false,
|
||||||
|
"trimmed": false,
|
||||||
|
"sourceSize": {
|
||||||
|
"w": 110,
|
||||||
|
"h": 41
|
||||||
|
},
|
||||||
|
"spriteSourceSize": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"w": 110,
|
||||||
|
"h": 41
|
||||||
|
},
|
||||||
|
"frame": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 205,
|
||||||
|
"w": 110,
|
||||||
|
"h": 41
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"meta": {
|
||||||
|
"app": "https://www.codeandweb.com/texturepacker",
|
||||||
|
"version": "3.0",
|
||||||
|
"smartupdate": "$TexturePacker:SmartUpdate:29685f2f538901cf5bf7f0ed2ea867c3:a080ea6c8cccd1e03244214053e79796:565f7afc5ca419b6ba8dbce51ea30818$"
|
||||||
|
}
|
||||||
|
}
|
BIN
public/images/ui/party_slot_main_short.png
Normal file
BIN
public/images/ui/party_slot_main_short.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.0 KiB |
@ -1,3 +1,5 @@
|
|||||||
|
import type { RibbonData } from "#system/ribbons/ribbon-data";
|
||||||
|
|
||||||
export interface DexData {
|
export interface DexData {
|
||||||
[key: number]: DexEntry;
|
[key: number]: DexEntry;
|
||||||
}
|
}
|
||||||
@ -10,4 +12,5 @@ export interface DexEntry {
|
|||||||
caughtCount: number;
|
caughtCount: number;
|
||||||
hatchedCount: number;
|
hatchedCount: number;
|
||||||
ivs: number[];
|
ivs: number[];
|
||||||
|
ribbons: RibbonData;
|
||||||
}
|
}
|
||||||
|
@ -103,3 +103,12 @@ export type CoerceNullPropertiesToUndefined<T extends object> = {
|
|||||||
* @typeParam T - The type to render partial
|
* @typeParam T - The type to render partial
|
||||||
*/
|
*/
|
||||||
export type AtLeastOne<T extends object> = Partial<T> & ObjectValues<{ [K in keyof T]: Pick<Required<T>, K> }>;
|
export type AtLeastOne<T extends object> = Partial<T> & ObjectValues<{ [K in keyof T]: Pick<Required<T>, K> }>;
|
||||||
|
|
||||||
|
/** Type helper that adds a brand to a type, used for nominal typing.
|
||||||
|
*
|
||||||
|
* @remarks
|
||||||
|
* Brands should be either a string or unique symbol. This prevents overlap with other types.
|
||||||
|
*/
|
||||||
|
export declare class Brander<B> {
|
||||||
|
private __brand: B;
|
||||||
|
}
|
||||||
|
@ -944,17 +944,17 @@ export class BattleScene extends SceneBase {
|
|||||||
dataSource?: PokemonData,
|
dataSource?: PokemonData,
|
||||||
postProcess?: (enemyPokemon: EnemyPokemon) => void,
|
postProcess?: (enemyPokemon: EnemyPokemon) => void,
|
||||||
): EnemyPokemon {
|
): EnemyPokemon {
|
||||||
if (Overrides.OPP_LEVEL_OVERRIDE > 0) {
|
if (Overrides.ENEMY_LEVEL_OVERRIDE > 0) {
|
||||||
level = Overrides.OPP_LEVEL_OVERRIDE;
|
level = Overrides.ENEMY_LEVEL_OVERRIDE;
|
||||||
}
|
}
|
||||||
if (Overrides.OPP_SPECIES_OVERRIDE) {
|
if (Overrides.ENEMY_SPECIES_OVERRIDE) {
|
||||||
species = getPokemonSpecies(Overrides.OPP_SPECIES_OVERRIDE);
|
species = getPokemonSpecies(Overrides.ENEMY_SPECIES_OVERRIDE);
|
||||||
// The fact that a Pokemon is a boss or not can change based on its Species and level
|
// The fact that a Pokemon is a boss or not can change based on its Species and level
|
||||||
boss = this.getEncounterBossSegments(this.currentBattle.waveIndex, level, species) > 1;
|
boss = this.getEncounterBossSegments(this.currentBattle.waveIndex, level, species) > 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
const pokemon = new EnemyPokemon(species, level, trainerSlot, boss, shinyLock, dataSource);
|
const pokemon = new EnemyPokemon(species, level, trainerSlot, boss, shinyLock, dataSource);
|
||||||
if (Overrides.OPP_FUSION_OVERRIDE) {
|
if (Overrides.ENEMY_FUSION_OVERRIDE) {
|
||||||
pokemon.generateFusionSpecies();
|
pokemon.generateFusionSpecies();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1571,9 +1571,9 @@ export class BattleScene extends SceneBase {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
const isEggPhase: boolean = ["EggLapsePhase", "EggHatchPhase"].includes(
|
const isEggPhase =
|
||||||
this.phaseManager.getCurrentPhase()?.phaseName ?? "",
|
this.phaseManager.getCurrentPhase().is("EggLapsePhase") ||
|
||||||
);
|
this.phaseManager.getCurrentPhase().is("EggHatchPhase");
|
||||||
|
|
||||||
if (
|
if (
|
||||||
// Give trainers with specialty types an appropriately-typed form for Wormadam, Rotom, Arceus, Oricorio, Silvally, or Paldean Tauros.
|
// Give trainers with specialty types an appropriately-typed form for Wormadam, Rotom, Arceus, Oricorio, Silvally, or Paldean Tauros.
|
||||||
@ -1766,10 +1766,10 @@ export class BattleScene extends SceneBase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
getEncounterBossSegments(waveIndex: number, level: number, species?: PokemonSpecies, forceBoss = false): number {
|
getEncounterBossSegments(waveIndex: number, level: number, species?: PokemonSpecies, forceBoss = false): number {
|
||||||
if (Overrides.OPP_HEALTH_SEGMENTS_OVERRIDE > 1) {
|
if (Overrides.ENEMY_HEALTH_SEGMENTS_OVERRIDE > 1) {
|
||||||
return Overrides.OPP_HEALTH_SEGMENTS_OVERRIDE;
|
return Overrides.ENEMY_HEALTH_SEGMENTS_OVERRIDE;
|
||||||
}
|
}
|
||||||
if (Overrides.OPP_HEALTH_SEGMENTS_OVERRIDE === 1) {
|
if (Overrides.ENEMY_HEALTH_SEGMENTS_OVERRIDE === 1) {
|
||||||
// The rest of the code expects to be returned 0 and not 1 if the enemy is not a boss
|
// The rest of the code expects to be returned 0 and not 1 if the enemy is not a boss
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -101,3 +101,9 @@ export const ANTI_VARIANCE_WEIGHT_MODIFIER = 15;
|
|||||||
* Default: `10000` (0.01%)
|
* Default: `10000` (0.01%)
|
||||||
*/
|
*/
|
||||||
export const FAKE_TITLE_LOGO_CHANCE = 10000;
|
export const FAKE_TITLE_LOGO_CHANCE = 10000;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The ceiling on friendship amount that can be reached through the use of rare candies.
|
||||||
|
* Using rare candies will never increase friendship beyond this value.
|
||||||
|
*/
|
||||||
|
export const RARE_CANDY_FRIENDSHIP_CAP = 200;
|
||||||
|
@ -469,7 +469,7 @@ const QuickGuardConditionFunc: ProtectConditionFunc = (_arena, moveId) => {
|
|||||||
const move = allMoves[moveId];
|
const move = allMoves[moveId];
|
||||||
const effectPhase = globalScene.phaseManager.getCurrentPhase();
|
const effectPhase = globalScene.phaseManager.getCurrentPhase();
|
||||||
|
|
||||||
if (effectPhase?.is("MoveEffectPhase")) {
|
if (effectPhase.is("MoveEffectPhase")) {
|
||||||
const attacker = effectPhase.getUserPokemon();
|
const attacker = effectPhase.getUserPokemon();
|
||||||
if (attacker) {
|
if (attacker) {
|
||||||
return move.getPriority(attacker) > 0;
|
return move.getPriority(attacker) > 0;
|
||||||
|
@ -227,11 +227,15 @@ interface GenericSerializableBattlerTag<T extends BattlerTagType> extends Serial
|
|||||||
* Descendants can override {@linkcode isMoveRestricted} to restrict moves that
|
* Descendants can override {@linkcode isMoveRestricted} to restrict moves that
|
||||||
* match a condition. A restricted move gets cancelled before it is used.
|
* match a condition. A restricted move gets cancelled before it is used.
|
||||||
* Players and enemies should not be allowed to select restricted moves.
|
* Players and enemies should not be allowed to select restricted moves.
|
||||||
|
* @todo Require descendant subclasses to inherit a `PRE_MOVE` lapse type
|
||||||
*/
|
*/
|
||||||
export abstract class MoveRestrictionBattlerTag extends SerializableBattlerTag {
|
export abstract class MoveRestrictionBattlerTag extends SerializableBattlerTag {
|
||||||
public declare readonly tagType: MoveRestrictionBattlerTagType;
|
public declare readonly tagType: MoveRestrictionBattlerTagType;
|
||||||
override lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean {
|
override lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean {
|
||||||
if (lapseType === BattlerTagLapseType.PRE_MOVE) {
|
if (lapseType !== BattlerTagLapseType.PRE_MOVE) {
|
||||||
|
return super.lapse(pokemon, lapseType);
|
||||||
|
}
|
||||||
|
|
||||||
// Cancel the affected pokemon's selected move
|
// Cancel the affected pokemon's selected move
|
||||||
const phase = globalScene.phaseManager.getCurrentPhase() as MovePhase;
|
const phase = globalScene.phaseManager.getCurrentPhase() as MovePhase;
|
||||||
const move = phase.move;
|
const move = phase.move;
|
||||||
@ -246,9 +250,6 @@ export abstract class MoveRestrictionBattlerTag extends SerializableBattlerTag {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return super.lapse(pokemon, lapseType);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determine whether a move's usage is restricted by this tag
|
* Determine whether a move's usage is restricted by this tag
|
||||||
*
|
*
|
||||||
|
@ -20,6 +20,7 @@ import { Trainer } from "#field/trainer";
|
|||||||
import type { ModifierTypeOption } from "#modifiers/modifier-type";
|
import type { ModifierTypeOption } from "#modifiers/modifier-type";
|
||||||
import { PokemonMove } from "#moves/pokemon-move";
|
import { PokemonMove } from "#moves/pokemon-move";
|
||||||
import type { DexAttrProps, GameData } from "#system/game-data";
|
import type { DexAttrProps, GameData } from "#system/game-data";
|
||||||
|
import { RibbonData, type RibbonFlag } from "#system/ribbons/ribbon-data";
|
||||||
import { type BooleanHolder, isBetween, type NumberHolder, randSeedItem } from "#utils/common";
|
import { type BooleanHolder, isBetween, type NumberHolder, randSeedItem } from "#utils/common";
|
||||||
import { deepCopy } from "#utils/data";
|
import { deepCopy } from "#utils/data";
|
||||||
import { getPokemonSpecies, getPokemonSpeciesForm } from "#utils/pokemon-utils";
|
import { getPokemonSpecies, getPokemonSpeciesForm } from "#utils/pokemon-utils";
|
||||||
@ -42,6 +43,15 @@ export abstract class Challenge {
|
|||||||
|
|
||||||
public conditions: ChallengeCondition[];
|
public conditions: ChallengeCondition[];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Ribbon awarded on challenge completion, or 0 if the challenge has no ribbon or is not enabled
|
||||||
|
*
|
||||||
|
* @defaultValue 0
|
||||||
|
*/
|
||||||
|
public get ribbonAwarded(): RibbonFlag {
|
||||||
|
return 0 as RibbonFlag;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param id {@link Challenges} The enum value for the challenge
|
* @param id {@link Challenges} The enum value for the challenge
|
||||||
*/
|
*/
|
||||||
@ -423,6 +433,12 @@ type ChallengeCondition = (data: GameData) => boolean;
|
|||||||
* Implements a mono generation challenge.
|
* Implements a mono generation challenge.
|
||||||
*/
|
*/
|
||||||
export class SingleGenerationChallenge extends Challenge {
|
export class SingleGenerationChallenge extends Challenge {
|
||||||
|
public override get ribbonAwarded(): RibbonFlag {
|
||||||
|
// NOTE: This logic will not work for the eventual mono gen 10 ribbon, as
|
||||||
|
// as its flag will not be in sequence with the other mono gen ribbons.
|
||||||
|
return this.value ? ((RibbonData.MONO_GEN_1 << (this.value - 1)) as RibbonFlag) : 0;
|
||||||
|
}
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
super(Challenges.SINGLE_GENERATION, 9);
|
super(Challenges.SINGLE_GENERATION, 9);
|
||||||
}
|
}
|
||||||
@ -686,6 +702,12 @@ interface monotypeOverride {
|
|||||||
* Implements a mono type challenge.
|
* Implements a mono type challenge.
|
||||||
*/
|
*/
|
||||||
export class SingleTypeChallenge extends Challenge {
|
export class SingleTypeChallenge extends Challenge {
|
||||||
|
public override get ribbonAwarded(): RibbonFlag {
|
||||||
|
// `this.value` represents the 1-based index of pokemon type
|
||||||
|
// `RibbonData.MONO_NORMAL` starts the flag position for the types,
|
||||||
|
// and we shift it by 1 for the specific type.
|
||||||
|
return this.value ? ((RibbonData.MONO_NORMAL << (this.value - 1)) as RibbonFlag) : 0;
|
||||||
|
}
|
||||||
private static TYPE_OVERRIDES: monotypeOverride[] = [
|
private static TYPE_OVERRIDES: monotypeOverride[] = [
|
||||||
{ species: SpeciesId.CASTFORM, type: PokemonType.NORMAL, fusion: false },
|
{ species: SpeciesId.CASTFORM, type: PokemonType.NORMAL, fusion: false },
|
||||||
];
|
];
|
||||||
@ -755,6 +777,9 @@ export class SingleTypeChallenge extends Challenge {
|
|||||||
* Implements a fresh start challenge.
|
* Implements a fresh start challenge.
|
||||||
*/
|
*/
|
||||||
export class FreshStartChallenge extends Challenge {
|
export class FreshStartChallenge extends Challenge {
|
||||||
|
public override get ribbonAwarded(): RibbonFlag {
|
||||||
|
return this.value ? RibbonData.FRESH_START : 0;
|
||||||
|
}
|
||||||
constructor() {
|
constructor() {
|
||||||
super(Challenges.FRESH_START, 2);
|
super(Challenges.FRESH_START, 2);
|
||||||
}
|
}
|
||||||
@ -828,6 +853,9 @@ export class FreshStartChallenge extends Challenge {
|
|||||||
* Implements an inverse battle challenge.
|
* Implements an inverse battle challenge.
|
||||||
*/
|
*/
|
||||||
export class InverseBattleChallenge extends Challenge {
|
export class InverseBattleChallenge extends Challenge {
|
||||||
|
public override get ribbonAwarded(): RibbonFlag {
|
||||||
|
return this.value ? RibbonData.INVERSE : 0;
|
||||||
|
}
|
||||||
constructor() {
|
constructor() {
|
||||||
super(Challenges.INVERSE_BATTLE, 1);
|
super(Challenges.INVERSE_BATTLE, 1);
|
||||||
}
|
}
|
||||||
@ -861,6 +889,9 @@ export class InverseBattleChallenge extends Challenge {
|
|||||||
* Implements a flip stat challenge.
|
* Implements a flip stat challenge.
|
||||||
*/
|
*/
|
||||||
export class FlipStatChallenge extends Challenge {
|
export class FlipStatChallenge extends Challenge {
|
||||||
|
public override get ribbonAwarded(): RibbonFlag {
|
||||||
|
return this.value ? RibbonData.FLIP_STATS : 0;
|
||||||
|
}
|
||||||
constructor() {
|
constructor() {
|
||||||
super(Challenges.FLIP_STAT, 1);
|
super(Challenges.FLIP_STAT, 1);
|
||||||
}
|
}
|
||||||
@ -941,6 +972,9 @@ export class LowerStarterPointsChallenge extends Challenge {
|
|||||||
* Implements a No Support challenge
|
* Implements a No Support challenge
|
||||||
*/
|
*/
|
||||||
export class LimitedSupportChallenge extends Challenge {
|
export class LimitedSupportChallenge extends Challenge {
|
||||||
|
public override get ribbonAwarded(): RibbonFlag {
|
||||||
|
return this.value ? ((RibbonData.NO_HEAL << (this.value - 1)) as RibbonFlag) : 0;
|
||||||
|
}
|
||||||
constructor() {
|
constructor() {
|
||||||
super(Challenges.LIMITED_SUPPORT, 3);
|
super(Challenges.LIMITED_SUPPORT, 3);
|
||||||
}
|
}
|
||||||
@ -973,6 +1007,9 @@ export class LimitedSupportChallenge extends Challenge {
|
|||||||
* Implements a Limited Catch challenge
|
* Implements a Limited Catch challenge
|
||||||
*/
|
*/
|
||||||
export class LimitedCatchChallenge extends Challenge {
|
export class LimitedCatchChallenge extends Challenge {
|
||||||
|
public override get ribbonAwarded(): RibbonFlag {
|
||||||
|
return this.value ? RibbonData.LIMITED_CATCH : 0;
|
||||||
|
}
|
||||||
constructor() {
|
constructor() {
|
||||||
super(Challenges.LIMITED_CATCH, 1);
|
super(Challenges.LIMITED_CATCH, 1);
|
||||||
}
|
}
|
||||||
@ -997,6 +1034,9 @@ export class LimitedCatchChallenge extends Challenge {
|
|||||||
* Implements a Permanent Faint challenge
|
* Implements a Permanent Faint challenge
|
||||||
*/
|
*/
|
||||||
export class HardcoreChallenge extends Challenge {
|
export class HardcoreChallenge extends Challenge {
|
||||||
|
public override get ribbonAwarded(): RibbonFlag {
|
||||||
|
return this.value ? RibbonData.HARDCORE : 0;
|
||||||
|
}
|
||||||
constructor() {
|
constructor() {
|
||||||
super(Challenges.HARDCORE, 1);
|
super(Challenges.HARDCORE, 1);
|
||||||
}
|
}
|
||||||
|
@ -47,6 +47,7 @@ export class EggHatchData {
|
|||||||
caughtCount: currDexEntry.caughtCount,
|
caughtCount: currDexEntry.caughtCount,
|
||||||
hatchedCount: currDexEntry.hatchedCount,
|
hatchedCount: currDexEntry.hatchedCount,
|
||||||
ivs: [...currDexEntry.ivs],
|
ivs: [...currDexEntry.ivs],
|
||||||
|
ribbons: currDexEntry.ribbons,
|
||||||
};
|
};
|
||||||
this.starterDataEntryBeforeUpdate = {
|
this.starterDataEntryBeforeUpdate = {
|
||||||
moveset: currStarterDataEntry.moveset,
|
moveset: currStarterDataEntry.moveset,
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import type { Ability, PreAttackModifyDamageAbAttrParams } from "#abilities/ability";
|
import type { Ability, PreAttackModifyDamageAbAttrParams } from "#abilities/ability";
|
||||||
import { applyAbAttrs, applyOnGainAbAttrs, applyOnLoseAbAttrs } from "#abilities/apply-ab-attrs";
|
import { applyAbAttrs, applyOnGainAbAttrs, applyOnLoseAbAttrs } from "#abilities/apply-ab-attrs";
|
||||||
import type { AnySound, BattleScene } from "#app/battle-scene";
|
import type { AnySound, BattleScene } from "#app/battle-scene";
|
||||||
import { PLAYER_PARTY_MAX_SIZE } from "#app/constants";
|
import { PLAYER_PARTY_MAX_SIZE, RARE_CANDY_FRIENDSHIP_CAP } from "#app/constants";
|
||||||
import { timedEventManager } from "#app/global-event-manager";
|
import { timedEventManager } from "#app/global-event-manager";
|
||||||
import { globalScene } from "#app/global-scene";
|
import { globalScene } from "#app/global-scene";
|
||||||
import { getPokemonNameWithAffix } from "#app/messages";
|
import { getPokemonNameWithAffix } from "#app/messages";
|
||||||
@ -139,6 +139,8 @@ import { populateVariantColors, variantColorCache, variantData } from "#sprites/
|
|||||||
import { achvs } from "#system/achv";
|
import { achvs } from "#system/achv";
|
||||||
import type { StarterDataEntry, StarterMoveset } from "#system/game-data";
|
import type { StarterDataEntry, StarterMoveset } from "#system/game-data";
|
||||||
import type { PokemonData } from "#system/pokemon-data";
|
import type { PokemonData } from "#system/pokemon-data";
|
||||||
|
import { RibbonData } from "#system/ribbons/ribbon-data";
|
||||||
|
import { awardRibbonsToSpeciesLine } from "#system/ribbons/ribbon-methods";
|
||||||
import type { AbAttrMap, AbAttrString, TypeMultiplierAbAttrParams } from "#types/ability-types";
|
import type { AbAttrMap, AbAttrString, TypeMultiplierAbAttrParams } from "#types/ability-types";
|
||||||
import type { DamageCalculationResult, DamageResult } from "#types/damage-result";
|
import type { DamageCalculationResult, DamageResult } from "#types/damage-result";
|
||||||
import type { IllusionData } from "#types/illusion-data";
|
import type { IllusionData } from "#types/illusion-data";
|
||||||
@ -1245,7 +1247,7 @@ export abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
}
|
}
|
||||||
// During the Pokemon's MoveEffect phase, the offset is removed to put the Pokemon "in focus"
|
// During the Pokemon's MoveEffect phase, the offset is removed to put the Pokemon "in focus"
|
||||||
const currentPhase = globalScene.phaseManager.getCurrentPhase();
|
const currentPhase = globalScene.phaseManager.getCurrentPhase();
|
||||||
return !(currentPhase?.is("MoveEffectPhase") && currentPhase.getPokemon() === this);
|
return !(currentPhase.is("MoveEffectPhase") && currentPhase.getPokemon() === this);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** If this Pokemon has a Substitute on the field, removes its sprite from the field. */
|
/** If this Pokemon has a Substitute on the field, removes its sprite from the field. */
|
||||||
@ -1825,7 +1827,7 @@ export abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
// Overrides moveset based on arrays specified in overrides.ts
|
// Overrides moveset based on arrays specified in overrides.ts
|
||||||
let overrideArray: MoveId | Array<MoveId> = this.isPlayer()
|
let overrideArray: MoveId | Array<MoveId> = this.isPlayer()
|
||||||
? Overrides.MOVESET_OVERRIDE
|
? Overrides.MOVESET_OVERRIDE
|
||||||
: Overrides.OPP_MOVESET_OVERRIDE;
|
: Overrides.ENEMY_MOVESET_OVERRIDE;
|
||||||
overrideArray = coerceArray(overrideArray);
|
overrideArray = coerceArray(overrideArray);
|
||||||
if (overrideArray.length > 0) {
|
if (overrideArray.length > 0) {
|
||||||
if (!this.isPlayer()) {
|
if (!this.isPlayer()) {
|
||||||
@ -2030,8 +2032,8 @@ export abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
if (Overrides.ABILITY_OVERRIDE && this.isPlayer()) {
|
if (Overrides.ABILITY_OVERRIDE && this.isPlayer()) {
|
||||||
return allAbilities[Overrides.ABILITY_OVERRIDE];
|
return allAbilities[Overrides.ABILITY_OVERRIDE];
|
||||||
}
|
}
|
||||||
if (Overrides.OPP_ABILITY_OVERRIDE && this.isEnemy()) {
|
if (Overrides.ENEMY_ABILITY_OVERRIDE && this.isEnemy()) {
|
||||||
return allAbilities[Overrides.OPP_ABILITY_OVERRIDE];
|
return allAbilities[Overrides.ENEMY_ABILITY_OVERRIDE];
|
||||||
}
|
}
|
||||||
if (this.isFusion()) {
|
if (this.isFusion()) {
|
||||||
if (!isNullOrUndefined(this.fusionCustomPokemonData?.ability) && this.fusionCustomPokemonData.ability !== -1) {
|
if (!isNullOrUndefined(this.fusionCustomPokemonData?.ability) && this.fusionCustomPokemonData.ability !== -1) {
|
||||||
@ -2060,8 +2062,8 @@ export abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
if (Overrides.PASSIVE_ABILITY_OVERRIDE && this.isPlayer()) {
|
if (Overrides.PASSIVE_ABILITY_OVERRIDE && this.isPlayer()) {
|
||||||
return allAbilities[Overrides.PASSIVE_ABILITY_OVERRIDE];
|
return allAbilities[Overrides.PASSIVE_ABILITY_OVERRIDE];
|
||||||
}
|
}
|
||||||
if (Overrides.OPP_PASSIVE_ABILITY_OVERRIDE && this.isEnemy()) {
|
if (Overrides.ENEMY_PASSIVE_ABILITY_OVERRIDE && this.isEnemy()) {
|
||||||
return allAbilities[Overrides.OPP_PASSIVE_ABILITY_OVERRIDE];
|
return allAbilities[Overrides.ENEMY_PASSIVE_ABILITY_OVERRIDE];
|
||||||
}
|
}
|
||||||
if (!isNullOrUndefined(this.customPokemonData.passive) && this.customPokemonData.passive !== -1) {
|
if (!isNullOrUndefined(this.customPokemonData.passive) && this.customPokemonData.passive !== -1) {
|
||||||
return allAbilities[this.customPokemonData.passive];
|
return allAbilities[this.customPokemonData.passive];
|
||||||
@ -2128,14 +2130,14 @@ export abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
// returns override if valid for current case
|
// returns override if valid for current case
|
||||||
if (
|
if (
|
||||||
(Overrides.HAS_PASSIVE_ABILITY_OVERRIDE === false && this.isPlayer()) ||
|
(Overrides.HAS_PASSIVE_ABILITY_OVERRIDE === false && this.isPlayer()) ||
|
||||||
(Overrides.OPP_HAS_PASSIVE_ABILITY_OVERRIDE === false && this.isEnemy())
|
(Overrides.ENEMY_HAS_PASSIVE_ABILITY_OVERRIDE === false && this.isEnemy())
|
||||||
) {
|
) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (
|
if (
|
||||||
((Overrides.PASSIVE_ABILITY_OVERRIDE !== AbilityId.NONE || Overrides.HAS_PASSIVE_ABILITY_OVERRIDE) &&
|
((Overrides.PASSIVE_ABILITY_OVERRIDE !== AbilityId.NONE || Overrides.HAS_PASSIVE_ABILITY_OVERRIDE) &&
|
||||||
this.isPlayer()) ||
|
this.isPlayer()) ||
|
||||||
((Overrides.OPP_PASSIVE_ABILITY_OVERRIDE !== AbilityId.NONE || Overrides.OPP_HAS_PASSIVE_ABILITY_OVERRIDE) &&
|
((Overrides.ENEMY_PASSIVE_ABILITY_OVERRIDE !== AbilityId.NONE || Overrides.ENEMY_HAS_PASSIVE_ABILITY_OVERRIDE) &&
|
||||||
this.isEnemy())
|
this.isEnemy())
|
||||||
) {
|
) {
|
||||||
return true;
|
return true;
|
||||||
@ -3001,8 +3003,8 @@ export abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
|
|
||||||
if (forStarter && this.isPlayer() && Overrides.STARTER_FUSION_SPECIES_OVERRIDE) {
|
if (forStarter && this.isPlayer() && Overrides.STARTER_FUSION_SPECIES_OVERRIDE) {
|
||||||
fusionOverride = getPokemonSpecies(Overrides.STARTER_FUSION_SPECIES_OVERRIDE);
|
fusionOverride = getPokemonSpecies(Overrides.STARTER_FUSION_SPECIES_OVERRIDE);
|
||||||
} else if (this.isEnemy() && Overrides.OPP_FUSION_SPECIES_OVERRIDE) {
|
} else if (this.isEnemy() && Overrides.ENEMY_FUSION_SPECIES_OVERRIDE) {
|
||||||
fusionOverride = getPokemonSpecies(Overrides.OPP_FUSION_SPECIES_OVERRIDE);
|
fusionOverride = getPokemonSpecies(Overrides.ENEMY_FUSION_SPECIES_OVERRIDE);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.fusionSpecies =
|
this.fusionSpecies =
|
||||||
@ -4929,7 +4931,7 @@ export abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
*/
|
*/
|
||||||
if (effect === StatusEffect.SLEEP || effect === StatusEffect.FREEZE) {
|
if (effect === StatusEffect.SLEEP || effect === StatusEffect.FREEZE) {
|
||||||
const currentPhase = globalScene.phaseManager.getCurrentPhase();
|
const currentPhase = globalScene.phaseManager.getCurrentPhase();
|
||||||
if (currentPhase?.is("MoveEffectPhase") && currentPhase.getUserPokemon() === this) {
|
if (currentPhase.is("MoveEffectPhase") && currentPhase.getUserPokemon() === this) {
|
||||||
this.turnData.hitCount = 1;
|
this.turnData.hitCount = 1;
|
||||||
this.turnData.hitsLeft = 1;
|
this.turnData.hitsLeft = 1;
|
||||||
}
|
}
|
||||||
@ -5822,45 +5824,59 @@ export class PlayerPokemon extends Pokemon {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* Add friendship to this Pokemon
|
||||||
|
*
|
||||||
|
* @remarks
|
||||||
|
* This adds friendship to the pokemon's friendship stat (used for evolution, return, etc.) and candy progress.
|
||||||
|
* For fusions, candy progress for each species in the fusion is halved.
|
||||||
|
*
|
||||||
|
* @param friendship - The amount of friendship to add. Negative values will reduce friendship, though not below 0.
|
||||||
|
* @param capped - If true, don't allow the friendship gain to exceed 200. Used to cap friendship gains from rare candies.
|
||||||
|
*/
|
||||||
|
addFriendship(friendship: number, capped = false): void {
|
||||||
|
// Short-circuit friendship loss, which doesn't impact candy friendship
|
||||||
|
if (friendship <= 0) {
|
||||||
|
this.friendship = Math.max(this.friendship + friendship, 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
addFriendship(friendship: number): void {
|
|
||||||
if (friendship > 0) {
|
|
||||||
const starterSpeciesId = this.species.getRootSpeciesId();
|
const starterSpeciesId = this.species.getRootSpeciesId();
|
||||||
const fusionStarterSpeciesId = this.isFusion() && this.fusionSpecies ? this.fusionSpecies.getRootSpeciesId() : 0;
|
const fusionStarterSpeciesId = this.isFusion() && this.fusionSpecies ? this.fusionSpecies.getRootSpeciesId() : 0;
|
||||||
const starterData = [
|
const starterGameData = globalScene.gameData.starterData;
|
||||||
globalScene.gameData.starterData[starterSpeciesId],
|
const starterData: [StarterDataEntry, SpeciesId][] = [[starterGameData[starterSpeciesId], starterSpeciesId]];
|
||||||
fusionStarterSpeciesId ? globalScene.gameData.starterData[fusionStarterSpeciesId] : null,
|
if (fusionStarterSpeciesId) {
|
||||||
].filter(d => !!d);
|
starterData.push([starterGameData[fusionStarterSpeciesId], fusionStarterSpeciesId]);
|
||||||
|
}
|
||||||
const amount = new NumberHolder(friendship);
|
const amount = new NumberHolder(friendship);
|
||||||
globalScene.applyModifier(PokemonFriendshipBoosterModifier, true, this, amount);
|
globalScene.applyModifier(PokemonFriendshipBoosterModifier, true, this, amount);
|
||||||
const candyFriendshipMultiplier = globalScene.gameMode.isClassic
|
friendship = amount.value;
|
||||||
|
|
||||||
|
const newFriendship = this.friendship + friendship;
|
||||||
|
// If capped is true, only adjust friendship if the new friendship is less than or equal to 200.
|
||||||
|
if (!capped || newFriendship <= RARE_CANDY_FRIENDSHIP_CAP) {
|
||||||
|
this.friendship = Math.min(newFriendship, 255);
|
||||||
|
if (newFriendship >= 255) {
|
||||||
|
globalScene.validateAchv(achvs.MAX_FRIENDSHIP);
|
||||||
|
awardRibbonsToSpeciesLine(this.species.speciesId, RibbonData.FRIENDSHIP);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let candyFriendshipMultiplier = globalScene.gameMode.isClassic
|
||||||
? timedEventManager.getClassicFriendshipMultiplier()
|
? timedEventManager.getClassicFriendshipMultiplier()
|
||||||
: 1;
|
: 1;
|
||||||
const fusionReduction = fusionStarterSpeciesId
|
if (fusionStarterSpeciesId) {
|
||||||
? timedEventManager.areFusionsBoosted()
|
candyFriendshipMultiplier /= timedEventManager.areFusionsBoosted() ? 1.5 : 2;
|
||||||
? 1.5 // Divide candy gain for fusions by 1.5 during events
|
|
||||||
: 2 // 2 for fusions outside events
|
|
||||||
: 1; // 1 for non-fused mons
|
|
||||||
const starterAmount = new NumberHolder(Math.floor((amount.value * candyFriendshipMultiplier) / fusionReduction));
|
|
||||||
|
|
||||||
// Add friendship to this PlayerPokemon
|
|
||||||
this.friendship = Math.min(this.friendship + amount.value, 255);
|
|
||||||
if (this.friendship === 255) {
|
|
||||||
globalScene.validateAchv(achvs.MAX_FRIENDSHIP);
|
|
||||||
}
|
}
|
||||||
|
const candyFriendshipAmount = Math.floor(friendship * candyFriendshipMultiplier);
|
||||||
// Add to candy progress for this mon's starter species and its fused species (if it has one)
|
// Add to candy progress for this mon's starter species and its fused species (if it has one)
|
||||||
starterData.forEach((sd: StarterDataEntry, i: number) => {
|
starterData.forEach(([sd, id]: [StarterDataEntry, SpeciesId]) => {
|
||||||
const speciesId = !i ? starterSpeciesId : (fusionStarterSpeciesId as SpeciesId);
|
sd.friendship = (sd.friendship || 0) + candyFriendshipAmount;
|
||||||
sd.friendship = (sd.friendship || 0) + starterAmount.value;
|
if (sd.friendship >= getStarterValueFriendshipCap(speciesStarterCosts[id])) {
|
||||||
if (sd.friendship >= getStarterValueFriendshipCap(speciesStarterCosts[speciesId])) {
|
globalScene.gameData.addStarterCandy(getPokemonSpecies(id), 1);
|
||||||
globalScene.gameData.addStarterCandy(getPokemonSpecies(speciesId), 1);
|
|
||||||
sd.friendship = 0;
|
sd.friendship = 0;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else {
|
|
||||||
// Lose friendship upon fainting
|
|
||||||
this.friendship = Math.max(this.friendship + friendship, 0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
getPossibleEvolution(evolution: SpeciesFormEvolution | null): Promise<Pokemon> {
|
getPossibleEvolution(evolution: SpeciesFormEvolution | null): Promise<Pokemon> {
|
||||||
@ -6241,22 +6257,22 @@ export class EnemyPokemon extends Pokemon {
|
|||||||
this.setBoss(boss, dataSource?.bossSegments);
|
this.setBoss(boss, dataSource?.bossSegments);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Overrides.OPP_STATUS_OVERRIDE) {
|
if (Overrides.ENEMY_STATUS_OVERRIDE) {
|
||||||
this.status = new Status(Overrides.OPP_STATUS_OVERRIDE, 0, 4);
|
this.status = new Status(Overrides.ENEMY_STATUS_OVERRIDE, 0, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Overrides.OPP_GENDER_OVERRIDE !== null) {
|
if (Overrides.ENEMY_GENDER_OVERRIDE !== null) {
|
||||||
this.gender = Overrides.OPP_GENDER_OVERRIDE;
|
this.gender = Overrides.ENEMY_GENDER_OVERRIDE;
|
||||||
}
|
}
|
||||||
|
|
||||||
const speciesId = this.species.speciesId;
|
const speciesId = this.species.speciesId;
|
||||||
|
|
||||||
if (
|
if (
|
||||||
speciesId in Overrides.OPP_FORM_OVERRIDES &&
|
speciesId in Overrides.ENEMY_FORM_OVERRIDES &&
|
||||||
!isNullOrUndefined(Overrides.OPP_FORM_OVERRIDES[speciesId]) &&
|
!isNullOrUndefined(Overrides.ENEMY_FORM_OVERRIDES[speciesId]) &&
|
||||||
this.species.forms[Overrides.OPP_FORM_OVERRIDES[speciesId]]
|
this.species.forms[Overrides.ENEMY_FORM_OVERRIDES[speciesId]]
|
||||||
) {
|
) {
|
||||||
this.formIndex = Overrides.OPP_FORM_OVERRIDES[speciesId];
|
this.formIndex = Overrides.ENEMY_FORM_OVERRIDES[speciesId];
|
||||||
} else if (globalScene.gameMode.isDaily && globalScene.gameMode.isWaveFinal(globalScene.currentBattle.waveIndex)) {
|
} else if (globalScene.gameMode.isDaily && globalScene.gameMode.isWaveFinal(globalScene.currentBattle.waveIndex)) {
|
||||||
const eventBoss = getDailyEventSeedBoss(globalScene.seed);
|
const eventBoss = getDailyEventSeedBoss(globalScene.seed);
|
||||||
if (!isNullOrUndefined(eventBoss)) {
|
if (!isNullOrUndefined(eventBoss)) {
|
||||||
@ -6266,21 +6282,21 @@ export class EnemyPokemon extends Pokemon {
|
|||||||
|
|
||||||
if (!dataSource) {
|
if (!dataSource) {
|
||||||
this.generateAndPopulateMoveset();
|
this.generateAndPopulateMoveset();
|
||||||
if (shinyLock || Overrides.OPP_SHINY_OVERRIDE === false) {
|
if (shinyLock || Overrides.ENEMY_SHINY_OVERRIDE === false) {
|
||||||
this.shiny = false;
|
this.shiny = false;
|
||||||
} else {
|
} else {
|
||||||
this.trySetShiny();
|
this.trySetShiny();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!this.shiny && Overrides.OPP_SHINY_OVERRIDE) {
|
if (!this.shiny && Overrides.ENEMY_SHINY_OVERRIDE) {
|
||||||
this.shiny = true;
|
this.shiny = true;
|
||||||
this.initShinySparkle();
|
this.initShinySparkle();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.shiny) {
|
if (this.shiny) {
|
||||||
this.variant = this.generateShinyVariant();
|
this.variant = this.generateShinyVariant();
|
||||||
if (Overrides.OPP_VARIANT_OVERRIDE !== null) {
|
if (Overrides.ENEMY_VARIANT_OVERRIDE !== null) {
|
||||||
this.variant = Overrides.OPP_VARIANT_OVERRIDE;
|
this.variant = Overrides.ENEMY_VARIANT_OVERRIDE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -90,6 +90,7 @@ export class LoadingScene extends SceneBase {
|
|||||||
this.loadAtlas("shiny_icons", "ui");
|
this.loadAtlas("shiny_icons", "ui");
|
||||||
this.loadImage("ha_capsule", "ui", "ha_capsule.png");
|
this.loadImage("ha_capsule", "ui", "ha_capsule.png");
|
||||||
this.loadImage("champion_ribbon", "ui", "champion_ribbon.png");
|
this.loadImage("champion_ribbon", "ui", "champion_ribbon.png");
|
||||||
|
this.loadImage("champion_ribbon_emerald", "ui", "champion_ribbon_emerald.png");
|
||||||
this.loadImage("icon_spliced", "ui");
|
this.loadImage("icon_spliced", "ui");
|
||||||
this.loadImage("icon_lock", "ui", "icon_lock.png");
|
this.loadImage("icon_lock", "ui", "icon_lock.png");
|
||||||
this.loadImage("icon_stop", "ui", "icon_stop.png");
|
this.loadImage("icon_stop", "ui", "icon_stop.png");
|
||||||
@ -122,6 +123,7 @@ export class LoadingScene extends SceneBase {
|
|||||||
this.loadImage("party_bg_double", "ui");
|
this.loadImage("party_bg_double", "ui");
|
||||||
this.loadImage("party_bg_double_manage", "ui");
|
this.loadImage("party_bg_double_manage", "ui");
|
||||||
this.loadAtlas("party_slot_main", "ui");
|
this.loadAtlas("party_slot_main", "ui");
|
||||||
|
this.loadAtlas("party_slot_main_short", "ui");
|
||||||
this.loadAtlas("party_slot", "ui");
|
this.loadAtlas("party_slot", "ui");
|
||||||
this.loadImage("party_slot_overlay_lv", "ui");
|
this.loadImage("party_slot_overlay_lv", "ui");
|
||||||
this.loadImage("party_slot_hp_bar", "ui");
|
this.loadImage("party_slot_hp_bar", "ui");
|
||||||
|
@ -2304,7 +2304,7 @@ export class PokemonLevelIncrementModifier extends ConsumablePokemonModifier {
|
|||||||
playerPokemon.levelExp = 0;
|
playerPokemon.levelExp = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
playerPokemon.addFriendship(FRIENDSHIP_GAIN_FROM_RARE_CANDY);
|
playerPokemon.addFriendship(FRIENDSHIP_GAIN_FROM_RARE_CANDY, true);
|
||||||
|
|
||||||
globalScene.phaseManager.unshiftNew(
|
globalScene.phaseManager.unshiftNew(
|
||||||
"LevelUpPhase",
|
"LevelUpPhase",
|
||||||
@ -3755,7 +3755,7 @@ export class EnemyFusionChanceModifier extends EnemyPersistentModifier {
|
|||||||
export function overrideModifiers(isPlayer = true): void {
|
export function overrideModifiers(isPlayer = true): void {
|
||||||
const modifiersOverride: ModifierOverride[] = isPlayer
|
const modifiersOverride: ModifierOverride[] = isPlayer
|
||||||
? Overrides.STARTING_MODIFIER_OVERRIDE
|
? Overrides.STARTING_MODIFIER_OVERRIDE
|
||||||
: Overrides.OPP_MODIFIER_OVERRIDE;
|
: Overrides.ENEMY_MODIFIER_OVERRIDE;
|
||||||
if (!modifiersOverride || modifiersOverride.length === 0 || !globalScene) {
|
if (!modifiersOverride || modifiersOverride.length === 0 || !globalScene) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -3797,7 +3797,7 @@ export function overrideModifiers(isPlayer = true): void {
|
|||||||
export function overrideHeldItems(pokemon: Pokemon, isPlayer = true): void {
|
export function overrideHeldItems(pokemon: Pokemon, isPlayer = true): void {
|
||||||
const heldItemsOverride: ModifierOverride[] = isPlayer
|
const heldItemsOverride: ModifierOverride[] = isPlayer
|
||||||
? Overrides.STARTING_HELD_ITEMS_OVERRIDE
|
? Overrides.STARTING_HELD_ITEMS_OVERRIDE
|
||||||
: Overrides.OPP_HELD_ITEMS_OVERRIDE;
|
: Overrides.ENEMY_HELD_ITEMS_OVERRIDE;
|
||||||
if (!heldItemsOverride || heldItemsOverride.length === 0 || !globalScene) {
|
if (!heldItemsOverride || heldItemsOverride.length === 0 || !globalScene) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -179,25 +179,24 @@ class DefaultOverrides {
|
|||||||
// --------------------------
|
// --------------------------
|
||||||
// OPPONENT / ENEMY OVERRIDES
|
// OPPONENT / ENEMY OVERRIDES
|
||||||
// --------------------------
|
// --------------------------
|
||||||
// TODO: rename `OPP_` to `ENEMY_`
|
readonly ENEMY_SPECIES_OVERRIDE: SpeciesId | number = 0;
|
||||||
readonly OPP_SPECIES_OVERRIDE: SpeciesId | number = 0;
|
|
||||||
/**
|
/**
|
||||||
* This will make all opponents fused Pokemon
|
* This will make all opponents fused Pokemon
|
||||||
*/
|
*/
|
||||||
readonly OPP_FUSION_OVERRIDE: boolean = false;
|
readonly ENEMY_FUSION_OVERRIDE: boolean = false;
|
||||||
/**
|
/**
|
||||||
* This will override the species of the fusion only when the opponent is already a fusion
|
* This will override the species of the fusion only when the opponent is already a fusion
|
||||||
*/
|
*/
|
||||||
readonly OPP_FUSION_SPECIES_OVERRIDE: SpeciesId | number = 0;
|
readonly ENEMY_FUSION_SPECIES_OVERRIDE: SpeciesId | number = 0;
|
||||||
readonly OPP_LEVEL_OVERRIDE: number = 0;
|
readonly ENEMY_LEVEL_OVERRIDE: number = 0;
|
||||||
readonly OPP_ABILITY_OVERRIDE: AbilityId = AbilityId.NONE;
|
readonly ENEMY_ABILITY_OVERRIDE: AbilityId = AbilityId.NONE;
|
||||||
readonly OPP_PASSIVE_ABILITY_OVERRIDE: AbilityId = AbilityId.NONE;
|
readonly ENEMY_PASSIVE_ABILITY_OVERRIDE: AbilityId = AbilityId.NONE;
|
||||||
readonly OPP_HAS_PASSIVE_ABILITY_OVERRIDE: boolean | null = null;
|
readonly ENEMY_HAS_PASSIVE_ABILITY_OVERRIDE: boolean | null = null;
|
||||||
readonly OPP_STATUS_OVERRIDE: StatusEffect = StatusEffect.NONE;
|
readonly ENEMY_STATUS_OVERRIDE: StatusEffect = StatusEffect.NONE;
|
||||||
readonly OPP_GENDER_OVERRIDE: Gender | null = null;
|
readonly ENEMY_GENDER_OVERRIDE: Gender | null = null;
|
||||||
readonly OPP_MOVESET_OVERRIDE: MoveId | Array<MoveId> = [];
|
readonly ENEMY_MOVESET_OVERRIDE: MoveId | Array<MoveId> = [];
|
||||||
readonly OPP_SHINY_OVERRIDE: boolean | null = null;
|
readonly ENEMY_SHINY_OVERRIDE: boolean | null = null;
|
||||||
readonly OPP_VARIANT_OVERRIDE: Variant | null = null;
|
readonly ENEMY_VARIANT_OVERRIDE: Variant | null = null;
|
||||||
/**
|
/**
|
||||||
* Overrides the IVs of enemy pokemon. Values must never be outside the range `0` to `31`!
|
* Overrides the IVs of enemy pokemon. Values must never be outside the range `0` to `31`!
|
||||||
* - If set to a number between `0` and `31`, set all IVs of all enemy pokemon to that number.
|
* - If set to a number between `0` and `31`, set all IVs of all enemy pokemon to that number.
|
||||||
@ -207,7 +206,7 @@ class DefaultOverrides {
|
|||||||
readonly ENEMY_IVS_OVERRIDE: number | number[] | null = null;
|
readonly ENEMY_IVS_OVERRIDE: number | number[] | null = null;
|
||||||
/** Override the nature of all enemy pokemon to the specified nature. Disabled if `null`. */
|
/** Override the nature of all enemy pokemon to the specified nature. Disabled if `null`. */
|
||||||
readonly ENEMY_NATURE_OVERRIDE: Nature | null = null;
|
readonly ENEMY_NATURE_OVERRIDE: Nature | null = null;
|
||||||
readonly OPP_FORM_OVERRIDES: Partial<Record<SpeciesId, number>> = {};
|
readonly ENEMY_FORM_OVERRIDES: Partial<Record<SpeciesId, number>> = {};
|
||||||
/**
|
/**
|
||||||
* Override to give the enemy Pokemon a given amount of health segments
|
* Override to give the enemy Pokemon a given amount of health segments
|
||||||
*
|
*
|
||||||
@ -215,7 +214,7 @@ class DefaultOverrides {
|
|||||||
* 1: the Pokemon will have a single health segment and therefore will not be a boss
|
* 1: the Pokemon will have a single health segment and therefore will not be a boss
|
||||||
* 2+: the Pokemon will be a boss with the given number of health segments
|
* 2+: the Pokemon will be a boss with the given number of health segments
|
||||||
*/
|
*/
|
||||||
readonly OPP_HEALTH_SEGMENTS_OVERRIDE: number = 0;
|
readonly ENEMY_HEALTH_SEGMENTS_OVERRIDE: number = 0;
|
||||||
|
|
||||||
// -------------
|
// -------------
|
||||||
// EGG OVERRIDES
|
// EGG OVERRIDES
|
||||||
@ -277,12 +276,12 @@ class DefaultOverrides {
|
|||||||
*
|
*
|
||||||
* Note that any previous modifiers are cleared.
|
* Note that any previous modifiers are cleared.
|
||||||
*/
|
*/
|
||||||
readonly OPP_MODIFIER_OVERRIDE: ModifierOverride[] = [];
|
readonly ENEMY_MODIFIER_OVERRIDE: ModifierOverride[] = [];
|
||||||
|
|
||||||
/** Override array of {@linkcode ModifierOverride}s used to provide held items to first party member when starting a new game. */
|
/** Override array of {@linkcode ModifierOverride}s used to provide held items to first party member when starting a new game. */
|
||||||
readonly STARTING_HELD_ITEMS_OVERRIDE: ModifierOverride[] = [];
|
readonly STARTING_HELD_ITEMS_OVERRIDE: ModifierOverride[] = [];
|
||||||
/** Override array of {@linkcode ModifierOverride}s used to provide held items to enemies on spawn. */
|
/** Override array of {@linkcode ModifierOverride}s used to provide held items to enemies on spawn. */
|
||||||
readonly OPP_HELD_ITEMS_OVERRIDE: ModifierOverride[] = [];
|
readonly ENEMY_HELD_ITEMS_OVERRIDE: ModifierOverride[] = [];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Override array of {@linkcode ModifierOverride}s used to replace the generated item rolls after a wave.
|
* Override array of {@linkcode ModifierOverride}s used to replace the generated item rolls after a wave.
|
||||||
|
@ -236,7 +236,7 @@ export class PhaseManager {
|
|||||||
/** Parallel array to {@linkcode dynamicPhaseQueues} - matches phase types to their queues */
|
/** Parallel array to {@linkcode dynamicPhaseQueues} - matches phase types to their queues */
|
||||||
private dynamicPhaseTypes: Constructor<Phase>[];
|
private dynamicPhaseTypes: Constructor<Phase>[];
|
||||||
|
|
||||||
private currentPhase: Phase | null = null;
|
private currentPhase: Phase;
|
||||||
private standbyPhase: Phase | null = null;
|
private standbyPhase: Phase | null = null;
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
@ -260,7 +260,12 @@ export class PhaseManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Phase Functions */
|
/* Phase Functions */
|
||||||
getCurrentPhase(): Phase | null {
|
|
||||||
|
/**
|
||||||
|
* Return the currently running {@linkcode Phase}.
|
||||||
|
* @returns The Phase currently in the process of running.
|
||||||
|
*/
|
||||||
|
getCurrentPhase(): Phase {
|
||||||
return this.currentPhase;
|
return this.currentPhase;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -363,13 +368,16 @@ export class PhaseManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If no phases are left to run, add phases to start a new turn.
|
||||||
if (!this.phaseQueue.length) {
|
if (!this.phaseQueue.length) {
|
||||||
this.populatePhaseQueue();
|
this.populatePhaseQueue();
|
||||||
// Clear the conditionalQueue if there are no phases left in the phaseQueue
|
// Clear the conditionalQueue if there are no phases left in the phaseQueue
|
||||||
this.conditionalQueue = [];
|
this.conditionalQueue = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
this.currentPhase = this.phaseQueue.shift() ?? null;
|
// Bang is justified as `populatePhaseQueue` ensures we always have _something_ in the queue at all times
|
||||||
|
this.currentPhase = this.phaseQueue.shift()!;
|
||||||
|
|
||||||
const unactivatedConditionalPhases: [() => boolean, Phase][] = [];
|
const unactivatedConditionalPhases: [() => boolean, Phase][] = [];
|
||||||
// Check if there are any conditional phases queued
|
// Check if there are any conditional phases queued
|
||||||
@ -389,10 +397,15 @@ export class PhaseManager {
|
|||||||
}
|
}
|
||||||
this.conditionalQueue.push(...unactivatedConditionalPhases);
|
this.conditionalQueue.push(...unactivatedConditionalPhases);
|
||||||
|
|
||||||
if (this.currentPhase) {
|
this.startCurrentPhase();
|
||||||
console.log(`%cStart Phase ${this.currentPhase.constructor.name}`, "color:green;");
|
|
||||||
this.currentPhase.start();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper method to start and log the current phase.
|
||||||
|
*/
|
||||||
|
private startCurrentPhase(): void {
|
||||||
|
console.log(`%cStart Phase ${this.currentPhase.phaseName}`, "color:green;");
|
||||||
|
this.currentPhase.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
overridePhase(phase: Phase): boolean {
|
overridePhase(phase: Phase): boolean {
|
||||||
@ -402,8 +415,7 @@ export class PhaseManager {
|
|||||||
|
|
||||||
this.standbyPhase = this.currentPhase;
|
this.standbyPhase = this.currentPhase;
|
||||||
this.currentPhase = phase;
|
this.currentPhase = phase;
|
||||||
console.log(`%cStart Phase ${phase.constructor.name}`, "color:green;");
|
this.startCurrentPhase();
|
||||||
phase.start();
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -229,7 +229,7 @@ export class EncounterPhase extends BattlePhase {
|
|||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
const overridedBossSegments = Overrides.OPP_HEALTH_SEGMENTS_OVERRIDE > 1;
|
const overridedBossSegments = Overrides.ENEMY_HEALTH_SEGMENTS_OVERRIDE > 1;
|
||||||
// for double battles, reduce the health segments for boss Pokemon unless there is an override
|
// for double battles, reduce the health segments for boss Pokemon unless there is an override
|
||||||
if (!overridedBossSegments && battle.enemyParty.filter(p => p.isBoss()).length > 1) {
|
if (!overridedBossSegments && battle.enemyParty.filter(p => p.isBoss()).length > 1) {
|
||||||
for (const enemyPokemon of battle.enemyParty) {
|
for (const enemyPokemon of battle.enemyParty) {
|
||||||
|
@ -19,8 +19,11 @@ import { ChallengeData } from "#system/challenge-data";
|
|||||||
import type { SessionSaveData } from "#system/game-data";
|
import type { SessionSaveData } from "#system/game-data";
|
||||||
import { ModifierData as PersistentModifierData } from "#system/modifier-data";
|
import { ModifierData as PersistentModifierData } from "#system/modifier-data";
|
||||||
import { PokemonData } from "#system/pokemon-data";
|
import { PokemonData } from "#system/pokemon-data";
|
||||||
|
import { RibbonData, type RibbonFlag } from "#system/ribbons/ribbon-data";
|
||||||
|
import { awardRibbonsToSpeciesLine } from "#system/ribbons/ribbon-methods";
|
||||||
import { TrainerData } from "#system/trainer-data";
|
import { TrainerData } from "#system/trainer-data";
|
||||||
import { trainerConfigs } from "#trainers/trainer-config";
|
import { trainerConfigs } from "#trainers/trainer-config";
|
||||||
|
import { checkSpeciesValidForChallenge, isNuzlockeChallenge } from "#utils/challenge-utils";
|
||||||
import { isLocal, isLocalServerConnected } from "#utils/common";
|
import { isLocal, isLocalServerConnected } from "#utils/common";
|
||||||
import { getPokemonSpecies } from "#utils/pokemon-utils";
|
import { getPokemonSpecies } from "#utils/pokemon-utils";
|
||||||
import i18next from "i18next";
|
import i18next from "i18next";
|
||||||
@ -111,6 +114,40 @@ export class GameOverPhase extends BattlePhase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Submethod of {@linkcode handleGameOver} that awards ribbons to Pokémon in the player's party based on the current
|
||||||
|
* game mode and challenges.
|
||||||
|
*/
|
||||||
|
private awardRibbons(): void {
|
||||||
|
let ribbonFlags = 0;
|
||||||
|
if (globalScene.gameMode.isClassic) {
|
||||||
|
ribbonFlags |= RibbonData.CLASSIC;
|
||||||
|
}
|
||||||
|
if (isNuzlockeChallenge()) {
|
||||||
|
ribbonFlags |= RibbonData.NUZLOCKE;
|
||||||
|
}
|
||||||
|
for (const challenge of globalScene.gameMode.challenges) {
|
||||||
|
const ribbon = challenge.ribbonAwarded;
|
||||||
|
if (challenge.value && ribbon) {
|
||||||
|
ribbonFlags |= ribbon;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Award ribbons to all Pokémon in the player's party that are considered valid
|
||||||
|
// for the current game mode and challenges.
|
||||||
|
for (const pokemon of globalScene.getPlayerParty()) {
|
||||||
|
const species = pokemon.species;
|
||||||
|
if (
|
||||||
|
checkSpeciesValidForChallenge(
|
||||||
|
species,
|
||||||
|
globalScene.gameData.getSpeciesDexAttrProps(species, pokemon.getDexAttr()),
|
||||||
|
false,
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
awardRibbonsToSpeciesLine(species.speciesId, ribbonFlags as RibbonFlag);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
handleGameOver(): void {
|
handleGameOver(): void {
|
||||||
const doGameOver = (newClear: boolean) => {
|
const doGameOver = (newClear: boolean) => {
|
||||||
globalScene.disableMenu = true;
|
globalScene.disableMenu = true;
|
||||||
@ -122,12 +159,12 @@ export class GameOverPhase extends BattlePhase {
|
|||||||
globalScene.validateAchv(achvs.UNEVOLVED_CLASSIC_VICTORY);
|
globalScene.validateAchv(achvs.UNEVOLVED_CLASSIC_VICTORY);
|
||||||
globalScene.gameData.gameStats.sessionsWon++;
|
globalScene.gameData.gameStats.sessionsWon++;
|
||||||
for (const pokemon of globalScene.getPlayerParty()) {
|
for (const pokemon of globalScene.getPlayerParty()) {
|
||||||
this.awardRibbon(pokemon);
|
this.awardFirstClassicCompletion(pokemon);
|
||||||
|
|
||||||
if (pokemon.species.getRootSpeciesId() !== pokemon.species.getRootSpeciesId(true)) {
|
if (pokemon.species.getRootSpeciesId() !== pokemon.species.getRootSpeciesId(true)) {
|
||||||
this.awardRibbon(pokemon, true);
|
this.awardFirstClassicCompletion(pokemon, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
this.awardRibbons();
|
||||||
} else if (globalScene.gameMode.isDaily && newClear) {
|
} else if (globalScene.gameMode.isDaily && newClear) {
|
||||||
globalScene.gameData.gameStats.dailyRunSessionsWon++;
|
globalScene.gameData.gameStats.dailyRunSessionsWon++;
|
||||||
}
|
}
|
||||||
@ -263,7 +300,7 @@ export class GameOverPhase extends BattlePhase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
awardRibbon(pokemon: Pokemon, forStarter = false): void {
|
awardFirstClassicCompletion(pokemon: Pokemon, forStarter = false): void {
|
||||||
const speciesId = getPokemonSpecies(pokemon.species.speciesId);
|
const speciesId = getPokemonSpecies(pokemon.species.speciesId);
|
||||||
const speciesRibbonCount = globalScene.gameData.incrementRibbonCount(speciesId, forStarter);
|
const speciesRibbonCount = globalScene.gameData.incrementRibbonCount(speciesId, forStarter);
|
||||||
// first time classic win, award voucher
|
// first time classic win, award voucher
|
||||||
|
@ -5,7 +5,6 @@ import {
|
|||||||
FlipStatChallenge,
|
FlipStatChallenge,
|
||||||
FreshStartChallenge,
|
FreshStartChallenge,
|
||||||
InverseBattleChallenge,
|
InverseBattleChallenge,
|
||||||
LimitedCatchChallenge,
|
|
||||||
SingleGenerationChallenge,
|
SingleGenerationChallenge,
|
||||||
SingleTypeChallenge,
|
SingleTypeChallenge,
|
||||||
} from "#data/challenge";
|
} from "#data/challenge";
|
||||||
@ -14,6 +13,7 @@ import { PlayerGender } from "#enums/player-gender";
|
|||||||
import { getShortenedStatKey, Stat } from "#enums/stat";
|
import { getShortenedStatKey, Stat } from "#enums/stat";
|
||||||
import { TurnHeldItemTransferModifier } from "#modifiers/modifier";
|
import { TurnHeldItemTransferModifier } from "#modifiers/modifier";
|
||||||
import type { ConditionFn } from "#types/common";
|
import type { ConditionFn } from "#types/common";
|
||||||
|
import { isNuzlockeChallenge } from "#utils/challenge-utils";
|
||||||
import { NumberHolder } from "#utils/common";
|
import { NumberHolder } from "#utils/common";
|
||||||
import i18next from "i18next";
|
import i18next from "i18next";
|
||||||
import type { Modifier } from "typescript";
|
import type { Modifier } from "typescript";
|
||||||
@ -924,18 +924,7 @@ export const achvs = {
|
|||||||
globalScene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0),
|
globalScene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0),
|
||||||
).setSecret(),
|
).setSecret(),
|
||||||
// TODO: Decide on icon
|
// TODO: Decide on icon
|
||||||
NUZLOCKE: new ChallengeAchv(
|
NUZLOCKE: new ChallengeAchv("NUZLOCKE", "", "NUZLOCKE.description", "leaf_stone", 100, isNuzlockeChallenge),
|
||||||
"NUZLOCKE",
|
|
||||||
"",
|
|
||||||
"NUZLOCKE.description",
|
|
||||||
"leaf_stone",
|
|
||||||
100,
|
|
||||||
c =>
|
|
||||||
c instanceof LimitedCatchChallenge &&
|
|
||||||
c.value > 0 &&
|
|
||||||
globalScene.gameMode.challenges.some(c => c.id === Challenges.HARDCORE && c.value > 0) &&
|
|
||||||
globalScene.gameMode.challenges.some(c => c.id === Challenges.FRESH_START && c.value > 0),
|
|
||||||
),
|
|
||||||
BREEDERS_IN_SPACE: new Achv("BREEDERS_IN_SPACE", "", "BREEDERS_IN_SPACE.description", "moon_stone", 50).setSecret(),
|
BREEDERS_IN_SPACE: new Achv("BREEDERS_IN_SPACE", "", "BREEDERS_IN_SPACE.description", "moon_stone", 50).setSecret(),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -48,6 +48,7 @@ import { EggData } from "#system/egg-data";
|
|||||||
import { GameStats } from "#system/game-stats";
|
import { GameStats } from "#system/game-stats";
|
||||||
import { ModifierData as PersistentModifierData } from "#system/modifier-data";
|
import { ModifierData as PersistentModifierData } from "#system/modifier-data";
|
||||||
import { PokemonData } from "#system/pokemon-data";
|
import { PokemonData } from "#system/pokemon-data";
|
||||||
|
import { RibbonData } from "#system/ribbons/ribbon-data";
|
||||||
import { resetSettings, SettingKeys, setSetting } from "#system/settings";
|
import { resetSettings, SettingKeys, setSetting } from "#system/settings";
|
||||||
import { SettingGamepad, setSettingGamepad, settingGamepadDefaults } from "#system/settings-gamepad";
|
import { SettingGamepad, setSettingGamepad, settingGamepadDefaults } from "#system/settings-gamepad";
|
||||||
import type { SettingKeyboard } from "#system/settings-keyboard";
|
import type { SettingKeyboard } from "#system/settings-keyboard";
|
||||||
@ -402,7 +403,7 @@ export class GameData {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public initSystem(systemDataStr: string, cachedSystemDataStr?: string): Promise<boolean> {
|
public initSystem(systemDataStr: string, cachedSystemDataStr?: string): Promise<boolean> {
|
||||||
return new Promise<boolean>(resolve => {
|
const { promise, resolve } = Promise.withResolvers<boolean>();
|
||||||
try {
|
try {
|
||||||
let systemData = this.parseSystemData(systemDataStr);
|
let systemData = this.parseSystemData(systemDataStr);
|
||||||
|
|
||||||
@ -516,7 +517,7 @@ export class GameData {
|
|||||||
console.error(err);
|
console.error(err);
|
||||||
resolve(false);
|
resolve(false);
|
||||||
}
|
}
|
||||||
});
|
return promise;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -627,6 +628,9 @@ export class GameData {
|
|||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
if (k === "ribbons") {
|
||||||
|
return RibbonData.fromJSON(v);
|
||||||
|
}
|
||||||
|
|
||||||
return k.endsWith("Attr") && !["natureAttr", "abilityAttr", "passiveAttr"].includes(k) ? BigInt(v ?? 0) : v;
|
return k.endsWith("Attr") && !["natureAttr", "abilityAttr", "passiveAttr"].includes(k) ? BigInt(v ?? 0) : v;
|
||||||
}) as SystemSaveData;
|
}) as SystemSaveData;
|
||||||
@ -1634,6 +1638,7 @@ export class GameData {
|
|||||||
caughtCount: 0,
|
caughtCount: 0,
|
||||||
hatchedCount: 0,
|
hatchedCount: 0,
|
||||||
ivs: [0, 0, 0, 0, 0, 0],
|
ivs: [0, 0, 0, 0, 0, 0],
|
||||||
|
ribbons: new RibbonData(0),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1878,6 +1883,12 @@ export class GameData {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Increase the number of classic ribbons won with this species.
|
||||||
|
* @param species - The species to increment the ribbon count for
|
||||||
|
* @param forStarter - If true, will increment the ribbon count for the root species of the given species
|
||||||
|
* @returns The number of classic wins after incrementing.
|
||||||
|
*/
|
||||||
incrementRibbonCount(species: PokemonSpecies, forStarter = false): number {
|
incrementRibbonCount(species: PokemonSpecies, forStarter = false): number {
|
||||||
const speciesIdToIncrement: SpeciesId = species.getRootSpeciesId(forStarter);
|
const speciesIdToIncrement: SpeciesId = species.getRootSpeciesId(forStarter);
|
||||||
|
|
||||||
@ -2177,6 +2188,9 @@ export class GameData {
|
|||||||
if (!entry.hasOwnProperty("natureAttr") || (entry.caughtAttr && !entry.natureAttr)) {
|
if (!entry.hasOwnProperty("natureAttr") || (entry.caughtAttr && !entry.natureAttr)) {
|
||||||
entry.natureAttr = this.defaultDexData?.[k].natureAttr || 1 << randInt(25, 1);
|
entry.natureAttr = this.defaultDexData?.[k].natureAttr || 1 << randInt(25, 1);
|
||||||
}
|
}
|
||||||
|
if (!entry.hasOwnProperty("ribbons")) {
|
||||||
|
entry.ribbons = new RibbonData(0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
148
src/system/ribbons/ribbon-data.ts
Normal file
148
src/system/ribbons/ribbon-data.ts
Normal file
@ -0,0 +1,148 @@
|
|||||||
|
import type { Brander } from "#types/type-helpers";
|
||||||
|
|
||||||
|
export type RibbonFlag = (number & Brander<"RibbonFlag">) | 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class for ribbon data management. Usually constructed via the {@linkcode fromJSON} method.
|
||||||
|
*
|
||||||
|
* @remarks
|
||||||
|
* Stores information about the ribbons earned by a species using a bitfield.
|
||||||
|
*/
|
||||||
|
export class RibbonData {
|
||||||
|
/** Internal bitfield storing the unlock state for each ribbon */
|
||||||
|
private payload: number;
|
||||||
|
|
||||||
|
//#region Ribbons
|
||||||
|
//#region Monotype challenge ribbons
|
||||||
|
/** Ribbon for winning the normal monotype challenge */
|
||||||
|
public static readonly MONO_NORMAL = 0x1 as RibbonFlag;
|
||||||
|
/** Ribbon for winning the fighting monotype challenge */
|
||||||
|
public static readonly MONO_FIGHTING = 0x2 as RibbonFlag;
|
||||||
|
/** Ribbon for winning the flying monotype challenge */
|
||||||
|
public static readonly MONO_FLYING = 0x4 as RibbonFlag;
|
||||||
|
/** Ribbon for winning the poision monotype challenge */
|
||||||
|
public static readonly MONO_POISON = 0x8 as RibbonFlag;
|
||||||
|
/** Ribbon for winning the ground monotype challenge */
|
||||||
|
public static readonly MONO_GROUND = 0x10 as RibbonFlag;
|
||||||
|
/** Ribbon for winning the rock monotype challenge */
|
||||||
|
public static readonly MONO_ROCK = 0x20 as RibbonFlag;
|
||||||
|
/** Ribbon for winning the bug monotype challenge */
|
||||||
|
public static readonly MONO_BUG = 0x40 as RibbonFlag;
|
||||||
|
/** Ribbon for winning the ghost monotype challenge */
|
||||||
|
public static readonly MONO_GHOST = 0x80 as RibbonFlag;
|
||||||
|
/** Ribbon for winning the steel monotype challenge */
|
||||||
|
public static readonly MONO_STEEL = 0x100 as RibbonFlag;
|
||||||
|
/** Ribbon for winning the fire monotype challenge */
|
||||||
|
public static readonly MONO_FIRE = 0x200 as RibbonFlag;
|
||||||
|
/** Ribbon for winning the water monotype challenge */
|
||||||
|
public static readonly MONO_WATER = 0x400 as RibbonFlag;
|
||||||
|
/** Ribbon for winning the grass monotype challenge */
|
||||||
|
public static readonly MONO_GRASS = 0x800 as RibbonFlag;
|
||||||
|
/** Ribbon for winning the electric monotype challenge */
|
||||||
|
public static readonly MONO_ELECTRIC = 0x1000 as RibbonFlag;
|
||||||
|
/** Ribbon for winning the psychic monotype challenge */
|
||||||
|
public static readonly MONO_PSYCHIC = 0x2000 as RibbonFlag;
|
||||||
|
/** Ribbon for winning the ice monotype challenge */
|
||||||
|
public static readonly MONO_ICE = 0x4000 as RibbonFlag;
|
||||||
|
/** Ribbon for winning the dragon monotype challenge */
|
||||||
|
public static readonly MONO_DRAGON = 0x8000 as RibbonFlag;
|
||||||
|
/** Ribbon for winning the dark monotype challenge */
|
||||||
|
public static readonly MONO_DARK = 0x10000 as RibbonFlag;
|
||||||
|
/** Ribbon for winning the fairy monotype challenge */
|
||||||
|
public static readonly MONO_FAIRY = 0x20000 as RibbonFlag;
|
||||||
|
//#endregion Monotype ribbons
|
||||||
|
|
||||||
|
//#region Monogen ribbons
|
||||||
|
/** Ribbon for winning the the mono gen 1 challenge */
|
||||||
|
public static readonly MONO_GEN_1 = 0x40000 as RibbonFlag;
|
||||||
|
/** Ribbon for winning the the mono gen 2 challenge */
|
||||||
|
public static readonly MONO_GEN_2 = 0x80000 as RibbonFlag;
|
||||||
|
/** Ribbon for winning the mono gen 3 challenge */
|
||||||
|
public static readonly MONO_GEN_3 = 0x100000 as RibbonFlag;
|
||||||
|
/** Ribbon for winning the mono gen 4 challenge */
|
||||||
|
public static readonly MONO_GEN_4 = 0x200000 as RibbonFlag;
|
||||||
|
/** Ribbon for winning the mono gen 5 challenge */
|
||||||
|
public static readonly MONO_GEN_5 = 0x400000 as RibbonFlag;
|
||||||
|
/** Ribbon for winning the mono gen 6 challenge */
|
||||||
|
public static readonly MONO_GEN_6 = 0x800000 as RibbonFlag;
|
||||||
|
/** Ribbon for winning the mono gen 7 challenge */
|
||||||
|
public static readonly MONO_GEN_7 = 0x1000000 as RibbonFlag;
|
||||||
|
/** Ribbon for winning the mono gen 8 challenge */
|
||||||
|
public static readonly MONO_GEN_8 = 0x2000000 as RibbonFlag;
|
||||||
|
/** Ribbon for winning the mono gen 9 challenge */
|
||||||
|
public static readonly MONO_GEN_9 = 0x4000000 as RibbonFlag;
|
||||||
|
//#endregion Monogen ribbons
|
||||||
|
|
||||||
|
/** Ribbon for winning classic */
|
||||||
|
public static readonly CLASSIC = 0x8000000 as RibbonFlag;
|
||||||
|
/** Ribbon for winning the nuzzlocke challenge */
|
||||||
|
public static readonly NUZLOCKE = 0x10000000 as RibbonFlag;
|
||||||
|
/** Ribbon for reaching max friendship */
|
||||||
|
public static readonly FRIENDSHIP = 0x20000000 as RibbonFlag;
|
||||||
|
/** Ribbon for winning the flip stats challenge */
|
||||||
|
public static readonly FLIP_STATS = 0x40000000 as RibbonFlag;
|
||||||
|
/** Ribbon for winning the inverse challenge */
|
||||||
|
public static readonly INVERSE = 0x80000000 as RibbonFlag;
|
||||||
|
/** Ribbon for winning the fresh start challenge */
|
||||||
|
public static readonly FRESH_START = 0x100000000 as RibbonFlag;
|
||||||
|
/** Ribbon for winning the hardcore challenge */
|
||||||
|
public static readonly HARDCORE = 0x200000000 as RibbonFlag;
|
||||||
|
/** Ribbon for winning the limited catch challenge */
|
||||||
|
public static readonly LIMITED_CATCH = 0x400000000 as RibbonFlag;
|
||||||
|
/** Ribbon for winning the limited support challenge set to no heal */
|
||||||
|
public static readonly NO_HEAL = 0x800000000 as RibbonFlag;
|
||||||
|
/** Ribbon for winning the limited uspport challenge set to no shop */
|
||||||
|
public static readonly NO_SHOP = 0x1000000000 as RibbonFlag;
|
||||||
|
/** Ribbon for winning the limited support challenge set to both*/
|
||||||
|
public static readonly NO_SUPPORT = 0x2000000000 as RibbonFlag;
|
||||||
|
|
||||||
|
// NOTE: max possible ribbon flag is 0x20000000000000 (53 total ribbons)
|
||||||
|
// Once this is exceeded, bitfield needs to be changed to a bigint or even a uint array
|
||||||
|
// Note that this has no impact on serialization as it is stored in hex.
|
||||||
|
|
||||||
|
//#endregion Ribbons
|
||||||
|
|
||||||
|
/** Create a new instance of RibbonData. Generally, {@linkcode fromJSON} is used instead. */
|
||||||
|
constructor(value: number) {
|
||||||
|
this.payload = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Serialize the bitfield payload as a hex encoded string */
|
||||||
|
public toJSON(): string {
|
||||||
|
return this.payload.toString(16);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Decode a hexadecimal string representation of the bitfield into a `RibbonData` instance
|
||||||
|
*
|
||||||
|
* @param value - Hexadecimal string representation of the bitfield (without the leading 0x)
|
||||||
|
* @returns A new instance of `RibbonData` initialized with the provided bitfield.
|
||||||
|
*/
|
||||||
|
public static fromJSON(value: string): RibbonData {
|
||||||
|
try {
|
||||||
|
return new RibbonData(Number.parseInt(value, 16));
|
||||||
|
} catch {
|
||||||
|
return new RibbonData(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Award one or more ribbons to the ribbon data by setting the corresponding flags in the bitfield.
|
||||||
|
*
|
||||||
|
* @param flags - The flags to set. Can be a single flag or multiple flags.
|
||||||
|
*/
|
||||||
|
public award(...flags: [RibbonFlag, ...RibbonFlag[]]): void {
|
||||||
|
for (const f of flags) {
|
||||||
|
this.payload |= f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if a specific ribbon has been awarded
|
||||||
|
* @param flag - The ribbon to check
|
||||||
|
* @returns Whether the specified flag has been awarded
|
||||||
|
*/
|
||||||
|
public has(flag: RibbonFlag): boolean {
|
||||||
|
return !!(this.payload & flag);
|
||||||
|
}
|
||||||
|
}
|
20
src/system/ribbons/ribbon-methods.ts
Normal file
20
src/system/ribbons/ribbon-methods.ts
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
import { globalScene } from "#app/global-scene";
|
||||||
|
import { pokemonPrevolutions } from "#balance/pokemon-evolutions";
|
||||||
|
import type { SpeciesId } from "#enums/species-id";
|
||||||
|
import type { RibbonFlag } from "#system/ribbons/ribbon-data";
|
||||||
|
import { isNullOrUndefined } from "#utils/common";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Award one or more ribbons to a species and its pre-evolutions
|
||||||
|
*
|
||||||
|
* @param id - The ID of the species to award ribbons to
|
||||||
|
* @param ribbons - The ribbon(s) to award (use bitwise OR to combine multiple)
|
||||||
|
*/
|
||||||
|
export function awardRibbonsToSpeciesLine(id: SpeciesId, ribbons: RibbonFlag): void {
|
||||||
|
const dexData = globalScene.gameData.dexData;
|
||||||
|
dexData[id].ribbons.award(ribbons);
|
||||||
|
// Mark all pre-evolutions of the Pokémon with the same ribbon flags.
|
||||||
|
for (let prevoId = pokemonPrevolutions[id]; !isNullOrUndefined(prevoId); prevoId = pokemonPrevolutions[prevoId]) {
|
||||||
|
dexData[id].ribbons.award(ribbons);
|
||||||
|
}
|
||||||
|
}
|
@ -383,14 +383,14 @@ export class GameChallengesUiHandler extends UiHandler {
|
|||||||
this.updateChallengeArrows(this.startCursor.visible);
|
this.updateChallengeArrows(this.startCursor.visible);
|
||||||
} else {
|
} else {
|
||||||
globalScene.phaseManager.toTitleScreen();
|
globalScene.phaseManager.toTitleScreen();
|
||||||
globalScene.phaseManager.getCurrentPhase()?.end();
|
globalScene.phaseManager.getCurrentPhase().end();
|
||||||
}
|
}
|
||||||
success = true;
|
success = true;
|
||||||
} else if (button === Button.SUBMIT || button === Button.ACTION) {
|
} else if (button === Button.SUBMIT || button === Button.ACTION) {
|
||||||
if (this.hasSelectedChallenge) {
|
if (this.hasSelectedChallenge) {
|
||||||
if (this.startCursor.visible) {
|
if (this.startCursor.visible) {
|
||||||
globalScene.phaseManager.unshiftNew("SelectStarterPhase");
|
globalScene.phaseManager.unshiftNew("SelectStarterPhase");
|
||||||
globalScene.phaseManager.getCurrentPhase()?.end();
|
globalScene.phaseManager.getCurrentPhase().end();
|
||||||
} else {
|
} else {
|
||||||
this.startCursor.setVisible(true);
|
this.startCursor.setVisible(true);
|
||||||
this.cursorObj?.setVisible(false);
|
this.cursorObj?.setVisible(false);
|
||||||
|
@ -45,7 +45,7 @@ export class EggHatchSceneHandler extends UiHandler {
|
|||||||
processInput(button: Button): boolean {
|
processInput(button: Button): boolean {
|
||||||
if (button === Button.ACTION || button === Button.CANCEL) {
|
if (button === Button.ACTION || button === Button.CANCEL) {
|
||||||
const phase = globalScene.phaseManager.getCurrentPhase();
|
const phase = globalScene.phaseManager.getCurrentPhase();
|
||||||
if (phase?.is("EggHatchPhase") && phase.trySkip()) {
|
if (phase.is("EggHatchPhase") && phase.trySkip()) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -222,7 +222,7 @@ export class EggSummaryUiHandler extends MessageUiHandler {
|
|||||||
if (button === Button.CANCEL) {
|
if (button === Button.CANCEL) {
|
||||||
if (!this.blockExit) {
|
if (!this.blockExit) {
|
||||||
const phase = globalScene.phaseManager.getCurrentPhase();
|
const phase = globalScene.phaseManager.getCurrentPhase();
|
||||||
if (phase?.is("EggSummaryPhase")) {
|
if (phase.is("EggSummaryPhase")) {
|
||||||
phase.end();
|
phase.end();
|
||||||
}
|
}
|
||||||
success = true;
|
success = true;
|
||||||
|
@ -125,7 +125,7 @@ export class MenuUiHandler extends MessageUiHandler {
|
|||||||
const ui = this.getUi();
|
const ui = this.getUi();
|
||||||
this.excludedMenus = () => [
|
this.excludedMenus = () => [
|
||||||
{
|
{
|
||||||
condition: !!globalScene.phaseManager.getCurrentPhase()?.is("SelectModifierPhase"),
|
condition: globalScene.phaseManager.getCurrentPhase().is("SelectModifierPhase"),
|
||||||
options: [MenuOptions.EGG_GACHA],
|
options: [MenuOptions.EGG_GACHA],
|
||||||
},
|
},
|
||||||
{ condition: bypassLogin, options: [MenuOptions.LOG_OUT] },
|
{ condition: bypassLogin, options: [MenuOptions.LOG_OUT] },
|
||||||
|
@ -31,6 +31,11 @@ import { toTitleCase } from "#utils/strings";
|
|||||||
import i18next from "i18next";
|
import i18next from "i18next";
|
||||||
import type BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext";
|
import type BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext";
|
||||||
|
|
||||||
|
const DISCARD_BUTTON_X = 60;
|
||||||
|
const DISCARD_BUTTON_X_DOUBLES = 64;
|
||||||
|
const DISCARD_BUTTON_Y = -73;
|
||||||
|
const DISCARD_BUTTON_Y_DOUBLES = -58;
|
||||||
|
|
||||||
const defaultMessage = i18next.t("partyUiHandler:choosePokemon");
|
const defaultMessage = i18next.t("partyUiHandler:choosePokemon");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -301,7 +306,7 @@ export class PartyUiHandler extends MessageUiHandler {
|
|||||||
const partyMessageText = addTextObject(10, 8, defaultMessage, TextStyle.WINDOW, { maxLines: 2 });
|
const partyMessageText = addTextObject(10, 8, defaultMessage, TextStyle.WINDOW, { maxLines: 2 });
|
||||||
partyMessageText.setName("text-party-msg");
|
partyMessageText.setName("text-party-msg");
|
||||||
|
|
||||||
partyMessageText.setOrigin(0, 0);
|
partyMessageText.setOrigin(0);
|
||||||
partyMessageBoxContainer.add(partyMessageText);
|
partyMessageBoxContainer.add(partyMessageText);
|
||||||
|
|
||||||
this.message = partyMessageText;
|
this.message = partyMessageText;
|
||||||
@ -317,10 +322,8 @@ export class PartyUiHandler extends MessageUiHandler {
|
|||||||
this.iconAnimHandler = new PokemonIconAnimHandler();
|
this.iconAnimHandler = new PokemonIconAnimHandler();
|
||||||
this.iconAnimHandler.setup();
|
this.iconAnimHandler.setup();
|
||||||
|
|
||||||
const partyDiscardModeButton = new PartyDiscardModeButton(60, -globalScene.game.canvas.height / 15 - 1, this);
|
const partyDiscardModeButton = new PartyDiscardModeButton(DISCARD_BUTTON_X, DISCARD_BUTTON_Y, this);
|
||||||
|
|
||||||
partyContainer.add(partyDiscardModeButton);
|
partyContainer.add(partyDiscardModeButton);
|
||||||
|
|
||||||
this.partyDiscardModeButton = partyDiscardModeButton;
|
this.partyDiscardModeButton = partyDiscardModeButton;
|
||||||
|
|
||||||
// prepare move overlay
|
// prepare move overlay
|
||||||
@ -816,7 +819,7 @@ export class PartyUiHandler extends MessageUiHandler {
|
|||||||
// TODO: This risks hitting the other options (.MOVE_i and ALL) so does it? Do we need an extra check?
|
// TODO: This risks hitting the other options (.MOVE_i and ALL) so does it? Do we need an extra check?
|
||||||
if (
|
if (
|
||||||
option >= PartyOption.FORM_CHANGE_ITEM &&
|
option >= PartyOption.FORM_CHANGE_ITEM &&
|
||||||
globalScene.phaseManager.getCurrentPhase()?.is("SelectModifierPhase") &&
|
globalScene.phaseManager.getCurrentPhase().is("SelectModifierPhase") &&
|
||||||
this.partyUiMode === PartyUiMode.CHECK
|
this.partyUiMode === PartyUiMode.CHECK
|
||||||
) {
|
) {
|
||||||
const formChangeItemModifiers = this.getFormChangeItemsModifiers(pokemon);
|
const formChangeItemModifiers = this.getFormChangeItemsModifiers(pokemon);
|
||||||
@ -1233,7 +1236,7 @@ export class PartyUiHandler extends MessageUiHandler {
|
|||||||
}
|
}
|
||||||
if (!this.optionsCursorObj) {
|
if (!this.optionsCursorObj) {
|
||||||
this.optionsCursorObj = globalScene.add.image(0, 0, "cursor");
|
this.optionsCursorObj = globalScene.add.image(0, 0, "cursor");
|
||||||
this.optionsCursorObj.setOrigin(0, 0);
|
this.optionsCursorObj.setOrigin(0);
|
||||||
this.optionsContainer.add(this.optionsCursorObj);
|
this.optionsContainer.add(this.optionsCursorObj);
|
||||||
}
|
}
|
||||||
this.optionsCursorObj.setPosition(
|
this.optionsCursorObj.setPosition(
|
||||||
@ -1504,7 +1507,7 @@ export class PartyUiHandler extends MessageUiHandler {
|
|||||||
break;
|
break;
|
||||||
case PartyUiMode.CHECK:
|
case PartyUiMode.CHECK:
|
||||||
this.addCommonOptions(pokemon);
|
this.addCommonOptions(pokemon);
|
||||||
if (globalScene.phaseManager.getCurrentPhase()?.is("SelectModifierPhase")) {
|
if (globalScene.phaseManager.getCurrentPhase().is("SelectModifierPhase")) {
|
||||||
const formChangeItemModifiers = this.getFormChangeItemsModifiers(pokemon);
|
const formChangeItemModifiers = this.getFormChangeItemsModifiers(pokemon);
|
||||||
for (let i = 0; i < formChangeItemModifiers.length; i++) {
|
for (let i = 0; i < formChangeItemModifiers.length; i++) {
|
||||||
this.options.push(PartyOption.FORM_CHANGE_ITEM + i);
|
this.options.push(PartyOption.FORM_CHANGE_ITEM + i);
|
||||||
@ -1605,7 +1608,7 @@ export class PartyUiHandler extends MessageUiHandler {
|
|||||||
optionText.setColor("#40c8f8");
|
optionText.setColor("#40c8f8");
|
||||||
optionText.setShadowColor("#006090");
|
optionText.setShadowColor("#006090");
|
||||||
}
|
}
|
||||||
optionText.setOrigin(0, 0);
|
optionText.setOrigin(0);
|
||||||
|
|
||||||
/** For every item that has stack bigger than 1, display the current quantity selection */
|
/** For every item that has stack bigger than 1, display the current quantity selection */
|
||||||
const itemModifiers = this.getItemModifiers(pokemon);
|
const itemModifiers = this.getItemModifiers(pokemon);
|
||||||
@ -1802,6 +1805,7 @@ class PartySlot extends Phaser.GameObjects.Container {
|
|||||||
private selected: boolean;
|
private selected: boolean;
|
||||||
private transfer: boolean;
|
private transfer: boolean;
|
||||||
private slotIndex: number;
|
private slotIndex: number;
|
||||||
|
private isBenched: boolean;
|
||||||
private pokemon: PlayerPokemon;
|
private pokemon: PlayerPokemon;
|
||||||
|
|
||||||
private slotBg: Phaser.GameObjects.Image;
|
private slotBg: Phaser.GameObjects.Image;
|
||||||
@ -1812,6 +1816,7 @@ class PartySlot extends Phaser.GameObjects.Container {
|
|||||||
public slotHpText: Phaser.GameObjects.Text;
|
public slotHpText: Phaser.GameObjects.Text;
|
||||||
public slotDescriptionLabel: Phaser.GameObjects.Text; // this is used to show text instead of the HP bar i.e. for showing "Able"/"Not Able" for TMs when you try to learn them
|
public slotDescriptionLabel: Phaser.GameObjects.Text; // this is used to show text instead of the HP bar i.e. for showing "Able"/"Not Able" for TMs when you try to learn them
|
||||||
|
|
||||||
|
private slotBgKey: string;
|
||||||
private pokemonIcon: Phaser.GameObjects.Container;
|
private pokemonIcon: Phaser.GameObjects.Container;
|
||||||
private iconAnimHandler: PokemonIconAnimHandler;
|
private iconAnimHandler: PokemonIconAnimHandler;
|
||||||
|
|
||||||
@ -1822,19 +1827,34 @@ class PartySlot extends Phaser.GameObjects.Container {
|
|||||||
partyUiMode: PartyUiMode,
|
partyUiMode: PartyUiMode,
|
||||||
tmMoveId: MoveId,
|
tmMoveId: MoveId,
|
||||||
) {
|
) {
|
||||||
super(
|
const isBenched = slotIndex >= globalScene.currentBattle.getBattlerCount();
|
||||||
globalScene,
|
const isDoubleBattle = globalScene.currentBattle.double;
|
||||||
slotIndex >= globalScene.currentBattle.getBattlerCount() ? 230.5 : 64,
|
const isItemManageMode = partyUiMode === PartyUiMode.MODIFIER_TRANSFER || partyUiMode === PartyUiMode.DISCARD;
|
||||||
slotIndex >= globalScene.currentBattle.getBattlerCount()
|
|
||||||
? -184 +
|
/*
|
||||||
(globalScene.currentBattle.double ? -40 : 0) +
|
* Here we determine the position of the slot.
|
||||||
(28 + (globalScene.currentBattle.double ? 8 : 0)) * slotIndex
|
* The x coordinate depends on whether the pokemon is on the field or in the bench.
|
||||||
: partyUiMode === PartyUiMode.MODIFIER_TRANSFER
|
* The y coordinate depends on various factors, such as the number of pokémon on the field,
|
||||||
? -124 + (globalScene.currentBattle.double ? -20 : 0) + slotIndex * 55
|
* and whether the transfer/discard button is also on the screen.
|
||||||
: -124 + (globalScene.currentBattle.double ? -8 : 0) + slotIndex * 64,
|
*/
|
||||||
);
|
const slotPositionX = isBenched ? 143 : 9;
|
||||||
|
|
||||||
|
let slotPositionY: number;
|
||||||
|
if (isBenched) {
|
||||||
|
slotPositionY = -196 + (isDoubleBattle ? -40 : 0);
|
||||||
|
slotPositionY += (28 + (isDoubleBattle ? 8 : 0)) * slotIndex;
|
||||||
|
} else {
|
||||||
|
slotPositionY = -148.5;
|
||||||
|
if (isDoubleBattle) {
|
||||||
|
slotPositionY += isItemManageMode ? -20 : -8;
|
||||||
|
}
|
||||||
|
slotPositionY += (isItemManageMode ? (isDoubleBattle ? 47 : 55) : 64) * slotIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
super(globalScene, slotPositionX, slotPositionY);
|
||||||
|
|
||||||
this.slotIndex = slotIndex;
|
this.slotIndex = slotIndex;
|
||||||
|
this.isBenched = isBenched;
|
||||||
this.pokemon = pokemon;
|
this.pokemon = pokemon;
|
||||||
this.iconAnimHandler = iconAnimHandler;
|
this.iconAnimHandler = iconAnimHandler;
|
||||||
|
|
||||||
@ -1848,27 +1868,75 @@ class PartySlot extends Phaser.GameObjects.Container {
|
|||||||
setup(partyUiMode: PartyUiMode, tmMoveId: MoveId) {
|
setup(partyUiMode: PartyUiMode, tmMoveId: MoveId) {
|
||||||
const currentLanguage = i18next.resolvedLanguage ?? "en";
|
const currentLanguage = i18next.resolvedLanguage ?? "en";
|
||||||
const offsetJa = currentLanguage === "ja";
|
const offsetJa = currentLanguage === "ja";
|
||||||
|
const isItemManageMode = partyUiMode === PartyUiMode.MODIFIER_TRANSFER || partyUiMode === PartyUiMode.DISCARD;
|
||||||
|
|
||||||
const battlerCount = globalScene.currentBattle.getBattlerCount();
|
this.slotBgKey = this.isBenched
|
||||||
|
? "party_slot"
|
||||||
|
: isItemManageMode && globalScene.currentBattle.double
|
||||||
|
? "party_slot_main_short"
|
||||||
|
: "party_slot_main";
|
||||||
|
const fullSlotBgKey = this.pokemon.hp ? this.slotBgKey : `${this.slotBgKey}${"_fnt"}`;
|
||||||
|
this.slotBg = globalScene.add.sprite(0, 0, this.slotBgKey, fullSlotBgKey);
|
||||||
|
this.slotBg.setOrigin(0);
|
||||||
|
this.add(this.slotBg);
|
||||||
|
|
||||||
const slotKey = `party_slot${this.slotIndex >= battlerCount ? "" : "_main"}`;
|
const genderSymbol = getGenderSymbol(this.pokemon.getGender(true));
|
||||||
|
const isFusion = this.pokemon.isFusion();
|
||||||
|
|
||||||
const slotBg = globalScene.add.sprite(0, 0, slotKey, `${slotKey}${this.pokemon.hp ? "" : "_fnt"}`);
|
// Here we define positions and offsets
|
||||||
this.slotBg = slotBg;
|
// Base values are for the active pokemon; they are changed for benched pokemon,
|
||||||
|
// or for active pokemon if in a double battle in item management mode.
|
||||||
|
|
||||||
this.add(slotBg);
|
// icon position relative to slot background
|
||||||
|
let slotPb = { x: 4, y: 4 };
|
||||||
|
// name position relative to slot background
|
||||||
|
let namePosition = { x: 24, y: 10 + (offsetJa ? 2 : 0) };
|
||||||
|
// maximum allowed length of name; must accomodate fusion symbol
|
||||||
|
let maxNameTextWidth = 76 - (isFusion ? 8 : 0);
|
||||||
|
// "Lv." label position relative to slot background
|
||||||
|
let levelLabelPosition = { x: 24 + 8, y: 10 + 12 };
|
||||||
|
// offset from "Lv." to the level number; should not be changed.
|
||||||
|
const levelTextToLevelLabelOffset = { x: 9, y: offsetJa ? 1.5 : 0 };
|
||||||
|
// offests from "Lv." to gender, spliced and status icons, these depend on the type of slot.
|
||||||
|
let genderTextToLevelLabelOffset = { x: 68 - (isFusion ? 8 : 0), y: -9 };
|
||||||
|
let splicedIconToLevelLabelOffset = { x: 68, y: 3.5 - 12 };
|
||||||
|
let statusIconToLevelLabelOffset = { x: 55, y: 0 };
|
||||||
|
// offset from the name to the shiny icon (on the left); should not be changed.
|
||||||
|
const shinyIconToNameOffset = { x: -9, y: 3 };
|
||||||
|
// hp bar position relative to slot background
|
||||||
|
let hpBarPosition = { x: 8, y: 31 };
|
||||||
|
// offsets of hp bar overlay (showing the remaining hp) and number; should not be changed.
|
||||||
|
const hpOverlayToBarOffset = { x: 16, y: 2 };
|
||||||
|
const hpTextToBarOffset = { x: -3, y: -2 + (offsetJa ? 2 : 0) };
|
||||||
|
// description position relative to slot background
|
||||||
|
let descriptionLabelPosition = { x: 32, y: 46 };
|
||||||
|
|
||||||
const slotPb = globalScene.add.sprite(
|
// If in item management mode, the active slots are shorter
|
||||||
this.slotIndex >= battlerCount ? -85.5 : -51,
|
if (isItemManageMode && globalScene.currentBattle.double && !this.isBenched) {
|
||||||
this.slotIndex >= battlerCount ? 0 : -20.5,
|
namePosition.y -= 8;
|
||||||
"party_pb",
|
levelLabelPosition.y -= 8;
|
||||||
);
|
hpBarPosition.y -= 8;
|
||||||
this.slotPb = slotPb;
|
descriptionLabelPosition.y -= 8;
|
||||||
|
}
|
||||||
|
|
||||||
this.add(slotPb);
|
// Benched slots have significantly different parameters
|
||||||
|
if (this.isBenched) {
|
||||||
|
slotPb = { x: 2, y: 12 };
|
||||||
|
namePosition = { x: 21, y: 2 + (offsetJa ? 2 : 0) };
|
||||||
|
maxNameTextWidth = 52;
|
||||||
|
levelLabelPosition = { x: 21 + 8, y: 2 + 12 };
|
||||||
|
genderTextToLevelLabelOffset = { x: 36, y: 0 };
|
||||||
|
splicedIconToLevelLabelOffset = { x: 36 + (genderSymbol ? 8 : 0), y: 0.5 };
|
||||||
|
statusIconToLevelLabelOffset = { x: 43, y: 0 };
|
||||||
|
hpBarPosition = { x: 72, y: 6 };
|
||||||
|
descriptionLabelPosition = { x: 94, y: 16 };
|
||||||
|
}
|
||||||
|
|
||||||
this.pokemonIcon = globalScene.addPokemonIcon(this.pokemon, slotPb.x, slotPb.y, 0.5, 0.5, true);
|
this.slotPb = globalScene.add.sprite(0, 0, "party_pb");
|
||||||
|
this.slotPb.setPosition(slotPb.x, slotPb.y);
|
||||||
|
this.add(this.slotPb);
|
||||||
|
|
||||||
|
this.pokemonIcon = globalScene.addPokemonIcon(this.pokemon, this.slotPb.x, this.slotPb.y, 0.5, 0.5, true);
|
||||||
this.add(this.pokemonIcon);
|
this.add(this.pokemonIcon);
|
||||||
|
|
||||||
this.iconAnimHandler.addOrUpdate(this.pokemonIcon, PokemonIconAnimMode.PASSIVE);
|
this.iconAnimHandler.addOrUpdate(this.pokemonIcon, PokemonIconAnimMode.PASSIVE);
|
||||||
@ -1882,7 +1950,7 @@ class PartySlot extends Phaser.GameObjects.Container {
|
|||||||
const nameSizeTest = addTextObject(0, 0, displayName, TextStyle.PARTY);
|
const nameSizeTest = addTextObject(0, 0, displayName, TextStyle.PARTY);
|
||||||
nameTextWidth = nameSizeTest.displayWidth;
|
nameTextWidth = nameSizeTest.displayWidth;
|
||||||
|
|
||||||
while (nameTextWidth > (this.slotIndex >= battlerCount ? 52 : 76 - (this.pokemon.fusionSpecies ? 8 : 0))) {
|
while (nameTextWidth > maxNameTextWidth) {
|
||||||
displayName = `${displayName.slice(0, displayName.endsWith(".") ? -2 : -1).trimEnd()}.`;
|
displayName = `${displayName.slice(0, displayName.endsWith(".") ? -2 : -1).trimEnd()}.`;
|
||||||
nameSizeTest.setText(displayName);
|
nameSizeTest.setText(displayName);
|
||||||
nameTextWidth = nameSizeTest.displayWidth;
|
nameTextWidth = nameSizeTest.displayWidth;
|
||||||
@ -1891,78 +1959,59 @@ class PartySlot extends Phaser.GameObjects.Container {
|
|||||||
nameSizeTest.destroy();
|
nameSizeTest.destroy();
|
||||||
|
|
||||||
this.slotName = addTextObject(0, 0, displayName, TextStyle.PARTY);
|
this.slotName = addTextObject(0, 0, displayName, TextStyle.PARTY);
|
||||||
this.slotName.setPositionRelative(
|
this.slotName.setPositionRelative(this.slotBg, namePosition.x, namePosition.y);
|
||||||
slotBg,
|
this.slotName.setOrigin(0);
|
||||||
this.slotIndex >= battlerCount ? 21 : 24,
|
|
||||||
(this.slotIndex >= battlerCount ? 2 : 10) + (offsetJa ? 2 : 0),
|
|
||||||
);
|
|
||||||
this.slotName.setOrigin(0, 0);
|
|
||||||
|
|
||||||
const slotLevelLabel = globalScene.add.image(0, 0, "party_slot_overlay_lv");
|
const slotLevelLabel = globalScene.add
|
||||||
slotLevelLabel.setPositionRelative(
|
.image(0, 0, "party_slot_overlay_lv")
|
||||||
slotBg,
|
.setPositionRelative(this.slotBg, levelLabelPosition.x, levelLabelPosition.y)
|
||||||
(this.slotIndex >= battlerCount ? 21 : 24) + 8,
|
.setOrigin(0);
|
||||||
(this.slotIndex >= battlerCount ? 2 : 10) + 12,
|
|
||||||
);
|
|
||||||
slotLevelLabel.setOrigin(0, 0);
|
|
||||||
|
|
||||||
const slotLevelText = addTextObject(
|
const slotLevelText = addTextObject(
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
this.pokemon.level.toString(),
|
this.pokemon.level.toString(),
|
||||||
this.pokemon.level < globalScene.getMaxExpLevel() ? TextStyle.PARTY : TextStyle.PARTY_RED,
|
this.pokemon.level < globalScene.getMaxExpLevel() ? TextStyle.PARTY : TextStyle.PARTY_RED,
|
||||||
);
|
)
|
||||||
slotLevelText.setPositionRelative(slotLevelLabel, 9, offsetJa ? 1.5 : 0);
|
.setPositionRelative(slotLevelLabel, levelTextToLevelLabelOffset.x, levelTextToLevelLabelOffset.y)
|
||||||
slotLevelText.setOrigin(0, 0.25);
|
.setOrigin(0, 0.25);
|
||||||
|
|
||||||
slotInfoContainer.add([this.slotName, slotLevelLabel, slotLevelText]);
|
slotInfoContainer.add([this.slotName, slotLevelLabel, slotLevelText]);
|
||||||
|
|
||||||
const genderSymbol = getGenderSymbol(this.pokemon.getGender(true));
|
|
||||||
|
|
||||||
if (genderSymbol) {
|
if (genderSymbol) {
|
||||||
const slotGenderText = addTextObject(0, 0, genderSymbol, TextStyle.PARTY);
|
const slotGenderText = addTextObject(0, 0, genderSymbol, TextStyle.PARTY)
|
||||||
slotGenderText.setColor(getGenderColor(this.pokemon.getGender(true)));
|
.setColor(getGenderColor(this.pokemon.getGender(true)))
|
||||||
slotGenderText.setShadowColor(getGenderColor(this.pokemon.getGender(true), true));
|
.setShadowColor(getGenderColor(this.pokemon.getGender(true), true))
|
||||||
if (this.slotIndex >= battlerCount) {
|
.setPositionRelative(slotLevelLabel, genderTextToLevelLabelOffset.x, genderTextToLevelLabelOffset.y)
|
||||||
slotGenderText.setPositionRelative(slotLevelLabel, 36, 0);
|
.setOrigin(0, 0.25);
|
||||||
} else {
|
|
||||||
slotGenderText.setPositionRelative(this.slotName, 76 - (this.pokemon.fusionSpecies ? 8 : 0), 3);
|
|
||||||
}
|
|
||||||
slotGenderText.setOrigin(0, 0.25);
|
|
||||||
|
|
||||||
slotInfoContainer.add(slotGenderText);
|
slotInfoContainer.add(slotGenderText);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.pokemon.fusionSpecies) {
|
if (isFusion) {
|
||||||
const splicedIcon = globalScene.add.image(0, 0, "icon_spliced");
|
const splicedIcon = globalScene.add
|
||||||
splicedIcon.setScale(0.5);
|
.image(0, 0, "icon_spliced")
|
||||||
splicedIcon.setOrigin(0, 0);
|
.setScale(0.5)
|
||||||
if (this.slotIndex >= battlerCount) {
|
.setOrigin(0)
|
||||||
splicedIcon.setPositionRelative(slotLevelLabel, 36 + (genderSymbol ? 8 : 0), 0.5);
|
.setPositionRelative(slotLevelLabel, splicedIconToLevelLabelOffset.x, splicedIconToLevelLabelOffset.y);
|
||||||
} else {
|
|
||||||
splicedIcon.setPositionRelative(this.slotName, 76, 3.5);
|
|
||||||
}
|
|
||||||
|
|
||||||
slotInfoContainer.add(splicedIcon);
|
slotInfoContainer.add(splicedIcon);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.pokemon.status) {
|
if (this.pokemon.status) {
|
||||||
const statusIndicator = globalScene.add.sprite(0, 0, getLocalizedSpriteKey("statuses"));
|
const statusIndicator = globalScene.add
|
||||||
statusIndicator.setFrame(StatusEffect[this.pokemon.status?.effect].toLowerCase());
|
.sprite(0, 0, getLocalizedSpriteKey("statuses"))
|
||||||
statusIndicator.setOrigin(0, 0);
|
.setFrame(StatusEffect[this.pokemon.status?.effect].toLowerCase())
|
||||||
statusIndicator.setPositionRelative(slotLevelLabel, this.slotIndex >= battlerCount ? 43 : 55, 0);
|
.setOrigin(0)
|
||||||
|
.setPositionRelative(slotLevelLabel, statusIconToLevelLabelOffset.x, statusIconToLevelLabelOffset.y);
|
||||||
slotInfoContainer.add(statusIndicator);
|
slotInfoContainer.add(statusIndicator);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.pokemon.isShiny()) {
|
if (this.pokemon.isShiny()) {
|
||||||
const doubleShiny = this.pokemon.isDoubleShiny(false);
|
const doubleShiny = this.pokemon.isDoubleShiny(false);
|
||||||
|
|
||||||
const shinyStar = globalScene.add.image(0, 0, `shiny_star_small${doubleShiny ? "_1" : ""}`);
|
const shinyStar = globalScene.add
|
||||||
shinyStar.setOrigin(0, 0);
|
.image(0, 0, `shiny_star_small${doubleShiny ? "_1" : ""}`)
|
||||||
shinyStar.setPositionRelative(this.slotName, -9, 3);
|
.setOrigin(0)
|
||||||
shinyStar.setTint(getVariantTint(this.pokemon.getBaseVariant()));
|
.setPositionRelative(this.slotName, shinyIconToNameOffset.x, shinyIconToNameOffset.y)
|
||||||
|
.setTint(getVariantTint(this.pokemon.getBaseVariant()));
|
||||||
slotInfoContainer.add(shinyStar);
|
slotInfoContainer.add(shinyStar);
|
||||||
|
|
||||||
if (doubleShiny) {
|
if (doubleShiny) {
|
||||||
@ -1971,50 +2020,38 @@ class PartySlot extends Phaser.GameObjects.Container {
|
|||||||
.setOrigin(0)
|
.setOrigin(0)
|
||||||
.setPosition(shinyStar.x, shinyStar.y)
|
.setPosition(shinyStar.x, shinyStar.y)
|
||||||
.setTint(getVariantTint(this.pokemon.fusionVariant));
|
.setTint(getVariantTint(this.pokemon.fusionVariant));
|
||||||
|
|
||||||
slotInfoContainer.add(fusionShinyStar);
|
slotInfoContainer.add(fusionShinyStar);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this.slotHpBar = globalScene.add.image(0, 0, "party_slot_hp_bar");
|
this.slotHpBar = globalScene.add
|
||||||
this.slotHpBar.setPositionRelative(
|
.image(0, 0, "party_slot_hp_bar")
|
||||||
slotBg,
|
.setOrigin(0)
|
||||||
this.slotIndex >= battlerCount ? 72 : 8,
|
.setVisible(false)
|
||||||
this.slotIndex >= battlerCount ? 6 : 31,
|
.setPositionRelative(this.slotBg, hpBarPosition.x, hpBarPosition.y);
|
||||||
);
|
|
||||||
this.slotHpBar.setOrigin(0, 0);
|
|
||||||
this.slotHpBar.setVisible(false);
|
|
||||||
|
|
||||||
const hpRatio = this.pokemon.getHpRatio();
|
const hpRatio = this.pokemon.getHpRatio();
|
||||||
|
|
||||||
this.slotHpOverlay = globalScene.add.sprite(
|
this.slotHpOverlay = globalScene.add
|
||||||
0,
|
.sprite(0, 0, "party_slot_hp_overlay", hpRatio > 0.5 ? "high" : hpRatio > 0.25 ? "medium" : "low")
|
||||||
0,
|
.setOrigin(0)
|
||||||
"party_slot_hp_overlay",
|
.setPositionRelative(this.slotHpBar, hpOverlayToBarOffset.x, hpOverlayToBarOffset.y)
|
||||||
hpRatio > 0.5 ? "high" : hpRatio > 0.25 ? "medium" : "low",
|
.setScale(hpRatio, 1)
|
||||||
);
|
.setVisible(false);
|
||||||
this.slotHpOverlay.setPositionRelative(this.slotHpBar, 16, 2);
|
|
||||||
this.slotHpOverlay.setOrigin(0, 0);
|
|
||||||
this.slotHpOverlay.setScale(hpRatio, 1);
|
|
||||||
this.slotHpOverlay.setVisible(false);
|
|
||||||
|
|
||||||
this.slotHpText = addTextObject(0, 0, `${this.pokemon.hp}/${this.pokemon.getMaxHp()}`, TextStyle.PARTY);
|
this.slotHpText = addTextObject(0, 0, `${this.pokemon.hp}/${this.pokemon.getMaxHp()}`, TextStyle.PARTY)
|
||||||
this.slotHpText.setPositionRelative(
|
.setOrigin(1, 0)
|
||||||
|
.setPositionRelative(
|
||||||
this.slotHpBar,
|
this.slotHpBar,
|
||||||
this.slotHpBar.width - 3,
|
this.slotHpBar.width + hpTextToBarOffset.x,
|
||||||
this.slotHpBar.height - 2 + (offsetJa ? 2 : 0),
|
this.slotHpBar.height + hpTextToBarOffset.y,
|
||||||
);
|
) // TODO: annoying because it contains the width
|
||||||
this.slotHpText.setOrigin(1, 0);
|
.setVisible(false);
|
||||||
this.slotHpText.setVisible(false);
|
|
||||||
|
|
||||||
this.slotDescriptionLabel = addTextObject(0, 0, "", TextStyle.MESSAGE);
|
this.slotDescriptionLabel = addTextObject(0, 0, "", TextStyle.MESSAGE)
|
||||||
this.slotDescriptionLabel.setPositionRelative(
|
.setOrigin(0, 1)
|
||||||
slotBg,
|
.setVisible(false)
|
||||||
this.slotIndex >= battlerCount ? 94 : 32,
|
.setPositionRelative(this.slotBg, descriptionLabelPosition.x, descriptionLabelPosition.y);
|
||||||
this.slotIndex >= battlerCount ? 16 : 46,
|
|
||||||
);
|
|
||||||
this.slotDescriptionLabel.setOrigin(0, 1);
|
|
||||||
this.slotDescriptionLabel.setVisible(false);
|
|
||||||
|
|
||||||
slotInfoContainer.add([this.slotHpBar, this.slotHpOverlay, this.slotHpText, this.slotDescriptionLabel]);
|
slotInfoContainer.add([this.slotHpBar, this.slotHpOverlay, this.slotHpText, this.slotDescriptionLabel]);
|
||||||
|
|
||||||
@ -2076,10 +2113,9 @@ class PartySlot extends Phaser.GameObjects.Container {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private updateSlotTexture(): void {
|
private updateSlotTexture(): void {
|
||||||
const battlerCount = globalScene.currentBattle.getBattlerCount();
|
|
||||||
this.slotBg.setTexture(
|
this.slotBg.setTexture(
|
||||||
`party_slot${this.slotIndex >= battlerCount ? "" : "_main"}`,
|
this.slotBgKey,
|
||||||
`party_slot${this.slotIndex >= battlerCount ? "" : "_main"}${this.transfer ? "_swap" : this.pokemon.hp ? "" : "_fnt"}${this.selected ? "_sel" : ""}`,
|
`${this.slotBgKey}${this.transfer ? "_swap" : this.pokemon.hp ? "" : "_fnt"}${this.selected ? "_sel" : ""}`,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2198,10 +2234,6 @@ class PartyDiscardModeButton extends Phaser.GameObjects.Container {
|
|||||||
this.discardIcon.setVisible(false);
|
this.discardIcon.setVisible(false);
|
||||||
this.textBox.setVisible(true);
|
this.textBox.setVisible(true);
|
||||||
this.textBox.setText(i18next.t("partyUiHandler:TRANSFER"));
|
this.textBox.setText(i18next.t("partyUiHandler:TRANSFER"));
|
||||||
this.setPosition(
|
|
||||||
globalScene.currentBattle.double ? 64 : 60,
|
|
||||||
globalScene.currentBattle.double ? -48 : -globalScene.game.canvas.height / 15 - 1,
|
|
||||||
);
|
|
||||||
this.transferIcon.displayWidth = this.textBox.text.length * 9 + 3;
|
this.transferIcon.displayWidth = this.textBox.text.length * 9 + 3;
|
||||||
break;
|
break;
|
||||||
case PartyUiMode.DISCARD:
|
case PartyUiMode.DISCARD:
|
||||||
@ -2209,13 +2241,13 @@ class PartyDiscardModeButton extends Phaser.GameObjects.Container {
|
|||||||
this.discardIcon.setVisible(true);
|
this.discardIcon.setVisible(true);
|
||||||
this.textBox.setVisible(true);
|
this.textBox.setVisible(true);
|
||||||
this.textBox.setText(i18next.t("partyUiHandler:DISCARD"));
|
this.textBox.setText(i18next.t("partyUiHandler:DISCARD"));
|
||||||
this.setPosition(
|
|
||||||
globalScene.currentBattle.double ? 64 : 60,
|
|
||||||
globalScene.currentBattle.double ? -48 : -globalScene.game.canvas.height / 15 - 1,
|
|
||||||
);
|
|
||||||
this.discardIcon.displayWidth = this.textBox.text.length * 9 + 3;
|
this.discardIcon.displayWidth = this.textBox.text.length * 9 + 3;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
this.setPosition(
|
||||||
|
globalScene.currentBattle.double ? DISCARD_BUTTON_X_DOUBLES : DISCARD_BUTTON_X,
|
||||||
|
globalScene.currentBattle.double ? DISCARD_BUTTON_Y_DOUBLES : DISCARD_BUTTON_Y,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
clear() {
|
clear() {
|
||||||
|
@ -705,7 +705,7 @@ export class PokedexPageUiHandler extends MessageUiHandler {
|
|||||||
show(args: any[]): boolean {
|
show(args: any[]): boolean {
|
||||||
// Allow the use of candies if we are in one of the whitelisted phases
|
// Allow the use of candies if we are in one of the whitelisted phases
|
||||||
this.canUseCandies = ["TitlePhase", "SelectStarterPhase", "CommandPhase"].includes(
|
this.canUseCandies = ["TitlePhase", "SelectStarterPhase", "CommandPhase"].includes(
|
||||||
globalScene.phaseManager.getCurrentPhase()?.phaseName ?? "",
|
globalScene.phaseManager.getCurrentPhase().phaseName,
|
||||||
);
|
);
|
||||||
|
|
||||||
if (args.length >= 1 && args[0] === "refresh") {
|
if (args.length >= 1 && args[0] === "refresh") {
|
||||||
|
@ -45,6 +45,7 @@ import type { Variant } from "#sprites/variant";
|
|||||||
import { getVariantIcon, getVariantTint } from "#sprites/variant";
|
import { getVariantIcon, getVariantTint } from "#sprites/variant";
|
||||||
import { achvs } from "#system/achv";
|
import { achvs } from "#system/achv";
|
||||||
import type { DexAttrProps, StarterAttributes, StarterMoveset } from "#system/game-data";
|
import type { DexAttrProps, StarterAttributes, StarterMoveset } from "#system/game-data";
|
||||||
|
import { RibbonData } from "#system/ribbons/ribbon-data";
|
||||||
import { SettingKeyboard } from "#system/settings-keyboard";
|
import { SettingKeyboard } from "#system/settings-keyboard";
|
||||||
import type { DexEntry } from "#types/dex-data";
|
import type { DexEntry } from "#types/dex-data";
|
||||||
import type { OptionSelectItem } from "#ui/abstract-option-select-ui-handler";
|
import type { OptionSelectItem } from "#ui/abstract-option-select-ui-handler";
|
||||||
@ -3226,6 +3227,8 @@ export class StarterSelectUiHandler extends MessageUiHandler {
|
|||||||
onScreenFirstIndex + maxRows * maxColumns - 1,
|
onScreenFirstIndex + maxRows * maxColumns - 1,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const gameData = globalScene.gameData;
|
||||||
|
|
||||||
this.starterSelectScrollBar.setScrollCursor(this.scrollCursor);
|
this.starterSelectScrollBar.setScrollCursor(this.scrollCursor);
|
||||||
|
|
||||||
let pokerusCursorIndex = 0;
|
let pokerusCursorIndex = 0;
|
||||||
@ -3265,9 +3268,9 @@ export class StarterSelectUiHandler extends MessageUiHandler {
|
|||||||
|
|
||||||
container.label.setVisible(true);
|
container.label.setVisible(true);
|
||||||
const speciesVariants =
|
const speciesVariants =
|
||||||
speciesId && globalScene.gameData.dexData[speciesId].caughtAttr & DexAttr.SHINY
|
speciesId && gameData.dexData[speciesId].caughtAttr & DexAttr.SHINY
|
||||||
? [DexAttr.DEFAULT_VARIANT, DexAttr.VARIANT_2, DexAttr.VARIANT_3].filter(
|
? [DexAttr.DEFAULT_VARIANT, DexAttr.VARIANT_2, DexAttr.VARIANT_3].filter(
|
||||||
v => !!(globalScene.gameData.dexData[speciesId].caughtAttr & v),
|
v => !!(gameData.dexData[speciesId].caughtAttr & v),
|
||||||
)
|
)
|
||||||
: [];
|
: [];
|
||||||
for (let v = 0; v < 3; v++) {
|
for (let v = 0; v < 3; v++) {
|
||||||
@ -3282,12 +3285,15 @@ export class StarterSelectUiHandler extends MessageUiHandler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
container.starterPassiveBgs.setVisible(!!globalScene.gameData.starterData[speciesId].passiveAttr);
|
container.starterPassiveBgs.setVisible(!!gameData.starterData[speciesId].passiveAttr);
|
||||||
container.hiddenAbilityIcon.setVisible(
|
container.hiddenAbilityIcon.setVisible(
|
||||||
!!globalScene.gameData.dexData[speciesId].caughtAttr &&
|
!!gameData.dexData[speciesId].caughtAttr && !!(gameData.starterData[speciesId].abilityAttr & 4),
|
||||||
!!(globalScene.gameData.starterData[speciesId].abilityAttr & 4),
|
);
|
||||||
|
container.classicWinIcon
|
||||||
|
.setVisible(gameData.starterData[speciesId].classicWinCount > 0)
|
||||||
|
.setTexture(
|
||||||
|
gameData.dexData[speciesId].ribbons.has(RibbonData.NUZLOCKE) ? "champion_ribbon_emerald" : "champion_ribbon",
|
||||||
);
|
);
|
||||||
container.classicWinIcon.setVisible(globalScene.gameData.starterData[speciesId].classicWinCount > 0);
|
|
||||||
container.favoriteIcon.setVisible(this.starterPreferences[speciesId]?.favorite ?? false);
|
container.favoriteIcon.setVisible(this.starterPreferences[speciesId]?.favorite ?? false);
|
||||||
|
|
||||||
// 'Candy Icon' mode
|
// 'Candy Icon' mode
|
||||||
@ -4271,7 +4277,7 @@ export class StarterSelectUiHandler extends MessageUiHandler {
|
|||||||
globalScene.phaseManager.pushNew("EncounterPhase");
|
globalScene.phaseManager.pushNew("EncounterPhase");
|
||||||
}
|
}
|
||||||
this.clearText();
|
this.clearText();
|
||||||
globalScene.phaseManager.getCurrentPhase()?.end();
|
globalScene.phaseManager.getCurrentPhase().end();
|
||||||
},
|
},
|
||||||
cancel,
|
cancel,
|
||||||
null,
|
null,
|
||||||
|
@ -4,6 +4,7 @@ import { pokemonEvolutions } from "#balance/pokemon-evolutions";
|
|||||||
import { pokemonFormChanges } from "#data/pokemon-forms";
|
import { pokemonFormChanges } from "#data/pokemon-forms";
|
||||||
import type { PokemonSpecies } from "#data/pokemon-species";
|
import type { PokemonSpecies } from "#data/pokemon-species";
|
||||||
import { ChallengeType } from "#enums/challenge-type";
|
import { ChallengeType } from "#enums/challenge-type";
|
||||||
|
import { Challenges } from "#enums/challenges";
|
||||||
import type { MoveId } from "#enums/move-id";
|
import type { MoveId } from "#enums/move-id";
|
||||||
import type { MoveSourceType } from "#enums/move-source-type";
|
import type { MoveSourceType } from "#enums/move-source-type";
|
||||||
import type { SpeciesId } from "#enums/species-id";
|
import type { SpeciesId } from "#enums/species-id";
|
||||||
@ -378,7 +379,7 @@ export function checkStarterValidForChallenge(species: PokemonSpecies, props: De
|
|||||||
* @param soft - If `true`, allow it if it could become valid through a form change.
|
* @param soft - If `true`, allow it if it could become valid through a form change.
|
||||||
* @returns `true` if the species is considered valid.
|
* @returns `true` if the species is considered valid.
|
||||||
*/
|
*/
|
||||||
function checkSpeciesValidForChallenge(species: PokemonSpecies, props: DexAttrProps, soft: boolean) {
|
export function checkSpeciesValidForChallenge(species: PokemonSpecies, props: DexAttrProps, soft: boolean) {
|
||||||
const isValidForChallenge = new BooleanHolder(true);
|
const isValidForChallenge = new BooleanHolder(true);
|
||||||
applyChallenges(ChallengeType.STARTER_CHOICE, species, isValidForChallenge, props);
|
applyChallenges(ChallengeType.STARTER_CHOICE, species, isValidForChallenge, props);
|
||||||
if (!soft || !pokemonFormChanges.hasOwnProperty(species.speciesId)) {
|
if (!soft || !pokemonFormChanges.hasOwnProperty(species.speciesId)) {
|
||||||
@ -407,3 +408,28 @@ function checkSpeciesValidForChallenge(species: PokemonSpecies, props: DexAttrPr
|
|||||||
});
|
});
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @returns Whether the current game mode meets the criteria to be considered a Nuzlocke challenge */
|
||||||
|
export function isNuzlockeChallenge(): boolean {
|
||||||
|
let isFreshStart = false;
|
||||||
|
let isLimitedCatch = false;
|
||||||
|
let isHardcore = false;
|
||||||
|
for (const challenge of globalScene.gameMode.challenges) {
|
||||||
|
// value is 0 if challenge is not active
|
||||||
|
if (!challenge.value) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
switch (challenge.id) {
|
||||||
|
case Challenges.FRESH_START:
|
||||||
|
isFreshStart = true;
|
||||||
|
break;
|
||||||
|
case Challenges.LIMITED_CATCH:
|
||||||
|
isLimitedCatch = true;
|
||||||
|
break;
|
||||||
|
case Challenges.HARDCORE:
|
||||||
|
isHardcore = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return isFreshStart && isLimitedCatch && isHardcore;
|
||||||
|
}
|
||||||
|
10
test/@types/vitest.d.ts
vendored
10
test/@types/vitest.d.ts
vendored
@ -15,6 +15,8 @@ import type { AtLeastOne } from "#types/type-helpers";
|
|||||||
import type { expect } from "vitest";
|
import type { expect } from "vitest";
|
||||||
import type Overrides from "#app/overrides";
|
import type Overrides from "#app/overrides";
|
||||||
import type { PokemonMove } from "#moves/pokemon-move";
|
import type { PokemonMove } from "#moves/pokemon-move";
|
||||||
|
import type { PhaseString } from "#types/phase-types";
|
||||||
|
import type { Phase } from "#app/phase";
|
||||||
|
|
||||||
declare module "vitest" {
|
declare module "vitest" {
|
||||||
interface Assertion {
|
interface Assertion {
|
||||||
@ -29,6 +31,12 @@ declare module "vitest" {
|
|||||||
*/
|
*/
|
||||||
toEqualArrayUnsorted<E>(expected: E[]): void;
|
toEqualArrayUnsorted<E>(expected: E[]): void;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if the currently running {@linkcode Phase} is of the given type.
|
||||||
|
* @param expectedPhase - The expected {@linkcode PhaseString}
|
||||||
|
*/
|
||||||
|
toBeAtPhase(expectedPhase: PhaseString): void;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check whether a {@linkcode Pokemon}'s current typing includes the given types.
|
* Check whether a {@linkcode Pokemon}'s current typing includes the given types.
|
||||||
*
|
*
|
||||||
@ -130,7 +138,7 @@ declare module "vitest" {
|
|||||||
* @param ppUsed - The numerical amount of PP that should have been consumed,
|
* @param ppUsed - The numerical amount of PP that should have been consumed,
|
||||||
* or `all` to indicate the move should be _out_ of PP
|
* or `all` to indicate the move should be _out_ of PP
|
||||||
* @remarks
|
* @remarks
|
||||||
* If the Pokemon's moveset has been set via {@linkcode Overrides.MOVESET_OVERRIDE}/{@linkcode Overrides.OPP_MOVESET_OVERRIDE},
|
* If the Pokemon's moveset has been set via {@linkcode Overrides.MOVESET_OVERRIDE}/{@linkcode Overrides.ENEMY_MOVESET_OVERRIDE},
|
||||||
* does not contain {@linkcode expectedMove}
|
* does not contain {@linkcode expectedMove}
|
||||||
* or contains the desired move more than once, this will fail the test.
|
* or contains the desired move more than once, this will fail the test.
|
||||||
*/
|
*/
|
||||||
|
@ -196,7 +196,7 @@ describe("Abilities - Disguise", () => {
|
|||||||
game.move.select(MoveId.SHADOW_SNEAK);
|
game.move.select(MoveId.SHADOW_SNEAK);
|
||||||
await game.toNextWave();
|
await game.toNextWave();
|
||||||
|
|
||||||
expect(game.scene.phaseManager.getCurrentPhase()?.constructor.name).toBe("CommandPhase");
|
expect(game).toBeAtPhase("CommandPhase");
|
||||||
expect(game.scene.currentBattle.waveIndex).toBe(2);
|
expect(game.scene.currentBattle.waveIndex).toBe(2);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -86,7 +86,7 @@ describe("Phase - Battle Phase", () => {
|
|||||||
it("newGame one-liner", async () => {
|
it("newGame one-liner", async () => {
|
||||||
await game.classicMode.startBattle();
|
await game.classicMode.startBattle();
|
||||||
expect(game.scene.ui?.getMode()).toBe(UiMode.COMMAND);
|
expect(game.scene.ui?.getMode()).toBe(UiMode.COMMAND);
|
||||||
expect(game.scene.phaseManager.getCurrentPhase()?.phaseName).toBe("CommandPhase");
|
expect(game).toBeAtPhase("CommandPhase");
|
||||||
});
|
});
|
||||||
|
|
||||||
it("do attack wave 3 - single battle - regular - OHKO", async () => {
|
it("do attack wave 3 - single battle - regular - OHKO", async () => {
|
||||||
|
@ -36,62 +36,62 @@ describe("Test Battle Phase", () => {
|
|||||||
game.override.battleStyle("single").startingWave(10);
|
game.override.battleStyle("single").startingWave(10);
|
||||||
await game.classicMode.startBattle([SpeciesId.BLASTOISE, SpeciesId.CHARIZARD]);
|
await game.classicMode.startBattle([SpeciesId.BLASTOISE, SpeciesId.CHARIZARD]);
|
||||||
expect(game.scene.ui?.getMode()).toBe(UiMode.COMMAND);
|
expect(game.scene.ui?.getMode()).toBe(UiMode.COMMAND);
|
||||||
expect(game.scene.phaseManager.getCurrentPhase()?.phaseName).toBe("CommandPhase");
|
expect(game).toBeAtPhase("CommandPhase");
|
||||||
});
|
});
|
||||||
|
|
||||||
it("startBattle 2vs2 boss", async () => {
|
it("startBattle 2vs2 boss", async () => {
|
||||||
game.override.battleStyle("double").startingWave(10);
|
game.override.battleStyle("double").startingWave(10);
|
||||||
await game.classicMode.startBattle([SpeciesId.BLASTOISE, SpeciesId.CHARIZARD]);
|
await game.classicMode.startBattle([SpeciesId.BLASTOISE, SpeciesId.CHARIZARD]);
|
||||||
expect(game.scene.ui?.getMode()).toBe(UiMode.COMMAND);
|
expect(game.scene.ui?.getMode()).toBe(UiMode.COMMAND);
|
||||||
expect(game.scene.phaseManager.getCurrentPhase()?.phaseName).toBe("CommandPhase");
|
expect(game).toBeAtPhase("CommandPhase");
|
||||||
});
|
});
|
||||||
|
|
||||||
it("startBattle 2vs2 trainer", async () => {
|
it("startBattle 2vs2 trainer", async () => {
|
||||||
game.override.battleStyle("double").startingWave(5);
|
game.override.battleStyle("double").startingWave(5);
|
||||||
await game.classicMode.startBattle([SpeciesId.BLASTOISE, SpeciesId.CHARIZARD]);
|
await game.classicMode.startBattle([SpeciesId.BLASTOISE, SpeciesId.CHARIZARD]);
|
||||||
expect(game.scene.ui?.getMode()).toBe(UiMode.COMMAND);
|
expect(game.scene.ui?.getMode()).toBe(UiMode.COMMAND);
|
||||||
expect(game.scene.phaseManager.getCurrentPhase()?.phaseName).toBe("CommandPhase");
|
expect(game).toBeAtPhase("CommandPhase");
|
||||||
});
|
});
|
||||||
|
|
||||||
it("startBattle 2vs1 trainer", async () => {
|
it("startBattle 2vs1 trainer", async () => {
|
||||||
game.override.battleStyle("single").startingWave(5);
|
game.override.battleStyle("single").startingWave(5);
|
||||||
await game.classicMode.startBattle([SpeciesId.BLASTOISE, SpeciesId.CHARIZARD]);
|
await game.classicMode.startBattle([SpeciesId.BLASTOISE, SpeciesId.CHARIZARD]);
|
||||||
expect(game.scene.ui?.getMode()).toBe(UiMode.COMMAND);
|
expect(game.scene.ui?.getMode()).toBe(UiMode.COMMAND);
|
||||||
expect(game.scene.phaseManager.getCurrentPhase()?.phaseName).toBe("CommandPhase");
|
expect(game).toBeAtPhase("CommandPhase");
|
||||||
});
|
});
|
||||||
|
|
||||||
it("startBattle 2vs1 rival", async () => {
|
it("startBattle 2vs1 rival", async () => {
|
||||||
game.override.battleStyle("single").startingWave(8);
|
game.override.battleStyle("single").startingWave(8);
|
||||||
await game.classicMode.startBattle([SpeciesId.BLASTOISE, SpeciesId.CHARIZARD]);
|
await game.classicMode.startBattle([SpeciesId.BLASTOISE, SpeciesId.CHARIZARD]);
|
||||||
expect(game.scene.ui?.getMode()).toBe(UiMode.COMMAND);
|
expect(game.scene.ui?.getMode()).toBe(UiMode.COMMAND);
|
||||||
expect(game.scene.phaseManager.getCurrentPhase()?.phaseName).toBe("CommandPhase");
|
expect(game).toBeAtPhase("CommandPhase");
|
||||||
});
|
});
|
||||||
|
|
||||||
it("startBattle 2vs2 rival", async () => {
|
it("startBattle 2vs2 rival", async () => {
|
||||||
game.override.battleStyle("double").startingWave(8);
|
game.override.battleStyle("double").startingWave(8);
|
||||||
await game.classicMode.startBattle([SpeciesId.BLASTOISE, SpeciesId.CHARIZARD]);
|
await game.classicMode.startBattle([SpeciesId.BLASTOISE, SpeciesId.CHARIZARD]);
|
||||||
expect(game.scene.ui?.getMode()).toBe(UiMode.COMMAND);
|
expect(game.scene.ui?.getMode()).toBe(UiMode.COMMAND);
|
||||||
expect(game.scene.phaseManager.getCurrentPhase()?.phaseName).toBe("CommandPhase");
|
expect(game).toBeAtPhase("CommandPhase");
|
||||||
});
|
});
|
||||||
|
|
||||||
it("startBattle 1vs1 trainer", async () => {
|
it("startBattle 1vs1 trainer", async () => {
|
||||||
game.override.battleStyle("single").startingWave(5);
|
game.override.battleStyle("single").startingWave(5);
|
||||||
await game.classicMode.startBattle([SpeciesId.BLASTOISE]);
|
await game.classicMode.startBattle([SpeciesId.BLASTOISE]);
|
||||||
expect(game.scene.ui?.getMode()).toBe(UiMode.COMMAND);
|
expect(game.scene.ui?.getMode()).toBe(UiMode.COMMAND);
|
||||||
expect(game.scene.phaseManager.getCurrentPhase()?.phaseName).toBe("CommandPhase");
|
expect(game).toBeAtPhase("CommandPhase");
|
||||||
});
|
});
|
||||||
|
|
||||||
it("startBattle 2vs2 trainer", async () => {
|
it("startBattle 2vs2 trainer", async () => {
|
||||||
game.override.battleStyle("double").startingWave(5);
|
game.override.battleStyle("double").startingWave(5);
|
||||||
await game.classicMode.startBattle([SpeciesId.BLASTOISE, SpeciesId.CHARIZARD]);
|
await game.classicMode.startBattle([SpeciesId.BLASTOISE, SpeciesId.CHARIZARD]);
|
||||||
expect(game.scene.ui?.getMode()).toBe(UiMode.COMMAND);
|
expect(game.scene.ui?.getMode()).toBe(UiMode.COMMAND);
|
||||||
expect(game.scene.phaseManager.getCurrentPhase()?.phaseName).toBe("CommandPhase");
|
expect(game).toBeAtPhase("CommandPhase");
|
||||||
});
|
});
|
||||||
|
|
||||||
it("startBattle 4vs2 trainer", async () => {
|
it("startBattle 4vs2 trainer", async () => {
|
||||||
game.override.battleStyle("double").startingWave(5);
|
game.override.battleStyle("double").startingWave(5);
|
||||||
await game.classicMode.startBattle([SpeciesId.BLASTOISE, SpeciesId.CHARIZARD, SpeciesId.DARKRAI, SpeciesId.GABITE]);
|
await game.classicMode.startBattle([SpeciesId.BLASTOISE, SpeciesId.CHARIZARD, SpeciesId.DARKRAI, SpeciesId.GABITE]);
|
||||||
expect(game.scene.ui?.getMode()).toBe(UiMode.COMMAND);
|
expect(game.scene.ui?.getMode()).toBe(UiMode.COMMAND);
|
||||||
expect(game.scene.phaseManager.getCurrentPhase()?.phaseName).toBe("CommandPhase");
|
expect(game).toBeAtPhase("CommandPhase");
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
import { toBeAtPhase } from "#test/test-utils/matchers/to-be-at-phase";
|
||||||
import { toEqualArrayUnsorted } from "#test/test-utils/matchers/to-equal-array-unsorted";
|
import { toEqualArrayUnsorted } from "#test/test-utils/matchers/to-equal-array-unsorted";
|
||||||
import { toHaveAbilityApplied } from "#test/test-utils/matchers/to-have-ability-applied";
|
import { toHaveAbilityApplied } from "#test/test-utils/matchers/to-have-ability-applied";
|
||||||
import { toHaveBattlerTag } from "#test/test-utils/matchers/to-have-battler-tag";
|
import { toHaveBattlerTag } from "#test/test-utils/matchers/to-have-battler-tag";
|
||||||
@ -22,6 +23,7 @@ import { expect } from "vitest";
|
|||||||
|
|
||||||
expect.extend({
|
expect.extend({
|
||||||
toEqualArrayUnsorted,
|
toEqualArrayUnsorted,
|
||||||
|
toBeAtPhase,
|
||||||
toHaveTypes,
|
toHaveTypes,
|
||||||
toHaveUsedMove,
|
toHaveUsedMove,
|
||||||
toHaveEffectiveStat,
|
toHaveEffectiveStat,
|
||||||
|
@ -212,7 +212,7 @@ describe("Transforming Effects", () => {
|
|||||||
await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]);
|
await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]);
|
||||||
await game.toNextWave();
|
await game.toNextWave();
|
||||||
|
|
||||||
expect(game.scene.phaseManager.getCurrentPhase()?.phaseName).toBe("CommandPhase");
|
expect(game).toBeAtPhase("CommandPhase");
|
||||||
expect(game.scene.currentBattle.waveIndex).toBe(2);
|
expect(game.scene.currentBattle.waveIndex).toBe(2);
|
||||||
|
|
||||||
await game.reload.reloadSession();
|
await game.reload.reloadSession();
|
||||||
@ -242,7 +242,7 @@ describe("Transforming Effects", () => {
|
|||||||
await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]);
|
await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]);
|
||||||
await game.toNextWave();
|
await game.toNextWave();
|
||||||
|
|
||||||
expect(game.scene.phaseManager.getCurrentPhase()?.phaseName).toBe("CommandPhase");
|
expect(game).toBeAtPhase("CommandPhase");
|
||||||
expect(game.scene.currentBattle.waveIndex).toBe(2);
|
expect(game.scene.currentBattle.waveIndex).toBe(2);
|
||||||
|
|
||||||
expect(player.getSpeciesForm().speciesId).toBe(enemy.getSpeciesForm().speciesId);
|
expect(player.getSpeciesForm().speciesId).toBe(enemy.getSpeciesForm().speciesId);
|
||||||
|
@ -9,7 +9,6 @@ import { ATrainersTestEncounter } from "#mystery-encounters/a-trainers-test-enco
|
|||||||
import * as EncounterPhaseUtils from "#mystery-encounters/encounter-phase-utils";
|
import * as EncounterPhaseUtils from "#mystery-encounters/encounter-phase-utils";
|
||||||
import * as MysteryEncounters from "#mystery-encounters/mystery-encounters";
|
import * as MysteryEncounters from "#mystery-encounters/mystery-encounters";
|
||||||
import { HUMAN_TRANSITABLE_BIOMES } from "#mystery-encounters/mystery-encounters";
|
import { HUMAN_TRANSITABLE_BIOMES } from "#mystery-encounters/mystery-encounters";
|
||||||
import { CommandPhase } from "#phases/command-phase";
|
|
||||||
import { PartyHealPhase } from "#phases/party-heal-phase";
|
import { PartyHealPhase } from "#phases/party-heal-phase";
|
||||||
import { SelectModifierPhase } from "#phases/select-modifier-phase";
|
import { SelectModifierPhase } from "#phases/select-modifier-phase";
|
||||||
import {
|
import {
|
||||||
@ -106,7 +105,7 @@ describe("A Trainer's Test - Mystery Encounter", () => {
|
|||||||
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
||||||
|
|
||||||
const enemyField = scene.getEnemyField();
|
const enemyField = scene.getEnemyField();
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name);
|
expect(game).toBeAtPhase("CommandPhase");
|
||||||
expect(enemyField.length).toBe(1);
|
expect(enemyField.length).toBe(1);
|
||||||
expect(scene.currentBattle.trainer).toBeDefined();
|
expect(scene.currentBattle.trainer).toBeDefined();
|
||||||
expect(
|
expect(
|
||||||
@ -131,7 +130,7 @@ describe("A Trainer's Test - Mystery Encounter", () => {
|
|||||||
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
||||||
await skipBattleRunMysteryEncounterRewardsPhase(game);
|
await skipBattleRunMysteryEncounterRewardsPhase(game);
|
||||||
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name);
|
expect(game).toBeAtPhase("SelectModifierPhase");
|
||||||
|
|
||||||
const eggsAfter = scene.gameData.eggs;
|
const eggsAfter = scene.gameData.eggs;
|
||||||
expect(eggsAfter).toBeDefined();
|
expect(eggsAfter).toBeDefined();
|
||||||
@ -179,7 +178,7 @@ describe("A Trainer's Test - Mystery Encounter", () => {
|
|||||||
|
|
||||||
await runMysteryEncounterToEnd(game, 2);
|
await runMysteryEncounterToEnd(game, 2);
|
||||||
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name);
|
expect(game).toBeAtPhase("SelectModifierPhase");
|
||||||
|
|
||||||
const eggsAfter = scene.gameData.eggs;
|
const eggsAfter = scene.gameData.eggs;
|
||||||
expect(eggsAfter).toBeDefined();
|
expect(eggsAfter).toBeDefined();
|
||||||
|
@ -10,7 +10,6 @@ import { BerryModifier, PokemonHeldItemModifier } from "#modifiers/modifier";
|
|||||||
import { AbsoluteAvariceEncounter } from "#mystery-encounters/absolute-avarice-encounter";
|
import { AbsoluteAvariceEncounter } from "#mystery-encounters/absolute-avarice-encounter";
|
||||||
import * as EncounterPhaseUtils from "#mystery-encounters/encounter-phase-utils";
|
import * as EncounterPhaseUtils from "#mystery-encounters/encounter-phase-utils";
|
||||||
import * as MysteryEncounters from "#mystery-encounters/mystery-encounters";
|
import * as MysteryEncounters from "#mystery-encounters/mystery-encounters";
|
||||||
import { CommandPhase } from "#phases/command-phase";
|
|
||||||
import { MovePhase } from "#phases/move-phase";
|
import { MovePhase } from "#phases/move-phase";
|
||||||
import { SelectModifierPhase } from "#phases/select-modifier-phase";
|
import { SelectModifierPhase } from "#phases/select-modifier-phase";
|
||||||
import {
|
import {
|
||||||
@ -132,7 +131,7 @@ describe("Absolute Avarice - Mystery Encounter", () => {
|
|||||||
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
||||||
|
|
||||||
const enemyField = scene.getEnemyField();
|
const enemyField = scene.getEnemyField();
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name);
|
expect(game).toBeAtPhase("CommandPhase");
|
||||||
expect(enemyField.length).toBe(1);
|
expect(enemyField.length).toBe(1);
|
||||||
expect(enemyField[0].species.speciesId).toBe(SpeciesId.GREEDENT);
|
expect(enemyField[0].species.speciesId).toBe(SpeciesId.GREEDENT);
|
||||||
const moveset = enemyField[0].moveset.map(m => m.moveId);
|
const moveset = enemyField[0].moveset.map(m => m.moveId);
|
||||||
@ -148,7 +147,7 @@ describe("Absolute Avarice - Mystery Encounter", () => {
|
|||||||
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
||||||
await skipBattleRunMysteryEncounterRewardsPhase(game);
|
await skipBattleRunMysteryEncounterRewardsPhase(game);
|
||||||
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name);
|
expect(game).toBeAtPhase("SelectModifierPhase");
|
||||||
|
|
||||||
for (const partyPokemon of scene.getPlayerParty()) {
|
for (const partyPokemon of scene.getPlayerParty()) {
|
||||||
const pokemonId = partyPokemon.id;
|
const pokemonId = partyPokemon.id;
|
||||||
|
@ -11,7 +11,6 @@ import { BerriesAboundEncounter } from "#mystery-encounters/berries-abound-encou
|
|||||||
import * as EncounterDialogueUtils from "#mystery-encounters/encounter-dialogue-utils";
|
import * as EncounterDialogueUtils from "#mystery-encounters/encounter-dialogue-utils";
|
||||||
import * as EncounterPhaseUtils from "#mystery-encounters/encounter-phase-utils";
|
import * as EncounterPhaseUtils from "#mystery-encounters/encounter-phase-utils";
|
||||||
import * as MysteryEncounters from "#mystery-encounters/mystery-encounters";
|
import * as MysteryEncounters from "#mystery-encounters/mystery-encounters";
|
||||||
import { CommandPhase } from "#phases/command-phase";
|
|
||||||
import { SelectModifierPhase } from "#phases/select-modifier-phase";
|
import { SelectModifierPhase } from "#phases/select-modifier-phase";
|
||||||
import {
|
import {
|
||||||
runMysteryEncounterToEnd,
|
runMysteryEncounterToEnd,
|
||||||
@ -114,7 +113,7 @@ describe("Berries Abound - Mystery Encounter", () => {
|
|||||||
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
||||||
|
|
||||||
const enemyField = scene.getEnemyField();
|
const enemyField = scene.getEnemyField();
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name);
|
expect(game).toBeAtPhase("CommandPhase");
|
||||||
expect(enemyField.length).toBe(1);
|
expect(enemyField.length).toBe(1);
|
||||||
expect(enemyField[0].species.speciesId).toBe(speciesToSpawn);
|
expect(enemyField[0].species.speciesId).toBe(speciesToSpawn);
|
||||||
});
|
});
|
||||||
@ -135,7 +134,7 @@ describe("Berries Abound - Mystery Encounter", () => {
|
|||||||
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
||||||
await skipBattleRunMysteryEncounterRewardsPhase(game);
|
await skipBattleRunMysteryEncounterRewardsPhase(game);
|
||||||
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name);
|
expect(game).toBeAtPhase("SelectModifierPhase");
|
||||||
|
|
||||||
const berriesAfter = scene.findModifiers(m => m instanceof BerryModifier) as BerryModifier[];
|
const berriesAfter = scene.findModifiers(m => m instanceof BerryModifier) as BerryModifier[];
|
||||||
const berriesAfterCount = berriesAfter.reduce((a, b) => a + b.stackCount, 0);
|
const berriesAfterCount = berriesAfter.reduce((a, b) => a + b.stackCount, 0);
|
||||||
@ -148,7 +147,7 @@ describe("Berries Abound - Mystery Encounter", () => {
|
|||||||
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
||||||
await skipBattleRunMysteryEncounterRewardsPhase(game);
|
await skipBattleRunMysteryEncounterRewardsPhase(game);
|
||||||
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name);
|
expect(game).toBeAtPhase("SelectModifierPhase");
|
||||||
await game.phaseInterceptor.run(SelectModifierPhase);
|
await game.phaseInterceptor.run(SelectModifierPhase);
|
||||||
|
|
||||||
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
||||||
@ -188,7 +187,7 @@ describe("Berries Abound - Mystery Encounter", () => {
|
|||||||
await runMysteryEncounterToEnd(game, 2, undefined, true);
|
await runMysteryEncounterToEnd(game, 2, undefined, true);
|
||||||
|
|
||||||
const enemyField = scene.getEnemyField();
|
const enemyField = scene.getEnemyField();
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name);
|
expect(game).toBeAtPhase("CommandPhase");
|
||||||
expect(enemyField.length).toBe(1);
|
expect(enemyField.length).toBe(1);
|
||||||
expect(enemyField[0].species.speciesId).toBe(speciesToSpawn);
|
expect(enemyField[0].species.speciesId).toBe(speciesToSpawn);
|
||||||
|
|
||||||
@ -212,7 +211,7 @@ describe("Berries Abound - Mystery Encounter", () => {
|
|||||||
await runMysteryEncounterToEnd(game, 2, undefined, true);
|
await runMysteryEncounterToEnd(game, 2, undefined, true);
|
||||||
|
|
||||||
const enemyField = scene.getEnemyField();
|
const enemyField = scene.getEnemyField();
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name);
|
expect(game).toBeAtPhase("CommandPhase");
|
||||||
expect(enemyField.length).toBe(1);
|
expect(enemyField.length).toBe(1);
|
||||||
expect(enemyField[0].species.speciesId).toBe(speciesToSpawn);
|
expect(enemyField[0].species.speciesId).toBe(speciesToSpawn);
|
||||||
|
|
||||||
@ -233,7 +232,7 @@ describe("Berries Abound - Mystery Encounter", () => {
|
|||||||
|
|
||||||
await runMysteryEncounterToEnd(game, 2);
|
await runMysteryEncounterToEnd(game, 2);
|
||||||
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name);
|
expect(game).toBeAtPhase("SelectModifierPhase");
|
||||||
await game.phaseInterceptor.run(SelectModifierPhase);
|
await game.phaseInterceptor.run(SelectModifierPhase);
|
||||||
|
|
||||||
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
||||||
|
@ -12,7 +12,6 @@ import { PokemonMove } from "#moves/pokemon-move";
|
|||||||
import { BugTypeSuperfanEncounter } from "#mystery-encounters/bug-type-superfan-encounter";
|
import { BugTypeSuperfanEncounter } from "#mystery-encounters/bug-type-superfan-encounter";
|
||||||
import * as encounterPhaseUtils from "#mystery-encounters/encounter-phase-utils";
|
import * as encounterPhaseUtils from "#mystery-encounters/encounter-phase-utils";
|
||||||
import * as MysteryEncounters from "#mystery-encounters/mystery-encounters";
|
import * as MysteryEncounters from "#mystery-encounters/mystery-encounters";
|
||||||
import { CommandPhase } from "#phases/command-phase";
|
|
||||||
import { MysteryEncounterPhase, MysteryEncounterRewardsPhase } from "#phases/mystery-encounter-phases";
|
import { MysteryEncounterPhase, MysteryEncounterRewardsPhase } from "#phases/mystery-encounter-phases";
|
||||||
import { SelectModifierPhase } from "#phases/select-modifier-phase";
|
import { SelectModifierPhase } from "#phases/select-modifier-phase";
|
||||||
import {
|
import {
|
||||||
@ -231,7 +230,7 @@ describe("Bug-Type Superfan - Mystery Encounter", () => {
|
|||||||
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
||||||
|
|
||||||
const enemyParty = scene.getEnemyParty();
|
const enemyParty = scene.getEnemyParty();
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name);
|
expect(game).toBeAtPhase("CommandPhase");
|
||||||
expect(enemyParty.length).toBe(2);
|
expect(enemyParty.length).toBe(2);
|
||||||
expect(scene.currentBattle.trainer?.config.trainerType).toBe(TrainerType.BUG_TYPE_SUPERFAN);
|
expect(scene.currentBattle.trainer?.config.trainerType).toBe(TrainerType.BUG_TYPE_SUPERFAN);
|
||||||
expect(enemyParty[0].species.speciesId).toBe(SpeciesId.BEEDRILL);
|
expect(enemyParty[0].species.speciesId).toBe(SpeciesId.BEEDRILL);
|
||||||
@ -244,7 +243,7 @@ describe("Bug-Type Superfan - Mystery Encounter", () => {
|
|||||||
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
||||||
|
|
||||||
const enemyParty = scene.getEnemyParty();
|
const enemyParty = scene.getEnemyParty();
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name);
|
expect(game).toBeAtPhase("CommandPhase");
|
||||||
expect(enemyParty.length).toBe(3);
|
expect(enemyParty.length).toBe(3);
|
||||||
expect(scene.currentBattle.trainer?.config.trainerType).toBe(TrainerType.BUG_TYPE_SUPERFAN);
|
expect(scene.currentBattle.trainer?.config.trainerType).toBe(TrainerType.BUG_TYPE_SUPERFAN);
|
||||||
expect(enemyParty[0].species.speciesId).toBe(SpeciesId.BEEDRILL);
|
expect(enemyParty[0].species.speciesId).toBe(SpeciesId.BEEDRILL);
|
||||||
@ -258,7 +257,7 @@ describe("Bug-Type Superfan - Mystery Encounter", () => {
|
|||||||
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
||||||
|
|
||||||
const enemyParty = scene.getEnemyParty();
|
const enemyParty = scene.getEnemyParty();
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name);
|
expect(game).toBeAtPhase("CommandPhase");
|
||||||
expect(enemyParty.length).toBe(4);
|
expect(enemyParty.length).toBe(4);
|
||||||
expect(scene.currentBattle.trainer?.config.trainerType).toBe(TrainerType.BUG_TYPE_SUPERFAN);
|
expect(scene.currentBattle.trainer?.config.trainerType).toBe(TrainerType.BUG_TYPE_SUPERFAN);
|
||||||
expect(enemyParty[0].species.speciesId).toBe(SpeciesId.BEEDRILL);
|
expect(enemyParty[0].species.speciesId).toBe(SpeciesId.BEEDRILL);
|
||||||
@ -273,7 +272,7 @@ describe("Bug-Type Superfan - Mystery Encounter", () => {
|
|||||||
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
||||||
|
|
||||||
const enemyParty = scene.getEnemyParty();
|
const enemyParty = scene.getEnemyParty();
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name);
|
expect(game).toBeAtPhase("CommandPhase");
|
||||||
expect(enemyParty.length).toBe(5);
|
expect(enemyParty.length).toBe(5);
|
||||||
expect(scene.currentBattle.trainer?.config.trainerType).toBe(TrainerType.BUG_TYPE_SUPERFAN);
|
expect(scene.currentBattle.trainer?.config.trainerType).toBe(TrainerType.BUG_TYPE_SUPERFAN);
|
||||||
expect(enemyParty[0].species.speciesId).toBe(SpeciesId.BEEDRILL);
|
expect(enemyParty[0].species.speciesId).toBe(SpeciesId.BEEDRILL);
|
||||||
@ -289,7 +288,7 @@ describe("Bug-Type Superfan - Mystery Encounter", () => {
|
|||||||
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
||||||
|
|
||||||
const enemyParty = scene.getEnemyParty();
|
const enemyParty = scene.getEnemyParty();
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name);
|
expect(game).toBeAtPhase("CommandPhase");
|
||||||
expect(enemyParty.length).toBe(5);
|
expect(enemyParty.length).toBe(5);
|
||||||
expect(scene.currentBattle.trainer?.config.trainerType).toBe(TrainerType.BUG_TYPE_SUPERFAN);
|
expect(scene.currentBattle.trainer?.config.trainerType).toBe(TrainerType.BUG_TYPE_SUPERFAN);
|
||||||
expect(enemyParty[0].species.speciesId).toBe(SpeciesId.BEEDRILL);
|
expect(enemyParty[0].species.speciesId).toBe(SpeciesId.BEEDRILL);
|
||||||
@ -307,7 +306,7 @@ describe("Bug-Type Superfan - Mystery Encounter", () => {
|
|||||||
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
||||||
|
|
||||||
const enemyParty = scene.getEnemyParty();
|
const enemyParty = scene.getEnemyParty();
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name);
|
expect(game).toBeAtPhase("CommandPhase");
|
||||||
expect(enemyParty.length).toBe(5);
|
expect(enemyParty.length).toBe(5);
|
||||||
expect(scene.currentBattle.trainer?.config.trainerType).toBe(TrainerType.BUG_TYPE_SUPERFAN);
|
expect(scene.currentBattle.trainer?.config.trainerType).toBe(TrainerType.BUG_TYPE_SUPERFAN);
|
||||||
expect(enemyParty[0].species.speciesId).toBe(SpeciesId.BEEDRILL);
|
expect(enemyParty[0].species.speciesId).toBe(SpeciesId.BEEDRILL);
|
||||||
@ -325,7 +324,7 @@ describe("Bug-Type Superfan - Mystery Encounter", () => {
|
|||||||
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
||||||
|
|
||||||
const enemyParty = scene.getEnemyParty();
|
const enemyParty = scene.getEnemyParty();
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name);
|
expect(game).toBeAtPhase("CommandPhase");
|
||||||
expect(enemyParty.length).toBe(5);
|
expect(enemyParty.length).toBe(5);
|
||||||
expect(scene.currentBattle.trainer?.config.trainerType).toBe(TrainerType.BUG_TYPE_SUPERFAN);
|
expect(scene.currentBattle.trainer?.config.trainerType).toBe(TrainerType.BUG_TYPE_SUPERFAN);
|
||||||
expect(enemyParty[0].species.speciesId).toBe(SpeciesId.BEEDRILL);
|
expect(enemyParty[0].species.speciesId).toBe(SpeciesId.BEEDRILL);
|
||||||
@ -343,7 +342,7 @@ describe("Bug-Type Superfan - Mystery Encounter", () => {
|
|||||||
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
||||||
|
|
||||||
const enemyParty = scene.getEnemyParty();
|
const enemyParty = scene.getEnemyParty();
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name);
|
expect(game).toBeAtPhase("CommandPhase");
|
||||||
expect(enemyParty.length).toBe(5);
|
expect(enemyParty.length).toBe(5);
|
||||||
expect(scene.currentBattle.trainer?.config.trainerType).toBe(TrainerType.BUG_TYPE_SUPERFAN);
|
expect(scene.currentBattle.trainer?.config.trainerType).toBe(TrainerType.BUG_TYPE_SUPERFAN);
|
||||||
expect(enemyParty[0].species.speciesId).toBe(SpeciesId.BEEDRILL);
|
expect(enemyParty[0].species.speciesId).toBe(SpeciesId.BEEDRILL);
|
||||||
@ -365,7 +364,7 @@ describe("Bug-Type Superfan - Mystery Encounter", () => {
|
|||||||
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
||||||
await skipBattleRunMysteryEncounterRewardsPhase(game, false);
|
await skipBattleRunMysteryEncounterRewardsPhase(game, false);
|
||||||
|
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(MysteryEncounterRewardsPhase.name);
|
expect(game).toBeAtPhase("MysteryEncounterRewardsPhase");
|
||||||
game.phaseInterceptor["prompts"] = []; // Clear out prompt handlers
|
game.phaseInterceptor["prompts"] = []; // Clear out prompt handlers
|
||||||
game.onNextPrompt("MysteryEncounterRewardsPhase", UiMode.OPTION_SELECT, () => {
|
game.onNextPrompt("MysteryEncounterRewardsPhase", UiMode.OPTION_SELECT, () => {
|
||||||
game.phaseInterceptor.superEndPhase();
|
game.phaseInterceptor.superEndPhase();
|
||||||
@ -406,7 +405,7 @@ describe("Bug-Type Superfan - Mystery Encounter", () => {
|
|||||||
|
|
||||||
await runSelectMysteryEncounterOption(game, 2);
|
await runSelectMysteryEncounterOption(game, 2);
|
||||||
|
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(MysteryEncounterPhase.name);
|
expect(game).toBeAtPhase("MysteryEncounterPhase");
|
||||||
expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled
|
expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled
|
||||||
expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled();
|
expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled();
|
||||||
expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled();
|
expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled();
|
||||||
@ -416,7 +415,7 @@ describe("Bug-Type Superfan - Mystery Encounter", () => {
|
|||||||
await game.runToMysteryEncounter(MysteryEncounterType.BUG_TYPE_SUPERFAN, defaultParty);
|
await game.runToMysteryEncounter(MysteryEncounterType.BUG_TYPE_SUPERFAN, defaultParty);
|
||||||
await runMysteryEncounterToEnd(game, 2);
|
await runMysteryEncounterToEnd(game, 2);
|
||||||
|
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name);
|
expect(game).toBeAtPhase("SelectModifierPhase");
|
||||||
await game.phaseInterceptor.run(SelectModifierPhase);
|
await game.phaseInterceptor.run(SelectModifierPhase);
|
||||||
|
|
||||||
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
||||||
@ -435,7 +434,7 @@ describe("Bug-Type Superfan - Mystery Encounter", () => {
|
|||||||
]);
|
]);
|
||||||
await runMysteryEncounterToEnd(game, 2);
|
await runMysteryEncounterToEnd(game, 2);
|
||||||
|
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name);
|
expect(game).toBeAtPhase("SelectModifierPhase");
|
||||||
await game.phaseInterceptor.run(SelectModifierPhase);
|
await game.phaseInterceptor.run(SelectModifierPhase);
|
||||||
|
|
||||||
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
||||||
@ -457,7 +456,7 @@ describe("Bug-Type Superfan - Mystery Encounter", () => {
|
|||||||
]);
|
]);
|
||||||
await runMysteryEncounterToEnd(game, 2);
|
await runMysteryEncounterToEnd(game, 2);
|
||||||
|
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name);
|
expect(game).toBeAtPhase("SelectModifierPhase");
|
||||||
await game.phaseInterceptor.run(SelectModifierPhase);
|
await game.phaseInterceptor.run(SelectModifierPhase);
|
||||||
|
|
||||||
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
||||||
@ -481,7 +480,7 @@ describe("Bug-Type Superfan - Mystery Encounter", () => {
|
|||||||
]);
|
]);
|
||||||
await runMysteryEncounterToEnd(game, 2);
|
await runMysteryEncounterToEnd(game, 2);
|
||||||
|
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name);
|
expect(game).toBeAtPhase("SelectModifierPhase");
|
||||||
await game.phaseInterceptor.run(SelectModifierPhase);
|
await game.phaseInterceptor.run(SelectModifierPhase);
|
||||||
|
|
||||||
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
||||||
@ -542,7 +541,7 @@ describe("Bug-Type Superfan - Mystery Encounter", () => {
|
|||||||
|
|
||||||
await runSelectMysteryEncounterOption(game, 3);
|
await runSelectMysteryEncounterOption(game, 3);
|
||||||
|
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(MysteryEncounterPhase.name);
|
expect(game).toBeAtPhase("MysteryEncounterPhase");
|
||||||
expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled
|
expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled
|
||||||
expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled();
|
expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled();
|
||||||
expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled();
|
expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled();
|
||||||
@ -557,7 +556,7 @@ describe("Bug-Type Superfan - Mystery Encounter", () => {
|
|||||||
|
|
||||||
await runMysteryEncounterToEnd(game, 3, { pokemonNo: 1, optionNo: 1 });
|
await runMysteryEncounterToEnd(game, 3, { pokemonNo: 1, optionNo: 1 });
|
||||||
|
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name);
|
expect(game).toBeAtPhase("SelectModifierPhase");
|
||||||
await game.phaseInterceptor.run(SelectModifierPhase);
|
await game.phaseInterceptor.run(SelectModifierPhase);
|
||||||
|
|
||||||
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
||||||
|
@ -22,7 +22,6 @@ import { ClowningAroundEncounter } from "#mystery-encounters/clowning-around-enc
|
|||||||
import * as EncounterPhaseUtils from "#mystery-encounters/encounter-phase-utils";
|
import * as EncounterPhaseUtils from "#mystery-encounters/encounter-phase-utils";
|
||||||
import { generateModifierType } from "#mystery-encounters/encounter-phase-utils";
|
import { generateModifierType } from "#mystery-encounters/encounter-phase-utils";
|
||||||
import * as MysteryEncounters from "#mystery-encounters/mystery-encounters";
|
import * as MysteryEncounters from "#mystery-encounters/mystery-encounters";
|
||||||
import { CommandPhase } from "#phases/command-phase";
|
|
||||||
import { MovePhase } from "#phases/move-phase";
|
import { MovePhase } from "#phases/move-phase";
|
||||||
import { PostMysteryEncounterPhase } from "#phases/mystery-encounter-phases";
|
import { PostMysteryEncounterPhase } from "#phases/mystery-encounter-phases";
|
||||||
import { NewBattlePhase } from "#phases/new-battle-phase";
|
import { NewBattlePhase } from "#phases/new-battle-phase";
|
||||||
@ -172,7 +171,7 @@ describe("Clowning Around - Mystery Encounter", () => {
|
|||||||
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
||||||
|
|
||||||
const enemyField = scene.getEnemyField();
|
const enemyField = scene.getEnemyField();
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name);
|
expect(game).toBeAtPhase("CommandPhase");
|
||||||
expect(enemyField.length).toBe(2);
|
expect(enemyField.length).toBe(2);
|
||||||
expect(enemyField[0].species.speciesId).toBe(SpeciesId.MR_MIME);
|
expect(enemyField[0].species.speciesId).toBe(SpeciesId.MR_MIME);
|
||||||
expect(enemyField[0].moveset).toEqual([
|
expect(enemyField[0].moveset).toEqual([
|
||||||
@ -201,7 +200,7 @@ describe("Clowning Around - Mystery Encounter", () => {
|
|||||||
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
||||||
await skipBattleRunMysteryEncounterRewardsPhase(game);
|
await skipBattleRunMysteryEncounterRewardsPhase(game);
|
||||||
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name);
|
expect(game).toBeAtPhase("SelectModifierPhase");
|
||||||
await game.phaseInterceptor.run(SelectModifierPhase);
|
await game.phaseInterceptor.run(SelectModifierPhase);
|
||||||
const abilityToTrain = scene.currentBattle.mysteryEncounter?.misc.ability;
|
const abilityToTrain = scene.currentBattle.mysteryEncounter?.misc.ability;
|
||||||
|
|
||||||
@ -216,7 +215,7 @@ describe("Clowning Around - Mystery Encounter", () => {
|
|||||||
vi.spyOn(partyUiHandler, "show");
|
vi.spyOn(partyUiHandler, "show");
|
||||||
game.endPhase();
|
game.endPhase();
|
||||||
await game.phaseInterceptor.to(PostMysteryEncounterPhase);
|
await game.phaseInterceptor.to(PostMysteryEncounterPhase);
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(PostMysteryEncounterPhase.name);
|
expect(game).toBeAtPhase("PostMysteryEncounterPhase");
|
||||||
|
|
||||||
// Wait for Yes/No confirmation to appear
|
// Wait for Yes/No confirmation to appear
|
||||||
await vi.waitFor(() => expect(optionSelectUiHandler.show).toHaveBeenCalled());
|
await vi.waitFor(() => expect(optionSelectUiHandler.show).toHaveBeenCalled());
|
||||||
|
@ -10,7 +10,6 @@ import { PokemonMove } from "#moves/pokemon-move";
|
|||||||
import { DancingLessonsEncounter } from "#mystery-encounters/dancing-lessons-encounter";
|
import { DancingLessonsEncounter } from "#mystery-encounters/dancing-lessons-encounter";
|
||||||
import * as EncounterPhaseUtils from "#mystery-encounters/encounter-phase-utils";
|
import * as EncounterPhaseUtils from "#mystery-encounters/encounter-phase-utils";
|
||||||
import * as MysteryEncounters from "#mystery-encounters/mystery-encounters";
|
import * as MysteryEncounters from "#mystery-encounters/mystery-encounters";
|
||||||
import { CommandPhase } from "#phases/command-phase";
|
|
||||||
import { LearnMovePhase } from "#phases/learn-move-phase";
|
import { LearnMovePhase } from "#phases/learn-move-phase";
|
||||||
import { MovePhase } from "#phases/move-phase";
|
import { MovePhase } from "#phases/move-phase";
|
||||||
import { MysteryEncounterPhase } from "#phases/mystery-encounter-phases";
|
import { MysteryEncounterPhase } from "#phases/mystery-encounter-phases";
|
||||||
@ -106,7 +105,7 @@ describe("Dancing Lessons - Mystery Encounter", () => {
|
|||||||
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
||||||
|
|
||||||
const enemyField = scene.getEnemyField();
|
const enemyField = scene.getEnemyField();
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name);
|
expect(game).toBeAtPhase("CommandPhase");
|
||||||
expect(enemyField.length).toBe(1);
|
expect(enemyField.length).toBe(1);
|
||||||
expect(enemyField[0].species.speciesId).toBe(SpeciesId.ORICORIO);
|
expect(enemyField[0].species.speciesId).toBe(SpeciesId.ORICORIO);
|
||||||
expect(enemyField[0].summonData.statStages).toEqual([1, 1, 1, 1, 0, 0, 0]);
|
expect(enemyField[0].summonData.statStages).toEqual([1, 1, 1, 1, 0, 0, 0]);
|
||||||
@ -127,7 +126,7 @@ describe("Dancing Lessons - Mystery Encounter", () => {
|
|||||||
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
||||||
await skipBattleRunMysteryEncounterRewardsPhase(game);
|
await skipBattleRunMysteryEncounterRewardsPhase(game);
|
||||||
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name);
|
expect(game).toBeAtPhase("SelectModifierPhase");
|
||||||
await game.phaseInterceptor.run(SelectModifierPhase);
|
await game.phaseInterceptor.run(SelectModifierPhase);
|
||||||
|
|
||||||
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
||||||
@ -227,7 +226,7 @@ describe("Dancing Lessons - Mystery Encounter", () => {
|
|||||||
await runSelectMysteryEncounterOption(game, 3);
|
await runSelectMysteryEncounterOption(game, 3);
|
||||||
const partyCountAfter = scene.getPlayerParty().length;
|
const partyCountAfter = scene.getPlayerParty().length;
|
||||||
|
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(MysteryEncounterPhase.name);
|
expect(game).toBeAtPhase("MysteryEncounterPhase");
|
||||||
expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled
|
expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled
|
||||||
expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled();
|
expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled();
|
||||||
expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled();
|
expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled();
|
||||||
|
@ -161,7 +161,7 @@ describe("Delibird-y - Mystery Encounter", () => {
|
|||||||
|
|
||||||
await runSelectMysteryEncounterOption(game, 1);
|
await runSelectMysteryEncounterOption(game, 1);
|
||||||
|
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(MysteryEncounterPhase.name);
|
expect(game).toBeAtPhase("MysteryEncounterPhase");
|
||||||
expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled
|
expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled
|
||||||
expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled();
|
expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled();
|
||||||
expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled();
|
expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled();
|
||||||
@ -316,7 +316,7 @@ describe("Delibird-y - Mystery Encounter", () => {
|
|||||||
|
|
||||||
await runSelectMysteryEncounterOption(game, 2);
|
await runSelectMysteryEncounterOption(game, 2);
|
||||||
|
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(MysteryEncounterPhase.name);
|
expect(game).toBeAtPhase("MysteryEncounterPhase");
|
||||||
expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled
|
expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled
|
||||||
expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled();
|
expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled();
|
||||||
expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled();
|
expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled();
|
||||||
@ -449,7 +449,7 @@ describe("Delibird-y - Mystery Encounter", () => {
|
|||||||
|
|
||||||
await runSelectMysteryEncounterOption(game, 3);
|
await runSelectMysteryEncounterOption(game, 3);
|
||||||
|
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(MysteryEncounterPhase.name);
|
expect(game).toBeAtPhase("MysteryEncounterPhase");
|
||||||
expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled
|
expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled
|
||||||
expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled();
|
expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled();
|
||||||
expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled();
|
expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled();
|
||||||
|
@ -93,7 +93,7 @@ describe("Department Store Sale - Mystery Encounter", () => {
|
|||||||
it("should have shop with only TMs", async () => {
|
it("should have shop with only TMs", async () => {
|
||||||
await game.runToMysteryEncounter(MysteryEncounterType.DEPARTMENT_STORE_SALE, defaultParty);
|
await game.runToMysteryEncounter(MysteryEncounterType.DEPARTMENT_STORE_SALE, defaultParty);
|
||||||
await runMysteryEncounterToEnd(game, 1);
|
await runMysteryEncounterToEnd(game, 1);
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name);
|
expect(game).toBeAtPhase("SelectModifierPhase");
|
||||||
await game.phaseInterceptor.run(SelectModifierPhase);
|
await game.phaseInterceptor.run(SelectModifierPhase);
|
||||||
|
|
||||||
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
||||||
@ -130,7 +130,7 @@ describe("Department Store Sale - Mystery Encounter", () => {
|
|||||||
it("should have shop with only Vitamins", async () => {
|
it("should have shop with only Vitamins", async () => {
|
||||||
await game.runToMysteryEncounter(MysteryEncounterType.DEPARTMENT_STORE_SALE, defaultParty);
|
await game.runToMysteryEncounter(MysteryEncounterType.DEPARTMENT_STORE_SALE, defaultParty);
|
||||||
await runMysteryEncounterToEnd(game, 2);
|
await runMysteryEncounterToEnd(game, 2);
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name);
|
expect(game).toBeAtPhase("SelectModifierPhase");
|
||||||
await game.phaseInterceptor.run(SelectModifierPhase);
|
await game.phaseInterceptor.run(SelectModifierPhase);
|
||||||
|
|
||||||
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
||||||
@ -170,7 +170,7 @@ describe("Department Store Sale - Mystery Encounter", () => {
|
|||||||
it("should have shop with only X Items", async () => {
|
it("should have shop with only X Items", async () => {
|
||||||
await game.runToMysteryEncounter(MysteryEncounterType.DEPARTMENT_STORE_SALE, defaultParty);
|
await game.runToMysteryEncounter(MysteryEncounterType.DEPARTMENT_STORE_SALE, defaultParty);
|
||||||
await runMysteryEncounterToEnd(game, 3);
|
await runMysteryEncounterToEnd(game, 3);
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name);
|
expect(game).toBeAtPhase("SelectModifierPhase");
|
||||||
await game.phaseInterceptor.run(SelectModifierPhase);
|
await game.phaseInterceptor.run(SelectModifierPhase);
|
||||||
|
|
||||||
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
||||||
@ -210,7 +210,7 @@ describe("Department Store Sale - Mystery Encounter", () => {
|
|||||||
it("should have shop with only Pokeballs", async () => {
|
it("should have shop with only Pokeballs", async () => {
|
||||||
await game.runToMysteryEncounter(MysteryEncounterType.DEPARTMENT_STORE_SALE, defaultParty);
|
await game.runToMysteryEncounter(MysteryEncounterType.DEPARTMENT_STORE_SALE, defaultParty);
|
||||||
await runMysteryEncounterToEnd(game, 4);
|
await runMysteryEncounterToEnd(game, 4);
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name);
|
expect(game).toBeAtPhase("SelectModifierPhase");
|
||||||
await game.phaseInterceptor.run(SelectModifierPhase);
|
await game.phaseInterceptor.run(SelectModifierPhase);
|
||||||
|
|
||||||
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
||||||
|
@ -16,7 +16,6 @@ import { AttackTypeBoosterModifier, PokemonHeldItemModifier } from "#modifiers/m
|
|||||||
import * as EncounterPhaseUtils from "#mystery-encounters/encounter-phase-utils";
|
import * as EncounterPhaseUtils from "#mystery-encounters/encounter-phase-utils";
|
||||||
import { FieryFalloutEncounter } from "#mystery-encounters/fiery-fallout-encounter";
|
import { FieryFalloutEncounter } from "#mystery-encounters/fiery-fallout-encounter";
|
||||||
import * as MysteryEncounters from "#mystery-encounters/mystery-encounters";
|
import * as MysteryEncounters from "#mystery-encounters/mystery-encounters";
|
||||||
import { CommandPhase } from "#phases/command-phase";
|
|
||||||
import { MovePhase } from "#phases/move-phase";
|
import { MovePhase } from "#phases/move-phase";
|
||||||
import { MysteryEncounterPhase } from "#phases/mystery-encounter-phases";
|
import { MysteryEncounterPhase } from "#phases/mystery-encounter-phases";
|
||||||
import { SelectModifierPhase } from "#phases/select-modifier-phase";
|
import { SelectModifierPhase } from "#phases/select-modifier-phase";
|
||||||
@ -161,7 +160,7 @@ describe("Fiery Fallout - Mystery Encounter", () => {
|
|||||||
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
||||||
|
|
||||||
const enemyField = scene.getEnemyField();
|
const enemyField = scene.getEnemyField();
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name);
|
expect(game).toBeAtPhase("CommandPhase");
|
||||||
expect(enemyField.length).toBe(2);
|
expect(enemyField.length).toBe(2);
|
||||||
expect(enemyField[0].species.speciesId).toBe(SpeciesId.VOLCARONA);
|
expect(enemyField[0].species.speciesId).toBe(SpeciesId.VOLCARONA);
|
||||||
expect(enemyField[1].species.speciesId).toBe(SpeciesId.VOLCARONA);
|
expect(enemyField[1].species.speciesId).toBe(SpeciesId.VOLCARONA);
|
||||||
@ -177,7 +176,7 @@ describe("Fiery Fallout - Mystery Encounter", () => {
|
|||||||
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
||||||
await skipBattleRunMysteryEncounterRewardsPhase(game);
|
await skipBattleRunMysteryEncounterRewardsPhase(game);
|
||||||
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name);
|
expect(game).toBeAtPhase("SelectModifierPhase");
|
||||||
|
|
||||||
const leadPokemonId = scene.getPlayerParty()?.[0].id;
|
const leadPokemonId = scene.getPlayerParty()?.[0].id;
|
||||||
const leadPokemonItems = scene.findModifiers(
|
const leadPokemonItems = scene.findModifiers(
|
||||||
@ -266,7 +265,7 @@ describe("Fiery Fallout - Mystery Encounter", () => {
|
|||||||
await game.runToMysteryEncounter(MysteryEncounterType.FIERY_FALLOUT, defaultParty);
|
await game.runToMysteryEncounter(MysteryEncounterType.FIERY_FALLOUT, defaultParty);
|
||||||
await runMysteryEncounterToEnd(game, 3);
|
await runMysteryEncounterToEnd(game, 3);
|
||||||
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name);
|
expect(game).toBeAtPhase("SelectModifierPhase");
|
||||||
|
|
||||||
const leadPokemonItems = scene.getPlayerParty()[0].getHeldItems() as PokemonHeldItemModifier[];
|
const leadPokemonItems = scene.getPlayerParty()[0].getHeldItems() as PokemonHeldItemModifier[];
|
||||||
const item = leadPokemonItems.find(i => i instanceof AttackTypeBoosterModifier);
|
const item = leadPokemonItems.find(i => i instanceof AttackTypeBoosterModifier);
|
||||||
@ -292,7 +291,7 @@ describe("Fiery Fallout - Mystery Encounter", () => {
|
|||||||
|
|
||||||
await runSelectMysteryEncounterOption(game, 3);
|
await runSelectMysteryEncounterOption(game, 3);
|
||||||
|
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(MysteryEncounterPhase.name);
|
expect(game).toBeAtPhase("MysteryEncounterPhase");
|
||||||
expect(continueEncounterSpy).not.toHaveBeenCalled();
|
expect(continueEncounterSpy).not.toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -10,7 +10,6 @@ import { PokemonMove } from "#moves/pokemon-move";
|
|||||||
import * as EncounterPhaseUtils from "#mystery-encounters/encounter-phase-utils";
|
import * as EncounterPhaseUtils from "#mystery-encounters/encounter-phase-utils";
|
||||||
import { FightOrFlightEncounter } from "#mystery-encounters/fight-or-flight-encounter";
|
import { FightOrFlightEncounter } from "#mystery-encounters/fight-or-flight-encounter";
|
||||||
import * as MysteryEncounters from "#mystery-encounters/mystery-encounters";
|
import * as MysteryEncounters from "#mystery-encounters/mystery-encounters";
|
||||||
import { CommandPhase } from "#phases/command-phase";
|
|
||||||
import { MysteryEncounterPhase } from "#phases/mystery-encounter-phases";
|
import { MysteryEncounterPhase } from "#phases/mystery-encounter-phases";
|
||||||
import { SelectModifierPhase } from "#phases/select-modifier-phase";
|
import { SelectModifierPhase } from "#phases/select-modifier-phase";
|
||||||
import {
|
import {
|
||||||
@ -110,7 +109,7 @@ describe("Fight or Flight - Mystery Encounter", () => {
|
|||||||
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
||||||
|
|
||||||
const enemyField = scene.getEnemyField();
|
const enemyField = scene.getEnemyField();
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name);
|
expect(game).toBeAtPhase("CommandPhase");
|
||||||
expect(enemyField.length).toBe(1);
|
expect(enemyField.length).toBe(1);
|
||||||
expect(enemyField[0].species.speciesId).toBe(speciesToSpawn);
|
expect(enemyField[0].species.speciesId).toBe(speciesToSpawn);
|
||||||
});
|
});
|
||||||
@ -123,7 +122,7 @@ describe("Fight or Flight - Mystery Encounter", () => {
|
|||||||
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
||||||
await skipBattleRunMysteryEncounterRewardsPhase(game);
|
await skipBattleRunMysteryEncounterRewardsPhase(game);
|
||||||
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name);
|
expect(game).toBeAtPhase("SelectModifierPhase");
|
||||||
await game.phaseInterceptor.run(SelectModifierPhase);
|
await game.phaseInterceptor.run(SelectModifierPhase);
|
||||||
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
||||||
|
|
||||||
@ -166,7 +165,7 @@ describe("Fight or Flight - Mystery Encounter", () => {
|
|||||||
|
|
||||||
await runSelectMysteryEncounterOption(game, 2);
|
await runSelectMysteryEncounterOption(game, 2);
|
||||||
|
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(MysteryEncounterPhase.name);
|
expect(game).toBeAtPhase("MysteryEncounterPhase");
|
||||||
expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled
|
expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled
|
||||||
expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled();
|
expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled();
|
||||||
expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled();
|
expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled();
|
||||||
@ -183,7 +182,7 @@ describe("Fight or Flight - Mystery Encounter", () => {
|
|||||||
|
|
||||||
await runMysteryEncounterToEnd(game, 2);
|
await runMysteryEncounterToEnd(game, 2);
|
||||||
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name);
|
expect(game).toBeAtPhase("SelectModifierPhase");
|
||||||
await game.phaseInterceptor.run(SelectModifierPhase);
|
await game.phaseInterceptor.run(SelectModifierPhase);
|
||||||
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
||||||
|
|
||||||
|
@ -14,7 +14,7 @@ import { FunAndGamesEncounter } from "#mystery-encounters/fun-and-games-encounte
|
|||||||
import { MysteryEncounter } from "#mystery-encounters/mystery-encounter";
|
import { MysteryEncounter } from "#mystery-encounters/mystery-encounter";
|
||||||
import * as MysteryEncounters from "#mystery-encounters/mystery-encounters";
|
import * as MysteryEncounters from "#mystery-encounters/mystery-encounters";
|
||||||
import { HUMAN_TRANSITABLE_BIOMES } from "#mystery-encounters/mystery-encounters";
|
import { HUMAN_TRANSITABLE_BIOMES } from "#mystery-encounters/mystery-encounters";
|
||||||
import { CommandPhase } from "#phases/command-phase";
|
import type { CommandPhase } from "#phases/command-phase";
|
||||||
import { MysteryEncounterPhase } from "#phases/mystery-encounter-phases";
|
import { MysteryEncounterPhase } from "#phases/mystery-encounter-phases";
|
||||||
import { SelectModifierPhase } from "#phases/select-modifier-phase";
|
import { SelectModifierPhase } from "#phases/select-modifier-phase";
|
||||||
import {
|
import {
|
||||||
@ -131,7 +131,7 @@ describe("Fun And Games! - Mystery Encounter", () => {
|
|||||||
|
|
||||||
await runSelectMysteryEncounterOption(game, 1);
|
await runSelectMysteryEncounterOption(game, 1);
|
||||||
|
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(MysteryEncounterPhase.name);
|
expect(game).toBeAtPhase("MysteryEncounterPhase");
|
||||||
expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled
|
expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled
|
||||||
expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled();
|
expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled();
|
||||||
expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled();
|
expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled();
|
||||||
@ -143,7 +143,7 @@ describe("Fun And Games! - Mystery Encounter", () => {
|
|||||||
await game.runToMysteryEncounter(MysteryEncounterType.FUN_AND_GAMES, defaultParty);
|
await game.runToMysteryEncounter(MysteryEncounterType.FUN_AND_GAMES, defaultParty);
|
||||||
await runMysteryEncounterToEnd(game, 1, { pokemonNo: 1 }, true);
|
await runMysteryEncounterToEnd(game, 1, { pokemonNo: 1 }, true);
|
||||||
|
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name);
|
expect(game).toBeAtPhase("CommandPhase");
|
||||||
expect(game.field.getEnemyPokemon().species.speciesId).toBe(SpeciesId.WOBBUFFET);
|
expect(game.field.getEnemyPokemon().species.speciesId).toBe(SpeciesId.WOBBUFFET);
|
||||||
expect(game.field.getEnemyPokemon().ivs).toEqual([0, 0, 0, 0, 0, 0]);
|
expect(game.field.getEnemyPokemon().ivs).toEqual([0, 0, 0, 0, 0, 0]);
|
||||||
expect(game.field.getEnemyPokemon().nature).toBe(Nature.MILD);
|
expect(game.field.getEnemyPokemon().nature).toBe(Nature.MILD);
|
||||||
@ -165,7 +165,7 @@ describe("Fun And Games! - Mystery Encounter", () => {
|
|||||||
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
||||||
|
|
||||||
// Rewards
|
// Rewards
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name);
|
expect(game).toBeAtPhase("SelectModifierPhase");
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should have no items in rewards if Wubboffet doesn't take enough damage", async () => {
|
it("should have no items in rewards if Wubboffet doesn't take enough damage", async () => {
|
||||||
@ -173,7 +173,7 @@ describe("Fun And Games! - Mystery Encounter", () => {
|
|||||||
await game.runToMysteryEncounter(MysteryEncounterType.FUN_AND_GAMES, defaultParty);
|
await game.runToMysteryEncounter(MysteryEncounterType.FUN_AND_GAMES, defaultParty);
|
||||||
await runMysteryEncounterToEnd(game, 1, { pokemonNo: 1 }, true);
|
await runMysteryEncounterToEnd(game, 1, { pokemonNo: 1 }, true);
|
||||||
|
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name);
|
expect(game).toBeAtPhase("CommandPhase");
|
||||||
game.onNextPrompt("MessagePhase", UiMode.MESSAGE, () => {
|
game.onNextPrompt("MessagePhase", UiMode.MESSAGE, () => {
|
||||||
game.endPhase();
|
game.endPhase();
|
||||||
});
|
});
|
||||||
@ -184,7 +184,7 @@ describe("Fun And Games! - Mystery Encounter", () => {
|
|||||||
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
||||||
|
|
||||||
// Rewards
|
// Rewards
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name);
|
expect(game).toBeAtPhase("SelectModifierPhase");
|
||||||
await game.phaseInterceptor.run(SelectModifierPhase);
|
await game.phaseInterceptor.run(SelectModifierPhase);
|
||||||
|
|
||||||
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
||||||
@ -200,7 +200,7 @@ describe("Fun And Games! - Mystery Encounter", () => {
|
|||||||
await game.runToMysteryEncounter(MysteryEncounterType.FUN_AND_GAMES, defaultParty);
|
await game.runToMysteryEncounter(MysteryEncounterType.FUN_AND_GAMES, defaultParty);
|
||||||
await runMysteryEncounterToEnd(game, 1, { pokemonNo: 1 }, true);
|
await runMysteryEncounterToEnd(game, 1, { pokemonNo: 1 }, true);
|
||||||
|
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name);
|
expect(game).toBeAtPhase("CommandPhase");
|
||||||
game.onNextPrompt("MessagePhase", UiMode.MESSAGE, () => {
|
game.onNextPrompt("MessagePhase", UiMode.MESSAGE, () => {
|
||||||
game.endPhase();
|
game.endPhase();
|
||||||
});
|
});
|
||||||
@ -213,7 +213,7 @@ describe("Fun And Games! - Mystery Encounter", () => {
|
|||||||
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
||||||
|
|
||||||
// Rewards
|
// Rewards
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name);
|
expect(game).toBeAtPhase("SelectModifierPhase");
|
||||||
await game.phaseInterceptor.run(SelectModifierPhase);
|
await game.phaseInterceptor.run(SelectModifierPhase);
|
||||||
|
|
||||||
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
||||||
@ -230,7 +230,7 @@ describe("Fun And Games! - Mystery Encounter", () => {
|
|||||||
await game.runToMysteryEncounter(MysteryEncounterType.FUN_AND_GAMES, defaultParty);
|
await game.runToMysteryEncounter(MysteryEncounterType.FUN_AND_GAMES, defaultParty);
|
||||||
await runMysteryEncounterToEnd(game, 1, { pokemonNo: 1 }, true);
|
await runMysteryEncounterToEnd(game, 1, { pokemonNo: 1 }, true);
|
||||||
|
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name);
|
expect(game).toBeAtPhase("CommandPhase");
|
||||||
game.onNextPrompt("MessagePhase", UiMode.MESSAGE, () => {
|
game.onNextPrompt("MessagePhase", UiMode.MESSAGE, () => {
|
||||||
game.endPhase();
|
game.endPhase();
|
||||||
});
|
});
|
||||||
@ -243,7 +243,7 @@ describe("Fun And Games! - Mystery Encounter", () => {
|
|||||||
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
||||||
|
|
||||||
// Rewards
|
// Rewards
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name);
|
expect(game).toBeAtPhase("SelectModifierPhase");
|
||||||
await game.phaseInterceptor.run(SelectModifierPhase);
|
await game.phaseInterceptor.run(SelectModifierPhase);
|
||||||
|
|
||||||
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
||||||
@ -260,7 +260,7 @@ describe("Fun And Games! - Mystery Encounter", () => {
|
|||||||
await game.runToMysteryEncounter(MysteryEncounterType.FUN_AND_GAMES, defaultParty);
|
await game.runToMysteryEncounter(MysteryEncounterType.FUN_AND_GAMES, defaultParty);
|
||||||
await runMysteryEncounterToEnd(game, 1, { pokemonNo: 1 }, true);
|
await runMysteryEncounterToEnd(game, 1, { pokemonNo: 1 }, true);
|
||||||
|
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name);
|
expect(game).toBeAtPhase("CommandPhase");
|
||||||
game.onNextPrompt("MessagePhase", UiMode.MESSAGE, () => {
|
game.onNextPrompt("MessagePhase", UiMode.MESSAGE, () => {
|
||||||
game.endPhase();
|
game.endPhase();
|
||||||
});
|
});
|
||||||
@ -273,7 +273,7 @@ describe("Fun And Games! - Mystery Encounter", () => {
|
|||||||
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
||||||
|
|
||||||
// Rewards
|
// Rewards
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name);
|
expect(game).toBeAtPhase("SelectModifierPhase");
|
||||||
await game.phaseInterceptor.run(SelectModifierPhase);
|
await game.phaseInterceptor.run(SelectModifierPhase);
|
||||||
|
|
||||||
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
||||||
|
@ -226,7 +226,7 @@ describe("Global Trade System - Mystery Encounter", () => {
|
|||||||
await scene.updateModifiers(true);
|
await scene.updateModifiers(true);
|
||||||
|
|
||||||
await runMysteryEncounterToEnd(game, 3, { pokemonNo: 1, optionNo: 1 });
|
await runMysteryEncounterToEnd(game, 3, { pokemonNo: 1, optionNo: 1 });
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name);
|
expect(game).toBeAtPhase("SelectModifierPhase");
|
||||||
await game.phaseInterceptor.run(SelectModifierPhase);
|
await game.phaseInterceptor.run(SelectModifierPhase);
|
||||||
|
|
||||||
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
||||||
|
@ -147,7 +147,7 @@ describe("Lost at Sea - Mystery Encounter", () => {
|
|||||||
|
|
||||||
await runSelectMysteryEncounterOption(game, 1);
|
await runSelectMysteryEncounterOption(game, 1);
|
||||||
|
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(MysteryEncounterPhase.name);
|
expect(game).toBeAtPhase("MysteryEncounterPhase");
|
||||||
expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled
|
expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled
|
||||||
expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled();
|
expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled();
|
||||||
expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled();
|
expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled();
|
||||||
@ -212,7 +212,7 @@ describe("Lost at Sea - Mystery Encounter", () => {
|
|||||||
|
|
||||||
await runSelectMysteryEncounterOption(game, 2);
|
await runSelectMysteryEncounterOption(game, 2);
|
||||||
|
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(MysteryEncounterPhase.name);
|
expect(game).toBeAtPhase("MysteryEncounterPhase");
|
||||||
expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled
|
expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled
|
||||||
expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled();
|
expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled();
|
||||||
expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled();
|
expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled();
|
||||||
|
@ -12,7 +12,6 @@ import { MysteriousChallengersEncounter } from "#mystery-encounters/mysterious-c
|
|||||||
import { MysteryEncounter } from "#mystery-encounters/mystery-encounter";
|
import { MysteryEncounter } from "#mystery-encounters/mystery-encounter";
|
||||||
import * as MysteryEncounters from "#mystery-encounters/mystery-encounters";
|
import * as MysteryEncounters from "#mystery-encounters/mystery-encounters";
|
||||||
import { HUMAN_TRANSITABLE_BIOMES } from "#mystery-encounters/mystery-encounters";
|
import { HUMAN_TRANSITABLE_BIOMES } from "#mystery-encounters/mystery-encounters";
|
||||||
import { CommandPhase } from "#phases/command-phase";
|
|
||||||
import { SelectModifierPhase } from "#phases/select-modifier-phase";
|
import { SelectModifierPhase } from "#phases/select-modifier-phase";
|
||||||
import {
|
import {
|
||||||
runMysteryEncounterToEnd,
|
runMysteryEncounterToEnd,
|
||||||
@ -152,7 +151,7 @@ describe("Mysterious Challengers - Mystery Encounter", () => {
|
|||||||
await game.runToMysteryEncounter(MysteryEncounterType.MYSTERIOUS_CHALLENGERS, defaultParty);
|
await game.runToMysteryEncounter(MysteryEncounterType.MYSTERIOUS_CHALLENGERS, defaultParty);
|
||||||
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
||||||
|
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name);
|
expect(game).toBeAtPhase("CommandPhase");
|
||||||
expect(scene.currentBattle.trainer).toBeDefined();
|
expect(scene.currentBattle.trainer).toBeDefined();
|
||||||
expect(scene.currentBattle.mysteryEncounter?.encounterMode).toBe(MysteryEncounterMode.TRAINER_BATTLE);
|
expect(scene.currentBattle.mysteryEncounter?.encounterMode).toBe(MysteryEncounterMode.TRAINER_BATTLE);
|
||||||
});
|
});
|
||||||
@ -162,7 +161,7 @@ describe("Mysterious Challengers - Mystery Encounter", () => {
|
|||||||
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
||||||
await skipBattleRunMysteryEncounterRewardsPhase(game);
|
await skipBattleRunMysteryEncounterRewardsPhase(game);
|
||||||
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name);
|
expect(game).toBeAtPhase("SelectModifierPhase");
|
||||||
await game.phaseInterceptor.run(SelectModifierPhase);
|
await game.phaseInterceptor.run(SelectModifierPhase);
|
||||||
|
|
||||||
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
||||||
@ -196,7 +195,7 @@ describe("Mysterious Challengers - Mystery Encounter", () => {
|
|||||||
await game.runToMysteryEncounter(MysteryEncounterType.MYSTERIOUS_CHALLENGERS, defaultParty);
|
await game.runToMysteryEncounter(MysteryEncounterType.MYSTERIOUS_CHALLENGERS, defaultParty);
|
||||||
await runMysteryEncounterToEnd(game, 2, undefined, true);
|
await runMysteryEncounterToEnd(game, 2, undefined, true);
|
||||||
|
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name);
|
expect(game).toBeAtPhase("CommandPhase");
|
||||||
expect(scene.currentBattle.trainer).toBeDefined();
|
expect(scene.currentBattle.trainer).toBeDefined();
|
||||||
expect(scene.currentBattle.mysteryEncounter?.encounterMode).toBe(MysteryEncounterMode.TRAINER_BATTLE);
|
expect(scene.currentBattle.mysteryEncounter?.encounterMode).toBe(MysteryEncounterMode.TRAINER_BATTLE);
|
||||||
});
|
});
|
||||||
@ -206,7 +205,7 @@ describe("Mysterious Challengers - Mystery Encounter", () => {
|
|||||||
await runMysteryEncounterToEnd(game, 2, undefined, true);
|
await runMysteryEncounterToEnd(game, 2, undefined, true);
|
||||||
await skipBattleRunMysteryEncounterRewardsPhase(game);
|
await skipBattleRunMysteryEncounterRewardsPhase(game);
|
||||||
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name);
|
expect(game).toBeAtPhase("SelectModifierPhase");
|
||||||
await game.phaseInterceptor.run(SelectModifierPhase);
|
await game.phaseInterceptor.run(SelectModifierPhase);
|
||||||
|
|
||||||
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
||||||
@ -253,7 +252,7 @@ describe("Mysterious Challengers - Mystery Encounter", () => {
|
|||||||
await game.runToMysteryEncounter(MysteryEncounterType.MYSTERIOUS_CHALLENGERS, defaultParty);
|
await game.runToMysteryEncounter(MysteryEncounterType.MYSTERIOUS_CHALLENGERS, defaultParty);
|
||||||
await runMysteryEncounterToEnd(game, 3, undefined, true);
|
await runMysteryEncounterToEnd(game, 3, undefined, true);
|
||||||
|
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name);
|
expect(game).toBeAtPhase("CommandPhase");
|
||||||
expect(scene.currentBattle.trainer).toBeDefined();
|
expect(scene.currentBattle.trainer).toBeDefined();
|
||||||
expect(scene.currentBattle.mysteryEncounter?.encounterMode).toBe(MysteryEncounterMode.TRAINER_BATTLE);
|
expect(scene.currentBattle.mysteryEncounter?.encounterMode).toBe(MysteryEncounterMode.TRAINER_BATTLE);
|
||||||
});
|
});
|
||||||
@ -263,7 +262,7 @@ describe("Mysterious Challengers - Mystery Encounter", () => {
|
|||||||
await runMysteryEncounterToEnd(game, 3, undefined, true);
|
await runMysteryEncounterToEnd(game, 3, undefined, true);
|
||||||
await skipBattleRunMysteryEncounterRewardsPhase(game);
|
await skipBattleRunMysteryEncounterRewardsPhase(game);
|
||||||
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name);
|
expect(game).toBeAtPhase("SelectModifierPhase");
|
||||||
await game.phaseInterceptor.run(SelectModifierPhase);
|
await game.phaseInterceptor.run(SelectModifierPhase);
|
||||||
|
|
||||||
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
||||||
|
@ -245,7 +245,7 @@ describe("Part-Timer - Mystery Encounter", () => {
|
|||||||
|
|
||||||
await runSelectMysteryEncounterOption(game, 3);
|
await runSelectMysteryEncounterOption(game, 3);
|
||||||
|
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(MysteryEncounterPhase.name);
|
expect(game).toBeAtPhase("MysteryEncounterPhase");
|
||||||
expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled
|
expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled
|
||||||
expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled();
|
expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled();
|
||||||
expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled();
|
expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled();
|
||||||
|
@ -119,7 +119,7 @@ describe("Safari Zone - Mystery Encounter", () => {
|
|||||||
|
|
||||||
await runSelectMysteryEncounterOption(game, 1);
|
await runSelectMysteryEncounterOption(game, 1);
|
||||||
|
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(MysteryEncounterPhase.name);
|
expect(game).toBeAtPhase("MysteryEncounterPhase");
|
||||||
expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled
|
expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled
|
||||||
expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled();
|
expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled();
|
||||||
expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled();
|
expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled();
|
||||||
|
@ -8,7 +8,6 @@ import { SpeciesId } from "#enums/species-id";
|
|||||||
import { UiMode } from "#enums/ui-mode";
|
import { UiMode } from "#enums/ui-mode";
|
||||||
import * as MysteryEncounters from "#mystery-encounters/mystery-encounters";
|
import * as MysteryEncounters from "#mystery-encounters/mystery-encounters";
|
||||||
import { TeleportingHijinksEncounter } from "#mystery-encounters/teleporting-hijinks-encounter";
|
import { TeleportingHijinksEncounter } from "#mystery-encounters/teleporting-hijinks-encounter";
|
||||||
import { CommandPhase } from "#phases/command-phase";
|
|
||||||
import { MysteryEncounterPhase } from "#phases/mystery-encounter-phases";
|
import { MysteryEncounterPhase } from "#phases/mystery-encounter-phases";
|
||||||
import { SelectModifierPhase } from "#phases/select-modifier-phase";
|
import { SelectModifierPhase } from "#phases/select-modifier-phase";
|
||||||
import {
|
import {
|
||||||
@ -157,7 +156,7 @@ describe("Teleporting Hijinks - Mystery Encounter", () => {
|
|||||||
|
|
||||||
await runSelectMysteryEncounterOption(game, 1);
|
await runSelectMysteryEncounterOption(game, 1);
|
||||||
|
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(MysteryEncounterPhase.name);
|
expect(game).toBeAtPhase("MysteryEncounterPhase");
|
||||||
expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled
|
expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled
|
||||||
expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled();
|
expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled();
|
||||||
expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled();
|
expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled();
|
||||||
@ -167,7 +166,7 @@ describe("Teleporting Hijinks - Mystery Encounter", () => {
|
|||||||
await game.runToMysteryEncounter(MysteryEncounterType.TELEPORTING_HIJINKS, defaultParty);
|
await game.runToMysteryEncounter(MysteryEncounterType.TELEPORTING_HIJINKS, defaultParty);
|
||||||
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
||||||
|
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name);
|
expect(game).toBeAtPhase("CommandPhase");
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should transport to a new area", async () => {
|
it("should transport to a new area", async () => {
|
||||||
@ -229,7 +228,7 @@ describe("Teleporting Hijinks - Mystery Encounter", () => {
|
|||||||
|
|
||||||
await runSelectMysteryEncounterOption(game, 2);
|
await runSelectMysteryEncounterOption(game, 2);
|
||||||
|
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(MysteryEncounterPhase.name);
|
expect(game).toBeAtPhase("MysteryEncounterPhase");
|
||||||
expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled
|
expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled
|
||||||
expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled();
|
expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled();
|
||||||
expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled();
|
expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled();
|
||||||
@ -239,7 +238,7 @@ describe("Teleporting Hijinks - Mystery Encounter", () => {
|
|||||||
await game.runToMysteryEncounter(MysteryEncounterType.TELEPORTING_HIJINKS, [SpeciesId.METAGROSS]);
|
await game.runToMysteryEncounter(MysteryEncounterType.TELEPORTING_HIJINKS, [SpeciesId.METAGROSS]);
|
||||||
await runMysteryEncounterToEnd(game, 2, undefined, true);
|
await runMysteryEncounterToEnd(game, 2, undefined, true);
|
||||||
|
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name);
|
expect(game).toBeAtPhase("CommandPhase");
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should transport to a new area", async () => {
|
it("should transport to a new area", async () => {
|
||||||
@ -300,7 +299,7 @@ describe("Teleporting Hijinks - Mystery Encounter", () => {
|
|||||||
await runMysteryEncounterToEnd(game, 3, undefined, true);
|
await runMysteryEncounterToEnd(game, 3, undefined, true);
|
||||||
await skipBattleRunMysteryEncounterRewardsPhase(game);
|
await skipBattleRunMysteryEncounterRewardsPhase(game);
|
||||||
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name);
|
expect(game).toBeAtPhase("SelectModifierPhase");
|
||||||
await game.phaseInterceptor.run(SelectModifierPhase);
|
await game.phaseInterceptor.run(SelectModifierPhase);
|
||||||
|
|
||||||
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
||||||
|
@ -12,7 +12,6 @@ import { MysteryEncounter } from "#mystery-encounters/mystery-encounter";
|
|||||||
import * as MysteryEncounters from "#mystery-encounters/mystery-encounters";
|
import * as MysteryEncounters from "#mystery-encounters/mystery-encounters";
|
||||||
import { HUMAN_TRANSITABLE_BIOMES } from "#mystery-encounters/mystery-encounters";
|
import { HUMAN_TRANSITABLE_BIOMES } from "#mystery-encounters/mystery-encounters";
|
||||||
import { TheExpertPokemonBreederEncounter } from "#mystery-encounters/the-expert-pokemon-breeder-encounter";
|
import { TheExpertPokemonBreederEncounter } from "#mystery-encounters/the-expert-pokemon-breeder-encounter";
|
||||||
import { CommandPhase } from "#phases/command-phase";
|
|
||||||
import { PostMysteryEncounterPhase } from "#phases/mystery-encounter-phases";
|
import { PostMysteryEncounterPhase } from "#phases/mystery-encounter-phases";
|
||||||
import { SelectModifierPhase } from "#phases/select-modifier-phase";
|
import { SelectModifierPhase } from "#phases/select-modifier-phase";
|
||||||
import {
|
import {
|
||||||
@ -158,7 +157,7 @@ describe("The Expert Pokémon Breeder - Mystery Encounter", () => {
|
|||||||
expect(successfullyLoaded).toBe(true);
|
expect(successfullyLoaded).toBe(true);
|
||||||
|
|
||||||
// Check usual battle stuff
|
// Check usual battle stuff
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name);
|
expect(game).toBeAtPhase("CommandPhase");
|
||||||
expect(scene.currentBattle.trainer).toBeDefined();
|
expect(scene.currentBattle.trainer).toBeDefined();
|
||||||
expect(scene.currentBattle.mysteryEncounter?.encounterMode).toBe(MysteryEncounterMode.TRAINER_BATTLE);
|
expect(scene.currentBattle.mysteryEncounter?.encounterMode).toBe(MysteryEncounterMode.TRAINER_BATTLE);
|
||||||
expect(scene.getPlayerParty().length).toBe(1);
|
expect(scene.getPlayerParty().length).toBe(1);
|
||||||
@ -177,7 +176,7 @@ describe("The Expert Pokémon Breeder - Mystery Encounter", () => {
|
|||||||
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
||||||
await skipBattleRunMysteryEncounterRewardsPhase(game);
|
await skipBattleRunMysteryEncounterRewardsPhase(game);
|
||||||
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name);
|
expect(game).toBeAtPhase("SelectModifierPhase");
|
||||||
|
|
||||||
const eggsAfter = scene.gameData.eggs;
|
const eggsAfter = scene.gameData.eggs;
|
||||||
const commonEggs = scene.currentBattle.mysteryEncounter!.misc.pokemon1CommonEggs;
|
const commonEggs = scene.currentBattle.mysteryEncounter!.misc.pokemon1CommonEggs;
|
||||||
@ -243,7 +242,7 @@ describe("The Expert Pokémon Breeder - Mystery Encounter", () => {
|
|||||||
expect(successfullyLoaded).toBe(true);
|
expect(successfullyLoaded).toBe(true);
|
||||||
|
|
||||||
// Check usual battle stuff
|
// Check usual battle stuff
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name);
|
expect(game).toBeAtPhase("CommandPhase");
|
||||||
expect(scene.currentBattle.trainer).toBeDefined();
|
expect(scene.currentBattle.trainer).toBeDefined();
|
||||||
expect(scene.currentBattle.mysteryEncounter?.encounterMode).toBe(MysteryEncounterMode.TRAINER_BATTLE);
|
expect(scene.currentBattle.mysteryEncounter?.encounterMode).toBe(MysteryEncounterMode.TRAINER_BATTLE);
|
||||||
expect(scene.getPlayerParty().length).toBe(1);
|
expect(scene.getPlayerParty().length).toBe(1);
|
||||||
@ -262,7 +261,7 @@ describe("The Expert Pokémon Breeder - Mystery Encounter", () => {
|
|||||||
await runMysteryEncounterToEnd(game, 2, undefined, true);
|
await runMysteryEncounterToEnd(game, 2, undefined, true);
|
||||||
await skipBattleRunMysteryEncounterRewardsPhase(game);
|
await skipBattleRunMysteryEncounterRewardsPhase(game);
|
||||||
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name);
|
expect(game).toBeAtPhase("SelectModifierPhase");
|
||||||
|
|
||||||
const eggsAfter = scene.gameData.eggs;
|
const eggsAfter = scene.gameData.eggs;
|
||||||
const commonEggs = scene.currentBattle.mysteryEncounter!.misc.pokemon2CommonEggs;
|
const commonEggs = scene.currentBattle.mysteryEncounter!.misc.pokemon2CommonEggs;
|
||||||
@ -325,7 +324,7 @@ describe("The Expert Pokémon Breeder - Mystery Encounter", () => {
|
|||||||
expect(successfullyLoaded).toBe(true);
|
expect(successfullyLoaded).toBe(true);
|
||||||
|
|
||||||
// Check usual battle stuff
|
// Check usual battle stuff
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name);
|
expect(game).toBeAtPhase("CommandPhase");
|
||||||
expect(scene.currentBattle.trainer).toBeDefined();
|
expect(scene.currentBattle.trainer).toBeDefined();
|
||||||
expect(scene.currentBattle.mysteryEncounter?.encounterMode).toBe(MysteryEncounterMode.TRAINER_BATTLE);
|
expect(scene.currentBattle.mysteryEncounter?.encounterMode).toBe(MysteryEncounterMode.TRAINER_BATTLE);
|
||||||
expect(scene.getPlayerParty().length).toBe(1);
|
expect(scene.getPlayerParty().length).toBe(1);
|
||||||
@ -344,7 +343,7 @@ describe("The Expert Pokémon Breeder - Mystery Encounter", () => {
|
|||||||
await runMysteryEncounterToEnd(game, 3, undefined, true);
|
await runMysteryEncounterToEnd(game, 3, undefined, true);
|
||||||
await skipBattleRunMysteryEncounterRewardsPhase(game);
|
await skipBattleRunMysteryEncounterRewardsPhase(game);
|
||||||
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name);
|
expect(game).toBeAtPhase("SelectModifierPhase");
|
||||||
|
|
||||||
const eggsAfter = scene.gameData.eggs;
|
const eggsAfter = scene.gameData.eggs;
|
||||||
const commonEggs = scene.currentBattle.mysteryEncounter!.misc.pokemon3CommonEggs;
|
const commonEggs = scene.currentBattle.mysteryEncounter!.misc.pokemon3CommonEggs;
|
||||||
|
@ -182,7 +182,7 @@ describe("The Pokemon Salesman - Mystery Encounter", () => {
|
|||||||
|
|
||||||
await runSelectMysteryEncounterOption(game, 1);
|
await runSelectMysteryEncounterOption(game, 1);
|
||||||
|
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(MysteryEncounterPhase.name);
|
expect(game).toBeAtPhase("MysteryEncounterPhase");
|
||||||
expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled
|
expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled
|
||||||
expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled();
|
expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled();
|
||||||
expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled();
|
expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled();
|
||||||
|
@ -17,7 +17,6 @@ import { PokemonMove } from "#moves/pokemon-move";
|
|||||||
import * as EncounterPhaseUtils from "#mystery-encounters/encounter-phase-utils";
|
import * as EncounterPhaseUtils from "#mystery-encounters/encounter-phase-utils";
|
||||||
import * as MysteryEncounters from "#mystery-encounters/mystery-encounters";
|
import * as MysteryEncounters from "#mystery-encounters/mystery-encounters";
|
||||||
import { TheStrongStuffEncounter } from "#mystery-encounters/the-strong-stuff-encounter";
|
import { TheStrongStuffEncounter } from "#mystery-encounters/the-strong-stuff-encounter";
|
||||||
import { CommandPhase } from "#phases/command-phase";
|
|
||||||
import { MovePhase } from "#phases/move-phase";
|
import { MovePhase } from "#phases/move-phase";
|
||||||
import { SelectModifierPhase } from "#phases/select-modifier-phase";
|
import { SelectModifierPhase } from "#phases/select-modifier-phase";
|
||||||
import {
|
import {
|
||||||
@ -192,7 +191,7 @@ describe("The Strong Stuff - Mystery Encounter", () => {
|
|||||||
await runMysteryEncounterToEnd(game, 2, undefined, true);
|
await runMysteryEncounterToEnd(game, 2, undefined, true);
|
||||||
|
|
||||||
const enemyField = scene.getEnemyField();
|
const enemyField = scene.getEnemyField();
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name);
|
expect(game).toBeAtPhase("CommandPhase");
|
||||||
expect(enemyField.length).toBe(1);
|
expect(enemyField.length).toBe(1);
|
||||||
expect(enemyField[0].species.speciesId).toBe(SpeciesId.SHUCKLE);
|
expect(enemyField[0].species.speciesId).toBe(SpeciesId.SHUCKLE);
|
||||||
expect(enemyField[0].summonData.statStages).toEqual([0, 1, 0, 1, 0, 0, 0]);
|
expect(enemyField[0].summonData.statStages).toEqual([0, 1, 0, 1, 0, 0, 0]);
|
||||||
@ -230,7 +229,7 @@ describe("The Strong Stuff - Mystery Encounter", () => {
|
|||||||
await runMysteryEncounterToEnd(game, 2, undefined, true);
|
await runMysteryEncounterToEnd(game, 2, undefined, true);
|
||||||
await skipBattleRunMysteryEncounterRewardsPhase(game);
|
await skipBattleRunMysteryEncounterRewardsPhase(game);
|
||||||
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name);
|
expect(game).toBeAtPhase("SelectModifierPhase");
|
||||||
await game.phaseInterceptor.run(SelectModifierPhase);
|
await game.phaseInterceptor.run(SelectModifierPhase);
|
||||||
|
|
||||||
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
||||||
|
@ -15,7 +15,6 @@ import { MysteryEncounter } from "#mystery-encounters/mystery-encounter";
|
|||||||
import * as MysteryEncounters from "#mystery-encounters/mystery-encounters";
|
import * as MysteryEncounters from "#mystery-encounters/mystery-encounters";
|
||||||
import { HUMAN_TRANSITABLE_BIOMES } from "#mystery-encounters/mystery-encounters";
|
import { HUMAN_TRANSITABLE_BIOMES } from "#mystery-encounters/mystery-encounters";
|
||||||
import { TheWinstrateChallengeEncounter } from "#mystery-encounters/the-winstrate-challenge-encounter";
|
import { TheWinstrateChallengeEncounter } from "#mystery-encounters/the-winstrate-challenge-encounter";
|
||||||
import { CommandPhase } from "#phases/command-phase";
|
|
||||||
import { MysteryEncounterRewardsPhase } from "#phases/mystery-encounter-phases";
|
import { MysteryEncounterRewardsPhase } from "#phases/mystery-encounter-phases";
|
||||||
import { PartyHealPhase } from "#phases/party-heal-phase";
|
import { PartyHealPhase } from "#phases/party-heal-phase";
|
||||||
import { SelectModifierPhase } from "#phases/select-modifier-phase";
|
import { SelectModifierPhase } from "#phases/select-modifier-phase";
|
||||||
@ -263,7 +262,7 @@ describe("The Winstrate Challenge - Mystery Encounter", () => {
|
|||||||
await game.runToMysteryEncounter(MysteryEncounterType.THE_WINSTRATE_CHALLENGE, defaultParty);
|
await game.runToMysteryEncounter(MysteryEncounterType.THE_WINSTRATE_CHALLENGE, defaultParty);
|
||||||
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
||||||
|
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name);
|
expect(game).toBeAtPhase("CommandPhase");
|
||||||
expect(scene.currentBattle.trainer).toBeDefined();
|
expect(scene.currentBattle.trainer).toBeDefined();
|
||||||
expect(scene.currentBattle.trainer!.config.trainerType).toBe(TrainerType.VICTOR);
|
expect(scene.currentBattle.trainer!.config.trainerType).toBe(TrainerType.VICTOR);
|
||||||
expect(scene.currentBattle.mysteryEncounter?.enemyPartyConfigs.length).toBe(4);
|
expect(scene.currentBattle.mysteryEncounter?.enemyPartyConfigs.length).toBe(4);
|
||||||
@ -296,7 +295,7 @@ describe("The Winstrate Challenge - Mystery Encounter", () => {
|
|||||||
// Should have Macho Brace in the rewards
|
// Should have Macho Brace in the rewards
|
||||||
await skipBattleToNextBattle(game, true);
|
await skipBattleToNextBattle(game, true);
|
||||||
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name);
|
expect(game).toBeAtPhase("SelectModifierPhase");
|
||||||
await game.phaseInterceptor.run(SelectModifierPhase);
|
await game.phaseInterceptor.run(SelectModifierPhase);
|
||||||
|
|
||||||
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
||||||
@ -338,7 +337,7 @@ describe("The Winstrate Challenge - Mystery Encounter", () => {
|
|||||||
it("should have a Rarer Candy in the rewards", async () => {
|
it("should have a Rarer Candy in the rewards", async () => {
|
||||||
await game.runToMysteryEncounter(MysteryEncounterType.THE_WINSTRATE_CHALLENGE, defaultParty);
|
await game.runToMysteryEncounter(MysteryEncounterType.THE_WINSTRATE_CHALLENGE, defaultParty);
|
||||||
await runMysteryEncounterToEnd(game, 2);
|
await runMysteryEncounterToEnd(game, 2);
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name);
|
expect(game).toBeAtPhase("SelectModifierPhase");
|
||||||
await game.phaseInterceptor.run(SelectModifierPhase);
|
await game.phaseInterceptor.run(SelectModifierPhase);
|
||||||
|
|
||||||
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
||||||
|
@ -20,7 +20,6 @@ import {
|
|||||||
} from "#mystery-encounters/encounter-phase-utils";
|
} from "#mystery-encounters/encounter-phase-utils";
|
||||||
import * as MysteryEncounters from "#mystery-encounters/mystery-encounters";
|
import * as MysteryEncounters from "#mystery-encounters/mystery-encounters";
|
||||||
import { TrashToTreasureEncounter } from "#mystery-encounters/trash-to-treasure-encounter";
|
import { TrashToTreasureEncounter } from "#mystery-encounters/trash-to-treasure-encounter";
|
||||||
import { CommandPhase } from "#phases/command-phase";
|
|
||||||
import { MovePhase } from "#phases/move-phase";
|
import { MovePhase } from "#phases/move-phase";
|
||||||
import { SelectModifierPhase } from "#phases/select-modifier-phase";
|
import { SelectModifierPhase } from "#phases/select-modifier-phase";
|
||||||
import {
|
import {
|
||||||
@ -173,7 +172,7 @@ describe("Trash to Treasure - Mystery Encounter", () => {
|
|||||||
await game.runToMysteryEncounter(MysteryEncounterType.TRASH_TO_TREASURE, defaultParty);
|
await game.runToMysteryEncounter(MysteryEncounterType.TRASH_TO_TREASURE, defaultParty);
|
||||||
await runMysteryEncounterToEnd(game, 1);
|
await runMysteryEncounterToEnd(game, 1);
|
||||||
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name);
|
expect(game).toBeAtPhase("SelectModifierPhase");
|
||||||
|
|
||||||
const leftovers = scene.findModifier(m => m instanceof TurnHealModifier) as TurnHealModifier;
|
const leftovers = scene.findModifier(m => m instanceof TurnHealModifier) as TurnHealModifier;
|
||||||
expect(leftovers).toBeDefined();
|
expect(leftovers).toBeDefined();
|
||||||
@ -221,7 +220,7 @@ describe("Trash to Treasure - Mystery Encounter", () => {
|
|||||||
await runMysteryEncounterToEnd(game, 2, undefined, true);
|
await runMysteryEncounterToEnd(game, 2, undefined, true);
|
||||||
|
|
||||||
const enemyField = scene.getEnemyField();
|
const enemyField = scene.getEnemyField();
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name);
|
expect(game).toBeAtPhase("CommandPhase");
|
||||||
expect(enemyField.length).toBe(1);
|
expect(enemyField.length).toBe(1);
|
||||||
expect(enemyField[0].species.speciesId).toBe(SpeciesId.GARBODOR);
|
expect(enemyField[0].species.speciesId).toBe(SpeciesId.GARBODOR);
|
||||||
expect(enemyField[0].moveset).toEqual([
|
expect(enemyField[0].moveset).toEqual([
|
||||||
@ -243,7 +242,7 @@ describe("Trash to Treasure - Mystery Encounter", () => {
|
|||||||
await runMysteryEncounterToEnd(game, 2, undefined, true);
|
await runMysteryEncounterToEnd(game, 2, undefined, true);
|
||||||
await skipBattleRunMysteryEncounterRewardsPhase(game);
|
await skipBattleRunMysteryEncounterRewardsPhase(game);
|
||||||
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name);
|
expect(game).toBeAtPhase("SelectModifierPhase");
|
||||||
await game.phaseInterceptor.run(SelectModifierPhase);
|
await game.phaseInterceptor.run(SelectModifierPhase);
|
||||||
|
|
||||||
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
||||||
|
@ -16,7 +16,6 @@ import * as EncounterPhaseUtils from "#mystery-encounters/encounter-phase-utils"
|
|||||||
import { generateModifierType } from "#mystery-encounters/encounter-phase-utils";
|
import { generateModifierType } from "#mystery-encounters/encounter-phase-utils";
|
||||||
import * as MysteryEncounters from "#mystery-encounters/mystery-encounters";
|
import * as MysteryEncounters from "#mystery-encounters/mystery-encounters";
|
||||||
import { UncommonBreedEncounter } from "#mystery-encounters/uncommon-breed-encounter";
|
import { UncommonBreedEncounter } from "#mystery-encounters/uncommon-breed-encounter";
|
||||||
import { CommandPhase } from "#phases/command-phase";
|
|
||||||
import { MovePhase } from "#phases/move-phase";
|
import { MovePhase } from "#phases/move-phase";
|
||||||
import { MysteryEncounterPhase } from "#phases/mystery-encounter-phases";
|
import { MysteryEncounterPhase } from "#phases/mystery-encounter-phases";
|
||||||
import { StatStageChangePhase } from "#phases/stat-stage-change-phase";
|
import { StatStageChangePhase } from "#phases/stat-stage-change-phase";
|
||||||
@ -121,7 +120,7 @@ describe("Uncommon Breed - Mystery Encounter", () => {
|
|||||||
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
||||||
|
|
||||||
const enemyField = scene.getEnemyField();
|
const enemyField = scene.getEnemyField();
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name);
|
expect(game).toBeAtPhase("CommandPhase");
|
||||||
expect(enemyField.length).toBe(1);
|
expect(enemyField.length).toBe(1);
|
||||||
expect(enemyField[0].species.speciesId).toBe(speciesToSpawn);
|
expect(enemyField[0].species.speciesId).toBe(speciesToSpawn);
|
||||||
|
|
||||||
@ -148,7 +147,7 @@ describe("Uncommon Breed - Mystery Encounter", () => {
|
|||||||
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
await runMysteryEncounterToEnd(game, 1, undefined, true);
|
||||||
|
|
||||||
const enemyField = scene.getEnemyField();
|
const enemyField = scene.getEnemyField();
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name);
|
expect(game).toBeAtPhase("CommandPhase");
|
||||||
expect(enemyField.length).toBe(1);
|
expect(enemyField.length).toBe(1);
|
||||||
expect(enemyField[0].species.speciesId).toBe(speciesToSpawn);
|
expect(enemyField[0].species.speciesId).toBe(speciesToSpawn);
|
||||||
|
|
||||||
@ -200,7 +199,7 @@ describe("Uncommon Breed - Mystery Encounter", () => {
|
|||||||
|
|
||||||
await runSelectMysteryEncounterOption(game, 2);
|
await runSelectMysteryEncounterOption(game, 2);
|
||||||
|
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(MysteryEncounterPhase.name);
|
expect(game).toBeAtPhase("MysteryEncounterPhase");
|
||||||
expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled
|
expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled
|
||||||
expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled();
|
expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled();
|
||||||
expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled();
|
expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled();
|
||||||
@ -260,7 +259,7 @@ describe("Uncommon Breed - Mystery Encounter", () => {
|
|||||||
|
|
||||||
await runSelectMysteryEncounterOption(game, 3);
|
await runSelectMysteryEncounterOption(game, 3);
|
||||||
|
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(MysteryEncounterPhase.name);
|
expect(game).toBeAtPhase("MysteryEncounterPhase");
|
||||||
expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled
|
expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled
|
||||||
expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled();
|
expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled();
|
||||||
expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled();
|
expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled();
|
||||||
|
@ -10,7 +10,6 @@ import * as EncounterPhaseUtils from "#mystery-encounters/encounter-phase-utils"
|
|||||||
import * as EncounterTransformationSequence from "#mystery-encounters/encounter-transformation-sequence";
|
import * as EncounterTransformationSequence from "#mystery-encounters/encounter-transformation-sequence";
|
||||||
import * as MysteryEncounters from "#mystery-encounters/mystery-encounters";
|
import * as MysteryEncounters from "#mystery-encounters/mystery-encounters";
|
||||||
import { WeirdDreamEncounter } from "#mystery-encounters/weird-dream-encounter";
|
import { WeirdDreamEncounter } from "#mystery-encounters/weird-dream-encounter";
|
||||||
import { CommandPhase } from "#phases/command-phase";
|
|
||||||
import { SelectModifierPhase } from "#phases/select-modifier-phase";
|
import { SelectModifierPhase } from "#phases/select-modifier-phase";
|
||||||
import {
|
import {
|
||||||
runMysteryEncounterToEnd,
|
runMysteryEncounterToEnd,
|
||||||
@ -117,7 +116,7 @@ describe("Weird Dream - Mystery Encounter", () => {
|
|||||||
|
|
||||||
await runMysteryEncounterToEnd(game, 1);
|
await runMysteryEncounterToEnd(game, 1);
|
||||||
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name);
|
expect(game).toBeAtPhase("SelectModifierPhase");
|
||||||
|
|
||||||
const pokemonAfter = scene.getPlayerParty();
|
const pokemonAfter = scene.getPlayerParty();
|
||||||
const bstsAfter = pokemonAfter.map(pokemon => pokemon.getSpeciesForm().getBaseStatTotal());
|
const bstsAfter = pokemonAfter.map(pokemon => pokemon.getSpeciesForm().getBaseStatTotal());
|
||||||
@ -140,7 +139,7 @@ describe("Weird Dream - Mystery Encounter", () => {
|
|||||||
await game.runToMysteryEncounter(MysteryEncounterType.WEIRD_DREAM, defaultParty);
|
await game.runToMysteryEncounter(MysteryEncounterType.WEIRD_DREAM, defaultParty);
|
||||||
await runMysteryEncounterToEnd(game, 1);
|
await runMysteryEncounterToEnd(game, 1);
|
||||||
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name);
|
expect(game).toBeAtPhase("SelectModifierPhase");
|
||||||
await game.phaseInterceptor.run(SelectModifierPhase);
|
await game.phaseInterceptor.run(SelectModifierPhase);
|
||||||
|
|
||||||
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
||||||
@ -187,7 +186,7 @@ describe("Weird Dream - Mystery Encounter", () => {
|
|||||||
await runMysteryEncounterToEnd(game, 2, undefined, true);
|
await runMysteryEncounterToEnd(game, 2, undefined, true);
|
||||||
|
|
||||||
const enemyField = scene.getEnemyField();
|
const enemyField = scene.getEnemyField();
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name);
|
expect(game).toBeAtPhase("CommandPhase");
|
||||||
expect(enemyField.length).toBe(1);
|
expect(enemyField.length).toBe(1);
|
||||||
expect(scene.getEnemyParty().length).toBe(scene.getPlayerParty().length);
|
expect(scene.getEnemyParty().length).toBe(scene.getPlayerParty().length);
|
||||||
});
|
});
|
||||||
@ -197,7 +196,7 @@ describe("Weird Dream - Mystery Encounter", () => {
|
|||||||
await runMysteryEncounterToEnd(game, 2, undefined, true);
|
await runMysteryEncounterToEnd(game, 2, undefined, true);
|
||||||
await skipBattleRunMysteryEncounterRewardsPhase(game);
|
await skipBattleRunMysteryEncounterRewardsPhase(game);
|
||||||
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
await game.phaseInterceptor.to(SelectModifierPhase, false);
|
||||||
expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name);
|
expect(game).toBeAtPhase("SelectModifierPhase");
|
||||||
await game.phaseInterceptor.run(SelectModifierPhase);
|
await game.phaseInterceptor.run(SelectModifierPhase);
|
||||||
|
|
||||||
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
expect(scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT);
|
||||||
|
@ -34,7 +34,7 @@ describe("Mystery Encounters", () => {
|
|||||||
]);
|
]);
|
||||||
|
|
||||||
await game.phaseInterceptor.to(MysteryEncounterPhase, false);
|
await game.phaseInterceptor.to(MysteryEncounterPhase, false);
|
||||||
expect(game.scene.phaseManager.getCurrentPhase()!.constructor.name).toBe(MysteryEncounterPhase.name);
|
expect(game).toBeAtPhase("MysteryEncounterPhase");
|
||||||
});
|
});
|
||||||
|
|
||||||
it("Encounters should not run on X1 waves", async () => {
|
it("Encounters should not run on X1 waves", async () => {
|
||||||
|
@ -38,7 +38,7 @@ describe("Mystery Encounter Phases", () => {
|
|||||||
]);
|
]);
|
||||||
|
|
||||||
await game.phaseInterceptor.to(MysteryEncounterPhase, false);
|
await game.phaseInterceptor.to(MysteryEncounterPhase, false);
|
||||||
expect(game.scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(MysteryEncounterPhase.name);
|
expect(game).toBeAtPhase("MysteryEncounterPhase");
|
||||||
});
|
});
|
||||||
|
|
||||||
it("Runs MysteryEncounterPhase", async () => {
|
it("Runs MysteryEncounterPhase", async () => {
|
||||||
|
@ -46,6 +46,7 @@ import type { InputsHandler } from "#test/test-utils/inputs-handler";
|
|||||||
import { MockFetch } from "#test/test-utils/mocks/mock-fetch";
|
import { MockFetch } from "#test/test-utils/mocks/mock-fetch";
|
||||||
import { PhaseInterceptor } from "#test/test-utils/phase-interceptor";
|
import { PhaseInterceptor } from "#test/test-utils/phase-interceptor";
|
||||||
import { TextInterceptor } from "#test/test-utils/text-interceptor";
|
import { TextInterceptor } from "#test/test-utils/text-interceptor";
|
||||||
|
import type { PhaseClass, PhaseString } from "#types/phase-types";
|
||||||
import type { BallUiHandler } from "#ui/ball-ui-handler";
|
import type { BallUiHandler } from "#ui/ball-ui-handler";
|
||||||
import type { BattleMessageUiHandler } from "#ui/battle-message-ui-handler";
|
import type { BattleMessageUiHandler } from "#ui/battle-message-ui-handler";
|
||||||
import type { CommandUiHandler } from "#ui/command-ui-handler";
|
import type { CommandUiHandler } from "#ui/command-ui-handler";
|
||||||
@ -162,7 +163,7 @@ export class GameManager {
|
|||||||
* End the currently running phase immediately.
|
* End the currently running phase immediately.
|
||||||
*/
|
*/
|
||||||
endPhase() {
|
endPhase() {
|
||||||
this.scene.phaseManager.getCurrentPhase()?.end();
|
this.scene.phaseManager.getCurrentPhase().end();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -224,7 +225,7 @@ export class GameManager {
|
|||||||
// This will consider all battle entry dialog as seens and skip them
|
// This will consider all battle entry dialog as seens and skip them
|
||||||
vi.spyOn(this.scene.ui, "shouldSkipDialogue").mockReturnValue(true);
|
vi.spyOn(this.scene.ui, "shouldSkipDialogue").mockReturnValue(true);
|
||||||
|
|
||||||
if (overrides.OPP_HELD_ITEMS_OVERRIDE.length === 0) {
|
if (overrides.ENEMY_HELD_ITEMS_OVERRIDE.length === 0) {
|
||||||
this.removeEnemyHeldItems();
|
this.removeEnemyHeldItems();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -412,10 +413,11 @@ export class GameManager {
|
|||||||
* Checks if the current phase matches the target phase.
|
* Checks if the current phase matches the target phase.
|
||||||
* @param phaseTarget - The target phase.
|
* @param phaseTarget - The target phase.
|
||||||
* @returns Whether the current phase matches the target phase
|
* @returns Whether the current phase matches the target phase
|
||||||
|
* @todo Remove `phaseClass` from signature
|
||||||
*/
|
*/
|
||||||
isCurrentPhase(phaseTarget) {
|
isCurrentPhase(phaseTarget: PhaseClass | PhaseString) {
|
||||||
const targetName = typeof phaseTarget === "string" ? phaseTarget : phaseTarget.name;
|
const targetName = typeof phaseTarget === "string" ? phaseTarget : phaseTarget.name;
|
||||||
return this.scene.phaseManager.getCurrentPhase()?.constructor.name === targetName;
|
return this.scene.phaseManager.getCurrentPhase().phaseName === targetName;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -50,7 +50,7 @@ export class ChallengeModeHelper extends GameManagerHelper {
|
|||||||
});
|
});
|
||||||
|
|
||||||
await this.game.phaseInterceptor.run(EncounterPhase);
|
await this.game.phaseInterceptor.run(EncounterPhase);
|
||||||
if (overrides.OPP_HELD_ITEMS_OVERRIDE.length === 0 && this.game.override.removeEnemyStartingItems) {
|
if (overrides.ENEMY_HELD_ITEMS_OVERRIDE.length === 0 && this.game.override.removeEnemyStartingItems) {
|
||||||
this.game.removeEnemyHeldItems();
|
this.game.removeEnemyHeldItems();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -53,7 +53,7 @@ export class ClassicModeHelper extends GameManagerHelper {
|
|||||||
});
|
});
|
||||||
|
|
||||||
await this.game.phaseInterceptor.to(EncounterPhase);
|
await this.game.phaseInterceptor.to(EncounterPhase);
|
||||||
if (overrides.OPP_HELD_ITEMS_OVERRIDE.length === 0 && this.game.override.removeEnemyStartingItems) {
|
if (overrides.ENEMY_HELD_ITEMS_OVERRIDE.length === 0 && this.game.override.removeEnemyStartingItems) {
|
||||||
this.game.removeEnemyHeldItems();
|
this.game.removeEnemyHeldItems();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -37,7 +37,7 @@ export class DailyModeHelper extends GameManagerHelper {
|
|||||||
|
|
||||||
await this.game.phaseInterceptor.to(EncounterPhase);
|
await this.game.phaseInterceptor.to(EncounterPhase);
|
||||||
|
|
||||||
if (overrides.OPP_HELD_ITEMS_OVERRIDE.length === 0 && this.game.override.removeEnemyStartingItems) {
|
if (overrides.ENEMY_HELD_ITEMS_OVERRIDE.length === 0 && this.game.override.removeEnemyStartingItems) {
|
||||||
this.game.removeEnemyHeldItems();
|
this.game.removeEnemyHeldItems();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -228,8 +228,8 @@ export class MoveHelper extends GameManagerHelper {
|
|||||||
console.warn("Player moveset override disabled due to use of `game.move.changeMoveset`!");
|
console.warn("Player moveset override disabled due to use of `game.move.changeMoveset`!");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (coerceArray(Overrides.OPP_MOVESET_OVERRIDE).length > 0) {
|
if (coerceArray(Overrides.ENEMY_MOVESET_OVERRIDE).length > 0) {
|
||||||
vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([]);
|
vi.spyOn(Overrides, "ENEMY_MOVESET_OVERRIDE", "get").mockReturnValue([]);
|
||||||
console.warn("Enemy moveset override disabled due to use of `game.move.changeMoveset`!");
|
console.warn("Enemy moveset override disabled due to use of `game.move.changeMoveset`!");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -302,8 +302,8 @@ export class MoveHelper extends GameManagerHelper {
|
|||||||
(this.game.scene.phaseManager.getCurrentPhase() as EnemyCommandPhase).getFieldIndex()
|
(this.game.scene.phaseManager.getCurrentPhase() as EnemyCommandPhase).getFieldIndex()
|
||||||
];
|
];
|
||||||
|
|
||||||
if ([Overrides.OPP_MOVESET_OVERRIDE].flat().length > 0) {
|
if ([Overrides.ENEMY_MOVESET_OVERRIDE].flat().length > 0) {
|
||||||
vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([]);
|
vi.spyOn(Overrides, "ENEMY_MOVESET_OVERRIDE", "get").mockReturnValue([]);
|
||||||
console.warn(
|
console.warn(
|
||||||
"Warning: `forceEnemyMove` overwrites the Pokemon's moveset and disables the enemy moveset override!",
|
"Warning: `forceEnemyMove` overwrites the Pokemon's moveset and disables the enemy moveset override!",
|
||||||
);
|
);
|
||||||
|
@ -406,7 +406,7 @@ export class OverridesHelper extends GameManagerHelper {
|
|||||||
* @returns `this`
|
* @returns `this`
|
||||||
*/
|
*/
|
||||||
public enemySpecies(species: SpeciesId | number): this {
|
public enemySpecies(species: SpeciesId | number): this {
|
||||||
vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(species);
|
vi.spyOn(Overrides, "ENEMY_SPECIES_OVERRIDE", "get").mockReturnValue(species);
|
||||||
this.log(`Enemy Pokemon species set to ${SpeciesId[species]} (=${species})!`);
|
this.log(`Enemy Pokemon species set to ${SpeciesId[species]} (=${species})!`);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
@ -416,7 +416,7 @@ export class OverridesHelper extends GameManagerHelper {
|
|||||||
* @returns `this`
|
* @returns `this`
|
||||||
*/
|
*/
|
||||||
public enableEnemyFusion(): this {
|
public enableEnemyFusion(): this {
|
||||||
vi.spyOn(Overrides, "OPP_FUSION_OVERRIDE", "get").mockReturnValue(true);
|
vi.spyOn(Overrides, "ENEMY_FUSION_OVERRIDE", "get").mockReturnValue(true);
|
||||||
this.log("Enemy Pokemon is a random fusion!");
|
this.log("Enemy Pokemon is a random fusion!");
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
@ -427,7 +427,7 @@ export class OverridesHelper extends GameManagerHelper {
|
|||||||
* @returns `this`
|
* @returns `this`
|
||||||
*/
|
*/
|
||||||
public enemyFusionSpecies(species: SpeciesId | number): this {
|
public enemyFusionSpecies(species: SpeciesId | number): this {
|
||||||
vi.spyOn(Overrides, "OPP_FUSION_SPECIES_OVERRIDE", "get").mockReturnValue(species);
|
vi.spyOn(Overrides, "ENEMY_FUSION_SPECIES_OVERRIDE", "get").mockReturnValue(species);
|
||||||
this.log(`Enemy Pokemon fusion species set to ${SpeciesId[species]} (=${species})!`);
|
this.log(`Enemy Pokemon fusion species set to ${SpeciesId[species]} (=${species})!`);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
@ -438,7 +438,7 @@ export class OverridesHelper extends GameManagerHelper {
|
|||||||
* @returns `this`
|
* @returns `this`
|
||||||
*/
|
*/
|
||||||
public enemyAbility(ability: AbilityId): this {
|
public enemyAbility(ability: AbilityId): this {
|
||||||
vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(ability);
|
vi.spyOn(Overrides, "ENEMY_ABILITY_OVERRIDE", "get").mockReturnValue(ability);
|
||||||
this.log(`Enemy Pokemon ability set to ${AbilityId[ability]} (=${ability})!`);
|
this.log(`Enemy Pokemon ability set to ${AbilityId[ability]} (=${ability})!`);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
@ -449,7 +449,7 @@ export class OverridesHelper extends GameManagerHelper {
|
|||||||
* @returns `this`
|
* @returns `this`
|
||||||
*/
|
*/
|
||||||
public enemyPassiveAbility(passiveAbility: AbilityId): this {
|
public enemyPassiveAbility(passiveAbility: AbilityId): this {
|
||||||
vi.spyOn(Overrides, "OPP_PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(passiveAbility);
|
vi.spyOn(Overrides, "ENEMY_PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(passiveAbility);
|
||||||
this.log(`Enemy Pokemon PASSIVE ability set to ${AbilityId[passiveAbility]} (=${passiveAbility})!`);
|
this.log(`Enemy Pokemon PASSIVE ability set to ${AbilityId[passiveAbility]} (=${passiveAbility})!`);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
@ -460,7 +460,7 @@ export class OverridesHelper extends GameManagerHelper {
|
|||||||
* @returns `this`
|
* @returns `this`
|
||||||
*/
|
*/
|
||||||
public enemyHasPassiveAbility(hasPassiveAbility: boolean | null): this {
|
public enemyHasPassiveAbility(hasPassiveAbility: boolean | null): this {
|
||||||
vi.spyOn(Overrides, "OPP_HAS_PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(hasPassiveAbility);
|
vi.spyOn(Overrides, "ENEMY_HAS_PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(hasPassiveAbility);
|
||||||
if (hasPassiveAbility === null) {
|
if (hasPassiveAbility === null) {
|
||||||
this.log("Enemy Pokemon PASSIVE ability no longer force enabled or disabled!");
|
this.log("Enemy Pokemon PASSIVE ability no longer force enabled or disabled!");
|
||||||
} else {
|
} else {
|
||||||
@ -475,7 +475,7 @@ export class OverridesHelper extends GameManagerHelper {
|
|||||||
* @returns `this`
|
* @returns `this`
|
||||||
*/
|
*/
|
||||||
public enemyMoveset(moveset: MoveId | MoveId[]): this {
|
public enemyMoveset(moveset: MoveId | MoveId[]): this {
|
||||||
vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue(moveset);
|
vi.spyOn(Overrides, "ENEMY_MOVESET_OVERRIDE", "get").mockReturnValue(moveset);
|
||||||
moveset = coerceArray(moveset);
|
moveset = coerceArray(moveset);
|
||||||
const movesetStr = moveset.map(moveId => MoveId[moveId]).join(", ");
|
const movesetStr = moveset.map(moveId => MoveId[moveId]).join(", ");
|
||||||
this.log(`Enemy Pokemon moveset set to ${movesetStr} (=[${moveset.join(", ")}])!`);
|
this.log(`Enemy Pokemon moveset set to ${movesetStr} (=[${moveset.join(", ")}])!`);
|
||||||
@ -488,7 +488,7 @@ export class OverridesHelper extends GameManagerHelper {
|
|||||||
* @returns `this`
|
* @returns `this`
|
||||||
*/
|
*/
|
||||||
public enemyLevel(level: number): this {
|
public enemyLevel(level: number): this {
|
||||||
vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(level);
|
vi.spyOn(Overrides, "ENEMY_LEVEL_OVERRIDE", "get").mockReturnValue(level);
|
||||||
this.log(`Enemy Pokemon level set to ${level}!`);
|
this.log(`Enemy Pokemon level set to ${level}!`);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
@ -499,7 +499,7 @@ export class OverridesHelper extends GameManagerHelper {
|
|||||||
* @returns `this`
|
* @returns `this`
|
||||||
*/
|
*/
|
||||||
public enemyStatusEffect(statusEffect: StatusEffect): this {
|
public enemyStatusEffect(statusEffect: StatusEffect): this {
|
||||||
vi.spyOn(Overrides, "OPP_STATUS_OVERRIDE", "get").mockReturnValue(statusEffect);
|
vi.spyOn(Overrides, "ENEMY_STATUS_OVERRIDE", "get").mockReturnValue(statusEffect);
|
||||||
this.log(`Enemy Pokemon status-effect set to ${StatusEffect[statusEffect]} (=${statusEffect})!`);
|
this.log(`Enemy Pokemon status-effect set to ${StatusEffect[statusEffect]} (=${statusEffect})!`);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
@ -510,7 +510,7 @@ export class OverridesHelper extends GameManagerHelper {
|
|||||||
* @returns `this`
|
* @returns `this`
|
||||||
*/
|
*/
|
||||||
public enemyHeldItems(items: ModifierOverride[]): this {
|
public enemyHeldItems(items: ModifierOverride[]): this {
|
||||||
vi.spyOn(Overrides, "OPP_HELD_ITEMS_OVERRIDE", "get").mockReturnValue(items);
|
vi.spyOn(Overrides, "ENEMY_HELD_ITEMS_OVERRIDE", "get").mockReturnValue(items);
|
||||||
this.log("Enemy Pokemon held items set to:", items);
|
this.log("Enemy Pokemon held items set to:", items);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
@ -571,7 +571,7 @@ export class OverridesHelper extends GameManagerHelper {
|
|||||||
* @param variant - (Optional) The enemy's shiny {@linkcode Variant}.
|
* @param variant - (Optional) The enemy's shiny {@linkcode Variant}.
|
||||||
*/
|
*/
|
||||||
enemyShiny(shininess: boolean | null, variant?: Variant): this {
|
enemyShiny(shininess: boolean | null, variant?: Variant): this {
|
||||||
vi.spyOn(Overrides, "OPP_SHINY_OVERRIDE", "get").mockReturnValue(shininess);
|
vi.spyOn(Overrides, "ENEMY_SHINY_OVERRIDE", "get").mockReturnValue(shininess);
|
||||||
if (shininess === null) {
|
if (shininess === null) {
|
||||||
this.log("Disabled enemy Pokemon shiny override!");
|
this.log("Disabled enemy Pokemon shiny override!");
|
||||||
} else {
|
} else {
|
||||||
@ -579,7 +579,7 @@ export class OverridesHelper extends GameManagerHelper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (variant !== undefined) {
|
if (variant !== undefined) {
|
||||||
vi.spyOn(Overrides, "OPP_VARIANT_OVERRIDE", "get").mockReturnValue(variant);
|
vi.spyOn(Overrides, "ENEMY_VARIANT_OVERRIDE", "get").mockReturnValue(variant);
|
||||||
this.log(`Set enemy shiny variant to be ${variant}!`);
|
this.log(`Set enemy shiny variant to be ${variant}!`);
|
||||||
}
|
}
|
||||||
return this;
|
return this;
|
||||||
@ -594,7 +594,7 @@ export class OverridesHelper extends GameManagerHelper {
|
|||||||
* @returns `this`
|
* @returns `this`
|
||||||
*/
|
*/
|
||||||
public enemyHealthSegments(healthSegments: number): this {
|
public enemyHealthSegments(healthSegments: number): this {
|
||||||
vi.spyOn(Overrides, "OPP_HEALTH_SEGMENTS_OVERRIDE", "get").mockReturnValue(healthSegments);
|
vi.spyOn(Overrides, "ENEMY_HEALTH_SEGMENTS_OVERRIDE", "get").mockReturnValue(healthSegments);
|
||||||
this.log("Enemy Pokemon health segments set to:", healthSegments);
|
this.log("Enemy Pokemon health segments set to:", healthSegments);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
45
test/test-utils/matchers/to-be-at-phase.ts
Normal file
45
test/test-utils/matchers/to-be-at-phase.ts
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
/** biome-ignore-start lint/correctness/noUnusedImports: TSDoc imports */
|
||||||
|
import type { Phase } from "#app/phase";
|
||||||
|
import type { GameManager } from "#test/test-utils/game-manager";
|
||||||
|
// biome-ignore-end lint/correctness/noUnusedImports: TSDoc
|
||||||
|
|
||||||
|
import { isGameManagerInstance, receivedStr } from "#test/test-utils/test-utils";
|
||||||
|
import type { PhaseString } from "#types/phase-types";
|
||||||
|
import type { MatcherState, SyncExpectationResult } from "@vitest/expect";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Matcher that checks if the current {@linkcode Phase} is of the given type.
|
||||||
|
* @param received - The object to check. Should be the current {@linkcode GameManager}
|
||||||
|
* @param expectedPhase - The expected {@linkcode PhaseString}
|
||||||
|
* @returns The result of the matching
|
||||||
|
*/
|
||||||
|
export function toBeAtPhase(this: MatcherState, received: unknown, expectedPhase: PhaseString): SyncExpectationResult {
|
||||||
|
if (!isGameManagerInstance(received)) {
|
||||||
|
return {
|
||||||
|
pass: this.isNot,
|
||||||
|
message: () => `Expected to receive a GameManager, but got ${receivedStr(received)}!`,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!received.scene?.phaseManager) {
|
||||||
|
return {
|
||||||
|
pass: this.isNot,
|
||||||
|
message: () => `Expected GameManager.${received.scene ? "scene.phaseManager" : "scene"} to be defined!`,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
const currPhase = received.scene.phaseManager.getCurrentPhase();
|
||||||
|
const pass = currPhase.is(expectedPhase);
|
||||||
|
|
||||||
|
const actual = currPhase.phaseName;
|
||||||
|
|
||||||
|
return {
|
||||||
|
pass,
|
||||||
|
message: () =>
|
||||||
|
pass
|
||||||
|
? `Expected the current phase to NOT be ${expectedPhase}, but it was!`
|
||||||
|
: `Expected the current phase to be ${expectedPhase}, but got ${actual} instead!`,
|
||||||
|
expected: expectedPhase,
|
||||||
|
actual,
|
||||||
|
};
|
||||||
|
}
|
@ -33,7 +33,7 @@ export function toHaveUsedPP(
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
const override = received.isPlayer() ? Overrides.MOVESET_OVERRIDE : Overrides.OPP_MOVESET_OVERRIDE;
|
const override = received.isPlayer() ? Overrides.MOVESET_OVERRIDE : Overrides.ENEMY_MOVESET_OVERRIDE;
|
||||||
if (coerceArray(override).length > 0) {
|
if (coerceArray(override).length > 0) {
|
||||||
return {
|
return {
|
||||||
pass: false,
|
pass: false,
|
||||||
|
@ -416,7 +416,7 @@ export class PhaseInterceptor {
|
|||||||
const actionForNextPrompt = this.prompts[0];
|
const actionForNextPrompt = this.prompts[0];
|
||||||
const expireFn = actionForNextPrompt.expireFn?.();
|
const expireFn = actionForNextPrompt.expireFn?.();
|
||||||
const currentMode = this.scene.ui.getMode();
|
const currentMode = this.scene.ui.getMode();
|
||||||
const currentPhase = this.scene.phaseManager.getCurrentPhase()?.constructor.name;
|
const currentPhase = this.scene.phaseManager.getCurrentPhase().phaseName;
|
||||||
const currentHandler = this.scene.ui.getHandler();
|
const currentHandler = this.scene.ui.getHandler();
|
||||||
if (expireFn) {
|
if (expireFn) {
|
||||||
this.prompts.shift();
|
this.prompts.shift();
|
||||||
|
Loading…
Reference in New Issue
Block a user