update sleeping snorlax encounter

This commit is contained in:
ImperialSympathizer 2024-07-18 13:41:50 -04:00
parent a3664b4624
commit fd48c3fcae
33 changed files with 362 additions and 393 deletions

View File

@ -1554,7 +1554,7 @@ export class MysteryEncounterPostSummonTag extends BattlerTag {
const cancelled = new Utils.BooleanHolder(false); const cancelled = new Utils.BooleanHolder(false);
applyAbAttrs(ProtectStatAbAttr, pokemon, cancelled); applyAbAttrs(ProtectStatAbAttr, pokemon, cancelled);
if (!cancelled.value) { if (!cancelled.value) {
const mysteryEncounterBattleEffects = pokemon.summonData.mysteryEncounterBattleEffects; const mysteryEncounterBattleEffects = pokemon.mysteryEncounterBattleEffects;
if (mysteryEncounterBattleEffects) { if (mysteryEncounterBattleEffects) {
mysteryEncounterBattleEffects(pokemon); mysteryEncounterBattleEffects(pokemon);
} }

View File

@ -13,7 +13,7 @@ import { EnemyPartyConfig, EnemyPokemonConfig, initBattleWithEnemyConfig, leaveE
import { getRandomPlayerPokemon, getRandomSpeciesByStarterTier } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import { getRandomPlayerPokemon, getRandomSpeciesByStarterTier } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils";
/** i18n namespace for encounter */ /** i18n namespace for encounter */
const namespace = "mysteryEncounter:dark_deal"; const namespace = "mysteryEncounter:darkDeal";
/** Exclude Ultra Beasts (inludes Cosmog/Solgaleo/Lunala/Necrozma), Paradox (includes Miraidon/Koraidon), Eternatus, and egg-locked mythicals */ /** Exclude Ultra Beasts (inludes Cosmog/Solgaleo/Lunala/Necrozma), Paradox (includes Miraidon/Koraidon), Eternatus, and egg-locked mythicals */
const excludedBosses = [ const excludedBosses = [
@ -91,32 +91,32 @@ export const DarkDealEncounter: IMysteryEncounter =
]) ])
.withIntroDialogue([ .withIntroDialogue([
{ {
text: `${namespace}_intro_message`, text: `${namespace}:intro`,
}, },
{ {
speaker: `${namespace}_speaker`, speaker: `${namespace}:speaker`,
text: `${namespace}_intro_dialogue`, text: `${namespace}:intro_dialogue`,
}, },
]) ])
.withSceneWaveRangeRequirement(30, 180) // waves 30 to 180 .withSceneWaveRangeRequirement(30, 180) // waves 30 to 180
.withScenePartySizeRequirement(2, 6) // Must have at least 2 pokemon in party .withScenePartySizeRequirement(2, 6) // Must have at least 2 pokemon in party
.withCatchAllowed(true) .withCatchAllowed(true)
.withTitle(`${namespace}_title`) .withTitle(`${namespace}:title`)
.withDescription(`${namespace}_description`) .withDescription(`${namespace}:description`)
.withQuery(`${namespace}_query`) .withQuery(`${namespace}:query`)
.withOption( .withOption(
new MysteryEncounterOptionBuilder() new MysteryEncounterOptionBuilder()
.withOptionMode(EncounterOptionMode.DEFAULT) .withOptionMode(EncounterOptionMode.DEFAULT)
.withDialogue({ .withDialogue({
buttonLabel: `${namespace}_option_1_label`, buttonLabel: `${namespace}:option:1:label`,
buttonTooltip: `${namespace}_option_1_tooltip`, buttonTooltip: `${namespace}:option:1:tooltip`,
selected: [ selected: [
{ {
speaker: `${namespace}_speaker`, speaker: `${namespace}:speaker`,
text: `${namespace}_option_1_selected`, text: `${namespace}:option:1:selected_dialogue`,
}, },
{ {
text: `${namespace}_option_1_selected_message`, text: `${namespace}:option:1:selected_message`,
}, },
], ],
}) })
@ -126,10 +126,7 @@ export const DarkDealEncounter: IMysteryEncounter =
const removedPokemon = getRandomPlayerPokemon(scene, false, true); const removedPokemon = getRandomPlayerPokemon(scene, false, true);
scene.removePokemonFromPlayerParty(removedPokemon); scene.removePokemonFromPlayerParty(removedPokemon);
scene.currentBattle.mysteryEncounter.setDialogueToken( scene.currentBattle.mysteryEncounter.setDialogueToken("pokeName", removedPokemon.name);
"pokeName",
removedPokemon.name
);
// Store removed pokemon types // Store removed pokemon types
scene.currentBattle.mysteryEncounter.misc = [ scene.currentBattle.mysteryEncounter.misc = [
@ -158,7 +155,6 @@ export const DarkDealEncounter: IMysteryEncounter =
pokemonConfig.formIndex = 0; pokemonConfig.formIndex = 0;
} }
const config: EnemyPartyConfig = { const config: EnemyPartyConfig = {
levelAdditiveMultiplier: 0.75,
pokemonConfigs: [pokemonConfig], pokemonConfigs: [pokemonConfig],
}; };
return initBattleWithEnemyConfig(scene, config); return initBattleWithEnemyConfig(scene, config);
@ -167,12 +163,12 @@ export const DarkDealEncounter: IMysteryEncounter =
) )
.withSimpleOption( .withSimpleOption(
{ {
buttonLabel: `${namespace}_option_2_label`, buttonLabel: `${namespace}:option:2:label`,
buttonTooltip: `${namespace}_option_2_tooltip`, buttonTooltip: `${namespace}:option:2:tooltip`,
selected: [ selected: [
{ {
speaker: `${namespace}_speaker`, speaker: `${namespace}:speaker`,
text: `${namespace}_option_2_selected`, text: `${namespace}:option:2:selected`,
}, },
], ],
}, },
@ -184,7 +180,7 @@ export const DarkDealEncounter: IMysteryEncounter =
) )
.withOutroDialogue([ .withOutroDialogue([
{ {
text: `${namespace}_outro` text: `${namespace}:outro`
} }
]) ])
.build(); .build();

View File

@ -102,23 +102,23 @@ export const FightOrFlightEncounter: IMysteryEncounter =
const primaryPokemon = encounter.options[1].primaryPokemon; const primaryPokemon = encounter.options[1].primaryPokemon;
if (primaryPokemon) { if (primaryPokemon) {
// Use primaryPokemon to execute the thievery // Use primaryPokemon to execute the thievery
encounter.options[1].dialogue.buttonTooltip = `${namespace}_option_2_steal_tooltip`; encounter.options[1].dialogue.buttonTooltip = `${namespace}:option:2:tooltip_special`;
} else { } else {
encounter.options[1].dialogue.buttonTooltip = `${namespace}_option_2_tooltip`; encounter.options[1].dialogue.buttonTooltip = `${namespace}:option:2:tooltip`;
} }
return true; return true;
}) })
.withTitle(`${namespace}_title`) .withTitle(`${namespace}:title`)
.withDescription(`${namespace}_description`) .withDescription(`${namespace}:description`)
.withQuery(`${namespace}_query`) .withQuery(`${namespace}:query`)
.withSimpleOption( .withSimpleOption(
{ {
buttonLabel: `${namespace}_option_1_label`, buttonLabel: `${namespace}:option:1:label`,
buttonTooltip: `${namespace}_option_1_tooltip`, buttonTooltip: `${namespace}:option:1:tooltip`,
selected: [ selected: [
{ {
text: `${namespace}_option_1_selected_message`, text: `${namespace}:option:1:selected`,
}, },
], ],
}, },
@ -135,8 +135,8 @@ export const FightOrFlightEncounter: IMysteryEncounter =
.withOptionMode(EncounterOptionMode.DEFAULT_OR_SPECIAL) .withOptionMode(EncounterOptionMode.DEFAULT_OR_SPECIAL)
.withPrimaryPokemonRequirement(new MoveRequirement(STEALING_MOVES)) // Will set option2PrimaryName and option2PrimaryMove dialogue tokens automatically .withPrimaryPokemonRequirement(new MoveRequirement(STEALING_MOVES)) // Will set option2PrimaryName and option2PrimaryMove dialogue tokens automatically
.withDialogue({ .withDialogue({
buttonLabel: `${namespace}_option_2_label`, buttonLabel: `${namespace}:option:2:label`,
buttonTooltip: `${namespace}_option_2_tooltip`, buttonTooltip: `${namespace}:option:2:tooltip`,
}) })
.withOptionPhase(async (scene: BattleScene) => { .withOptionPhase(async (scene: BattleScene) => {
// Pick steal // Pick steal
@ -148,7 +148,7 @@ export const FightOrFlightEncounter: IMysteryEncounter =
const primaryPokemon = encounter.options[1].primaryPokemon; const primaryPokemon = encounter.options[1].primaryPokemon;
if (primaryPokemon) { if (primaryPokemon) {
// Use primaryPokemon to execute the thievery // Use primaryPokemon to execute the thievery
await showEncounterText(scene, `${namespace}_option_2_steal_result`); await showEncounterText(scene, `${namespace}:option:2:steal_result`);
leaveEncounterWithoutBattle(scene); leaveEncounterWithoutBattle(scene);
return; return;
} }
@ -160,15 +160,15 @@ export const FightOrFlightEncounter: IMysteryEncounter =
config.pokemonConfigs[0].tags = [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON]; config.pokemonConfigs[0].tags = [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON];
config.pokemonConfigs[0].mysteryEncounterBattleEffects = (pokemon: Pokemon) => { config.pokemonConfigs[0].mysteryEncounterBattleEffects = (pokemon: Pokemon) => {
pokemon.scene.currentBattle.mysteryEncounter.setDialogueToken("enemyPokemon", pokemon.name); pokemon.scene.currentBattle.mysteryEncounter.setDialogueToken("enemyPokemon", pokemon.name);
queueEncounterMessage(pokemon.scene, `${namespace}_boss_enraged`); queueEncounterMessage(pokemon.scene, `${namespace}:boss_enraged`);
pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD], 1)); pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD], 1));
}; };
await showEncounterText(scene, `${namespace}_option_2_bad_result`); await showEncounterText(scene, `${namespace}:option:2:bad_result`);
await initBattleWithEnemyConfig(scene, config); await initBattleWithEnemyConfig(scene, config);
} else { } else {
// Steal item (37.5%) // Steal item (37.5%)
// Display result message then proceed to rewards // Display result message then proceed to rewards
await showEncounterText(scene, `${namespace}_option_2_good_result`); await showEncounterText(scene, `${namespace}:option:2:good_result`);
leaveEncounterWithoutBattle(scene); leaveEncounterWithoutBattle(scene);
} }
}) })
@ -176,11 +176,11 @@ export const FightOrFlightEncounter: IMysteryEncounter =
) )
.withSimpleOption( .withSimpleOption(
{ {
buttonLabel: `${namespace}_option_3_label`, buttonLabel: `${namespace}:option:3:label`,
buttonTooltip: `${namespace}_option_3_tooltip`, buttonTooltip: `${namespace}:option:3:tooltip`,
selected: [ selected: [
{ {
text: `${namespace}_option_3_selected`, text: `${namespace}:option:3:selected`,
}, },
], ],
}, },

View File

@ -16,7 +16,7 @@ const OPTION_2_REQUIRED_MOVE = Moves.FLY;
*/ */
const DAMAGE_PERCENTAGE: number = 25; const DAMAGE_PERCENTAGE: number = 25;
/** The i18n namespace for the encounter */ /** The i18n namespace for the encounter */
const namepsace = "mysteryEncounter:lostAtSeaDialogue"; const namespace = "mysteryEncounter:lostAtSea";
/** /**
* Lost at sea encounter. * Lost at sea encounter.
@ -35,7 +35,7 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with
y: 3, y: 3,
}, },
]) ])
.withIntroDialogue([{ text: `${namepsace}:intro` }]) .withIntroDialogue([{ text: `${namespace}:intro` }])
.withOnInit((scene: BattleScene) => { .withOnInit((scene: BattleScene) => {
const { mysteryEncounter } = scene.currentBattle; const { mysteryEncounter } = scene.currentBattle;
@ -45,22 +45,22 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with
return true; return true;
}) })
.withTitle(`${namepsace}:title`) .withTitle(`${namespace}:title`)
.withDescription(`${namepsace}:description`) .withDescription(`${namespace}:description`)
.withQuery(`${namepsace}:query`) .withQuery(`${namespace}:query`)
.withOption( .withOption(
// Option 1: Use a (non fainted) pokemon that can learn Surf to guide you back/ // Option 1: Use a (non fainted) pokemon that can learn Surf to guide you back/
new MysteryEncounterOptionBuilder() new MysteryEncounterOptionBuilder()
.withPokemonCanLearnMoveRequirement(OPTION_1_REQUIRED_MOVE) .withPokemonCanLearnMoveRequirement(OPTION_1_REQUIRED_MOVE)
.withOptionMode(EncounterOptionMode.DISABLED_OR_DEFAULT) .withOptionMode(EncounterOptionMode.DISABLED_OR_DEFAULT)
.withDialogue({ .withDialogue({
buttonLabel: `${namepsace}:option:1:label`, buttonLabel: `${namespace}:option:1:label`,
disabledButtonLabel: `${namepsace}:option:1:label_disabled`, disabledButtonLabel: `${namespace}:option:1:label_disabled`,
buttonTooltip: `${namepsace}:option:1:tooltip`, buttonTooltip: `${namespace}:option:1:tooltip`,
disabledButtonTooltip: `${namepsace}:option:1:tooltip_disabled`, disabledButtonTooltip: `${namespace}:option:1:tooltip_disabled`,
selected: [ selected: [
{ {
text: `${namepsace}:option:1:selected`, text: `${namespace}:option:1:selected`,
}, },
], ],
}) })
@ -73,13 +73,13 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with
.withPokemonCanLearnMoveRequirement(OPTION_2_REQUIRED_MOVE) .withPokemonCanLearnMoveRequirement(OPTION_2_REQUIRED_MOVE)
.withOptionMode(EncounterOptionMode.DISABLED_OR_DEFAULT) .withOptionMode(EncounterOptionMode.DISABLED_OR_DEFAULT)
.withDialogue({ .withDialogue({
buttonLabel: `${namepsace}:option:2:label`, buttonLabel: `${namespace}:option:2:label`,
disabledButtonLabel: `${namepsace}:option:2:label_disabled`, disabledButtonLabel: `${namespace}:option:2:label_disabled`,
buttonTooltip: `${namepsace}:option:2:tooltip`, buttonTooltip: `${namespace}:option:2:tooltip`,
disabledButtonTooltip: `${namepsace}:option:2:tooltip_disabled`, disabledButtonTooltip: `${namespace}:option:2:tooltip_disabled`,
selected: [ selected: [
{ {
text: `${namepsace}:option:2:selected`, text: `${namespace}:option:2:selected`,
}, },
], ],
}) })
@ -89,11 +89,11 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with
.withSimpleOption( .withSimpleOption(
// Option 3: Wander aimlessly // Option 3: Wander aimlessly
{ {
buttonLabel: `${namepsace}:option:3:label`, buttonLabel: `${namespace}:option:3:label`,
buttonTooltip: `${namepsace}:option:3:tooltip`, buttonTooltip: `${namespace}:option:3:tooltip`,
selected: [ selected: [
{ {
text: `${namepsace}:option:3:selected`, text: `${namespace}:option:3:selected`,
}, },
], ],
}, },
@ -113,7 +113,7 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with
) )
.withOutroDialogue([ .withOutroDialogue([
{ {
text: `${namepsace}:outro`, text: `${namespace}:outro`,
}, },
]) ])
.build(); .build();

View File

@ -99,7 +99,7 @@ export const MysteriousChallengersEncounter: IMysteryEncounter =
const brutalSpriteKey = brutalConfig.getSpriteKey(female, brutalConfig.doubleOnly); const brutalSpriteKey = brutalConfig.getSpriteKey(female, brutalConfig.doubleOnly);
encounter.enemyPartyConfigs.push({ encounter.enemyPartyConfigs.push({
trainerConfig: brutalConfig, trainerConfig: brutalConfig,
levelAdditiveMultiplier: 1.1, levelAdditiveMultiplier: 1,
female: female, female: female,
}); });

View File

@ -9,7 +9,7 @@ import IMysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier, } fro
import { EncounterOptionMode, MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; import { EncounterOptionMode, MysteryEncounterOptionBuilder } from "../mystery-encounter-option";
/** i18n namespace for encounter */ /** i18n namespace for encounter */
const namespace = "mysteryEncounter:dark_deal"; const namespace = "mysteryEncounter:mysteriousChest";
/** /**
* Mysterious Chest encounter. * Mysterious Chest encounter.

View File

@ -1,17 +1,19 @@
import { STEALING_MOVES } from "#app/data/mystery-encounters/requirements/requirement-groups"; import { STEALING_MOVES } from "#app/data/mystery-encounters/requirements/requirement-groups";
import { modifierTypes } from "#app/modifier/modifier-type"; import { modifierTypes } from "#app/modifier/modifier-type";
import { BerryType } from "#enums/berry-type";
import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type";
import { Species } from "#enums/species"; import { Species } from "#enums/species";
import BattleScene from "../../../battle-scene"; import BattleScene from "#app/battle-scene";
import * as Utils from "../../../utils"; import { StatusEffect } from "#app/data/status-effect";
import { getPokemonSpecies } from "../../pokemon-species";
import { Status, StatusEffect } from "../../status-effect";
import IMysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier, } from "../mystery-encounter"; import IMysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier, } from "../mystery-encounter";
import { EncounterOptionMode, MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; import { EncounterOptionMode, MysteryEncounterOptionBuilder } from "../mystery-encounter-option";
import { MoveRequirement } from "../mystery-encounter-requirements"; import { MoveRequirement } from "../mystery-encounter-requirements";
import { EnemyPartyConfig, EnemyPokemonConfig, generateModifierTypeOption, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, setEncounterExp, setEncounterRewards, } from "../utils/encounter-phase-utils"; import { EnemyPartyConfig, EnemyPokemonConfig, initBattleWithEnemyConfig, initCustomMovesForEncounter, leaveEncounterWithoutBattle, setEncounterExp, setEncounterRewards, } from "../utils/encounter-phase-utils";
import { queueEncounterMessage } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import { queueEncounterMessage } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils";
import { Moves } from "#enums/moves";
import { BattlerIndex } from "#app/battle";
import { PokemonMove } from "#app/field/pokemon";
import { getPokemonSpecies } from "#app/data/pokemon-species";
import { PartyHealPhase } from "#app/phases";
/** i18n namespace for the encounter */ /** i18n namespace for the encounter */
const namespace = "mysteryEncounter:sleeping_snorlax"; const namespace = "mysteryEncounter:sleeping_snorlax";
@ -54,13 +56,18 @@ export const SleepingSnorlaxEncounter: IMysteryEncounter =
const pokemonConfig: EnemyPokemonConfig = { const pokemonConfig: EnemyPokemonConfig = {
species: bossSpecies, species: bossSpecies,
isBoss: true, isBoss: true,
status: StatusEffect.SLEEP, status: [StatusEffect.SLEEP, 5], // Extra turns on timer for Snorlax's start of fight moves
moveSet: [Moves.REST, Moves.SLEEP_TALK, Moves.CRUNCH, Moves.GIGA_IMPACT]
}; };
const config: EnemyPartyConfig = { const config: EnemyPartyConfig = {
levelAdditiveMultiplier: 2, levelAdditiveMultiplier: 0.5,
pokemonConfigs: [pokemonConfig], pokemonConfigs: [pokemonConfig],
}; };
encounter.enemyPartyConfigs = [config]; encounter.enemyPartyConfigs = [config];
// Load animations/sfx for Snorlax fight start moves
initCustomMovesForEncounter(scene, [Moves.SNORE]);
return true; return true;
}) })
.withTitle(`${namespace}_title`) .withTitle(`${namespace}_title`)
@ -78,12 +85,22 @@ export const SleepingSnorlaxEncounter: IMysteryEncounter =
}, },
async (scene: BattleScene) => { async (scene: BattleScene) => {
// Pick battle // Pick battle
// TODO: do we want special rewards for this? const encounter = scene.currentBattle.mysteryEncounter;
// setCustomEncounterRewards(scene, { guaranteedModifierTypeFuncs: [modifierTypes.LEFTOVERS], fillRemaining: true}); setEncounterRewards(scene, { guaranteedModifierTypeFuncs: [modifierTypes.LEFTOVERS], fillRemaining: true});
await initBattleWithEnemyConfig( encounter.startOfBattleEffects.push(
scene, {
scene.currentBattle.mysteryEncounter.enemyPartyConfigs[0] sourceBattlerIndex: BattlerIndex.ENEMY,
); targets: [BattlerIndex.PLAYER],
move: new PokemonMove(Moves.SNORE),
ignorePp: true
},
{
sourceBattlerIndex: BattlerIndex.ENEMY,
targets: [BattlerIndex.PLAYER],
move: new PokemonMove(Moves.SNORE),
ignorePp: true
});
await initBattleWithEnemyConfig(scene, encounter.enemyPartyConfigs[0]);
} }
) )
.withSimpleOption( .withSimpleOption(
@ -97,46 +114,11 @@ export const SleepingSnorlaxEncounter: IMysteryEncounter =
], ],
}, },
async (scene: BattleScene) => { async (scene: BattleScene) => {
const instance = scene.currentBattle.mysteryEncounter; // Fall asleep waiting for Snorlax
let roll: integer; // Full heal party
scene.executeWithSeedOffset(() => { scene.unshiftPhase(new PartyHealPhase(scene, true));
roll = Utils.randSeedInt(16, 0); queueEncounterMessage(scene, `${namespace}_option_2_good_result`);
}, scene.currentBattle.waveIndex); leaveEncounterWithoutBattle(scene);
// Half Snorlax exp to entire party
setEncounterExp(
scene,
scene.getParty().map((p) => p.id),
98
);
if (roll > 4) {
// Fall asleep and get a sitrus berry (75%)
const p = instance.primaryPokemon;
p.status = new Status(StatusEffect.SLEEP, 0, 3);
p.updateInfo(true);
const sitrus = generateModifierTypeOption(scene, modifierTypes.BERRY, [BerryType.SITRUS]);
setEncounterRewards(scene, {
guaranteedModifierTypeOptions: [sitrus],
fillRemaining: false,
});
queueEncounterMessage(scene, `${namespace}_option_2_bad_result`);
leaveEncounterWithoutBattle(scene);
} else {
// Heal to full (25%)
for (const pokemon of scene.getParty()) {
pokemon.hp = pokemon.getMaxHp();
pokemon.resetStatus();
for (const move of pokemon.moveset) {
move.ppUsed = 0;
}
pokemon.updateInfo(true);
}
queueEncounterMessage(scene, `${namespace}_option_2_good_result`);
leaveEncounterWithoutBattle(scene);
}
} }
) )
.withOption( .withOption(
@ -151,13 +133,10 @@ export const SleepingSnorlaxEncounter: IMysteryEncounter =
.withOptionPhase(async (scene: BattleScene) => { .withOptionPhase(async (scene: BattleScene) => {
// Steal the Snorlax's Leftovers // Steal the Snorlax's Leftovers
const instance = scene.currentBattle.mysteryEncounter; const instance = scene.currentBattle.mysteryEncounter;
setEncounterRewards(scene, { setEncounterRewards(scene, { guaranteedModifierTypeFuncs: [modifierTypes.LEFTOVERS], fillRemaining: false });
guaranteedModifierTypeFuncs: [modifierTypes.LEFTOVERS],
fillRemaining: false,
});
queueEncounterMessage(scene, `${namespace}_option_3_good_result`); queueEncounterMessage(scene, `${namespace}_option_3_good_result`);
// Snorlax exp to Pokemon that did the stealing // Snorlax exp to Pokemon that did the stealing
setEncounterExp(scene, [instance.primaryPokemon.id], 189); setEncounterExp(scene, instance.primaryPokemon.id, getPokemonSpecies(Species.SNORLAX).baseExp);
leaveEncounterWithoutBattle(scene); leaveEncounterWithoutBattle(scene);
}) })
.build() .build()

View File

@ -43,8 +43,8 @@ export interface StartOfBattleEffect {
sourceBattlerIndex?: BattlerIndex; sourceBattlerIndex?: BattlerIndex;
targets: BattlerIndex[]; targets: BattlerIndex[];
move: PokemonMove; move: PokemonMove;
ignorePp: boolean;
followUp?: boolean; followUp?: boolean;
ignorePp?: boolean;
} }
export default interface IMysteryEncounter { export default interface IMysteryEncounter {

View File

@ -158,14 +158,15 @@ const anyBiomeEncounters: MysteryEncounterType[] = [
*/ */
export const mysteryEncountersByBiome = new Map<Biome, MysteryEncounterType[]>([ export const mysteryEncountersByBiome = new Map<Biome, MysteryEncounterType[]>([
[Biome.TOWN, []], [Biome.TOWN, []],
[Biome.PLAINS, []], [Biome.PLAINS, [
MysteryEncounterType.SLEEPING_SNORLAX
]],
[Biome.GRASS, [ [Biome.GRASS, [
MysteryEncounterType.SLEEPING_SNORLAX, MysteryEncounterType.SLEEPING_SNORLAX,
]], ]],
[Biome.TALL_GRASS, []], [Biome.TALL_GRASS, []],
[Biome.METROPOLIS, []], [Biome.METROPOLIS, []],
[Biome.FOREST, [ [Biome.FOREST, [
MysteryEncounterType.SLEEPING_SNORLAX,
MysteryEncounterType.SAFARI_ZONE MysteryEncounterType.SAFARI_ZONE
]], ]],
@ -178,13 +179,9 @@ export const mysteryEncountersByBiome = new Map<Biome, MysteryEncounterType[]>([
[Biome.BEACH, []], [Biome.BEACH, []],
[Biome.LAKE, []], [Biome.LAKE, []],
[Biome.SEABED, []], [Biome.SEABED, []],
[Biome.MOUNTAIN, [ [Biome.MOUNTAIN, []],
MysteryEncounterType.SLEEPING_SNORLAX
]],
[Biome.BADLANDS, []], [Biome.BADLANDS, []],
[Biome.CAVE, [ [Biome.CAVE, []],
MysteryEncounterType.SLEEPING_SNORLAX
]],
[Biome.DESERT, []], [Biome.DESERT, []],
[Biome.ICE_CAVE, []], [Biome.ICE_CAVE, []],
[Biome.MEADOW, []], [Biome.MEADOW, []],

View File

@ -3,13 +3,13 @@ import { biomeLinks } from "#app/data/biomes";
import MysteryEncounterOption from "#app/data/mystery-encounters/mystery-encounter-option"; import MysteryEncounterOption from "#app/data/mystery-encounters/mystery-encounter-option";
import { WIGHT_INCREMENT_ON_SPAWN_MISS } from "#app/data/mystery-encounters/mystery-encounters"; import { WIGHT_INCREMENT_ON_SPAWN_MISS } from "#app/data/mystery-encounters/mystery-encounters";
import { queueEncounterMessage, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import { queueEncounterMessage, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils";
import Pokemon, { FieldPosition, PlayerPokemon } from "#app/field/pokemon"; import Pokemon, { FieldPosition, PlayerPokemon, PokemonMove } from "#app/field/pokemon";
import { getPokemonNameWithAffix } from "#app/messages"; import { getPokemonNameWithAffix } from "#app/messages";
import { ExpBalanceModifier, ExpShareModifier, MultipleParticipantExpBonusModifier, PokemonExpBoosterModifier } from "#app/modifier/modifier"; import { ExpBalanceModifier, ExpShareModifier, MultipleParticipantExpBonusModifier, PokemonExpBoosterModifier } from "#app/modifier/modifier";
import { CustomModifierSettings, getModifierPoolForType, ModifierPoolType, ModifierType, ModifierTypeFunc, ModifierTypeGenerator, ModifierTypeOption, modifierTypes, PokemonHeldItemModifierType, regenerateModifierPoolThresholds } from "#app/modifier/modifier-type"; import { CustomModifierSettings, getModifierPoolForType, ModifierPoolType, ModifierType, ModifierTypeFunc, ModifierTypeGenerator, ModifierTypeOption, modifierTypes, PokemonHeldItemModifierType, regenerateModifierPoolThresholds } from "#app/modifier/modifier-type";
import * as Overrides from "#app/overrides"; import * as Overrides from "#app/overrides";
import { BattleEndPhase, EggLapsePhase, ExpPhase, GameOverPhase, ModifierRewardPhase, MovePhase, SelectModifierPhase, ShowPartyExpBarPhase, TrainerVictoryPhase } from "#app/phases"; import { BattleEndPhase, EggLapsePhase, ExpPhase, GameOverPhase, ModifierRewardPhase, MovePhase, SelectModifierPhase, ShowPartyExpBarPhase, TrainerVictoryPhase } from "#app/phases";
import { MysteryEncounterBattlePhase, MysteryEncounterPhase, MysteryEncounterRewardsPhase } from "#app/phases/mystery-encounter-phase"; import { MysteryEncounterBattlePhase, MysteryEncounterBattleStartCleanupPhase, MysteryEncounterPhase, MysteryEncounterRewardsPhase } from "#app/phases/mystery-encounter-phases";
import PokemonData from "#app/system/pokemon-data"; import PokemonData from "#app/system/pokemon-data";
import { OptionSelectConfig, OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; import { OptionSelectConfig, OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler";
import { PartyOption, PartyUiMode } from "#app/ui/party-ui-handler"; import { PartyOption, PartyUiMode } from "#app/ui/party-ui-handler";
@ -30,25 +30,27 @@ import { Gender } from "#app/data/gender";
import { Moves } from "#enums/moves"; import { Moves } from "#enums/moves";
import { initMoveAnim, loadMoveAnimAssets } from "#app/data/battle-anims"; import { initMoveAnim, loadMoveAnimAssets } from "#app/data/battle-anims";
export class EnemyPokemonConfig { export interface EnemyPokemonConfig {
species: PokemonSpecies; species: PokemonSpecies;
isBoss: boolean = false; isBoss: boolean;
bossSegments?: number; bossSegments?: number;
bossSegmentModifier?: number; // Additive to the determined segment number bossSegmentModifier?: number; // Additive to the determined segment number
formIndex?: number; formIndex?: number;
level?: number; level?: number;
gender?: Gender; gender?: Gender;
modifierTypes?: PokemonHeldItemModifierType[];
dataSource?: PokemonData;
tags?: BattlerTagType[];
mysteryEncounterBattleEffects?: (pokemon: Pokemon) => void;
status?: StatusEffect;
passive?: boolean; passive?: boolean;
moveSet?: Moves[];
/** Can set just the status, or pass a timer on the status turns */
status?: StatusEffect | [StatusEffect, number];
mysteryEncounterBattleEffects?: (pokemon: Pokemon) => void;
modifierTypes?: PokemonHeldItemModifierType[];
tags?: BattlerTagType[];
dataSource?: PokemonData;
} }
export class EnemyPartyConfig { export interface EnemyPartyConfig {
levelAdditiveMultiplier?: number = 0; // Formula for enemy: level += waveIndex / 10 * levelAdditive levelAdditiveMultiplier?: number; // Formula for enemy: level += waveIndex / 10 * levelAdditive
doubleBattle?: boolean = false; doubleBattle?: boolean;
trainerType?: TrainerType; // Generates trainer battle solely off trainer type trainerType?: TrainerType; // Generates trainer battle solely off trainer type
trainerConfig?: TrainerConfig; // More customizable option for configuring trainer battle trainerConfig?: TrainerConfig; // More customizable option for configuring trainer battle
pokemonConfigs?: EnemyPokemonConfig[]; pokemonConfigs?: EnemyPokemonConfig[];
@ -167,11 +169,6 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig:
enemyPokemon.formIndex = config.formIndex; enemyPokemon.formIndex = config.formIndex;
} }
// Set gender
if (!isNullOrUndefined(config.gender)) {
enemyPokemon.gender = config.gender;
}
// Set Boss // Set Boss
if (config.isBoss) { if (config.isBoss) {
let segments = !isNullOrUndefined(config.bossSegments) ? config.bossSegments : scene.getEncounterBossSegments(scene.currentBattle.waveIndex, level, enemySpecies, true); let segments = !isNullOrUndefined(config.bossSegments) ? config.bossSegments : scene.getEncounterBossSegments(scene.currentBattle.waveIndex, level, enemySpecies, true);
@ -189,21 +186,40 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig:
// Set Status // Set Status
if (partyConfig.pokemonConfigs[e].status) { if (partyConfig.pokemonConfigs[e].status) {
// Default to cureturn 3 for sleep // Default to cureturn 3 for sleep
const cureTurn = partyConfig.pokemonConfigs[e].status === StatusEffect.SLEEP ? 3 : null; const status = partyConfig.pokemonConfigs[e].status instanceof Array ? partyConfig.pokemonConfigs[e].status[0] : partyConfig.pokemonConfigs[e].status;
enemyPokemon.status = new Status(partyConfig.pokemonConfigs[e].status, 0, cureTurn); const cureTurn = partyConfig.pokemonConfigs[e].status instanceof Array ? partyConfig.pokemonConfigs[e].status[1] : partyConfig.pokemonConfigs[e].status === StatusEffect.SLEEP ? 3 : null;
enemyPokemon.status = new Status(status, 0, cureTurn);
}
// Set summon data fields
// Set gender
if (!isNullOrUndefined(config.gender)) {
enemyPokemon.gender = config.gender;
enemyPokemon.summonData.gender = config.gender;
}
// Set moves
if (config?.moveSet?.length > 0) {
const moves = config.moveSet.map(m => new PokemonMove(m));
enemyPokemon.moveset = moves;
enemyPokemon.summonData.moveset = moves;
} }
// Set tags // Set tags
if (config.tags?.length > 0) { if (config.tags?.length > 0) {
const tags = config.tags; const tags = config.tags;
tags.forEach(tag => enemyPokemon.addTag(tag)); tags.forEach(tag => enemyPokemon.addTag(tag));
// mysteryEncounterBattleEffects can be used IFF MYSTERY_ENCOUNTER_POST_SUMMON tag is applied
enemyPokemon.summonData.mysteryEncounterBattleEffects = config.mysteryEncounterBattleEffects;
// Requires re-priming summon data so that tags are not cleared on SummonPhase
enemyPokemon.primeSummonData(enemyPokemon.summonData);
} }
// mysteryEncounterBattleEffects will only be used IFF MYSTERY_ENCOUNTER_POST_SUMMON tag is applied
if (config.mysteryEncounterBattleEffects) {
enemyPokemon.mysteryEncounterBattleEffects = config.mysteryEncounterBattleEffects;
}
// Requires re-priming summon data to update everything properly
enemyPokemon.primeSummonData(enemyPokemon.summonData);
enemyPokemon.initBattleInfo(); enemyPokemon.initBattleInfo();
enemyPokemon.getBattleInfo().initInfo(enemyPokemon); enemyPokemon.getBattleInfo().initInfo(enemyPokemon);
} }
@ -626,6 +642,9 @@ export function handleEncounterStartOfBattleEffects(scene: BattleScene) {
scene.pushPhase(new MovePhase(scene, source, effect.targets, effect.move, effect.followUp, effect.followUp)); scene.pushPhase(new MovePhase(scene, source, effect.targets, effect.move, effect.followUp, effect.followUp));
}); });
// Pseudo turn end phase to reset flinch states, Endure, etc.
scene.pushPhase(new MysteryEncounterBattleStartCleanupPhase(scene));
encounter.startOfBattleEffectsComplete = true; encounter.startOfBattleEffectsComplete = true;
} }
} }

View File

@ -101,6 +101,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
public battleSummonData: PokemonBattleSummonData; public battleSummonData: PokemonBattleSummonData;
public turnData: PokemonTurnData; public turnData: PokemonTurnData;
public mysteryEncounterBattleEffects: (pokemon: Pokemon) => void = null;
public fieldPosition: FieldPosition; public fieldPosition: FieldPosition;
public maskEnabled: boolean; public maskEnabled: boolean;
@ -3931,7 +3933,6 @@ export class PokemonSummonData {
public moveset: PokemonMove[]; public moveset: PokemonMove[];
// If not initialized this value will not be populated from save data. // If not initialized this value will not be populated from save data.
public types: Type[] = null; public types: Type[] = null;
public mysteryEncounterBattleEffects: (pokemon: Pokemon) => void = null;
} }
export class PokemonBattleData { export class PokemonBattleData {

View File

@ -1,4 +1,15 @@
import { lostAtSeaDialogue } from "./mystery-encounters/lost-at-sea-dialogue"; import { lostAtSeaDialogue } from "./mystery-encounters/lost-at-sea-dialogue";
import { mysteriousChestDialogue } from "#app/locales/en/mystery-encounters/mysterious-chest-dialogue";
import { mysteriousChallengersDialogue } from "#app/locales/en/mystery-encounters/mysterious-challengers-dialogue";
import { darkDealDialogue } from "#app/locales/en/mystery-encounters/dark-deal-dialogue";
import { departmentStoreSaleDialogue } from "#app/locales/en/mystery-encounters/department-store-sale-dialogue";
import { fieldTripDialogue } from "#app/locales/en/mystery-encounters/field-trip-dialogue";
import { fieryFalloutDialogue } from "#app/locales/en/mystery-encounters/fiery-fallout-dialogue";
import { fightOrFlightDialogue } from "#app/locales/en/mystery-encounters/fight-or-flight-dialogue";
import { safariZoneDialogue } from "#app/locales/en/mystery-encounters/safari-zone-dialogue";
import { shadyVitaminDealerDialogue } from "#app/locales/en/mystery-encounters/shady-vitamin-dealer-dialogue";
import { sleepingSnorlaxDialogue } from "#app/locales/en/mystery-encounters/sleeping-snorlax-dialogue";
import { trainingSessionDialogue } from "#app/locales/en/mystery-encounters/training-session-dialogue";
/** /**
* Patterns that can be used: * Patterns that can be used:
@ -21,47 +32,6 @@ export const mysteryEncounter = {
"paid_money": "You paid ₽{{amount, number}}.", "paid_money": "You paid ₽{{amount, number}}.",
"receive_money": "You received ₽{{amount, number}}!", "receive_money": "You received ₽{{amount, number}}!",
// Mystery Encounters -- Common Tier
"mysterious_chest_intro_message": "You found...@d{32} a chest?",
"mysterious_chest_title": "The Mysterious Chest",
"mysterious_chest_description": "A beautifully ornamented chest stands on the ground. There must be something good inside... right?",
"mysterious_chest_query": "Will you open it?",
"mysterious_chest_option_1_label": "Open it",
"mysterious_chest_option_1_tooltip": "@[SUMMARY_BLUE]{(35%) Something terrible}\n@[SUMMARY_GREEN]{(40%) Okay Rewards}\n@[SUMMARY_GREEN]{(20%) Good Rewards}\n@[SUMMARY_GREEN]{(4%) Great Rewards}\n@[SUMMARY_GREEN]{(1%) Amazing Rewards}",
"mysterious_chest_option_2_label": "It's too risky, leave",
"mysterious_chest_option_2_tooltip": "(-) No Rewards",
"mysterious_chest_option_1_selected_message": "You open the chest to find...",
"mysterious_chest_option_2_selected_message": "You hurry along your way,\nwith a slight feeling of regret.",
"mysterious_chest_option_1_normal_result": "Just some normal tools and items.",
"mysterious_chest_option_1_good_result": "Some pretty nice tools and items.",
"mysterious_chest_option_1_great_result": "A couple great tools and items!",
"mysterious_chest_option_1_amazing_result": "Whoa! An amazing item!",
"mysterious_chest_option_1_bad_result": `Oh no!@d{32}\nThe chest was trapped!
$Your {{pokeName}} jumps in front of you\nbut is KOed in the process.`,
"fight_or_flight_intro_message": "Something shiny is sparkling\non the ground near that Pokémon!",
"fight_or_flight_title": "Fight or Flight",
"fight_or_flight_description": "It looks like there's a strong Pokémon guarding an item. Battling is the straightforward approach, but this Pokémon looks strong. You could also try to sneak around, though the Pokémon might catch you.",
"fight_or_flight_query": "What will you do?",
"fight_or_flight_option_1_label": "Battle the Pokémon",
"fight_or_flight_option_1_tooltip": "(-) Hard Battle\n(+) New Item",
"fight_or_flight_option_2_label": "Steal the item",
"fight_or_flight_option_2_tooltip": "@[SUMMARY_GREEN]{(35%) Steal Item}\n@[SUMMARY_BLUE]{(65%) Harder Battle}",
"fight_or_flight_option_2_steal_tooltip": "(+) {{option2PrimaryName}} uses {{option2PrimaryMove}}",
"fight_or_flight_option_3_label": "Leave",
"fight_or_flight_option_3_tooltip": "(-) No Rewards",
"fight_or_flight_option_1_selected_message": "You approach the\nPokémon without fear.",
"fight_or_flight_option_2_good_result": `.@d{32}.@d{32}.@d{32}
$You manage to sneak your way\npast and grab the item!`,
"fight_or_flight_option_2_steal_result": `.@d{32}.@d{32}.@d{32}
$Your {{option2PrimaryName}} helps you out and uses {{option2PrimaryMove}}!
$ You nabbed the item!`,
"fight_or_flight_option_2_bad_result": `.@d{32}.@d{32}.@d{32}
$The Pokémon catches you\nas you try to sneak around!`,
"fight_or_flight_boss_enraged": "The opposing {{enemyPokemon}} has become enraged!",
"fight_or_flight_option_3_selected": "You leave the strong Pokémon\nwith its prize and continue on.",
"department_store_sale_intro_message": "It's a lady with a ton of shopping bags.", "department_store_sale_intro_message": "It's a lady with a ton of shopping bags.",
"department_store_sale_speaker": "Shopper", "department_store_sale_speaker": "Shopper",
"department_store_sale_intro_dialogue": `Hello! Are you here for\nthe amazing sales too? "department_store_sale_intro_dialogue": `Hello! Are you here for\nthe amazing sales too?
@ -217,28 +187,6 @@ export const mysteryEncounter = {
// Mystery Encounters -- Rogue Tier // Mystery Encounters -- Rogue Tier
"dark_deal_intro_message": "A strange man in a tattered coat\nstands in your way...",
"dark_deal_speaker": "Shady Guy",
"dark_deal_intro_dialogue": `Hey, you!
$I've been working on a new device\nto bring out a Pokémon's latent power!
$It completely rebinds the Pokémon's atoms\nat a molecular level into a far more powerful form.
$Hehe...@d{64} I just need some sac-@d{32}\nErr, test subjects, to prove it works.`,
"dark_deal_title": "Dark Deal",
"dark_deal_description": "The disturbing fellow holds up some Pokéballs.\n\"I'll make it worth your while! You can have these strong Pokéballs as payment, All I need is a Pokémon from your team! Hehe...\"",
"dark_deal_query": "What will you do?",
"dark_deal_option_1_label": "Accept",
"dark_deal_option_1_tooltip": "(+) 5 Rogue Balls\n(?) Enhance a Random Pokémon",
"dark_deal_option_2_label": "Refuse",
"dark_deal_option_2_tooltip": "(-) No Rewards",
"dark_deal_option_1_selected": `Let's see, that {{pokeName}} will do nicely!
$Remember, I'm not responsible\nif anything bad happens!@d{32} Hehe...`,
"dark_deal_option_1_selected_message": `The man hands you 5 Rogue Balls.
\${{pokeName}} hops into the strange machine...
$Flashing lights and weird noises\nstart coming from the machine!
$...@d{96} Something emerges\nfrom the device, raging wildly!`,
"dark_deal_option_2_selected": "Not gonna help a poor fellow out?\nPah!",
"dark_deal_outro": "After the harrowing encounter,\nyou collect yourself and depart.",
"sleeping_snorlax_intro_message": `As you walk down a narrow pathway, you see a towering silhouette blocking your path. "sleeping_snorlax_intro_message": `As you walk down a narrow pathway, you see a towering silhouette blocking your path.
$You get closer to see a Snorlax sleeping peacefully.\nIt seems like there's no way around it.`, $You get closer to see a Snorlax sleeping peacefully.\nIt seems like there's no way around it.`,
"sleeping_snorlax_title": "Sleeping Snorlax", "sleeping_snorlax_title": "Sleeping Snorlax",
@ -253,12 +201,20 @@ export const mysteryEncounter = {
"sleeping_snorlax_option_3_disabled_tooltip": "Your Pokémon need to know certain moves to choose this", "sleeping_snorlax_option_3_disabled_tooltip": "Your Pokémon need to know certain moves to choose this",
"sleeping_snorlax_option_1_selected_message": "You approach the\nPokémon without fear.", "sleeping_snorlax_option_1_selected_message": "You approach the\nPokémon without fear.",
"sleeping_snorlax_option_2_selected_message": `.@d{32}.@d{32}.@d{32} "sleeping_snorlax_option_2_selected_message": `.@d{32}.@d{32}.@d{32}
$You wait for a time, but the Snorlax's yawns make your party sleepy.`, $You wait for a time, but the Snorlax's yawns make your party sleepy...`,
"sleeping_snorlax_option_2_good_result": "When you all awaken, the Snorlax is no where to be found - but your Pokémon are all healed!", "sleeping_snorlax_option_2_good_result": "When you all awaken, the Snorlax is no where to be found -\nbut your Pokémon are all healed!",
"sleeping_snorlax_option_2_bad_result": `Your {{primaryName}} is still asleep...
$But on the bright side, the Snorlax left something behind...
$@s{item_fanfare}You gained a Berry!`,
"sleeping_snorlax_option_3_good_result": "Your {{option3PrimaryName}} uses {{option3PrimaryMove}}! @s{item_fanfare}It steals Leftovers off the sleeping Snorlax and you make out like bandits!", "sleeping_snorlax_option_3_good_result": "Your {{option3PrimaryName}} uses {{option3PrimaryMove}}! @s{item_fanfare}It steals Leftovers off the sleeping Snorlax and you make out like bandits!",
mysteriousChallengers: mysteriousChallengersDialogue,
mysteriousChest: mysteriousChestDialogue,
darkDeal: darkDealDialogue,
fightOrFlight: fightOrFlightDialogue,
sleepingSnorlax: sleepingSnorlaxDialogue,
trainingSession: trainingSessionDialogue,
departmentStoreSale: departmentStoreSaleDialogue,
shadyVitaminDealer: shadyVitaminDealerDialogue,
fieldTrip: fieldTripDialogue,
safariZone: safariZoneDialogue,
lostAtSea: lostAtSeaDialogue, lostAtSea: lostAtSeaDialogue,
fieryFallout: fieryFalloutDialogue,
} as const; } as const;

View File

@ -1,31 +1,29 @@
export const darkDealDialogue = { export const darkDealDialogue = {
intro: "Wandering aimlessly, you effectively get nowhere.", intro: "A strange man in a tattered coat\nstands in your way...",
title: "Lost at sea", speaker: "Shady Guy",
description: "The sea is turbulent in this area, and you seem to be running out of fuel.\nThis is bad. Is there a way out of the situation?", intro_dialogue: `Hey, you!
$I've been working on a new device\nto bring out a Pokémon's latent power!
$It completely rebinds the Pokémon's atoms\nat a molecular level into a far more powerful form.
$Hehe...@d{64} I just need some sac-@d{32}\nErr, test subjects, to prove it works.`,
title: "Dark Deal",
description: "The disturbing fellow holds up some Pokéballs.\n\"I'll make it worth your while! You can have these strong Pokéballs as payment, All I need is a Pokémon from your team! Hehe...\"",
query: "What will you do?", query: "What will you do?",
option: { option: {
1: { 1: {
label: "{{option1PrimaryName}} can help", label: "Accept",
label_disabled: "Can't {{option1RequiredMove}}", tooltip: "(+) 5 Rogue Balls\n(?) Enhance a Random Pokémon",
tooltip: "(+) {{option1PrimaryName}} saves you.\n(+) {{option1PrimaryName}} gains some EXP.", selected_dialogue: `Let's see, that {{pokeName}} will do nicely!
tooltip_disabled: "You have no Pokémon to {{option1RequiredMove}} on", $Remember, I'm not responsible\nif anything bad happens!@d{32} Hehe...`,
selected: selected_message: `The man hands you 5 Rogue Balls.
"{{option1PrimaryName}} swims ahead, guiding you back on track.\n{{option1PrimaryName}} seems to also have gotten stronger in this time of need.", \${{pokeName}} hops into the strange machine...
$Flashing lights and weird noises\nstart coming from the machine!
$...@d{96} Something emerges\nfrom the device, raging wildly!`
}, },
2: { 2: {
label: "{{option2PrimaryName}} can help", label: "Refuse",
label_disabled: "Can't {{option2RequiredMove}}", tooltip: "(-) No Rewards",
tooltip: "(+) {{option2PrimaryName}} saves you.\n(+) {{option2PrimaryName}} gains some EXP.", selected: "Not gonna help a poor fellow out?\nPah!",
tooltip_disabled: "You have no Pokémon to {{option2RequiredMove}} with", }
selected:
"{{option2PrimaryName}} flies ahead of your boat, guiding you back on track.\n{{option2PrimaryName}} seems to also have gotten stronger in this time of need.",
},
3: {
label: "Wander aimlessly",
tooltip: "(-) Each of your Pokémon lose {{damagePercentage}}% of their total HP.",
selected: `You float about in the boat, steering it aimlessly until you finally get back on track.
$You and your Pokémon get very fatigued during the whole ordeal.`,
},
}, },
outro: "You are back on track." outro: "After the harrowing encounter,\nyou collect yourself and depart."
}; };

View File

@ -1,30 +1,30 @@
export const departmentStoreSaleDialogue = { export const departmentStoreSaleDialogue = {
intro: "Wandering aimlessly, you effectively get nowhere.", intro: "Wandering aimlessly through the sea, you've effectively gotten nowhere.",
title: "Lost at sea", title: "Lost at Sea",
description: "The sea is turbulent in this area, and you seem to be running out of fuel.\nThis is bad. Is there a way out of the situation?", description: "The sea is turbulent in this area, and you're running out of energy.\nThis is bad. Is there a way out of the situation?",
query: "What will you do?", query: "What will you do?",
option: { option: {
1: { 1: {
label: "{{option1PrimaryName}} can help", label: "{{option1PrimaryName}} can help",
label_disabled: "Can't {{option1RequiredMove}}", label_disabled: "Can't {{option1RequiredMove}}",
tooltip: "(+) {{option1PrimaryName}} saves you.\n(+) {{option1PrimaryName}} gains some EXP.", tooltip: "(+) {{option1PrimaryName}} saves you\n(+) {{option1PrimaryName}} gains some EXP",
tooltip_disabled: "You have no Pokémon to {{option1RequiredMove}} on", tooltip_disabled: "You have no Pokémon to {{option1RequiredMove}} on",
selected: selected: `{{option1PrimaryName}} swims ahead, guiding you back on track.
"{{option1PrimaryName}} swims ahead, guiding you back on track.\n{{option1PrimaryName}} seems to also have gotten stronger in this time of need.", \${{option1PrimaryName}} seems to also have gotten stronger in this time of need!`,
}, },
2: { 2: {
label: "{{option2PrimaryName}} can help", label: "{{option2PrimaryName}} can help",
label_disabled: "Can't {{option2RequiredMove}}", label_disabled: "Can't {{option2RequiredMove}}",
tooltip: "(+) {{option2PrimaryName}} saves you.\n(+) {{option2PrimaryName}} gains some EXP.", tooltip: "(+) {{option2PrimaryName}} saves you\n(+) {{option2PrimaryName}} gains some EXP",
tooltip_disabled: "You have no Pokémon to {{option2RequiredMove}} with", tooltip_disabled: "You have no Pokémon to {{option2RequiredMove}} with",
selected: selected: `{{option2PrimaryName}} flies ahead of your boat, guiding you back on track.
"{{option2PrimaryName}} flies ahead of your boat, guiding you back on track.\n{{option2PrimaryName}} seems to also have gotten stronger in this time of need.", \${{option2PrimaryName}} seems to also have gotten stronger in this time of need!`,
}, },
3: { 3: {
label: "Wander aimlessly", label: "Wander aimlessly",
tooltip: "(-) Each of your Pokémon lose {{damagePercentage}}% of their total HP.", tooltip: "(-) Each of your Pokémon lose {{damagePercentage}}% of their total HP",
selected: `You float about in the boat, steering it aimlessly until you finally get back on track. selected: `You float about in the boat, steering without direction until you finally spot a landmark you remember.
$You and your Pokémon get very fatigued during the whole ordeal.`, $You and your Pokémon are fatigued from the whole ordeal.`,
}, },
}, },
outro: "You are back on track." outro: "You are back on track."

View File

@ -1,30 +1,30 @@
export const fieldTripDialogue = { export const fieldTripDialogue = {
intro: "Wandering aimlessly, you effectively get nowhere.", intro: "Wandering aimlessly through the sea, you've effectively gotten nowhere.",
title: "Lost at sea", title: "Lost at Sea",
description: "The sea is turbulent in this area, and you seem to be running out of fuel.\nThis is bad. Is there a way out of the situation?", description: "The sea is turbulent in this area, and you're running out of energy.\nThis is bad. Is there a way out of the situation?",
query: "What will you do?", query: "What will you do?",
option: { option: {
1: { 1: {
label: "{{option1PrimaryName}} can help", label: "{{option1PrimaryName}} can help",
label_disabled: "Can't {{option1RequiredMove}}", label_disabled: "Can't {{option1RequiredMove}}",
tooltip: "(+) {{option1PrimaryName}} saves you.\n(+) {{option1PrimaryName}} gains some EXP.", tooltip: "(+) {{option1PrimaryName}} saves you\n(+) {{option1PrimaryName}} gains some EXP",
tooltip_disabled: "You have no Pokémon to {{option1RequiredMove}} on", tooltip_disabled: "You have no Pokémon to {{option1RequiredMove}} on",
selected: selected: `{{option1PrimaryName}} swims ahead, guiding you back on track.
"{{option1PrimaryName}} swims ahead, guiding you back on track.\n{{option1PrimaryName}} seems to also have gotten stronger in this time of need.", \${{option1PrimaryName}} seems to also have gotten stronger in this time of need!`,
}, },
2: { 2: {
label: "{{option2PrimaryName}} can help", label: "{{option2PrimaryName}} can help",
label_disabled: "Can't {{option2RequiredMove}}", label_disabled: "Can't {{option2RequiredMove}}",
tooltip: "(+) {{option2PrimaryName}} saves you.\n(+) {{option2PrimaryName}} gains some EXP.", tooltip: "(+) {{option2PrimaryName}} saves you\n(+) {{option2PrimaryName}} gains some EXP",
tooltip_disabled: "You have no Pokémon to {{option2RequiredMove}} with", tooltip_disabled: "You have no Pokémon to {{option2RequiredMove}} with",
selected: selected: `{{option2PrimaryName}} flies ahead of your boat, guiding you back on track.
"{{option2PrimaryName}} flies ahead of your boat, guiding you back on track.\n{{option2PrimaryName}} seems to also have gotten stronger in this time of need.", \${{option2PrimaryName}} seems to also have gotten stronger in this time of need!`,
}, },
3: { 3: {
label: "Wander aimlessly", label: "Wander aimlessly",
tooltip: "(-) Each of your Pokémon lose {{damagePercentage}}% of their total HP.", tooltip: "(-) Each of your Pokémon lose {{damagePercentage}}% of their total HP",
selected: `You float about in the boat, steering it aimlessly until you finally get back on track. selected: `You float about in the boat, steering without direction until you finally spot a landmark you remember.
$You and your Pokémon get very fatigued during the whole ordeal.`, $You and your Pokémon are fatigued from the whole ordeal.`,
}, },
}, },
outro: "You are back on track." outro: "You are back on track."

View File

@ -1,30 +1,30 @@
export const fieryFalloutDialogue = { export const fieryFalloutDialogue = {
intro: "Wandering aimlessly, you effectively get nowhere.", intro: "Wandering aimlessly through the sea, you've effectively gotten nowhere.",
title: "Lost at sea", title: "Lost at Sea",
description: "The sea is turbulent in this area, and you seem to be running out of fuel.\nThis is bad. Is there a way out of the situation?", description: "The sea is turbulent in this area, and you're running out of energy.\nThis is bad. Is there a way out of the situation?",
query: "What will you do?", query: "What will you do?",
option: { option: {
1: { 1: {
label: "{{option1PrimaryName}} can help", label: "{{option1PrimaryName}} can help",
label_disabled: "Can't {{option1RequiredMove}}", label_disabled: "Can't {{option1RequiredMove}}",
tooltip: "(+) {{option1PrimaryName}} saves you.\n(+) {{option1PrimaryName}} gains some EXP.", tooltip: "(+) {{option1PrimaryName}} saves you\n(+) {{option1PrimaryName}} gains some EXP",
tooltip_disabled: "You have no Pokémon to {{option1RequiredMove}} on", tooltip_disabled: "You have no Pokémon to {{option1RequiredMove}} on",
selected: selected: `{{option1PrimaryName}} swims ahead, guiding you back on track.
"{{option1PrimaryName}} swims ahead, guiding you back on track.\n{{option1PrimaryName}} seems to also have gotten stronger in this time of need.", \${{option1PrimaryName}} seems to also have gotten stronger in this time of need!`,
}, },
2: { 2: {
label: "{{option2PrimaryName}} can help", label: "{{option2PrimaryName}} can help",
label_disabled: "Can't {{option2RequiredMove}}", label_disabled: "Can't {{option2RequiredMove}}",
tooltip: "(+) {{option2PrimaryName}} saves you.\n(+) {{option2PrimaryName}} gains some EXP.", tooltip: "(+) {{option2PrimaryName}} saves you\n(+) {{option2PrimaryName}} gains some EXP",
tooltip_disabled: "You have no Pokémon to {{option2RequiredMove}} with", tooltip_disabled: "You have no Pokémon to {{option2RequiredMove}} with",
selected: selected: `{{option2PrimaryName}} flies ahead of your boat, guiding you back on track.
"{{option2PrimaryName}} flies ahead of your boat, guiding you back on track.\n{{option2PrimaryName}} seems to also have gotten stronger in this time of need.", \${{option2PrimaryName}} seems to also have gotten stronger in this time of need!`,
}, },
3: { 3: {
label: "Wander aimlessly", label: "Wander aimlessly",
tooltip: "(-) Each of your Pokémon lose {{damagePercentage}}% of their total HP.", tooltip: "(-) Each of your Pokémon lose {{damagePercentage}}% of their total HP",
selected: `You float about in the boat, steering it aimlessly until you finally get back on track. selected: `You float about in the boat, steering without direction until you finally spot a landmark you remember.
$You and your Pokémon get very fatigued during the whole ordeal.`, $You and your Pokémon are fatigued from the whole ordeal.`,
}, },
}, },
outro: "You are back on track." outro: "You are back on track."

View File

@ -1,31 +1,31 @@
export const fightOrFlightDialogue = { export const fightOrFlightDialogue = {
intro: "Wandering aimlessly, you effectively get nowhere.", intro: "Something shiny is sparkling\non the ground near that Pokémon!",
title: "Lost at sea", title: "Fight or Flight",
description: "The sea is turbulent in this area, and you seem to be running out of fuel.\nThis is bad. Is there a way out of the situation?", description: "It looks like there's a strong Pokémon guarding an item. Battling is the straightforward approach, but this Pokémon looks strong. You could also try to sneak around, though the Pokémon might catch you.",
query: "What will you do?", query: "What will you do?",
option: { option: {
1: { 1: {
label: "{{option1PrimaryName}} can help", label: "Battle the Pokémon",
label_disabled: "Can't {{option1RequiredMove}}", tooltip: "(-) Hard Battle\n(+) New Item",
tooltip: "(+) {{option1PrimaryName}} saves you.\n(+) {{option1PrimaryName}} gains some EXP.", selected: "You approach the\nPokémon without fear.",
tooltip_disabled: "You have no Pokémon to {{option1RequiredMove}} on",
selected:
"{{option1PrimaryName}} swims ahead, guiding you back on track.\n{{option1PrimaryName}} seems to also have gotten stronger in this time of need.",
}, },
2: { 2: {
label: "{{option2PrimaryName}} can help", label: "{{option2PrimaryName}} can help",
label_disabled: "Can't {{option2RequiredMove}}", tooltip: "@[SUMMARY_GREEN]{(35%) Steal Item}\n@[SUMMARY_BLUE]{(65%) Harder Battle}",
tooltip: "(+) {{option2PrimaryName}} saves you.\n(+) {{option2PrimaryName}} gains some EXP.", tooltip_special: "(+) {{option2PrimaryName}} uses {{option2PrimaryMove}}",
tooltip_disabled: "You have no Pokémon to {{option2RequiredMove}} with", good_result: `.@d{32}.@d{32}.@d{32}
selected: $You manage to sneak your way\npast and grab the item!`,
"{{option2PrimaryName}} flies ahead of your boat, guiding you back on track.\n{{option2PrimaryName}} seems to also have gotten stronger in this time of need.", special_result: `.@d{32}.@d{32}.@d{32}
$Your {{option2PrimaryName}} helps you out and uses {{option2PrimaryMove}}!
$ You nabbed the item!`,
bad_result: `.@d{32}.@d{32}.@d{32}
$The Pokémon catches you\nas you try to sneak around!`,
boss_enraged: "The opposing {{enemyPokemon}} has become enraged!"
}, },
3: { 3: {
label: "Wander aimlessly", label: "Leave",
tooltip: "(-) Each of your Pokémon lose {{damagePercentage}}% of their total HP.", tooltip: "(-) No Rewards",
selected: `You float about in the boat, steering it aimlessly until you finally get back on track. selected: "You leave the strong Pokémon\nwith its prize and continue on.",
$You and your Pokémon get very fatigued during the whole ordeal.`,
}, },
}, }
outro: "You are back on track."
}; };

View File

@ -7,7 +7,7 @@ export const lostAtSeaDialogue = {
1: { 1: {
label: "{{option1PrimaryName}} can help", label: "{{option1PrimaryName}} can help",
label_disabled: "Can't {{option1RequiredMove}}", label_disabled: "Can't {{option1RequiredMove}}",
tooltip: "(+) {{option1PrimaryName}} saves you.\n(+) {{option1PrimaryName}} gains some EXP.", tooltip: "(+) {{option1PrimaryName}} saves you\n(+) {{option1PrimaryName}} gains some EXP",
tooltip_disabled: "You have no Pokémon to {{option1RequiredMove}} on", tooltip_disabled: "You have no Pokémon to {{option1RequiredMove}} on",
selected: `{{option1PrimaryName}} swims ahead, guiding you back on track. selected: `{{option1PrimaryName}} swims ahead, guiding you back on track.
\${{option1PrimaryName}} seems to also have gotten stronger in this time of need!`, \${{option1PrimaryName}} seems to also have gotten stronger in this time of need!`,
@ -15,16 +15,16 @@ export const lostAtSeaDialogue = {
2: { 2: {
label: "{{option2PrimaryName}} can help", label: "{{option2PrimaryName}} can help",
label_disabled: "Can't {{option2RequiredMove}}", label_disabled: "Can't {{option2RequiredMove}}",
tooltip: "(+) {{option2PrimaryName}} saves you.\n(+) {{option2PrimaryName}} gains some EXP.", tooltip: "(+) {{option2PrimaryName}} saves you\n(+) {{option2PrimaryName}} gains some EXP",
tooltip_disabled: "You have no Pokémon to {{option2RequiredMove}} with", tooltip_disabled: "You have no Pokémon to {{option2RequiredMove}} with",
selected: `{{option2PrimaryName}} flies ahead of your boat, guiding you back on track. selected: `{{option2PrimaryName}} flies ahead of your boat, guiding you back on track.
\${{option2PrimaryName}} seems to also have gotten stronger in this time of need!`, \${{option2PrimaryName}} seems to also have gotten stronger in this time of need!`,
}, },
3: { 3: {
label: "Wander aimlessly", label: "Wander aimlessly",
tooltip: "(-) Each of your Pokémon lose {{damagePercentage}}% of their total HP.", tooltip: "(-) Each of your Pokémon lose {{damagePercentage}}% of their total HP",
selected: `You float about in the boat, steering it aimlessly until you finally get back on track. selected: `You float about in the boat, steering without direction until you finally spot a landmark you remember.
$You and your Pokémon get very fatigued during the whole ordeal.`, $You and your Pokémon are fatigued from the whole ordeal.`,
}, },
}, },
outro: "You are back on track." outro: "You are back on track."

View File

@ -1,30 +1,30 @@
export const mysteriousChallengersDialogue = { export const mysteriousChallengersDialogue = {
intro: "Wandering aimlessly, you effectively get nowhere.", intro: "Wandering aimlessly through the sea, you've effectively gotten nowhere.",
title: "Lost at sea", title: "Lost at Sea",
description: "The sea is turbulent in this area, and you seem to be running out of fuel.\nThis is bad. Is there a way out of the situation?", description: "The sea is turbulent in this area, and you're running out of energy.\nThis is bad. Is there a way out of the situation?",
query: "What will you do?", query: "What will you do?",
option: { option: {
1: { 1: {
label: "{{option1PrimaryName}} can help", label: "{{option1PrimaryName}} can help",
label_disabled: "Can't {{option1RequiredMove}}", label_disabled: "Can't {{option1RequiredMove}}",
tooltip: "(+) {{option1PrimaryName}} saves you.\n(+) {{option1PrimaryName}} gains some EXP.", tooltip: "(+) {{option1PrimaryName}} saves you\n(+) {{option1PrimaryName}} gains some EXP",
tooltip_disabled: "You have no Pokémon to {{option1RequiredMove}} on", tooltip_disabled: "You have no Pokémon to {{option1RequiredMove}} on",
selected: selected: `{{option1PrimaryName}} swims ahead, guiding you back on track.
"{{option1PrimaryName}} swims ahead, guiding you back on track.\n{{option1PrimaryName}} seems to also have gotten stronger in this time of need.", \${{option1PrimaryName}} seems to also have gotten stronger in this time of need!`,
}, },
2: { 2: {
label: "{{option2PrimaryName}} can help", label: "{{option2PrimaryName}} can help",
label_disabled: "Can't {{option2RequiredMove}}", label_disabled: "Can't {{option2RequiredMove}}",
tooltip: "(+) {{option2PrimaryName}} saves you.\n(+) {{option2PrimaryName}} gains some EXP.", tooltip: "(+) {{option2PrimaryName}} saves you\n(+) {{option2PrimaryName}} gains some EXP",
tooltip_disabled: "You have no Pokémon to {{option2RequiredMove}} with", tooltip_disabled: "You have no Pokémon to {{option2RequiredMove}} with",
selected: selected: `{{option2PrimaryName}} flies ahead of your boat, guiding you back on track.
"{{option2PrimaryName}} flies ahead of your boat, guiding you back on track.\n{{option2PrimaryName}} seems to also have gotten stronger in this time of need.", \${{option2PrimaryName}} seems to also have gotten stronger in this time of need!`,
}, },
3: { 3: {
label: "Wander aimlessly", label: "Wander aimlessly",
tooltip: "(-) Each of your Pokémon lose {{damagePercentage}}% of their total HP.", tooltip: "(-) Each of your Pokémon lose {{damagePercentage}}% of their total HP",
selected: `You float about in the boat, steering it aimlessly until you finally get back on track. selected: `You float about in the boat, steering without direction until you finally spot a landmark you remember.
$You and your Pokémon get very fatigued during the whole ordeal.`, $You and your Pokémon are fatigued from the whole ordeal.`,
}, },
}, },
outro: "You are back on track." outro: "You are back on track."

View File

@ -1,30 +1,30 @@
export const safariZoneDialogue = { export const safariZoneDialogue = {
intro: "Wandering aimlessly, you effectively get nowhere.", intro: "Wandering aimlessly through the sea, you've effectively gotten nowhere.",
title: "Lost at sea", title: "Lost at Sea",
description: "The sea is turbulent in this area, and you seem to be running out of fuel.\nThis is bad. Is there a way out of the situation?", description: "The sea is turbulent in this area, and you're running out of energy.\nThis is bad. Is there a way out of the situation?",
query: "What will you do?", query: "What will you do?",
option: { option: {
1: { 1: {
label: "{{option1PrimaryName}} can help", label: "{{option1PrimaryName}} can help",
label_disabled: "Can't {{option1RequiredMove}}", label_disabled: "Can't {{option1RequiredMove}}",
tooltip: "(+) {{option1PrimaryName}} saves you.\n(+) {{option1PrimaryName}} gains some EXP.", tooltip: "(+) {{option1PrimaryName}} saves you\n(+) {{option1PrimaryName}} gains some EXP",
tooltip_disabled: "You have no Pokémon to {{option1RequiredMove}} on", tooltip_disabled: "You have no Pokémon to {{option1RequiredMove}} on",
selected: selected: `{{option1PrimaryName}} swims ahead, guiding you back on track.
"{{option1PrimaryName}} swims ahead, guiding you back on track.\n{{option1PrimaryName}} seems to also have gotten stronger in this time of need.", \${{option1PrimaryName}} seems to also have gotten stronger in this time of need!`,
}, },
2: { 2: {
label: "{{option2PrimaryName}} can help", label: "{{option2PrimaryName}} can help",
label_disabled: "Can't {{option2RequiredMove}}", label_disabled: "Can't {{option2RequiredMove}}",
tooltip: "(+) {{option2PrimaryName}} saves you.\n(+) {{option2PrimaryName}} gains some EXP.", tooltip: "(+) {{option2PrimaryName}} saves you\n(+) {{option2PrimaryName}} gains some EXP",
tooltip_disabled: "You have no Pokémon to {{option2RequiredMove}} with", tooltip_disabled: "You have no Pokémon to {{option2RequiredMove}} with",
selected: selected: `{{option2PrimaryName}} flies ahead of your boat, guiding you back on track.
"{{option2PrimaryName}} flies ahead of your boat, guiding you back on track.\n{{option2PrimaryName}} seems to also have gotten stronger in this time of need.", \${{option2PrimaryName}} seems to also have gotten stronger in this time of need!`,
}, },
3: { 3: {
label: "Wander aimlessly", label: "Wander aimlessly",
tooltip: "(-) Each of your Pokémon lose {{damagePercentage}}% of their total HP.", tooltip: "(-) Each of your Pokémon lose {{damagePercentage}}% of their total HP",
selected: `You float about in the boat, steering it aimlessly until you finally get back on track. selected: `You float about in the boat, steering without direction until you finally spot a landmark you remember.
$You and your Pokémon get very fatigued during the whole ordeal.`, $You and your Pokémon are fatigued from the whole ordeal.`,
}, },
}, },
outro: "You are back on track." outro: "You are back on track."

View File

@ -1,30 +1,30 @@
export const shadyVitaminDealerDialogue = { export const shadyVitaminDealerDialogue = {
intro: "Wandering aimlessly, you effectively get nowhere.", intro: "Wandering aimlessly through the sea, you've effectively gotten nowhere.",
title: "Lost at sea", title: "Lost at Sea",
description: "The sea is turbulent in this area, and you seem to be running out of fuel.\nThis is bad. Is there a way out of the situation?", description: "The sea is turbulent in this area, and you're running out of energy.\nThis is bad. Is there a way out of the situation?",
query: "What will you do?", query: "What will you do?",
option: { option: {
1: { 1: {
label: "{{option1PrimaryName}} can help", label: "{{option1PrimaryName}} can help",
label_disabled: "Can't {{option1RequiredMove}}", label_disabled: "Can't {{option1RequiredMove}}",
tooltip: "(+) {{option1PrimaryName}} saves you.\n(+) {{option1PrimaryName}} gains some EXP.", tooltip: "(+) {{option1PrimaryName}} saves you\n(+) {{option1PrimaryName}} gains some EXP",
tooltip_disabled: "You have no Pokémon to {{option1RequiredMove}} on", tooltip_disabled: "You have no Pokémon to {{option1RequiredMove}} on",
selected: selected: `{{option1PrimaryName}} swims ahead, guiding you back on track.
"{{option1PrimaryName}} swims ahead, guiding you back on track.\n{{option1PrimaryName}} seems to also have gotten stronger in this time of need.", \${{option1PrimaryName}} seems to also have gotten stronger in this time of need!`,
}, },
2: { 2: {
label: "{{option2PrimaryName}} can help", label: "{{option2PrimaryName}} can help",
label_disabled: "Can't {{option2RequiredMove}}", label_disabled: "Can't {{option2RequiredMove}}",
tooltip: "(+) {{option2PrimaryName}} saves you.\n(+) {{option2PrimaryName}} gains some EXP.", tooltip: "(+) {{option2PrimaryName}} saves you\n(+) {{option2PrimaryName}} gains some EXP",
tooltip_disabled: "You have no Pokémon to {{option2RequiredMove}} with", tooltip_disabled: "You have no Pokémon to {{option2RequiredMove}} with",
selected: selected: `{{option2PrimaryName}} flies ahead of your boat, guiding you back on track.
"{{option2PrimaryName}} flies ahead of your boat, guiding you back on track.\n{{option2PrimaryName}} seems to also have gotten stronger in this time of need.", \${{option2PrimaryName}} seems to also have gotten stronger in this time of need!`,
}, },
3: { 3: {
label: "Wander aimlessly", label: "Wander aimlessly",
tooltip: "(-) Each of your Pokémon lose {{damagePercentage}}% of their total HP.", tooltip: "(-) Each of your Pokémon lose {{damagePercentage}}% of their total HP",
selected: `You float about in the boat, steering it aimlessly until you finally get back on track. selected: `You float about in the boat, steering without direction until you finally spot a landmark you remember.
$You and your Pokémon get very fatigued during the whole ordeal.`, $You and your Pokémon are fatigued from the whole ordeal.`,
}, },
}, },
outro: "You are back on track." outro: "You are back on track."

View File

@ -1,30 +1,30 @@
export const sleepingSnorlaxDialogue = { export const sleepingSnorlaxDialogue = {
intro: "Wandering aimlessly, you effectively get nowhere.", intro: "Wandering aimlessly through the sea, you've effectively gotten nowhere.",
title: "Lost at sea", title: "Lost at Sea",
description: "The sea is turbulent in this area, and you seem to be running out of fuel.\nThis is bad. Is there a way out of the situation?", description: "The sea is turbulent in this area, and you're running out of energy.\nThis is bad. Is there a way out of the situation?",
query: "What will you do?", query: "What will you do?",
option: { option: {
1: { 1: {
label: "{{option1PrimaryName}} can help", label: "{{option1PrimaryName}} can help",
label_disabled: "Can't {{option1RequiredMove}}", label_disabled: "Can't {{option1RequiredMove}}",
tooltip: "(+) {{option1PrimaryName}} saves you.\n(+) {{option1PrimaryName}} gains some EXP.", tooltip: "(+) {{option1PrimaryName}} saves you\n(+) {{option1PrimaryName}} gains some EXP",
tooltip_disabled: "You have no Pokémon to {{option1RequiredMove}} on", tooltip_disabled: "You have no Pokémon to {{option1RequiredMove}} on",
selected: selected: `{{option1PrimaryName}} swims ahead, guiding you back on track.
"{{option1PrimaryName}} swims ahead, guiding you back on track.\n{{option1PrimaryName}} seems to also have gotten stronger in this time of need.", \${{option1PrimaryName}} seems to also have gotten stronger in this time of need!`,
}, },
2: { 2: {
label: "{{option2PrimaryName}} can help", label: "{{option2PrimaryName}} can help",
label_disabled: "Can't {{option2RequiredMove}}", label_disabled: "Can't {{option2RequiredMove}}",
tooltip: "(+) {{option2PrimaryName}} saves you.\n(+) {{option2PrimaryName}} gains some EXP.", tooltip: "(+) {{option2PrimaryName}} saves you\n(+) {{option2PrimaryName}} gains some EXP",
tooltip_disabled: "You have no Pokémon to {{option2RequiredMove}} with", tooltip_disabled: "You have no Pokémon to {{option2RequiredMove}} with",
selected: selected: `{{option2PrimaryName}} flies ahead of your boat, guiding you back on track.
"{{option2PrimaryName}} flies ahead of your boat, guiding you back on track.\n{{option2PrimaryName}} seems to also have gotten stronger in this time of need.", \${{option2PrimaryName}} seems to also have gotten stronger in this time of need!`,
}, },
3: { 3: {
label: "Wander aimlessly", label: "Wander aimlessly",
tooltip: "(-) Each of your Pokémon lose {{damagePercentage}}% of their total HP.", tooltip: "(-) Each of your Pokémon lose {{damagePercentage}}% of their total HP",
selected: `You float about in the boat, steering it aimlessly until you finally get back on track. selected: `You float about in the boat, steering without direction until you finally spot a landmark you remember.
$You and your Pokémon get very fatigued during the whole ordeal.`, $You and your Pokémon are fatigued from the whole ordeal.`,
}, },
}, },
outro: "You are back on track." outro: "You are back on track."

View File

@ -1,30 +1,30 @@
export const trainingSessionDialogue = { export const trainingSessionDialogue = {
intro: "Wandering aimlessly, you effectively get nowhere.", intro: "Wandering aimlessly through the sea, you've effectively gotten nowhere.",
title: "Lost at sea", title: "Lost at Sea",
description: "The sea is turbulent in this area, and you seem to be running out of fuel.\nThis is bad. Is there a way out of the situation?", description: "The sea is turbulent in this area, and you're running out of energy.\nThis is bad. Is there a way out of the situation?",
query: "What will you do?", query: "What will you do?",
option: { option: {
1: { 1: {
label: "{{option1PrimaryName}} can help", label: "{{option1PrimaryName}} can help",
label_disabled: "Can't {{option1RequiredMove}}", label_disabled: "Can't {{option1RequiredMove}}",
tooltip: "(+) {{option1PrimaryName}} saves you.\n(+) {{option1PrimaryName}} gains some EXP.", tooltip: "(+) {{option1PrimaryName}} saves you\n(+) {{option1PrimaryName}} gains some EXP",
tooltip_disabled: "You have no Pokémon to {{option1RequiredMove}} on", tooltip_disabled: "You have no Pokémon to {{option1RequiredMove}} on",
selected: selected: `{{option1PrimaryName}} swims ahead, guiding you back on track.
"{{option1PrimaryName}} swims ahead, guiding you back on track.\n{{option1PrimaryName}} seems to also have gotten stronger in this time of need.", \${{option1PrimaryName}} seems to also have gotten stronger in this time of need!`,
}, },
2: { 2: {
label: "{{option2PrimaryName}} can help", label: "{{option2PrimaryName}} can help",
label_disabled: "Can't {{option2RequiredMove}}", label_disabled: "Can't {{option2RequiredMove}}",
tooltip: "(+) {{option2PrimaryName}} saves you.\n(+) {{option2PrimaryName}} gains some EXP.", tooltip: "(+) {{option2PrimaryName}} saves you\n(+) {{option2PrimaryName}} gains some EXP",
tooltip_disabled: "You have no Pokémon to {{option2RequiredMove}} with", tooltip_disabled: "You have no Pokémon to {{option2RequiredMove}} with",
selected: selected: `{{option2PrimaryName}} flies ahead of your boat, guiding you back on track.
"{{option2PrimaryName}} flies ahead of your boat, guiding you back on track.\n{{option2PrimaryName}} seems to also have gotten stronger in this time of need.", \${{option2PrimaryName}} seems to also have gotten stronger in this time of need!`,
}, },
3: { 3: {
label: "Wander aimlessly", label: "Wander aimlessly",
tooltip: "(-) Each of your Pokémon lose {{damagePercentage}}% of their total HP.", tooltip: "(-) Each of your Pokémon lose {{damagePercentage}}% of their total HP",
selected: `You float about in the boat, steering it aimlessly until you finally get back on track. selected: `You float about in the boat, steering without direction until you finally spot a landmark you remember.
$You and your Pokémon get very fatigued during the whole ordeal.`, $You and your Pokémon are fatigued from the whole ordeal.`,
}, },
}, },
outro: "You are back on track." outro: "You are back on track."

View File

@ -117,9 +117,9 @@ export const EGG_GACHA_PULL_COUNT_OVERRIDE: number = 0;
*/ */
// 1 to 256, set to null to ignore // 1 to 256, set to null to ignore
export const MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = null; export const MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = 256;
export const MYSTERY_ENCOUNTER_TIER_OVERRIDE: MysteryEncounterTier = null; export const MYSTERY_ENCOUNTER_TIER_OVERRIDE: MysteryEncounterTier = null;
export const MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = null; export const MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = MysteryEncounterType.SLEEPING_SNORLAX;
/** /**
* MODIFIER / ITEM OVERRIDES * MODIFIER / ITEM OVERRIDES

View File

@ -66,7 +66,7 @@ import { PlayerGender } from "#enums/player-gender";
import { Species } from "#enums/species"; import { Species } from "#enums/species";
import { TrainerType } from "#enums/trainer-type"; import { TrainerType } from "#enums/trainer-type";
import { MysteryEncounterVariant } from "#app/data/mystery-encounters/mystery-encounter"; import { MysteryEncounterVariant } from "#app/data/mystery-encounters/mystery-encounter";
import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phase"; import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases";
import { handleEncounterStartOfBattleEffects, handleMysteryEncounterVictory } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { handleEncounterStartOfBattleEffects, handleMysteryEncounterVictory } from "#app/data/mystery-encounters/utils/encounter-phase-utils";
import ModifierSelectUiHandler, { SHOP_OPTIONS_ROW_LIMIT } from "#app/ui/modifier-select-ui-handler"; import ModifierSelectUiHandler, { SHOP_OPTIONS_ROW_LIMIT } from "#app/ui/modifier-select-ui-handler";
import { getEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import { getEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils";

View File

@ -14,6 +14,7 @@ import { IvScannerModifier } from "../modifier/modifier";
import * as Utils from "../utils"; import * as Utils from "../utils";
import { isNullOrUndefined } from "../utils"; import { isNullOrUndefined } from "../utils";
import { getEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import { getEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils";
import { BattlerTagLapseType } from "#app/data/battler-tags";
/** /**
* Will handle (in order): * Will handle (in order):
@ -165,6 +166,28 @@ export class MysteryEncounterOptionSelectedPhase extends Phase {
} }
} }
/**
* Runs at the beginning of an Encounter's battle
* Will cleanup any residual flinches, Endure, etc. that are left over from startOfBattleEffects
* See [TurnEndPhase](../phases.ts) for more details
*/
export class MysteryEncounterBattleStartCleanupPhase extends Phase {
constructor(scene: BattleScene) {
super(scene);
}
start() {
super.start();
const field = this.scene.getField(true).filter(p => p.summonData);
field.forEach(pokemon => {
pokemon.lapseTags(BattlerTagLapseType.TURN_END);
});
this.end();
}
}
/** /**
* Will handle (in order): * Will handle (in order):
* - Setting BGM * - Setting BGM

View File

@ -1,6 +1,6 @@
import { Button } from "#app/enums/buttons"; import { Button } from "#app/enums/buttons";
import { MessagePhase, VictoryPhase } from "#app/phases"; import { MessagePhase, VictoryPhase } from "#app/phases";
import { MysteryEncounterPhase, MysteryEncounterRewardsPhase } from "#app/phases/mystery-encounter-phase"; import { MysteryEncounterPhase, MysteryEncounterRewardsPhase } from "#app/phases/mystery-encounter-phases";
import MysteryEncounterUiHandler from "#app/ui/mystery-encounter-ui-handler"; import MysteryEncounterUiHandler from "#app/ui/mystery-encounter-ui-handler";
import { Mode } from "#app/ui/ui"; import { Mode } from "#app/ui/ui";
import GameManager from "../utils/gameManager"; import GameManager from "../utils/gameManager";

View File

@ -12,7 +12,7 @@ import GameManager from "#app/test/utils/gameManager";
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
import { runSelectMysteryEncounterOption } from "../encounterTestUtils"; import { runSelectMysteryEncounterOption } from "../encounterTestUtils";
const namepsace = "mysteryEncounter:lostAtSeaDialogue"; const namespace = "mysteryEncounter:lostAtSeaDialogue";
/** Blastoise for surf. Pidgeot for fly. Abra for none. */ /** Blastoise for surf. Pidgeot for fly. Abra for none. */
const defaultParty = [Species.BLASTOISE, Species.PIDGEOT, Species.ABRA]; const defaultParty = [Species.BLASTOISE, Species.PIDGEOT, Species.ABRA];
const defaultBiome = Biome.SEA; const defaultBiome = Biome.SEA;
@ -49,10 +49,10 @@ describe("Lost at Sea - Mystery Encounter", () => {
expect(LostAtSeaEncounter.encounterType).toBe(MysteryEncounterType.LOST_AT_SEA); expect(LostAtSeaEncounter.encounterType).toBe(MysteryEncounterType.LOST_AT_SEA);
expect(LostAtSeaEncounter.dialogue).toBeDefined(); expect(LostAtSeaEncounter.dialogue).toBeDefined();
expect(LostAtSeaEncounter.dialogue.intro).toStrictEqual([{ text: `${namepsace}:intro` }]); expect(LostAtSeaEncounter.dialogue.intro).toStrictEqual([{ text: `${namespace}:intro` }]);
expect(LostAtSeaEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namepsace}:title`); expect(LostAtSeaEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namespace}:title`);
expect(LostAtSeaEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namepsace}:description`); expect(LostAtSeaEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namespace}:description`);
expect(LostAtSeaEncounter.dialogue.encounterOptionsDialogue.query).toBe(`${namepsace}:query`); expect(LostAtSeaEncounter.dialogue.encounterOptionsDialogue.query).toBe(`${namespace}:query`);
expect(LostAtSeaEncounter.options.length).toBe(3); expect(LostAtSeaEncounter.options.length).toBe(3);
}); });
@ -100,13 +100,13 @@ describe("Lost at Sea - Mystery Encounter", () => {
expect(option1.optionMode).toBe(EncounterOptionMode.DISABLED_OR_DEFAULT); expect(option1.optionMode).toBe(EncounterOptionMode.DISABLED_OR_DEFAULT);
expect(option1.dialogue).toBeDefined(); expect(option1.dialogue).toBeDefined();
expect(option1.dialogue).toStrictEqual({ expect(option1.dialogue).toStrictEqual({
buttonLabel: `${namepsace}:option:1:label`, buttonLabel: `${namespace}:option:1:label`,
disabledButtonLabel: `${namepsace}:option:1:label_disabled`, disabledButtonLabel: `${namespace}:option:1:label_disabled`,
buttonTooltip: `${namepsace}:option:1:tooltip`, buttonTooltip: `${namespace}:option:1:tooltip`,
disabledButtonTooltip: `${namepsace}:option:1:tooltip_disabled`, disabledButtonTooltip: `${namespace}:option:1:tooltip_disabled`,
selected: [ selected: [
{ {
text: `${namepsace}:option:1:selected`, text: `${namespace}:option:1:selected`,
}, },
], ],
}); });
@ -147,13 +147,13 @@ describe("Lost at Sea - Mystery Encounter", () => {
expect(option2.optionMode).toBe(EncounterOptionMode.DISABLED_OR_DEFAULT); expect(option2.optionMode).toBe(EncounterOptionMode.DISABLED_OR_DEFAULT);
expect(option2.dialogue).toBeDefined(); expect(option2.dialogue).toBeDefined();
expect(option2.dialogue).toStrictEqual({ expect(option2.dialogue).toStrictEqual({
buttonLabel: `${namepsace}:option:2:label`, buttonLabel: `${namespace}:option:2:label`,
disabledButtonLabel: `${namepsace}:option:2:label_disabled`, disabledButtonLabel: `${namespace}:option:2:label_disabled`,
buttonTooltip: `${namepsace}:option:2:tooltip`, buttonTooltip: `${namespace}:option:2:tooltip`,
disabledButtonTooltip: `${namepsace}:option:2:tooltip_disabled`, disabledButtonTooltip: `${namespace}:option:2:tooltip_disabled`,
selected: [ selected: [
{ {
text: `${namepsace}:option:2:selected`, text: `${namespace}:option:2:selected`,
}, },
], ],
}); });
@ -197,11 +197,11 @@ describe("Lost at Sea - Mystery Encounter", () => {
expect(option3.optionMode).toBe(EncounterOptionMode.DEFAULT); expect(option3.optionMode).toBe(EncounterOptionMode.DEFAULT);
expect(option3.dialogue).toBeDefined(); expect(option3.dialogue).toBeDefined();
expect(option3.dialogue).toStrictEqual({ expect(option3.dialogue).toStrictEqual({
buttonLabel: `${namepsace}:option:3:label`, buttonLabel: `${namespace}:option:3:label`,
buttonTooltip: `${namepsace}:option:3:tooltip`, buttonTooltip: `${namespace}:option:3:tooltip`,
selected: [ selected: [
{ {
text: `${namepsace}:option:3:selected`, text: `${namespace}:option:3:selected`,
}, },
], ],
}); });

View File

@ -2,7 +2,7 @@ import { afterEach, beforeAll, beforeEach, expect, describe, it } from "vitest";
import GameManager from "#app/test/utils/gameManager"; import GameManager from "#app/test/utils/gameManager";
import Phaser from "phaser"; import Phaser from "phaser";
import { Species } from "#enums/species"; import { Species } from "#enums/species";
import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phase"; import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases";
import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type";
describe("Mystery Encounters", () => { describe("Mystery Encounters", () => {

View File

@ -2,7 +2,7 @@ import {afterEach, beforeAll, beforeEach, expect, describe, it, vi } from "vites
import GameManager from "#app/test/utils/gameManager"; import GameManager from "#app/test/utils/gameManager";
import Phaser from "phaser"; import Phaser from "phaser";
import {Species} from "#enums/species"; import {Species} from "#enums/species";
import { MysteryEncounterOptionSelectedPhase, MysteryEncounterPhase } from "#app/phases/mystery-encounter-phase"; import { MysteryEncounterOptionSelectedPhase, MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases";
import {Mode} from "#app/ui/ui"; import {Mode} from "#app/ui/ui";
import {Button} from "#enums/buttons"; import {Button} from "#enums/buttons";
import MysteryEncounterUiHandler from "#app/ui/mystery-encounter-ui-handler"; import MysteryEncounterUiHandler from "#app/ui/mystery-encounter-ui-handler";

View File

@ -34,7 +34,7 @@ import { Button } from "#enums/buttons";
import { BattlerIndex } from "#app/battle.js"; import { BattlerIndex } from "#app/battle.js";
import TargetSelectUiHandler from "#app/ui/target-select-ui-handler.js"; import TargetSelectUiHandler from "#app/ui/target-select-ui-handler.js";
import BattleMessageUiHandler from "#app/ui/battle-message-ui-handler"; import BattleMessageUiHandler from "#app/ui/battle-message-ui-handler";
import {MysteryEncounterPhase} from "#app/phases/mystery-encounter-phase"; import {MysteryEncounterPhase} from "#app/phases/mystery-encounter-phases";
import { OverridesHelper } from "./overridesHelper"; import { OverridesHelper } from "./overridesHelper";
/** /**

View File

@ -44,7 +44,7 @@ import {
MysteryEncounterPhase, MysteryEncounterPhase,
MysteryEncounterRewardsPhase, MysteryEncounterRewardsPhase,
PostMysteryEncounterPhase PostMysteryEncounterPhase
} from "#app/phases/mystery-encounter-phase"; } from "#app/phases/mystery-encounter-phases";
export default class PhaseInterceptor { export default class PhaseInterceptor {
public scene; public scene;

View File

@ -4,7 +4,7 @@ import { Mode } from "./ui";
import UiHandler from "./ui-handler"; import UiHandler from "./ui-handler";
import { Button } from "#enums/buttons"; import { Button } from "#enums/buttons";
import { addWindow, WindowVariant } from "./ui-theme"; import { addWindow, WindowVariant } from "./ui-theme";
import { MysteryEncounterPhase } from "../phases/mystery-encounter-phase"; import { MysteryEncounterPhase } from "../phases/mystery-encounter-phases";
import { PartyUiMode } from "./party-ui-handler"; import { PartyUiMode } from "./party-ui-handler";
import MysteryEncounterOption, { EncounterOptionMode } from "../data/mystery-encounters/mystery-encounter-option"; import MysteryEncounterOption, { EncounterOptionMode } from "../data/mystery-encounters/mystery-encounter-option";
import * as Utils from "../utils"; import * as Utils from "../utils";