mirror of
https://github.com/pagefaultgames/pokerogue.git
synced 2025-07-01 05:52:17 +02:00
Merge branch 'beta' into activation-order
This commit is contained in:
commit
349b4b0fdf
Binary file not shown.
Before Width: | Height: | Size: 491 B |
Binary file not shown.
Before Width: | Height: | Size: 508 B |
Binary file not shown.
Before Width: | Height: | Size: 461 B |
Binary file not shown.
Before Width: | Height: | Size: 470 B |
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Before Width: | Height: | Size: 51 KiB After Width: | Height: | Size: 50 KiB |
@ -168,6 +168,8 @@ import { BattlerTagType } from "#enums/battler-tag-type";
|
||||
import { FRIENDSHIP_GAIN_FROM_BATTLE } from "#app/data/balance/starters";
|
||||
import { StatusEffect } from "#enums/status-effect";
|
||||
import { initGlobalScene } from "#app/global-scene";
|
||||
import { ShowAbilityPhase } from "#app/phases/show-ability-phase";
|
||||
import { HideAbilityPhase } from "#app/phases/hide-ability-phase";
|
||||
|
||||
export const bypassLogin = import.meta.env.VITE_BYPASS_LOGIN === "1";
|
||||
|
||||
@ -2923,6 +2925,21 @@ export default class BattleScene extends SceneBase {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Queues an ability bar flyout phase
|
||||
* @param pokemon The pokemon who has the ability
|
||||
* @param passive Whether the ability is a passive
|
||||
* @param show Whether to show or hide the bar
|
||||
*/
|
||||
public queueAbilityDisplay(pokemon: Pokemon, passive: boolean, show: boolean): void {
|
||||
this.unshiftPhase(
|
||||
show
|
||||
? new ShowAbilityPhase(pokemon.getBattlerIndex(), passive)
|
||||
: new HideAbilityPhase(pokemon.getBattlerIndex(), passive),
|
||||
);
|
||||
this.clearPhaseQueueSplice();
|
||||
}
|
||||
|
||||
/**
|
||||
* Moves everything from nextCommandPhaseQueue to phaseQueue (keeping order)
|
||||
*/
|
||||
@ -3152,6 +3169,41 @@ export default class BattleScene extends SceneBase {
|
||||
return false;
|
||||
}
|
||||
|
||||
canTransferHeldItemModifier(itemModifier: PokemonHeldItemModifier, target: Pokemon, transferQuantity = 1): boolean {
|
||||
const mod = itemModifier.clone() as PokemonHeldItemModifier;
|
||||
const source = mod.pokemonId ? mod.getPokemon() : null;
|
||||
const cancelled = new Utils.BooleanHolder(false);
|
||||
|
||||
if (source && source.isPlayer() !== target.isPlayer()) {
|
||||
applyAbAttrs(BlockItemTheftAbAttr, source, cancelled);
|
||||
}
|
||||
|
||||
if (cancelled.value) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const matchingModifier = this.findModifier(
|
||||
m => m instanceof PokemonHeldItemModifier && m.matchType(mod) && m.pokemonId === target.id,
|
||||
target.isPlayer(),
|
||||
) as PokemonHeldItemModifier;
|
||||
|
||||
if (matchingModifier) {
|
||||
const maxStackCount = matchingModifier.getMaxStackCount();
|
||||
if (matchingModifier.stackCount >= maxStackCount) {
|
||||
return false;
|
||||
}
|
||||
const countTaken = Math.min(transferQuantity, mod.stackCount, maxStackCount - matchingModifier.stackCount);
|
||||
mod.stackCount -= countTaken;
|
||||
} else {
|
||||
const countTaken = Math.min(transferQuantity, mod.stackCount);
|
||||
mod.stackCount -= countTaken;
|
||||
}
|
||||
|
||||
const removeOld = mod.stackCount === 0;
|
||||
|
||||
return !removeOld || !source || this.hasModifier(itemModifier, !source.isPlayer());
|
||||
}
|
||||
|
||||
removePartyMemberModifiers(partyMemberIndex: number): Promise<void> {
|
||||
return new Promise(resolve => {
|
||||
const pokemonId = this.getPlayerParty()[partyMemberIndex].id;
|
||||
@ -3309,6 +3361,11 @@ export default class BattleScene extends SceneBase {
|
||||
});
|
||||
}
|
||||
|
||||
hasModifier(modifier: PersistentModifier, enemy = false): boolean {
|
||||
const modifiers = !enemy ? this.modifiers : this.enemyModifiers;
|
||||
return modifiers.indexOf(modifier) > -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes a currently owned item. If the item is stacked, the entire item stack
|
||||
* gets removed. This function does NOT apply in-battle effects, such as Unburden.
|
||||
|
2993
src/data/ability.ts
2993
src/data/ability.ts
File diff suppressed because it is too large
Load Diff
162
src/data/balance/signature-species.ts
Normal file
162
src/data/balance/signature-species.ts
Normal file
@ -0,0 +1,162 @@
|
||||
import { Species } from "#enums/species";
|
||||
|
||||
export 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 = {
|
||||
// Gym Leaders- Kanto
|
||||
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],
|
||||
// Gym Leaders- Johto
|
||||
FALKNER: [Species.PIDGEY, Species.HOOTHOOT, Species.DODUO],
|
||||
BUGSY: [Species.SCYTHER, Species.HERACROSS, Species.SHUCKLE, Species.PINSIR],
|
||||
WHITNEY: [Species.JIGGLYPUFF, Species.MILTANK, Species.AIPOM, Species.GIRAFARIG],
|
||||
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],
|
||||
// Gym Leaders- Hoenn
|
||||
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.ZIGZAGOON, Species.KECLEON],
|
||||
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],
|
||||
// Gym Leaders- Sinnoh
|
||||
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.WOOPER, Species.PIPLUP, Species.MAGIKARP],
|
||||
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],
|
||||
// Gym Leaders- Unova
|
||||
CILAN: [Species.PANSAGE, Species.FOONGUS, Species.PETILIL],
|
||||
CHILI: [Species.PANSEAR, Species.DARUMAKA, Species.NUMEL],
|
||||
CRESS: [Species.PANPOUR, Species.TYMPOLE, Species.SLOWPOKE],
|
||||
CHEREN: [Species.LILLIPUP, Species.MINCCINO, Species.PIDOVE],
|
||||
LENORA: [Species.PATRAT, 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],
|
||||
// Gym Leaders- Kalos
|
||||
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],
|
||||
// Gym Leaders- Galar
|
||||
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],
|
||||
// Gym Leaders- Paldea; First slot is Tera
|
||||
KATY: [Species.TEDDIURSA, Species.NYMBLE, Species.TAROUNTULA], // Tera Bug Teddiursa
|
||||
BRASSIUS: [Species.SUDOWOODO, Species.BRAMBLIN, Species.SMOLIV], // Tera Grass Sudowoodo
|
||||
IONO: [Species.MISDREAVUS, Species.TADBULB, Species.WATTREL], // Tera Ghost Misdreavus
|
||||
KOFU: [Species.CRABRAWLER, Species.VELUZA, Species.WIGLETT, Species.WINGULL], // Tera Water Crabrawler
|
||||
LARRY: [Species.STARLY, Species.DUNSPARCE, Species.LECHONK, Species.KOMALA], // Tera Normal Starly
|
||||
RYME: [Species.TOXEL, Species.GREAVARD, Species.SHUPPET, Species.MIMIKYU], // Tera Ghost Toxel
|
||||
TULIP: [Species.FLABEBE, Species.FLITTLE, Species.RALTS, Species.GIRAFARIG], // Tera Psychic Flabebe
|
||||
GRUSHA: [Species.SWABLU, Species.CETODDLE, Species.CUBCHOO, Species.ALOLA_VULPIX], // Tera Ice Swablu
|
||||
|
||||
// Elite Four- Kanto
|
||||
LORELEI: [
|
||||
Species.JYNX,
|
||||
[Species.SLOWBRO, Species.GALAR_SLOWBRO],
|
||||
Species.LAPRAS,
|
||||
[Species.CLOYSTER, Species.ALOLA_SANDSLASH],
|
||||
],
|
||||
BRUNO: [Species.MACHAMP, Species.HITMONCHAN, Species.HITMONLEE, [Species.GOLEM, Species.ALOLA_GOLEM]],
|
||||
AGATHA: [Species.GENGAR, [Species.ARBOK, Species.WEEZING], Species.CROBAT, Species.ALOLA_MAROWAK],
|
||||
LANCE: [Species.DRAGONITE, Species.GYARADOS, Species.AERODACTYL, Species.ALOLA_EXEGGUTOR],
|
||||
// Elite Four- Johto (Bruno included)
|
||||
WILL: [Species.XATU, Species.JYNX, [Species.SLOWBRO, Species.SLOWKING], Species.EXEGGUTOR],
|
||||
KOGA: [[Species.MUK, Species.WEEZING], [Species.VENOMOTH, Species.ARIADOS], Species.CROBAT, Species.TENTACRUEL],
|
||||
KAREN: [Species.UMBREON, Species.HONCHKROW, Species.HOUNDOOM, Species.WEAVILE],
|
||||
// Elite Four- Hoenn
|
||||
SIDNEY: [
|
||||
[Species.SHIFTRY, Species.CACTURNE],
|
||||
[Species.SHARPEDO, Species.CRAWDAUNT],
|
||||
Species.ABSOL,
|
||||
Species.MIGHTYENA,
|
||||
],
|
||||
PHOEBE: [Species.SABLEYE, Species.DUSKNOIR, Species.BANETTE, [Species.DRIFBLIM, Species.MISMAGIUS]],
|
||||
GLACIA: [Species.GLALIE, Species.WALREIN, Species.FROSLASS, Species.ABOMASNOW],
|
||||
DRAKE: [Species.ALTARIA, Species.SALAMENCE, Species.FLYGON, Species.KINGDRA],
|
||||
// Elite Four- Sinnoh
|
||||
AARON: [[Species.SCIZOR, Species.KLEAVOR], Species.HERACROSS, [Species.VESPIQUEN, Species.YANMEGA], Species.DRAPION],
|
||||
BERTHA: [Species.WHISCASH, Species.HIPPOWDON, Species.GLISCOR, Species.RHYPERIOR],
|
||||
FLINT: [
|
||||
[Species.RAPIDASH, Species.FLAREON],
|
||||
Species.MAGMORTAR,
|
||||
[Species.STEELIX, Species.LOPUNNY],
|
||||
Species.INFERNAPE,
|
||||
], // Tera Fire Steelix or Lopunny
|
||||
LUCIAN: [Species.MR_MIME, Species.GALLADE, Species.BRONZONG, [Species.ALAKAZAM, Species.ESPEON]],
|
||||
// Elite Four- Unova
|
||||
SHAUNTAL: [Species.COFAGRIGUS, Species.CHANDELURE, Species.GOLURK, Species.JELLICENT],
|
||||
MARSHAL: [Species.CONKELDURR, Species.MIENSHAO, Species.THROH, Species.SAWK],
|
||||
GRIMSLEY: [Species.LIEPARD, Species.KINGAMBIT, Species.SCRAFTY, Species.KROOKODILE],
|
||||
CAITLIN: [Species.MUSHARNA, Species.GOTHITELLE, Species.SIGILYPH, Species.REUNICLUS],
|
||||
// Elite Four- Kalos
|
||||
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],
|
||||
// Elite Four- Alola
|
||||
HALA: [Species.HARIYAMA, Species.BEWEAR, Species.CRABOMINABLE, [Species.POLIWRATH, Species.ANNIHILAPE]],
|
||||
MOLAYNE: [Species.KLEFKI, Species.MAGNEZONE, Species.METAGROSS, Species.ALOLA_DUGTRIO],
|
||||
OLIVIA: [Species.RELICANTH, Species.CARBINK, Species.ALOLA_GOLEM, Species.LYCANROC],
|
||||
ACEROLA: [[Species.BANETTE, Species.DRIFBLIM], Species.MIMIKYU, Species.DHELMISE, Species.PALOSSAND],
|
||||
KAHILI: [[Species.BRAVIARY, Species.MANDIBUZZ], Species.HAWLUCHA, Species.ORICORIO, Species.TOUCANNON],
|
||||
// Elite Four- Galar
|
||||
MARNIE_ELITE: [Species.MORPEKO, Species.LIEPARD, [Species.TOXICROAK, Species.SCRAFTY], Species.GRIMMSNARL],
|
||||
NESSA_ELITE: [Species.GOLISOPOD, [Species.QUAGSIRE, Species.PELIPPER], Species.TOXAPEX, Species.DREDNAW],
|
||||
BEA_ELITE: [Species.HAWLUCHA, [Species.GRAPPLOCT, Species.SIRFETCHD], Species.FALINKS, Species.MACHAMP],
|
||||
ALLISTER_ELITE: [Species.DUSKNOIR, [Species.POLTEAGEIST, Species.RUNERIGUS], Species.CURSOLA, Species.GENGAR],
|
||||
RAIHAN_ELITE: [Species.GOODRA, [Species.TORKOAL, Species.TURTONATOR], Species.FLYGON, Species.ARCHALUDON],
|
||||
// Elite Four- Paldea
|
||||
RIKA: [Species.CLODSIRE, [Species.DUGTRIO, Species.DONPHAN], Species.CAMERUPT, Species.WHISCASH], // Tera Ground Clodsire
|
||||
POPPY: [Species.TINKATON, Species.BRONZONG, Species.CORVIKNIGHT, Species.COPPERAJAH], // Tera Steel Tinkaton
|
||||
LARRY_ELITE: [Species.FLAMIGO, Species.STARAPTOR, [Species.ALTARIA, Species.TROPIUS], Species.ORICORIO], // Tera Flying Flamigo; random Oricorio
|
||||
HASSEL: [Species.BAXCALIBUR, [Species.FLAPPLE, Species.APPLETUN], Species.DRAGALGE, Species.NOIVERN], // Tera Dragon Baxcalibur
|
||||
// Elite Four- BBL
|
||||
CRISPIN: [Species.BLAZIKEN, Species.MAGMORTAR, [Species.CAMERUPT, Species.TALONFLAME], Species.ROTOM], // Tera Fire Blaziken; Heat Rotom
|
||||
AMARYS: [Species.METAGROSS, Species.SCIZOR, Species.EMPOLEON, Species.SKARMORY], // Tera Steel Metagross
|
||||
LACEY: [Species.EXCADRILL, Species.PRIMARINA, [Species.WHIMSICOTT, Species.ALCREMIE], Species.GRANBULL], // Tera Fairy Excadrill
|
||||
DRAYTON: [Species.ARCHALUDON, Species.DRAGONITE, Species.HAXORUS, Species.SCEPTILE], // Tera Dragon Archaludon
|
||||
};
|
@ -912,24 +912,12 @@ export const pokemonFormChanges: PokemonFormChanges = {
|
||||
new SpeciesFormChange(Species.MIMIKYU, "disguised", "busted", new SpeciesFormChangeAbilityTrigger(), true),
|
||||
new SpeciesFormChange(Species.MIMIKYU, "busted", "disguised", new SpeciesFormChangeAbilityTrigger(), true)
|
||||
],
|
||||
[Species.SOLGALEO]: [
|
||||
new SpeciesFormChange(Species.SOLGALEO, "", "radiant-sun", new SpeciesFormChangePreMoveTrigger(Moves.SUNSTEEL_STRIKE), true),
|
||||
new SpeciesFormChange(Species.SOLGALEO, "radiant-sun", "", new SpeciesFormChangeActiveTrigger(false), true)
|
||||
],
|
||||
[Species.LUNALA]: [
|
||||
new SpeciesFormChange(Species.LUNALA, "", "full-moon", new SpeciesFormChangePreMoveTrigger(Moves.MOONGEIST_BEAM), true),
|
||||
new SpeciesFormChange(Species.LUNALA, "full-moon", "", new SpeciesFormChangeActiveTrigger(false), true)
|
||||
],
|
||||
[Species.NECROZMA]: [
|
||||
new SpeciesFormChange(Species.NECROZMA, "", "dawn-wings", new SpeciesFormChangeItemTrigger(FormChangeItem.N_LUNARIZER), false, getSpeciesDependentFormChangeCondition(Species.LUNALA)),
|
||||
new SpeciesFormChange(Species.NECROZMA, "", "dusk-mane", new SpeciesFormChangeItemTrigger(FormChangeItem.N_SOLARIZER), false, getSpeciesDependentFormChangeCondition(Species.SOLGALEO)),
|
||||
new SpeciesFormChange(Species.NECROZMA, "dawn-wings", "ultra", new SpeciesFormChangeItemTrigger(FormChangeItem.ULTRANECROZIUM_Z)),
|
||||
new SpeciesFormChange(Species.NECROZMA, "dusk-mane", "ultra", new SpeciesFormChangeItemTrigger(FormChangeItem.ULTRANECROZIUM_Z))
|
||||
],
|
||||
[Species.MARSHADOW]: [
|
||||
new SpeciesFormChange(Species.MARSHADOW, "", "zenith", new SpeciesFormChangePreMoveTrigger(Moves.SPECTRAL_THIEF), true),
|
||||
new SpeciesFormChange(Species.MARSHADOW, "zenith", "", new SpeciesFormChangeActiveTrigger(false), true)
|
||||
],
|
||||
[Species.MELMETAL]: [
|
||||
new SpeciesFormChange(Species.MELMETAL, "", SpeciesFormKey.GIGANTAMAX, new SpeciesFormChangeItemTrigger(FormChangeItem.MAX_MUSHROOMS))
|
||||
],
|
||||
|
@ -63,8 +63,6 @@ export const normalForm: Species[] = [
|
||||
Species.FROGADIER,
|
||||
Species.GRENINJA,
|
||||
Species.ROCKRUFF,
|
||||
Species.SOLGALEO,
|
||||
Species.LUNALA,
|
||||
Species.NECROZMA,
|
||||
Species.MAGEARNA,
|
||||
Species.MARSHADOW,
|
||||
@ -2678,14 +2676,8 @@ export function initSpecies() {
|
||||
new PokemonSpecies(Species.TAPU_FINI, 7, true, false, false, "Land Spirit Pokémon", PokemonType.WATER, PokemonType.FAIRY, 1.3, 21.2, Abilities.MISTY_SURGE, Abilities.NONE, Abilities.TELEPATHY, 570, 70, 75, 115, 95, 130, 85, 3, 50, 285, GrowthRate.SLOW, null, false),
|
||||
new PokemonSpecies(Species.COSMOG, 7, true, false, false, "Nebula Pokémon", PokemonType.PSYCHIC, null, 0.2, 0.1, Abilities.UNAWARE, Abilities.NONE, Abilities.NONE, 200, 43, 29, 31, 29, 31, 37, 45, 0, 40, GrowthRate.SLOW, null, false),
|
||||
new PokemonSpecies(Species.COSMOEM, 7, true, false, false, "Protostar Pokémon", PokemonType.PSYCHIC, null, 0.1, 999.9, Abilities.STURDY, Abilities.NONE, Abilities.NONE, 400, 43, 29, 131, 29, 131, 37, 45, 0, 140, GrowthRate.SLOW, null, false),
|
||||
new PokemonSpecies(Species.SOLGALEO, 7, false, true, false, "Sunne Pokémon", PokemonType.PSYCHIC, PokemonType.STEEL, 3.4, 230, Abilities.FULL_METAL_BODY, Abilities.NONE, Abilities.NONE, 680, 137, 137, 107, 113, 89, 97, 45, 0, 340, GrowthRate.SLOW, null, false, true,
|
||||
new PokemonForm("Normal", "", PokemonType.PSYCHIC, PokemonType.STEEL, 3.4, 230, Abilities.FULL_METAL_BODY, Abilities.NONE, Abilities.NONE, 680, 137, 137, 107, 113, 89, 97, 45, 0, 340, false, null, true),
|
||||
new PokemonForm("Radiant Sun", "radiant-sun", PokemonType.PSYCHIC, PokemonType.STEEL, 3.4, 230, Abilities.FULL_METAL_BODY, Abilities.NONE, Abilities.NONE, 680, 137, 137, 107, 113, 89, 97, 45, 0, 340),
|
||||
),
|
||||
new PokemonSpecies(Species.LUNALA, 7, false, true, false, "Moone Pokémon", PokemonType.PSYCHIC, PokemonType.GHOST, 4, 120, Abilities.SHADOW_SHIELD, Abilities.NONE, Abilities.NONE, 680, 137, 113, 89, 137, 107, 97, 45, 0, 340, GrowthRate.SLOW, null, false, true,
|
||||
new PokemonForm("Normal", "", PokemonType.PSYCHIC, PokemonType.GHOST, 4, 120, Abilities.SHADOW_SHIELD, Abilities.NONE, Abilities.NONE, 680, 137, 113, 89, 137, 107, 97, 45, 0, 340, false, null, true),
|
||||
new PokemonForm("Full Moon", "full-moon", PokemonType.PSYCHIC, PokemonType.GHOST, 4, 120, Abilities.SHADOW_SHIELD, Abilities.NONE, Abilities.NONE, 680, 137, 113, 89, 137, 107, 97, 45, 0, 340),
|
||||
),
|
||||
new PokemonSpecies(Species.SOLGALEO, 7, false, true, false, "Sunne Pokémon", PokemonType.PSYCHIC, PokemonType.STEEL, 3.4, 230, Abilities.FULL_METAL_BODY, Abilities.NONE, Abilities.NONE, 680, 137, 137, 107, 113, 89, 97, 45, 0, 340, GrowthRate.SLOW, null, false),
|
||||
new PokemonSpecies(Species.LUNALA, 7, false, true, false, "Moone Pokémon", PokemonType.PSYCHIC, PokemonType.GHOST, 4, 120, Abilities.SHADOW_SHIELD, Abilities.NONE, Abilities.NONE, 680, 137, 113, 89, 137, 107, 97, 45, 0, 340, GrowthRate.SLOW, null, false),
|
||||
new PokemonSpecies(Species.NIHILEGO, 7, true, false, false, "Parasite Pokémon", PokemonType.ROCK, PokemonType.POISON, 1.2, 55.5, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 570, 109, 53, 47, 127, 131, 103, 45, 0, 285, GrowthRate.SLOW, null, false),
|
||||
new PokemonSpecies(Species.BUZZWOLE, 7, true, false, false, "Swollen Pokémon", PokemonType.BUG, PokemonType.FIGHTING, 2.4, 333.6, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 570, 107, 139, 139, 53, 53, 79, 45, 0, 285, GrowthRate.SLOW, null, false),
|
||||
new PokemonSpecies(Species.PHEROMOSA, 7, true, false, false, "Lissome Pokémon", PokemonType.BUG, PokemonType.FIGHTING, 1.8, 25, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 570, 71, 137, 37, 137, 37, 151, 45, 0, 285, GrowthRate.SLOW, null, false),
|
||||
@ -2705,7 +2697,7 @@ export function initSpecies() {
|
||||
),
|
||||
new PokemonSpecies(Species.MARSHADOW, 7, false, false, true, "Gloomdweller Pokémon", PokemonType.FIGHTING, PokemonType.GHOST, 0.7, 22.2, Abilities.TECHNICIAN, Abilities.NONE, Abilities.NONE, 600, 90, 125, 80, 90, 90, 125, 3, 0, 300, GrowthRate.SLOW, null, false, true,
|
||||
new PokemonForm("Normal", "", PokemonType.FIGHTING, PokemonType.GHOST, 0.7, 22.2, Abilities.TECHNICIAN, Abilities.NONE, Abilities.NONE, 600, 90, 125, 80, 90, 90, 125, 3, 0, 300, false, null, true),
|
||||
new PokemonForm("Zenith", "zenith", PokemonType.FIGHTING, PokemonType.GHOST, 0.7, 22.2, Abilities.TECHNICIAN, Abilities.NONE, Abilities.NONE, 600, 90, 125, 80, 90, 90, 125, 3, 0, 300),
|
||||
new PokemonForm("Zenith", "zenith", PokemonType.FIGHTING, PokemonType.GHOST, 0.7, 22.2, Abilities.TECHNICIAN, Abilities.NONE, Abilities.NONE, 600, 90, 125, 80, 90, 90, 125, 3, 0, 300, false, null, false, true)
|
||||
),
|
||||
new PokemonSpecies(Species.POIPOLE, 7, true, false, false, "Poison Pin Pokémon", PokemonType.POISON, null, 0.6, 1.8, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 420, 67, 73, 67, 73, 67, 73, 45, 0, 210, GrowthRate.SLOW, null, false),
|
||||
new PokemonSpecies(Species.NAGANADEL, 7, true, false, false, "Poison Pin Pokémon", PokemonType.POISON, PokemonType.DRAGON, 3.6, 150, Abilities.BEAST_BOOST, Abilities.NONE, Abilities.NONE, 540, 73, 73, 73, 127, 73, 121, 45, 0, 270, GrowthRate.SLOW, null, false),
|
||||
|
@ -22,6 +22,7 @@ import { PartyMemberStrength } from "#enums/party-member-strength";
|
||||
import { Species } from "#enums/species";
|
||||
import { TrainerType } from "#enums/trainer-type";
|
||||
import { Gender } from "#app/data/gender";
|
||||
import { signatureSpecies } from "./balance/signature-species";
|
||||
|
||||
/** Minimum BST for Pokemon generated onto the Elite Four's teams */
|
||||
const ELITE_FOUR_MINIMUM_BST = 460;
|
||||
@ -1744,148 +1745,6 @@ function getSpeciesFilterRandomPartyMemberFunc(
|
||||
};
|
||||
}
|
||||
|
||||
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.JIGGLYPUFF, Species.MILTANK, Species.AIPOM, Species.GIRAFARIG],
|
||||
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.ZIGZAGOON, Species.KECLEON],
|
||||
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.WOOPER, Species.PIPLUP, Species.MAGIKARP],
|
||||
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.FOONGUS, Species.PETILIL],
|
||||
CHILI: [Species.PANSEAR, Species.DARUMAKA, Species.NUMEL],
|
||||
CRESS: [Species.PANPOUR, Species.TYMPOLE, Species.SLOWPOKE],
|
||||
CHEREN: [Species.LILLIPUP, Species.MINCCINO, Species.PIDOVE],
|
||||
LENORA: [Species.PATRAT, 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.TEDDIURSA, Species.NYMBLE, Species.TAROUNTULA], // Tera Bug Teddiursa
|
||||
BRASSIUS: [Species.SUDOWOODO, Species.BRAMBLIN, Species.SMOLIV], // Tera Grass Sudowoodo
|
||||
IONO: [Species.MISDREAVUS, Species.TADBULB, Species.WATTREL], // Tera Ghost Misdreavus
|
||||
KOFU: [Species.CRABRAWLER, Species.VELUZA, Species.WIGLETT, Species.WINGULL], // Tera Water Crabrawler
|
||||
LARRY: [Species.STARLY, Species.DUNSPARCE, Species.LECHONK, Species.KOMALA], // Tera Normal Starly
|
||||
RYME: [Species.TOXEL, Species.GREAVARD, Species.SHUPPET, Species.MIMIKYU], // Tera Ghost Toxel
|
||||
TULIP: [Species.FLABEBE, Species.FLITTLE, Species.RALTS, Species.GIRAFARIG], // Tera Psychic Flabebe
|
||||
GRUSHA: [Species.SWABLU, Species.CETODDLE, Species.CUBCHOO, Species.ALOLA_VULPIX], // Tera Ice Swablu
|
||||
LORELEI: [
|
||||
Species.JYNX,
|
||||
[Species.SLOWBRO, Species.GALAR_SLOWBRO],
|
||||
Species.LAPRAS,
|
||||
[Species.CLOYSTER, Species.ALOLA_SANDSLASH],
|
||||
],
|
||||
BRUNO: [Species.MACHAMP, Species.HITMONCHAN, Species.HITMONLEE, [Species.GOLEM, Species.ALOLA_GOLEM]],
|
||||
AGATHA: [Species.GENGAR, [Species.ARBOK, Species.WEEZING], Species.CROBAT, Species.ALOLA_MAROWAK],
|
||||
LANCE: [Species.DRAGONITE, Species.GYARADOS, Species.AERODACTYL, Species.ALOLA_EXEGGUTOR],
|
||||
WILL: [Species.XATU, Species.JYNX, [Species.SLOWBRO, Species.SLOWKING], Species.EXEGGUTOR],
|
||||
KOGA: [[Species.MUK, Species.WEEZING], [Species.VENOMOTH, Species.ARIADOS], Species.CROBAT, Species.TENTACRUEL],
|
||||
KAREN: [Species.UMBREON, Species.HONCHKROW, Species.HOUNDOOM, Species.WEAVILE],
|
||||
SIDNEY: [
|
||||
[Species.SHIFTRY, Species.CACTURNE],
|
||||
[Species.SHARPEDO, Species.CRAWDAUNT],
|
||||
Species.ABSOL,
|
||||
Species.MIGHTYENA,
|
||||
],
|
||||
PHOEBE: [Species.SABLEYE, Species.DUSKNOIR, Species.BANETTE, [Species.DRIFBLIM, Species.MISMAGIUS]],
|
||||
GLACIA: [Species.GLALIE, Species.WALREIN, Species.FROSLASS, Species.ABOMASNOW],
|
||||
DRAKE: [Species.ALTARIA, Species.SALAMENCE, Species.FLYGON, Species.KINGDRA],
|
||||
AARON: [[Species.SCIZOR, Species.KLEAVOR], Species.HERACROSS, [Species.VESPIQUEN, Species.YANMEGA], Species.DRAPION],
|
||||
BERTHA: [Species.WHISCASH, Species.HIPPOWDON, Species.GLISCOR, Species.RHYPERIOR],
|
||||
FLINT: [
|
||||
[Species.RAPIDASH, Species.FLAREON],
|
||||
Species.MAGMORTAR,
|
||||
[Species.STEELIX, Species.LOPUNNY],
|
||||
Species.INFERNAPE,
|
||||
], // Tera Fire Steelix or Lopunny
|
||||
LUCIAN: [Species.MR_MIME, Species.GALLADE, Species.BRONZONG, [Species.ALAKAZAM, Species.ESPEON]],
|
||||
SHAUNTAL: [Species.COFAGRIGUS, Species.CHANDELURE, Species.GOLURK, Species.JELLICENT],
|
||||
MARSHAL: [Species.CONKELDURR, Species.MIENSHAO, 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, Species.ANNIHILAPE]],
|
||||
MOLAYNE: [Species.KLEFKI, Species.MAGNEZONE, Species.METAGROSS, Species.ALOLA_DUGTRIO],
|
||||
OLIVIA: [Species.RELICANTH, Species.CARBINK, Species.ALOLA_GOLEM, Species.LYCANROC],
|
||||
ACEROLA: [[Species.BANETTE, Species.DRIFBLIM], Species.MIMIKYU, Species.DHELMISE, Species.PALOSSAND],
|
||||
KAHILI: [[Species.BRAVIARY, Species.MANDIBUZZ], Species.HAWLUCHA, Species.ORICORIO, Species.TOUCANNON],
|
||||
MARNIE_ELITE: [Species.MORPEKO, Species.LIEPARD, [Species.TOXICROAK, Species.SCRAFTY], Species.GRIMMSNARL],
|
||||
NESSA_ELITE: [Species.GOLISOPOD, [Species.QUAGSIRE, Species.PELIPPER], Species.TOXAPEX, Species.DREDNAW],
|
||||
BEA_ELITE: [Species.HAWLUCHA, [Species.GRAPPLOCT, Species.SIRFETCHD], Species.FALINKS, Species.MACHAMP],
|
||||
ALLISTER_ELITE: [Species.DUSKNOIR, [Species.POLTEAGEIST, Species.RUNERIGUS], Species.CURSOLA, Species.GENGAR],
|
||||
RAIHAN_ELITE: [Species.GOODRA, [Species.TORKOAL, Species.TURTONATOR], Species.FLYGON, Species.ARCHALUDON],
|
||||
RIKA: [Species.CLODSIRE, [Species.DUGTRIO, Species.DONPHAN], Species.CAMERUPT, Species.WHISCASH], // Tera Ground Clodsire
|
||||
POPPY: [Species.TINKATON, Species.BRONZONG, Species.CORVIKNIGHT, Species.COPPERAJAH], // Tera Steel Tinkaton
|
||||
LARRY_ELITE: [Species.FLAMIGO, Species.STARAPTOR, [Species.ALTARIA, Species.TROPIUS], Species.ORICORIO], // Tera Flying Flamigo; random Oricorio
|
||||
HASSEL: [Species.BAXCALIBUR, [Species.FLAPPLE, Species.APPLETUN], Species.DRAGALGE, Species.NOIVERN], // Tera Dragon Baxcalibur
|
||||
CRISPIN: [Species.BLAZIKEN, Species.MAGMORTAR, [Species.CAMERUPT, Species.TALONFLAME], Species.ROTOM], // Tera Fire Blaziken; Heat Rotom
|
||||
AMARYS: [Species.METAGROSS, Species.SCIZOR, Species.EMPOLEON, Species.SKARMORY], // Tera Steel Metagross
|
||||
LACEY: [Species.EXCADRILL, Species.PRIMARINA, [Species.WHIMSICOTT, Species.ALCREMIE], Species.GRANBULL], // Tera Fairy Excadrill
|
||||
DRAYTON: [Species.ARCHALUDON, Species.DRAGONITE, Species.HAXORUS, Species.SCEPTILE], // Tera Dragon Archaludon
|
||||
};
|
||||
|
||||
export const trainerConfigs: TrainerConfigs = {
|
||||
[TrainerType.UNKNOWN]: new TrainerConfig(0).setHasGenders(),
|
||||
[TrainerType.ACE_TRAINER]: new TrainerConfig(++t)
|
||||
|
@ -303,6 +303,11 @@ export class Arena {
|
||||
return true;
|
||||
}
|
||||
|
||||
/** Returns weather or not the weather can be changed to {@linkcode weather} */
|
||||
canSetWeather(weather: WeatherType): boolean {
|
||||
return !(this.weather?.weatherType === (weather || undefined));
|
||||
}
|
||||
|
||||
/**
|
||||
* Attempts to set a new weather to the battle
|
||||
* @param weather {@linkcode WeatherType} new {@linkcode WeatherType} to set
|
||||
@ -314,7 +319,7 @@ export class Arena {
|
||||
return this.trySetWeatherOverride(Overrides.WEATHER_OVERRIDE);
|
||||
}
|
||||
|
||||
if (this.weather?.weatherType === (weather || undefined)) {
|
||||
if (!this.canSetWeather(weather)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -388,8 +393,13 @@ export class Arena {
|
||||
});
|
||||
}
|
||||
|
||||
/** Returns whether or not the terrain can be set to {@linkcode terrain} */
|
||||
canSetTerrain(terrain: TerrainType): boolean {
|
||||
return !(this.terrain?.terrainType === (terrain || undefined));
|
||||
}
|
||||
|
||||
trySetTerrain(terrain: TerrainType, hasPokemonSource: boolean, ignoreAnim = false): boolean {
|
||||
if (this.terrain?.terrainType === (terrain || undefined)) {
|
||||
if (!this.canSetTerrain(terrain)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -6920,10 +6920,10 @@ export class EnemyPokemon extends Pokemon {
|
||||
|
||||
if (
|
||||
speciesId in Overrides.OPP_FORM_OVERRIDES &&
|
||||
Overrides.OPP_FORM_OVERRIDES[speciesId] &&
|
||||
!isNullOrUndefined(Overrides.OPP_FORM_OVERRIDES[speciesId]) &&
|
||||
this.species.forms[Overrides.OPP_FORM_OVERRIDES[speciesId]]
|
||||
) {
|
||||
this.formIndex = Overrides.OPP_FORM_OVERRIDES[speciesId] ?? 0;
|
||||
this.formIndex = Overrides.OPP_FORM_OVERRIDES[speciesId];
|
||||
}
|
||||
|
||||
if (!dataSource) {
|
||||
|
@ -9,7 +9,6 @@ import {
|
||||
TrainerSlot,
|
||||
trainerConfigs,
|
||||
trainerPartyTemplates,
|
||||
signatureSpecies,
|
||||
TeraAIMode,
|
||||
} from "#app/data/trainer-config";
|
||||
import type { EnemyPokemon } from "#app/field/pokemon";
|
||||
@ -22,6 +21,7 @@ import i18next from "i18next";
|
||||
import { PartyMemberStrength } from "#enums/party-member-strength";
|
||||
import { Species } from "#enums/species";
|
||||
import { TrainerType } from "#enums/trainer-type";
|
||||
import { signatureSpecies } from "#app/data/balance/signature-species";
|
||||
|
||||
export enum TrainerVariant {
|
||||
DEFAULT,
|
||||
|
@ -79,6 +79,7 @@ export class LoadingScene extends SceneBase {
|
||||
this.loadImage("icon_owned", "ui");
|
||||
this.loadImage("icon_egg_move", "ui");
|
||||
this.loadImage("ability_bar_left", "ui");
|
||||
this.loadImage("ability_bar_right", "ui");
|
||||
this.loadImage("bgm_bar", "ui");
|
||||
this.loadImage("party_exp_bar", "ui");
|
||||
this.loadImage("achv_bar", "ui");
|
||||
|
@ -1,5 +1,3 @@
|
||||
/* eslint-disable @typescript-eslint/no-unused-vars */
|
||||
/* eslint-disable @typescript-eslint/consistent-type-imports */
|
||||
import { type PokeballCounts } from "#app/battle-scene";
|
||||
import { EvolutionItem } from "#app/data/balance/pokemon-evolutions";
|
||||
import { Gender } from "#app/data/gender";
|
||||
|
@ -1,11 +1,7 @@
|
||||
import { globalScene } from "#app/global-scene";
|
||||
|
||||
export class Phase {
|
||||
start() {
|
||||
if (globalScene.abilityBar.shown) {
|
||||
globalScene.abilityBar.resetAutoHideTimer();
|
||||
}
|
||||
}
|
||||
start() {}
|
||||
|
||||
end() {
|
||||
globalScene.shiftPhase();
|
||||
|
27
src/phases/hide-ability-phase.ts
Normal file
27
src/phases/hide-ability-phase.ts
Normal file
@ -0,0 +1,27 @@
|
||||
import { globalScene } from "#app/global-scene";
|
||||
import type { BattlerIndex } from "#app/battle";
|
||||
import { PokemonPhase } from "./pokemon-phase";
|
||||
|
||||
export class HideAbilityPhase extends PokemonPhase {
|
||||
private passive: boolean;
|
||||
|
||||
constructor(battlerIndex: BattlerIndex, passive = false) {
|
||||
super(battlerIndex);
|
||||
|
||||
this.passive = passive;
|
||||
}
|
||||
|
||||
start() {
|
||||
super.start();
|
||||
|
||||
const pokemon = this.getPokemon();
|
||||
|
||||
if (pokemon) {
|
||||
globalScene.abilityBar.hide().then(() => {
|
||||
this.end();
|
||||
});
|
||||
} else {
|
||||
this.end();
|
||||
}
|
||||
}
|
||||
}
|
@ -61,12 +61,4 @@ export class MessagePhase extends Phase {
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
end() {
|
||||
if (globalScene.abilityBar.shown) {
|
||||
globalScene.abilityBar.hide();
|
||||
}
|
||||
|
||||
super.end();
|
||||
}
|
||||
}
|
||||
|
@ -5,6 +5,8 @@ import { EFFECTIVE_STATS, BATTLE_STATS } from "#enums/stat";
|
||||
import { PokemonMove } from "#app/field/pokemon";
|
||||
import { globalScene } from "#app/global-scene";
|
||||
import { PokemonPhase } from "./pokemon-phase";
|
||||
import { getPokemonNameWithAffix } from "#app/messages";
|
||||
import i18next from "i18next";
|
||||
|
||||
/**
|
||||
* Transforms a Pokemon into another Pokemon on the field.
|
||||
@ -62,6 +64,13 @@ export class PokemonTransformPhase extends PokemonPhase {
|
||||
globalScene.playSound("battle_anims/PRSFX- Transform");
|
||||
}
|
||||
|
||||
globalScene.queueMessage(
|
||||
i18next.t("abilityTriggers:postSummonTransform", {
|
||||
pokemonNameWithAffix: getPokemonNameWithAffix(user),
|
||||
targetName: target.name,
|
||||
}),
|
||||
);
|
||||
|
||||
promises.push(
|
||||
user.loadAssets(false).then(() => {
|
||||
user.playAnim();
|
||||
|
@ -53,6 +53,7 @@ export class SelectStarterPhase extends Phase {
|
||||
let starterFormIndex = Math.min(starterProps.formIndex, Math.max(starter.species.forms.length - 1, 0));
|
||||
if (
|
||||
starter.species.speciesId in Overrides.STARTER_FORM_OVERRIDES &&
|
||||
!Utils.isNullOrUndefined(Overrides.STARTER_FORM_OVERRIDES[starter.species.speciesId]) &&
|
||||
starter.species.forms[Overrides.STARTER_FORM_OVERRIDES[starter.species.speciesId]!]
|
||||
) {
|
||||
starterFormIndex = Overrides.STARTER_FORM_OVERRIDES[starter.species.speciesId]!;
|
||||
|
@ -1,36 +1,60 @@
|
||||
import { globalScene } from "#app/global-scene";
|
||||
import type { BattlerIndex } from "#app/battle";
|
||||
import { PokemonPhase } from "./pokemon-phase";
|
||||
import { getPokemonNameWithAffix } from "#app/messages";
|
||||
import { HideAbilityPhase } from "#app/phases/hide-ability-phase";
|
||||
|
||||
export class ShowAbilityPhase extends PokemonPhase {
|
||||
private passive: boolean;
|
||||
private pokemonName: string;
|
||||
private abilityName: string;
|
||||
private pokemonOnField: boolean;
|
||||
|
||||
constructor(battlerIndex: BattlerIndex, passive = false) {
|
||||
super(battlerIndex);
|
||||
|
||||
this.passive = passive;
|
||||
|
||||
const pokemon = this.getPokemon();
|
||||
if (pokemon) {
|
||||
// Set these now as the pokemon object may change before the queued phase is run
|
||||
this.pokemonName = getPokemonNameWithAffix(pokemon);
|
||||
this.abilityName = (passive ? this.getPokemon().getPassiveAbility() : this.getPokemon().getAbility()).name;
|
||||
this.pokemonOnField = true;
|
||||
} else {
|
||||
this.pokemonOnField = false;
|
||||
}
|
||||
}
|
||||
|
||||
start() {
|
||||
super.start();
|
||||
|
||||
if (!this.pokemonOnField || !this.getPokemon()) {
|
||||
return this.end();
|
||||
}
|
||||
|
||||
// If the bar is already out, hide it before showing the new one
|
||||
if (globalScene.abilityBar.isVisible()) {
|
||||
globalScene.unshiftPhase(new HideAbilityPhase(this.battlerIndex, this.passive));
|
||||
globalScene.unshiftPhase(new ShowAbilityPhase(this.battlerIndex, this.passive));
|
||||
return this.end();
|
||||
}
|
||||
|
||||
const pokemon = this.getPokemon();
|
||||
|
||||
if (pokemon) {
|
||||
if (!pokemon.isPlayer()) {
|
||||
/** If its an enemy pokemon, list it as last enemy to use ability or move */
|
||||
globalScene.currentBattle.lastEnemyInvolved = pokemon.getBattlerIndex() % 2;
|
||||
} else {
|
||||
globalScene.currentBattle.lastPlayerInvolved = pokemon.getBattlerIndex() % 2;
|
||||
}
|
||||
|
||||
globalScene.abilityBar.showAbility(pokemon, this.passive);
|
||||
if (!pokemon.isPlayer()) {
|
||||
/** If its an enemy pokemon, list it as last enemy to use ability or move */
|
||||
globalScene.currentBattle.lastEnemyInvolved = pokemon.getBattlerIndex() % 2;
|
||||
} else {
|
||||
globalScene.currentBattle.lastPlayerInvolved = pokemon.getBattlerIndex() % 2;
|
||||
}
|
||||
|
||||
globalScene.abilityBar.showAbility(this.pokemonName, this.abilityName, this.passive, this.player).then(() => {
|
||||
if (pokemon?.battleData) {
|
||||
pokemon.battleData.abilityRevealed = true;
|
||||
}
|
||||
}
|
||||
|
||||
this.end();
|
||||
this.end();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -1,31 +1,33 @@
|
||||
import { getPokemonNameWithAffix } from "#app/messages";
|
||||
import { globalScene } from "#app/global-scene";
|
||||
import type Pokemon from "../field/pokemon";
|
||||
import { TextStyle, addTextObject } from "./text";
|
||||
import i18next from "i18next";
|
||||
|
||||
const hiddenX = -118;
|
||||
const shownX = 0;
|
||||
const barWidth = 118;
|
||||
const screenLeft = 0;
|
||||
const baseY = -116;
|
||||
|
||||
export default class AbilityBar extends Phaser.GameObjects.Container {
|
||||
private bg: Phaser.GameObjects.Image;
|
||||
private abilityBars: Phaser.GameObjects.Image[];
|
||||
private abilityBarText: Phaser.GameObjects.Text;
|
||||
|
||||
private tween: Phaser.Tweens.Tween | null;
|
||||
private autoHideTimer: NodeJS.Timeout | null;
|
||||
|
||||
public shown: boolean;
|
||||
private player: boolean;
|
||||
private screenRight: number; // hold screenRight in case size changes between show and hide
|
||||
private shown: boolean;
|
||||
|
||||
constructor() {
|
||||
super(globalScene, hiddenX, baseY);
|
||||
super(globalScene, barWidth, baseY);
|
||||
this.abilityBars = [];
|
||||
this.player = true;
|
||||
this.shown = false;
|
||||
}
|
||||
|
||||
setup(): void {
|
||||
this.bg = globalScene.add.image(0, 0, "ability_bar_left");
|
||||
this.bg.setOrigin(0, 0);
|
||||
|
||||
this.add(this.bg);
|
||||
for (const key of ["ability_bar_right", "ability_bar_left"]) {
|
||||
const bar = globalScene.add.image(0, 0, key);
|
||||
bar.setOrigin(0, 0);
|
||||
bar.setVisible(false);
|
||||
this.add(bar);
|
||||
this.abilityBars.push(bar);
|
||||
}
|
||||
|
||||
this.abilityBarText = addTextObject(15, 3, "", TextStyle.MESSAGE, {
|
||||
fontSize: "72px",
|
||||
@ -33,72 +35,80 @@ export default class AbilityBar extends Phaser.GameObjects.Container {
|
||||
this.abilityBarText.setOrigin(0, 0);
|
||||
this.abilityBarText.setWordWrapWidth(600, true);
|
||||
this.add(this.abilityBarText);
|
||||
this.bringToTop(this.abilityBarText);
|
||||
|
||||
this.setVisible(false);
|
||||
this.shown = false;
|
||||
this.setX(-barWidth); // start hidden (right edge of bar at x=0)
|
||||
}
|
||||
|
||||
showAbility(pokemon: Pokemon, passive = false): void {
|
||||
this.abilityBarText.setText(
|
||||
`${i18next.t("fightUiHandler:abilityFlyInText", { pokemonName: getPokemonNameWithAffix(pokemon), passive: passive ? i18next.t("fightUiHandler:passive") : "", abilityName: !passive ? pokemon.getAbility().name : pokemon.getPassiveAbility().name })}`,
|
||||
);
|
||||
public override setVisible(value: boolean): this {
|
||||
this.abilityBars[+this.player].setVisible(value);
|
||||
this.shown = value;
|
||||
return this;
|
||||
}
|
||||
|
||||
if (this.shown) {
|
||||
return;
|
||||
public async startTween(config: any, text?: string): Promise<void> {
|
||||
this.setVisible(true);
|
||||
if (text) {
|
||||
this.abilityBarText.setText(text);
|
||||
}
|
||||
return new Promise(resolve => {
|
||||
globalScene.tweens.add({
|
||||
...config,
|
||||
onComplete: () => {
|
||||
if (config.onComplete) {
|
||||
config.onComplete();
|
||||
}
|
||||
resolve();
|
||||
},
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
public async showAbility(pokemonName: string, abilityName: string, passive = false, player = true): Promise<void> {
|
||||
const text = `${i18next.t("fightUiHandler:abilityFlyInText", { pokemonName: pokemonName, passive: passive ? i18next.t("fightUiHandler:passive") : "", abilityName: abilityName })}`;
|
||||
this.screenRight = globalScene.scaledCanvas.width;
|
||||
if (player !== this.player) {
|
||||
// Move the bar if it has changed from the player to enemy side (or vice versa)
|
||||
this.setX(player ? -barWidth : this.screenRight);
|
||||
this.player = player;
|
||||
}
|
||||
globalScene.fieldUI.bringToTop(this);
|
||||
|
||||
this.y = baseY + (globalScene.currentBattle.double ? 14 : 0);
|
||||
this.tween = globalScene.tweens.add({
|
||||
targets: this,
|
||||
x: shownX,
|
||||
duration: 500,
|
||||
ease: "Sine.easeOut",
|
||||
onComplete: () => {
|
||||
this.tween = null;
|
||||
this.resetAutoHideTimer();
|
||||
},
|
||||
});
|
||||
let y = baseY;
|
||||
if (this.player) {
|
||||
y += globalScene.currentBattle.double ? 14 : 0;
|
||||
} else {
|
||||
y -= globalScene.currentBattle.double ? 28 : 14;
|
||||
}
|
||||
|
||||
this.setVisible(true);
|
||||
this.shown = true;
|
||||
this.setY(y);
|
||||
|
||||
return this.startTween(
|
||||
{
|
||||
targets: this,
|
||||
x: this.player ? screenLeft : this.screenRight - barWidth,
|
||||
duration: 500,
|
||||
ease: "Sine.easeOut",
|
||||
hold: 1000,
|
||||
},
|
||||
text,
|
||||
);
|
||||
}
|
||||
|
||||
hide(): void {
|
||||
if (!this.shown) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.autoHideTimer) {
|
||||
clearInterval(this.autoHideTimer);
|
||||
}
|
||||
|
||||
if (this.tween) {
|
||||
this.tween.stop();
|
||||
}
|
||||
|
||||
this.tween = globalScene.tweens.add({
|
||||
public async hide(): Promise<void> {
|
||||
return this.startTween({
|
||||
targets: this,
|
||||
x: -91,
|
||||
duration: 500,
|
||||
x: this.player ? -barWidth : this.screenRight,
|
||||
duration: 200,
|
||||
ease: "Sine.easeIn",
|
||||
onComplete: () => {
|
||||
this.tween = null;
|
||||
this.setVisible(false);
|
||||
},
|
||||
});
|
||||
|
||||
this.shown = false;
|
||||
}
|
||||
|
||||
resetAutoHideTimer(): void {
|
||||
if (this.autoHideTimer) {
|
||||
clearInterval(this.autoHideTimer);
|
||||
}
|
||||
this.autoHideTimer = setTimeout(() => {
|
||||
this.hide();
|
||||
this.autoHideTimer = null;
|
||||
}, 2500);
|
||||
public isVisible(): boolean {
|
||||
return this.shown;
|
||||
}
|
||||
}
|
||||
|
@ -68,7 +68,7 @@ describe("Moves - Secret Power", () => {
|
||||
await game.classicMode.startBattle([Species.BLASTOISE, Species.CHARIZARD]);
|
||||
|
||||
const sereneGraceAttr = allAbilities[Abilities.SERENE_GRACE].getAttrs(MoveEffectChanceMultiplierAbAttr)[0];
|
||||
vi.spyOn(sereneGraceAttr, "apply");
|
||||
vi.spyOn(sereneGraceAttr, "canApply");
|
||||
|
||||
game.move.select(Moves.WATER_PLEDGE, 0, BattlerIndex.ENEMY);
|
||||
game.move.select(Moves.FIRE_PLEDGE, 1, BattlerIndex.ENEMY_2);
|
||||
@ -86,8 +86,8 @@ describe("Moves - Secret Power", () => {
|
||||
|
||||
await game.phaseInterceptor.to("BerryPhase", false);
|
||||
|
||||
expect(sereneGraceAttr.apply).toHaveBeenCalledOnce();
|
||||
expect(sereneGraceAttr.apply).toHaveLastReturnedWith(true);
|
||||
expect(sereneGraceAttr.canApply).toHaveBeenCalledOnce();
|
||||
expect(sereneGraceAttr.canApply).toHaveLastReturnedWith(true);
|
||||
|
||||
expect(rainbowEffect.apply).toHaveBeenCalledTimes(0);
|
||||
});
|
||||
|
Loading…
Reference in New Issue
Block a user