mirror of
https://github.com/pagefaultgames/pokerogue.git
synced 2025-07-13 11:52:18 +02:00
Compare commits
13 Commits
4277439a2d
...
caeb22c26b
Author | SHA1 | Date | |
---|---|---|---|
|
caeb22c26b | ||
|
aaa96ebe0e | ||
|
49c365f154 | ||
|
b524be1db1 | ||
|
c4c4774528 | ||
|
4ffff8e1ee | ||
|
5c327e347a | ||
|
79f69ddfe0 | ||
|
0da469d7a3 | ||
|
ae2928e1c9 | ||
|
37ebbd28d5 | ||
|
d71451fc23 | ||
|
34474fb10e |
@ -11,6 +11,7 @@ import { BattleSpec } from "./enums/battle-spec";
|
||||
import { PlayerGender } from "./system/game-data";
|
||||
import { MoneyMultiplierModifier, PokemonHeldItemModifier } from "./modifier/modifier";
|
||||
import { PokeballType } from "./data/pokeball";
|
||||
import {trainerConfigs} from "#app/data/trainer-config";
|
||||
|
||||
export enum BattleType {
|
||||
WILD,
|
||||
@ -309,6 +310,10 @@ function getRandomTrainerFunc(trainerPool: (TrainerType | TrainerType[])[]): Get
|
||||
: trainerPoolEntry;
|
||||
trainerTypes.push(trainerType);
|
||||
}
|
||||
// If the trainer type has a double variant, there's a 33% chance of it being a double battle
|
||||
if (trainerConfigs[trainerTypes[rand]].trainerTypeDouble) {
|
||||
return new Trainer(scene, trainerTypes[rand], Utils.randSeedInt(3) ? TrainerVariant.DOUBLE : TrainerVariant.DEFAULT);
|
||||
}
|
||||
return new Trainer(scene, trainerTypes[rand], TrainerVariant.DEFAULT);
|
||||
};
|
||||
}
|
||||
@ -331,15 +336,15 @@ export const fixedBattles: FixedBattleConfigs = {
|
||||
[145]: new FixedBattleConfig().setBattleType(BattleType.TRAINER)
|
||||
.setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_5, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT)),
|
||||
[182]: new FixedBattleConfig().setBattleType(BattleType.TRAINER)
|
||||
.setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.LORELEI, TrainerType.WILL, TrainerType.SIDNEY, TrainerType.AARON, TrainerType.SHAUNTAL, TrainerType.MALVA, [ TrainerType.HALA, TrainerType.MOLAYNE ], TrainerType.RIKA, TrainerType.CRISPIN ])),
|
||||
.setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.LORELEI, TrainerType.WILL, TrainerType.SIDNEY, TrainerType.AARON, TrainerType.SHAUNTAL, TrainerType.MALVA, [ TrainerType.HALA, TrainerType.MOLAYNE ],TrainerType.MARNIE_ELITE, TrainerType.RIKA, TrainerType.CRISPIN ])),
|
||||
[184]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(182)
|
||||
.setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.BRUNO, TrainerType.KOGA, TrainerType.PHOEBE, TrainerType.BERTHA, TrainerType.MARSHAL, TrainerType.SIEBOLD, TrainerType.OLIVIA, TrainerType.POPPY, TrainerType.AMARYS ])),
|
||||
.setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.BRUNO, TrainerType.KOGA, TrainerType.PHOEBE, TrainerType.BERTHA, TrainerType.MARSHAL, TrainerType.SIEBOLD, TrainerType.OLIVIA, TrainerType.NESSA_ELITE, TrainerType.POPPY, TrainerType.AMARYS ])),
|
||||
[186]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(182)
|
||||
.setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.AGATHA, TrainerType.BRUNO, TrainerType.GLACIA, TrainerType.FLINT, TrainerType.GRIMSLEY, TrainerType.WIKSTROM, TrainerType.ACEROLA, TrainerType.LARRY_ELITE, TrainerType.LACEY ])),
|
||||
.setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.AGATHA, TrainerType.BRUNO, TrainerType.GLACIA, TrainerType.FLINT, TrainerType.GRIMSLEY, TrainerType.WIKSTROM, TrainerType.ACEROLA, [TrainerType.BEA_ELITE,TrainerType.ALLISTER_ELITE], TrainerType.LARRY_ELITE, TrainerType.LACEY ])),
|
||||
[188]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(182)
|
||||
.setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.LANCE, TrainerType.KAREN, TrainerType.DRAKE, TrainerType.LUCIAN, TrainerType.CAITLIN, TrainerType.DRASNA, TrainerType.KAHILI, TrainerType.HASSEL, TrainerType.DRAYTON ])),
|
||||
.setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.LANCE, TrainerType.KAREN, TrainerType.DRAKE, TrainerType.LUCIAN, TrainerType.CAITLIN, TrainerType.DRASNA, TrainerType.KAHILI,TrainerType.RAIHAN_ELITE, TrainerType.HASSEL, TrainerType.DRAYTON ])),
|
||||
[190]: new FixedBattleConfig().setBattleType(BattleType.TRAINER).setSeedOffsetWave(182)
|
||||
.setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.BLUE, [ TrainerType.RED, TrainerType.LANCE_CHAMPION ], [ TrainerType.STEVEN, TrainerType.WALLACE ], TrainerType.CYNTHIA, [ TrainerType.ALDER, TrainerType.IRIS ], TrainerType.DIANTHA, TrainerType.HAU, [ TrainerType.GEETA, TrainerType.NEMONA ], TrainerType.KIERAN, TrainerType.LEON ])),
|
||||
.setGetTrainerFunc(getRandomTrainerFunc([ TrainerType.BLUE, [ TrainerType.RED, TrainerType.LANCE_CHAMPION ], [ TrainerType.STEVEN, TrainerType.WALLACE ], TrainerType.CYNTHIA, [ TrainerType.ALDER, TrainerType.IRIS ], TrainerType.DIANTHA, TrainerType.HAU,TrainerType.LEON, [ TrainerType.GEETA, TrainerType.NEMONA ], TrainerType.KIERAN])),
|
||||
[195]: new FixedBattleConfig().setBattleType(BattleType.TRAINER)
|
||||
.setGetTrainerFunc(scene => new Trainer(scene, TrainerType.RIVAL_6, scene.gameData.gender === PlayerGender.MALE ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT))
|
||||
};
|
||||
|
@ -20,8 +20,9 @@ import { SpeciesFormChangeManualTrigger } from "./pokemon-forms";
|
||||
import { Abilities } from "./enums/abilities";
|
||||
import i18next, { Localizable } from "#app/plugins/i18n.js";
|
||||
import { Command } from "../ui/command-ui-handler";
|
||||
import { getPokeballName } from "./pokeball";
|
||||
import { BerryModifierType } from "#app/modifier/modifier-type";
|
||||
import { getPokeballName } from "./pokeball";
|
||||
import { Species } from "./enums/species";
|
||||
import {BattlerIndex} from "#app/battle";
|
||||
|
||||
export class Ability implements Localizable {
|
||||
@ -555,7 +556,10 @@ export class MoveImmunityStatChangeAbAttr extends MoveImmunityAbAttr {
|
||||
applyPreDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: PokemonMove, cancelled: Utils.BooleanHolder, args: any[]): boolean {
|
||||
const ret = super.applyPreDefend(pokemon, passive, attacker, move, cancelled, args);
|
||||
if (ret) {
|
||||
pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ this.stat ], this.levels));
|
||||
const simulated = args.length > 1 && args[1];
|
||||
if (!simulated) {
|
||||
pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ this.stat ], this.levels));
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
@ -1778,6 +1782,39 @@ export class ProtectStatAbAttr extends PreStatChangeAbAttr {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This attribute applies confusion to the target whenever the user
|
||||
* directly poisons them with a move, e.g. Poison Puppeteer.
|
||||
* Called in {@linkcode StatusEffectAttr}.
|
||||
* @extends PostAttackAbAttr
|
||||
* @see {@linkcode applyPostAttack}
|
||||
*/
|
||||
export class ConfusionOnStatusEffectAbAttr extends PostAttackAbAttr {
|
||||
/** List of effects to apply confusion after */
|
||||
private effects: StatusEffect[];
|
||||
|
||||
constructor(...effects: StatusEffect[]) {
|
||||
super();
|
||||
this.effects = effects;
|
||||
}
|
||||
/**
|
||||
* Applies confusion to the target pokemon.
|
||||
* @param pokemon {@link Pokemon} attacking
|
||||
* @param passive N/A
|
||||
* @param defender {@link Pokemon} defending
|
||||
* @param move {@link Move} used to apply status effect and confusion
|
||||
* @param hitResult N/A
|
||||
* @param args [0] {@linkcode StatusEffect} applied by move
|
||||
* @returns true if defender is confused
|
||||
*/
|
||||
applyPostAttack(pokemon: Pokemon, passive: boolean, defender: Pokemon, move: PokemonMove, hitResult: HitResult, args: any[]): boolean {
|
||||
if (this.effects.indexOf(args[0]) > -1 && !defender.isFainted()) {
|
||||
return defender.addTag(BattlerTagType.CONFUSED, pokemon.randSeedInt(3,2), move.moveId, defender.id);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
export class PreSetStatusAbAttr extends AbAttr {
|
||||
applyPreSetStatus(pokemon: Pokemon, passive: boolean, effect: StatusEffect, cancelled: Utils.BooleanHolder, args: any[]): boolean | Promise<boolean> {
|
||||
return false;
|
||||
@ -2975,6 +3012,29 @@ export class IgnoreTypeStatusEffectImmunityAbAttr extends AbAttr {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gives money to the user after the battle.
|
||||
*
|
||||
* @extends PostBattleAbAttr
|
||||
* @see {@linkcode applyPostBattle}
|
||||
*/
|
||||
export class MoneyAbAttr extends PostBattleAbAttr {
|
||||
constructor() {
|
||||
super();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param pokemon {@linkcode Pokemon} that is the user of this ability.
|
||||
* @param passive N/A
|
||||
* @param args N/A
|
||||
* @returns true
|
||||
*/
|
||||
applyPostBattle(pokemon: Pokemon, passive: boolean, args: any[]): boolean {
|
||||
pokemon.scene.currentBattle.moneyScattered += pokemon.scene.getWaveMoneyAmount(0.2);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
function applyAbAttrsInternal<TAttr extends AbAttr>(attrType: { new(...args: any[]): TAttr },
|
||||
pokemon: Pokemon, applyFunc: AbAttrApplyFunc<TAttr>, args: any[], isAsync: boolean = false, showAbilityInstant: boolean = false, quiet: boolean = false, passive: boolean = false): Promise<void> {
|
||||
return new Promise(resolve => {
|
||||
@ -3520,7 +3580,7 @@ export function initAbilities() {
|
||||
.attr(PostSummonWeatherChangeAbAttr, WeatherType.SNOW)
|
||||
.attr(PostBiomeChangeWeatherChangeAbAttr, WeatherType.SNOW),
|
||||
new Ability(Abilities.HONEY_GATHER, 4)
|
||||
.unimplemented(),
|
||||
.attr(MoneyAbAttr),
|
||||
new Ability(Abilities.FRISK, 4)
|
||||
.attr(FriskAbAttr),
|
||||
new Ability(Abilities.RECKLESS, 4)
|
||||
@ -4155,6 +4215,6 @@ export function initAbilities() {
|
||||
new Ability(Abilities.POISON_PUPPETEER, 9)
|
||||
.attr(UncopiableAbilityAbAttr)
|
||||
.attr(UnswappableAbilityAbAttr)
|
||||
.unimplemented(),
|
||||
.conditionalAttr(pokemon => pokemon.species.speciesId===Species.PECHARUNT,ConfusionOnStatusEffectAbAttr,StatusEffect.POISON,StatusEffect.TOXIC)
|
||||
);
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { Arena } from "../field/arena";
|
||||
import { Type } from "./type";
|
||||
import * as Utils from "../utils";
|
||||
import { MoveCategory, allMoves } from "./move";
|
||||
import { MoveCategory, allMoves, MoveTarget } from "./move";
|
||||
import { getPokemonMessage } from "../messages";
|
||||
import Pokemon, { HitResult, PokemonMove } from "../field/pokemon";
|
||||
import { MoveEffectPhase, PokemonHealPhase, StatChangePhase} from "../phases";
|
||||
@ -11,6 +11,7 @@ import { Moves } from "./enums/moves";
|
||||
import { ArenaTagType } from "./enums/arena-tag-type";
|
||||
import { BlockNonDirectDamageAbAttr, ProtectStatAbAttr, applyAbAttrs } from "./ability";
|
||||
import { BattleStat } from "./battle-stat";
|
||||
import { CommonAnim, CommonBattleAnim } from "./battle-anims";
|
||||
|
||||
export enum ArenaTagSide {
|
||||
BOTH,
|
||||
@ -146,6 +147,128 @@ class AuroraVeilTag extends WeakenMoveScreenTag {
|
||||
}
|
||||
}
|
||||
|
||||
type ProtectConditionFunc = (...args: any[]) => boolean;
|
||||
|
||||
/**
|
||||
* Abstract class to implement conditional team protection
|
||||
* applies protection based on the attributes of incoming moves
|
||||
* @param protectConditionFunc: The function determining if an incoming move is negated
|
||||
*/
|
||||
abstract class ConditionalProtectTag extends ArenaTag {
|
||||
protected protectConditionFunc: ProtectConditionFunc;
|
||||
|
||||
constructor(tagType: ArenaTagType, sourceMove: Moves, sourceId: integer, side: ArenaTagSide, condition: ProtectConditionFunc) {
|
||||
super(tagType, 1, sourceMove, sourceId, side);
|
||||
|
||||
this.protectConditionFunc = condition;
|
||||
}
|
||||
|
||||
onAdd(arena: Arena): void {
|
||||
arena.scene.queueMessage(`${super.getMoveName()} protected${this.side === ArenaTagSide.PLAYER ? " your" : this.side === ArenaTagSide.ENEMY ? " the\nopposing" : ""} team!`);
|
||||
}
|
||||
|
||||
// Removes default message for effect removal
|
||||
onRemove(arena: Arena): void { }
|
||||
|
||||
/**
|
||||
* apply(): Checks incoming moves against the condition function
|
||||
* and protects the target if conditions are met
|
||||
* @param arena The arena containing this tag
|
||||
* @param args[0] (Utils.BooleanHolder) Signals if the move is cancelled
|
||||
* @param args[1] (Pokemon) The intended target of the move
|
||||
* @param args[2...] (any[]) The parameters to the condition function
|
||||
* @returns
|
||||
*/
|
||||
apply(arena: Arena, args: any[]): boolean {
|
||||
if ((args[0] as Utils.BooleanHolder).value) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const target = args[1] as Pokemon;
|
||||
if ((this.side === ArenaTagSide.PLAYER) === target.isPlayer()
|
||||
&& this.protectConditionFunc(...args.slice(2))) {
|
||||
(args[0] as Utils.BooleanHolder).value = true;
|
||||
new CommonBattleAnim(CommonAnim.PROTECT, target).play(arena.scene);
|
||||
arena.scene.queueMessage(`${super.getMoveName()} protected ${getPokemonMessage(target, "!")}`);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Quick_Guard_(move) Quick Guard}
|
||||
* Condition: The incoming move has increased priority.
|
||||
*/
|
||||
class QuickGuardTag extends ConditionalProtectTag {
|
||||
constructor(sourceId: integer, side: ArenaTagSide) {
|
||||
super(ArenaTagType.QUICK_GUARD, Moves.QUICK_GUARD, sourceId, side,
|
||||
(priority: integer) : boolean => {
|
||||
return priority > 0;
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Wide_Guard_(move) Wide Guard}
|
||||
* Condition: The incoming move can target multiple Pokemon. The move's source
|
||||
* can be an ally or enemy.
|
||||
*/
|
||||
class WideGuardTag extends ConditionalProtectTag {
|
||||
constructor(sourceId: integer, side: ArenaTagSide) {
|
||||
super(ArenaTagType.WIDE_GUARD, Moves.WIDE_GUARD, sourceId, side,
|
||||
(moveTarget: MoveTarget) : boolean => {
|
||||
switch (moveTarget) {
|
||||
case MoveTarget.ALL_ENEMIES:
|
||||
case MoveTarget.ALL_NEAR_ENEMIES:
|
||||
case MoveTarget.ALL_OTHERS:
|
||||
case MoveTarget.ALL_NEAR_OTHERS:
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Mat_Block_(move) Mat Block}
|
||||
* Condition: The incoming move is a Physical or Special attack move.
|
||||
*/
|
||||
class MatBlockTag extends ConditionalProtectTag {
|
||||
constructor(sourceId: integer, side: ArenaTagSide) {
|
||||
super(ArenaTagType.MAT_BLOCK, Moves.MAT_BLOCK, sourceId, side,
|
||||
(moveCategory: MoveCategory) : boolean => {
|
||||
return moveCategory !== MoveCategory.STATUS;
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
onAdd(arena: Arena) {
|
||||
const source = arena.scene.getPokemonById(this.sourceId);
|
||||
arena.scene.queueMessage(getPokemonMessage(source, " intends to flip up a mat\nand block incoming attacks!"));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Crafty_Shield_(move) Crafty Shield}
|
||||
* Condition: The incoming move is a Status move, is not a hazard, and does
|
||||
* not target all Pokemon or sides of the field.
|
||||
*/
|
||||
class CraftyShieldTag extends ConditionalProtectTag {
|
||||
constructor(sourceId: integer, side: ArenaTagSide) {
|
||||
super(ArenaTagType.CRAFTY_SHIELD, Moves.CRAFTY_SHIELD, sourceId, side,
|
||||
(moveCategory: MoveCategory, moveTarget: MoveTarget) : boolean => {
|
||||
return moveCategory === MoveCategory.STATUS
|
||||
&& moveTarget !== MoveTarget.ENEMY_SIDE
|
||||
&& moveTarget !== MoveTarget.BOTH_SIDES
|
||||
&& moveTarget !== MoveTarget.ALL;
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class WishTag extends ArenaTag {
|
||||
private battlerIndex: BattlerIndex;
|
||||
private triggerMessage: string;
|
||||
@ -513,6 +636,14 @@ export function getArenaTag(tagType: ArenaTagType, turnCount: integer, sourceMov
|
||||
switch (tagType) {
|
||||
case ArenaTagType.MIST:
|
||||
return new MistTag(turnCount, sourceId, side);
|
||||
case ArenaTagType.QUICK_GUARD:
|
||||
return new QuickGuardTag(sourceId, side);
|
||||
case ArenaTagType.WIDE_GUARD:
|
||||
return new WideGuardTag(sourceId, side);
|
||||
case ArenaTagType.MAT_BLOCK:
|
||||
return new MatBlockTag(sourceId, side);
|
||||
case ArenaTagType.CRAFTY_SHIELD:
|
||||
return new CraftyShieldTag(sourceId, side);
|
||||
case ArenaTagType.MUD_SPORT:
|
||||
return new MudSportTag(turnCount, sourceId);
|
||||
case ArenaTagType.WATER_SPORT:
|
||||
|
@ -1,15 +1,15 @@
|
||||
import { trainerConfigs } from "./trainer-config";
|
||||
import { TrainerType } from "./enums/trainer-type";
|
||||
import { BattleSpec } from "../enums/battle-spec";
|
||||
import {trainerConfigs} from "./trainer-config";
|
||||
import {TrainerType} from "./enums/trainer-type";
|
||||
import {BattleSpec} from "../enums/battle-spec";
|
||||
|
||||
export interface TrainerTypeMessages {
|
||||
encounter?: string | string[],
|
||||
victory?: string | string[],
|
||||
defeat?: string | string[]
|
||||
encounter?: string | string[],
|
||||
victory?: string | string[],
|
||||
defeat?: string | string[]
|
||||
}
|
||||
|
||||
export interface TrainerTypeDialogue {
|
||||
[key: integer]: TrainerTypeMessages | [ TrainerTypeMessages, TrainerTypeMessages ]
|
||||
[key: integer]: TrainerTypeMessages | [TrainerTypeMessages, TrainerTypeMessages]
|
||||
}
|
||||
|
||||
export const trainerTypeDialogue = {
|
||||
@ -84,7 +84,7 @@ export const trainerTypeDialogue = {
|
||||
"Unlike my diabolical self, these are some good Pokémon.",
|
||||
"Too much praise can spoil both Pokémon and people.",
|
||||
],
|
||||
defeat:[
|
||||
defeat: [
|
||||
"You should not get angry at your Pokémon, even if you lose a battle.",
|
||||
"Right? Pretty good Pokémon, huh? I'm suited to raising things.",
|
||||
"No matter how much you love your Pokémon, you still have to discipline them when they misbehave."
|
||||
@ -2074,6 +2074,76 @@ export const trainerTypeDialogue = {
|
||||
"Things didn't heat up for you.",
|
||||
]
|
||||
},
|
||||
[TrainerType.MARNIE_ELITE]: {
|
||||
encounter: [
|
||||
"You've made it this far, huh? Let's see if you can handle my Pokémon!",
|
||||
"I'll give it my best shot, but don't think I'll go easy on you!",
|
||||
],
|
||||
victory: [
|
||||
"I can't believe I lost... But you deserved that win. Well done!",
|
||||
"Looks like I've still got a lot to learn. Great battle, though!",
|
||||
],
|
||||
defeat: [
|
||||
"You put up a good fight, but I've got the edge! Better luck next time!",
|
||||
"Seems like my training's paid off. Thanks for the battle!",
|
||||
]
|
||||
},
|
||||
[TrainerType.NESSA_ELITE]: {
|
||||
encounter: [
|
||||
"The tides are turning in my favor. Ready to get swept away?",
|
||||
"Let's make some waves with this battle! I hope you're prepared!",
|
||||
],
|
||||
victory: [
|
||||
"You navigated those waters perfectly... Well done!",
|
||||
"Looks like my currents were no match for you. Great job!",
|
||||
],
|
||||
defeat: [
|
||||
"Water always finds a way. That was a refreshing battle!",
|
||||
"You fought well, but the ocean's power is unstoppable!",
|
||||
]
|
||||
},
|
||||
[TrainerType.BEA_ELITE]: {
|
||||
encounter: [
|
||||
"Prepare yourself! My fighting spirit burns bright!",
|
||||
"Let's see if you can keep up with my relentless pace!",
|
||||
],
|
||||
victory: [
|
||||
"Your strength... It's impressive. You truly deserve this win.",
|
||||
"I've never felt this intensity before. Amazing job!",
|
||||
],
|
||||
defeat: [
|
||||
"Another victory for my intense training regimen! Well done!",
|
||||
"You've got strength, but I trained harder. Great battle!",
|
||||
]
|
||||
},
|
||||
[TrainerType.ALLISTER_ELITE]: {
|
||||
encounter: [
|
||||
"Shadows fall... Are you ready to face your fears?",
|
||||
"Let's see if you can handle the darkness that I command.",
|
||||
],
|
||||
victory: [
|
||||
"You've dispelled the shadows... For now. Well done.",
|
||||
"Your light pierced through my darkness. Great job.",
|
||||
],
|
||||
defeat: [
|
||||
"The shadows have spoken... Your strength isn't enough.",
|
||||
"Darkness triumphs... Maybe next time you'll see the light.",
|
||||
]
|
||||
},
|
||||
[TrainerType.RAIHAN_ELITE]: {
|
||||
encounter: [
|
||||
"Storm's brewing! Let's see if you can weather this fight!",
|
||||
"Get ready to face the eye of the storm!",
|
||||
],
|
||||
victory: [
|
||||
"You've bested the storm... Incredible job!",
|
||||
"You rode the winds perfectly... Great battle!",
|
||||
],
|
||||
defeat: [
|
||||
"Another storm weathered, another victory claimed! Well fought!",
|
||||
"You got caught in my storm! Better luck next time!",
|
||||
]
|
||||
},
|
||||
[TrainerType.RIVAL]: [
|
||||
{
|
||||
encounter: [
|
||||
@ -2276,6 +2346,124 @@ export const trainerTypeDialogue = {
|
||||
]
|
||||
};
|
||||
|
||||
|
||||
export const doubleBattleDialogue = {
|
||||
"blue_red_double": {
|
||||
encounter: [
|
||||
`Blue: Hey Red, let's show them what we're made of!
|
||||
$Red: ...
|
||||
$Blue: This is Pallet Town Power!`,
|
||||
],
|
||||
|
||||
victory: [
|
||||
`Blue: That was a great battle!
|
||||
$Red: ...`,
|
||||
]
|
||||
},
|
||||
"red_blue_double": {
|
||||
encounter: [
|
||||
`Red: ...!
|
||||
$Blue: He never talks much.
|
||||
$Blue: But dont let that fool you! He is a champ after all!`,
|
||||
],
|
||||
victory: [
|
||||
`Red: ...!
|
||||
$Blue: Next time we will beat you!`,]
|
||||
},
|
||||
"tate_liza_double": {
|
||||
encounter: [
|
||||
`Tate: Are you suprised?
|
||||
$Liza: We are two gym leaders at once!
|
||||
$Tate: We are twins!
|
||||
$Liza: We dont need to talk to understand each other!
|
||||
$Tate: Twice the power...
|
||||
$Liza: Can you handle it?`,
|
||||
],
|
||||
victory: [
|
||||
`Tate: What? Our combination was perfect!
|
||||
$Liza: Looks like we need to train more...`,
|
||||
]
|
||||
},
|
||||
"liza_tate_double": {
|
||||
encounter: [
|
||||
`Liza: Hihihi... Are you suprised?
|
||||
$Tate: Yes, we are really two gym leaders at once!
|
||||
$Liza: This is my twin brother Tate!
|
||||
$Tate: And this is my twin sister Liza!
|
||||
$Liza: Don't you think we are a perfect combination?`
|
||||
],
|
||||
victory: [
|
||||
`Liza: Are we...
|
||||
$Tate: ...not as strong as we thought?`,
|
||||
]
|
||||
},
|
||||
"wallace_steven_double": {
|
||||
encounter: [
|
||||
`Steven: Wallace, let's show them the power of the champions!
|
||||
$Wallace: We will show you the power of Hoenn!
|
||||
$Steven: Let's go!`,
|
||||
],
|
||||
victory: [
|
||||
`Steven: That was a great battle!
|
||||
$Wallace: We will win next time!`,
|
||||
]
|
||||
},
|
||||
"steven_wallace_double": {
|
||||
encounter: [
|
||||
`Steven: Do you have any rare pokémon?
|
||||
$Wallace: Steven... We are here for a battle, not to show off our pokémon.
|
||||
$Steven: Oh... I see... Let's go then!`,
|
||||
],
|
||||
victory: [
|
||||
`Steven: Now that we are done with the battle, let's show off our pokémon!
|
||||
$Wallace: Steven...`,
|
||||
]
|
||||
},
|
||||
"alder_iris_double": {
|
||||
encounter: [
|
||||
`Alder: We are the strongest trainers in Unova!
|
||||
$Iris: Fights against strong trainers are the best!`,
|
||||
],
|
||||
victory: [
|
||||
`Alder: Wow! You are super strong!
|
||||
$Iris: We will win next time!`,
|
||||
]
|
||||
},
|
||||
"iris_alder_double": {
|
||||
encounter: [
|
||||
`Iris: Welcome Challenger! I am THE Unova Champion!
|
||||
$Alder: Iris, aren't you a bit too excited?`,
|
||||
],
|
||||
victory: [
|
||||
`Iris: A loss like this is not easy to take...
|
||||
$Alder: But we will only get stronger with every loss!`,
|
||||
]
|
||||
},
|
||||
"marnie_piers_double": {
|
||||
encounter: [
|
||||
`Marnie: Brother, let's show them the power of Spikemuth!
|
||||
$Piers: We bring darkness!`,
|
||||
],
|
||||
victory: [
|
||||
`Marnie: You brought light to our darkness!
|
||||
$Piers: Its too bright...`,
|
||||
]
|
||||
},
|
||||
"piers_marnie_double": {
|
||||
encounter: [
|
||||
`Piers: Ready for a concert?
|
||||
$Marnie: Brother... They are here to fight, not to sing...`,
|
||||
],
|
||||
victory: [
|
||||
`Piers: Now that was a great concert!
|
||||
$Marnie: Brother...`,
|
||||
]
|
||||
},
|
||||
|
||||
|
||||
|
||||
};
|
||||
|
||||
export const battleSpecDialogue = {
|
||||
[BattleSpec.FINAL_BOSS]: {
|
||||
encounter: `It appears the time has finally come once again.\nYou know why you have come here, do you not?
|
||||
@ -2323,7 +2511,7 @@ export function initTrainerTypeDialogue(): void {
|
||||
const trainerTypes = Object.keys(trainerTypeDialogue).map(t => parseInt(t) as TrainerType);
|
||||
for (const trainerType of trainerTypes) {
|
||||
const messages = trainerTypeDialogue[trainerType];
|
||||
const messageTypes = [ "encounter", "victory", "defeat" ];
|
||||
const messageTypes = ["encounter", "victory", "defeat"];
|
||||
for (const messageType of messageTypes) {
|
||||
if (Array.isArray(messages)) {
|
||||
if (messages[0][messageType]) {
|
||||
|
@ -16,5 +16,9 @@ export enum ArenaTagType {
|
||||
REFLECT = "REFLECT",
|
||||
LIGHT_SCREEN = "LIGHT_SCREEN",
|
||||
AURORA_VEIL = "AURORA_VEIL",
|
||||
QUICK_GUARD = "QUICK_GUARD",
|
||||
WIDE_GUARD = "WIDE_GUARD",
|
||||
MAT_BLOCK = "MAT_BLOCK",
|
||||
CRAFTY_SHIELD = "CRAFTY_SHIELD",
|
||||
TAILWIND = "TAILWIND"
|
||||
}
|
||||
|
@ -153,6 +153,11 @@ export enum TrainerType {
|
||||
OLIVIA,
|
||||
ACEROLA,
|
||||
KAHILI,
|
||||
MARNIE_ELITE,
|
||||
NESSA_ELITE,
|
||||
BEA_ELITE,
|
||||
ALLISTER_ELITE,
|
||||
RAIHAN_ELITE,
|
||||
RIKA,
|
||||
POPPY,
|
||||
LARRY_ELITE,
|
||||
|
77
src/data/move.ts
Normal file → Executable file
77
src/data/move.ts
Normal file → Executable file
@ -6,13 +6,13 @@ import { EncoreTag } from "./battler-tags";
|
||||
import { BattlerTagType } from "./enums/battler-tag-type";
|
||||
import { getPokemonMessage } from "../messages";
|
||||
import Pokemon, { AttackMoveResult, EnemyPokemon, HitResult, MoveResult, PlayerPokemon, PokemonMove, TurnMove } from "../field/pokemon";
|
||||
import { StatusEffect, getStatusEffectHealText } from "./status-effect";
|
||||
import { StatusEffect, getStatusEffectHealText, isNonVolatileStatusEffect, getNonVolatileStatusEffects} from "./status-effect";
|
||||
import { Type } from "./type";
|
||||
import * as Utils from "../utils";
|
||||
import { WeatherType } from "./weather";
|
||||
import { ArenaTagSide, ArenaTrapTag } from "./arena-tag";
|
||||
import { ArenaTagType } from "./enums/arena-tag-type";
|
||||
import { UnswappableAbilityAbAttr, UncopiableAbilityAbAttr, UnsuppressableAbilityAbAttr, BlockRecoilDamageAttr, BlockOneHitKOAbAttr, IgnoreContactAbAttr, MaxMultiHitAbAttr, applyAbAttrs, BlockNonDirectDamageAbAttr, applyPreSwitchOutAbAttrs, PreSwitchOutAbAttr, applyPostDefendAbAttrs, PostDefendContactApplyStatusEffectAbAttr, MoveAbilityBypassAbAttr, ReverseDrainAbAttr, FieldPreventExplosiveMovesAbAttr, ForceSwitchOutImmunityAbAttr, BlockItemTheftAbAttr } from "./ability";
|
||||
import { UnswappableAbilityAbAttr, UncopiableAbilityAbAttr, UnsuppressableAbilityAbAttr, BlockRecoilDamageAttr, BlockOneHitKOAbAttr, IgnoreContactAbAttr, MaxMultiHitAbAttr, applyAbAttrs, BlockNonDirectDamageAbAttr, applyPreSwitchOutAbAttrs, PreSwitchOutAbAttr, applyPostDefendAbAttrs, PostDefendContactApplyStatusEffectAbAttr, MoveAbilityBypassAbAttr, ReverseDrainAbAttr, FieldPreventExplosiveMovesAbAttr, ForceSwitchOutImmunityAbAttr, BlockItemTheftAbAttr, applyPostAttackAbAttrs, ConfusionOnStatusEffectAbAttr } from "./ability";
|
||||
import { Abilities } from "./enums/abilities";
|
||||
import { allAbilities } from "./ability";
|
||||
import { PokemonHeldItemModifier, BerryModifier, PreserveBerryModifier } from "../modifier/modifier";
|
||||
@ -204,6 +204,19 @@ export default class Move implements Localizable {
|
||||
return false;
|
||||
}
|
||||
|
||||
isAllyTarget(): boolean {
|
||||
switch (this.moveTarget) {
|
||||
case MoveTarget.USER:
|
||||
case MoveTarget.NEAR_ALLY:
|
||||
case MoveTarget.ALLY:
|
||||
case MoveTarget.USER_OR_NEAR_ALLY:
|
||||
case MoveTarget.USER_AND_ALLIES:
|
||||
case MoveTarget.USER_SIDE:
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
isTypeImmune(type: Type): boolean {
|
||||
switch (type) {
|
||||
case Type.GRASS:
|
||||
@ -1307,8 +1320,9 @@ export class MultiHitAttr extends MoveAttr {
|
||||
}
|
||||
break;
|
||||
case MultiHitType.BEAT_UP:
|
||||
const party = user.isPlayer() ? user.scene.getParty() : user.scene.getEnemyParty();
|
||||
// No status means the ally pokemon can contribute to Beat Up
|
||||
hitTimes = user.scene.getParty().reduce((total, pokemon) => {
|
||||
hitTimes = party.reduce((total, pokemon) => {
|
||||
return total + (pokemon.id === user.id ? 1 : pokemon?.status && pokemon.status.effect !== StatusEffect.NONE ? 0 : 1);
|
||||
}, 0);
|
||||
}
|
||||
@ -1362,8 +1376,10 @@ export class StatusEffectAttr extends MoveEffectAttr {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (!pokemon.status || (pokemon.status.effect === this.effect && move.chance < 0)) {
|
||||
return pokemon.trySetStatus(this.effect, true, user, this.cureTurn);
|
||||
if ((!pokemon.status || (pokemon.status.effect === this.effect && move.chance < 0))
|
||||
&& pokemon.trySetStatus(this.effect, true, user, this.cureTurn)) {
|
||||
applyPostAttackAbAttrs(ConfusionOnStatusEffectAbAttr, user, target, new PokemonMove(move.id), null,this.effect);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
@ -2308,7 +2324,7 @@ export class MovePowerMultiplierAttr extends VariablePowerAttr {
|
||||
* @returns The base power of the Beat Up hit.
|
||||
*/
|
||||
const beatUpFunc = (user: Pokemon, allyIndex: number): number => {
|
||||
const party = user.scene.getParty();
|
||||
const party = user.isPlayer() ? user.scene.getParty() : user.scene.getEnemyParty();
|
||||
|
||||
for (let i = allyIndex; i < party.length; i++) {
|
||||
const pokemon = party[i];
|
||||
@ -3718,6 +3734,37 @@ export class AddArenaTagAttr extends MoveEffectAttr {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Generic class for removing arena tags
|
||||
* @param tagTypes: The types of tags that can be removed
|
||||
* @param selfSideTarget: Is the user removing tags from its own side?
|
||||
*/
|
||||
export class RemoveArenaTagsAttr extends MoveEffectAttr {
|
||||
public tagTypes: ArenaTagType[];
|
||||
public selfSideTarget: boolean;
|
||||
|
||||
constructor(tagTypes: ArenaTagType[], selfSideTarget: boolean) {
|
||||
super(true, MoveEffectTrigger.POST_APPLY);
|
||||
|
||||
this.tagTypes = tagTypes;
|
||||
this.selfSideTarget = selfSideTarget;
|
||||
}
|
||||
|
||||
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
|
||||
if (!super.apply(user, target, move, args)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const side = (this.selfSideTarget ? user : target).isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY;
|
||||
|
||||
for (const tagType of this.tagTypes) {
|
||||
user.scene.arena.removeTagOnSide(tagType, side);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
export class AddArenaTrapTagAttr extends AddArenaTagAttr {
|
||||
getCondition(): MoveConditionFunc {
|
||||
return (user, target, move) => {
|
||||
@ -5907,6 +5954,7 @@ export function initMoves() {
|
||||
.unimplemented(),
|
||||
new AttackMove(Moves.FEINT, Type.NORMAL, MoveCategory.PHYSICAL, 30, 100, 10, -1, 2, 4)
|
||||
.attr(RemoveBattlerTagAttr, [ BattlerTagType.PROTECTED ])
|
||||
.attr(RemoveArenaTagsAttr, [ ArenaTagType.QUICK_GUARD, ArenaTagType.WIDE_GUARD, ArenaTagType.MAT_BLOCK, ArenaTagType.CRAFTY_SHIELD ], false)
|
||||
.makesContact(false)
|
||||
.ignoresProtect(),
|
||||
new AttackMove(Moves.PLUCK, Type.FLYING, MoveCategory.PHYSICAL, 60, 100, 20, -1, 0, 4)
|
||||
@ -6196,7 +6244,7 @@ export function initMoves() {
|
||||
.attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.ACC ], 1, true),
|
||||
new StatusMove(Moves.WIDE_GUARD, Type.ROCK, -1, 10, -1, 3, 5)
|
||||
.target(MoveTarget.USER_SIDE)
|
||||
.unimplemented(),
|
||||
.attr(AddArenaTagAttr, ArenaTagType.WIDE_GUARD, 1, true, true),
|
||||
new StatusMove(Moves.GUARD_SPLIT, Type.PSYCHIC, -1, 10, -1, 0, 5)
|
||||
.unimplemented(),
|
||||
new StatusMove(Moves.POWER_SPLIT, Type.PSYCHIC, -1, 10, -1, 0, 5)
|
||||
@ -6284,7 +6332,7 @@ export function initMoves() {
|
||||
.attr(StatChangeCountPowerAttr),
|
||||
new StatusMove(Moves.QUICK_GUARD, Type.FIGHTING, -1, 15, -1, 3, 5)
|
||||
.target(MoveTarget.USER_SIDE)
|
||||
.unimplemented(),
|
||||
.attr(AddArenaTagAttr, ArenaTagType.QUICK_GUARD, 1, true, true),
|
||||
new SelfStatusMove(Moves.ALLY_SWITCH, Type.PSYCHIC, -1, 15, -1, 2, 5)
|
||||
.ignoresProtect()
|
||||
.unimplemented(),
|
||||
@ -6450,7 +6498,9 @@ export function initMoves() {
|
||||
.attr(HitsTagAttr, BattlerTagType.MINIMIZED, true)
|
||||
.condition(failOnGravityCondition),
|
||||
new StatusMove(Moves.MAT_BLOCK, Type.FIGHTING, -1, 10, -1, 0, 6)
|
||||
.unimplemented(),
|
||||
.target(MoveTarget.USER_SIDE)
|
||||
.attr(AddArenaTagAttr, ArenaTagType.MAT_BLOCK, 1, true, true)
|
||||
.condition(new FirstMoveCondition()),
|
||||
new AttackMove(Moves.BELCH, Type.POISON, MoveCategory.SPECIAL, 120, 90, 10, -1, 0, 6)
|
||||
.condition((user, target, move) => user.battleData.berriesEaten.length > 0),
|
||||
new StatusMove(Moves.ROTOTILLER, Type.GROUND, -1, 10, 100, 0, 6)
|
||||
@ -6503,7 +6553,7 @@ export function initMoves() {
|
||||
.triageMove(),
|
||||
new StatusMove(Moves.CRAFTY_SHIELD, Type.FAIRY, -1, 10, -1, 3, 6)
|
||||
.target(MoveTarget.USER_SIDE)
|
||||
.unimplemented(),
|
||||
.attr(AddArenaTagAttr, ArenaTagType.CRAFTY_SHIELD, 1, true, true),
|
||||
new StatusMove(Moves.FLOWER_SHIELD, Type.FAIRY, -1, 10, 100, 0, 6)
|
||||
.target(MoveTarget.ALL)
|
||||
.unimplemented(),
|
||||
@ -6811,8 +6861,11 @@ export function initMoves() {
|
||||
.unimplemented(),
|
||||
new AttackMove(Moves.SMART_STRIKE, Type.STEEL, MoveCategory.PHYSICAL, 70, -1, 10, -1, 0, 7),
|
||||
new StatusMove(Moves.PURIFY, Type.POISON, -1, 20, -1, 0, 7)
|
||||
.triageMove()
|
||||
.unimplemented(),
|
||||
.condition(
|
||||
(user: Pokemon, target: Pokemon, move: Move) => isNonVolatileStatusEffect(user.status?.effect))
|
||||
.attr(HealAttr, 0.5)
|
||||
.attr(HealStatusEffectAttr, true, ...getNonVolatileStatusEffects())
|
||||
.triageMove(),
|
||||
new AttackMove(Moves.REVELATION_DANCE, Type.NORMAL, MoveCategory.SPECIAL, 90, 100, 15, -1, 0, 7)
|
||||
.danceMove()
|
||||
.attr(MatchUserTypeAttr),
|
||||
|
@ -27,6 +27,11 @@ export enum Region {
|
||||
}
|
||||
|
||||
export function getPokemonSpecies(species: Species): PokemonSpecies {
|
||||
// If a special pool (named trainers) is used here it CAN happen that they have a array as species (which means choose one of those two). So we catch that with this code block
|
||||
if (Array.isArray(species)) {
|
||||
// Pick a random species from the list
|
||||
species = species[Math.floor(Math.random() * species.length)];
|
||||
}
|
||||
if (species >= 2000) {
|
||||
return allSpecies.find(s => s.speciesId === species);
|
||||
}
|
||||
@ -149,6 +154,13 @@ export abstract class PokemonSpeciesForm {
|
||||
this.genderDiffs = genderDiffs;
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to get the root species id of a Pokemon.
|
||||
* Magmortar.getRootSpeciesId(true) => Magmar
|
||||
* Magmortar.getRootSpeciesId(false) => Magby
|
||||
* @param forStarter boolean to get the nonbaby form of a starter
|
||||
* @returns The species
|
||||
*/
|
||||
getRootSpeciesId(forStarter: boolean = false): Species {
|
||||
let ret = this.speciesId;
|
||||
while (pokemonPrevolutions.hasOwnProperty(ret) && (!forStarter || !speciesStarters.hasOwnProperty(ret))) {
|
||||
|
@ -175,3 +175,27 @@ export function getRandomStatus(statusA: Status, statusB: Status): Status {
|
||||
|
||||
return Utils.randIntRange(0, 2) ? statusA : statusB;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets all non volatile status effects
|
||||
* @returns A list containing all non volatile status effects
|
||||
*/
|
||||
export function getNonVolatileStatusEffects():Array<StatusEffect> {
|
||||
return [
|
||||
StatusEffect.POISON,
|
||||
StatusEffect.TOXIC,
|
||||
StatusEffect.PARALYSIS,
|
||||
StatusEffect.SLEEP,
|
||||
StatusEffect.FREEZE,
|
||||
StatusEffect.BURN
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns whether a statuss effect is non volatile.
|
||||
* Non-volatile status condition is a status that remains after being switched out.
|
||||
* @param status The status to check
|
||||
*/
|
||||
export function isNonVolatileStatusEffect(status: StatusEffect): boolean {
|
||||
return getNonVolatileStatusEffects().includes(status);
|
||||
}
|
||||
|
@ -6,10 +6,11 @@ import {TrainerType} from "./enums/trainer-type";
|
||||
import {Moves} from "./enums/moves";
|
||||
import {PokeballType} from "./pokeball";
|
||||
import {pokemonEvolutions, pokemonPrevolutions} from "./pokemon-evolutions";
|
||||
import PokemonSpecies, {PokemonSpeciesFilter, getPokemonSpecies} from "./pokemon-species";
|
||||
import PokemonSpecies, {getPokemonSpecies, PokemonSpeciesFilter} from "./pokemon-species";
|
||||
import {Species} from "./enums/species";
|
||||
import {tmSpecies} from "./tms";
|
||||
import {Type} from "./type";
|
||||
import {doubleBattleDialogue} from "./dialogue";
|
||||
import {PersistentModifier} from "../modifier/modifier";
|
||||
import {TrainerVariant} from "../field/trainer";
|
||||
import {PartyMemberStrength} from "./enums/party-member-strength";
|
||||
@ -172,10 +173,12 @@ export interface PartyMemberFuncs {
|
||||
|
||||
export class TrainerConfig {
|
||||
public trainerType: TrainerType;
|
||||
public trainerTypeDouble: TrainerType;
|
||||
public name: string;
|
||||
public nameFemale: string;
|
||||
public nameDouble: string;
|
||||
public title: string;
|
||||
public titleDouble: string;
|
||||
public hasGenders: boolean = false;
|
||||
public hasDouble: boolean = false;
|
||||
public hasCharSprite: boolean = false;
|
||||
@ -228,6 +231,10 @@ export class TrainerConfig {
|
||||
if (this.hasGenders) {
|
||||
ret += `_${female ? "f" : "m"}`;
|
||||
}
|
||||
// If a special double trainer class was set, set it as the sprite key
|
||||
if (this.trainerTypeDouble && female) {
|
||||
ret = TrainerType[this.trainerTypeDouble].toString().toLowerCase();
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -263,6 +270,8 @@ export class TrainerConfig {
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
|
||||
getDerivedType(): TrainerType {
|
||||
let trainerType = this.trainerType;
|
||||
switch (trainerType) {
|
||||
@ -279,17 +288,32 @@ export class TrainerConfig {
|
||||
case TrainerType.LARRY_ELITE:
|
||||
trainerType = TrainerType.LARRY;
|
||||
break;
|
||||
case TrainerType.MARNIE_ELITE:
|
||||
trainerType = TrainerType.MARNIE;
|
||||
break;
|
||||
case TrainerType.NESSA_ELITE:
|
||||
trainerType = TrainerType.NESSA;
|
||||
break;
|
||||
case TrainerType.BEA_ELITE:
|
||||
trainerType = TrainerType.BEA;
|
||||
break;
|
||||
case TrainerType.ALLISTER_ELITE:
|
||||
trainerType = TrainerType.ALLISTER;
|
||||
break;
|
||||
case TrainerType.RAIHAN_ELITE:
|
||||
trainerType = TrainerType.RAIHAN;
|
||||
break;
|
||||
}
|
||||
|
||||
return trainerType;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the configuration for trainers with genders, including the female name and encounter background music (BGM).
|
||||
* @param {string} [nameFemale] - The name of the female trainer. If 'Ivy', a localized name will be assigned.
|
||||
* @param {TrainerType | string} [femaleEncounterBgm] - The encounter BGM for the female trainer, which can be a TrainerType or a string.
|
||||
* @returns {TrainerConfig} - The updated TrainerConfig instance.
|
||||
**/
|
||||
* Sets the configuration for trainers with genders, including the female name and encounter background music (BGM).
|
||||
* @param {string} [nameFemale] - The name of the female trainer. If 'Ivy', a localized name will be assigned.
|
||||
* @param {TrainerType | string} [femaleEncounterBgm] - The encounter BGM for the female trainer, which can be a TrainerType or a string.
|
||||
* @returns {TrainerConfig} - The updated TrainerConfig instance.
|
||||
**/
|
||||
setHasGenders(nameFemale?: string, femaleEncounterBgm?: TrainerType | string): TrainerConfig {
|
||||
// If the female name is 'Ivy' (the rival), assign a localized name.
|
||||
if (nameFemale === "Ivy") {
|
||||
@ -321,6 +345,12 @@ export class TrainerConfig {
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the configuration for trainers with double battles, including the name of the double trainer and the encounter BGM.
|
||||
* @param nameDouble - The name of the double trainer (e.g., "Ace Duo" for Trainer Class Doubles or "red_blue_double" for NAMED trainer doubles).
|
||||
* @param doubleEncounterBgm - The encounter BGM for the double trainer, which can be a TrainerType or a string.
|
||||
* @returns {TrainerConfig} - The updated TrainerConfig instance.
|
||||
*/
|
||||
setHasDouble(nameDouble: string, doubleEncounterBgm?: TrainerType | string): TrainerConfig {
|
||||
this.hasDouble = true;
|
||||
this.nameDouble = nameDouble;
|
||||
@ -330,6 +360,50 @@ export class TrainerConfig {
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the trainer type for double battles.
|
||||
* @param trainerTypeDouble - The TrainerType of the partner in a double battle.
|
||||
* @returns {TrainerConfig} - The updated TrainerConfig instance.
|
||||
*/
|
||||
setDoubleTrainerType(trainerTypeDouble: TrainerType): TrainerConfig {
|
||||
this.trainerTypeDouble = trainerTypeDouble;
|
||||
this.setDoubleMessages(this.nameDouble);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the encounter and victory messages for double trainers.
|
||||
* @param nameDouble - The name of the pair (e.g. "red_blue_double").
|
||||
*/
|
||||
setDoubleMessages(nameDouble: string) {
|
||||
// Check if there is double battle dialogue for this trainer
|
||||
if (doubleBattleDialogue[nameDouble]) {
|
||||
// Set encounter and victory messages for double trainers
|
||||
this.doubleEncounterMessages = doubleBattleDialogue[nameDouble].encounter;
|
||||
this.doubleVictoryMessages = doubleBattleDialogue[nameDouble].victory;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the title for double trainers
|
||||
* @param titleDouble - the key for the title in the i18n file. (e.g., "champion_double").
|
||||
* @returns {TrainerConfig} - The updated TrainerConfig instance.
|
||||
*/
|
||||
setDoubleTitle(titleDouble: string): TrainerConfig {
|
||||
// First check if i18n is initialized
|
||||
if (!getIsInitialized()) {
|
||||
initI18n();
|
||||
}
|
||||
|
||||
// Make the title lowercase and replace spaces with underscores
|
||||
titleDouble = titleDouble.toLowerCase().replace(/\s/g, "_");
|
||||
|
||||
// Get the title from the i18n file
|
||||
this.titleDouble = i18next.t(`titles:${titleDouble}`);
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
setHasCharSprite(): TrainerConfig {
|
||||
this.hasCharSprite = true;
|
||||
return this;
|
||||
@ -422,11 +496,11 @@ export class TrainerConfig {
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes the trainer configuration for a Gym Leader.
|
||||
* @param {Species | Species[]} signatureSpecies - The signature species for the Gym Leader.
|
||||
* @param {Type[]} specialtyTypes - The specialty types for the Gym Leader.
|
||||
* @returns {TrainerConfig} - The updated TrainerConfig instance.
|
||||
* **/
|
||||
* Initializes the trainer configuration for a Gym Leader.
|
||||
* @param {Species | Species[]} signatureSpecies - The signature species for the Gym Leader.
|
||||
* @param {Type[]} specialtyTypes - The specialty types for the Gym Leader.
|
||||
* @returns {TrainerConfig} - The updated TrainerConfig instance.
|
||||
* **/
|
||||
initForGymLeader(signatureSpecies: (Species | Species[])[], ...specialtyTypes: Type[]): TrainerConfig {
|
||||
// Check if the internationalization (i18n) system is initialized.
|
||||
if (!getIsInitialized()) {
|
||||
@ -474,11 +548,11 @@ export class TrainerConfig {
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes the trainer configuration for an Elite Four member.
|
||||
* @param {Species | Species[]} signatureSpecies - The signature species for the Elite Four member.
|
||||
* @param {Type[]} specialtyTypes - The specialty types for the Elite Four member.
|
||||
* @returns {TrainerConfig} - The updated TrainerConfig instance.
|
||||
**/
|
||||
* Initializes the trainer configuration for an Elite Four member.
|
||||
* @param {Species | Species[]} signatureSpecies - The signature species for the Elite Four member.
|
||||
* @param {Type[]} specialtyTypes - The specialty types for the Elite Four member.
|
||||
* @returns {TrainerConfig} - The updated TrainerConfig instance.
|
||||
**/
|
||||
initForEliteFour(signatureSpecies: (Species | Species[])[], ...specialtyTypes: Type[]): TrainerConfig {
|
||||
// Check if the internationalization (i18n) system is initialized.
|
||||
if (!getIsInitialized()) {
|
||||
@ -525,10 +599,10 @@ export class TrainerConfig {
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes the trainer configuration for a Champion.
|
||||
* @param {Species | Species[]} signatureSpecies - The signature species for the Champion.
|
||||
* @returns {TrainerConfig} - The updated TrainerConfig instance.
|
||||
**/
|
||||
* Initializes the trainer configuration for a Champion.
|
||||
* @param {Species | Species[]} signatureSpecies - The signature species for the Champion.
|
||||
* @returns {TrainerConfig} - The updated TrainerConfig instance.
|
||||
**/
|
||||
initForChampion(signatureSpecies: (Species | Species[])[]): TrainerConfig {
|
||||
// Check if the internationalization (i18n) system is initialized.
|
||||
if (!getIsInitialized()) {
|
||||
@ -558,6 +632,7 @@ export class TrainerConfig {
|
||||
// Set the title to "champion". (this is the key in the i18n file)
|
||||
this.setTitle("champion");
|
||||
|
||||
|
||||
// Configure various properties for the Champion.
|
||||
this.setMoneyMultiplier(10);
|
||||
this.setBoss();
|
||||
@ -570,11 +645,11 @@ export class TrainerConfig {
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the title for the trainer based on the provided trainer slot and variant.
|
||||
* @param {TrainerSlot} trainerSlot - The slot to determine which title to use. Defaults to TrainerSlot.NONE.
|
||||
* @param {TrainerVariant} variant - The variant of the trainer to determine the specific title.
|
||||
* @returns {string} - The title of the trainer.
|
||||
**/
|
||||
* Retrieves the title for the trainer based on the provided trainer slot and variant.
|
||||
* @param {TrainerSlot} trainerSlot - The slot to determine which title to use. Defaults to TrainerSlot.NONE.
|
||||
* @param {TrainerVariant} variant - The variant of the trainer to determine the specific title.
|
||||
* @returns {string} - The title of the trainer.
|
||||
**/
|
||||
getTitle(trainerSlot: TrainerSlot = TrainerSlot.NONE, variant: TrainerVariant): string {
|
||||
const ret = this.name;
|
||||
|
||||
@ -699,20 +774,161 @@ function getRandomTeraModifiers(party: EnemyPokemon[], count: integer, types?: T
|
||||
return ret;
|
||||
}
|
||||
|
||||
type SignatureSpecies = {
|
||||
[key in string]: (Species | Species[])[];
|
||||
};
|
||||
|
||||
/*
|
||||
* The signature species for each Gym Leader, Elite Four member, and Champion.
|
||||
* The key is the trainer type, and the value is an array of Species or Species arrays.
|
||||
* This is in a separate const so it can be accessed from other places and not just the trainerConfigs
|
||||
*/
|
||||
export const signatureSpecies: SignatureSpecies = {
|
||||
BROCK: [Species.GEODUDE, Species.ONIX],
|
||||
MISTY: [Species.STARYU, Species.PSYDUCK],
|
||||
LT_SURGE: [Species.VOLTORB, Species.PIKACHU, Species.ELECTABUZZ],
|
||||
ERIKA: [Species.ODDISH, Species.BELLSPROUT, Species.TANGELA, Species.HOPPIP],
|
||||
JANINE: [Species.VENONAT, Species.SPINARAK, Species.ZUBAT],
|
||||
SABRINA: [Species.ABRA, Species.MR_MIME, Species.ESPEON],
|
||||
BLAINE: [Species.GROWLITHE, Species.PONYTA, Species.MAGMAR],
|
||||
GIOVANNI: [Species.SANDILE, Species.MURKROW, Species.NIDORAN_M, Species.NIDORAN_F],
|
||||
FALKNER: [Species.PIDGEY, Species.HOOTHOOT, Species.DODUO],
|
||||
BUGSY: [Species.SCYTHER, Species.HERACROSS, Species.SHUCKLE, Species.PINSIR],
|
||||
WHITNEY: [Species.GIRAFARIG, Species.MILTANK],
|
||||
MORTY: [Species.GASTLY, Species.MISDREAVUS, Species.SABLEYE],
|
||||
CHUCK: [Species.POLIWRATH, Species.MANKEY],
|
||||
JASMINE: [Species.MAGNEMITE, Species.STEELIX],
|
||||
PRYCE: [Species.SEEL, Species.SWINUB],
|
||||
CLAIR: [Species.DRATINI, Species.HORSEA, Species.GYARADOS],
|
||||
ROXANNE: [Species.GEODUDE, Species.NOSEPASS],
|
||||
BRAWLY: [Species.MACHOP, Species.MAKUHITA],
|
||||
WATTSON: [Species.MAGNEMITE, Species.VOLTORB, Species.ELECTRIKE],
|
||||
FLANNERY: [Species.SLUGMA, Species.TORKOAL, Species.NUMEL],
|
||||
NORMAN: [Species.SLAKOTH, Species.SPINDA, Species.CHANSEY, Species.KANGASKHAN],
|
||||
WINONA: [Species.SWABLU, Species.WINGULL, Species.TROPIUS, Species.SKARMORY],
|
||||
TATE: [Species.SOLROCK, Species.NATU, Species.CHIMECHO, Species.GALLADE],
|
||||
LIZA: [Species.LUNATONE, Species.SPOINK, Species.BALTOY, Species.GARDEVOIR],
|
||||
JUAN: [Species.HORSEA, Species.BARBOACH, Species.SPHEAL, Species.RELICANTH],
|
||||
ROARK: [Species.CRANIDOS, Species.LARVITAR, Species.GEODUDE],
|
||||
GARDENIA: [Species.ROSELIA, Species.TANGELA, Species.TURTWIG],
|
||||
MAYLENE: [Species.LUCARIO, Species.MEDITITE, Species.CHIMCHAR],
|
||||
CRASHER_WAKE: [Species.BUIZEL, Species.MAGIKARP, Species.PIPLUP],
|
||||
FANTINA: [Species.MISDREAVUS, Species.DRIFLOON, Species.SPIRITOMB],
|
||||
BYRON: [Species.SHIELDON, Species.BRONZOR, Species.AGGRON],
|
||||
CANDICE: [Species.SNEASEL, Species.SNOVER, Species.SNORUNT],
|
||||
VOLKNER: [Species.SHINX, Species.CHINCHOU, Species.ROTOM],
|
||||
CILAN: [Species.PANSAGE, Species.COTTONEE, Species.PETILIL],
|
||||
CHILI: [Species.PANSEAR, Species.DARUMAKA, Species.HEATMOR],
|
||||
CRESS: [Species.PANPOUR, Species.BASCULIN, Species.TYMPOLE],
|
||||
CHEREN: [Species.LILLIPUP, Species.MINCCINO, Species.PATRAT],
|
||||
LENORA: [Species.KANGASKHAN, Species.DEERLING, Species.AUDINO],
|
||||
ROXIE: [Species.VENIPEDE, Species.TRUBBISH, Species.SKORUPI],
|
||||
BURGH: [Species.SEWADDLE, Species.SHELMET, Species.KARRABLAST],
|
||||
ELESA: [Species.EMOLGA, Species.BLITZLE, Species.JOLTIK],
|
||||
CLAY: [Species.DRILBUR, Species.SANDILE, Species.GOLETT],
|
||||
SKYLA: [Species.DUCKLETT, Species.WOOBAT, Species.RUFFLET],
|
||||
BRYCEN: [Species.CRYOGONAL, Species.VANILLITE, Species.CUBCHOO],
|
||||
DRAYDEN: [Species.DRUDDIGON, Species.AXEW, Species.DEINO],
|
||||
MARLON: [Species.WAILMER, Species.FRILLISH, Species.TIRTOUGA],
|
||||
VIOLA: [Species.SURSKIT, Species.SCATTERBUG],
|
||||
GRANT: [Species.AMAURA, Species.TYRUNT],
|
||||
KORRINA: [Species.HAWLUCHA, Species.LUCARIO, Species.MIENFOO],
|
||||
RAMOS: [Species.SKIDDO, Species.HOPPIP, Species.BELLSPROUT],
|
||||
CLEMONT: [Species.HELIOPTILE, Species.MAGNEMITE, Species.EMOLGA],
|
||||
VALERIE: [Species.SYLVEON, Species.MAWILE, Species.MR_MIME],
|
||||
OLYMPIA: [Species.ESPURR, Species.SIGILYPH, Species.SLOWKING],
|
||||
WULFRIC: [Species.BERGMITE, Species.SNOVER, Species.CRYOGONAL],
|
||||
MILO: [Species.GOSSIFLEUR, Species.APPLIN, Species.BOUNSWEET],
|
||||
NESSA: [Species.CHEWTLE, Species.ARROKUDA, Species.WIMPOD],
|
||||
KABU: [Species.SIZZLIPEDE, Species.VULPIX, Species.TORKOAL],
|
||||
BEA: [Species.GALAR_FARFETCHD, Species.MACHOP, Species.CLOBBOPUS],
|
||||
ALLISTER: [Species.GALAR_YAMASK, Species.GALAR_CORSOLA, Species.GASTLY],
|
||||
OPAL: [Species.MILCERY, Species.TOGETIC, Species.GALAR_WEEZING],
|
||||
BEDE: [Species.HATENNA, Species.GALAR_PONYTA, Species.GARDEVOIR],
|
||||
GORDIE: [Species.ROLYCOLY, Species.STONJOURNER, Species.BINACLE],
|
||||
MELONY: [Species.SNOM, Species.GALAR_DARUMAKA, Species.GALAR_MR_MIME],
|
||||
PIERS: [Species.GALAR_ZIGZAGOON, Species.SCRAGGY, Species.INKAY],
|
||||
MARNIE: [Species.IMPIDIMP, Species.PURRLOIN, Species.MORPEKO],
|
||||
RAIHAN: [Species.DURALUDON, Species.TURTONATOR, Species.GOOMY],
|
||||
KATY: [Species.NYMBLE, Species.TAROUNTULA, Species.HERACROSS],
|
||||
BRASSIUS: [Species.SMOLIV, Species.SHROOMISH, Species.ODDISH],
|
||||
IONO: [Species.TADBULB, Species.WATTREL, Species.VOLTORB],
|
||||
KOFU: [Species.VELUZA, Species.WIGLETT, Species.WINGULL],
|
||||
LARRY: [Species.STARLY, Species.DUNSPARCE, Species.KOMALA],
|
||||
RYME: [Species.GREAVARD, Species.SHUPPET, Species.MIMIKYU],
|
||||
TULIP: [Species.GIRAFARIG, Species.FLITTLE, Species.RALTS],
|
||||
GRUSHA: [Species.CETODDLE, Species.ALOLA_VULPIX, Species.CUBCHOO],
|
||||
LORELEI: [Species.SLOWBRO, Species.LAPRAS, Species.DEWGONG, Species.ALOLA_SANDSLASH],
|
||||
BRUNO: [Species.ONIX, Species.HITMONCHAN, Species.HITMONLEE, Species.ALOLA_GOLEM],
|
||||
AGATHA: [Species.GENGAR, Species.ARBOK, Species.CROBAT, Species.ALOLA_MAROWAK],
|
||||
LANCE: [Species.DRAGONITE, Species.GYARADOS, Species.AERODACTYL, Species.ALOLA_EXEGGUTOR],
|
||||
WILL: [Species.XATU, Species.JYNX, Species.SLOWBRO, Species.EXEGGUTOR],
|
||||
KOGA: [Species.WEEZING, Species.VENOMOTH, Species.CROBAT, Species.TENTACRUEL],
|
||||
KAREN: [Species.UMBREON, Species.HONCHKROW, Species.HOUNDOOM, Species.WEAVILE],
|
||||
SIDNEY: [Species.SHIFTRY, Species.SHARPEDO, Species.ABSOL, Species.ZOROARK],
|
||||
PHOEBE: [Species.SABLEYE, Species.DUSKNOIR, Species.BANETTE, Species.CHANDELURE],
|
||||
GLACIA: [Species.GLALIE, Species.WALREIN, Species.FROSLASS, Species.ABOMASNOW],
|
||||
DRAKE: [Species.ALTARIA, Species.SALAMENCE, Species.FLYGON, Species.KINGDRA],
|
||||
AARON: [Species.SCIZOR, Species.HERACROSS, Species.VESPIQUEN, Species.DRAPION],
|
||||
BERTHA: [Species.WHISCASH, Species.HIPPOWDON, Species.GLISCOR, Species.RHYPERIOR],
|
||||
FLINT: [Species.FLAREON, Species.HOUNDOOM, Species.RAPIDASH, Species.INFERNAPE],
|
||||
LUCIAN: [Species.MR_MIME, Species.GALLADE, Species.BRONZONG, Species.ALAKAZAM],
|
||||
SHAUNTAL: [Species.COFAGRIGUS, Species.CHANDELURE, Species.GOLURK, Species.DRIFBLIM],
|
||||
MARSHAL: [Species.TIMBURR, Species.MIENFOO, Species.THROH, Species.SAWK],
|
||||
GRIMSLEY: [Species.LIEPARD, Species.KINGAMBIT, Species.SCRAFTY, Species.KROOKODILE],
|
||||
CAITLIN: [Species.MUSHARNA, Species.GOTHITELLE, Species.SIGILYPH, Species.REUNICLUS],
|
||||
MALVA: [Species.PYROAR, Species.TORKOAL, Species.CHANDELURE, Species.TALONFLAME],
|
||||
SIEBOLD: [Species.CLAWITZER, Species.GYARADOS, Species.BARBARACLE, Species.STARMIE],
|
||||
WIKSTROM: [Species.KLEFKI, Species.PROBOPASS, Species.SCIZOR, Species.AEGISLASH],
|
||||
DRASNA: [Species.DRAGALGE, Species.DRUDDIGON, Species.ALTARIA, Species.NOIVERN],
|
||||
HALA: [Species.HARIYAMA, Species.BEWEAR, Species.CRABOMINABLE, Species.POLIWRATH],
|
||||
MOLAYNE: [Species.KLEFKI, Species.MAGNEZONE, Species.METAGROSS, Species.ALOLA_DUGTRIO],
|
||||
OLIVIA: [Species.ARMALDO, Species.CRADILY, Species.ALOLA_GOLEM, Species.LYCANROC],
|
||||
ACEROLA: [Species.BANETTE, Species.DRIFBLIM, Species.DHELMISE, Species.PALOSSAND],
|
||||
KAHILI: [Species.BRAVIARY, Species.HAWLUCHA, Species.ORICORIO, Species.TOUCANNON],
|
||||
MARNIE_ELITE: [ Species.MORPEKO, Species.LIEPARD, Species.TOXICROAK,Species.SCRAFTY, Species.GRIMMSNARL],
|
||||
NESSA_ELITE: [ Species.GOLISOPOD,Species.PELIPPER,Species.QUAGSIRE,Species.TOXAPEX,Species.DREDNAW],
|
||||
BEA_ELITE: [ Species.HAWLUCHA,Species.GRAPPLOCT,Species.SIRFETCHD,Species.FALINKS,Species.MACHAMP],
|
||||
ALLISTER_ELITE:[ Species.DUSKNOIR,Species.CHANDELURE,Species.CURSOLA,Species.RUNERIGUS,Species.GENGAR],
|
||||
RAIHAN_ELITE: [ Species.TORKOAL,Species.GOODRA,Species.TURTONATOR,Species.FLYGON,Species.DURALUDON],
|
||||
RIKA: [Species.WHISCASH, Species.DONPHAN, Species.CAMERUPT, Species.CLODSIRE],
|
||||
POPPY: [Species.COPPERAJAH, Species.BRONZONG, Species.CORVIKNIGHT, Species.TINKATON],
|
||||
LARRY_ELITE: [Species.STARAPTOR, Species.FLAMIGO, Species.ALTARIA, Species.TROPIUS],
|
||||
HASSEL: [Species.NOIVERN, Species.HAXORUS, Species.DRAGALGE, Species.BAXCALIBUR],
|
||||
CRISPIN: [Species.TALONFLAME, Species.CAMERUPT, Species.MAGMORTAR, Species.BLAZIKEN],
|
||||
AMARYS: [Species.SKARMORY, Species.EMPOLEON, Species.SCIZOR, Species.METAGROSS],
|
||||
LACEY: [Species.EXCADRILL, Species.PRIMARINA, Species.ALCREMIE, Species.GALAR_SLOWBRO],
|
||||
DRAYTON: [Species.DRAGONITE, Species.ARCHALUDON, Species.FLYGON, Species.SCEPTILE],
|
||||
BLUE: [Species.GYARADOS, Species.MEWTWO, Species.ARCANINE, Species.ALAKAZAM, Species.PIDGEOT],
|
||||
RED: [Species.CHARIZARD, [Species.LUGIA, Species.HO_OH], Species.SNORLAX, Species.RAICHU, Species.ESPEON],
|
||||
LANCE_CHAMPION: [Species.DRAGONITE, Species.ZYGARDE, Species.AERODACTYL, Species.KINGDRA, Species.ALOLA_EXEGGUTOR],
|
||||
STEVEN: [Species.METAGROSS, [Species.DIALGA, Species.PALKIA], Species.SKARMORY, Species.AGGRON, Species.CARBINK],
|
||||
WALLACE: [Species.MILOTIC, Species.KYOGRE, Species.WHISCASH, Species.WALREIN, Species.LUDICOLO],
|
||||
CYNTHIA: [Species.SPIRITOMB, Species.GIRATINA, Species.GARCHOMP, Species.MILOTIC, Species.LUCARIO, Species.TOGEKISS],
|
||||
ALDER: [Species.VOLCARONA, Species.GROUDON, Species.BOUFFALANT, Species.ACCELGOR, Species.CONKELDURR],
|
||||
IRIS: [Species.HAXORUS, Species.YVELTAL, Species.DRUDDIGON, Species.ARON, Species.LAPRAS],
|
||||
DIANTHA: [Species.HAWLUCHA, Species.XERNEAS, Species.GOURGEIST, Species.GOODRA, Species.GARDEVOIR],
|
||||
HAU: [Species.ALOLA_RAICHU, [Species.SOLGALEO, Species.LUNALA], Species.NOIVERN, [Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA], Species.CRABOMINABLE],
|
||||
GEETA: [Species.GLIMMORA, Species.MIRAIDON, Species.ESPATHRA, Species.VELUZA, Species.KINGAMBIT],
|
||||
NEMONA: [Species.LYCANROC, Species.KORAIDON, Species.KOMMO_O, Species.PAWMOT, Species.DUSKNOIR],
|
||||
KIERAN: [Species.POLITOED, [Species.OGERPON, Species.TERAPAGOS], Species.HYDRAPPLE, Species.PORYGON_Z, Species.GRIMMSNARL],
|
||||
LEON: [Species.DRAGAPULT, [Species.ZACIAN, Species.ZAMAZENTA], Species.SEISMITOAD, Species.AEGISLASH, Species.CHARIZARD],
|
||||
};
|
||||
|
||||
export const trainerConfigs: TrainerConfigs = {
|
||||
[TrainerType.UNKNOWN]: new TrainerConfig(0).setHasGenders(),
|
||||
[TrainerType.ACE_TRAINER]: new TrainerConfig(++t).setHasGenders("Ace Trainer Female").setHasDouble("Ace Duo").setMoneyMultiplier(2.25).setEncounterBgm(TrainerType.ACE_TRAINER)
|
||||
.setPartyTemplateFunc(scene => getWavePartyTemplate(scene, trainerPartyTemplates.THREE_WEAK_BALANCED, trainerPartyTemplates.FOUR_WEAK_BALANCED, trainerPartyTemplates.FIVE_WEAK_BALANCED, trainerPartyTemplates.SIX_WEAK_BALANCED)),
|
||||
[TrainerType.ARTIST]: new TrainerConfig(++t).setEncounterBgm(TrainerType.RICH).setPartyTemplates(trainerPartyTemplates.ONE_STRONG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.THREE_AVG)
|
||||
.setSpeciesPools([ Species.SMEARGLE ]),
|
||||
.setSpeciesPools([Species.SMEARGLE]),
|
||||
[TrainerType.BACKERS]: new TrainerConfig(++t).setHasGenders("Backers").setDoubleOnly().setEncounterBgm(TrainerType.CYCLIST),
|
||||
[TrainerType.BACKPACKER]: new TrainerConfig(++t).setHasGenders("Backpacker Female").setHasDouble("Backpackers").setSpeciesFilter(s => s.isOfType(Type.FLYING) || s.isOfType(Type.ROCK)).setEncounterBgm(TrainerType.BACKPACKER)
|
||||
.setPartyTemplates(trainerPartyTemplates.ONE_STRONG, trainerPartyTemplates.ONE_WEAK_ONE_STRONG, trainerPartyTemplates.ONE_AVG_ONE_STRONG)
|
||||
.setSpeciesPools({
|
||||
[TrainerPoolTier.COMMON]: [ Species.RHYHORN, Species.AIPOM, Species.MAKUHITA, Species.MAWILE, Species.NUMEL, Species.LILLIPUP, Species.SANDILE, Species.WOOLOO ],
|
||||
[TrainerPoolTier.UNCOMMON]: [ Species.GIRAFARIG, Species.ZANGOOSE, Species.SEVIPER, Species.CUBCHOO, Species.PANCHAM, Species.SKIDDO, Species.MUDBRAY ],
|
||||
[TrainerPoolTier.RARE]: [ Species.TAUROS, Species.STANTLER, Species.DARUMAKA, Species.BOUFFALANT, Species.DEERLING, Species.IMPIDIMP ],
|
||||
[TrainerPoolTier.SUPER_RARE]: [ Species.GALAR_DARUMAKA, Species.TEDDIURSA ]
|
||||
[TrainerPoolTier.COMMON]: [Species.RHYHORN, Species.AIPOM, Species.MAKUHITA, Species.MAWILE, Species.NUMEL, Species.LILLIPUP, Species.SANDILE, Species.WOOLOO],
|
||||
[TrainerPoolTier.UNCOMMON]: [Species.GIRAFARIG, Species.ZANGOOSE, Species.SEVIPER, Species.CUBCHOO, Species.PANCHAM, Species.SKIDDO, Species.MUDBRAY],
|
||||
[TrainerPoolTier.RARE]: [Species.TAUROS, Species.STANTLER, Species.DARUMAKA, Species.BOUFFALANT, Species.DEERLING, Species.IMPIDIMP],
|
||||
[TrainerPoolTier.SUPER_RARE]: [Species.GALAR_DARUMAKA, Species.TEDDIURSA]
|
||||
}),
|
||||
[TrainerType.BAKER]: new TrainerConfig(++t).setEncounterBgm(TrainerType.CLERK).setMoneyMultiplier(1.35).setSpeciesFilter(s => s.isOfType(Type.GRASS) || s.isOfType(Type.FIRE)),
|
||||
[TrainerType.BEAUTY]: new TrainerConfig(++t).setMoneyMultiplier(1.55).setEncounterBgm(TrainerType.PARASOL_LADY),
|
||||
@ -720,11 +936,11 @@ export const trainerConfigs: TrainerConfigs = {
|
||||
[TrainerType.BLACK_BELT]: new TrainerConfig(++t).setHasGenders("Battle Girl", TrainerType.PSYCHIC).setHasDouble("Crush Kin").setEncounterBgm(TrainerType.ROUGHNECK).setSpecialtyTypes(Type.FIGHTING)
|
||||
.setPartyTemplates(trainerPartyTemplates.TWO_WEAK_ONE_AVG, trainerPartyTemplates.TWO_WEAK_ONE_AVG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_WEAK_ONE_STRONG, trainerPartyTemplates.THREE_AVG, trainerPartyTemplates.TWO_AVG_ONE_STRONG)
|
||||
.setSpeciesPools({
|
||||
[TrainerPoolTier.COMMON]: [ Species.NIDORAN_F, Species.NIDORAN_M, Species.MACHOP, Species.MAKUHITA, Species.MEDITITE, Species.CROAGUNK, Species.TIMBURR ],
|
||||
[TrainerPoolTier.UNCOMMON]: [ Species.MANKEY, Species.POLIWRATH, Species.TYROGUE, Species.BRELOOM, Species.SCRAGGY, Species.MIENFOO, Species.PANCHAM, Species.STUFFUL, Species.CRABRAWLER ],
|
||||
[TrainerPoolTier.RARE]: [ Species.HERACROSS, Species.RIOLU, Species.THROH, Species.SAWK, Species.PASSIMIAN, Species.CLOBBOPUS ],
|
||||
[TrainerPoolTier.SUPER_RARE]: [ Species.HITMONTOP, Species.INFERNAPE, Species.GALLADE, Species.HAWLUCHA, Species.HAKAMO_O ],
|
||||
[TrainerPoolTier.ULTRA_RARE]: [ Species.KUBFU ]
|
||||
[TrainerPoolTier.COMMON]: [Species.NIDORAN_F, Species.NIDORAN_M, Species.MACHOP, Species.MAKUHITA, Species.MEDITITE, Species.CROAGUNK, Species.TIMBURR],
|
||||
[TrainerPoolTier.UNCOMMON]: [Species.MANKEY, Species.POLIWRATH, Species.TYROGUE, Species.BRELOOM, Species.SCRAGGY, Species.MIENFOO, Species.PANCHAM, Species.STUFFUL, Species.CRABRAWLER],
|
||||
[TrainerPoolTier.RARE]: [Species.HERACROSS, Species.RIOLU, Species.THROH, Species.SAWK, Species.PASSIMIAN, Species.CLOBBOPUS],
|
||||
[TrainerPoolTier.SUPER_RARE]: [Species.HITMONTOP, Species.INFERNAPE, Species.GALLADE, Species.HAWLUCHA, Species.HAKAMO_O],
|
||||
[TrainerPoolTier.ULTRA_RARE]: [Species.KUBFU]
|
||||
}),
|
||||
[TrainerType.BREEDER]: new TrainerConfig(++t).setMoneyMultiplier(1.325).setEncounterBgm(TrainerType.POKEFAN).setHasGenders("Breeder Female").setHasDouble("Breeders")
|
||||
.setPartyTemplateFunc(scene => getWavePartyTemplate(scene, trainerPartyTemplates.FOUR_WEAKER, trainerPartyTemplates.FIVE_WEAKER, trainerPartyTemplates.SIX_WEAKER))
|
||||
@ -732,25 +948,25 @@ export const trainerConfigs: TrainerConfigs = {
|
||||
[TrainerType.CLERK]: new TrainerConfig(++t).setHasGenders("Clerk Female").setHasDouble("Colleagues").setEncounterBgm(TrainerType.CLERK)
|
||||
.setPartyTemplates(trainerPartyTemplates.TWO_WEAK, trainerPartyTemplates.THREE_WEAK, trainerPartyTemplates.ONE_AVG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_WEAK_ONE_AVG)
|
||||
.setSpeciesPools({
|
||||
[TrainerPoolTier.COMMON]: [ Species.MEOWTH, Species.PSYDUCK, Species.BUDEW, Species.PIDOVE, Species.CINCCINO, Species.LITLEO ],
|
||||
[TrainerPoolTier.UNCOMMON]: [ Species.JIGGLYPUFF, Species.MAGNEMITE, Species.MARILL, Species.COTTONEE, Species.SKIDDO ],
|
||||
[TrainerPoolTier.RARE]: [ Species.BUIZEL, Species.SNEASEL, Species.KLEFKI, Species.INDEEDEE ]
|
||||
[TrainerPoolTier.COMMON]: [Species.MEOWTH, Species.PSYDUCK, Species.BUDEW, Species.PIDOVE, Species.CINCCINO, Species.LITLEO],
|
||||
[TrainerPoolTier.UNCOMMON]: [Species.JIGGLYPUFF, Species.MAGNEMITE, Species.MARILL, Species.COTTONEE, Species.SKIDDO],
|
||||
[TrainerPoolTier.RARE]: [Species.BUIZEL, Species.SNEASEL, Species.KLEFKI, Species.INDEEDEE]
|
||||
}),
|
||||
[TrainerType.CYCLIST]: new TrainerConfig(++t).setMoneyMultiplier(1.3).setHasGenders("Cyclist Female").setHasDouble("Cyclists").setEncounterBgm(TrainerType.CYCLIST)
|
||||
.setPartyTemplates(trainerPartyTemplates.TWO_WEAK, trainerPartyTemplates.ONE_AVG)
|
||||
.setSpeciesPools({
|
||||
[TrainerPoolTier.COMMON]: [ Species.PICHU, Species.STARLY, Species.TAILLOW, Species.BOLTUND ],
|
||||
[TrainerPoolTier.UNCOMMON]: [ Species.DODUO, Species.ELECTRIKE, Species.BLITZLE, Species.WATTREL ],
|
||||
[TrainerPoolTier.RARE]: [ Species.YANMA, Species.NINJASK, Species.WHIRLIPEDE, Species.EMOLGA ],
|
||||
[TrainerPoolTier.SUPER_RARE]: [ Species.ACCELGOR, Species.DREEPY ]
|
||||
[TrainerPoolTier.COMMON]: [Species.PICHU, Species.STARLY, Species.TAILLOW, Species.BOLTUND],
|
||||
[TrainerPoolTier.UNCOMMON]: [Species.DODUO, Species.ELECTRIKE, Species.BLITZLE, Species.WATTREL],
|
||||
[TrainerPoolTier.RARE]: [Species.YANMA, Species.NINJASK, Species.WHIRLIPEDE, Species.EMOLGA],
|
||||
[TrainerPoolTier.SUPER_RARE]: [Species.ACCELGOR, Species.DREEPY]
|
||||
}),
|
||||
[TrainerType.DANCER]: new TrainerConfig(++t).setMoneyMultiplier(1.55).setEncounterBgm(TrainerType.CYCLIST)
|
||||
.setPartyTemplates(trainerPartyTemplates.TWO_WEAK, trainerPartyTemplates.ONE_AVG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_WEAK_SAME_TWO_WEAK_SAME)
|
||||
.setSpeciesPools({
|
||||
[TrainerPoolTier.COMMON]: [ Species.RALTS, Species.SPOINK, Species.LOTAD, Species.BUDEW ],
|
||||
[TrainerPoolTier.UNCOMMON]: [ Species.SPINDA, Species.SWABLU, Species.MARACTUS,],
|
||||
[TrainerPoolTier.RARE]: [ Species.BELLOSSOM, Species.HITMONTOP, Species.MIME_JR, Species.ORICORIO ],
|
||||
[TrainerPoolTier.SUPER_RARE]: [ Species.POPPLIO ]
|
||||
[TrainerPoolTier.COMMON]: [Species.RALTS, Species.SPOINK, Species.LOTAD, Species.BUDEW],
|
||||
[TrainerPoolTier.UNCOMMON]: [Species.SPINDA, Species.SWABLU, Species.MARACTUS,],
|
||||
[TrainerPoolTier.RARE]: [Species.BELLOSSOM, Species.HITMONTOP, Species.MIME_JR, Species.ORICORIO],
|
||||
[TrainerPoolTier.SUPER_RARE]: [Species.POPPLIO]
|
||||
}),
|
||||
[TrainerType.DEPOT_AGENT]: new TrainerConfig(++t).setMoneyMultiplier(1.45).setEncounterBgm(TrainerType.CLERK),
|
||||
[TrainerType.DOCTOR]: new TrainerConfig(++t).setHasGenders("Nurse", "lass").setHasDouble("Medical Team").setMoneyMultiplier(3).setEncounterBgm(TrainerType.CLERK)
|
||||
@ -758,20 +974,20 @@ export const trainerConfigs: TrainerConfigs = {
|
||||
[TrainerType.FISHERMAN]: new TrainerConfig(++t).setMoneyMultiplier(1.25).setEncounterBgm(TrainerType.BACKPACKER).setSpecialtyTypes(Type.WATER)
|
||||
.setPartyTemplates(trainerPartyTemplates.TWO_WEAK_SAME_ONE_AVG, trainerPartyTemplates.ONE_AVG, trainerPartyTemplates.THREE_WEAK_SAME, trainerPartyTemplates.ONE_STRONG, trainerPartyTemplates.SIX_WEAKER)
|
||||
.setSpeciesPools({
|
||||
[TrainerPoolTier.COMMON]: [ Species.TENTACOOL, Species.MAGIKARP, Species.GOLDEEN, Species.STARYU, Species.REMORAID, Species.SKRELP, Species.CLAUNCHER, Species.ARROKUDA ],
|
||||
[TrainerPoolTier.UNCOMMON]: [ Species.POLIWAG, Species.SHELLDER, Species.KRABBY, Species.HORSEA, Species.CARVANHA, Species.BARBOACH, Species.CORPHISH, Species.FINNEON, Species.TYMPOLE, Species.BASCULIN, Species.FRILLISH, Species.INKAY ],
|
||||
[TrainerPoolTier.RARE]: [ Species.CHINCHOU, Species.CORSOLA, Species.WAILMER, Species.BARBOACH, Species.CLAMPERL, Species.LUVDISC, Species.MANTYKE, Species.ALOMOMOLA, Species.TATSUGIRI, Species.VELUZA ],
|
||||
[TrainerPoolTier.SUPER_RARE]: [ Species.LAPRAS, Species.FEEBAS, Species.RELICANTH, Species.DONDOZO ]
|
||||
[TrainerPoolTier.COMMON]: [Species.TENTACOOL, Species.MAGIKARP, Species.GOLDEEN, Species.STARYU, Species.REMORAID, Species.SKRELP, Species.CLAUNCHER, Species.ARROKUDA],
|
||||
[TrainerPoolTier.UNCOMMON]: [Species.POLIWAG, Species.SHELLDER, Species.KRABBY, Species.HORSEA, Species.CARVANHA, Species.BARBOACH, Species.CORPHISH, Species.FINNEON, Species.TYMPOLE, Species.BASCULIN, Species.FRILLISH, Species.INKAY],
|
||||
[TrainerPoolTier.RARE]: [Species.CHINCHOU, Species.CORSOLA, Species.WAILMER, Species.BARBOACH, Species.CLAMPERL, Species.LUVDISC, Species.MANTYKE, Species.ALOMOMOLA, Species.TATSUGIRI, Species.VELUZA],
|
||||
[TrainerPoolTier.SUPER_RARE]: [Species.LAPRAS, Species.FEEBAS, Species.RELICANTH, Species.DONDOZO]
|
||||
}),
|
||||
[TrainerType.GUITARIST]: new TrainerConfig(++t).setMoneyMultiplier(1.2).setEncounterBgm(TrainerType.ROUGHNECK).setSpecialtyTypes(Type.ELECTRIC).setSpeciesFilter(s => s.isOfType(Type.ELECTRIC)),
|
||||
[TrainerType.HARLEQUIN]: new TrainerConfig(++t).setEncounterBgm(TrainerType.PSYCHIC).setSpeciesFilter(s => tmSpecies[Moves.TRICK_ROOM].indexOf(s.speciesId) > -1),
|
||||
[TrainerType.HIKER]: new TrainerConfig(++t).setEncounterBgm(TrainerType.BACKPACKER)
|
||||
.setPartyTemplates(trainerPartyTemplates.TWO_AVG_SAME_ONE_AVG, trainerPartyTemplates.TWO_AVG_SAME_ONE_STRONG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.FOUR_WEAK, trainerPartyTemplates.ONE_STRONG)
|
||||
.setSpeciesPools({
|
||||
[TrainerPoolTier.COMMON]: [ Species.SANDSHREW, Species.DIGLETT, Species.GEODUDE, Species.MACHOP, Species.ARON, Species.ROGGENROLA, Species.DRILBUR, Species.NACLI ],
|
||||
[TrainerPoolTier.UNCOMMON]: [ Species.ZUBAT, Species.RHYHORN, Species.ONIX, Species.CUBONE, Species.WOOBAT, Species.SWINUB, Species.NOSEPASS, Species.HIPPOPOTAS, Species.DWEBBLE, Species.KLAWF, Species.TOEDSCOOL ],
|
||||
[TrainerPoolTier.RARE]: [ Species.TORKOAL, Species.TRAPINCH, Species.BARBOACH, Species.GOLETT, Species.ALOLA_DIGLETT, Species.ALOLA_GEODUDE, Species.GALAR_STUNFISK, Species.PALDEA_WOOPER ],
|
||||
[TrainerPoolTier.SUPER_RARE]: [ Species.MAGBY, Species.LARVITAR ]
|
||||
[TrainerPoolTier.COMMON]: [Species.SANDSHREW, Species.DIGLETT, Species.GEODUDE, Species.MACHOP, Species.ARON, Species.ROGGENROLA, Species.DRILBUR, Species.NACLI],
|
||||
[TrainerPoolTier.UNCOMMON]: [Species.ZUBAT, Species.RHYHORN, Species.ONIX, Species.CUBONE, Species.WOOBAT, Species.SWINUB, Species.NOSEPASS, Species.HIPPOPOTAS, Species.DWEBBLE, Species.KLAWF, Species.TOEDSCOOL],
|
||||
[TrainerPoolTier.RARE]: [Species.TORKOAL, Species.TRAPINCH, Species.BARBOACH, Species.GOLETT, Species.ALOLA_DIGLETT, Species.ALOLA_GEODUDE, Species.GALAR_STUNFISK, Species.PALDEA_WOOPER],
|
||||
[TrainerPoolTier.SUPER_RARE]: [Species.MAGBY, Species.LARVITAR]
|
||||
}),
|
||||
[TrainerType.HOOLIGANS]: new TrainerConfig(++t).setDoubleOnly().setEncounterBgm(TrainerType.ROUGHNECK).setSpeciesFilter(s => s.isOfType(Type.POISON) || s.isOfType(Type.DARK)),
|
||||
[TrainerType.HOOPSTER]: new TrainerConfig(++t).setMoneyMultiplier(1.2).setEncounterBgm(TrainerType.CYCLIST),
|
||||
@ -787,11 +1003,11 @@ export const trainerConfigs: TrainerConfigs = {
|
||||
[TrainerType.OFFICER]: new TrainerConfig(++t).setMoneyMultiplier(1.55).setEncounterBgm(TrainerType.CLERK)
|
||||
.setPartyTemplates(trainerPartyTemplates.ONE_AVG, trainerPartyTemplates.ONE_STRONG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_WEAK_SAME_ONE_AVG)
|
||||
.setSpeciesPools({
|
||||
[TrainerPoolTier.COMMON]: [ Species.VULPIX, Species.GROWLITHE, Species.SNUBBULL, Species.POOCHYENA, Species.ELECTRIKE, Species.LILLIPUP, Species.YAMPER, Species.FIDOUGH ],
|
||||
[TrainerPoolTier.UNCOMMON]: [ Species.HOUNDOUR, Species.ROCKRUFF, Species.MASCHIFF ],
|
||||
[TrainerPoolTier.RARE]: [ Species.JOLTEON, Species.RIOLU ],
|
||||
[TrainerPoolTier.COMMON]: [Species.VULPIX, Species.GROWLITHE, Species.SNUBBULL, Species.POOCHYENA, Species.ELECTRIKE, Species.LILLIPUP, Species.YAMPER, Species.FIDOUGH],
|
||||
[TrainerPoolTier.UNCOMMON]: [Species.HOUNDOUR, Species.ROCKRUFF, Species.MASCHIFF],
|
||||
[TrainerPoolTier.RARE]: [Species.JOLTEON, Species.RIOLU],
|
||||
[TrainerPoolTier.SUPER_RARE]: [],
|
||||
[TrainerPoolTier.ULTRA_RARE]: [ Species.ENTEI, Species.SUICUNE, Species.RAIKOU ]
|
||||
[TrainerPoolTier.ULTRA_RARE]: [Species.ENTEI, Species.SUICUNE, Species.RAIKOU]
|
||||
}),
|
||||
[TrainerType.PARASOL_LADY]: new TrainerConfig(++t).setMoneyMultiplier(1.55).setEncounterBgm(TrainerType.PARASOL_LADY).setSpeciesFilter(s => s.isOfType(Type.WATER)),
|
||||
[TrainerType.PILOT]: new TrainerConfig(++t).setEncounterBgm(TrainerType.CLERK).setSpeciesFilter(s => tmSpecies[Moves.FLY].indexOf(s.speciesId) > -1),
|
||||
@ -800,222 +1016,227 @@ export const trainerConfigs: TrainerConfigs = {
|
||||
[TrainerType.PRESCHOOLER]: new TrainerConfig(++t).setMoneyMultiplier(0.2).setEncounterBgm(TrainerType.YOUNGSTER).setHasGenders("Preschooler Female", "lass").setHasDouble("Preschoolers")
|
||||
.setPartyTemplates(trainerPartyTemplates.THREE_WEAK, trainerPartyTemplates.FOUR_WEAKER, trainerPartyTemplates.TWO_WEAK_SAME_ONE_AVG, trainerPartyTemplates.FIVE_WEAKER)
|
||||
.setSpeciesPools({
|
||||
[TrainerPoolTier.COMMON]: [ Species.CATERPIE, Species.PICHU, Species.SANDSHREW, Species.LEDYBA, Species.BUDEW, Species.BURMY, Species.WOOLOO, Species.PAWMI, Species.SMOLIV ],
|
||||
[TrainerPoolTier.UNCOMMON]: [ Species.EEVEE, Species.CLEFFA, Species.IGGLYBUFF, Species.SWINUB, Species.WOOPER, Species.DRIFLOON, Species.DEDENNE, Species.STUFFUL ],
|
||||
[TrainerPoolTier.RARE]: [ Species.RALTS, Species.RIOLU, Species.JOLTIK, Species.TANDEMAUS ],
|
||||
[TrainerPoolTier.SUPER_RARE]: [ Species.DARUMAKA, Species.TINKATINK ],
|
||||
[TrainerPoolTier.COMMON]: [Species.CATERPIE, Species.PICHU, Species.SANDSHREW, Species.LEDYBA, Species.BUDEW, Species.BURMY, Species.WOOLOO, Species.PAWMI, Species.SMOLIV],
|
||||
[TrainerPoolTier.UNCOMMON]: [Species.EEVEE, Species.CLEFFA, Species.IGGLYBUFF, Species.SWINUB, Species.WOOPER, Species.DRIFLOON, Species.DEDENNE, Species.STUFFUL],
|
||||
[TrainerPoolTier.RARE]: [Species.RALTS, Species.RIOLU, Species.JOLTIK, Species.TANDEMAUS],
|
||||
[TrainerPoolTier.SUPER_RARE]: [Species.DARUMAKA, Species.TINKATINK],
|
||||
}),
|
||||
[TrainerType.PSYCHIC]: new TrainerConfig(++t).setHasGenders("Psychic Female").setHasDouble("Psychics").setMoneyMultiplier(1.4).setEncounterBgm(TrainerType.PSYCHIC)
|
||||
.setPartyTemplates(trainerPartyTemplates.TWO_WEAK, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_WEAK_SAME_ONE_AVG, trainerPartyTemplates.TWO_WEAK_SAME_TWO_WEAK_SAME, trainerPartyTemplates.ONE_STRONGER)
|
||||
.setSpeciesPools({
|
||||
[TrainerPoolTier.COMMON]: [ Species.ABRA, Species.DROWZEE, Species.RALTS, Species.SPOINK, Species.GOTHITA, Species.SOLOSIS, Species.BLIPBUG, Species.ESPURR, Species.HATENNA ],
|
||||
[TrainerPoolTier.UNCOMMON]: [ Species.MIME_JR, Species.EXEGGCUTE, Species.MEDITITE, Species.NATU, Species.EXEGGCUTE, Species.WOOBAT, Species.INKAY, Species.ORANGURU ],
|
||||
[TrainerPoolTier.RARE]: [ Species.ELGYEM, Species.SIGILYPH, Species.BALTOY, Species.GIRAFARIG, Species.MEOWSTIC ],
|
||||
[TrainerPoolTier.SUPER_RARE]: [ Species.BELDUM, Species.ESPEON, Species.STANTLER ],
|
||||
[TrainerPoolTier.COMMON]: [Species.ABRA, Species.DROWZEE, Species.RALTS, Species.SPOINK, Species.GOTHITA, Species.SOLOSIS, Species.BLIPBUG, Species.ESPURR, Species.HATENNA],
|
||||
[TrainerPoolTier.UNCOMMON]: [Species.MIME_JR, Species.EXEGGCUTE, Species.MEDITITE, Species.NATU, Species.EXEGGCUTE, Species.WOOBAT, Species.INKAY, Species.ORANGURU],
|
||||
[TrainerPoolTier.RARE]: [Species.ELGYEM, Species.SIGILYPH, Species.BALTOY, Species.GIRAFARIG, Species.MEOWSTIC],
|
||||
[TrainerPoolTier.SUPER_RARE]: [Species.BELDUM, Species.ESPEON, Species.STANTLER],
|
||||
}),
|
||||
[TrainerType.RANGER]: new TrainerConfig(++t).setMoneyMultiplier(1.4).setName("Pokémon Ranger").setEncounterBgm(TrainerType.BACKPACKER).setHasGenders("Pokémon Ranger Female").setHasDouble("Pokémon Rangers")
|
||||
.setSpeciesPools({
|
||||
[TrainerPoolTier.COMMON]: [ Species.PICHU, Species.GROWLITHE, Species.PONYTA, Species.ZIGZAGOON, Species.SEEDOT, Species.BIDOOF, Species.RIOLU, Species.SEWADDLE, Species.SKIDDO, Species.SALANDIT, Species.YAMPER ],
|
||||
[TrainerPoolTier.UNCOMMON]: [ Species.AZURILL, Species.TAUROS, Species.MAREEP, Species.FARFETCHD, Species.TEDDIURSA, Species.SHROOMISH, Species.ELECTRIKE, Species.BUDEW, Species.BUIZEL, Species.MUDBRAY, Species.STUFFUL ],
|
||||
[TrainerPoolTier.RARE]: [ Species.EEVEE, Species.SCYTHER, Species.KANGASKHAN, Species.RALTS, Species.MUNCHLAX, Species.ZORUA, Species.PALDEA_TAUROS, Species.TINKATINK, Species.CYCLIZAR, Species.FLAMIGO ],
|
||||
[TrainerPoolTier.SUPER_RARE]: [ Species.LARVESTA ],
|
||||
[TrainerPoolTier.COMMON]: [Species.PICHU, Species.GROWLITHE, Species.PONYTA, Species.ZIGZAGOON, Species.SEEDOT, Species.BIDOOF, Species.RIOLU, Species.SEWADDLE, Species.SKIDDO, Species.SALANDIT, Species.YAMPER],
|
||||
[TrainerPoolTier.UNCOMMON]: [Species.AZURILL, Species.TAUROS, Species.MAREEP, Species.FARFETCHD, Species.TEDDIURSA, Species.SHROOMISH, Species.ELECTRIKE, Species.BUDEW, Species.BUIZEL, Species.MUDBRAY, Species.STUFFUL],
|
||||
[TrainerPoolTier.RARE]: [Species.EEVEE, Species.SCYTHER, Species.KANGASKHAN, Species.RALTS, Species.MUNCHLAX, Species.ZORUA, Species.PALDEA_TAUROS, Species.TINKATINK, Species.CYCLIZAR, Species.FLAMIGO],
|
||||
[TrainerPoolTier.SUPER_RARE]: [Species.LARVESTA],
|
||||
}),
|
||||
[TrainerType.RICH]: new TrainerConfig(++t).setMoneyMultiplier(5).setName("Gentleman").setHasGenders("Madame").setHasDouble("Rich Couple"),
|
||||
[TrainerType.RICH_KID]: new TrainerConfig(++t).setMoneyMultiplier(3.75).setName("Rich Boy").setHasGenders("Lady").setHasDouble("Rich Kids").setEncounterBgm(TrainerType.RICH),
|
||||
[TrainerType.ROUGHNECK]: new TrainerConfig(++t).setMoneyMultiplier(1.4).setEncounterBgm(TrainerType.ROUGHNECK).setSpeciesFilter(s => s.isOfType(Type.DARK)),
|
||||
[TrainerType.SCIENTIST]: new TrainerConfig(++t).setHasGenders("Scientist Female").setHasDouble("Scientists").setMoneyMultiplier(1.7).setEncounterBgm(TrainerType.SCIENTIST)
|
||||
.setSpeciesPools({
|
||||
[TrainerPoolTier.COMMON]: [ Species.MAGNEMITE, Species.GRIMER, Species.DROWZEE, Species.VOLTORB, Species.KOFFING ],
|
||||
[TrainerPoolTier.UNCOMMON]: [ Species.BALTOY, Species.BRONZOR, Species.FERROSEED, Species.KLINK, Species.CHARJABUG, Species.BLIPBUG, Species.HELIOPTILE ],
|
||||
[TrainerPoolTier.RARE]: [ Species.ABRA, Species.DITTO, Species.PORYGON, Species.ELEKID, Species.SOLOSIS, Species.GALAR_WEEZING ],
|
||||
[TrainerPoolTier.SUPER_RARE]: [ Species.OMANYTE, Species.KABUTO, Species.AERODACTYL, Species.LILEEP, Species.ANORITH, Species.CRANIDOS, Species.SHIELDON, Species.TIRTOUGA, Species.ARCHEN, Species.ARCTOVISH, Species.ARCTOZOLT, Species.DRACOVISH, Species.DRACOZOLT ],
|
||||
[TrainerPoolTier.ULTRA_RARE]: [ Species.ROTOM, Species.MELTAN ]
|
||||
[TrainerPoolTier.COMMON]: [Species.MAGNEMITE, Species.GRIMER, Species.DROWZEE, Species.VOLTORB, Species.KOFFING],
|
||||
[TrainerPoolTier.UNCOMMON]: [Species.BALTOY, Species.BRONZOR, Species.FERROSEED, Species.KLINK, Species.CHARJABUG, Species.BLIPBUG, Species.HELIOPTILE],
|
||||
[TrainerPoolTier.RARE]: [Species.ABRA, Species.DITTO, Species.PORYGON, Species.ELEKID, Species.SOLOSIS, Species.GALAR_WEEZING],
|
||||
[TrainerPoolTier.SUPER_RARE]: [Species.OMANYTE, Species.KABUTO, Species.AERODACTYL, Species.LILEEP, Species.ANORITH, Species.CRANIDOS, Species.SHIELDON, Species.TIRTOUGA, Species.ARCHEN, Species.ARCTOVISH, Species.ARCTOZOLT, Species.DRACOVISH, Species.DRACOZOLT],
|
||||
[TrainerPoolTier.ULTRA_RARE]: [Species.ROTOM, Species.MELTAN]
|
||||
}),
|
||||
[TrainerType.SMASHER]: new TrainerConfig(++t).setMoneyMultiplier(1.2).setEncounterBgm(TrainerType.CYCLIST),
|
||||
[TrainerType.SNOW_WORKER]: new TrainerConfig(++t).setName("Worker").setHasGenders("Worker Female").setHasDouble("Workers").setMoneyMultiplier(1.7).setEncounterBgm(TrainerType.CLERK).setSpeciesFilter(s => s.isOfType(Type.ICE) || s.isOfType(Type.STEEL)),
|
||||
[TrainerType.STRIKER]: new TrainerConfig(++t).setMoneyMultiplier(1.2).setEncounterBgm(TrainerType.CYCLIST),
|
||||
[TrainerType.SCHOOL_KID]: new TrainerConfig(++t).setMoneyMultiplier(0.75).setEncounterBgm(TrainerType.YOUNGSTER).setHasGenders("School Kid Female", "lass").setHasDouble("School Kids")
|
||||
.setSpeciesPools({
|
||||
[TrainerPoolTier.COMMON]: [ Species.ODDISH, Species.EXEGGCUTE, Species.TEDDIURSA, Species.WURMPLE, Species.RALTS, Species.SHROOMISH, Species.FLETCHLING ],
|
||||
[TrainerPoolTier.UNCOMMON]: [ Species.VOLTORB, Species.WHISMUR, Species.MEDITITE, Species.MIME_JR, Species.NYMBLE ],
|
||||
[TrainerPoolTier.RARE]: [ Species.TANGELA, Species.EEVEE, Species.YANMA ],
|
||||
[TrainerPoolTier.SUPER_RARE]: [ Species.TADBULB ]
|
||||
[TrainerPoolTier.COMMON]: [Species.ODDISH, Species.EXEGGCUTE, Species.TEDDIURSA, Species.WURMPLE, Species.RALTS, Species.SHROOMISH, Species.FLETCHLING],
|
||||
[TrainerPoolTier.UNCOMMON]: [Species.VOLTORB, Species.WHISMUR, Species.MEDITITE, Species.MIME_JR, Species.NYMBLE],
|
||||
[TrainerPoolTier.RARE]: [Species.TANGELA, Species.EEVEE, Species.YANMA],
|
||||
[TrainerPoolTier.SUPER_RARE]: [Species.TADBULB]
|
||||
}),
|
||||
[TrainerType.SWIMMER]: new TrainerConfig(++t).setMoneyMultiplier(1.3).setEncounterBgm(TrainerType.PARASOL_LADY).setHasGenders("Swimmer Female").setHasDouble("Swimmers").setSpecialtyTypes(Type.WATER).setSpeciesFilter(s => s.isOfType(Type.WATER)),
|
||||
[TrainerType.TWINS]: new TrainerConfig(++t).setDoubleOnly().setMoneyMultiplier(0.65).setUseSameSeedForAllMembers()
|
||||
.setPartyTemplateFunc(scene => getWavePartyTemplate(scene, trainerPartyTemplates.TWO_WEAK, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_STRONG))
|
||||
.setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.PLUSLE, Species.VOLBEAT, Species.PACHIRISU, Species.SILCOON, Species.METAPOD, Species.IGGLYBUFF, Species.PETILIL, Species.EEVEE ]))
|
||||
.setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.MINUN, Species.ILLUMISE, Species.EMOLGA, Species.CASCOON, Species.KAKUNA, Species.CLEFFA, Species.COTTONEE, Species.EEVEE ], TrainerSlot.TRAINER_PARTNER))
|
||||
.setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.PLUSLE, Species.VOLBEAT, Species.PACHIRISU, Species.SILCOON, Species.METAPOD, Species.IGGLYBUFF, Species.PETILIL, Species.EEVEE]))
|
||||
.setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.MINUN, Species.ILLUMISE, Species.EMOLGA, Species.CASCOON, Species.KAKUNA, Species.CLEFFA, Species.COTTONEE, Species.EEVEE], TrainerSlot.TRAINER_PARTNER))
|
||||
.setEncounterBgm(TrainerType.TWINS),
|
||||
[TrainerType.VETERAN]: new TrainerConfig(++t).setHasGenders("Veteran Female").setHasDouble("Veteran Duo").setMoneyMultiplier(2.5).setEncounterBgm(TrainerType.ACE_TRAINER).setSpeciesFilter(s => s.isOfType(Type.DRAGON)),
|
||||
[TrainerType.WAITER]: new TrainerConfig(++t).setHasGenders("Waitress").setHasDouble("Restaurant Staff").setMoneyMultiplier(1.5).setEncounterBgm(TrainerType.CLERK)
|
||||
.setSpeciesPools({
|
||||
[TrainerPoolTier.COMMON]: [ Species.CLEFFA, Species.CHATOT, Species.PANSAGE, Species.PANSEAR, Species.PANPOUR, Species.MINCCINO ],
|
||||
[TrainerPoolTier.UNCOMMON]: [ Species.TROPIUS, Species.PETILIL, Species.BOUNSWEET, Species.INDEEDEE ],
|
||||
[TrainerPoolTier.RARE]: [ Species.APPLIN, Species.SINISTEA, Species.POLTCHAGEIST ]
|
||||
[TrainerPoolTier.COMMON]: [Species.CLEFFA, Species.CHATOT, Species.PANSAGE, Species.PANSEAR, Species.PANPOUR, Species.MINCCINO],
|
||||
[TrainerPoolTier.UNCOMMON]: [Species.TROPIUS, Species.PETILIL, Species.BOUNSWEET, Species.INDEEDEE],
|
||||
[TrainerPoolTier.RARE]: [Species.APPLIN, Species.SINISTEA, Species.POLTCHAGEIST]
|
||||
}),
|
||||
[TrainerType.WORKER]: new TrainerConfig(++t).setHasGenders("Worker Female").setHasDouble("Workers").setEncounterBgm(TrainerType.CLERK).setMoneyMultiplier(1.7).setSpeciesFilter(s => s.isOfType(Type.ROCK) || s.isOfType(Type.STEEL)),
|
||||
[TrainerType.YOUNGSTER]: new TrainerConfig(++t).setMoneyMultiplier(0.5).setEncounterBgm(TrainerType.YOUNGSTER).setHasGenders("Lass", "lass").setHasDouble("Beginners").setPartyTemplates(trainerPartyTemplates.TWO_WEAKER)
|
||||
.setSpeciesPools(
|
||||
[ Species.CATERPIE, Species.WEEDLE, Species.RATTATA, Species.SENTRET, Species.POOCHYENA, Species.ZIGZAGOON, Species.WURMPLE, Species.BIDOOF, Species.PATRAT, Species.LILLIPUP ]
|
||||
[Species.CATERPIE, Species.WEEDLE, Species.RATTATA, Species.SENTRET, Species.POOCHYENA, Species.ZIGZAGOON, Species.WURMPLE, Species.BIDOOF, Species.PATRAT, Species.LILLIPUP]
|
||||
),
|
||||
[TrainerType.BROCK]: new TrainerConfig((t = TrainerType.BROCK)).initForGymLeader([ Species.GEODUDE, Species.ONIX ], Type.ROCK).setBattleBgm("battle_kanto_gym"),
|
||||
[TrainerType.MISTY]: new TrainerConfig(++t).initForGymLeader([ Species.STARYU, Species.PSYDUCK ], Type.WATER).setBattleBgm("battle_kanto_gym"),
|
||||
[TrainerType.LT_SURGE]: new TrainerConfig(++t).initForGymLeader([ Species.VOLTORB, Species.PIKACHU, Species.ELECTABUZZ ], Type.ELECTRIC).setBattleBgm("battle_kanto_gym"),
|
||||
[TrainerType.ERIKA]: new TrainerConfig(++t).initForGymLeader([ Species.ODDISH, Species.BELLSPROUT, Species.TANGELA, Species.HOPPIP ], Type.GRASS).setBattleBgm("battle_kanto_gym"),
|
||||
[TrainerType.JANINE]: new TrainerConfig(++t).initForGymLeader([ Species.VENONAT, Species.SPINARAK, Species.ZUBAT ], Type.POISON).setBattleBgm("battle_kanto_gym"),
|
||||
[TrainerType.SABRINA]: new TrainerConfig(++t).initForGymLeader([ Species.ABRA, Species.MR_MIME, Species.ESPEON ], Type.PSYCHIC).setBattleBgm("battle_kanto_gym"),
|
||||
[TrainerType.BLAINE]: new TrainerConfig(++t).initForGymLeader([ Species.GROWLITHE, Species.PONYTA, Species.MAGMAR ], Type.FIRE).setBattleBgm("battle_kanto_gym"),
|
||||
[TrainerType.GIOVANNI]: new TrainerConfig(++t).initForGymLeader([ Species.SANDILE, Species.MURKROW, Species.NIDORAN_M, Species.NIDORAN_F ], Type.DARK).setBattleBgm("battle_kanto_gym"),
|
||||
[TrainerType.FALKNER]: new TrainerConfig(++t).initForGymLeader([ Species.PIDGEY, Species.HOOTHOOT, Species.DODUO ], Type.FLYING).setBattleBgm("battle_johto_gym"),
|
||||
[TrainerType.BUGSY]: new TrainerConfig(++t).initForGymLeader([ Species.SCYTHER, Species.HERACROSS, Species.SHUCKLE, Species.PINSIR ], Type.BUG).setBattleBgm("battle_johto_gym"),
|
||||
[TrainerType.WHITNEY]: new TrainerConfig(++t).initForGymLeader([ Species.GIRAFARIG, Species.MILTANK ], Type.NORMAL).setBattleBgm("battle_johto_gym"),
|
||||
[TrainerType.MORTY]: new TrainerConfig(++t).initForGymLeader([ Species.GASTLY, Species.MISDREAVUS, Species.SABLEYE ], Type.GHOST).setBattleBgm("battle_johto_gym"),
|
||||
[TrainerType.CHUCK]: new TrainerConfig(++t).initForGymLeader([ Species.POLIWRATH, Species.MANKEY ], Type.FIGHTING).setBattleBgm("battle_johto_gym"),
|
||||
[TrainerType.JASMINE]: new TrainerConfig(++t).initForGymLeader([ Species.MAGNEMITE, Species.STEELIX ], Type.STEEL).setBattleBgm("battle_johto_gym"),
|
||||
[TrainerType.PRYCE]: new TrainerConfig(++t).initForGymLeader([ Species.SEEL, Species.SWINUB ], Type.ICE).setBattleBgm("battle_johto_gym"),
|
||||
[TrainerType.CLAIR]: new TrainerConfig(++t).initForGymLeader([ Species.DRATINI, Species.HORSEA, Species.GYARADOS ], Type.DRAGON).setBattleBgm("battle_johto_gym"),
|
||||
[TrainerType.ROXANNE]: new TrainerConfig(++t).initForGymLeader([ Species.GEODUDE, Species.NOSEPASS ], Type.ROCK).setBattleBgm("battle_hoenn_gym"),
|
||||
[TrainerType.BRAWLY]: new TrainerConfig(++t).initForGymLeader([ Species.MACHOP, Species.MAKUHITA ], Type.FIGHTING).setBattleBgm("battle_hoenn_gym"),
|
||||
[TrainerType.WATTSON]: new TrainerConfig(++t).initForGymLeader([ Species.MAGNEMITE, Species.VOLTORB, Species.ELECTRIKE ], Type.ELECTRIC).setBattleBgm("battle_hoenn_gym"),
|
||||
[TrainerType.FLANNERY]: new TrainerConfig(++t).initForGymLeader([ Species.SLUGMA, Species.TORKOAL, Species.NUMEL ], Type.FIRE).setBattleBgm("battle_hoenn_gym"),
|
||||
[TrainerType.NORMAN]: new TrainerConfig(++t).initForGymLeader([ Species.SLAKOTH, Species.SPINDA, Species.CHANSEY, Species.KANGASKHAN ], Type.NORMAL).setBattleBgm("battle_hoenn_gym"),
|
||||
[TrainerType.WINONA]: new TrainerConfig(++t).initForGymLeader([ Species.SWABLU, Species.WINGULL, Species.TROPIUS, Species.SKARMORY ], Type.FLYING).setBattleBgm("battle_hoenn_gym"),
|
||||
[TrainerType.TATE]: new TrainerConfig(++t).initForGymLeader([ Species.SOLROCK, Species.NATU, Species.CHIMECHO, Species.GALLADE ], Type.PSYCHIC).setBattleBgm("battle_hoenn_gym"),
|
||||
[TrainerType.LIZA]: new TrainerConfig(++t).initForGymLeader([ Species.LUNATONE, Species.SPOINK, Species.BALTOY, Species.GARDEVOIR ], Type.PSYCHIC).setBattleBgm("battle_hoenn_gym"),
|
||||
[TrainerType.JUAN]: new TrainerConfig(++t).initForGymLeader([ Species.HORSEA, Species.BARBOACH, Species.SPHEAL, Species.RELICANTH ], Type.WATER).setBattleBgm("battle_hoenn_gym"),
|
||||
[TrainerType.ROARK]: new TrainerConfig(++t).initForGymLeader([ Species.CRANIDOS, Species.LARVITAR, Species.GEODUDE ], Type.ROCK).setBattleBgm("battle_sinnoh_gym"),
|
||||
[TrainerType.GARDENIA]: new TrainerConfig(++t).initForGymLeader([ Species.ROSELIA, Species.TANGELA, Species.TURTWIG ], Type.GRASS).setBattleBgm("battle_sinnoh_gym"),
|
||||
[TrainerType.MAYLENE]: new TrainerConfig(++t).initForGymLeader([ Species.LUCARIO, Species.MEDITITE, Species.CHIMCHAR ], Type.FIGHTING).setBattleBgm("battle_sinnoh_gym"),
|
||||
[TrainerType.CRASHER_WAKE]: new TrainerConfig(++t).initForGymLeader([ Species.BUIZEL, Species.MAGIKARP, Species.PIPLUP ], Type.WATER).setBattleBgm("battle_sinnoh_gym"),
|
||||
[TrainerType.FANTINA]: new TrainerConfig(++t).initForGymLeader([ Species.MISDREAVUS, Species.DRIFLOON, Species.SPIRITOMB ], Type.GHOST).setBattleBgm("battle_sinnoh_gym"),
|
||||
[TrainerType.BYRON]: new TrainerConfig(++t).initForGymLeader([ Species.SHIELDON, Species.BRONZOR, Species.AGGRON ], Type.STEEL).setBattleBgm("battle_sinnoh_gym"),
|
||||
[TrainerType.CANDICE]: new TrainerConfig(++t).initForGymLeader([ Species.SNEASEL, Species.SNOVER, Species.SNORUNT ], Type.ICE).setBattleBgm("battle_sinnoh_gym"),
|
||||
[TrainerType.VOLKNER]: new TrainerConfig(++t).initForGymLeader([ Species.SHINX, Species.CHINCHOU, Species.ROTOM ], Type.ELECTRIC).setBattleBgm("battle_sinnoh_gym"),
|
||||
[TrainerType.CILAN]: new TrainerConfig(++t).initForGymLeader([ Species.PANSAGE, Species.COTTONEE, Species.PETILIL ], Type.GRASS),
|
||||
[TrainerType.CHILI]: new TrainerConfig(++t).initForGymLeader([ Species.PANSEAR, Species.DARUMAKA, Species.HEATMOR ], Type.FIRE),
|
||||
[TrainerType.CRESS]: new TrainerConfig(++t).initForGymLeader([ Species.PANPOUR, Species.BASCULIN, Species.TYMPOLE ], Type.WATER),
|
||||
[TrainerType.CHEREN]: new TrainerConfig(++t).initForGymLeader([ Species.LILLIPUP, Species.MINCCINO, Species.PATRAT ], Type.NORMAL),
|
||||
[TrainerType.LENORA]: new TrainerConfig(++t).initForGymLeader([ Species.KANGASKHAN, Species.DEERLING, Species.AUDINO ], Type.NORMAL),
|
||||
[TrainerType.ROXIE]: new TrainerConfig(++t).initForGymLeader([ Species.VENIPEDE, Species.TRUBBISH, Species.SKORUPI ], Type.POISON),
|
||||
[TrainerType.BURGH]: new TrainerConfig(++t).initForGymLeader([ Species.SEWADDLE, Species.SHELMET, Species.KARRABLAST ], Type.BUG),
|
||||
[TrainerType.ELESA]: new TrainerConfig(++t).initForGymLeader([ Species.EMOLGA, Species.BLITZLE, Species.JOLTIK ], Type.ELECTRIC),
|
||||
[TrainerType.CLAY]: new TrainerConfig(++t).initForGymLeader([ Species.DRILBUR, Species.SANDILE, Species.GOLETT ], Type.GROUND),
|
||||
[TrainerType.SKYLA]: new TrainerConfig(++t).initForGymLeader([ Species.DUCKLETT, Species.WOOBAT, Species.RUFFLET ], Type.FLYING),
|
||||
[TrainerType.BRYCEN]: new TrainerConfig(++t).initForGymLeader([ Species.CRYOGONAL, Species.VANILLITE, Species.CUBCHOO ], Type.ICE),
|
||||
[TrainerType.DRAYDEN]: new TrainerConfig(++t).initForGymLeader([ Species.DRUDDIGON, Species.AXEW, Species.DEINO ], Type.DRAGON),
|
||||
[TrainerType.MARLON]: new TrainerConfig(++t).initForGymLeader([ Species.WAILMER, Species.FRILLISH, Species.TIRTOUGA ], Type.WATER),
|
||||
[TrainerType.VIOLA]: new TrainerConfig(++t).initForGymLeader([ Species.SURSKIT, Species.SCATTERBUG ], Type.BUG),
|
||||
[TrainerType.GRANT]: new TrainerConfig(++t).initForGymLeader([ Species.AMAURA, Species.TYRUNT ], Type.ROCK),
|
||||
[TrainerType.KORRINA]: new TrainerConfig(++t).initForGymLeader([ Species.HAWLUCHA, Species.LUCARIO, Species.MIENFOO ], Type.FIGHTING),
|
||||
[TrainerType.RAMOS]: new TrainerConfig(++t).initForGymLeader([ Species.SKIDDO, Species.HOPPIP, Species.BELLSPROUT ], Type.GRASS),
|
||||
[TrainerType.CLEMONT]: new TrainerConfig(++t).initForGymLeader([ Species.HELIOPTILE, Species.MAGNEMITE, Species.EMOLGA ], Type.ELECTRIC),
|
||||
[TrainerType.VALERIE]: new TrainerConfig(++t).initForGymLeader([ Species.SYLVEON, Species.MAWILE, Species.MR_MIME ], Type.FAIRY),
|
||||
[TrainerType.OLYMPIA]: new TrainerConfig(++t).initForGymLeader([ Species.ESPURR, Species.SIGILYPH, Species.SLOWKING ], Type.PSYCHIC),
|
||||
[TrainerType.WULFRIC]: new TrainerConfig(++t).initForGymLeader([ Species.BERGMITE, Species.SNOVER, Species.CRYOGONAL ], Type.ICE),
|
||||
[TrainerType.MILO]: new TrainerConfig(++t).initForGymLeader([ Species.GOSSIFLEUR, Species.APPLIN, Species.BOUNSWEET ], Type.GRASS),
|
||||
[TrainerType.NESSA]: new TrainerConfig(++t).initForGymLeader([ Species.CHEWTLE, Species.ARROKUDA, Species.WIMPOD ], Type.WATER),
|
||||
[TrainerType.KABU]: new TrainerConfig(++t).initForGymLeader([ Species.SIZZLIPEDE, Species.VULPIX, Species.TORKOAL ], Type.FIRE),
|
||||
[TrainerType.BEA]: new TrainerConfig(++t).initForGymLeader([ Species.GALAR_FARFETCHD, Species.MACHOP, Species.CLOBBOPUS ], Type.FIGHTING),
|
||||
[TrainerType.ALLISTER]: new TrainerConfig(++t).initForGymLeader([ Species.GALAR_YAMASK, Species.GALAR_CORSOLA, Species.GASTLY ], Type.GHOST),
|
||||
[TrainerType.OPAL]: new TrainerConfig(++t).initForGymLeader([ Species.MILCERY, Species.TOGETIC, Species.GALAR_WEEZING ], Type.FAIRY),
|
||||
[TrainerType.BEDE]: new TrainerConfig(++t).initForGymLeader([ Species.HATENNA, Species.GALAR_PONYTA, Species.GARDEVOIR ], Type.FAIRY),
|
||||
[TrainerType.GORDIE]: new TrainerConfig(++t).initForGymLeader([ Species.ROLYCOLY, Species.STONJOURNER, Species.BINACLE ], Type.ROCK),
|
||||
[TrainerType.MELONY]: new TrainerConfig(++t).initForGymLeader([ Species.SNOM, Species.GALAR_DARUMAKA, Species.GALAR_MR_MIME ], Type.ICE),
|
||||
[TrainerType.PIERS]: new TrainerConfig(++t).initForGymLeader([ Species.GALAR_ZIGZAGOON, Species.SCRAGGY, Species.INKAY ], Type.DARK),
|
||||
[TrainerType.MARNIE]: new TrainerConfig(++t).initForGymLeader([ Species.IMPIDIMP, Species.PURRLOIN, Species.MORPEKO ], Type.DARK),
|
||||
[TrainerType.RAIHAN]: new TrainerConfig(++t).initForGymLeader([ Species.DURALUDON, Species.TURTONATOR, Species.GOOMY ], Type.DRAGON),
|
||||
[TrainerType.KATY]: new TrainerConfig(++t).initForGymLeader([ Species.NYMBLE, Species.TAROUNTULA, Species.HERACROSS ], Type.BUG),
|
||||
[TrainerType.BRASSIUS]: new TrainerConfig(++t).initForGymLeader([ Species.SMOLIV, Species.SHROOMISH, Species.ODDISH ], Type.GRASS),
|
||||
[TrainerType.IONO]: new TrainerConfig(++t).initForGymLeader([ Species.TADBULB, Species.WATTREL, Species.VOLTORB ], Type.ELECTRIC),
|
||||
[TrainerType.KOFU]: new TrainerConfig(++t).initForGymLeader([ Species.VELUZA, Species.WIGLETT, Species.WINGULL ], Type.WATER),
|
||||
[TrainerType.LARRY]: new TrainerConfig(++t).setName("Larry").initForGymLeader([ Species.STARLY, Species.DUNSPARCE, Species.KOMALA ], Type.NORMAL),
|
||||
[TrainerType.RYME]: new TrainerConfig(++t).initForGymLeader([ Species.GREAVARD, Species.SHUPPET, Species.MIMIKYU ], Type.GHOST),
|
||||
[TrainerType.TULIP]: new TrainerConfig(++t).initForGymLeader([ Species.GIRAFARIG, Species.FLITTLE, Species.RALTS ], Type.PSYCHIC),
|
||||
[TrainerType.GRUSHA]: new TrainerConfig(++t).initForGymLeader([ Species.CETODDLE, Species.ALOLA_VULPIX, Species.CUBCHOO ], Type.ICE),
|
||||
[TrainerType.BROCK]: new TrainerConfig((t = TrainerType.BROCK)).initForGymLeader(signatureSpecies["BROCK"], Type.ROCK).setBattleBgm("battle_kanto_gym"),
|
||||
[TrainerType.MISTY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MISTY"], Type.WATER).setBattleBgm("battle_kanto_gym"),
|
||||
[TrainerType.LT_SURGE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["LT_SURGE"], Type.ELECTRIC).setBattleBgm("battle_kanto_gym"),
|
||||
[TrainerType.ERIKA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["ERIKA"], Type.GRASS).setBattleBgm("battle_kanto_gym"),
|
||||
[TrainerType.JANINE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["JANINE"], Type.POISON).setBattleBgm("battle_kanto_gym"),
|
||||
[TrainerType.SABRINA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["SABRINA"], Type.PSYCHIC).setBattleBgm("battle_kanto_gym"),
|
||||
[TrainerType.BLAINE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BLAINE"], Type.FIRE).setBattleBgm("battle_kanto_gym"),
|
||||
[TrainerType.GIOVANNI]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["GIOVANNI"], Type.DARK).setBattleBgm("battle_kanto_gym"),
|
||||
[TrainerType.FALKNER]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["FALKNER"], Type.FLYING).setBattleBgm("battle_johto_gym"),
|
||||
[TrainerType.BUGSY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BUGSY"], Type.BUG).setBattleBgm("battle_johto_gym"),
|
||||
[TrainerType.WHITNEY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["WHITNEY"], Type.NORMAL).setBattleBgm("battle_johto_gym"),
|
||||
[TrainerType.MORTY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MORTY"], Type.GHOST).setBattleBgm("battle_johto_gym"),
|
||||
[TrainerType.CHUCK]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CHUCK"], Type.FIGHTING).setBattleBgm("battle_johto_gym"),
|
||||
[TrainerType.JASMINE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["JASMINE"], Type.STEEL).setBattleBgm("battle_johto_gym"),
|
||||
[TrainerType.PRYCE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["PRYCE"], Type.ICE).setBattleBgm("battle_johto_gym"),
|
||||
[TrainerType.CLAIR]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CLAIR"], Type.DRAGON).setBattleBgm("battle_johto_gym"),
|
||||
[TrainerType.ROXANNE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["ROXANNE"], Type.ROCK).setBattleBgm("battle_hoenn_gym"),
|
||||
[TrainerType.BRAWLY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BRAWLY"], Type.FIGHTING).setBattleBgm("battle_hoenn_gym"),
|
||||
[TrainerType.WATTSON]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["WATTSON"], Type.ELECTRIC).setBattleBgm("battle_hoenn_gym"),
|
||||
[TrainerType.FLANNERY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["FLANNERY"], Type.FIRE).setBattleBgm("battle_hoenn_gym"),
|
||||
[TrainerType.NORMAN]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["NORMAN"], Type.NORMAL).setBattleBgm("battle_hoenn_gym"),
|
||||
[TrainerType.WINONA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["WINONA"], Type.FLYING).setBattleBgm("battle_hoenn_gym"),
|
||||
[TrainerType.TATE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["TATE"], Type.PSYCHIC).setBattleBgm("battle_hoenn_gym").setHasDouble("tate_liza_double").setDoubleTrainerType(TrainerType.LIZA).setDoubleTitle("gym_leader_double"),
|
||||
[TrainerType.LIZA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["LIZA"], Type.PSYCHIC).setBattleBgm("battle_hoenn_gym").setHasDouble("liza_tate_double").setDoubleTrainerType(TrainerType.TATE).setDoubleTitle("gym_leader_double"),
|
||||
[TrainerType.JUAN]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["JUAN"], Type.WATER).setBattleBgm("battle_hoenn_gym"),
|
||||
[TrainerType.ROARK]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["ROARK"], Type.ROCK).setBattleBgm("battle_sinnoh_gym"),
|
||||
[TrainerType.GARDENIA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["GARDENIA"], Type.GRASS).setBattleBgm("battle_sinnoh_gym"),
|
||||
[TrainerType.MAYLENE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MAYLENE"], Type.FIGHTING).setBattleBgm("battle_sinnoh_gym"),
|
||||
[TrainerType.CRASHER_WAKE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CRASHER_WAKE"], Type.WATER).setBattleBgm("battle_sinnoh_gym"),
|
||||
[TrainerType.FANTINA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["FANTINA"], Type.GHOST).setBattleBgm("battle_sinnoh_gym"),
|
||||
[TrainerType.BYRON]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BYRON"], Type.STEEL).setBattleBgm("battle_sinnoh_gym"),
|
||||
[TrainerType.CANDICE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CANDICE"], Type.ICE).setBattleBgm("battle_sinnoh_gym"),
|
||||
[TrainerType.VOLKNER]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["VOLKNER"], Type.ELECTRIC).setBattleBgm("battle_sinnoh_gym"),
|
||||
[TrainerType.CILAN]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CILAN"], Type.GRASS),
|
||||
[TrainerType.CHILI]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CHILI"], Type.FIRE),
|
||||
[TrainerType.CRESS]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CRESS"], Type.WATER),
|
||||
[TrainerType.CHEREN]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CHEREN"], Type.NORMAL),
|
||||
[TrainerType.LENORA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["LENORA"], Type.NORMAL),
|
||||
[TrainerType.ROXIE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["ROXIE"], Type.POISON),
|
||||
[TrainerType.BURGH]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BURGH"], Type.BUG),
|
||||
[TrainerType.ELESA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["ELESA"], Type.ELECTRIC),
|
||||
[TrainerType.CLAY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CLAY"], Type.GROUND),
|
||||
[TrainerType.SKYLA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["SKYLA"], Type.FLYING),
|
||||
[TrainerType.BRYCEN]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BRYCEN"], Type.ICE),
|
||||
[TrainerType.DRAYDEN]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["DRAYDEN"], Type.DRAGON),
|
||||
[TrainerType.MARLON]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MARLON"], Type.WATER),
|
||||
[TrainerType.VIOLA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["VIOLA"], Type.BUG),
|
||||
[TrainerType.GRANT]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["GRANT"], Type.ROCK),
|
||||
[TrainerType.KORRINA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["KORRINA"], Type.FIGHTING),
|
||||
[TrainerType.RAMOS]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["RAMOS"], Type.GRASS),
|
||||
[TrainerType.CLEMONT]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CLEMONT"], Type.ELECTRIC),
|
||||
[TrainerType.VALERIE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["VALERIE"], Type.FAIRY),
|
||||
[TrainerType.OLYMPIA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["OLYMPIA"], Type.PSYCHIC),
|
||||
[TrainerType.WULFRIC]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["WULFRIC"], Type.ICE),
|
||||
[TrainerType.MILO]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MILO"], Type.GRASS),
|
||||
[TrainerType.NESSA]: new TrainerConfig(++t).setName("Nessa").initForGymLeader(signatureSpecies["NESSA"], Type.WATER),
|
||||
[TrainerType.KABU]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["KABU"], Type.FIRE),
|
||||
[TrainerType.BEA]: new TrainerConfig(++t).setName("Bea").initForGymLeader(signatureSpecies["BEA"], Type.FIGHTING),
|
||||
[TrainerType.ALLISTER]: new TrainerConfig(++t).setName("Allister").initForGymLeader(signatureSpecies["ALLISTER"], Type.GHOST),
|
||||
[TrainerType.OPAL]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["OPAL"], Type.FAIRY),
|
||||
[TrainerType.BEDE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BEDE"], Type.FAIRY),
|
||||
[TrainerType.GORDIE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["GORDIE"], Type.ROCK),
|
||||
[TrainerType.MELONY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MELONY"], Type.ICE),
|
||||
[TrainerType.PIERS]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["PIERS"], Type.DARK).setHasDouble("piers_marnie_double").setDoubleTrainerType(TrainerType.MARNIE).setDoubleTitle("gym_leader_double"),
|
||||
[TrainerType.MARNIE]: new TrainerConfig(++t).setName("Marnie").initForGymLeader(signatureSpecies["MARNIE"], Type.DARK).setHasDouble("marnie_piers_double").setDoubleTrainerType(TrainerType.PIERS).setDoubleTitle("gym_leader_double"),
|
||||
[TrainerType.RAIHAN]: new TrainerConfig(++t).setName("Raihan").initForGymLeader(signatureSpecies["RAIHAN"], Type.DRAGON),
|
||||
[TrainerType.KATY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["KATY"], Type.BUG),
|
||||
[TrainerType.BRASSIUS]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BRASSIUS"], Type.GRASS),
|
||||
[TrainerType.IONO]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["IONO"], Type.ELECTRIC),
|
||||
[TrainerType.KOFU]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["KOFU"], Type.WATER),
|
||||
[TrainerType.LARRY]: new TrainerConfig(++t).setName("Larry").initForGymLeader(signatureSpecies["LARRY"], Type.NORMAL),
|
||||
[TrainerType.RYME]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["RYME"], Type.GHOST),
|
||||
[TrainerType.TULIP]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["TULIP"], Type.PSYCHIC),
|
||||
[TrainerType.GRUSHA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["GRUSHA"], Type.ICE),
|
||||
|
||||
[TrainerType.LORELEI]: new TrainerConfig((t = TrainerType.LORELEI)).initForEliteFour([ Species.SLOWBRO, Species.LAPRAS, Species.DEWGONG, Species.ALOLA_SANDSLASH ], Type.ICE),
|
||||
[TrainerType.BRUNO]: new TrainerConfig(++t).initForEliteFour([ Species.ONIX, Species.HITMONCHAN, Species.HITMONLEE, Species.ALOLA_GOLEM ], Type.FIGHTING),
|
||||
[TrainerType.AGATHA]: new TrainerConfig(++t).initForEliteFour([ Species.GENGAR, Species.ARBOK, Species.CROBAT, Species.ALOLA_MAROWAK ], Type.GHOST),
|
||||
[TrainerType.LANCE]: new TrainerConfig(++t).setName("Lance").initForEliteFour([ Species.DRAGONITE, Species.GYARADOS, Species.AERODACTYL, Species.ALOLA_EXEGGUTOR ], Type.DRAGON),
|
||||
[TrainerType.WILL]: new TrainerConfig(++t).initForEliteFour([ Species.XATU, Species.JYNX, Species.SLOWBRO, Species.EXEGGUTOR ], Type.PSYCHIC),
|
||||
[TrainerType.KOGA]: new TrainerConfig(++t).initForEliteFour([ Species.WEEZING, Species.VENOMOTH, Species.CROBAT, Species.TENTACRUEL ], Type.POISON),
|
||||
[TrainerType.KAREN]: new TrainerConfig(++t).initForEliteFour([ Species.UMBREON, Species.HONCHKROW, Species.HOUNDOOM, Species.WEAVILE ], Type.DARK),
|
||||
[TrainerType.SIDNEY]: new TrainerConfig(++t).initForEliteFour([ Species.SHIFTRY, Species.SHARPEDO, Species.ABSOL, Species.ZOROARK ], Type.DARK),
|
||||
[TrainerType.PHOEBE]: new TrainerConfig(++t).initForEliteFour([ Species.SABLEYE, Species.DUSKNOIR, Species.BANETTE, Species.CHANDELURE ], Type.GHOST),
|
||||
[TrainerType.GLACIA]: new TrainerConfig(++t).initForEliteFour([ Species.GLALIE, Species.WALREIN, Species.FROSLASS, Species.ABOMASNOW ], Type.ICE),
|
||||
[TrainerType.DRAKE]: new TrainerConfig(++t).initForEliteFour([ Species.ALTARIA, Species.SALAMENCE, Species.FLYGON, Species.KINGDRA ], Type.DRAGON),
|
||||
[TrainerType.AARON]: new TrainerConfig(++t).initForEliteFour([ Species.SCIZOR, Species.HERACROSS, Species.VESPIQUEN, Species.DRAPION ], Type.BUG),
|
||||
[TrainerType.BERTHA]: new TrainerConfig(++t).initForEliteFour([ Species.WHISCASH, Species.HIPPOWDON, Species.GLISCOR, Species.RHYPERIOR ], Type.GROUND),
|
||||
[TrainerType.FLINT]: new TrainerConfig(++t).initForEliteFour([ Species.FLAREON, Species.HOUNDOOM, Species.RAPIDASH, Species.INFERNAPE ], Type.FIRE),
|
||||
[TrainerType.LUCIAN]: new TrainerConfig(++t).initForEliteFour([ Species.MR_MIME, Species.GALLADE, Species.BRONZONG, Species.ALAKAZAM ], Type.PSYCHIC),
|
||||
[TrainerType.SHAUNTAL]: new TrainerConfig(++t).initForEliteFour([ Species.COFAGRIGUS, Species.CHANDELURE, Species.GOLURK, Species.DRIFBLIM ], Type.GHOST),
|
||||
[TrainerType.MARSHAL]: new TrainerConfig(++t).initForEliteFour([ Species.TIMBURR, Species.MIENFOO, Species.THROH, Species.SAWK ], Type.FIGHTING),
|
||||
[TrainerType.GRIMSLEY]: new TrainerConfig(++t).initForEliteFour([ Species.LIEPARD, Species.KINGAMBIT, Species.SCRAFTY, Species.KROOKODILE ], Type.DARK),
|
||||
[TrainerType.CAITLIN]: new TrainerConfig(++t).initForEliteFour([ Species.MUSHARNA, Species.GOTHITELLE, Species.SIGILYPH, Species.REUNICLUS ], Type.PSYCHIC),
|
||||
[TrainerType.MALVA]: new TrainerConfig(++t).initForEliteFour([ Species.PYROAR, Species.TORKOAL, Species.CHANDELURE, Species.TALONFLAME ], Type.FIRE),
|
||||
[TrainerType.SIEBOLD]: new TrainerConfig(++t).initForEliteFour([ Species.CLAWITZER, Species.GYARADOS, Species.BARBARACLE, Species.STARMIE ], Type.WATER),
|
||||
[TrainerType.WIKSTROM]: new TrainerConfig(++t).initForEliteFour([ Species.KLEFKI, Species.PROBOPASS, Species.SCIZOR, Species.AEGISLASH ], Type.STEEL),
|
||||
[TrainerType.DRASNA]: new TrainerConfig(++t).initForEliteFour([ Species.DRAGALGE, Species.DRUDDIGON, Species.ALTARIA, Species.NOIVERN ], Type.DRAGON),
|
||||
[TrainerType.HALA]: new TrainerConfig(++t).initForEliteFour([ Species.HARIYAMA, Species.BEWEAR, Species.CRABOMINABLE, Species.POLIWRATH ], Type.FIGHTING),
|
||||
[TrainerType.MOLAYNE]: new TrainerConfig(++t).initForEliteFour([ Species.KLEFKI, Species.MAGNEZONE, Species.METAGROSS, Species.ALOLA_DUGTRIO ], Type.STEEL),
|
||||
[TrainerType.OLIVIA]: new TrainerConfig(++t).initForEliteFour([ Species.ARMALDO, Species.CRADILY, Species.ALOLA_GOLEM, Species.LYCANROC ], Type.ROCK),
|
||||
[TrainerType.ACEROLA]: new TrainerConfig(++t).initForEliteFour([ Species.BANETTE, Species.DRIFBLIM, Species.DHELMISE, Species.PALOSSAND ], Type.GHOST),
|
||||
[TrainerType.KAHILI]: new TrainerConfig(++t).initForEliteFour([ Species.BRAVIARY, Species.HAWLUCHA, Species.ORICORIO, Species.TOUCANNON ], Type.FLYING),
|
||||
[TrainerType.RIKA]: new TrainerConfig(++t).initForEliteFour([ Species. WHISCASH, Species.DONPHAN, Species.CAMERUPT, Species.CLODSIRE ], Type.GROUND),
|
||||
[TrainerType.POPPY]: new TrainerConfig(++t).initForEliteFour([ Species.COPPERAJAH, Species.BRONZONG, Species.CORVIKNIGHT, Species.TINKATON ], Type.STEEL),
|
||||
[TrainerType.LARRY_ELITE]: new TrainerConfig(++t).setName("Larry").initForEliteFour([ Species.STARAPTOR, Species.FLAMIGO, Species.ALTARIA, Species.TROPIUS ], Type.NORMAL, Type.FLYING),
|
||||
[TrainerType.HASSEL]: new TrainerConfig(++t).initForEliteFour([ Species.NOIVERN, Species.HAXORUS, Species.DRAGALGE, Species.BAXCALIBUR ], Type.DRAGON),
|
||||
[TrainerType.CRISPIN]: new TrainerConfig(++t).initForEliteFour([ Species.TALONFLAME, Species.CAMERUPT, Species.MAGMORTAR, Species.BLAZIKEN ], Type.FIRE),
|
||||
[TrainerType.AMARYS]: new TrainerConfig(++t).initForEliteFour([ Species.SKARMORY, Species.EMPOLEON, Species.SCIZOR, Species.METAGROSS ], Type.STEEL),
|
||||
[TrainerType.LACEY]: new TrainerConfig(++t).initForEliteFour([ Species.EXCADRILL, Species.PRIMARINA, Species.ALCREMIE, Species.GALAR_SLOWBRO ], Type.FAIRY),
|
||||
[TrainerType.DRAYTON]: new TrainerConfig(++t).initForEliteFour([ Species.DRAGONITE, Species.ARCHALUDON, Species.FLYGON, Species.SCEPTILE ], Type.DRAGON),
|
||||
[TrainerType.LORELEI]: new TrainerConfig((t = TrainerType.LORELEI)).initForEliteFour(signatureSpecies["LORELEI"], Type.ICE),
|
||||
[TrainerType.BRUNO]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["BRUNO"], Type.FIGHTING),
|
||||
[TrainerType.AGATHA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["AGATHA"], Type.GHOST),
|
||||
[TrainerType.LANCE]: new TrainerConfig(++t).setName("Lance").initForEliteFour(signatureSpecies["LANCE"], Type.DRAGON),
|
||||
[TrainerType.WILL]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["WILL"], Type.PSYCHIC),
|
||||
[TrainerType.KOGA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["KOGA"], Type.POISON),
|
||||
[TrainerType.KAREN]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["KAREN"], Type.DARK),
|
||||
[TrainerType.SIDNEY]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["SIDNEY"], Type.DARK),
|
||||
[TrainerType.PHOEBE]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["PHOEBE"], Type.GHOST),
|
||||
[TrainerType.GLACIA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["GLACIA"], Type.ICE),
|
||||
[TrainerType.DRAKE]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["DRAKE"], Type.DRAGON),
|
||||
[TrainerType.AARON]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["AARON"], Type.BUG),
|
||||
[TrainerType.BERTHA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["BERTHA"], Type.GROUND),
|
||||
[TrainerType.FLINT]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["FLINT"], Type.FIRE),
|
||||
[TrainerType.LUCIAN]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["LUCIAN"], Type.PSYCHIC),
|
||||
[TrainerType.SHAUNTAL]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["SHAUNTAL"], Type.GHOST),
|
||||
[TrainerType.MARSHAL]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["MARSHAL"], Type.FIGHTING),
|
||||
[TrainerType.GRIMSLEY]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["GRIMSLEY"], Type.DARK),
|
||||
[TrainerType.CAITLIN]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["CAITLIN"], Type.PSYCHIC),
|
||||
[TrainerType.MALVA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["MALVA"], Type.FIRE),
|
||||
[TrainerType.SIEBOLD]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["SIEBOLD"], Type.WATER),
|
||||
[TrainerType.WIKSTROM]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["WIKSTROM"], Type.STEEL),
|
||||
[TrainerType.DRASNA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["DRASNA"], Type.DRAGON),
|
||||
[TrainerType.HALA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["HALA"], Type.FIGHTING),
|
||||
[TrainerType.MOLAYNE]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["MOLAYNE"], Type.STEEL),
|
||||
[TrainerType.OLIVIA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["OLIVIA"], Type.ROCK),
|
||||
[TrainerType.ACEROLA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["ACEROLA"], Type.GHOST),
|
||||
[TrainerType.KAHILI]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["KAHILI"], Type.FLYING),
|
||||
[TrainerType.MARNIE_ELITE]: new TrainerConfig(++t).setName("Marnie").initForEliteFour(signatureSpecies["MARNIE_ELITE"], Type.DARK),
|
||||
[TrainerType.NESSA_ELITE]: new TrainerConfig(++t).setName("Nessa").initForEliteFour(signatureSpecies["NESSA_ELITE"], Type.WATER),
|
||||
[TrainerType.BEA_ELITE]: new TrainerConfig(++t).setName("Bea").initForEliteFour(signatureSpecies["BEA_ELITE"], Type.FIGHTING),
|
||||
[TrainerType.ALLISTER_ELITE]: new TrainerConfig(++t).setName("Allister").initForEliteFour(signatureSpecies["ALLISTER_ELITE"], Type.GHOST),
|
||||
[TrainerType.RAIHAN_ELITE]: new TrainerConfig(++t).setName("Raihan").initForEliteFour(signatureSpecies["RAIHAN_ELITE"], Type.DRAGON),
|
||||
[TrainerType.RIKA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["RIKA"], Type.GROUND),
|
||||
[TrainerType.POPPY]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["POPPY"], Type.STEEL),
|
||||
[TrainerType.LARRY_ELITE]: new TrainerConfig(++t).setName("Larry").initForEliteFour(signatureSpecies["LARRY_ELITE"], Type.NORMAL, Type.FLYING),
|
||||
[TrainerType.HASSEL]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["HASSEL"], Type.DRAGON),
|
||||
[TrainerType.CRISPIN]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["CRISPIN"], Type.FIRE),
|
||||
[TrainerType.AMARYS]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["AMARYS"], Type.STEEL),
|
||||
[TrainerType.LACEY]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["LACEY"], Type.FAIRY),
|
||||
[TrainerType.DRAYTON]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["DRAYTON"], Type.DRAGON),
|
||||
|
||||
[TrainerType.BLUE]: new TrainerConfig((t = TrainerType.BLUE)).initForChampion([ Species.GYARADOS, Species.MEWTWO, Species.ARCANINE, Species.ALAKAZAM, Species.PIDGEOT ]).setBattleBgm("battle_kanto_champion"),
|
||||
[TrainerType.RED]: new TrainerConfig(++t).initForChampion([ Species.CHARIZARD, [ Species.LUGIA, Species.HO_OH ], Species.SNORLAX, Species.RAICHU, Species.ESPEON ]).setBattleBgm("battle_johto_champion"),
|
||||
[TrainerType.LANCE_CHAMPION]: new TrainerConfig(++t).setName("Lance").initForChampion([ Species.DRAGONITE, Species.ZYGARDE, Species.AERODACTYL, Species.KINGDRA, Species.ALOLA_EXEGGUTOR ]).setBattleBgm("battle_johto_champion"),
|
||||
[TrainerType.STEVEN]: new TrainerConfig(++t).initForChampion([ Species.METAGROSS, [ Species.DIALGA, Species.PALKIA ], Species.SKARMORY, Species.AGGRON, Species.CARBINK ]).setBattleBgm("battle_hoenn_champion"),
|
||||
[TrainerType.WALLACE]: new TrainerConfig(++t).initForChampion([ Species.MILOTIC, Species.KYOGRE, Species.WHISCASH, Species.WALREIN, Species.LUDICOLO ]).setBattleBgm("battle_hoenn_champion"),
|
||||
[TrainerType.CYNTHIA]: new TrainerConfig(++t).initForChampion([ Species.SPIRITOMB, Species.GIRATINA, Species.GARCHOMP, Species.MILOTIC, Species.LUCARIO, Species.TOGEKISS ]).setBattleBgm("battle_sinnoh_champion"),
|
||||
[TrainerType.ALDER]: new TrainerConfig(++t).initForChampion([ Species.VOLCARONA, Species.GROUDON, Species.BOUFFALANT, Species.ACCELGOR, Species.CONKELDURR ]),
|
||||
[TrainerType.IRIS]: new TrainerConfig(++t).initForChampion([ Species.HAXORUS, Species.YVELTAL, Species.DRUDDIGON, Species.ARON, Species.LAPRAS ]).setBattleBgm("battle_champion_iris"),
|
||||
[TrainerType.DIANTHA]: new TrainerConfig(++t).initForChampion([ Species.HAWLUCHA, Species.XERNEAS, Species.GOURGEIST, Species.GOODRA, Species.GARDEVOIR ]),
|
||||
[TrainerType.HAU]: new TrainerConfig(++t).initForChampion([ Species.ALOLA_RAICHU, [ Species.SOLGALEO, Species.LUNALA ], Species.NOIVERN, [ Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA ], Species.CRABOMINABLE ]),
|
||||
[TrainerType.GEETA]: new TrainerConfig(++t).initForChampion([ Species.GLIMMORA, Species.MIRAIDON, Species.ESPATHRA, Species.VELUZA, Species.KINGAMBIT ]),
|
||||
[TrainerType.NEMONA]: new TrainerConfig(++t).initForChampion([ Species.LYCANROC, Species.KORAIDON, Species.KOMMO_O, Species.PAWMOT, Species.DUSKNOIR ]),
|
||||
[TrainerType.KIERAN]: new TrainerConfig(++t).initForChampion([ Species.POLITOED, [ Species.OGERPON, Species.TERAPAGOS ], Species.HYDRAPPLE, Species.PORYGON_Z, Species.GRIMMSNARL ]),
|
||||
[TrainerType.LEON]: new TrainerConfig(++t).initForChampion([ Species.DRAGAPULT, [ Species.ZACIAN, Species.ZAMAZENTA ], Species.SEISMITOAD, Species.AEGISLASH, Species.CHARIZARD ]),
|
||||
[TrainerType.BLUE]: new TrainerConfig((t = TrainerType.BLUE)).initForChampion(signatureSpecies["BLUE"]).setBattleBgm("battle_kanto_champion").setHasDouble("blue_red_double").setDoubleTrainerType(TrainerType.RED).setDoubleTitle("champion_double"),
|
||||
[TrainerType.RED]: new TrainerConfig(++t).initForChampion(signatureSpecies["RED"]).setBattleBgm("battle_johto_champion").setHasDouble("red_blue_double").setDoubleTrainerType(TrainerType.BLUE).setDoubleTitle("champion_double"),
|
||||
[TrainerType.LANCE_CHAMPION]: new TrainerConfig(++t).setName("Lance").initForChampion(signatureSpecies["LANCE_CHAMPION"]).setBattleBgm("battle_johto_champion"),
|
||||
[TrainerType.STEVEN]: new TrainerConfig(++t).initForChampion(signatureSpecies["STEVEN"]).setBattleBgm("battle_hoenn_champion").setHasDouble("steven_wallace_double").setDoubleTrainerType(TrainerType.WALLACE).setDoubleTitle("champion_double"),
|
||||
[TrainerType.WALLACE]: new TrainerConfig(++t).initForChampion(signatureSpecies["WALLACE"]).setBattleBgm("battle_hoenn_champion").setHasDouble("wallace_steven_double").setDoubleTrainerType(TrainerType.STEVEN).setDoubleTitle("champion_double"),
|
||||
[TrainerType.CYNTHIA]: new TrainerConfig(++t).initForChampion(signatureSpecies["CYNTHIA"]).setBattleBgm("battle_sinnoh_champion"),
|
||||
[TrainerType.ALDER]: new TrainerConfig(++t).initForChampion(signatureSpecies["ALDER"]).setHasDouble("alder_iris_double").setDoubleTrainerType(TrainerType.IRIS).setDoubleTitle("champion_double").setBattleBgm("battle_unova_champion"),
|
||||
[TrainerType.IRIS]: new TrainerConfig(++t).initForChampion(signatureSpecies["IRIS"]).setBattleBgm("battle_champion_iris").setHasDouble("iris_alder_double").setDoubleTrainerType(TrainerType.ALDER).setDoubleTitle("champion_double"),
|
||||
[TrainerType.DIANTHA]: new TrainerConfig(++t).initForChampion(signatureSpecies["DIANTHA"]),
|
||||
[TrainerType.HAU]: new TrainerConfig(++t).initForChampion(signatureSpecies["HAU"]),
|
||||
[TrainerType.GEETA]: new TrainerConfig(++t).initForChampion(signatureSpecies["GEETA"]),
|
||||
[TrainerType.NEMONA]: new TrainerConfig(++t).initForChampion(signatureSpecies["NEMONA"]),
|
||||
[TrainerType.KIERAN]: new TrainerConfig(++t).initForChampion(signatureSpecies["KIERAN"]),
|
||||
[TrainerType.LEON]: new TrainerConfig(++t).initForChampion(signatureSpecies["LEON"]),
|
||||
|
||||
[TrainerType.RIVAL]: new TrainerConfig((t = TrainerType.RIVAL)).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setStaticParty().setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival").setPartyTemplates(trainerPartyTemplates.RIVAL)
|
||||
.setModifierRewardFuncs(() => modifierTypes.SUPER_EXP_CHARM, () => modifierTypes.EXP_SHARE)
|
||||
.setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE, Species.CHIKORITA, Species.CYNDAQUIL, Species.TOTODILE, Species.TREECKO, Species.TORCHIC, Species.MUDKIP, Species.TURTWIG, Species.CHIMCHAR, Species.PIPLUP, Species.SNIVY, Species.TEPIG, Species.OSHAWOTT, Species.CHESPIN, Species.FENNEKIN, Species.FROAKIE, Species.ROWLET, Species.LITTEN, Species.POPPLIO, Species.GROOKEY, Species.SCORBUNNY, Species.SOBBLE, Species.SPRIGATITO, Species.FUECOCO, Species.QUAXLY ], TrainerSlot.TRAINER, true))
|
||||
.setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEY, Species.HOOTHOOT, Species.TAILLOW, Species.STARLY, Species.PIDOVE, Species.FLETCHLING, Species.PIKIPEK, Species.ROOKIDEE, Species.WATTREL ], TrainerSlot.TRAINER, true)),
|
||||
.setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE, Species.CHIKORITA, Species.CYNDAQUIL, Species.TOTODILE, Species.TREECKO, Species.TORCHIC, Species.MUDKIP, Species.TURTWIG, Species.CHIMCHAR, Species.PIPLUP, Species.SNIVY, Species.TEPIG, Species.OSHAWOTT, Species.CHESPIN, Species.FENNEKIN, Species.FROAKIE, Species.ROWLET, Species.LITTEN, Species.POPPLIO, Species.GROOKEY, Species.SCORBUNNY, Species.SOBBLE, Species.SPRIGATITO, Species.FUECOCO, Species.QUAXLY], TrainerSlot.TRAINER, true))
|
||||
.setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.PIDGEY, Species.HOOTHOOT, Species.TAILLOW, Species.STARLY, Species.PIDOVE, Species.FLETCHLING, Species.PIKIPEK, Species.ROOKIDEE, Species.WATTREL], TrainerSlot.TRAINER, true)),
|
||||
[TrainerType.RIVAL_2]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setStaticParty().setMoneyMultiplier(1.25).setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival").setPartyTemplates(trainerPartyTemplates.RIVAL_2)
|
||||
.setModifierRewardFuncs(() => modifierTypes.EXP_SHARE)
|
||||
.setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.IVYSAUR, Species.CHARMELEON, Species.WARTORTLE, Species.BAYLEEF, Species.QUILAVA, Species.CROCONAW, Species.GROVYLE, Species.COMBUSKEN, Species.MARSHTOMP, Species.GROTLE, Species.MONFERNO, Species.PRINPLUP, Species.SERVINE, Species.PIGNITE, Species.DEWOTT, Species.QUILLADIN, Species.BRAIXEN, Species.FROGADIER, Species.DARTRIX, Species.TORRACAT, Species.BRIONNE, Species.THWACKEY, Species.RABOOT, Species.DRIZZILE, Species.FLORAGATO, Species.CROCALOR, Species.QUAXWELL ], TrainerSlot.TRAINER, true))
|
||||
.setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEOTTO, Species.HOOTHOOT, Species.TAILLOW, Species.STARAVIA, Species.TRANQUILL, Species.FLETCHINDER, Species.TRUMBEAK, Species.CORVISQUIRE, Species.WATTREL ], TrainerSlot.TRAINER, true))
|
||||
.setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.IVYSAUR, Species.CHARMELEON, Species.WARTORTLE, Species.BAYLEEF, Species.QUILAVA, Species.CROCONAW, Species.GROVYLE, Species.COMBUSKEN, Species.MARSHTOMP, Species.GROTLE, Species.MONFERNO, Species.PRINPLUP, Species.SERVINE, Species.PIGNITE, Species.DEWOTT, Species.QUILLADIN, Species.BRAIXEN, Species.FROGADIER, Species.DARTRIX, Species.TORRACAT, Species.BRIONNE, Species.THWACKEY, Species.RABOOT, Species.DRIZZILE, Species.FLORAGATO, Species.CROCALOR, Species.QUAXWELL], TrainerSlot.TRAINER, true))
|
||||
.setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.PIDGEOTTO, Species.HOOTHOOT, Species.TAILLOW, Species.STARAVIA, Species.TRANQUILL, Species.FLETCHINDER, Species.TRUMBEAK, Species.CORVISQUIRE, Species.WATTREL], TrainerSlot.TRAINER, true))
|
||||
.setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450)),
|
||||
[TrainerType.RIVAL_3]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setStaticParty().setMoneyMultiplier(1.5).setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival").setPartyTemplates(trainerPartyTemplates.RIVAL_3)
|
||||
.setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON, Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL ], TrainerSlot.TRAINER, true))
|
||||
.setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT, Species.KILOWATTREL ], TrainerSlot.TRAINER, true))
|
||||
.setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON, Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL], TrainerSlot.TRAINER, true))
|
||||
.setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT, Species.KILOWATTREL], TrainerSlot.TRAINER, true))
|
||||
.setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450))
|
||||
.setSpeciesFilter(species => species.baseTotal >= 540),
|
||||
[TrainerType.RIVAL_4]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setBoss().setStaticParty().setMoneyMultiplier(1.75).setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival_2").setPartyTemplates(trainerPartyTemplates.RIVAL_4)
|
||||
.setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON, Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL ], TrainerSlot.TRAINER, true))
|
||||
.setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT, Species.KILOWATTREL ], TrainerSlot.TRAINER, true))
|
||||
.setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON, Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL], TrainerSlot.TRAINER, true))
|
||||
.setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT, Species.KILOWATTREL], TrainerSlot.TRAINER, true))
|
||||
.setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450))
|
||||
.setSpeciesFilter(species => species.baseTotal >= 540)
|
||||
.setGenModifiersFunc(party => {
|
||||
const starter = party[0];
|
||||
return [ modifierTypes.TERA_SHARD().generateType(null, [ starter.species.type1 ]).withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(starter) as PersistentModifier ];
|
||||
return [modifierTypes.TERA_SHARD().generateType(null, [starter.species.type1]).withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(starter) as PersistentModifier];
|
||||
}),
|
||||
[TrainerType.RIVAL_5]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setBoss().setStaticParty().setMoneyMultiplier(2.25).setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival_3").setPartyTemplates(trainerPartyTemplates.RIVAL_5)
|
||||
.setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON, Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL ], TrainerSlot.TRAINER, true,
|
||||
.setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON, Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL], TrainerSlot.TRAINER, true,
|
||||
p => p.setBoss(true, 2)))
|
||||
.setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT, Species.KILOWATTREL ], TrainerSlot.TRAINER, true))
|
||||
.setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT, Species.KILOWATTREL], TrainerSlot.TRAINER, true))
|
||||
.setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450))
|
||||
.setSpeciesFilter(species => species.baseTotal >= 540)
|
||||
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.RAYQUAZA ], TrainerSlot.TRAINER, true, p => {
|
||||
.setPartyMemberFunc(5, getRandomPartyMemberFunc([Species.RAYQUAZA], TrainerSlot.TRAINER, true, p => {
|
||||
p.setBoss(true, 3);
|
||||
p.pokeball = PokeballType.MASTER_BALL;
|
||||
p.shiny = true;
|
||||
@ -1023,22 +1244,22 @@ export const trainerConfigs: TrainerConfigs = {
|
||||
}))
|
||||
.setGenModifiersFunc(party => {
|
||||
const starter = party[0];
|
||||
return [ modifierTypes.TERA_SHARD().generateType(null, [ starter.species.type1 ]).withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(starter) as PersistentModifier ];
|
||||
return [modifierTypes.TERA_SHARD().generateType(null, [starter.species.type1]).withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(starter) as PersistentModifier];
|
||||
}),
|
||||
[TrainerType.RIVAL_6]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setBoss().setStaticParty().setMoneyMultiplier(3).setEncounterBgm("final").setBattleBgm("battle_rival_3").setPartyTemplates(trainerPartyTemplates.RIVAL_6)
|
||||
.setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON, Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL ], TrainerSlot.TRAINER, true,
|
||||
.setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON, Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL], TrainerSlot.TRAINER, true,
|
||||
p => {
|
||||
p.setBoss(true, 3);
|
||||
p.generateAndPopulateMoveset();
|
||||
}))
|
||||
.setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT, Species.KILOWATTREL ], TrainerSlot.TRAINER, true,
|
||||
.setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT, Species.KILOWATTREL], TrainerSlot.TRAINER, true,
|
||||
p => {
|
||||
p.setBoss(true, 2);
|
||||
p.generateAndPopulateMoveset();
|
||||
}))
|
||||
.setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450))
|
||||
.setSpeciesFilter(species => species.baseTotal >= 540)
|
||||
.setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.RAYQUAZA ], TrainerSlot.TRAINER, true, p => {
|
||||
.setPartyMemberFunc(5, getRandomPartyMemberFunc([Species.RAYQUAZA], TrainerSlot.TRAINER, true, p => {
|
||||
p.setBoss();
|
||||
p.generateAndPopulateMoveset();
|
||||
p.pokeball = PokeballType.MASTER_BALL;
|
||||
@ -1048,6 +1269,6 @@ export const trainerConfigs: TrainerConfigs = {
|
||||
}))
|
||||
.setGenModifiersFunc(party => {
|
||||
const starter = party[0];
|
||||
return [ modifierTypes.TERA_SHARD().generateType(null, [ starter.species.type1 ]).withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(starter) as PersistentModifier ];
|
||||
return [modifierTypes.TERA_SHARD().generateType(null, [starter.species.type1]).withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(starter) as PersistentModifier];
|
||||
}),
|
||||
};
|
||||
|
@ -4,7 +4,7 @@ import { Variant, VariantSet, variantColorCache } from "#app/data/variant";
|
||||
import { variantData } from "#app/data/variant";
|
||||
import BattleInfo, { PlayerBattleInfo, EnemyBattleInfo } from "../ui/battle-info";
|
||||
import { Moves } from "../data/enums/moves";
|
||||
import Move, { HighCritAttr, HitsTagAttr, applyMoveAttrs, FixedDamageAttr, VariableAtkAttr, VariablePowerAttr, allMoves, MoveCategory, TypelessAttr, CritOnlyAttr, getMoveTargets, OneHitKOAttr, MultiHitAttr, StatusMoveTypeImmunityAttr, MoveTarget, VariableDefAttr, AttackMove, ModifiedDamageAttr, VariableMoveTypeMultiplierAttr, IgnoreOpponentStatChangesAttr, SacrificialAttr, VariableMoveTypeAttr, VariableMoveCategoryAttr, CounterDamageAttr, StatChangeAttr, RechargeAttr, ChargeAttr, IgnoreWeatherTypeDebuffAttr, BypassBurnDamageReductionAttr, SacrificialAttrOnHit } from "../data/move";
|
||||
import Move, { HighCritAttr, HitsTagAttr, applyMoveAttrs, FixedDamageAttr, VariableAtkAttr, VariablePowerAttr, allMoves, MoveCategory, TypelessAttr, CritOnlyAttr, getMoveTargets, OneHitKOAttr, MultiHitAttr, StatusMoveTypeImmunityAttr, MoveTarget, VariableDefAttr, AttackMove, ModifiedDamageAttr, VariableMoveTypeMultiplierAttr, IgnoreOpponentStatChangesAttr, SacrificialAttr, VariableMoveTypeAttr, VariableMoveCategoryAttr, CounterDamageAttr, StatChangeAttr, RechargeAttr, ChargeAttr, IgnoreWeatherTypeDebuffAttr, BypassBurnDamageReductionAttr, SacrificialAttrOnHit, MoveFlags } from "../data/move";
|
||||
import { default as PokemonSpecies, PokemonSpeciesForm, SpeciesFormKey, getFusedSpeciesName, getPokemonSpecies, getPokemonSpeciesForm, getStarterValueFriendshipCap, speciesStarters, starterPassiveAbilities } from "../data/pokemon-species";
|
||||
import * as Utils from "../utils";
|
||||
import { Type, TypeDamageMultiplier, getTypeDamageMultiplier, getTypeRgb } from "../data/type";
|
||||
@ -1613,6 +1613,15 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||
typeMultiplier.value = 0;
|
||||
}
|
||||
|
||||
// Apply arena tags for conditional protection
|
||||
if (!move.hasFlag(MoveFlags.IGNORE_PROTECT) && !move.isAllyTarget()) {
|
||||
const defendingSide = this.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY;
|
||||
this.scene.arena.applyTagsForSide(ArenaTagType.QUICK_GUARD, defendingSide, cancelled, this, move.priority);
|
||||
this.scene.arena.applyTagsForSide(ArenaTagType.WIDE_GUARD, defendingSide, cancelled, this, move.moveTarget);
|
||||
this.scene.arena.applyTagsForSide(ArenaTagType.MAT_BLOCK, defendingSide, cancelled, this, move.category);
|
||||
this.scene.arena.applyTagsForSide(ArenaTagType.CRAFTY_SHIELD, defendingSide, cancelled, this, move.category, move.moveTarget);
|
||||
}
|
||||
|
||||
switch (moveCategory) {
|
||||
case MoveCategory.PHYSICAL:
|
||||
case MoveCategory.SPECIAL:
|
||||
|
@ -1,21 +1,30 @@
|
||||
import BattleScene from "../battle-scene";
|
||||
import { pokemonPrevolutions } from "../data/pokemon-evolutions";
|
||||
import PokemonSpecies, { getPokemonSpecies } from "../data/pokemon-species";
|
||||
import { TrainerConfig, TrainerPartyCompoundTemplate, TrainerPartyTemplate, TrainerPoolTier, TrainerSlot, trainerConfigs, trainerPartyTemplates } from "../data/trainer-config";
|
||||
import { PartyMemberStrength } from "../data/enums/party-member-strength";
|
||||
import { TrainerType } from "../data/enums/trainer-type";
|
||||
import { EnemyPokemon } from "./pokemon";
|
||||
import {pokemonPrevolutions} from "../data/pokemon-evolutions";
|
||||
import PokemonSpecies, {getPokemonSpecies} from "../data/pokemon-species";
|
||||
import {
|
||||
TrainerConfig,
|
||||
TrainerPartyCompoundTemplate,
|
||||
TrainerPartyTemplate,
|
||||
TrainerPoolTier,
|
||||
TrainerSlot,
|
||||
trainerConfigs,
|
||||
trainerPartyTemplates,
|
||||
signatureSpecies
|
||||
} from "../data/trainer-config";
|
||||
import {PartyMemberStrength} from "../data/enums/party-member-strength";
|
||||
import {TrainerType} from "../data/enums/trainer-type";
|
||||
import {EnemyPokemon} from "./pokemon";
|
||||
import * as Utils from "../utils";
|
||||
import { PersistentModifier } from "../modifier/modifier";
|
||||
import { trainerNamePools } from "../data/trainer-names";
|
||||
import { ArenaTagSide, ArenaTrapTag } from "#app/data/arena-tag";
|
||||
import {PersistentModifier} from "../modifier/modifier";
|
||||
import {trainerNamePools} from "../data/trainer-names";
|
||||
import {ArenaTagSide, ArenaTrapTag} from "#app/data/arena-tag";
|
||||
import {getIsInitialized, initI18n} from "#app/plugins/i18n";
|
||||
import i18next from "i18next";
|
||||
|
||||
export enum TrainerVariant {
|
||||
DEFAULT,
|
||||
FEMALE,
|
||||
DOUBLE
|
||||
DEFAULT,
|
||||
FEMALE,
|
||||
DOUBLE
|
||||
}
|
||||
|
||||
export default class Trainer extends Phaser.GameObjects.Container {
|
||||
@ -41,7 +50,7 @@ export default class Trainer extends Phaser.GameObjects.Container {
|
||||
if (partnerName) {
|
||||
this.partnerName = partnerName;
|
||||
} else {
|
||||
[ this.name, this.partnerName ] = this.name.split(" & ");
|
||||
[this.name, this.partnerName] = this.name.split(" & ");
|
||||
}
|
||||
} else {
|
||||
this.partnerName = partnerName || Utils.randSeedItem(Array.isArray(namePool[0]) ? namePool[1] : namePool);
|
||||
@ -67,7 +76,7 @@ export default class Trainer extends Phaser.GameObjects.Container {
|
||||
const getSprite = (hasShadow?: boolean, forceFemale?: boolean) => {
|
||||
const ret = this.scene.addFieldSprite(0, 0, this.config.getSpriteKey(variant === TrainerVariant.FEMALE || forceFemale));
|
||||
ret.setOrigin(0.5, 1);
|
||||
ret.setPipeline(this.scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: !!hasShadow });
|
||||
ret.setPipeline(this.scene.spritePipeline, {tone: [0.0, 0.0, 0.0, 0.0], hasShadow: !!hasShadow});
|
||||
return ret;
|
||||
};
|
||||
|
||||
@ -142,6 +151,11 @@ export default class Trainer extends Phaser.GameObjects.Container {
|
||||
}
|
||||
}
|
||||
|
||||
if (this.config.titleDouble && this.variant === TrainerVariant.DOUBLE && !this.config.doubleOnly) {
|
||||
title = this.config.titleDouble;
|
||||
name = i18next.t(`trainerNames:${this.config.nameDouble.toLowerCase().replace(/\s/g, "_")}`);
|
||||
}
|
||||
|
||||
// Return the formatted name, including the title if it is set.
|
||||
return title ? `${title} ${name}` : name;
|
||||
}
|
||||
@ -236,15 +250,19 @@ export default class Trainer extends Phaser.GameObjects.Container {
|
||||
const template = this.getPartyTemplate();
|
||||
const strength: PartyMemberStrength = template.getStrength(index);
|
||||
|
||||
if (this.config.partyMemberFuncs.hasOwnProperty(index)) {
|
||||
ret = this.config.partyMemberFuncs[index](this.scene, level, strength);
|
||||
return;
|
||||
}
|
||||
if (this.config.partyMemberFuncs.hasOwnProperty(index - template.size)) {
|
||||
ret = this.config.partyMemberFuncs[index - template.size](this.scene, level, template.getStrength(index));
|
||||
return;
|
||||
}
|
||||
|
||||
// If the battle is not one of the named trainer doubles
|
||||
if (!(this.config.trainerTypeDouble && this.isDouble() && !this.config.doubleOnly)) {
|
||||
|
||||
if (this.config.partyMemberFuncs.hasOwnProperty(index)) {
|
||||
ret = this.config.partyMemberFuncs[index](this.scene, level, strength);
|
||||
return;
|
||||
}
|
||||
if (this.config.partyMemberFuncs.hasOwnProperty(index - template.size)) {
|
||||
ret = this.config.partyMemberFuncs[index - template.size](this.scene, level, template.getStrength(index));
|
||||
return;
|
||||
}
|
||||
}
|
||||
let offset = 0;
|
||||
|
||||
if (template instanceof TrainerPartyCompoundTemplate) {
|
||||
@ -256,9 +274,65 @@ export default class Trainer extends Phaser.GameObjects.Container {
|
||||
}
|
||||
}
|
||||
|
||||
const species = template.isSameSpecies(index) && index > offset
|
||||
? getPokemonSpecies(battle.enemyParty[offset].species.getTrainerSpeciesForLevel(level, false, template.getStrength(offset)))
|
||||
: this.genNewPartyMemberSpecies(level, strength);
|
||||
// Create an empty species pool (which will be set to one of the species pools based on the index)
|
||||
let newSpeciesPool = [];
|
||||
let useNewSpeciesPool = false;
|
||||
|
||||
// If we are in a double battle of named trainers, we need to use alternate species pools (generate half the party from each trainer)
|
||||
if (this.config.trainerTypeDouble && this.isDouble() && !this.config.doubleOnly) {
|
||||
|
||||
// Use the new species pool for this party generation
|
||||
useNewSpeciesPool = true;
|
||||
|
||||
|
||||
// Get the species pool for the partner trainer and the current trainer
|
||||
const speciesPoolPartner = signatureSpecies[TrainerType[this.config.trainerTypeDouble]];
|
||||
const speciesPool = signatureSpecies[TrainerType[this.config.trainerType]];
|
||||
|
||||
|
||||
// Get the species that are already in the enemy party so we dont generate the same species twice
|
||||
const AlreadyUsedSpecies = battle.enemyParty.map(p => p.species.speciesId);
|
||||
|
||||
// Filter out the species that are already in the enemy party from the main trainer species pool
|
||||
const speciesPoolFiltered = speciesPool.filter(species => {
|
||||
// Since some species pools have arrays in them (use either of those species), we need to check if one of the species is already in the party and filter the whole array if it is
|
||||
if (Array.isArray(species)) {
|
||||
return !species.some(s => AlreadyUsedSpecies.includes(s));
|
||||
}
|
||||
return !AlreadyUsedSpecies.includes(species);
|
||||
});
|
||||
|
||||
// Filter out the species that are already in the enemy party from the partner trainer species pool
|
||||
const speciesPoolPartnerFiltered = speciesPoolPartner.filter(species => {
|
||||
// Since some species pools have arrays in them (use either of those species), we need to check if one of the species is already in the party and filter the whole array if it is
|
||||
if (Array.isArray(species)) {
|
||||
return !species.some(s => AlreadyUsedSpecies.includes(s));
|
||||
}
|
||||
return !AlreadyUsedSpecies.includes(species);
|
||||
});
|
||||
|
||||
|
||||
// If the index is even, use the species pool for the main trainer (that way he only uses his own pokemon in battle)
|
||||
if (!(index % 2)) {
|
||||
newSpeciesPool = speciesPoolFiltered;
|
||||
} else {
|
||||
// If the index is odd, use the species pool for the partner trainer (that way he only uses his own pokemon in battle)
|
||||
newSpeciesPool = speciesPoolPartnerFiltered;
|
||||
}
|
||||
|
||||
// Fallback for when the species pool is empty
|
||||
if (newSpeciesPool.length === 0) {
|
||||
// If all pokemon from this pool are already in the party, generate a random species
|
||||
useNewSpeciesPool = false;
|
||||
}
|
||||
}
|
||||
|
||||
// If useNewSpeciesPool is true, we need to generate a new species from the new species pool, otherwise we generate a random species
|
||||
const species = useNewSpeciesPool
|
||||
? getPokemonSpecies(newSpeciesPool[Math.floor(Math.random() * newSpeciesPool.length)])
|
||||
: template.isSameSpecies(index) && index > offset
|
||||
? getPokemonSpecies(battle.enemyParty[offset].species.getTrainerSpeciesForLevel(level, false, template.getStrength(offset)))
|
||||
: this.genNewPartyMemberSpecies(level, strength);
|
||||
|
||||
ret = this.scene.addEnemyPokemon(species, level, !this.isDouble() || !(index % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER);
|
||||
}, this.config.hasStaticParty ? this.config.getDerivedType() + ((index + 1) << 8) : this.scene.currentBattle.waveIndex + (this.config.getDerivedType() << 10) + (((!this.config.useSameSeedForAllMembers ? index : 0) + 1) << 8));
|
||||
@ -266,6 +340,7 @@ export default class Trainer extends Phaser.GameObjects.Container {
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
genNewPartyMemberSpecies(level: integer, strength: PartyMemberStrength, attempt?: integer): PokemonSpecies {
|
||||
const battle = this.scene.currentBattle;
|
||||
const template = this.getPartyTemplate();
|
||||
@ -340,7 +415,7 @@ export default class Trainer extends Phaser.GameObjects.Container {
|
||||
if (forSwitch && !p.isOnField()) {
|
||||
this.scene.arena.findTagsOnSide(t => t instanceof ArenaTrapTag, ArenaTagSide.ENEMY).map(t => score *= (t as ArenaTrapTag).getMatchupScoreMultiplier(p));
|
||||
}
|
||||
return [ party.indexOf(p), score ];
|
||||
return [party.indexOf(p), score];
|
||||
});
|
||||
|
||||
return partyMemberScores;
|
||||
@ -521,5 +596,5 @@ export default class Trainer extends Phaser.GameObjects.Container {
|
||||
}
|
||||
|
||||
export default interface Trainer {
|
||||
scene: BattleScene
|
||||
scene: BattleScene
|
||||
}
|
||||
|
@ -471,7 +471,7 @@ export const ability: AbilityTranslationEntries = {
|
||||
},
|
||||
honeyGather: {
|
||||
name: "Honigmaul",
|
||||
description: "Das Pokémon sammelt nach Kämpfen eventuell Honig auf.",
|
||||
description: "The Pokémon gathers Honey after a battle. The Honey is then sold for money.",
|
||||
},
|
||||
frisk: {
|
||||
name: "Schnüffler",
|
||||
|
@ -29,7 +29,7 @@ export const menu: SimpleTranslationEntries = {
|
||||
"confirmPassword": "Bestätige Passwort",
|
||||
"registrationAgeWarning": "Mit der Registrierung bestätigen Sie, dass Sie 13 Jahre oder älter sind.",
|
||||
"backToLogin": "Zurück zur Anmeldung",
|
||||
"failedToLoadSaveData": "Speicherdaten konnten nicht geladen werden. Bitte laden Sie die Seite neu.\nWenn dies weiterhin der Fall ist, wenden Sie sich bitte an den Administrator.",
|
||||
"failedToLoadSaveData": "Speicherdaten konnten nicht geladen werden. Bitte laden Sie die Seite neu.\nÜberprüfe den #announcements-Kanal im Discord bei anhaltenden Problemen",
|
||||
"sessionSuccess": "Sitzung erfolgreich geladen.",
|
||||
"failedToLoadSession": "Ihre Sitzungsdaten konnten nicht geladen werden.\nSie könnten beschädigt sein.",
|
||||
"boyOrGirl": "Bist du ein Junge oder ein Mädchen?",
|
||||
|
@ -5,7 +5,9 @@ export const titles: SimpleTranslationEntries = {
|
||||
"elite_four": "Top Vier",
|
||||
"gym_leader": "Arenaleiter",
|
||||
"gym_leader_female": "Arenaleiterin",
|
||||
"gym_leader_double": "Arenaleiter-Duo",
|
||||
"champion": "Champion",
|
||||
"champion_double": "Champion-Duo",
|
||||
"rival": "Rivale",
|
||||
"professor": "Professor",
|
||||
"frontier_brain": "Kampfkoryphäen",
|
||||
@ -241,4 +243,16 @@ export const trainerNames: SimpleTranslationEntries = {
|
||||
"leon": "Delion",
|
||||
"rival": "Finn",
|
||||
"rival_female": "Ivy",
|
||||
|
||||
// Double Names
|
||||
"blue_red_double": "Blau & Rot",
|
||||
"red_blue_double": "Rot & Blau",
|
||||
"tate_liza_double": "Ben & Svenja",
|
||||
"liza_tate_double": "Svenja & Ben",
|
||||
"steven_wallace_double": "Troy & Wassili",
|
||||
"wallace_steven_double": "Wassili & Troy",
|
||||
"alder_iris_double": "Lauro & Lilia",
|
||||
"iris_alder_double": "Lilia & Lauro",
|
||||
"piers_marnie_double": "Nezz & Mary",
|
||||
"marnie_piers_double": "Mary & Nezz",
|
||||
} as const;
|
||||
|
@ -471,7 +471,7 @@ export const ability: AbilityTranslationEntries = {
|
||||
},
|
||||
honeyGather: {
|
||||
name: "Honey Gather",
|
||||
description: "The Pokémon may gather Honey after a battle.",
|
||||
description: "The Pokémon gathers Honey after a battle. The Honey is then sold for money.",
|
||||
},
|
||||
frisk: {
|
||||
name: "Frisk",
|
||||
|
@ -5,7 +5,9 @@ export const titles: SimpleTranslationEntries = {
|
||||
"elite_four": "Elite Four",
|
||||
"gym_leader": "Gym Leader",
|
||||
"gym_leader_female": "Gym Leader",
|
||||
"gym_leader_double": "Gym Leader Duo",
|
||||
"champion": "Champion",
|
||||
"champion_double": "Champion Duo",
|
||||
"rival": "Rival",
|
||||
"professor": "Professor",
|
||||
"frontier_brain": "Frontier Brain",
|
||||
@ -241,4 +243,16 @@ export const trainerNames: SimpleTranslationEntries = {
|
||||
"leon": "Leon",
|
||||
"rival": "Finn",
|
||||
"rival_female": "Ivy",
|
||||
|
||||
// Double Names
|
||||
"blue_red_double": "Blue & Red",
|
||||
"red_blue_double": "Red & Blue",
|
||||
"tate_liza_double": "Tate & Liza",
|
||||
"liza_tate_double": "Liza & Tate",
|
||||
"steven_wallace_double": "Steven & Wallace",
|
||||
"wallace_steven_double": "Wallace & Steven",
|
||||
"alder_iris_double": "Alder & Iris",
|
||||
"iris_alder_double": "Iris & Alder",
|
||||
"marnie_piers_double": "Marnie & Piers",
|
||||
"piers_marnie_double": "Piers & Marnie",
|
||||
} as const;
|
||||
|
@ -471,7 +471,7 @@ export const ability: AbilityTranslationEntries = {
|
||||
},
|
||||
"honeyGather": {
|
||||
name: "Recogemiel",
|
||||
description: "Puede que encuentre Miel una vez concluido el combate."
|
||||
description: "The Pokémon gathers Honey after a battle. The Honey is then sold for money."
|
||||
},
|
||||
"frisk": {
|
||||
name: "Cacheo",
|
||||
|
@ -5,7 +5,9 @@ export const titles: SimpleTranslationEntries = {
|
||||
"elite_four": "Elite Four",
|
||||
"gym_leader": "Gym Leader",
|
||||
"gym_leader_female": "Gym Leader",
|
||||
"gym_leader_double": "Gym Leader Duo",
|
||||
"champion": "Champion",
|
||||
"champion_double": "Champion Duo",
|
||||
"rival": "Rival",
|
||||
"professor": "Professor",
|
||||
"frontier_brain": "Frontier Brain",
|
||||
@ -240,4 +242,16 @@ export const trainerNames: SimpleTranslationEntries = {
|
||||
"leon": "Leon",
|
||||
"rival": "Finn",
|
||||
"rival_female": "Ivy",
|
||||
|
||||
// Double Names
|
||||
"blue_red_double": "Blue & Red",
|
||||
"red_blue_double": "Red & Blue",
|
||||
"tate_liza_double": "Tate & Liza",
|
||||
"liza_tate_double": "Liza & Tate",
|
||||
"steven_wallace_double": "Steven & Wallace",
|
||||
"wallace_steven_double": "Wallace & Steven",
|
||||
"alder_iris_double": "Alder & Iris",
|
||||
"iris_alder_double": "Iris & Alder",
|
||||
"marnie_piers_double": "Marnie & Piers",
|
||||
"piers_marnie_double": "Piers & Marnie",
|
||||
} as const;
|
||||
|
@ -471,7 +471,7 @@ export const ability: AbilityTranslationEntries = {
|
||||
},
|
||||
honeyGather: {
|
||||
name: "Cherche Miel",
|
||||
description: "Le Pokémon peut parfois trouver du Miel après un combat.",
|
||||
description: "The Pokémon gathers Honey after a battle. The Honey is then sold for money.",
|
||||
},
|
||||
frisk: {
|
||||
name: "Fouille",
|
||||
|
@ -5,7 +5,9 @@ export const titles: SimpleTranslationEntries = {
|
||||
"elite_four": "Conseil 4",
|
||||
"gym_leader": "Champion d’Arène",
|
||||
"gym_leader_female": "Championne d’Arène",
|
||||
"gym_leader_double": "Gym Leader Duo",
|
||||
"champion": "Maitre·esse", //Written in gender-inclusive language in wait of a potential split of the entry
|
||||
"champion_double": "Champion Duo",
|
||||
"rival": "Rival·e", //Written in gender-inclusive language in wait of a potential split of the entry
|
||||
"professor": "Professeur·e", //Written in gender-inclusive language in wait of a potential split of the entry
|
||||
"frontier_brain": "Meneur·euse de Zone", //Written in gender-inclusive language in wait of a potential split of the entry
|
||||
@ -241,4 +243,17 @@ export const trainerNames: SimpleTranslationEntries = {
|
||||
"leon": "Tarak",
|
||||
"rival": "Gwenaël", //Male breton name, a celtic language spoken in Brittany (France) and related to the word for "white" (gwenn). Finn meaning is also "white" in irish/goidelic which are also celtic languages.
|
||||
"rival_female": "Papina", //Litteral translation of ivy, also used as Female name in a North-American indigenous language
|
||||
|
||||
|
||||
// Double Names
|
||||
"blue_red_double": "Blue & Red",
|
||||
"red_blue_double": "Red & Blue",
|
||||
"tate_liza_double": "Tate & Liza",
|
||||
"liza_tate_double": "Liza & Tate",
|
||||
"steven_wallace_double": "Steven & Wallace",
|
||||
"wallace_steven_double": "Wallace & Steven",
|
||||
"alder_iris_double": "Alder & Iris",
|
||||
"iris_alder_double": "Iris & Alder",
|
||||
"marnie_piers_double": "Marnie & Piers",
|
||||
"piers_marnie_double": "Piers & Marnie",
|
||||
} as const;
|
||||
|
@ -471,7 +471,7 @@ export const ability: AbilityTranslationEntries = {
|
||||
},
|
||||
honeyGather: {
|
||||
name: "Mielincetta",
|
||||
description: "Il Pokémon può raccogliere del Miele alla fine della lotta.",
|
||||
description: "The Pokémon gathers Honey after a battle. The Honey is then sold for money.",
|
||||
},
|
||||
frisk: {
|
||||
name: "Indagine",
|
||||
|
@ -5,7 +5,9 @@ export const titles: SimpleTranslationEntries = {
|
||||
"elite_four": "Superquattro",
|
||||
"gym_leader": "Capopalestra",
|
||||
"gym_leader_female": "Capopalestra",
|
||||
"gym_leader_double": "Gym Leader Duo",
|
||||
"champion": "Campione",
|
||||
"champion_double": "Champion Duo",
|
||||
"rival": "Rivale",
|
||||
"professor": "Professore",
|
||||
"frontier_brain": "Asso Lotta",
|
||||
@ -241,4 +243,17 @@ export const trainerNames: SimpleTranslationEntries = {
|
||||
"leon": "Leon",
|
||||
"rival": "Finn",
|
||||
"rival_female": "Ivy",
|
||||
|
||||
|
||||
// Double Names
|
||||
"blue_red_double": "Blue & Red",
|
||||
"red_blue_double": "Red & Blue",
|
||||
"tate_liza_double": "Tate & Liza",
|
||||
"liza_tate_double": "Liza & Tate",
|
||||
"steven_wallace_double": "Steven & Wallace",
|
||||
"wallace_steven_double": "Wallace & Steven",
|
||||
"alder_iris_double": "Alder & Iris",
|
||||
"iris_alder_double": "Iris & Alder",
|
||||
"marnie_piers_double": "Marnie & Piers",
|
||||
"piers_marnie_double": "Piers & Marnie",
|
||||
} as const;
|
||||
|
@ -471,7 +471,7 @@ export const ability: AbilityTranslationEntries = {
|
||||
},
|
||||
honeyGather: {
|
||||
name: "Honey Gather",
|
||||
description: "O Pokémon pode coletar Mel ao final de uma batalha.",
|
||||
description: "The Pokémon gathers Honey after a battle. The Honey is then sold for money.",
|
||||
},
|
||||
frisk: {
|
||||
name: "Frisk",
|
||||
|
@ -5,7 +5,9 @@ export const titles: SimpleTranslationEntries = {
|
||||
"elite_four": "Elite dos Quatro",
|
||||
"gym_leader": "Líder de Ginásio",
|
||||
"gym_leader_female": "Líder de Ginásio",
|
||||
"gym_leader_double": "Gym Leader Duo",
|
||||
"champion": "Campeão",
|
||||
"champion_double": "Champion Duo",
|
||||
"rival": "Rival",
|
||||
"professor": "Professor",
|
||||
"frontier_brain": "Cérebro da Fronteira",
|
||||
@ -241,4 +243,16 @@ export const trainerNames: SimpleTranslationEntries = {
|
||||
"leon": "Leon",
|
||||
"rival": "Finn",
|
||||
"rival_female": "Ivy",
|
||||
|
||||
// Double Names
|
||||
"blue_red_double": "Blue & Red",
|
||||
"red_blue_double": "Red & Blue",
|
||||
"tate_liza_double": "Tate & Liza",
|
||||
"liza_tate_double": "Liza & Tate",
|
||||
"steven_wallace_double": "Steven & Wallace",
|
||||
"wallace_steven_double": "Wallace & Steven",
|
||||
"alder_iris_double": "Alder & Iris",
|
||||
"iris_alder_double": "Iris & Alder",
|
||||
"marnie_piers_double": "Marnie & Piers",
|
||||
"piers_marnie_double": "Piers & Marnie",
|
||||
} as const;
|
||||
|
@ -471,7 +471,7 @@ export const ability: AbilityTranslationEntries = {
|
||||
},
|
||||
honeyGather: {
|
||||
name: "采蜜",
|
||||
description: "战斗结束时,有时候会捡来\n甜甜蜜。",
|
||||
description: "The Pokémon gathers Honey after a battle. The Honey is then sold for money.",
|
||||
},
|
||||
frisk: {
|
||||
name: "察觉",
|
||||
|
@ -5,7 +5,9 @@ export const titles: SimpleTranslationEntries = {
|
||||
"elite_four": "四天王",
|
||||
"gym_leader": "道馆馆主",
|
||||
"gym_leader_female": "道馆馆主",
|
||||
"gym_leader_double": "Gym Leader Duo",
|
||||
"champion": "冠军",
|
||||
"champion_double": "Champion Duo",
|
||||
"rival": "劲敌",
|
||||
"professor": "博士",
|
||||
"frontier_brain": "开拓头脑",
|
||||
@ -297,4 +299,17 @@ export const trainerNames: SimpleTranslationEntries = {
|
||||
// 劲敌 rival
|
||||
"rival": "芬恩",
|
||||
"rival_female": "艾薇",
|
||||
|
||||
|
||||
// Double Names
|
||||
"blue_red_double": "Blue & Red",
|
||||
"red_blue_double": "Red & Blue",
|
||||
"tate_liza_double": "Tate & Liza",
|
||||
"liza_tate_double": "Liza & Tate",
|
||||
"steven_wallace_double": "Steven & Wallace",
|
||||
"wallace_steven_double": "Wallace & Steven",
|
||||
"alder_iris_double": "Alder & Iris",
|
||||
"iris_alder_double": "Iris & Alder",
|
||||
"marnie_piers_double": "Marnie & Piers",
|
||||
"piers_marnie_double": "Piers & Marnie",
|
||||
} as const;
|
||||
|
@ -418,7 +418,7 @@ export const ability: AbilityTranslationEntries = {
|
||||
snowWarning: { name: "降雪", description: "出場時,會將天氣變爲下雪。" },
|
||||
honeyGather: {
|
||||
name: "採蜜",
|
||||
description: "戰鬥結束時,有時候會撿來\n甜甜蜜。",
|
||||
description: "The Pokémon gathers Honey after a battle. The Honey is then sold for money.",
|
||||
},
|
||||
frisk: {
|
||||
name: "察覺",
|
||||
|
@ -34,8 +34,8 @@ export const move: MoveTranslationEntries = {
|
||||
scratch: { name: "抓", effect: "用堅硬且無比鋒利的爪子抓\n對手進行攻擊" },
|
||||
viseGrip: { name: "夾住", effect: "將對手從兩側夾住,給予傷\n害" },
|
||||
guillotine: {
|
||||
name: "極落鉗",
|
||||
effect: "用大鉗子或剪刀等夾斷對手\n進行攻擊。只要命中就會一\n擊昏厥",
|
||||
name: "斷頭鉗",
|
||||
effect: "用大鉗子或剪刀等夾斷對手\n進行攻擊。只要命中就會一\n擊瀕死",
|
||||
},
|
||||
razorWind: {
|
||||
name: "旋風刀",
|
||||
@ -45,7 +45,7 @@ export const move: MoveTranslationEntries = {
|
||||
name: "劍舞",
|
||||
effect: "激烈地跳起戰舞提高氣勢。\n大幅提高自己的攻擊",
|
||||
},
|
||||
cut: { name: "居合劈", effect: "用鐮刀或爪子等切斬對手進\n行攻擊" },
|
||||
cut: { name: "居合斬", effect: "用鐮刀或爪子等切斬對手進\n行攻擊" },
|
||||
gust: { name: "起風", effect: "用翅膀將颳起的狂風襲向對\n手進行攻擊" },
|
||||
wingAttack: {
|
||||
name: "翅膀攻擊",
|
||||
@ -217,7 +217,7 @@ export const move: MoveTranslationEntries = {
|
||||
effect: "一邊旋轉,一邊將尖喙刺入\n對手進行攻擊",
|
||||
},
|
||||
submission: {
|
||||
name: "深淵翻滾",
|
||||
name: "地獄翻滾",
|
||||
effect: "將對手連同自己一起摔向地\n面進行攻擊。自己也會受到\n少許傷害",
|
||||
},
|
||||
lowKick: {
|
||||
@ -305,7 +305,7 @@ export const move: MoveTranslationEntries = {
|
||||
},
|
||||
fissure: {
|
||||
name: "地裂",
|
||||
effect: "讓對手掉落於地裂的裂縫中\n進行攻擊。只要命中就會一\n擊昏厥",
|
||||
effect: "讓對手掉落於地裂的裂縫中\n進行攻擊。只要命中就會一\n擊瀕死",
|
||||
},
|
||||
dig: { name: "挖洞", effect: "第1回合鑽入地底,第2回\n合攻擊對手" },
|
||||
toxic: {
|
||||
@ -421,8 +421,8 @@ export const move: MoveTranslationEntries = {
|
||||
effect: "模仿對手使用的招式,自己\n也使用相同招式",
|
||||
},
|
||||
selfDestruct: {
|
||||
name: "玉石俱碎",
|
||||
effect: "引發爆炸,攻擊自己周圍所\n有的寶可夢。使用後陷入昏\n厥",
|
||||
name: "自爆",
|
||||
effect: "引發爆炸,攻擊自己周圍所\n有的寶可夢。使用後陷入瀕\n死",
|
||||
},
|
||||
eggBomb: { name: "炸蛋", effect: "向對手用力投擲大大的蛋進\n行攻擊" },
|
||||
lick: {
|
||||
@ -548,7 +548,7 @@ export const move: MoveTranslationEntries = {
|
||||
},
|
||||
explosion: {
|
||||
name: "大爆炸",
|
||||
effect: "引發大爆炸,攻擊自己周圍\n所有的寶可夢。使用後自己\n會陷入昏厥",
|
||||
effect: "引發大爆炸,攻擊自己周圍\n所有的寶可夢。使用後自己\n會陷入瀕死",
|
||||
},
|
||||
furySwipes: {
|
||||
name: "亂抓",
|
||||
@ -563,15 +563,15 @@ export const move: MoveTranslationEntries = {
|
||||
effect: "連續睡上2回合。回覆自己\n的全部HP以及治癒所有異\n常狀態",
|
||||
},
|
||||
rockSlide: {
|
||||
name: "巖崩",
|
||||
name: "岩崩",
|
||||
effect: "將大岩石猛烈地撞向對手進\n行攻擊。有時會使對手畏縮",
|
||||
},
|
||||
hyperFang: {
|
||||
name: "終結門牙",
|
||||
name: "必殺門牙",
|
||||
effect: "用鋒利的門牙牢牢地咬住對\n手進行攻擊。有時會使對手\n畏縮",
|
||||
},
|
||||
sharpen: {
|
||||
name: "棱角化",
|
||||
name: "稜角化",
|
||||
effect: "增加身體的角,變得棱棱角\n角,從而提高自己的攻擊",
|
||||
},
|
||||
conversion: {
|
||||
@ -651,7 +651,7 @@ export const move: MoveTranslationEntries = {
|
||||
effect: "將棉花般柔軟的孢子緊貼對\n手,從而大幅降低對手的速\n度",
|
||||
},
|
||||
reversal: {
|
||||
name: "絕處逢生",
|
||||
name: "起死回生",
|
||||
effect: "竭盡全力進行攻擊。自己的\nHP越少,招式的威力越大",
|
||||
},
|
||||
spite: {
|
||||
@ -671,7 +671,7 @@ export const move: MoveTranslationEntries = {
|
||||
effect: "以迅雷不及掩耳之勢出拳。\n必定能夠先制攻擊",
|
||||
},
|
||||
scaryFace: {
|
||||
name: "可怕面孔",
|
||||
name: "鬼面",
|
||||
effect: "用恐怖的表情瞪着對手,使\n其害怕,從而大幅降低對手\n的速度",
|
||||
},
|
||||
feintAttack: {
|
||||
@ -712,11 +712,11 @@ export const move: MoveTranslationEntries = {
|
||||
},
|
||||
destinyBond: {
|
||||
name: "同命",
|
||||
effect: "使出招式後,當受到對手攻\n擊陷入昏厥時,對手也會一\n同昏厥。連續使出則會失敗",
|
||||
effect: "使出招式後,當受到對手攻\n擊陷入瀕死時,對手也會一\n同瀕死。連續使出則會失敗",
|
||||
},
|
||||
perishSong: {
|
||||
name: "終焉之歌",
|
||||
effect: "傾聽歌聲的寶可夢經過3回\n合陷入昏厥。替換後效果消\n失",
|
||||
name: "滅亡之歌",
|
||||
effect: "傾聽歌聲的寶可夢經過3回\n合陷入瀕死。替換後效果消\n失",
|
||||
},
|
||||
icyWind: {
|
||||
name: "冰凍之風",
|
||||
@ -922,7 +922,7 @@ export const move: MoveTranslationEntries = {
|
||||
effect: "在使用招式2回合後,向對\n手發送一團念力進行攻擊",
|
||||
},
|
||||
rockSmash: {
|
||||
name: "碎巖",
|
||||
name: "碎岩",
|
||||
effect: "用拳頭進行攻擊。有時會降\n低對手的防禦",
|
||||
},
|
||||
whirlpool: {
|
||||
@ -970,7 +970,7 @@ export const move: MoveTranslationEntries = {
|
||||
effect: "吹捧對手,使其混亂。同時\n還會提高對手的特攻",
|
||||
},
|
||||
willOWisp: {
|
||||
name: "磷火",
|
||||
name: "鬼火",
|
||||
effect: "放出怪異的火焰,從而讓對\n手陷入灼傷狀態",
|
||||
},
|
||||
memento: {
|
||||
@ -1023,8 +1023,8 @@ export const move: MoveTranslationEntries = {
|
||||
effect: "向同伴緊急求助,從我方寶\n可夢已學會的招式中隨機使\n用1個",
|
||||
},
|
||||
ingrain: {
|
||||
name: "紮根",
|
||||
effect: "在大地上紮根,每回合回覆\n自己的HP。因爲紮根了,\n所以不能替換寶可夢",
|
||||
name: "扎根",
|
||||
effect: "在大地上扎根,每回合回覆\n自己的HP。因爲扎根了,\n所以不能替換寶可夢",
|
||||
},
|
||||
superpower: {
|
||||
name: "蠻力",
|
||||
@ -1201,8 +1201,8 @@ export const move: MoveTranslationEntries = {
|
||||
effect: "讓對手聽舒適的笛聲,從而\n陷入睡眠狀態",
|
||||
},
|
||||
tickle: {
|
||||
name: "撓癢",
|
||||
effect: "給對手撓癢,使其發笑,從\n而降低對手的攻擊和防禦",
|
||||
name: "搔癢",
|
||||
effect: "給對手搔癢,使其發笑,從\n而降低對手的攻擊和防禦",
|
||||
},
|
||||
cosmicPower: {
|
||||
name: "宇宙力量",
|
||||
@ -1222,16 +1222,16 @@ export const move: MoveTranslationEntries = {
|
||||
effect: "發出看不見的神奇力量進行\n攻擊。有時會使對手畏縮",
|
||||
},
|
||||
skyUppercut: {
|
||||
name: "沖天拳",
|
||||
name: "衝天拳",
|
||||
effect: "用衝向天空般高高的上勾拳\n頂起對手進行攻擊",
|
||||
},
|
||||
sandTomb: {
|
||||
name: "流沙深淵",
|
||||
name: "流沙地獄",
|
||||
effect: "將對手困在鋪天蓋地的沙暴\n中,在4~5回合內進行攻\n擊",
|
||||
},
|
||||
sheerCold: {
|
||||
name: "絕對零度",
|
||||
effect: "給對手一擊昏厥。如果是冰\n屬性以外的寶可夢使用,就\n會難以打中",
|
||||
effect: "給對手一擊瀕死。如果是冰\n屬性以外的寶可夢使用,就\n會難以打中",
|
||||
},
|
||||
muddyWater: {
|
||||
name: "濁流",
|
||||
@ -1353,7 +1353,7 @@ export const move: MoveTranslationEntries = {
|
||||
},
|
||||
healingWish: {
|
||||
name: "治癒之願",
|
||||
effect: "雖然自己陷入昏厥,但可以\n治癒後備上場的寶可夢的異\n常狀態以及回覆HP",
|
||||
effect: "雖然自己陷入瀕死,但可以\n治癒後備上場的寶可夢的異\n常狀態以及回覆HP",
|
||||
},
|
||||
brine: {
|
||||
name: "鹽水",
|
||||
@ -1519,7 +1519,7 @@ export const move: MoveTranslationEntries = {
|
||||
effect: "將外殼堅硬的大種子,從上\n方砸下攻擊對手",
|
||||
},
|
||||
airSlash: {
|
||||
name: "空氣之刃",
|
||||
name: "空氣斬",
|
||||
effect: "用連天空也能劈開的空氣之\n刃進行攻擊。有時會使對手\n畏縮",
|
||||
},
|
||||
xScissor: {
|
||||
@ -1630,7 +1630,7 @@ export const move: MoveTranslationEntries = {
|
||||
effect: "將身體的光芒聚集在一點釋\n放出去。有時會降低對手的\n特防",
|
||||
},
|
||||
rockClimb: {
|
||||
name: "攀巖",
|
||||
name: "攀岩",
|
||||
effect: "發動猛撞攻擊,有時會使對\n手混亂。是寶可表的祕傳招\n式之一",
|
||||
},
|
||||
defog: {
|
||||
@ -1642,7 +1642,7 @@ export const move: MoveTranslationEntries = {
|
||||
effect: "製造出離奇的空間。在5回\n合內速度慢的寶可夢可以先\n行動",
|
||||
},
|
||||
dracoMeteor: {
|
||||
name: "流星羣",
|
||||
name: "流星群",
|
||||
effect: "從天空中向對手落下隕石。\n使用之後因爲反作用力,自\n己的特攻會大幅降低",
|
||||
},
|
||||
discharge: {
|
||||
@ -1690,7 +1690,7 @@ export const move: MoveTranslationEntries = {
|
||||
effect: "♂誘惑♀或♀誘惑♂,從而\n大幅降低對手的特攻",
|
||||
},
|
||||
stealthRock: {
|
||||
name: "隱形巖",
|
||||
name: "隱形岩",
|
||||
effect: "將無數岩石懸浮在對手的周\n圍,從而對替換出場的對手\n的寶可夢給予傷害",
|
||||
},
|
||||
grassKnot: {
|
||||
@ -1893,7 +1893,7 @@ export const move: MoveTranslationEntries = {
|
||||
effect: "用歌聲攻擊對手。大家一起\n輪唱便可以接連使出,威力\n也會提高",
|
||||
},
|
||||
echoedVoice: {
|
||||
name: "回聲",
|
||||
name: "迴聲",
|
||||
effect: "用回聲攻擊對手。如果每回\n合都有寶可夢接着使用該招\n式,威力就會提高",
|
||||
},
|
||||
chipAway: {
|
||||
@ -1945,7 +1945,7 @@ export const move: MoveTranslationEntries = {
|
||||
effect: "扔飛對手,強制拉後備寶可\n夢上場。如果對手爲野生寶\n可夢,戰鬥將直接結束",
|
||||
},
|
||||
incinerate: {
|
||||
name: "燒淨",
|
||||
name: "燒盡",
|
||||
effect: "用火焰攻擊對手。對手攜帶\n樹果等時,會燒掉,使其不\n能使用",
|
||||
},
|
||||
quash: {
|
||||
@ -1972,8 +1972,8 @@ export const move: MoveTranslationEntries = {
|
||||
effect: "當對手未攜帶道具時,能夠\n將自己攜帶的道具交給對手",
|
||||
},
|
||||
inferno: {
|
||||
name: "烈火深淵",
|
||||
effect: "用烈焰包裹住對手進行攻擊。\n讓對手陷入灼傷狀態",
|
||||
name: "煉獄",
|
||||
effect: "用猛烈的火焰包圍對手進行\n攻擊。讓對手陷入灼傷狀態",
|
||||
},
|
||||
waterPledge: {
|
||||
name: "水之誓約",
|
||||
|
@ -5,7 +5,9 @@ export const titles: SimpleTranslationEntries = {
|
||||
"elite_four": "四天王",
|
||||
"gym_leader": "道館館主",
|
||||
"gym_leader_female": "道館館主",
|
||||
"gym_leader_double": "Gym Leader Duo",
|
||||
"champion": "冠軍",
|
||||
"champion_double": "Champion Duo",
|
||||
"rival": "勁敵",
|
||||
"professor": "博士",
|
||||
"frontier_brain": "開拓頭腦",
|
||||
@ -296,5 +298,17 @@ export const trainerNames: SimpleTranslationEntries = {
|
||||
|
||||
// 勁敵 Rival
|
||||
"rival": "芬恩",
|
||||
"rival_female": "艾薇"
|
||||
"rival_female": "艾薇",
|
||||
|
||||
// Double Names
|
||||
"blue_red_double": "Blue & Red",
|
||||
"red_blue_double": "Red & Blue",
|
||||
"tate_liza_double": "Tate & Liza",
|
||||
"liza_tate_double": "Liza & Tate",
|
||||
"steven_wallace_double": "Steven & Wallace",
|
||||
"wallace_steven_double": "Wallace & Steven",
|
||||
"alder_iris_double": "Alder & Iris",
|
||||
"iris_alder_double": "Iris & Alder",
|
||||
"marnie_piers_double": "Marnie & Piers",
|
||||
"piers_marnie_double": "Piers & Marnie",
|
||||
} as const;
|
||||
|
@ -729,6 +729,11 @@ export class EncounterPhase extends BattlePhase {
|
||||
|
||||
this.scene.initSession();
|
||||
|
||||
// Failsafe if players somehow skip floor 200 in classic mode
|
||||
if (this.scene.gameMode.isClassic && this.scene.currentBattle.waveIndex > 200) {
|
||||
this.scene.unshiftPhase(new GameOverPhase(this.scene));
|
||||
}
|
||||
|
||||
const loadEnemyAssets = [];
|
||||
|
||||
const battle = this.scene.currentBattle;
|
||||
@ -2296,9 +2301,6 @@ export class BattleEndPhase extends BattlePhase {
|
||||
super.start();
|
||||
|
||||
this.scene.currentBattle.addBattleScore(this.scene);
|
||||
if (this.scene.currentBattle.moneyScattered) {
|
||||
this.scene.currentBattle.pickUpScatteredMoney(this.scene);
|
||||
}
|
||||
|
||||
this.scene.gameData.gameStats.battles++;
|
||||
if (this.scene.currentBattle.trainer) {
|
||||
@ -2318,6 +2320,10 @@ export class BattleEndPhase extends BattlePhase {
|
||||
applyPostBattleAbAttrs(PostBattleAbAttr, pokemon);
|
||||
}
|
||||
|
||||
if (this.scene.currentBattle.moneyScattered) {
|
||||
this.scene.currentBattle.pickUpScatteredMoney(this.scene);
|
||||
}
|
||||
|
||||
this.scene.clearEnemyHeldItemModifiers();
|
||||
|
||||
const lapsingModifiers = this.scene.findModifiers(m => m instanceof LapsingPersistentModifier || m instanceof LapsingPokemonHeldItemModifier) as (LapsingPersistentModifier | LapsingPokemonHeldItemModifier)[];
|
||||
@ -3862,6 +3868,11 @@ export class GameOverPhase extends BattlePhase {
|
||||
start() {
|
||||
super.start();
|
||||
|
||||
// Failsafe if players somehow skip floor 200 in classic mode
|
||||
if (this.scene.gameMode.isClassic && this.scene.currentBattle.waveIndex > 200) {
|
||||
this.victory = true;
|
||||
}
|
||||
|
||||
if (this.victory || !this.scene.enableRetries) {
|
||||
this.handleGameOver();
|
||||
} else {
|
||||
|
@ -380,6 +380,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container {
|
||||
|
||||
if (this.player) {
|
||||
this.y -= 12 * (mini ? 1 : -1);
|
||||
this.baseY = this.y;
|
||||
}
|
||||
|
||||
const offsetElements = [ this.nameText, this.genderText, this.teraIcon, this.splicedIcon, this.shinyIcon, this.statusIndicator, this.levelContainer ];
|
||||
|
@ -166,7 +166,7 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container {
|
||||
this.pokemonFusionShinyIcon.setTint(getVariantTint(pokemon.fusionVariant));
|
||||
}
|
||||
|
||||
const starterSpeciesId = pokemon.species.getRootSpeciesId(true);
|
||||
const starterSpeciesId = pokemon.species.getRootSpeciesId();
|
||||
const originalIvs: integer[] = this.scene.gameData.dexData[starterSpeciesId].caughtAttr
|
||||
? this.scene.gameData.dexData[starterSpeciesId].ivs
|
||||
: null;
|
||||
|
Loading…
Reference in New Issue
Block a user