change return type of isNullOrUndefined
This commit is contained in:
parent
6dc1aedb8e
commit
24bbb0931c
|
@ -2636,8 +2636,7 @@ export default class BattleScene extends SceneBase {
|
||||||
modifier = mt.modifier as PokemonHeldItemModifier;
|
modifier = mt.modifier as PokemonHeldItemModifier;
|
||||||
modifier.pokemonId = enemyPokemon.id;
|
modifier.pokemonId = enemyPokemon.id;
|
||||||
}
|
}
|
||||||
const stackCount = mt.stackCount ?? 1;
|
modifier.stackCount = mt.stackCount ?? 1;
|
||||||
modifier.stackCount = stackCount;
|
|
||||||
modifier.isTransferable = mt.isTransferable ?? modifier.isTransferable;
|
modifier.isTransferable = mt.isTransferable ?? modifier.isTransferable;
|
||||||
this.addEnemyModifier(modifier, true);
|
this.addEnemyModifier(modifier, true);
|
||||||
});
|
});
|
||||||
|
@ -3076,7 +3075,16 @@ export default class BattleScene extends SceneBase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
isWaveMysteryEncounter(newBattleType: BattleType, waveIndex: number, sessionDataEncounterType?: MysteryEncounterType): boolean {
|
/**
|
||||||
|
* Determines whether a wave should randomly generate a {@linkcode MysteryEncounter}.
|
||||||
|
* Currently, the only modes that MEs are allowed in are Classic and Challenge.
|
||||||
|
* Additionally, MEs cannot spawn outside of waves 10-180 in those modes
|
||||||
|
*
|
||||||
|
* @param newBattleType
|
||||||
|
* @param waveIndex
|
||||||
|
* @param sessionDataEncounterType
|
||||||
|
*/
|
||||||
|
private isWaveMysteryEncounter(newBattleType: BattleType, waveIndex: number, sessionDataEncounterType?: MysteryEncounterType): boolean {
|
||||||
const [lowestMysteryEncounterWave, highestMysteryEncounterWave] = this.gameMode.getMysteryEncounterLegalWaves();
|
const [lowestMysteryEncounterWave, highestMysteryEncounterWave] = this.gameMode.getMysteryEncounterLegalWaves();
|
||||||
if (this.gameMode.hasMysteryEncounters && newBattleType === BattleType.WILD && !this.gameMode.isBoss(waveIndex) && waveIndex < highestMysteryEncounterWave && waveIndex > lowestMysteryEncounterWave) {
|
if (this.gameMode.hasMysteryEncounters && newBattleType === BattleType.WILD && !this.gameMode.isBoss(waveIndex) && waveIndex < highestMysteryEncounterWave && waveIndex > lowestMysteryEncounterWave) {
|
||||||
// If ME type is already defined in session data, no need to roll RNG check
|
// If ME type is already defined in session data, no need to roll RNG check
|
||||||
|
@ -3120,10 +3128,10 @@ export default class BattleScene extends SceneBase {
|
||||||
getMysteryEncounter(encounterType?: MysteryEncounterType): MysteryEncounter {
|
getMysteryEncounter(encounterType?: MysteryEncounterType): MysteryEncounter {
|
||||||
// Loading override or session encounter
|
// Loading override or session encounter
|
||||||
let encounter: MysteryEncounter | null;
|
let encounter: MysteryEncounter | null;
|
||||||
if (!isNullOrUndefined(Overrides.MYSTERY_ENCOUNTER_OVERRIDE) && allMysteryEncounters.hasOwnProperty(Overrides.MYSTERY_ENCOUNTER_OVERRIDE!)) {
|
if (!isNullOrUndefined(Overrides.MYSTERY_ENCOUNTER_OVERRIDE) && allMysteryEncounters.hasOwnProperty(Overrides.MYSTERY_ENCOUNTER_OVERRIDE)) {
|
||||||
encounter = allMysteryEncounters[Overrides.MYSTERY_ENCOUNTER_OVERRIDE!];
|
encounter = allMysteryEncounters[Overrides.MYSTERY_ENCOUNTER_OVERRIDE];
|
||||||
} else {
|
} else {
|
||||||
encounter = !isNullOrUndefined(encounterType) ? allMysteryEncounters[encounterType!] : null;
|
encounter = !isNullOrUndefined(encounterType) ? allMysteryEncounters[encounterType] : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check for queued encounters first
|
// Check for queued encounters first
|
||||||
|
@ -3166,7 +3174,7 @@ export default class BattleScene extends SceneBase {
|
||||||
let tier: MysteryEncounterTier | null = tierValue > commonThreshold ? MysteryEncounterTier.COMMON : tierValue > greatThreshold ? MysteryEncounterTier.GREAT : tierValue > ultraThreshold ? MysteryEncounterTier.ULTRA : MysteryEncounterTier.ROGUE;
|
let tier: MysteryEncounterTier | null = tierValue > commonThreshold ? MysteryEncounterTier.COMMON : tierValue > greatThreshold ? MysteryEncounterTier.GREAT : tierValue > ultraThreshold ? MysteryEncounterTier.ULTRA : MysteryEncounterTier.ROGUE;
|
||||||
|
|
||||||
if (!isNullOrUndefined(Overrides.MYSTERY_ENCOUNTER_TIER_OVERRIDE)) {
|
if (!isNullOrUndefined(Overrides.MYSTERY_ENCOUNTER_TIER_OVERRIDE)) {
|
||||||
tier = Overrides.MYSTERY_ENCOUNTER_TIER_OVERRIDE!;
|
tier = Overrides.MYSTERY_ENCOUNTER_TIER_OVERRIDE;
|
||||||
}
|
}
|
||||||
|
|
||||||
let availableEncounters: MysteryEncounter[] = [];
|
let availableEncounters: MysteryEncounter[] = [];
|
||||||
|
|
|
@ -430,7 +430,7 @@ class AnimTimedAddBgEvent extends AnimTimedBgEvent {
|
||||||
scene.field.add(moveAnim.bgSprite);
|
scene.field.add(moveAnim.bgSprite);
|
||||||
const fieldPokemon = scene.getNonSwitchedEnemyPokemon() || scene.getNonSwitchedPlayerPokemon();
|
const fieldPokemon = scene.getNonSwitchedEnemyPokemon() || scene.getNonSwitchedPlayerPokemon();
|
||||||
if (!isNullOrUndefined(priority)) {
|
if (!isNullOrUndefined(priority)) {
|
||||||
scene.field.moveTo(moveAnim.bgSprite as Phaser.GameObjects.GameObject, priority!);
|
scene.field.moveTo(moveAnim.bgSprite as Phaser.GameObjects.GameObject, priority);
|
||||||
} else if (fieldPokemon?.isOnField()) {
|
} else if (fieldPokemon?.isOnField()) {
|
||||||
scene.field.moveBelow(moveAnim.bgSprite as Phaser.GameObjects.GameObject, fieldPokemon);
|
scene.field.moveBelow(moveAnim.bgSprite as Phaser.GameObjects.GameObject, fieldPokemon);
|
||||||
}
|
}
|
||||||
|
|
|
@ -492,7 +492,7 @@ function getTrainerConfigForWave(waveIndex: number) {
|
||||||
.setPartyMemberFunc(3, getRandomPartyMemberFunc(POOL_2_POKEMON, TrainerSlot.TRAINER, true))
|
.setPartyMemberFunc(3, getRandomPartyMemberFunc(POOL_2_POKEMON, TrainerSlot.TRAINER, true))
|
||||||
.setPartyMemberFunc(4, getRandomPartyMemberFunc([pool3Mon.species], TrainerSlot.TRAINER, true, p => {
|
.setPartyMemberFunc(4, getRandomPartyMemberFunc([pool3Mon.species], TrainerSlot.TRAINER, true, p => {
|
||||||
if (!isNullOrUndefined(pool3Mon.formIndex)) {
|
if (!isNullOrUndefined(pool3Mon.formIndex)) {
|
||||||
p.formIndex = pool3Mon.formIndex!;
|
p.formIndex = pool3Mon.formIndex;
|
||||||
p.generateAndPopulateMoveset();
|
p.generateAndPopulateMoveset();
|
||||||
p.generateName();
|
p.generateName();
|
||||||
}
|
}
|
||||||
|
@ -515,14 +515,14 @@ function getTrainerConfigForWave(waveIndex: number) {
|
||||||
.setPartyMemberFunc(2, getRandomPartyMemberFunc(POOL_2_POKEMON, TrainerSlot.TRAINER, true))
|
.setPartyMemberFunc(2, getRandomPartyMemberFunc(POOL_2_POKEMON, TrainerSlot.TRAINER, true))
|
||||||
.setPartyMemberFunc(3, getRandomPartyMemberFunc([pool3Mon.species], TrainerSlot.TRAINER, true, p => {
|
.setPartyMemberFunc(3, getRandomPartyMemberFunc([pool3Mon.species], TrainerSlot.TRAINER, true, p => {
|
||||||
if (!isNullOrUndefined(pool3Mon.formIndex)) {
|
if (!isNullOrUndefined(pool3Mon.formIndex)) {
|
||||||
p.formIndex = pool3Mon.formIndex!;
|
p.formIndex = pool3Mon.formIndex;
|
||||||
p.generateAndPopulateMoveset();
|
p.generateAndPopulateMoveset();
|
||||||
p.generateName();
|
p.generateName();
|
||||||
}
|
}
|
||||||
}))
|
}))
|
||||||
.setPartyMemberFunc(4, getRandomPartyMemberFunc([pool3Mon2.species], TrainerSlot.TRAINER, true, p => {
|
.setPartyMemberFunc(4, getRandomPartyMemberFunc([pool3Mon2.species], TrainerSlot.TRAINER, true, p => {
|
||||||
if (!isNullOrUndefined(pool3Mon2.formIndex)) {
|
if (!isNullOrUndefined(pool3Mon2.formIndex)) {
|
||||||
p.formIndex = pool3Mon2.formIndex!;
|
p.formIndex = pool3Mon2.formIndex;
|
||||||
p.generateAndPopulateMoveset();
|
p.generateAndPopulateMoveset();
|
||||||
p.generateName();
|
p.generateName();
|
||||||
}
|
}
|
||||||
|
@ -543,7 +543,7 @@ function getTrainerConfigForWave(waveIndex: number) {
|
||||||
.setPartyMemberFunc(2, getRandomPartyMemberFunc(POOL_2_POKEMON, TrainerSlot.TRAINER, true))
|
.setPartyMemberFunc(2, getRandomPartyMemberFunc(POOL_2_POKEMON, TrainerSlot.TRAINER, true))
|
||||||
.setPartyMemberFunc(3, getRandomPartyMemberFunc([pool3Mon.species], TrainerSlot.TRAINER, true, p => {
|
.setPartyMemberFunc(3, getRandomPartyMemberFunc([pool3Mon.species], TrainerSlot.TRAINER, true, p => {
|
||||||
if (!isNullOrUndefined(pool3Mon.formIndex)) {
|
if (!isNullOrUndefined(pool3Mon.formIndex)) {
|
||||||
p.formIndex = pool3Mon.formIndex!;
|
p.formIndex = pool3Mon.formIndex;
|
||||||
p.generateAndPopulateMoveset();
|
p.generateAndPopulateMoveset();
|
||||||
p.generateName();
|
p.generateName();
|
||||||
}
|
}
|
||||||
|
@ -566,14 +566,14 @@ function getTrainerConfigForWave(waveIndex: number) {
|
||||||
}))
|
}))
|
||||||
.setPartyMemberFunc(2, getRandomPartyMemberFunc([pool3Mon.species], TrainerSlot.TRAINER, true, p => {
|
.setPartyMemberFunc(2, getRandomPartyMemberFunc([pool3Mon.species], TrainerSlot.TRAINER, true, p => {
|
||||||
if (!isNullOrUndefined(pool3Mon.formIndex)) {
|
if (!isNullOrUndefined(pool3Mon.formIndex)) {
|
||||||
p.formIndex = pool3Mon.formIndex!;
|
p.formIndex = pool3Mon.formIndex;
|
||||||
p.generateAndPopulateMoveset();
|
p.generateAndPopulateMoveset();
|
||||||
p.generateName();
|
p.generateName();
|
||||||
}
|
}
|
||||||
}))
|
}))
|
||||||
.setPartyMemberFunc(3, getRandomPartyMemberFunc([pool3Mon.species], TrainerSlot.TRAINER, true, p => {
|
.setPartyMemberFunc(3, getRandomPartyMemberFunc([pool3Mon.species], TrainerSlot.TRAINER, true, p => {
|
||||||
if (!isNullOrUndefined(pool3Mon.formIndex)) {
|
if (!isNullOrUndefined(pool3Mon.formIndex)) {
|
||||||
p.formIndex = pool3Mon.formIndex!;
|
p.formIndex = pool3Mon.formIndex;
|
||||||
p.generateAndPopulateMoveset();
|
p.generateAndPopulateMoveset();
|
||||||
p.generateName();
|
p.generateName();
|
||||||
}
|
}
|
||||||
|
|
|
@ -63,7 +63,7 @@ export const DepartmentStoreSaleEncounter: MysteryEncounter =
|
||||||
// Choose TMs
|
// Choose TMs
|
||||||
const modifiers: ModifierTypeFunc[] = [];
|
const modifiers: ModifierTypeFunc[] = [];
|
||||||
let i = 0;
|
let i = 0;
|
||||||
while (i < 4) {
|
while (i < 6) {
|
||||||
// 2/2/1 weight on TM rarity
|
// 2/2/1 weight on TM rarity
|
||||||
const roll = randSeedInt(5);
|
const roll = randSeedInt(5);
|
||||||
if (roll < 2) {
|
if (roll < 2) {
|
||||||
|
|
|
@ -189,7 +189,7 @@ export const FieryFalloutEncounter: MysteryEncounter =
|
||||||
}
|
}
|
||||||
|
|
||||||
// Burn random member
|
// Burn random member
|
||||||
const burnable = nonFireTypes.filter(p => isNullOrUndefined(p.status) || isNullOrUndefined(p.status!.effect) || p.status?.effect === StatusEffect.NONE);
|
const burnable = nonFireTypes.filter(p => isNullOrUndefined(p.status) || isNullOrUndefined(p.status.effect) || p.status.effect === StatusEffect.NONE);
|
||||||
if (burnable?.length > 0) {
|
if (burnable?.length > 0) {
|
||||||
const roll = randSeedInt(burnable.length);
|
const roll = randSeedInt(burnable.length);
|
||||||
const chosenPokemon = burnable[roll];
|
const chosenPokemon = burnable[roll];
|
||||||
|
|
|
@ -26,11 +26,15 @@ import { trainerNamePools } from "#app/data/trainer-names";
|
||||||
import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode";
|
import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode";
|
||||||
import { addPokemonDataToDexAndValidateAchievements } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils";
|
import { addPokemonDataToDexAndValidateAchievements } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils";
|
||||||
import { Moves } from "#enums/moves";
|
import { Moves } from "#enums/moves";
|
||||||
import { speciesEggMoves } from "#app/data/egg-moves";
|
|
||||||
|
|
||||||
/** the i18n namespace for the encounter */
|
/** the i18n namespace for the encounter */
|
||||||
const namespace = "mysteryEncounter:globalTradeSystem";
|
const namespace = "mysteryEncounter:globalTradeSystem";
|
||||||
|
|
||||||
|
/** Base shiny chance of 512/65536 -> 1/128 odds, affected by events and Shiny Charms. Cannot exceed 1/16 odds. */
|
||||||
|
const WONDER_TRADE_SHINY_CHANCE = 512;
|
||||||
|
/** Max shiny chance of 4096/65536 -> 1/16 odds. */
|
||||||
|
const MAX_WONDER_TRADE_SHINY_CHANCE = 4096;
|
||||||
|
|
||||||
const LEGENDARY_TRADE_POOLS = {
|
const LEGENDARY_TRADE_POOLS = {
|
||||||
1: [Species.RATTATA, Species.PIDGEY, Species.WEEDLE],
|
1: [Species.RATTATA, Species.PIDGEY, Species.WEEDLE],
|
||||||
2: [Species.SENTRET, Species.HOOTHOOT, Species.LEDYBA],
|
2: [Species.SENTRET, Species.HOOTHOOT, Species.LEDYBA],
|
||||||
|
@ -224,16 +228,15 @@ export const GlobalTradeSystemEncounter: MysteryEncounter =
|
||||||
const tradePokemon = new EnemyPokemon(scene, randomTradeOption, pokemon.level, TrainerSlot.NONE, false);
|
const tradePokemon = new EnemyPokemon(scene, randomTradeOption, pokemon.level, TrainerSlot.NONE, false);
|
||||||
// Extra shiny roll at 1/128 odds (boosted by events and charms)
|
// Extra shiny roll at 1/128 odds (boosted by events and charms)
|
||||||
if (!tradePokemon.shiny) {
|
if (!tradePokemon.shiny) {
|
||||||
const baseShinyChance = 512;
|
const shinyThreshold = new Utils.IntegerHolder(WONDER_TRADE_SHINY_CHANCE);
|
||||||
const shinyThreshold = new Utils.IntegerHolder(baseShinyChance);
|
|
||||||
if (scene.eventManager.isEventActive()) {
|
if (scene.eventManager.isEventActive()) {
|
||||||
shinyThreshold.value *= scene.eventManager.getShinyMultiplier();
|
shinyThreshold.value *= scene.eventManager.getShinyMultiplier();
|
||||||
}
|
}
|
||||||
scene.applyModifiers(ShinyRateBoosterModifier, true, shinyThreshold);
|
scene.applyModifiers(ShinyRateBoosterModifier, true, shinyThreshold);
|
||||||
|
|
||||||
// Base shiny chance of 512/65536 -> 1/128, affected by events and Shiny Charms
|
// Base shiny chance of 512/65536 -> 1/128, affected by events and Shiny Charms
|
||||||
// Maximum shiny chance of 4090/65536 -> 1/16, cannot improve further after that
|
// Maximum shiny chance of 4096/65536 -> 1/16, cannot improve further after that
|
||||||
const shinyChance = Math.min(shinyThreshold.value, 4090);
|
const shinyChance = Math.min(shinyThreshold.value, MAX_WONDER_TRADE_SHINY_CHANCE);
|
||||||
|
|
||||||
tradePokemon.trySetShinySeed(shinyChance, false);
|
tradePokemon.trySetShinySeed(shinyChance, false);
|
||||||
}
|
}
|
||||||
|
@ -255,8 +258,8 @@ export const GlobalTradeSystemEncounter: MysteryEncounter =
|
||||||
|
|
||||||
// If Pokemon is still not shiny or with HA, give the Pokemon a random Common egg move in its moveset
|
// If Pokemon is still not shiny or with HA, give the Pokemon a random Common egg move in its moveset
|
||||||
if (!tradePokemon.shiny && (!tradePokemon.species.abilityHidden || tradePokemon.abilityIndex < hiddenIndex)) {
|
if (!tradePokemon.shiny && (!tradePokemon.species.abilityHidden || tradePokemon.abilityIndex < hiddenIndex)) {
|
||||||
const eggMoves: Moves[] = speciesEggMoves[tradePokemon.getSpeciesForm().getRootSpeciesId()];
|
const eggMoves: Moves[] = tradePokemon.getEggMoves();
|
||||||
if (eggMoves) {
|
|
||||||
// Cannot gen the rare egg move, only 1 of the first 3 common moves
|
// Cannot gen the rare egg move, only 1 of the first 3 common moves
|
||||||
const eggMove = eggMoves[randSeedInt(3)];
|
const eggMove = eggMoves[randSeedInt(3)];
|
||||||
if (!tradePokemon.moveset.some(m => m?.moveId === eggMove)) {
|
if (!tradePokemon.moveset.some(m => m?.moveId === eggMove)) {
|
||||||
|
@ -268,7 +271,6 @@ export const GlobalTradeSystemEncounter: MysteryEncounter =
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
encounter.setDialogueToken("tradedPokemon", pokemon.getNameToRender());
|
encounter.setDialogueToken("tradedPokemon", pokemon.getNameToRender());
|
||||||
encounter.setDialogueToken("received", tradePokemon.getNameToRender());
|
encounter.setDialogueToken("received", tradePokemon.getNameToRender());
|
||||||
|
@ -480,7 +482,7 @@ function generateTradeOption(alreadyUsedSpecies: PokemonSpecies[], originalBst?:
|
||||||
if (validSpecies?.length > 20) {
|
if (validSpecies?.length > 20) {
|
||||||
validSpecies = randSeedShuffle(validSpecies);
|
validSpecies = randSeedShuffle(validSpecies);
|
||||||
newSpecies = validSpecies.pop();
|
newSpecies = validSpecies.pop();
|
||||||
while (isNullOrUndefined(newSpecies) || alreadyUsedSpecies.includes(newSpecies!)) {
|
while (isNullOrUndefined(newSpecies) || alreadyUsedSpecies.includes(newSpecies)) {
|
||||||
newSpecies = validSpecies.pop();
|
newSpecies = validSpecies.pop();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -39,7 +39,7 @@ export const TeleportingHijinksEncounter: MysteryEncounter =
|
||||||
.withEncounterTier(MysteryEncounterTier.COMMON)
|
.withEncounterTier(MysteryEncounterTier.COMMON)
|
||||||
.withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES)
|
.withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES)
|
||||||
.withSceneRequirement(new WaveModulusRequirement([1, 2, 3], 10)) // Must be in first 3 waves after boss wave
|
.withSceneRequirement(new WaveModulusRequirement([1, 2, 3], 10)) // Must be in first 3 waves after boss wave
|
||||||
.withSceneRequirement(new MoneyRequirement(undefined, MONEY_COST_MULTIPLIER)) // Must be able to pay teleport cost
|
.withSceneRequirement(new MoneyRequirement(0, MONEY_COST_MULTIPLIER)) // Must be able to pay teleport cost
|
||||||
.withAutoHideIntroVisuals(false)
|
.withAutoHideIntroVisuals(false)
|
||||||
.withCatchAllowed(true)
|
.withCatchAllowed(true)
|
||||||
.withIntroSpriteConfigs([
|
.withIntroSpriteConfigs([
|
||||||
|
@ -73,7 +73,7 @@ export const TeleportingHijinksEncounter: MysteryEncounter =
|
||||||
.withOption(
|
.withOption(
|
||||||
MysteryEncounterOptionBuilder
|
MysteryEncounterOptionBuilder
|
||||||
.newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT)
|
.newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT)
|
||||||
.withSceneMoneyRequirement(undefined, MONEY_COST_MULTIPLIER) // Must be able to pay teleport cost
|
.withSceneMoneyRequirement(0, MONEY_COST_MULTIPLIER) // Must be able to pay teleport cost
|
||||||
.withDialogue({
|
.withDialogue({
|
||||||
buttonLabel: `${namespace}.option.1.label`,
|
buttonLabel: `${namespace}.option.1.label`,
|
||||||
buttonTooltip: `${namespace}.option.1.tooltip`,
|
buttonTooltip: `${namespace}.option.1.tooltip`,
|
||||||
|
|
|
@ -34,7 +34,7 @@ export const ThePokemonSalesmanEncounter: MysteryEncounter =
|
||||||
MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.THE_POKEMON_SALESMAN)
|
MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.THE_POKEMON_SALESMAN)
|
||||||
.withEncounterTier(MysteryEncounterTier.ULTRA)
|
.withEncounterTier(MysteryEncounterTier.ULTRA)
|
||||||
.withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES)
|
.withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES)
|
||||||
.withSceneRequirement(new MoneyRequirement(undefined, MAX_POKEMON_PRICE_MULTIPLIER)) // Some costs may not be as significant, this is the max you'd pay
|
.withSceneRequirement(new MoneyRequirement(0, MAX_POKEMON_PRICE_MULTIPLIER)) // Some costs may not be as significant, this is the max you'd pay
|
||||||
.withAutoHideIntroVisuals(false)
|
.withAutoHideIntroVisuals(false)
|
||||||
.withIntroSpriteConfigs([
|
.withIntroSpriteConfigs([
|
||||||
{
|
{
|
||||||
|
@ -114,7 +114,7 @@ export const ThePokemonSalesmanEncounter: MysteryEncounter =
|
||||||
MysteryEncounterOptionBuilder
|
MysteryEncounterOptionBuilder
|
||||||
.newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT)
|
.newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT)
|
||||||
.withHasDexProgress(true)
|
.withHasDexProgress(true)
|
||||||
.withSceneMoneyRequirement(undefined, MAX_POKEMON_PRICE_MULTIPLIER) // Wave scaling money multiplier of 2
|
.withSceneMoneyRequirement(0, MAX_POKEMON_PRICE_MULTIPLIER) // Wave scaling money multiplier of 2
|
||||||
.withDialogue({
|
.withDialogue({
|
||||||
buttonLabel: `${namespace}.option.1.label`,
|
buttonLabel: `${namespace}.option.1.label`,
|
||||||
buttonTooltip: `${namespace}.option.1.tooltip`,
|
buttonTooltip: `${namespace}.option.1.tooltip`,
|
||||||
|
|
|
@ -324,21 +324,18 @@ export const TrainingSessionEncounter: MysteryEncounter =
|
||||||
const abilityIndex = encounter.misc.abilityIndex;
|
const abilityIndex = encounter.misc.abilityIndex;
|
||||||
if (!!playerPokemon.getFusionSpeciesForm()) {
|
if (!!playerPokemon.getFusionSpeciesForm()) {
|
||||||
playerPokemon.fusionAbilityIndex = abilityIndex;
|
playerPokemon.fusionAbilityIndex = abilityIndex;
|
||||||
if (!isNullOrUndefined(playerPokemon.fusionSpecies?.speciesId) && speciesStarters.hasOwnProperty(playerPokemon.fusionSpecies!.speciesId)) {
|
if (!isNullOrUndefined(playerPokemon.fusionSpecies?.speciesId) && speciesStarters.hasOwnProperty(playerPokemon.fusionSpecies.speciesId)) {
|
||||||
scene.gameData.starterData[playerPokemon.fusionSpecies!.speciesId]
|
scene.gameData.starterData[playerPokemon.fusionSpecies.speciesId]
|
||||||
.abilityAttr |=
|
.abilityAttr |=
|
||||||
abilityIndex !== 1 || playerPokemon.fusionSpecies!.ability2
|
abilityIndex !== 1 || playerPokemon.fusionSpecies.ability2
|
||||||
? Math.pow(2, playerPokemon.fusionAbilityIndex)
|
? Math.pow(2, playerPokemon.fusionAbilityIndex)
|
||||||
: AbilityAttr.ABILITY_HIDDEN;
|
: AbilityAttr.ABILITY_HIDDEN;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
playerPokemon.abilityIndex = abilityIndex;
|
playerPokemon.abilityIndex = abilityIndex;
|
||||||
if (
|
if (speciesStarters.hasOwnProperty(playerPokemon.species.speciesId)) {
|
||||||
speciesStarters.hasOwnProperty(playerPokemon.species.speciesId)
|
scene.gameData.starterData[playerPokemon.species.speciesId]
|
||||||
) {
|
.abilityAttr |=
|
||||||
scene.gameData.starterData[
|
|
||||||
playerPokemon.species.speciesId
|
|
||||||
].abilityAttr |=
|
|
||||||
abilityIndex !== 1 || playerPokemon.species.ability2
|
abilityIndex !== 1 || playerPokemon.species.ability2
|
||||||
? Math.pow(2, playerPokemon.abilityIndex)
|
? Math.pow(2, playerPokemon.abilityIndex)
|
||||||
: AbilityAttr.ABILITY_HIDDEN;
|
: AbilityAttr.ABILITY_HIDDEN;
|
||||||
|
|
|
@ -12,7 +12,6 @@ import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode
|
||||||
import { TrainerSlot } from "#app/data/trainer-config";
|
import { TrainerSlot } from "#app/data/trainer-config";
|
||||||
import { catchPokemon, getHighestLevelPlayerPokemon, getSpriteKeysFromPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils";
|
import { catchPokemon, getHighestLevelPlayerPokemon, getSpriteKeysFromPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils";
|
||||||
import PokemonData from "#app/system/pokemon-data";
|
import PokemonData from "#app/system/pokemon-data";
|
||||||
import { speciesEggMoves } from "#app/data/egg-moves";
|
|
||||||
import { isNullOrUndefined, randSeedInt } from "#app/utils";
|
import { isNullOrUndefined, randSeedInt } from "#app/utils";
|
||||||
import { Moves } from "#enums/moves";
|
import { Moves } from "#enums/moves";
|
||||||
import { BattlerIndex } from "#app/battle";
|
import { BattlerIndex } from "#app/battle";
|
||||||
|
@ -53,11 +52,9 @@ export const UncommonBreedEncounter: MysteryEncounter =
|
||||||
const level = getHighestLevelPlayerPokemon(scene, false, true).level - 2;
|
const level = getHighestLevelPlayerPokemon(scene, false, true).level - 2;
|
||||||
const species = scene.arena.randomSpecies(scene.currentBattle.waveIndex, level, 0, getPartyLuckValue(scene.getParty()), true);
|
const species = scene.arena.randomSpecies(scene.currentBattle.waveIndex, level, 0, getPartyLuckValue(scene.getParty()), true);
|
||||||
const pokemon = new EnemyPokemon(scene, species, level, TrainerSlot.NONE, true);
|
const pokemon = new EnemyPokemon(scene, species, level, TrainerSlot.NONE, true);
|
||||||
const speciesRootForm = pokemon.species.getRootSpeciesId();
|
|
||||||
|
|
||||||
// Pokemon will always have one of its egg moves in its moveset
|
// Pokemon will always have one of its egg moves in its moveset
|
||||||
if (speciesEggMoves.hasOwnProperty(speciesRootForm)) {
|
const eggMoves: Moves[] = pokemon.getEggMoves();
|
||||||
const eggMoves: Moves[] = speciesEggMoves[speciesRootForm];
|
|
||||||
const eggMoveIndex = randSeedInt(4);
|
const eggMoveIndex = randSeedInt(4);
|
||||||
const randomEggMove: Moves = eggMoves[eggMoveIndex];
|
const randomEggMove: Moves = eggMoves[eggMoveIndex];
|
||||||
encounter.misc = {
|
encounter.misc = {
|
||||||
|
@ -68,7 +65,6 @@ export const UncommonBreedEncounter: MysteryEncounter =
|
||||||
} else {
|
} else {
|
||||||
pokemon.moveset[0] = new PokemonMove(randomEggMove);
|
pokemon.moveset[0] = new PokemonMove(randomEggMove);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
encounter.misc.pokemon = pokemon;
|
encounter.misc.pokemon = pokemon;
|
||||||
|
|
||||||
|
@ -198,20 +194,7 @@ export const UncommonBreedEncounter: MysteryEncounter =
|
||||||
const pokemon = encounter.misc.pokemon;
|
const pokemon = encounter.misc.pokemon;
|
||||||
|
|
||||||
// Give 1 additional egg move
|
// Give 1 additional egg move
|
||||||
const previousEggMove = encounter.misc.eggMove;
|
givePokemonExtraEggMove(pokemon, encounter.misc.eggMove);
|
||||||
const speciesRootForm = pokemon.species.getRootSpeciesId();
|
|
||||||
if (speciesEggMoves.hasOwnProperty(speciesRootForm)) {
|
|
||||||
const eggMoves: Moves[] = speciesEggMoves[speciesRootForm];
|
|
||||||
let randomEggMove: Moves = eggMoves[randSeedInt(4)];
|
|
||||||
while (randomEggMove === previousEggMove) {
|
|
||||||
randomEggMove = eggMoves[randSeedInt(4)];
|
|
||||||
}
|
|
||||||
if (pokemon.moveset.length < 4) {
|
|
||||||
pokemon.moveset.push(new PokemonMove(randomEggMove));
|
|
||||||
} else {
|
|
||||||
pokemon.moveset[1] = new PokemonMove(randomEggMove);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
await catchPokemon(scene, pokemon, null, PokeballType.POKEBALL, false);
|
await catchPokemon(scene, pokemon, null, PokeballType.POKEBALL, false);
|
||||||
setEncounterRewards(scene, { fillRemaining: true });
|
setEncounterRewards(scene, { fillRemaining: true });
|
||||||
|
@ -240,20 +223,7 @@ export const UncommonBreedEncounter: MysteryEncounter =
|
||||||
const pokemon = encounter.misc.pokemon;
|
const pokemon = encounter.misc.pokemon;
|
||||||
|
|
||||||
// Give 1 additional egg move
|
// Give 1 additional egg move
|
||||||
const previousEggMove = encounter.misc.eggMove;
|
givePokemonExtraEggMove(pokemon, encounter.misc.eggMove);
|
||||||
const speciesRootForm = pokemon.species.getRootSpeciesId();
|
|
||||||
if (speciesEggMoves.hasOwnProperty(speciesRootForm)) {
|
|
||||||
const eggMoves: Moves[] = speciesEggMoves[speciesRootForm];
|
|
||||||
let randomEggMove: Moves = eggMoves[randSeedInt(4)];
|
|
||||||
while (randomEggMove === previousEggMove) {
|
|
||||||
randomEggMove = eggMoves[randSeedInt(4)];
|
|
||||||
}
|
|
||||||
if (pokemon.moveset.length < 4) {
|
|
||||||
pokemon.moveset.push(new PokemonMove(randomEggMove));
|
|
||||||
} else {
|
|
||||||
pokemon.moveset[1] = new PokemonMove(randomEggMove);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Roll IVs a second time
|
// Roll IVs a second time
|
||||||
pokemon.ivs = pokemon.ivs.map(iv => {
|
pokemon.ivs = pokemon.ivs.map(iv => {
|
||||||
|
@ -271,3 +241,16 @@ export const UncommonBreedEncounter: MysteryEncounter =
|
||||||
.build()
|
.build()
|
||||||
)
|
)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
|
function givePokemonExtraEggMove(pokemon: EnemyPokemon, previousEggMove: Moves) {
|
||||||
|
const eggMoves: Moves[] = pokemon.getEggMoves();
|
||||||
|
let randomEggMove: Moves = eggMoves[randSeedInt(4)];
|
||||||
|
while (randomEggMove === previousEggMove) {
|
||||||
|
randomEggMove = eggMoves[randSeedInt(4)];
|
||||||
|
}
|
||||||
|
if (pokemon.moveset.length < 4) {
|
||||||
|
pokemon.moveset.push(new PokemonMove(randomEggMove));
|
||||||
|
} else {
|
||||||
|
pokemon.moveset[1] = new PokemonMove(randomEggMove);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -449,7 +449,7 @@ function getTransformedSpecies(originalBst: number, bstSearchRange: [number, num
|
||||||
if (validSpecies?.length > 20) {
|
if (validSpecies?.length > 20) {
|
||||||
validSpecies = randSeedShuffle(validSpecies);
|
validSpecies = randSeedShuffle(validSpecies);
|
||||||
newSpecies = validSpecies.pop();
|
newSpecies = validSpecies.pop();
|
||||||
while (isNullOrUndefined(newSpecies) || alreadyUsedSpecies.includes(newSpecies!)) {
|
while (isNullOrUndefined(newSpecies) || alreadyUsedSpecies.includes(newSpecies)) {
|
||||||
newSpecies = validSpecies.pop();
|
newSpecies = validSpecies.pop();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -459,7 +459,7 @@ function getTransformedSpecies(originalBst: number, bstSearchRange: [number, num
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return newSpecies!;
|
return newSpecies;
|
||||||
}
|
}
|
||||||
|
|
||||||
function doShowDreamBackground(scene: BattleScene) {
|
function doShowDreamBackground(scene: BattleScene) {
|
||||||
|
@ -554,16 +554,16 @@ function doSideBySideTransformations(scene: BattleScene, transformations: Pokemo
|
||||||
async function addEggMoveToNewPokemonMoveset(scene: BattleScene, newPokemon: PlayerPokemon, speciesRootForm: Species): Promise<number | null> {
|
async function addEggMoveToNewPokemonMoveset(scene: BattleScene, newPokemon: PlayerPokemon, speciesRootForm: Species): Promise<number | null> {
|
||||||
let eggMoveIndex: null | number = null;
|
let eggMoveIndex: null | number = null;
|
||||||
if (speciesEggMoves.hasOwnProperty(speciesRootForm)) {
|
if (speciesEggMoves.hasOwnProperty(speciesRootForm)) {
|
||||||
const eggMoves: Moves[] = speciesEggMoves[speciesRootForm].slice(0);
|
const eggMoves: Moves[] = newPokemon.getEggMoves().slice(0);
|
||||||
const eggMoveIndices = [0, 1, 2, 3];
|
const eggMoveIndices = [0, 1, 2, 3];
|
||||||
randSeedShuffle(eggMoveIndices);
|
randSeedShuffle(eggMoveIndices);
|
||||||
let randomEggMoveIndex = eggMoveIndices.pop();
|
let randomEggMoveIndex = eggMoveIndices.pop();
|
||||||
let randomEggMove = !isNullOrUndefined(randomEggMoveIndex) ? eggMoves[randomEggMoveIndex!] : null;
|
let randomEggMove = !isNullOrUndefined(randomEggMoveIndex) ? eggMoves[randomEggMoveIndex] : null;
|
||||||
let retries = 0;
|
let retries = 0;
|
||||||
while (retries < 3 && (!randomEggMove || newPokemon.moveset.some(m => m?.moveId === randomEggMove))) {
|
while (retries < 3 && (!randomEggMove || newPokemon.moveset.some(m => m?.moveId === randomEggMove))) {
|
||||||
// If Pokemon already knows this move, roll for another egg move
|
// If Pokemon already knows this move, roll for another egg move
|
||||||
randomEggMoveIndex = eggMoveIndices.pop();
|
randomEggMoveIndex = eggMoveIndices.pop();
|
||||||
randomEggMove = !isNullOrUndefined(randomEggMoveIndex) ? eggMoves[randomEggMoveIndex!] : null;
|
randomEggMove = !isNullOrUndefined(randomEggMoveIndex) ? eggMoves[randomEggMoveIndex] : null;
|
||||||
retries++;
|
retries++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -579,7 +579,7 @@ async function addEggMoveToNewPokemonMoveset(scene: BattleScene, newPokemon: Pla
|
||||||
|
|
||||||
// For pokemon that the player owns (including ones just caught), unlock the egg move
|
// For pokemon that the player owns (including ones just caught), unlock the egg move
|
||||||
if (!isNullOrUndefined(randomEggMoveIndex) && !!scene.gameData.dexData[speciesRootForm].caughtAttr) {
|
if (!isNullOrUndefined(randomEggMoveIndex) && !!scene.gameData.dexData[speciesRootForm].caughtAttr) {
|
||||||
await scene.gameData.setEggMoveUnlocked(getPokemonSpecies(speciesRootForm), randomEggMoveIndex!, true);
|
await scene.gameData.setEggMoveUnlocked(getPokemonSpecies(speciesRootForm), randomEggMoveIndex, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -208,7 +208,7 @@ export class MysteryEncounterOptionBuilder implements Partial<IMysteryEncounterO
|
||||||
return Object.assign(this, { requirements: this.requirements });
|
return Object.assign(this, { requirements: this.requirements });
|
||||||
}
|
}
|
||||||
|
|
||||||
withSceneMoneyRequirement(requiredMoney?: number, scalingMultiplier?: number) {
|
withSceneMoneyRequirement(requiredMoney: number, scalingMultiplier?: number) {
|
||||||
return this.withSceneRequirement(new MoneyRequirement(requiredMoney, scalingMultiplier));
|
return this.withSceneRequirement(new MoneyRequirement(requiredMoney, scalingMultiplier));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -165,9 +165,9 @@ export class WaveRangeRequirement extends EncounterSceneRequirement {
|
||||||
}
|
}
|
||||||
|
|
||||||
override meetsRequirement(scene: BattleScene): boolean {
|
override meetsRequirement(scene: BattleScene): boolean {
|
||||||
if (!isNullOrUndefined(this.waveRange) && this.waveRange?.[0] <= this.waveRange?.[1]) {
|
if (!isNullOrUndefined(this.waveRange) && this.waveRange[0] <= this.waveRange[1]) {
|
||||||
const waveIndex = scene.currentBattle.waveIndex;
|
const waveIndex = scene.currentBattle.waveIndex;
|
||||||
if (waveIndex >= 0 && (this.waveRange?.[0] >= 0 && this.waveRange?.[0] > waveIndex) || (this.waveRange?.[1] >= 0 && this.waveRange?.[1] < waveIndex)) {
|
if (waveIndex >= 0 && (this.waveRange[0] >= 0 && this.waveRange[0] > waveIndex) || (this.waveRange[1] >= 0 && this.waveRange[1] < waveIndex)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -251,7 +251,7 @@ export class WeatherRequirement extends EncounterSceneRequirement {
|
||||||
const currentWeather = scene.arena.weather?.weatherType;
|
const currentWeather = scene.arena.weather?.weatherType;
|
||||||
let token = "";
|
let token = "";
|
||||||
if (!isNullOrUndefined(currentWeather)) {
|
if (!isNullOrUndefined(currentWeather)) {
|
||||||
token = WeatherType[currentWeather!].replace("_", " ").toLocaleLowerCase();
|
token = WeatherType[currentWeather].replace("_", " ").toLocaleLowerCase();
|
||||||
}
|
}
|
||||||
return ["weather", token];
|
return ["weather", token];
|
||||||
}
|
}
|
||||||
|
@ -274,9 +274,9 @@ export class PartySizeRequirement extends EncounterSceneRequirement {
|
||||||
}
|
}
|
||||||
|
|
||||||
override meetsRequirement(scene: BattleScene): boolean {
|
override meetsRequirement(scene: BattleScene): boolean {
|
||||||
if (!isNullOrUndefined(this.partySizeRange) && this.partySizeRange?.[0] <= this.partySizeRange?.[1]) {
|
if (!isNullOrUndefined(this.partySizeRange) && this.partySizeRange[0] <= this.partySizeRange[1]) {
|
||||||
const partySize = this.excludeDisallowedPokemon ? scene.getParty().filter(p => p.isAllowedInBattle()).length : scene.getParty().length;
|
const partySize = this.excludeDisallowedPokemon ? scene.getParty().filter(p => p.isAllowedInBattle()).length : scene.getParty().length;
|
||||||
if (partySize >= 0 && (this.partySizeRange?.[0] >= 0 && this.partySizeRange?.[0] > partySize) || (this.partySizeRange?.[1] >= 0 && this.partySizeRange?.[1] < partySize)) {
|
if (partySize >= 0 && (this.partySizeRange[0] >= 0 && this.partySizeRange[0] > partySize) || (this.partySizeRange[1] >= 0 && this.partySizeRange[1] < partySize)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -326,7 +326,7 @@ export class MoneyRequirement extends EncounterSceneRequirement {
|
||||||
requiredMoney: number; // Static value
|
requiredMoney: number; // Static value
|
||||||
scalingMultiplier: number; // Calculates required money based off wave index
|
scalingMultiplier: number; // Calculates required money based off wave index
|
||||||
|
|
||||||
constructor(requiredMoney?: number, scalingMultiplier?: number) {
|
constructor(requiredMoney: number, scalingMultiplier?: number) {
|
||||||
super();
|
super();
|
||||||
this.requiredMoney = requiredMoney ?? 0;
|
this.requiredMoney = requiredMoney ?? 0;
|
||||||
this.scalingMultiplier = scalingMultiplier ?? 0;
|
this.scalingMultiplier = scalingMultiplier ?? 0;
|
||||||
|
@ -418,8 +418,8 @@ export class NatureRequirement extends EncounterPokemonRequirement {
|
||||||
}
|
}
|
||||||
|
|
||||||
override getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] {
|
override getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] {
|
||||||
if (!isNullOrUndefined(pokemon?.nature) && this.requiredNature.includes(pokemon!.nature)) {
|
if (!isNullOrUndefined(pokemon?.nature) && this.requiredNature.includes(pokemon.nature)) {
|
||||||
return ["nature", Nature[pokemon!.nature]];
|
return ["nature", Nature[pokemon.nature]];
|
||||||
}
|
}
|
||||||
return ["nature", ""];
|
return ["nature", ""];
|
||||||
}
|
}
|
||||||
|
@ -620,7 +620,7 @@ export class StatusEffectRequirement extends EncounterPokemonRequirement {
|
||||||
return this.requiredStatusEffect.some((statusEffect) => {
|
return this.requiredStatusEffect.some((statusEffect) => {
|
||||||
if (statusEffect === StatusEffect.NONE) {
|
if (statusEffect === StatusEffect.NONE) {
|
||||||
// StatusEffect.NONE also checks for null or undefined status
|
// StatusEffect.NONE also checks for null or undefined status
|
||||||
return isNullOrUndefined(pokemon.status) || isNullOrUndefined(pokemon.status!.effect) || pokemon.status?.effect === statusEffect;
|
return isNullOrUndefined(pokemon.status) || isNullOrUndefined(pokemon.status.effect) || pokemon.status.effect === statusEffect;
|
||||||
} else {
|
} else {
|
||||||
return pokemon.status?.effect === statusEffect;
|
return pokemon.status?.effect === statusEffect;
|
||||||
}
|
}
|
||||||
|
@ -628,12 +628,11 @@ export class StatusEffectRequirement extends EncounterPokemonRequirement {
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
// for an inverted query, we only want to get the pokemon that don't have ANY of the listed StatusEffects
|
// for an inverted query, we only want to get the pokemon that don't have ANY of the listed StatusEffects
|
||||||
// return partyPokemon.filter((pokemon) => this.requiredStatusEffect.filter((statusEffect) => pokemon.status?.effect === statusEffect).length === 0);
|
|
||||||
return partyPokemon.filter((pokemon) => {
|
return partyPokemon.filter((pokemon) => {
|
||||||
return !this.requiredStatusEffect.some((statusEffect) => {
|
return !this.requiredStatusEffect.some((statusEffect) => {
|
||||||
if (statusEffect === StatusEffect.NONE) {
|
if (statusEffect === StatusEffect.NONE) {
|
||||||
// StatusEffect.NONE also checks for null or undefined status
|
// StatusEffect.NONE also checks for null or undefined status
|
||||||
return isNullOrUndefined(pokemon.status) || isNullOrUndefined(pokemon.status!.effect) || pokemon.status?.effect === statusEffect;
|
return isNullOrUndefined(pokemon.status) || isNullOrUndefined(pokemon.status.effect) || pokemon.status.effect === statusEffect;
|
||||||
} else {
|
} else {
|
||||||
return pokemon.status?.effect === statusEffect;
|
return pokemon.status?.effect === statusEffect;
|
||||||
}
|
}
|
||||||
|
@ -645,7 +644,7 @@ export class StatusEffectRequirement extends EncounterPokemonRequirement {
|
||||||
override getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] {
|
override getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] {
|
||||||
const reqStatus = this.requiredStatusEffect.filter((a) => {
|
const reqStatus = this.requiredStatusEffect.filter((a) => {
|
||||||
if (a === StatusEffect.NONE) {
|
if (a === StatusEffect.NONE) {
|
||||||
return isNullOrUndefined(pokemon?.status) || isNullOrUndefined(pokemon!.status!.effect) || pokemon!.status!.effect === a;
|
return isNullOrUndefined(pokemon?.status) || isNullOrUndefined(pokemon.status.effect) || pokemon.status.effect === a;
|
||||||
}
|
}
|
||||||
return pokemon!.status?.effect === a;
|
return pokemon!.status?.effect === a;
|
||||||
});
|
});
|
||||||
|
@ -988,8 +987,9 @@ export class HealthRatioRequirement extends EncounterPokemonRequirement {
|
||||||
}
|
}
|
||||||
|
|
||||||
override getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] {
|
override getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] {
|
||||||
if (!isNullOrUndefined(pokemon?.getHpRatio())) {
|
const hpRatio = pokemon?.getHpRatio();
|
||||||
return ["healthRatio", Math.floor(pokemon!.getHpRatio() * 100).toString() + "%"];
|
if (!isNullOrUndefined(hpRatio)) {
|
||||||
|
return ["healthRatio", Math.floor(hpRatio * 100).toString() + "%"];
|
||||||
}
|
}
|
||||||
return ["healthRatio", ""];
|
return ["healthRatio", ""];
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,7 +17,7 @@ export function getEncounterText(scene: BattleScene, keyOrString?: string, prima
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
let textString: string | null = getTextWithDialogueTokens(scene, keyOrString!);
|
let textString: string | null = getTextWithDialogueTokens(scene, keyOrString);
|
||||||
|
|
||||||
// Can only color the text if a Primary Style is defined
|
// Can only color the text if a Primary Style is defined
|
||||||
// primaryStyle is applied to all text that does not have its own specified style
|
// primaryStyle is applied to all text that does not have its own specified style
|
||||||
|
|
|
@ -135,7 +135,7 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig:
|
||||||
scene.currentBattle.trainer.destroy();
|
scene.currentBattle.trainer.destroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
trainerConfig = partyConfig?.trainerConfig ? partyConfig?.trainerConfig : trainerConfigs[trainerType!];
|
trainerConfig = partyTrainerConfig ? partyTrainerConfig : trainerConfigs[trainerType!];
|
||||||
|
|
||||||
const doubleTrainer = trainerConfig.doubleOnly || (trainerConfig.hasDouble && !!partyConfig.doubleBattle);
|
const doubleTrainer = trainerConfig.doubleOnly || (trainerConfig.hasDouble && !!partyConfig.doubleBattle);
|
||||||
doubleBattle = doubleTrainer;
|
doubleBattle = doubleTrainer;
|
||||||
|
@ -166,7 +166,7 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig:
|
||||||
// This can be amplified or counteracted by setting levelAdditiveModifier in config
|
// This can be amplified or counteracted by setting levelAdditiveModifier in config
|
||||||
// levelAdditiveModifier value of 0.5 will halve the modifier scaling, 2 will double it, etc.
|
// levelAdditiveModifier value of 0.5 will halve the modifier scaling, 2 will double it, etc.
|
||||||
// Leaving null/undefined will disable level scaling
|
// Leaving null/undefined will disable level scaling
|
||||||
const mult: number = !isNullOrUndefined(partyConfig.levelAdditiveModifier) ? partyConfig.levelAdditiveModifier! : 0;
|
const mult: number = !isNullOrUndefined(partyConfig.levelAdditiveModifier) ? partyConfig.levelAdditiveModifier : 0;
|
||||||
const additive = Math.max(Math.round((scene.currentBattle.waveIndex / 10) * mult), 0);
|
const additive = Math.max(Math.round((scene.currentBattle.waveIndex / 10) * mult), 0);
|
||||||
battle.enemyLevels = battle.enemyLevels.map(level => level + additive);
|
battle.enemyLevels = battle.enemyLevels.map(level => level + additive);
|
||||||
|
|
||||||
|
@ -226,7 +226,7 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig:
|
||||||
|
|
||||||
// Set form
|
// Set form
|
||||||
if (!isNullOrUndefined(config.nickname)) {
|
if (!isNullOrUndefined(config.nickname)) {
|
||||||
enemyPokemon.nickname = btoa(unescape(encodeURIComponent(config.nickname!)));
|
enemyPokemon.nickname = btoa(unescape(encodeURIComponent(config.nickname)));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Generate new id, reset status and HP in case using data source
|
// Generate new id, reset status and HP in case using data source
|
||||||
|
@ -236,29 +236,29 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig:
|
||||||
|
|
||||||
// Set form
|
// Set form
|
||||||
if (!isNullOrUndefined(config.formIndex)) {
|
if (!isNullOrUndefined(config.formIndex)) {
|
||||||
enemyPokemon.formIndex = config.formIndex!;
|
enemyPokemon.formIndex = config.formIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set shiny
|
// Set shiny
|
||||||
if (!isNullOrUndefined(config.shiny)) {
|
if (!isNullOrUndefined(config.shiny)) {
|
||||||
enemyPokemon.shiny = config.shiny!;
|
enemyPokemon.shiny = config.shiny;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set Variant
|
// Set Variant
|
||||||
if (enemyPokemon.shiny && !isNullOrUndefined(config.variant)) {
|
if (enemyPokemon.shiny && !isNullOrUndefined(config.variant)) {
|
||||||
enemyPokemon.variant = config.variant!;
|
enemyPokemon.variant = config.variant;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set custom mystery encounter data fields (such as sprite scale, custom abilities, types, etc.)
|
// Set custom mystery encounter data fields (such as sprite scale, custom abilities, types, etc.)
|
||||||
if (!isNullOrUndefined(config.mysteryEncounterPokemonData)) {
|
if (!isNullOrUndefined(config.mysteryEncounterPokemonData)) {
|
||||||
enemyPokemon.mysteryEncounterPokemonData = config.mysteryEncounterPokemonData!;
|
enemyPokemon.mysteryEncounterPokemonData = config.mysteryEncounterPokemonData;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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);
|
||||||
if (!isNullOrUndefined(config.bossSegmentModifier)) {
|
if (!isNullOrUndefined(config.bossSegmentModifier)) {
|
||||||
segments += config.bossSegmentModifier!;
|
segments += config.bossSegmentModifier;
|
||||||
}
|
}
|
||||||
enemyPokemon.setBoss(true, segments);
|
enemyPokemon.setBoss(true, segments);
|
||||||
}
|
}
|
||||||
|
@ -294,18 +294,18 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig:
|
||||||
|
|
||||||
// Set ability
|
// Set ability
|
||||||
if (!isNullOrUndefined(config.abilityIndex)) {
|
if (!isNullOrUndefined(config.abilityIndex)) {
|
||||||
enemyPokemon.abilityIndex = config.abilityIndex!;
|
enemyPokemon.abilityIndex = config.abilityIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set gender
|
// Set gender
|
||||||
if (!isNullOrUndefined(config.gender)) {
|
if (!isNullOrUndefined(config.gender)) {
|
||||||
enemyPokemon.gender = config.gender!;
|
enemyPokemon.gender = config.gender!;
|
||||||
enemyPokemon.summonData.gender = config.gender!;
|
enemyPokemon.summonData.gender = config.gender;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set AI type
|
// Set AI type
|
||||||
if (!isNullOrUndefined(config.aiType)) {
|
if (!isNullOrUndefined(config.aiType)) {
|
||||||
enemyPokemon.aiType = config.aiType!;
|
enemyPokemon.aiType = config.aiType;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set moves
|
// Set moves
|
||||||
|
|
|
@ -218,7 +218,7 @@ export function getRandomSpeciesByStarterTier(starterTiers: number | [number, nu
|
||||||
.map(s => [getPokemonSpecies(s[0]), s[1]]);
|
.map(s => [getPokemonSpecies(s[0]), s[1]]);
|
||||||
|
|
||||||
if (types && types.length > 0) {
|
if (types && types.length > 0) {
|
||||||
filteredSpecies = filteredSpecies.filter(s => types.includes(s[0].type1) || (!isNullOrUndefined(s[0].type2) && types.includes(s[0].type2!)));
|
filteredSpecies = filteredSpecies.filter(s => types.includes(s[0].type1) || (!isNullOrUndefined(s[0].type2) && types.includes(s[0].type2)));
|
||||||
}
|
}
|
||||||
|
|
||||||
// If no filtered mons exist at specified starter tiers, will expand starter search range until there are
|
// If no filtered mons exist at specified starter tiers, will expand starter search range until there are
|
||||||
|
|
|
@ -86,7 +86,7 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!isNullOrUndefined(result.species)) {
|
if (!isNullOrUndefined(result.species)) {
|
||||||
const keys = getSpriteKeysFromSpecies(result.species!);
|
const keys = getSpriteKeysFromSpecies(result.species);
|
||||||
result.spriteKey = keys.spriteKey;
|
result.spriteKey = keys.spriteKey;
|
||||||
result.fileRoot = keys.fileRoot;
|
result.fileRoot = keys.fileRoot;
|
||||||
result.isPokemon = true;
|
result.isPokemon = true;
|
||||||
|
|
|
@ -1258,8 +1258,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||||
return allAbilities[Overrides.OPP_ABILITY_OVERRIDE];
|
return allAbilities[Overrides.OPP_ABILITY_OVERRIDE];
|
||||||
}
|
}
|
||||||
if (this.isFusion()) {
|
if (this.isFusion()) {
|
||||||
if (!isNullOrUndefined(this.fusionMysteryEncounterPokemonData?.ability) && this.fusionMysteryEncounterPokemonData!.ability !== -1) {
|
if (!isNullOrUndefined(this.fusionMysteryEncounterPokemonData?.ability) && this.fusionMysteryEncounterPokemonData.ability !== -1) {
|
||||||
return allAbilities[this.fusionMysteryEncounterPokemonData!.ability];
|
return allAbilities[this.fusionMysteryEncounterPokemonData.ability];
|
||||||
} else {
|
} else {
|
||||||
return allAbilities[this.getFusionSpeciesForm(ignoreOverride).getAbility(this.fusionAbilityIndex)];
|
return allAbilities[this.getFusionSpeciesForm(ignoreOverride).getAbility(this.fusionAbilityIndex)];
|
||||||
}
|
}
|
||||||
|
|
|
@ -252,13 +252,13 @@ export class SelectModifierPhase extends BattlePhase {
|
||||||
|
|
||||||
let multiplier = 1;
|
let multiplier = 1;
|
||||||
if (!isNullOrUndefined(this.customModifierSettings?.rerollMultiplier)) {
|
if (!isNullOrUndefined(this.customModifierSettings?.rerollMultiplier)) {
|
||||||
if (this.customModifierSettings!.rerollMultiplier! < 0) {
|
if (this.customModifierSettings.rerollMultiplier < 0) {
|
||||||
// Completely overrides reroll cost to -1 and early exits
|
// Completely overrides reroll cost to -1 and early exits
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Otherwise, continue with custom multiplier
|
// Otherwise, continue with custom multiplier
|
||||||
multiplier = this.customModifierSettings!.rerollMultiplier!;
|
multiplier = this.customModifierSettings.rerollMultiplier;
|
||||||
}
|
}
|
||||||
return Math.min(Math.ceil(this.scene.currentBattle.waveIndex / 10) * baseValue * Math.pow(2, this.rerollCount) * multiplier, Number.MAX_SAFE_INTEGER);
|
return Math.min(Math.ceil(this.scene.currentBattle.waveIndex / 10) * baseValue * Math.pow(2, this.rerollCount) * multiplier, Number.MAX_SAFE_INTEGER);
|
||||||
}
|
}
|
||||||
|
|
|
@ -114,7 +114,7 @@ export async function runSelectMysteryEncounterOption(game: GameManager, optionN
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isNullOrUndefined(secondaryOptionSelect?.pokemonNo)) {
|
if (!isNullOrUndefined(secondaryOptionSelect?.pokemonNo)) {
|
||||||
await handleSecondaryOptionSelect(game, secondaryOptionSelect!.pokemonNo, secondaryOptionSelect!.optionNo);
|
await handleSecondaryOptionSelect(game, secondaryOptionSelect.pokemonNo, secondaryOptionSelect.optionNo);
|
||||||
} else {
|
} else {
|
||||||
uiHandler.processInput(Button.ACTION);
|
uiHandler.processInput(Button.ACTION);
|
||||||
}
|
}
|
||||||
|
|
|
@ -195,7 +195,7 @@ export default class GameManager {
|
||||||
async runToMysteryEncounter(encounterType?: MysteryEncounterType, species?: Species[]) {
|
async runToMysteryEncounter(encounterType?: MysteryEncounterType, species?: Species[]) {
|
||||||
if (!isNullOrUndefined(encounterType)) {
|
if (!isNullOrUndefined(encounterType)) {
|
||||||
this.override.disableTrainerWaves();
|
this.override.disableTrainerWaves();
|
||||||
this.override.mysteryEncounter(encounterType!);
|
this.override.mysteryEncounter(encounterType);
|
||||||
}
|
}
|
||||||
|
|
||||||
await this.runToTitle();
|
await this.runToTitle();
|
||||||
|
|
|
@ -95,8 +95,8 @@ export default class MysteryEncounterUiHandler extends UiHandler {
|
||||||
super.show(args);
|
super.show(args);
|
||||||
|
|
||||||
this.overrideSettings = args[0] as OptionSelectSettings ?? {};
|
this.overrideSettings = args[0] as OptionSelectSettings ?? {};
|
||||||
const showDescriptionContainer = isNullOrUndefined(this.overrideSettings?.hideDescription) ? true : !this.overrideSettings?.hideDescription;
|
const showDescriptionContainer = isNullOrUndefined(this.overrideSettings?.hideDescription) ? true : !this.overrideSettings.hideDescription;
|
||||||
const slideInDescription = isNullOrUndefined(this.overrideSettings?.slideInDescription) ? true : this.overrideSettings?.slideInDescription;
|
const slideInDescription = isNullOrUndefined(this.overrideSettings?.slideInDescription) ? true : this.overrideSettings.slideInDescription;
|
||||||
const startingCursorIndex = this.overrideSettings?.startingCursorIndex ?? 0;
|
const startingCursorIndex = this.overrideSettings?.startingCursorIndex ?? 0;
|
||||||
|
|
||||||
this.cursorContainer.setVisible(true);
|
this.cursorContainer.setVisible(true);
|
||||||
|
|
|
@ -584,7 +584,7 @@ export function capitalizeString(str: string, sep: string, lowerFirstChar: boole
|
||||||
* Returns if an object is null or undefined
|
* Returns if an object is null or undefined
|
||||||
* @param object
|
* @param object
|
||||||
*/
|
*/
|
||||||
export function isNullOrUndefined(object: any): boolean {
|
export function isNullOrUndefined(object: any): object is undefined | null {
|
||||||
return null === object || undefined === object;
|
return null === object || undefined === object;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue