mirror of
https://github.com/pagefaultgames/pokerogue.git
synced 2025-07-07 17:02:16 +02:00
Merge branch 'pagefaultgames:main' into after_you_implementation
This commit is contained in:
commit
29e39f293b
@ -146,8 +146,8 @@ body {
|
||||
margin-left: 10%;
|
||||
}
|
||||
|
||||
#touchControls:not([data-ui-mode='STARTER_SELECT']):not([data-ui-mode='SETTINGS']):not([data-ui-mode='SETTINGS_GAMEPAD']):not([data-ui-mode='SETTINGS_KEYBOARD']) #apad .apadRectBtnContainer > .apadSqBtn,
|
||||
#touchControls:not([data-ui-mode='STARTER_SELECT']):not([data-ui-mode='SETTINGS']):not([data-ui-mode='SETTINGS_GAMEPAD']):not([data-ui-mode='SETTINGS_KEYBOARD']) #apad .apadSqBtnContainer
|
||||
#touchControls:not([data-ui-mode='STARTER_SELECT']):not([data-ui-mode='SETTINGS']):not([data-ui-mode='SETTINGS_ACCESSIBILITY']):not([data-ui-mode='SETTINGS_GAMEPAD']):not([data-ui-mode='SETTINGS_KEYBOARD']) #apad .apadRectBtnContainer > .apadSqBtn,
|
||||
#touchControls:not([data-ui-mode='STARTER_SELECT']):not([data-ui-mode='SETTINGS']):not([data-ui-mode='SETTINGS_ACCESSIBILITY']):not([data-ui-mode='SETTINGS_GAMEPAD']):not([data-ui-mode='SETTINGS_KEYBOARD']) #apad .apadSqBtnContainer
|
||||
{
|
||||
display: none;
|
||||
}
|
||||
|
@ -4065,7 +4065,7 @@
|
||||
"426": [
|
||||
0,
|
||||
1,
|
||||
2
|
||||
1
|
||||
],
|
||||
"427": [
|
||||
0,
|
||||
|
@ -1,4 +1,5 @@
|
||||
import Move from "./data/move";
|
||||
import { BerryModifier } from "./modifier/modifier";
|
||||
|
||||
/** Alias for all {@linkcode BattleScene} events */
|
||||
export enum BattleSceneEventType {
|
||||
@ -13,6 +14,12 @@ export enum BattleSceneEventType {
|
||||
* @see {@linkcode MoveUsedEvent}
|
||||
*/
|
||||
MOVE_USED = "onMoveUsed",
|
||||
/**
|
||||
* Triggers when a berry gets successfully used
|
||||
* @see {@linkcode BerryUsedEvent}
|
||||
*/
|
||||
BERRY_USED = "onBerryUsed",
|
||||
|
||||
/**
|
||||
* Triggers on the first turn of a new battle
|
||||
* @see {@linkcode TurnInitEvent}
|
||||
@ -23,6 +30,7 @@ export enum BattleSceneEventType {
|
||||
* @see {@linkcode TurnEndEvent}
|
||||
*/
|
||||
TURN_END = "onTurnEnd",
|
||||
|
||||
/**
|
||||
* Triggers when a new {@linkcode Arena} is created during initialization
|
||||
* @see {@linkcode NewArenaEvent}
|
||||
@ -50,7 +58,7 @@ export class CandyUpgradeNotificationChangedEvent extends Event {
|
||||
*/
|
||||
export class MoveUsedEvent extends Event {
|
||||
/** The ID of the {@linkcode Pokemon} that used the {@linkcode Move} */
|
||||
public userId: number;
|
||||
public pokemonId: number;
|
||||
/** The {@linkcode Move} used */
|
||||
public move: Move;
|
||||
/** The amount of PP used on the {@linkcode Move} this turn */
|
||||
@ -58,11 +66,25 @@ export class MoveUsedEvent extends Event {
|
||||
constructor(userId: number, move: Move, ppUsed: number) {
|
||||
super(BattleSceneEventType.MOVE_USED);
|
||||
|
||||
this.userId = userId;
|
||||
this.pokemonId = userId;
|
||||
this.move = move;
|
||||
this.ppUsed = ppUsed;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Container class for {@linkcode BattleSceneEventType.BERRY_USED} events
|
||||
* @extends Event
|
||||
*/
|
||||
export class BerryUsedEvent extends Event {
|
||||
/** The {@linkcode BerryModifier} being used */
|
||||
public berryModifier: BerryModifier;
|
||||
constructor(berry: BerryModifier) {
|
||||
super(BattleSceneEventType.BERRY_USED);
|
||||
|
||||
this.berryModifier = berry;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Container class for {@linkcode BattleSceneEventType.TURN_INIT} events
|
||||
* @extends Event
|
||||
|
@ -7,20 +7,7 @@ import { getStatusEffectHealText } from "./status-effect";
|
||||
import * as Utils from "../utils";
|
||||
import { DoubleBerryEffectAbAttr, ReduceBerryUseThresholdAbAttr, applyAbAttrs } from "./ability";
|
||||
import i18next from "../plugins/i18n";
|
||||
|
||||
export enum BerryType {
|
||||
SITRUS,
|
||||
LUM,
|
||||
ENIGMA,
|
||||
LIECHI,
|
||||
GANLON,
|
||||
PETAYA,
|
||||
APICOT,
|
||||
SALAC,
|
||||
LANSAT,
|
||||
STARF,
|
||||
LEPPA
|
||||
}
|
||||
import { BerryType } from "./enums/berry-type";
|
||||
|
||||
export function getBerryName(berryType: BerryType): string {
|
||||
return i18next.t(`berry:${BerryType[berryType]}.name`);
|
||||
|
14
src/data/enums/berry-type.ts
Normal file
14
src/data/enums/berry-type.ts
Normal file
@ -0,0 +1,14 @@
|
||||
|
||||
export enum BerryType {
|
||||
SITRUS,
|
||||
LUM,
|
||||
ENIGMA,
|
||||
LIECHI,
|
||||
GANLON,
|
||||
PETAYA,
|
||||
APICOT,
|
||||
SALAC,
|
||||
LANSAT,
|
||||
STARF,
|
||||
LEPPA
|
||||
}
|
@ -618,7 +618,7 @@ export class TrainerConfig {
|
||||
* @param isMale - Whether the Champion is Male or Female (for localization of the title).
|
||||
* @returns {TrainerConfig} - The updated TrainerConfig instance.
|
||||
**/
|
||||
initForChampion(signatureSpecies: (Species | Species[])[],isMale: boolean): TrainerConfig {
|
||||
initForChampion(signatureSpecies: (Species | Species[])[], isMale: boolean): TrainerConfig {
|
||||
// Check if the internationalization (i18n) system is initialized.
|
||||
if (!getIsInitialized()) {
|
||||
initI18n();
|
||||
@ -917,20 +917,20 @@ export const signatureSpecies: SignatureSpecies = {
|
||||
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.AGGRON, 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],
|
||||
LEON: [Species.DRAGAPULT, [Species.ZACIAN, Species.ZAMAZENTA], Species.SEISMITOAD, Species.AEGISLASH, Species.CHARIZARD],
|
||||
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],
|
||||
BLUE: [[Species.GYARADOS, Species.EXEGGUTOR, Species.ARCANINE], Species.HO_OH, [Species.RHYPERIOR, Species.MAGNEZONE]], // Alakazam lead, Mega Pidgeot
|
||||
RED: [Species.LUGIA, Species.SNORLAX, [Species.ESPEON, Species.UMBREON, Species.SYLVEON]], // GMax Pikachu lead, Mega gen 1 starter
|
||||
LANCE_CHAMPION: [Species.DRAGONITE, Species.KINGDRA, Species.ALOLA_EXEGGUTOR], // Aerodactyl lead, Mega Lati@s
|
||||
STEVEN: [Species.AGGRON, [Species.ARMALDO, Species.CRADILY], Species.DIALGA], // Skarmorly lead, Mega Metagross
|
||||
WALLACE: [Species.MILOTIC, Species.PALKIA, Species.LUDICOLO], // Pelipper lead, Mega Swampert
|
||||
CYNTHIA: [Species.GIRATINA, Species.LUCARIO, Species.TOGEKISS], // Spiritomb lead, Mega Garchomp
|
||||
ALDER: [Species.VOLCARONA, Species.ZEKROM, [Species.ACCELGOR, Species.ESCAVALIER], Species.KELDEO], // Bouffalant/Braviary lead
|
||||
IRIS: [Species.HAXORUS, Species.RESHIRAM, Species.ARCHEOPS], // Druddigon lead, Gmax Lapras
|
||||
DIANTHA: [Species.HAWLUCHA, Species.XERNEAS, Species.GOODRA], // Gourgeist lead, Mega Gardevoir
|
||||
HAU: [[Species.SOLGALEO, Species.LUNALA], Species.NOIVERN, [Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA], [Species.TAPU_BULU, Species.TAPU_FINI, Species.TAPU_KOKO, Species.TAPU_LELE]], // Alola Raichu lead
|
||||
LEON: [Species.DRAGAPULT, [Species.ZACIAN, Species.ZAMAZENTA], Species.AEGISLASH], // Rillaboom/Cinderace/Inteleon lead
|
||||
GEETA: [Species.MIRAIDON, [Species.ESPATHRA, Species.VELUZA], [Species.AVALUGG, Species.HISUI_AVALUGG], Species.KINGAMBIT], // Glimmora lead
|
||||
NEMONA: [Species.KORAIDON, Species.PAWMOT, [Species.DUDUNSPARCE, Species.ORTHWORM], [Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL]], // Lycanroc lead
|
||||
KIERAN: [[Species.GRIMMSNARL, Species.INCINEROAR, Species.PORYGON_Z], Species.OGERPON, Species.TERAPAGOS, Species.HYDRAPPLE], // Poliwrath/Politoed lead
|
||||
};
|
||||
|
||||
export const trainerConfigs: TrainerConfigs = {
|
||||
@ -1212,20 +1212,100 @@ export const trainerConfigs: TrainerConfigs = {
|
||||
[TrainerType.LACEY]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["LACEY"],false, Type.FAIRY),
|
||||
[TrainerType.DRAYTON]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["DRAYTON"],true, Type.DRAGON),
|
||||
|
||||
[TrainerType.BLUE]: new TrainerConfig((t = TrainerType.BLUE)).initForChampion(signatureSpecies["BLUE"],true).setBattleBgm("battle_kanto_champion").setHasDouble("blue_red_double").setDoubleTrainerType(TrainerType.RED).setDoubleTitle("champion_double"),
|
||||
[TrainerType.RED]: new TrainerConfig(++t).initForChampion(signatureSpecies["RED"],true).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"],true).setBattleBgm("battle_johto_champion"),
|
||||
[TrainerType.STEVEN]: new TrainerConfig(++t).initForChampion(signatureSpecies["STEVEN"],true).setBattleBgm("battle_hoenn_champion").setHasDouble("steven_wallace_double").setDoubleTrainerType(TrainerType.WALLACE).setDoubleTitle("champion_double"),
|
||||
[TrainerType.WALLACE]: new TrainerConfig(++t).initForChampion(signatureSpecies["WALLACE"],true).setBattleBgm("battle_hoenn_champion").setHasDouble("wallace_steven_double").setDoubleTrainerType(TrainerType.STEVEN).setDoubleTitle("champion_double"),
|
||||
[TrainerType.CYNTHIA]: new TrainerConfig(++t).initForChampion(signatureSpecies["CYNTHIA"],false).setBattleBgm("battle_sinnoh_champion"),
|
||||
[TrainerType.ALDER]: new TrainerConfig(++t).initForChampion(signatureSpecies["ALDER"],true).setHasDouble("alder_iris_double").setDoubleTrainerType(TrainerType.IRIS).setDoubleTitle("champion_double").setBattleBgm("battle_champion_alder"),
|
||||
[TrainerType.IRIS]: new TrainerConfig(++t).initForChampion(signatureSpecies["IRIS"],false).setBattleBgm("battle_champion_iris").setHasDouble("iris_alder_double").setDoubleTrainerType(TrainerType.ALDER).setDoubleTitle("champion_double"),
|
||||
[TrainerType.DIANTHA]: new TrainerConfig(++t).initForChampion(signatureSpecies["DIANTHA"],false),
|
||||
[TrainerType.HAU]: new TrainerConfig(++t).initForChampion(signatureSpecies["HAU"],true),
|
||||
[TrainerType.LEON]: new TrainerConfig(++t).initForChampion(signatureSpecies["LEON"],true),
|
||||
[TrainerType.GEETA]: new TrainerConfig(++t).initForChampion(signatureSpecies["GEETA"],false),
|
||||
[TrainerType.NEMONA]: new TrainerConfig(++t).initForChampion(signatureSpecies["NEMONA"],false),
|
||||
[TrainerType.KIERAN]: new TrainerConfig(++t).initForChampion(signatureSpecies["KIERAN"],true),
|
||||
[TrainerType.BLUE]: new TrainerConfig((t = TrainerType.BLUE)).initForChampion(signatureSpecies["BLUE"],true).setBattleBgm("battle_kanto_champion").setHasDouble("blue_red_double").setDoubleTrainerType(TrainerType.RED).setDoubleTitle("champion_double")
|
||||
.setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.ALAKAZAM], TrainerSlot.TRAINER, true, p => {
|
||||
p.generateAndPopulateMoveset();
|
||||
}))
|
||||
.setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.PIDGEOT], TrainerSlot.TRAINER, true, p => {
|
||||
p.formIndex = 1;
|
||||
p.generateAndPopulateMoveset();
|
||||
})),
|
||||
[TrainerType.RED]: new TrainerConfig(++t).initForChampion(signatureSpecies["RED"],true).setBattleBgm("battle_johto_champion").setHasDouble("red_blue_double").setDoubleTrainerType(TrainerType.BLUE).setDoubleTitle("champion_double")
|
||||
.setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.PIKACHU], TrainerSlot.TRAINER, true, p => {
|
||||
p.formIndex = 8;
|
||||
p.generateAndPopulateMoveset();
|
||||
}))
|
||||
.setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE], TrainerSlot.TRAINER, true, p => {
|
||||
p.formIndex = 1;
|
||||
p.generateAndPopulateMoveset();
|
||||
})),
|
||||
[TrainerType.LANCE_CHAMPION]: new TrainerConfig(++t).setName("Lance").initForChampion(signatureSpecies["LANCE_CHAMPION"],true).setBattleBgm("battle_johto_champion")
|
||||
.setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.AERODACTYL], TrainerSlot.TRAINER, true, p => {
|
||||
p.generateAndPopulateMoveset();
|
||||
}))
|
||||
.setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.LATIAS, Species.LATIOS], TrainerSlot.TRAINER, true, p => {
|
||||
p.formIndex = 1;
|
||||
p.generateAndPopulateMoveset();
|
||||
})),
|
||||
[TrainerType.STEVEN]: new TrainerConfig(++t).initForChampion(signatureSpecies["STEVEN"],true).setBattleBgm("battle_hoenn_champion").setHasDouble("steven_wallace_double").setDoubleTrainerType(TrainerType.WALLACE).setDoubleTitle("champion_double")
|
||||
.setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.SKARMORY], TrainerSlot.TRAINER, true, p => {
|
||||
p.generateAndPopulateMoveset();
|
||||
}))
|
||||
.setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.METAGROSS], TrainerSlot.TRAINER, true, p => {
|
||||
p.formIndex = 1;
|
||||
p.generateAndPopulateMoveset();
|
||||
})),
|
||||
[TrainerType.WALLACE]: new TrainerConfig(++t).initForChampion(signatureSpecies["WALLACE"],true).setBattleBgm("battle_hoenn_champion").setHasDouble("wallace_steven_double").setDoubleTrainerType(TrainerType.STEVEN).setDoubleTitle("champion_double")
|
||||
.setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.PELIPPER], TrainerSlot.TRAINER, true, p => {
|
||||
p.abilityIndex = 1; // Drizzle
|
||||
p.generateAndPopulateMoveset();
|
||||
}))
|
||||
.setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.SWAMPERT], TrainerSlot.TRAINER, true, p => {
|
||||
p.formIndex = 1;
|
||||
p.generateAndPopulateMoveset();
|
||||
})),
|
||||
[TrainerType.CYNTHIA]: new TrainerConfig(++t).initForChampion(signatureSpecies["CYNTHIA"],false).setBattleBgm("battle_sinnoh_champion")
|
||||
.setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.SPIRITOMB], TrainerSlot.TRAINER, true, p => {
|
||||
p.generateAndPopulateMoveset();
|
||||
}))
|
||||
.setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.GARCHOMP], TrainerSlot.TRAINER, true, p => {
|
||||
p.formIndex = 1;
|
||||
p.generateAndPopulateMoveset();
|
||||
})),
|
||||
[TrainerType.ALDER]: new TrainerConfig(++t).initForChampion(signatureSpecies["ALDER"],true).setHasDouble("alder_iris_double").setDoubleTrainerType(TrainerType.IRIS).setDoubleTitle("champion_double").setBattleBgm("battle_champion_alder")
|
||||
.setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.BOUFFALANT, Species.BRAVIARY], TrainerSlot.TRAINER, true, p => {
|
||||
p.generateAndPopulateMoveset();
|
||||
})),
|
||||
[TrainerType.IRIS]: new TrainerConfig(++t).initForChampion(signatureSpecies["IRIS"],false).setBattleBgm("battle_champion_iris").setHasDouble("iris_alder_double").setDoubleTrainerType(TrainerType.ALDER).setDoubleTitle("champion_double")
|
||||
.setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.DRUDDIGON], TrainerSlot.TRAINER, true, p => {
|
||||
p.generateAndPopulateMoveset();
|
||||
}))
|
||||
.setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.LAPRAS], TrainerSlot.TRAINER, true, p => {
|
||||
p.formIndex = 1;
|
||||
p.generateAndPopulateMoveset();
|
||||
})),
|
||||
[TrainerType.DIANTHA]: new TrainerConfig(++t).initForChampion(signatureSpecies["DIANTHA"],false)
|
||||
.setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.GOURGEIST], TrainerSlot.TRAINER, true, p => {
|
||||
p.generateAndPopulateMoveset();
|
||||
}))
|
||||
.setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.GARDEVOIR], TrainerSlot.TRAINER, true, p => {
|
||||
p.formIndex = 1;
|
||||
p.generateAndPopulateMoveset();
|
||||
})),
|
||||
[TrainerType.HAU]: new TrainerConfig(++t).initForChampion(signatureSpecies["HAU"],true)
|
||||
.setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.ALOLA_RAICHU], TrainerSlot.TRAINER, true, p => {
|
||||
p.generateAndPopulateMoveset();
|
||||
})),
|
||||
[TrainerType.LEON]: new TrainerConfig(++t).initForChampion(signatureSpecies["LEON"],true)
|
||||
.setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.RILLABOOM, Species.CINDERACE, Species.INTELEON], TrainerSlot.TRAINER, true, p => {
|
||||
p.generateAndPopulateMoveset();
|
||||
}))
|
||||
.setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.CHARIZARD], TrainerSlot.TRAINER, true, p => {
|
||||
p.formIndex = 3;
|
||||
p.generateAndPopulateMoveset();
|
||||
})),
|
||||
[TrainerType.GEETA]: new TrainerConfig(++t).initForChampion(signatureSpecies["GEETA"],false)
|
||||
.setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.GLIMMORA], TrainerSlot.TRAINER, true, p => {
|
||||
p.generateAndPopulateMoveset();
|
||||
})),
|
||||
[TrainerType.NEMONA]: new TrainerConfig(++t).initForChampion(signatureSpecies["NEMONA"],false)
|
||||
.setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.LYCANROC], TrainerSlot.TRAINER, true, p => {
|
||||
p.generateAndPopulateMoveset();
|
||||
})),
|
||||
[TrainerType.KIERAN]: new TrainerConfig(++t).initForChampion(signatureSpecies["KIERAN"],true)
|
||||
.setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.POLIWRATH, Species.POLITOED], TrainerSlot.TRAINER, true, p => {
|
||||
p.generateAndPopulateMoveset();
|
||||
})),
|
||||
|
||||
|
||||
[TrainerType.RIVAL]: new TrainerConfig((t = TrainerType.RIVAL)).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setStaticParty().setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival").setPartyTemplates(trainerPartyTemplates.RIVAL)
|
||||
|
@ -44,7 +44,7 @@ import { SpeciesFormChange, SpeciesFormChangeActiveTrigger, SpeciesFormChangeMov
|
||||
import { TerrainType } from "../data/terrain";
|
||||
import { TrainerSlot } from "../data/trainer-config";
|
||||
import * as Overrides from "../overrides";
|
||||
import { BerryType } from "../data/berry";
|
||||
import { BerryType } from "../data/enums/berry-type";
|
||||
import i18next from "../plugins/i18n";
|
||||
import { speciesEggMoves } from "../data/egg-moves";
|
||||
import { ModifierTier } from "../modifier/modifier-tier";
|
||||
|
@ -213,7 +213,7 @@ export class LoadingScene extends SceneBase {
|
||||
this.loadAtlas("types", "");
|
||||
|
||||
// Get current lang and load the types atlas for it. English will only load types while all other languages will load types and types_<lang>
|
||||
const lang = i18next.language;
|
||||
const lang = i18next.resolvedLanguage;
|
||||
if (lang !== "en") {
|
||||
if (Utils.verifyLang(lang)) {
|
||||
this.loadAtlas(`types_${lang}`, "");
|
||||
|
@ -230,10 +230,8 @@ export const modifierType: ModifierTypeTranslationEntries = {
|
||||
"ENEMY_HEAL": { name: "Wiederherstellungsmarke", description: "Heilt 2% der maximalen KP pro Runde" },
|
||||
"ENEMY_ATTACK_POISON_CHANCE": { name: "Giftmarke" },
|
||||
"ENEMY_ATTACK_PARALYZE_CHANCE": { "name": "Lähmungsmarke" },
|
||||
"ENEMY_ATTACK_SLEEP_CHANCE": { "name": "Schlafmarke" },
|
||||
"ENEMY_ATTACK_FREEZE_CHANCE": { "name": "Gefriermarke" },
|
||||
"ENEMY_ATTACK_BURN_CHANCE": { "name": "Brandmarke" },
|
||||
"ENEMY_STATUS_EFFECT_HEAL_CHANCE": { "name": "Vollheilungsmarke", "description": "Fügt eine 10%ige Chance hinzu, jede Runde einen Statuszustand zu heilen" },
|
||||
"ENEMY_STATUS_EFFECT_HEAL_CHANCE": { "name": "Vollheilungsmarke", "description": "Fügt eine 2,5%ige Chance hinzu, jede Runde einen Statuszustand zu heilen" },
|
||||
"ENEMY_ENDURE_CHANCE": { "name": "Ausdauer-Marke" },
|
||||
"ENEMY_FUSED_CHANCE": { "name": "Fusionsmarke", "description": "Fügt eine 1%ige Chance hinzu, dass ein wildes Pokémon eine Fusion ist" },
|
||||
|
||||
|
@ -1578,7 +1578,7 @@ export const PGMdialogue: DialogueTranslationEntries = {
|
||||
"encounter": {
|
||||
1: `Know what? I really look forward to having serious battles with strong Trainers!
|
||||
$I mean, come on! The Trainers who make it here are Trainers who desire victory with every fiber of their being!
|
||||
#And they are battling alongside Pokémon that have been through countless difficult battles!
|
||||
$And they are battling alongside Pokémon that have been through countless difficult battles!
|
||||
$If I battle with people like that, not only will I get stronger, my Pokémon will, too!
|
||||
$And we'll get to know each other even better! OK! Brace yourself!
|
||||
$I'm Iris, the Pokémon League Champion, and I'm going to defeat you!`,
|
||||
|
@ -230,10 +230,8 @@ export const modifierType: ModifierTypeTranslationEntries = {
|
||||
"ENEMY_HEAL": { name: "Recovery Token", description: "Heals 2% of max HP every turn" },
|
||||
"ENEMY_ATTACK_POISON_CHANCE": { name: "Poison Token" },
|
||||
"ENEMY_ATTACK_PARALYZE_CHANCE": { name: "Paralyze Token" },
|
||||
"ENEMY_ATTACK_SLEEP_CHANCE": { name: "Sleep Token" },
|
||||
"ENEMY_ATTACK_FREEZE_CHANCE": { name: "Freeze Token" },
|
||||
"ENEMY_ATTACK_BURN_CHANCE": { name: "Burn Token" },
|
||||
"ENEMY_STATUS_EFFECT_HEAL_CHANCE": { name: "Full Heal Token", description: "Adds a 10% chance every turn to heal a status condition" },
|
||||
"ENEMY_STATUS_EFFECT_HEAL_CHANCE": { name: "Full Heal Token", description: "Adds a 2.5% chance every turn to heal a status condition" },
|
||||
"ENEMY_ENDURE_CHANCE": { name: "Endure Token" },
|
||||
"ENEMY_FUSED_CHANCE": { name: "Fusion Token", description: "Adds a 1% chance that a wild Pokémon will be a fusion" },
|
||||
},
|
||||
|
@ -230,10 +230,8 @@ export const modifierType: ModifierTypeTranslationEntries = {
|
||||
"ENEMY_HEAL": { name: "Recovery Token", description: "Cura el 2% de los PS máximo en cada turno" },
|
||||
"ENEMY_ATTACK_POISON_CHANCE": { name: "Poison Token" },
|
||||
"ENEMY_ATTACK_PARALYZE_CHANCE": { name: "Paralyze Token" },
|
||||
"ENEMY_ATTACK_SLEEP_CHANCE": { name: "Sleep Token" },
|
||||
"ENEMY_ATTACK_FREEZE_CHANCE": { name: "Freeze Token" },
|
||||
"ENEMY_ATTACK_BURN_CHANCE": { name: "Burn Token" },
|
||||
"ENEMY_STATUS_EFFECT_HEAL_CHANCE": { name: "Full Heal Token", description: "Agrega un 10% de probabilidad cada turno de curar un problema de estado" },
|
||||
"ENEMY_STATUS_EFFECT_HEAL_CHANCE": { name: "Full Heal Token", description: "Agrega un 2.5% de probabilidad cada turno de curar un problema de estado" },
|
||||
"ENEMY_ENDURE_CHANCE": { name: "Endure Token" },
|
||||
"ENEMY_FUSED_CHANCE": { name: "Fusion Token", description: "Agrega un 1% de probabilidad de que un Pokémon salvaje sea una fusión" },
|
||||
},
|
||||
|
@ -230,10 +230,8 @@ export const modifierType: ModifierTypeTranslationEntries = {
|
||||
"ENEMY_HEAL": { name: "Jeton Soin", description: "Soigne 2% des PV max à chaque tour" },
|
||||
"ENEMY_ATTACK_POISON_CHANCE": { name: "Jeton Poison" },
|
||||
"ENEMY_ATTACK_PARALYZE_CHANCE": { name: "Jeton Paralysie" },
|
||||
"ENEMY_ATTACK_SLEEP_CHANCE": { name: "Jeton Sommeil" },
|
||||
"ENEMY_ATTACK_FREEZE_CHANCE": { name: "Jeton Gel" },
|
||||
"ENEMY_ATTACK_BURN_CHANCE": { name: "Jeton Brulure" },
|
||||
"ENEMY_STATUS_EFFECT_HEAL_CHANCE": { name: "Jeton Total Soin", description: "Ajoute 10% de chances à chaque tour de se soigner d’un problème de statut." },
|
||||
"ENEMY_STATUS_EFFECT_HEAL_CHANCE": { name: "Jeton Total Soin", description: "Ajoute 2.5% de chances à chaque tour de se soigner d’un problème de statut." },
|
||||
"ENEMY_ENDURE_CHANCE": { name: "Jeton Ténacité" },
|
||||
"ENEMY_FUSED_CHANCE": { name: "Jeton Fusion", description: "Ajoute 1% de chances qu’un Pokémon sauvage soit une fusion." },
|
||||
},
|
||||
|
@ -230,10 +230,8 @@ export const modifierType: ModifierTypeTranslationEntries = {
|
||||
"ENEMY_HEAL": { name: "Gettone del Recupero", description: "Cura il 2% dei PS massimi ogni turno" },
|
||||
"ENEMY_ATTACK_POISON_CHANCE": { name: "Gettone del Veleno" },
|
||||
"ENEMY_ATTACK_PARALYZE_CHANCE": { name: "Gettone della Paralisi" },
|
||||
"ENEMY_ATTACK_SLEEP_CHANCE": { name: "Gettone del Sonno" },
|
||||
"ENEMY_ATTACK_FREEZE_CHANCE": { name: "Gettone del Congelamento" },
|
||||
"ENEMY_ATTACK_BURN_CHANCE": { name: "Gettone della Bruciatura" },
|
||||
"ENEMY_STATUS_EFFECT_HEAL_CHANCE": { name: "Gettone Guarigione Completa", description: "Aggiunge una probabilità del 10% a ogni turno di curare una condizione di stato" },
|
||||
"ENEMY_STATUS_EFFECT_HEAL_CHANCE": { name: "Gettone Guarigione Completa", description: "Aggiunge una probabilità del 2.5% a ogni turno di curare una condizione di stato" },
|
||||
"ENEMY_ENDURE_CHANCE": { name: "Gettone di Resistenza" },
|
||||
"ENEMY_FUSED_CHANCE": { name: "Gettone della fusione", description: "Aggiunge l'1% di possibilità che un Pokémon selvatico sia una fusione" },
|
||||
},
|
||||
|
@ -230,10 +230,8 @@ export const modifierType: ModifierTypeTranslationEntries = {
|
||||
"ENEMY_HEAL": { name: "회복 토큰", description: "매 턴 최대 체력의 2%를 회복" },
|
||||
"ENEMY_ATTACK_POISON_CHANCE": { name: "독 토큰" },
|
||||
"ENEMY_ATTACK_PARALYZE_CHANCE": { name: "마비 토큰" },
|
||||
"ENEMY_ATTACK_SLEEP_CHANCE": { name: "잠듦 토큰" },
|
||||
"ENEMY_ATTACK_FREEZE_CHANCE": { name: "얼음 토큰" },
|
||||
"ENEMY_ATTACK_BURN_CHANCE": { name: "화상 토큰" },
|
||||
"ENEMY_STATUS_EFFECT_HEAL_CHANCE": { name: "만병통치 토큰", description: "매 턴 상태이상에서 회복될 확률 10% 추가" },
|
||||
"ENEMY_STATUS_EFFECT_HEAL_CHANCE": { name: "만병통치 토큰", description: "매 턴 상태이상에서 회복될 확률 2.5% 추가" },
|
||||
"ENEMY_ENDURE_CHANCE": { name: "버티기 토큰" },
|
||||
"ENEMY_FUSED_CHANCE": { name: "합체 토큰", description: "야생 포켓몬이 합체할 확률 1% 추가" },
|
||||
},
|
||||
|
@ -230,10 +230,8 @@ export const modifierType: ModifierTypeTranslationEntries = {
|
||||
"ENEMY_HEAL": { name: "Token de Recuperação", description: "Cura 2% dos PS máximos a cada turno" },
|
||||
"ENEMY_ATTACK_POISON_CHANCE": { name: "Token de Veneno" },
|
||||
"ENEMY_ATTACK_PARALYZE_CHANCE": { name: "Token de Paralisia" },
|
||||
"ENEMY_ATTACK_SLEEP_CHANCE": { name: "Token de Sono" },
|
||||
"ENEMY_ATTACK_FREEZE_CHANCE": { name: "Token de Congelamento" },
|
||||
"ENEMY_ATTACK_BURN_CHANCE": { name: "Token de Queimadura" },
|
||||
"ENEMY_STATUS_EFFECT_HEAL_CHANCE": { name: "Token de Cura Total", description: "Adiciona uma chance de 10% a cada turno de curar uma condição de status" },
|
||||
"ENEMY_STATUS_EFFECT_HEAL_CHANCE": { name: "Token de Cura Total", description: "Adiciona uma chance de 2.5% a cada turno de curar uma condição de status" },
|
||||
"ENEMY_ENDURE_CHANCE": { name: "Token de Persistência" },
|
||||
"ENEMY_FUSED_CHANCE": { name: "Token de Fusão", description: "Adiciona uma chance de 1% de que um Pokémon selvagem seja uma fusão" },
|
||||
},
|
||||
|
@ -230,10 +230,8 @@ export const modifierType: ModifierTypeTranslationEntries = {
|
||||
"ENEMY_HEAL": { name: "回复硬币", description: "每回合回复2%最大HP" },
|
||||
"ENEMY_ATTACK_POISON_CHANCE": { name: "剧毒硬币" },
|
||||
"ENEMY_ATTACK_PARALYZE_CHANCE": { name: "麻痹硬币" },
|
||||
"ENEMY_ATTACK_SLEEP_CHANCE": { name: "睡眠硬币" },
|
||||
"ENEMY_ATTACK_FREEZE_CHANCE": { name: "冰冻硬币" },
|
||||
"ENEMY_ATTACK_BURN_CHANCE": { name: "灼烧硬币" },
|
||||
"ENEMY_STATUS_EFFECT_HEAL_CHANCE": { name: "万灵药硬币", description: "增加10%每回合治愈异常状态的概率" },
|
||||
"ENEMY_STATUS_EFFECT_HEAL_CHANCE": { name: "万灵药硬币", description: "增加2.5%每回合治愈异常状态的概率" },
|
||||
"ENEMY_ENDURE_CHANCE": { name: "忍受硬币" },
|
||||
"ENEMY_FUSED_CHANCE": { name: "融合硬币", description: "增加1%野生融合宝可梦出现概率" },
|
||||
},
|
||||
|
@ -282,12 +282,10 @@ export const modifierType: ModifierTypeTranslationEntries = {
|
||||
ENEMY_HEAL: { name: "恢復硬幣", description: "每回合恢復2%最大HP" },
|
||||
ENEMY_ATTACK_POISON_CHANCE: { name: "劇毒硬幣" },
|
||||
ENEMY_ATTACK_PARALYZE_CHANCE: { name: "麻痹硬幣" },
|
||||
ENEMY_ATTACK_SLEEP_CHANCE: { name: "睡眠硬幣" },
|
||||
ENEMY_ATTACK_FREEZE_CHANCE: { name: "冰凍硬幣" },
|
||||
ENEMY_ATTACK_BURN_CHANCE: { name: "灼燒硬幣" },
|
||||
ENEMY_STATUS_EFFECT_HEAL_CHANCE: {
|
||||
name: "萬靈藥硬幣",
|
||||
description: "增加10%每回合治癒異常狀態的概率",
|
||||
description: "增加2.5%每回合治癒異常狀態的概率",
|
||||
},
|
||||
ENEMY_ENDURE_CHANCE: { name: "忍受硬幣" },
|
||||
ENEMY_FUSED_CHANCE: {
|
||||
|
@ -11,7 +11,8 @@ import { Type } from "../data/type";
|
||||
import PartyUiHandler, { PokemonMoveSelectFilter, PokemonSelectFilter } from "../ui/party-ui-handler";
|
||||
import * as Utils from "../utils";
|
||||
import { TempBattleStat, getTempBattleStatBoosterItemName, getTempBattleStatName } from "../data/temp-battle-stat";
|
||||
import { BerryType, getBerryEffectDescription, getBerryName } from "../data/berry";
|
||||
import { getBerryEffectDescription, getBerryName } from "../data/berry";
|
||||
import { BerryType } from "../data/enums/berry-type";
|
||||
import { Unlockables } from "../system/unlockables";
|
||||
import { StatusEffect, getStatusEffectDescriptor } from "../data/status-effect";
|
||||
import { SpeciesFormKey } from "../data/pokemon-species";
|
||||
@ -977,8 +978,8 @@ export class EnemyAttackStatusEffectChanceModifierType extends ModifierType {
|
||||
private chancePercent: integer;
|
||||
private effect: StatusEffect;
|
||||
|
||||
constructor(localeKey: string, iconImage: string, chancePercent: integer, effect: StatusEffect) {
|
||||
super(localeKey, iconImage, (type, args) => new Modifiers.EnemyAttackStatusEffectChanceModifier(type, effect, chancePercent), "enemy_status_chance");
|
||||
constructor(localeKey: string, iconImage: string, chancePercent: integer, effect: StatusEffect, stackCount?: integer) {
|
||||
super(localeKey, iconImage, (type, args) => new Modifiers.EnemyAttackStatusEffectChanceModifier(type, effect, chancePercent, stackCount), "enemy_status_chance");
|
||||
|
||||
this.chancePercent = chancePercent;
|
||||
this.effect = effect;
|
||||
@ -1215,14 +1216,12 @@ export const modifierTypes = {
|
||||
ENEMY_DAMAGE_BOOSTER: () => new ModifierType("modifierType:ModifierType.ENEMY_DAMAGE_BOOSTER", "wl_item_drop", (type, _args) => new Modifiers.EnemyDamageBoosterModifier(type, 5)),
|
||||
ENEMY_DAMAGE_REDUCTION: () => new ModifierType("modifierType:ModifierType.ENEMY_DAMAGE_REDUCTION", "wl_guard_spec", (type, _args) => new Modifiers.EnemyDamageReducerModifier(type, 2.5)),
|
||||
//ENEMY_SUPER_EFFECT_BOOSTER: () => new ModifierType('Type Advantage Token', 'Increases damage of super effective attacks by 30%', (type, _args) => new Modifiers.EnemySuperEffectiveDamageBoosterModifier(type, 30), 'wl_custom_super_effective'),
|
||||
ENEMY_HEAL: () => new ModifierType("modifierType:ModifierType.ENEMY_HEAL", "wl_potion", (type, _args) => new Modifiers.EnemyTurnHealModifier(type, 2)),
|
||||
ENEMY_ATTACK_POISON_CHANCE: () => new EnemyAttackStatusEffectChanceModifierType("modifierType:ModifierType.ENEMY_ATTACK_POISON_CHANCE", "wl_antidote", 10, StatusEffect.POISON),
|
||||
ENEMY_ATTACK_PARALYZE_CHANCE: () => new EnemyAttackStatusEffectChanceModifierType("modifierType:ModifierType.ENEMY_ATTACK_PARALYZE_CHANCE", "wl_paralyze_heal", 10, StatusEffect.PARALYSIS),
|
||||
ENEMY_ATTACK_SLEEP_CHANCE: () => new EnemyAttackStatusEffectChanceModifierType("modifierType:ModifierType.ENEMY_ATTACK_SLEEP_CHANCE", "wl_awakening", 10, StatusEffect.SLEEP),
|
||||
ENEMY_ATTACK_FREEZE_CHANCE: () => new EnemyAttackStatusEffectChanceModifierType("modifierType:ModifierType.ENEMY_ATTACK_FREEZE_CHANCE", "wl_ice_heal", 10, StatusEffect.FREEZE),
|
||||
ENEMY_ATTACK_BURN_CHANCE: () => new EnemyAttackStatusEffectChanceModifierType("modifierType:ModifierType.ENEMY_ATTACK_BURN_CHANCE", "wl_burn_heal", 10, StatusEffect.BURN),
|
||||
ENEMY_STATUS_EFFECT_HEAL_CHANCE: () => new ModifierType("modifierType:ModifierType.ENEMY_STATUS_EFFECT_HEAL_CHANCE", "wl_full_heal", (type, _args) => new Modifiers.EnemyStatusEffectHealChanceModifier(type, 10)),
|
||||
ENEMY_ENDURE_CHANCE: () => new EnemyEndureChanceModifierType("modifierType:ModifierType.ENEMY_ENDURE_CHANCE", "wl_reset_urge", 2.5),
|
||||
ENEMY_HEAL: () => new ModifierType("modifierType:ModifierType.ENEMY_HEAL", "wl_potion", (type, _args) => new Modifiers.EnemyTurnHealModifier(type, 2, 10)),
|
||||
ENEMY_ATTACK_POISON_CHANCE: () => new EnemyAttackStatusEffectChanceModifierType("modifierType:ModifierType.ENEMY_ATTACK_POISON_CHANCE", "wl_antidote", 5, StatusEffect.POISON, 10),
|
||||
ENEMY_ATTACK_PARALYZE_CHANCE: () => new EnemyAttackStatusEffectChanceModifierType("modifierType:ModifierType.ENEMY_ATTACK_PARALYZE_CHANCE", "wl_paralyze_heal", 2.5, StatusEffect.PARALYSIS, 10),
|
||||
ENEMY_ATTACK_BURN_CHANCE: () => new EnemyAttackStatusEffectChanceModifierType("modifierType:ModifierType.ENEMY_ATTACK_BURN_CHANCE", "wl_burn_heal", 5, StatusEffect.BURN, 10),
|
||||
ENEMY_STATUS_EFFECT_HEAL_CHANCE: () => new ModifierType("modifierType:ModifierType.ENEMY_STATUS_EFFECT_HEAL_CHANCE", "wl_full_heal", (type, _args) => new Modifiers.EnemyStatusEffectHealChanceModifier(type, 2.5, 10)),
|
||||
ENEMY_ENDURE_CHANCE: () => new EnemyEndureChanceModifierType("modifierType:ModifierType.ENEMY_ENDURE_CHANCE", "wl_reset_urge", 2),
|
||||
ENEMY_FUSED_CHANCE: () => new ModifierType("modifierType:ModifierType.ENEMY_FUSED_CHANCE", "wl_custom_spliced", (type, _args) => new Modifiers.EnemyFusionChanceModifier(type, 1)),
|
||||
};
|
||||
|
||||
@ -1465,15 +1464,13 @@ const trainerModifierPool: ModifierPool = {
|
||||
|
||||
const enemyBuffModifierPool: ModifierPool = {
|
||||
[ModifierTier.COMMON]: [
|
||||
new WeightedModifierType(modifierTypes.ENEMY_DAMAGE_BOOSTER, 10),
|
||||
new WeightedModifierType(modifierTypes.ENEMY_DAMAGE_REDUCTION, 10),
|
||||
new WeightedModifierType(modifierTypes.ENEMY_ATTACK_POISON_CHANCE, 2),
|
||||
new WeightedModifierType(modifierTypes.ENEMY_ATTACK_PARALYZE_CHANCE, 2),
|
||||
new WeightedModifierType(modifierTypes.ENEMY_ATTACK_SLEEP_CHANCE, 2),
|
||||
new WeightedModifierType(modifierTypes.ENEMY_ATTACK_FREEZE_CHANCE, 2),
|
||||
new WeightedModifierType(modifierTypes.ENEMY_ATTACK_BURN_CHANCE, 2),
|
||||
new WeightedModifierType(modifierTypes.ENEMY_STATUS_EFFECT_HEAL_CHANCE, 10),
|
||||
new WeightedModifierType(modifierTypes.ENEMY_ENDURE_CHANCE, 5),
|
||||
new WeightedModifierType(modifierTypes.ENEMY_DAMAGE_BOOSTER, 9),
|
||||
new WeightedModifierType(modifierTypes.ENEMY_DAMAGE_REDUCTION, 9),
|
||||
new WeightedModifierType(modifierTypes.ENEMY_ATTACK_POISON_CHANCE, 3),
|
||||
new WeightedModifierType(modifierTypes.ENEMY_ATTACK_PARALYZE_CHANCE, 3),
|
||||
new WeightedModifierType(modifierTypes.ENEMY_ATTACK_BURN_CHANCE, 3),
|
||||
new WeightedModifierType(modifierTypes.ENEMY_STATUS_EFFECT_HEAL_CHANCE, 9),
|
||||
new WeightedModifierType(modifierTypes.ENEMY_ENDURE_CHANCE, 4),
|
||||
new WeightedModifierType(modifierTypes.ENEMY_FUSED_CHANCE, 1)
|
||||
].map(m => {
|
||||
m.setTier(ModifierTier.COMMON); return m;
|
||||
|
@ -12,7 +12,8 @@ import { FusionSpeciesFormEvolution, pokemonEvolutions, pokemonPrevolutions } fr
|
||||
import { getPokemonMessage } from "../messages";
|
||||
import * as Utils from "../utils";
|
||||
import { TempBattleStat } from "../data/temp-battle-stat";
|
||||
import { BerryType, getBerryEffectFunc, getBerryPredicate } from "../data/berry";
|
||||
import { getBerryEffectFunc, getBerryPredicate } from "../data/berry";
|
||||
import { BerryType } from "../data/enums/berry-type";
|
||||
import { StatusEffect, getStatusEffectHealText } from "../data/status-effect";
|
||||
import { achvs } from "../system/achv";
|
||||
import { VoucherType } from "../system/voucher";
|
||||
@ -775,6 +776,9 @@ export class BypassSpeedChanceModifier extends PokemonHeldItemModifier {
|
||||
|
||||
if (!bypassSpeed.value && pokemon.randSeedInt(10) < this.getStackCount()) {
|
||||
bypassSpeed.value = true;
|
||||
if (this.type instanceof ModifierTypes.PokemonHeldItemModifierType && this.type.id === "QUICK_CLAW") {
|
||||
pokemon.scene.queueMessage(getPokemonMessage(pokemon, " used its quick claw to move faster!"));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -2140,7 +2144,7 @@ export class EnemyDamageReducerModifier extends EnemyDamageMultiplierModifier {
|
||||
}
|
||||
|
||||
export class EnemyTurnHealModifier extends EnemyPersistentModifier {
|
||||
private healPercent: number;
|
||||
public healPercent: number;
|
||||
|
||||
constructor(type: ModifierType, healPercent: number, stackCount?: integer) {
|
||||
super(type, stackCount);
|
||||
@ -2175,23 +2179,23 @@ export class EnemyTurnHealModifier extends EnemyPersistentModifier {
|
||||
}
|
||||
|
||||
getMaxStackCount(scene: BattleScene): integer {
|
||||
return 15;
|
||||
return 10;
|
||||
}
|
||||
}
|
||||
|
||||
export class EnemyAttackStatusEffectChanceModifier extends EnemyPersistentModifier {
|
||||
public effect: StatusEffect;
|
||||
private chance: number;
|
||||
public chance: number;
|
||||
|
||||
constructor(type: ModifierType, effect: StatusEffect, chancePercent: number, stackCount?: integer) {
|
||||
super(type, stackCount);
|
||||
|
||||
this.effect = effect;
|
||||
this.chance = (chancePercent || 10) / 100;
|
||||
this.chance = (chancePercent || 5) / 100;
|
||||
}
|
||||
|
||||
match(modifier: Modifier): boolean {
|
||||
return modifier instanceof EnemyAttackStatusEffectChanceModifier && modifier.effect === this.effect && modifier.chance === this.chance;
|
||||
return modifier instanceof EnemyAttackStatusEffectChanceModifier && modifier.effect === this.effect;
|
||||
}
|
||||
|
||||
clone(): EnemyAttackStatusEffectChanceModifier {
|
||||
@ -2210,19 +2214,23 @@ export class EnemyAttackStatusEffectChanceModifier extends EnemyPersistentModifi
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
getMaxStackCount(scene: BattleScene): integer {
|
||||
return 10;
|
||||
}
|
||||
}
|
||||
|
||||
export class EnemyStatusEffectHealChanceModifier extends EnemyPersistentModifier {
|
||||
private chance: number;
|
||||
public chance: number;
|
||||
|
||||
constructor(type: ModifierType, chancePercent: number, stackCount?: integer) {
|
||||
super(type, stackCount);
|
||||
|
||||
this.chance = (chancePercent || 10) / 100;
|
||||
this.chance = (chancePercent || 2.5) / 100;
|
||||
}
|
||||
|
||||
match(modifier: Modifier): boolean {
|
||||
return modifier instanceof EnemyStatusEffectHealChanceModifier && modifier.chance === this.chance;
|
||||
return modifier instanceof EnemyStatusEffectHealChanceModifier;
|
||||
}
|
||||
|
||||
clone(): EnemyStatusEffectHealChanceModifier {
|
||||
@ -2244,19 +2252,23 @@ export class EnemyStatusEffectHealChanceModifier extends EnemyPersistentModifier
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
getMaxStackCount(scene: BattleScene): integer {
|
||||
return 10;
|
||||
}
|
||||
}
|
||||
|
||||
export class EnemyEndureChanceModifier extends EnemyPersistentModifier {
|
||||
private chance: number;
|
||||
public chance: number;
|
||||
|
||||
constructor(type: ModifierType, chancePercent: number, stackCount?: integer) {
|
||||
super(type, stackCount);
|
||||
constructor(type: ModifierType, chancePercent?: number, stackCount?: integer) {
|
||||
super(type, stackCount || 10);
|
||||
|
||||
this.chance = (chancePercent || 2.5) / 100;
|
||||
this.chance = (chancePercent || 2) / 100;
|
||||
}
|
||||
|
||||
match(modifier: Modifier) {
|
||||
return modifier instanceof EnemyEndureChanceModifier && modifier.chance === this.chance;
|
||||
return modifier instanceof EnemyEndureChanceModifier;
|
||||
}
|
||||
|
||||
clone() {
|
||||
|
@ -61,7 +61,7 @@ import { Abilities } from "./data/enums/abilities";
|
||||
import * as Overrides from "./overrides";
|
||||
import { TextStyle, addTextObject } from "./ui/text";
|
||||
import { Type } from "./data/type";
|
||||
import { MoveUsedEvent, TurnEndEvent, TurnInitEvent } from "./battle-scene-events";
|
||||
import { BerryUsedEvent, MoveUsedEvent, TurnEndEvent, TurnInitEvent } from "./battle-scene-events";
|
||||
|
||||
|
||||
export class LoginPhase extends Phase {
|
||||
@ -2244,6 +2244,7 @@ export class BerryPhase extends FieldPhase {
|
||||
berryModifier.consumed = false;
|
||||
}
|
||||
}
|
||||
this.scene.eventTarget.dispatchEvent(new BerryUsedEvent(berryModifier)); // Announce a berry was used
|
||||
}
|
||||
|
||||
this.scene.updateModifiers(pokemon.isPlayer());
|
||||
|
@ -34,6 +34,8 @@ import {setSettingGamepad, SettingGamepad, settingGamepadDefaults} from "./setti
|
||||
import {setSettingKeyboard, SettingKeyboard} from "#app/system/settings/settings-keyboard";
|
||||
import { TerrainChangedEvent, WeatherChangedEvent } from "#app/field/arena-events.js";
|
||||
import { Device } from "#app/enums/devices.js";
|
||||
import { EnemyAttackStatusEffectChanceModifier } from "../modifier/modifier";
|
||||
import { StatusEffect } from "#app/data/status-effect.js";
|
||||
|
||||
const saveKey = "x0i2O7WRiANTqPmZ"; // Temporary; secure encryption is not yet necessary
|
||||
|
||||
@ -1078,6 +1080,9 @@ export class GameData {
|
||||
if (md?.className === "ExpBalanceModifier") { // Temporarily limit EXP Balance until it gets reworked
|
||||
md.stackCount = Math.min(md.stackCount, 4);
|
||||
}
|
||||
if (md instanceof EnemyAttackStatusEffectChanceModifier && md.effect === StatusEffect.FREEZE || md.effect === StatusEffect.SLEEP) {
|
||||
continue;
|
||||
}
|
||||
ret.push(new PersistentModifierData(md, player));
|
||||
}
|
||||
return ret;
|
||||
|
@ -81,11 +81,11 @@ export default class ArenaFlyout extends Phaser.GameObjects.Container {
|
||||
private readonly fieldEffectInfo: ArenaEffectInfo[] = [];
|
||||
|
||||
// Stores callbacks in a variable so they can be unsubscribed from when destroyed
|
||||
private onNewArenaEvent = (event: Event) => this.onNewArena(event);
|
||||
private onTurnInitEvent = (event: Event) => this.onTurnInit(event);
|
||||
private onTurnEndEvent = (event: Event) => this.onTurnEnd(event);
|
||||
private readonly onNewArenaEvent = (event: Event) => this.onNewArena(event);
|
||||
private readonly onTurnInitEvent = (event: Event) => this.onTurnInit(event);
|
||||
private readonly onTurnEndEvent = (event: Event) => this.onTurnEnd(event);
|
||||
|
||||
private onFieldEffectChangedEvent = (event: Event) => this.onFieldEffectChanged(event);
|
||||
private readonly onFieldEffectChangedEvent = (event: Event) => this.onFieldEffectChanged(event);
|
||||
|
||||
constructor(scene: Phaser.Scene) {
|
||||
super(scene, 0, 0);
|
||||
@ -379,6 +379,6 @@ export default class ArenaFlyout extends Phaser.GameObjects.Container {
|
||||
this.battleScene.arena.eventTarget.removeEventListener(ArenaEventType.TAG_ADDED, this.onFieldEffectChangedEvent);
|
||||
this.battleScene.arena.eventTarget.removeEventListener(ArenaEventType.TAG_REMOVED, this.onFieldEffectChangedEvent);
|
||||
|
||||
super.destroy();
|
||||
super.destroy(fromScene);
|
||||
}
|
||||
}
|
||||
|
@ -4,7 +4,9 @@ import * as Utils from "../utils";
|
||||
import BattleScene from "#app/battle-scene.js";
|
||||
import { UiTheme } from "#app/enums/ui-theme.js";
|
||||
import Move from "#app/data/move.js";
|
||||
import { BattleSceneEventType, MoveUsedEvent } from "#app/battle-scene-events.js";
|
||||
import { BattleSceneEventType, BerryUsedEvent, MoveUsedEvent } from "#app/battle-scene-events.js";
|
||||
import { BerryType } from "#app/data/enums/berry-type.js";
|
||||
import { Moves } from "#app/data/enums/moves.js";
|
||||
|
||||
/** Container for info about a {@linkcode Move} */
|
||||
interface MoveInfo {
|
||||
@ -53,7 +55,9 @@ export default class BattleFlyout extends Phaser.GameObjects.Container {
|
||||
/** The array of {@linkcode MoveInfo} used to track moves for the {@linkcode Pokemon} linked to the flyout */
|
||||
private moveInfo: MoveInfo[] = new Array();
|
||||
|
||||
private readonly onMoveUsed = (event) => this.updateInfo(event);
|
||||
// Stores callbacks in a variable so they can be unsubscribed from when destroyed
|
||||
private readonly onMoveUsedEvent = (event: Event) => this.onMoveUsed(event);
|
||||
private readonly onBerryUsedEvent = (event: Event) => this.onBerryUsed(event);
|
||||
|
||||
constructor(scene: Phaser.Scene, player: boolean) {
|
||||
super(scene, 0, 0);
|
||||
@ -109,11 +113,12 @@ export default class BattleFlyout extends Phaser.GameObjects.Container {
|
||||
this.name = `Flyout ${this.pokemon.name}`;
|
||||
this.flyoutParent.name = `Flyout Parent ${this.pokemon.name}`;
|
||||
|
||||
this.battleScene.eventTarget.addEventListener(BattleSceneEventType.MOVE_USED, this.onMoveUsed);
|
||||
this.battleScene.eventTarget.addEventListener(BattleSceneEventType.MOVE_USED, this.onMoveUsedEvent);
|
||||
this.battleScene.eventTarget.addEventListener(BattleSceneEventType.BERRY_USED, this.onBerryUsedEvent);
|
||||
}
|
||||
|
||||
/** Sets and formats the text property for all {@linkcode Phaser.GameObjects.Text} in the flyoutText array */
|
||||
setText() {
|
||||
private setText() {
|
||||
for (let i = 0; i < this.flyoutText.length; i++) {
|
||||
const flyoutText = this.flyoutText[i];
|
||||
const moveInfo = this.moveInfo[i];
|
||||
@ -122,21 +127,23 @@ export default class BattleFlyout extends Phaser.GameObjects.Container {
|
||||
continue;
|
||||
}
|
||||
|
||||
const currentPp = Math.max(moveInfo.maxPp - moveInfo.ppUsed, 0);
|
||||
const currentPp = moveInfo.maxPp - moveInfo.ppUsed;
|
||||
flyoutText.text = `${moveInfo.move.name} ${currentPp}/${moveInfo.maxPp}`;
|
||||
}
|
||||
}
|
||||
|
||||
/** Updates all of the {@linkcode MoveInfo} objects in the moveInfo array */
|
||||
updateInfo(event: Event) {
|
||||
private onMoveUsed(event: Event) {
|
||||
const moveUsedEvent = event as MoveUsedEvent;
|
||||
if (!moveUsedEvent || moveUsedEvent.userId !== this.pokemon?.id) {
|
||||
if (!moveUsedEvent
|
||||
|| moveUsedEvent.pokemonId !== this.pokemon?.id
|
||||
|| moveUsedEvent.move.id === Moves.STRUGGLE) { // Ignore Struggle
|
||||
return;
|
||||
}
|
||||
|
||||
const foundInfo = this.moveInfo.find(x => x?.move.id === moveUsedEvent.move.id);
|
||||
if (foundInfo) {
|
||||
foundInfo.ppUsed += moveUsedEvent.ppUsed;
|
||||
foundInfo.ppUsed = Math.min(foundInfo.ppUsed + moveUsedEvent.ppUsed, foundInfo.maxPp);
|
||||
} else {
|
||||
this.moveInfo.push({move: moveUsedEvent.move, maxPp: moveUsedEvent.move.pp, ppUsed: moveUsedEvent.ppUsed});
|
||||
}
|
||||
@ -144,6 +151,23 @@ export default class BattleFlyout extends Phaser.GameObjects.Container {
|
||||
this.setText();
|
||||
}
|
||||
|
||||
private onBerryUsed(event: Event) {
|
||||
const berryUsedEvent = event as BerryUsedEvent;
|
||||
if (!berryUsedEvent
|
||||
|| berryUsedEvent.berryModifier.pokemonId !== this.pokemon?.id
|
||||
|| berryUsedEvent.berryModifier.berryType !== BerryType.LEPPA) { // We only care about Leppa berries
|
||||
return;
|
||||
}
|
||||
|
||||
const foundInfo = this.moveInfo.find(info => info.ppUsed === info.maxPp);
|
||||
if (!foundInfo) { // This will only happen on a de-sync of PP tracking
|
||||
return;
|
||||
}
|
||||
foundInfo.ppUsed = Math.max(foundInfo.ppUsed - 10, 0);
|
||||
|
||||
this.setText();
|
||||
}
|
||||
|
||||
/** Animates the flyout to either show or hide it by applying a fade and translation */
|
||||
toggleFlyout(visible: boolean): void {
|
||||
this.scene.tweens.add({
|
||||
@ -156,8 +180,9 @@ export default class BattleFlyout extends Phaser.GameObjects.Container {
|
||||
}
|
||||
|
||||
destroy(fromScene?: boolean): void {
|
||||
this.battleScene.eventTarget.removeEventListener(BattleSceneEventType.MOVE_USED, this.onMoveUsed);
|
||||
this.battleScene.eventTarget.removeEventListener(BattleSceneEventType.MOVE_USED, this.onMoveUsedEvent);
|
||||
this.battleScene.eventTarget.removeEventListener(BattleSceneEventType.BERRY_USED, this.onBerryUsedEvent);
|
||||
|
||||
super.destroy();
|
||||
super.destroy(fromScene);
|
||||
}
|
||||
}
|
||||
|
@ -35,7 +35,7 @@ export default class FightUiHandler extends UiHandler {
|
||||
this.movesContainer = this.scene.add.container(18, -38.7);
|
||||
ui.add(this.movesContainer);
|
||||
|
||||
this.typeIcon = this.scene.add.sprite((this.scene.game.canvas.width / 6) - 57, -36,`types${Utils.verifyLang(i18next.language) ? `_${i18next.language}` : ""}` , "unknown");
|
||||
this.typeIcon = this.scene.add.sprite((this.scene.game.canvas.width / 6) - 57, -36,`types${Utils.verifyLang(i18next.resolvedLanguage) ? `_${i18next.resolvedLanguage}` : ""}` , "unknown");
|
||||
this.typeIcon.setVisible(false);
|
||||
ui.add(this.typeIcon);
|
||||
|
||||
@ -168,7 +168,7 @@ export default class FightUiHandler extends UiHandler {
|
||||
|
||||
if (hasMove) {
|
||||
const pokemonMove = moveset[cursor];
|
||||
this.typeIcon.setTexture(`types${Utils.verifyLang(i18next.language) ? `_${i18next.language}` : ""}`, Type[pokemonMove.getMove().type].toLowerCase()).setScale(0.8);
|
||||
this.typeIcon.setTexture(`types${Utils.verifyLang(i18next.resolvedLanguage) ? `_${i18next.resolvedLanguage}` : ""}`, Type[pokemonMove.getMove().type].toLowerCase()).setScale(0.8);
|
||||
this.moveCategoryIcon.setTexture("categories", MoveCategory[pokemonMove.getMove().category].toLowerCase()).setScale(1.0);
|
||||
|
||||
const power = pokemonMove.getMove().power;
|
||||
|
@ -73,7 +73,7 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container {
|
||||
}
|
||||
|
||||
setup(): void {
|
||||
const currentLanguage = i18next.language;
|
||||
const currentLanguage = i18next.resolvedLanguage;
|
||||
const langSettingKey = Object.keys(languageSettings).find(lang => currentLanguage.includes(lang));
|
||||
const textSettings = languageSettings[langSettingKey];
|
||||
const infoBg = addWindow(this.scene, 0, 0, this.infoWindowWidth, 132);
|
||||
|
@ -251,7 +251,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
|
||||
setup() {
|
||||
const ui = this.getUi();
|
||||
const currentLanguage = i18next.language;
|
||||
const currentLanguage = i18next.resolvedLanguage;
|
||||
const langSettingKey = Object.keys(languageSettings).find(lang => currentLanguage.includes(lang));
|
||||
const textSettings = languageSettings[langSettingKey];
|
||||
|
||||
@ -518,11 +518,11 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
|
||||
this.pokemonSprite.setPipeline(this.scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], ignoreTimeTint: true });
|
||||
this.starterSelectContainer.add(this.pokemonSprite);
|
||||
|
||||
this.type1Icon = this.scene.add.sprite(8, 98, `types${Utils.verifyLang(i18next.language) ? `_${i18next.language}` : ""}`); this.type1Icon.setScale(0.5);
|
||||
this.type1Icon = this.scene.add.sprite(8, 98, `types${Utils.verifyLang(i18next.resolvedLanguage) ? `_${i18next.resolvedLanguage}` : ""}`); this.type1Icon.setScale(0.5);
|
||||
this.type1Icon.setOrigin(0, 0);
|
||||
this.starterSelectContainer.add(this.type1Icon);
|
||||
|
||||
this.type2Icon = this.scene.add.sprite(26, 98, `types${Utils.verifyLang(i18next.language) ? `_${i18next.language}` : ""}`); this.type2Icon.setScale(0.5);
|
||||
this.type2Icon = this.scene.add.sprite(26, 98, `types${Utils.verifyLang(i18next.resolvedLanguage) ? `_${i18next.resolvedLanguage}` : ""}`); this.type2Icon.setScale(0.5);
|
||||
this.type2Icon.setOrigin(0, 0);
|
||||
this.starterSelectContainer.add(this.type2Icon);
|
||||
|
||||
|
@ -695,7 +695,7 @@ export default class SummaryUiHandler extends UiHandler {
|
||||
const getTypeIcon = (index: integer, type: Type, tera: boolean = false) => {
|
||||
const xCoord = 39 + 34 * index;
|
||||
const typeIcon = !tera
|
||||
? this.scene.add.sprite(xCoord, 42, `types${Utils.verifyLang(i18next.language) ? `_${i18next.language}` : ""}`, Type[type].toLowerCase()) : this.scene.add.sprite(xCoord, 42, "type_tera");
|
||||
? this.scene.add.sprite(xCoord, 42, `types${Utils.verifyLang(i18next.resolvedLanguage) ? `_${i18next.resolvedLanguage}` : ""}`, Type[type].toLowerCase()) : this.scene.add.sprite(xCoord, 42, "type_tera");
|
||||
if (tera) {
|
||||
typeIcon.setScale(0.5);
|
||||
const typeRgb = getTypeRgb(type);
|
||||
@ -897,7 +897,7 @@ export default class SummaryUiHandler extends UiHandler {
|
||||
|
||||
if (this.summaryUiMode === SummaryUiMode.LEARN_MOVE) {
|
||||
this.extraMoveRowContainer.setVisible(true);
|
||||
const newMoveTypeIcon = this.scene.add.sprite(0, 0, `types${Utils.verifyLang(i18next.language) ? `_${i18next.language}` : ""}`, Type[this.newMove.type].toLowerCase());
|
||||
const newMoveTypeIcon = this.scene.add.sprite(0, 0, `types${Utils.verifyLang(i18next.resolvedLanguage) ? `_${i18next.resolvedLanguage}` : ""}`, Type[this.newMove.type].toLowerCase());
|
||||
newMoveTypeIcon.setOrigin(0, 1);
|
||||
this.extraMoveRowContainer.add(newMoveTypeIcon);
|
||||
|
||||
@ -920,7 +920,7 @@ export default class SummaryUiHandler extends UiHandler {
|
||||
this.moveRowsContainer.add(moveRowContainer);
|
||||
|
||||
if (move) {
|
||||
const typeIcon = this.scene.add.sprite(0, 0, `types${Utils.verifyLang(i18next.language) ? `_${i18next.language}` : ""}`, Type[move.getMove().type].toLowerCase()); typeIcon.setOrigin(0, 1);
|
||||
const typeIcon = this.scene.add.sprite(0, 0, `types${Utils.verifyLang(i18next.resolvedLanguage) ? `_${i18next.resolvedLanguage}` : ""}`, Type[move.getMove().type].toLowerCase()); typeIcon.setOrigin(0, 1);
|
||||
moveRowContainer.add(typeIcon);
|
||||
}
|
||||
|
||||
|
@ -98,7 +98,7 @@ export function addTextInputObject(scene: Phaser.Scene, x: number, y: number, wi
|
||||
}
|
||||
|
||||
function getTextStyleOptions(style: TextStyle, uiTheme: UiTheme, extraStyleOptions?: Phaser.Types.GameObjects.Text.TextStyle): [ Phaser.Types.GameObjects.Text.TextStyle | InputText.IConfig, string, number, number ] {
|
||||
const lang = i18next.language;
|
||||
const lang = i18next.resolvedLanguage;
|
||||
let shadowXpos = 4;
|
||||
let shadowYpos = 5;
|
||||
|
||||
|
@ -396,7 +396,7 @@ English itself counts as not available
|
||||
export function verifyLang(lang?: string): boolean {
|
||||
//IMPORTANT - ONLY ADD YOUR LANG HERE IF YOU'VE ALREADY ADDED ALL THE NECESSARY IMAGES
|
||||
if (!lang) {
|
||||
lang = i18next.language;
|
||||
lang = i18next.resolvedLanguage;
|
||||
}
|
||||
|
||||
switch (lang) {
|
||||
|
Loading…
Reference in New Issue
Block a user