Merge branch 'beta' of https://github.com/pagefaultgames/pokerogue into beta
Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 55 KiB |
Before Width: | Height: | Size: 405 B After Width: | Height: | Size: 405 B |
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 12 KiB |
@ -1,38 +1,49 @@
|
||||
{
|
||||
"0": {
|
||||
"bc4524": "af5457",
|
||||
"31638c": "324a26",
|
||||
"101010": "101010",
|
||||
"5aa5ce": "40683c",
|
||||
"a5e6ff": "b6d9ac",
|
||||
"7bceef": "789c6e",
|
||||
"ced6ef": "c09e99",
|
||||
"737384": "774644",
|
||||
"ce4252": "af2c4f",
|
||||
"ffffff": "f1dcd8",
|
||||
"8c4231": "420b0c",
|
||||
"ffde4a": "c66f68",
|
||||
"c57b31": "551917",
|
||||
"ffffad": "f4bfb6",
|
||||
"ffde4a": "c66f68",
|
||||
"7bceef": "789c6e",
|
||||
"a5e6ff": "b6d9ac",
|
||||
"737384": "774644",
|
||||
"f7b531": "af5457",
|
||||
"ce4252": "af2c4f",
|
||||
"bc4524": "af5457",
|
||||
"00e5e7": "00e5e7"
|
||||
"c57b31": "551917",
|
||||
"ced6ef": "c09e99"
|
||||
},
|
||||
"1": {
|
||||
"bc4524": "3d325e",
|
||||
"31638c": "143a72",
|
||||
"101010": "101010",
|
||||
"5aa5ce": "4060bc",
|
||||
"a5e6ff": "b4b3ff",
|
||||
"7bceef": "657ddf",
|
||||
"ced6ef": "a8b5dd",
|
||||
"737384": "737384",
|
||||
"ce4252": "b75558",
|
||||
"ffffff": "e5ecff",
|
||||
"8c4231": "17103f",
|
||||
"ffde4a": "534e72",
|
||||
"c57b31": "2a1f50",
|
||||
"ffffad": "87879b",
|
||||
"ffde4a": "534e72",
|
||||
"7bceef": "657ddf",
|
||||
"a5e6ff": "b4b3ff",
|
||||
"f7b531": "3d325e",
|
||||
"ce4252": "b75558",
|
||||
"bc4524": "3d325e",
|
||||
"00e5e7": "00e5e7"
|
||||
"c57b31": "2a1f50",
|
||||
"ced6ef": "a8b5dd"
|
||||
},
|
||||
"2": {
|
||||
"ce4252": "215991",
|
||||
"ffde4a": "f16f40",
|
||||
"ffffad": "ffb274",
|
||||
"737384": "884c43",
|
||||
"c57b31": "761c03",
|
||||
"7bceef": "be3d2f",
|
||||
"8c4231": "5a0700",
|
||||
"5aa5ce": "892722",
|
||||
"8c4232": "761c03",
|
||||
"ffffff": "f5e1d1",
|
||||
"a5e6ff": "dd533a",
|
||||
"f7b531": "bc4524",
|
||||
"ced6ef": "d19e92",
|
||||
"31638c": "610f0e"
|
||||
}
|
||||
}
|
Before Width: | Height: | Size: 30 KiB |
Before Width: | Height: | Size: 29 KiB |
Before Width: | Height: | Size: 30 KiB |
@ -1017,7 +1017,7 @@
|
||||
"279": [
|
||||
1,
|
||||
1,
|
||||
2
|
||||
1
|
||||
],
|
||||
"280": [
|
||||
0,
|
||||
|
@ -13,7 +13,6 @@ import { TrainerType } from "#enums/trainer-type";
|
||||
import { Nature } from "./nature";
|
||||
import { Moves } from "#app/enums/moves.js";
|
||||
import { TypeColor, TypeShadow } from "#app/enums/color.js";
|
||||
import { Gender } from "./gender";
|
||||
import { pokemonEvolutions } from "./pokemon-evolutions";
|
||||
import { pokemonFormChanges } from "./pokemon-forms";
|
||||
|
||||
@ -659,7 +658,6 @@ export class FreshStartChallenge extends Challenge {
|
||||
pokemon.luck = 0; // No luck
|
||||
pokemon.shiny = false; // Not shiny
|
||||
pokemon.variant = 0; // Not shiny
|
||||
pokemon.gender = Gender.MALE; // Starters default to male
|
||||
pokemon.formIndex = 0; // Froakie should be base form
|
||||
pokemon.ivs = [10, 10, 10, 10, 10, 10]; // Default IVs of 10 for all stats
|
||||
return true;
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { BattleSpec } from "#enums/battle-spec";
|
||||
import { TrainerType } from "#enums/trainer-type";
|
||||
import {trainerConfigs} from "./trainer-config";
|
||||
import { trainerConfigs } from "./trainer-config";
|
||||
|
||||
export interface TrainerTypeMessages {
|
||||
encounter?: string | string[],
|
||||
@ -707,6 +707,20 @@ export const trainerTypeDialogue: TrainerTypeDialogue = {
|
||||
]
|
||||
}
|
||||
],
|
||||
[TrainerType.ROOD]: [
|
||||
{
|
||||
encounter: [
|
||||
"dialogue:rood.encounter.1",
|
||||
"dialogue:rood.encounter.2",
|
||||
"dialogue:rood.encounter.3",
|
||||
],
|
||||
victory: [
|
||||
"dialogue:rood.victory.1",
|
||||
"dialogue:rood.victory.2",
|
||||
"dialogue:rood.victory.3",
|
||||
]
|
||||
}
|
||||
],
|
||||
[TrainerType.FLARE_GRUNT]: [
|
||||
{
|
||||
encounter: [
|
||||
|
@ -66,34 +66,34 @@ export enum FormChangeItem {
|
||||
|
||||
BLUE_ORB = 50,
|
||||
RED_ORB,
|
||||
SHARP_METEORITE,
|
||||
HARD_METEORITE,
|
||||
SMOOTH_METEORITE,
|
||||
ADAMANT_CRYSTAL,
|
||||
LUSTROUS_GLOBE,
|
||||
GRISEOUS_CORE,
|
||||
REVEAL_GLASS,
|
||||
GRACIDEA,
|
||||
MAX_MUSHROOMS,
|
||||
DARK_STONE,
|
||||
LIGHT_STONE,
|
||||
PRISON_BOTTLE,
|
||||
N_LUNARIZER,
|
||||
N_SOLARIZER,
|
||||
RUSTED_SWORD,
|
||||
RUSTED_SHIELD,
|
||||
ICY_REINS_OF_UNITY,
|
||||
SHADOW_REINS_OF_UNITY,
|
||||
WELLSPRING_MASK,
|
||||
HEARTHFLAME_MASK,
|
||||
CORNERSTONE_MASK,
|
||||
ULTRANECROZIUM_Z,
|
||||
|
||||
SHARP_METEORITE = 100,
|
||||
HARD_METEORITE,
|
||||
SMOOTH_METEORITE,
|
||||
GRACIDEA,
|
||||
SHOCK_DRIVE,
|
||||
BURN_DRIVE,
|
||||
CHILL_DRIVE,
|
||||
DOUSE_DRIVE,
|
||||
ULTRANECROZIUM_Z,
|
||||
|
||||
FIST_PLATE = 100,
|
||||
N_SOLARIZER,
|
||||
N_LUNARIZER,
|
||||
WELLSPRING_MASK,
|
||||
HEARTHFLAME_MASK,
|
||||
CORNERSTONE_MASK,
|
||||
FIST_PLATE,
|
||||
SKY_PLATE,
|
||||
TOXIC_PLATE,
|
||||
EARTH_PLATE,
|
||||
@ -129,7 +129,7 @@ export enum FormChangeItem {
|
||||
DRAGON_MEMORY,
|
||||
DARK_MEMORY,
|
||||
FAIRY_MEMORY,
|
||||
BLANK_MEMORY // TODO: Find a potential use for this
|
||||
NORMAL_MEMORY // TODO: Find a potential use for this
|
||||
}
|
||||
|
||||
export type SpeciesFormChangeConditionPredicate = (p: Pokemon) => boolean;
|
||||
|
@ -604,6 +604,6 @@
|
||||
"DRAGON_MEMORY": "Drachen-Disc",
|
||||
"DARK_MEMORY": "Unlicht-Disc",
|
||||
"FAIRY_MEMORY": "Feen-Disc",
|
||||
"BLANK_MEMORY": "Leere-Disc"
|
||||
"NORMAL_MEMORY": "Normal-Disc"
|
||||
}
|
||||
}
|
@ -10,5 +10,5 @@
|
||||
"eternamaxChange": "{{preName}} hat sich zu {{pokemonName}} unendynamaximiert!",
|
||||
"revertChange": "{{pokemonName}} hat seine ursprüngliche Form zurückerlangt!",
|
||||
"formChange": "{{preName}} hat seine Form geändert!",
|
||||
"disguiseChange": "Its disguise served it as a decoy!"
|
||||
"disguiseChange": "Sein Kostüm hat die Attacke absorbiert!"
|
||||
}
|
@ -1,268 +0,0 @@
|
||||
{
|
||||
"Achievements": {
|
||||
"name": "Achievements"
|
||||
},
|
||||
"Locked": {
|
||||
"name": "Locked"
|
||||
},
|
||||
"MoneyAchv": {
|
||||
"description": "Accumulate a total of ₽{{moneyAmount}}"
|
||||
},
|
||||
"10K_MONEY": {
|
||||
"name": "Money Haver"
|
||||
},
|
||||
"100K_MONEY": {
|
||||
"name": "Rich"
|
||||
},
|
||||
"1M_MONEY": {
|
||||
"name": "Millionaire"
|
||||
},
|
||||
"10M_MONEY": {
|
||||
"name": "One Percenter"
|
||||
},
|
||||
"DamageAchv": {
|
||||
"description": "Inflict {{damageAmount}} damage in one hit"
|
||||
},
|
||||
"250_DMG": {
|
||||
"name": "Hard Hitter"
|
||||
},
|
||||
"1000_DMG": {
|
||||
"name": "Harder Hitter"
|
||||
},
|
||||
"2500_DMG": {
|
||||
"name": "That's a Lotta Damage!"
|
||||
},
|
||||
"10000_DMG": {
|
||||
"name": "One Punch Man"
|
||||
},
|
||||
"HealAchv": {
|
||||
"description": "Heal {{healAmount}} {{HP}} at once with a move, ability, or held item"
|
||||
},
|
||||
"250_HEAL": {
|
||||
"name": "Novice Healer"
|
||||
},
|
||||
"1000_HEAL": {
|
||||
"name": "Big Healer"
|
||||
},
|
||||
"2500_HEAL": {
|
||||
"name": "Cleric"
|
||||
},
|
||||
"10000_HEAL": {
|
||||
"name": "Recovery Master"
|
||||
},
|
||||
"LevelAchv": {
|
||||
"description": "Level up a Pokémon to Lv{{level}}"
|
||||
},
|
||||
"LV_100": {
|
||||
"name": "But Wait, There's More!"
|
||||
},
|
||||
"LV_250": {
|
||||
"name": "Elite"
|
||||
},
|
||||
"LV_1000": {
|
||||
"name": "To Go Even Further Beyond"
|
||||
},
|
||||
"RibbonAchv": {
|
||||
"description": "Accumulate a total of {{ribbonAmount}} Ribbons"
|
||||
},
|
||||
"10_RIBBONS": {
|
||||
"name": "Pokémon League Champion"
|
||||
},
|
||||
"25_RIBBONS": {
|
||||
"name": "Great League Champion"
|
||||
},
|
||||
"50_RIBBONS": {
|
||||
"name": "Ultra League Champion"
|
||||
},
|
||||
"75_RIBBONS": {
|
||||
"name": "Rogue League Champion"
|
||||
},
|
||||
"100_RIBBONS": {
|
||||
"name": "Master League Champion"
|
||||
},
|
||||
"TRANSFER_MAX_BATTLE_STAT": {
|
||||
"name": "Teamwork",
|
||||
"description": "Baton pass to another party member with at least one stat maxed out"
|
||||
},
|
||||
"MAX_FRIENDSHIP": {
|
||||
"name": "Friendmaxxing",
|
||||
"description": "Reach max friendship on a Pokémon"
|
||||
},
|
||||
"MEGA_EVOLVE": {
|
||||
"name": "Megamorph",
|
||||
"description": "Mega evolve a Pokémon"
|
||||
},
|
||||
"GIGANTAMAX": {
|
||||
"name": "Absolute Unit",
|
||||
"description": "Gigantamax a Pokémon"
|
||||
},
|
||||
"TERASTALLIZE": {
|
||||
"name": "STAB Enthusiast",
|
||||
"description": "Terastallize a Pokémon"
|
||||
},
|
||||
"STELLAR_TERASTALLIZE": {
|
||||
"name": "The Hidden Type",
|
||||
"description": "Stellar Terastallize a Pokémon"
|
||||
},
|
||||
"SPLICE": {
|
||||
"name": "Infinite Fusion",
|
||||
"description": "Splice two Pokémon together with DNA Splicers"
|
||||
},
|
||||
"MINI_BLACK_HOLE": {
|
||||
"name": "A Hole Lot of Items",
|
||||
"description": "Acquire a Mini Black Hole"
|
||||
},
|
||||
"CATCH_MYTHICAL": {
|
||||
"name": "Mythical",
|
||||
"description": "Catch a mythical Pokémon"
|
||||
},
|
||||
"CATCH_SUB_LEGENDARY": {
|
||||
"name": "(Sub-)Legendary",
|
||||
"description": "Catch a sub-legendary Pokémon"
|
||||
},
|
||||
"CATCH_LEGENDARY": {
|
||||
"name": "Legendary",
|
||||
"description": "Catch a legendary Pokémon"
|
||||
},
|
||||
"SEE_SHINY": {
|
||||
"name": "Shiny",
|
||||
"description": "Find a shiny Pokémon in the wild"
|
||||
},
|
||||
"SHINY_PARTY": {
|
||||
"name": "That's Dedication",
|
||||
"description": "Have a full party of shiny Pokémon"
|
||||
},
|
||||
"HATCH_MYTHICAL": {
|
||||
"name": "Mythical Egg",
|
||||
"description": "Hatch a mythical Pokémon from an egg"
|
||||
},
|
||||
"HATCH_SUB_LEGENDARY": {
|
||||
"name": "Sub-Legendary Egg",
|
||||
"description": "Hatch a sub-legendary Pokémon from an egg"
|
||||
},
|
||||
"HATCH_LEGENDARY": {
|
||||
"name": "Legendary Egg",
|
||||
"description": "Hatch a legendary Pokémon from an egg"
|
||||
},
|
||||
"HATCH_SHINY": {
|
||||
"name": "Shiny Egg",
|
||||
"description": "Hatch a shiny Pokémon from an egg"
|
||||
},
|
||||
"HIDDEN_ABILITY": {
|
||||
"name": "Hidden Potential",
|
||||
"description": "Catch a Pokémon with a hidden ability"
|
||||
},
|
||||
"PERFECT_IVS": {
|
||||
"name": "Certificate of Authenticity",
|
||||
"description": "Get perfect IVs on a Pokémon"
|
||||
},
|
||||
"CLASSIC_VICTORY": {
|
||||
"name": "Undefeated",
|
||||
"description": "Beat the game in classic mode"
|
||||
},
|
||||
"UNEVOLVED_CLASSIC_VICTORY": {
|
||||
"name": "Bring Your Child To Work Day",
|
||||
"description": "Beat the game in Classic Mode with at least one unevolved party member."
|
||||
},
|
||||
"MONO_GEN_ONE": {
|
||||
"name": "The Original Rival",
|
||||
"description": "Complete the generation one only challenge."
|
||||
},
|
||||
"MONO_GEN_TWO": {
|
||||
"name": "Generation 1.5",
|
||||
"description": "Complete the generation two only challenge."
|
||||
},
|
||||
"MONO_GEN_THREE": {
|
||||
"name": "Too much water?",
|
||||
"description": "Complete the generation three only challenge."
|
||||
},
|
||||
"MONO_GEN_FOUR": {
|
||||
"name": "Is she really the hardest?",
|
||||
"description": "Complete the generation four only challenge."
|
||||
},
|
||||
"MONO_GEN_FIVE": {
|
||||
"name": "All Original",
|
||||
"description": "Complete the generation five only challenge."
|
||||
},
|
||||
"MONO_GEN_SIX": {
|
||||
"name": "Almost Royalty",
|
||||
"description": "Complete the generation six only challenge."
|
||||
},
|
||||
"MONO_GEN_SEVEN": {
|
||||
"name": "Only Technically",
|
||||
"description": "Complete the generation seven only challenge."
|
||||
},
|
||||
"MONO_GEN_EIGHT": {
|
||||
"name": "A Champion Time!",
|
||||
"description": "Complete the generation eight only challenge."
|
||||
},
|
||||
"MONO_GEN_NINE": {
|
||||
"name": "She was going easy on you",
|
||||
"description": "Complete the generation nine only challenge."
|
||||
},
|
||||
"MonoType": {
|
||||
"description": "Complete the {{type}} monotype challenge."
|
||||
},
|
||||
"MONO_NORMAL": {
|
||||
"name": "Extra Ordinary"
|
||||
},
|
||||
"MONO_FIGHTING": {
|
||||
"name": "I Know Kung Fu"
|
||||
},
|
||||
"MONO_FLYING": {
|
||||
"name": "Angry Birds"
|
||||
},
|
||||
"MONO_POISON": {
|
||||
"name": "Kanto's Favourite"
|
||||
},
|
||||
"MONO_GROUND": {
|
||||
"name": "Forecast: Earthquakes"
|
||||
},
|
||||
"MONO_ROCK": {
|
||||
"name": "Brock Hard"
|
||||
},
|
||||
"MONO_BUG": {
|
||||
"name": "You Like Jazz?"
|
||||
},
|
||||
"MONO_GHOST": {
|
||||
"name": "Who You Gonna Call?"
|
||||
},
|
||||
"MONO_STEEL": {
|
||||
"name": "Iron Giant"
|
||||
},
|
||||
"MONO_FIRE": {
|
||||
"name": "I Cast Fireball!"
|
||||
},
|
||||
"MONO_WATER": {
|
||||
"name": "When It Rains, It Pours"
|
||||
},
|
||||
"MONO_GRASS": {
|
||||
"name": "Can't Touch This"
|
||||
},
|
||||
"MONO_ELECTRIC": {
|
||||
"name": "Aim For The Horn!"
|
||||
},
|
||||
"MONO_PSYCHIC": {
|
||||
"name": "Big Brain Energy"
|
||||
},
|
||||
"MONO_ICE": {
|
||||
"name": "Walking On Thin Ice"
|
||||
},
|
||||
"MONO_DRAGON": {
|
||||
"name": "Pseudo-Legend Club"
|
||||
},
|
||||
"MONO_DARK": {
|
||||
"name": "It's Just A Phase"
|
||||
},
|
||||
"MONO_FAIRY": {
|
||||
"name": "Hey! Listen!"
|
||||
},
|
||||
"FRESH_START": {
|
||||
"name": "First Try!",
|
||||
"description": "Complete the Fresh Start challenge."
|
||||
},
|
||||
"INVERSE_BATTLE": {
|
||||
"name": "Mirror rorriM",
|
||||
"description": "Complete the Inverse Battle challenge.\n.egnellahc elttaB esrevnI eht etelpmoC"
|
||||
}
|
||||
}
|
@ -450,6 +450,6 @@
|
||||
"DRAGON_MEMORY": "Dragon Memory",
|
||||
"DARK_MEMORY": "Dark Memory",
|
||||
"FAIRY_MEMORY": "Fairy Memory",
|
||||
"BLANK_MEMORY": "Blank Memory"
|
||||
"NORMAL_MEMORY": "Normal Memory"
|
||||
}
|
||||
}
|
||||
|
@ -604,6 +604,6 @@
|
||||
"DRAGON_MEMORY": "Disco dragón",
|
||||
"DARK_MEMORY": "Disco siniestro",
|
||||
"FAIRY_MEMORY": "Disco hada",
|
||||
"BLANK_MEMORY": "Disco en blanco"
|
||||
"NORMAL_MEMORY": "Disco normal"
|
||||
}
|
||||
}
|
||||
|
@ -450,6 +450,6 @@
|
||||
"DRAGON_MEMORY": "ROM Dragon",
|
||||
"DARK_MEMORY": "ROM Ténèbres",
|
||||
"FAIRY_MEMORY": "ROM Fée",
|
||||
"BLANK_MEMORY": "ROM Vierge"
|
||||
"NORMAL_MEMORY": "ROM Normal"
|
||||
}
|
||||
}
|
||||
|
@ -604,6 +604,6 @@
|
||||
"DRAGON_MEMORY": "ROM Drago",
|
||||
"DARK_MEMORY": "ROM Buio",
|
||||
"FAIRY_MEMORY": "ROM Folletto",
|
||||
"BLANK_MEMORY": "ROM Vuota"
|
||||
"NORMAL_MEMORY": "ROM Normale"
|
||||
}
|
||||
}
|
@ -604,6 +604,6 @@
|
||||
"DRAGON_MEMORY": "드래곤메모리",
|
||||
"DARK_MEMORY": "다크메모리",
|
||||
"FAIRY_MEMORY": "페어리메모리",
|
||||
"BLANK_MEMORY": "빈메모리"
|
||||
"NORMAL_MEMORY": "일반메모리"
|
||||
}
|
||||
}
|
@ -604,6 +604,6 @@
|
||||
"DRAGON_MEMORY": "Memória do Dragão",
|
||||
"DARK_MEMORY": "Memória Sombria",
|
||||
"FAIRY_MEMORY": "Memória de Fada",
|
||||
"BLANK_MEMORY": "Memória Vazia"
|
||||
"NORMAL_MEMORY": "Memória Normal"
|
||||
}
|
||||
}
|
||||
|
@ -604,6 +604,6 @@
|
||||
"DRAGON_MEMORY": "龙存储碟",
|
||||
"DARK_MEMORY": "黑暗存储碟",
|
||||
"FAIRY_MEMORY": "妖精存储碟",
|
||||
"BLANK_MEMORY": "空白存储碟"
|
||||
"NORMAL_MEMORY": "一般存储碟"
|
||||
}
|
||||
}
|
@ -600,6 +600,6 @@
|
||||
"DRAGON_MEMORY": "龍記憶碟",
|
||||
"DARK_MEMORY": "黑暗記憶碟",
|
||||
"FAIRY_MEMORY": "妖精記憶碟",
|
||||
"BLANK_MEMORY": "空白記憶碟"
|
||||
"NORMAL_MEMORY": "一般記憶碟"
|
||||
}
|
||||
}
|
@ -1220,7 +1220,7 @@ class EvolutionItemModifierTypeGenerator extends ModifierTypeGenerator {
|
||||
}
|
||||
|
||||
class FormChangeItemModifierTypeGenerator extends ModifierTypeGenerator {
|
||||
constructor() {
|
||||
constructor(rare: boolean) {
|
||||
super((party: Pokemon[], pregenArgs?: any[]) => {
|
||||
if (pregenArgs && (pregenArgs.length === 1) && (pregenArgs[0] in FormChangeItem)) {
|
||||
return new FormChangeItemModifierType(pregenArgs[0] as FormChangeItem);
|
||||
@ -1262,7 +1262,8 @@ class FormChangeItemModifierTypeGenerator extends ModifierTypeGenerator {
|
||||
}
|
||||
}
|
||||
return formChangeItemTriggers;
|
||||
}).flat().flatMap(fc => fc.item))];
|
||||
}).flat())
|
||||
].flat().flatMap(fc => fc.item).filter(i => (i && i < 100) === rare);
|
||||
// convert it into a set to remove duplicate values, which can appear when the same species with a potential form change is in the party.
|
||||
|
||||
if (!formChangeItemPool.length) {
|
||||
@ -1467,7 +1468,8 @@ export const modifierTypes = {
|
||||
|
||||
EVOLUTION_ITEM: () => new EvolutionItemModifierTypeGenerator(false),
|
||||
RARE_EVOLUTION_ITEM: () => new EvolutionItemModifierTypeGenerator(true),
|
||||
FORM_CHANGE_ITEM: () => new FormChangeItemModifierTypeGenerator(),
|
||||
FORM_CHANGE_ITEM: () => new FormChangeItemModifierTypeGenerator(false),
|
||||
RARE_FORM_CHANGE_ITEM: () => new FormChangeItemModifierTypeGenerator(true),
|
||||
FORCE_EVOLVE_ITEM: () => new EvolutionItemModifierType(EvolutionItem.SUPER_EVO_ITEM),
|
||||
FORCE_FUSE_EVOLVE_ITEM: () => new EvolutionItemModifierType(EvolutionItem.SUPER_EVO_ITEM_FUSION),
|
||||
|
||||
@ -2144,6 +2146,7 @@ const modifierPool: ModifierPool = {
|
||||
new WeightedModifierType(modifierTypes.PP_MAX, 3),
|
||||
new WeightedModifierType(modifierTypes.MINT, 4),
|
||||
new WeightedModifierType(modifierTypes.RARE_EVOLUTION_ITEM, (party: Pokemon[]) => Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 15) * 4, 32), 32),
|
||||
new WeightedModifierType(modifierTypes.FORM_CHANGE_ITEM, (party: Pokemon[]) => Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 50), 4) * 6, 24),
|
||||
new WeightedModifierType(modifierTypes.AMULET_COIN, skipInLastClassicWaveOrDefault(3)),
|
||||
new WeightedModifierType(modifierTypes.EVIOLITE, (party: Pokemon[]) => {
|
||||
if (evioliteOverride == "on" || (evioliteOverride != "off" && (!party[0].scene.gameMode.isFreshStartChallenge() && party[0].scene.gameData.unlocks[Unlockables.EVIOLITE]))) {
|
||||
@ -2210,7 +2213,7 @@ const modifierPool: ModifierPool = {
|
||||
new WeightedModifierType(modifierTypes.KINGS_ROCK, 3),
|
||||
new WeightedModifierType(modifierTypes.LOCK_CAPSULE, skipInLastClassicWaveOrDefault(3)),
|
||||
new WeightedModifierType(modifierTypes.SUPER_EXP_CHARM, skipInLastClassicWaveOrDefault(8)),
|
||||
new WeightedModifierType(modifierTypes.FORM_CHANGE_ITEM, (party: Pokemon[]) => Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 50), 4) * 6, 24),
|
||||
new WeightedModifierType(modifierTypes.RARE_FORM_CHANGE_ITEM, (party: Pokemon[]) => Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 50), 4) * 6, 24),
|
||||
new WeightedModifierType(modifierTypes.MEGA_BRACELET, (party: Pokemon[]) => Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 50), 4) * 9, 36),
|
||||
new WeightedModifierType(modifierTypes.DYNAMAX_BAND, (party: Pokemon[]) => Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 50), 4) * 9, 36),
|
||||
new WeightedModifierType(modifierTypes.VOUCHER_PLUS, (party: Pokemon[], rerollCount: integer) => !party[0].scene.gameMode.isDaily ? Math.max(3 - rerollCount * 1, 0) : 0, 3),
|
||||
@ -2952,7 +2955,7 @@ export class ModifierTypeOption {
|
||||
}
|
||||
|
||||
export function getPartyLuckValue(party: Pokemon[]): integer {
|
||||
const luck = Phaser.Math.Clamp(party.map(p => p.isFainted() ? 0 : p.getLuck())
|
||||
const luck = Phaser.Math.Clamp(party.map(p => p.isAllowedInBattle() ? p.getLuck() : 0)
|
||||
.reduce((total: integer, value: integer) => total += value, 0), 0, 14);
|
||||
return luck || 0;
|
||||
}
|
||||
|
@ -72,7 +72,7 @@ export class SwitchSummonPhase extends SummonPhase {
|
||||
i18next.t("battle:playerComeBack", { pokemonName: getPokemonNameWithAffix(pokemon) }) :
|
||||
i18next.t("battle:trainerComeBack", {
|
||||
trainerName: this.scene.currentBattle.trainer?.getName(!(this.fieldIndex % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER),
|
||||
pokemonName: getPokemonNameWithAffix(pokemon)
|
||||
pokemonName: pokemon.getNameToRender()
|
||||
})
|
||||
);
|
||||
this.scene.playSound("se/pb_rel");
|
||||
|
@ -1513,7 +1513,7 @@ export class GameData {
|
||||
};
|
||||
}
|
||||
|
||||
const defaultStarterAttr = DexAttr.NON_SHINY | DexAttr.MALE | DexAttr.DEFAULT_VARIANT | DexAttr.DEFAULT_FORM;
|
||||
const defaultStarterAttr = DexAttr.NON_SHINY | DexAttr.MALE | DexAttr.FEMALE | DexAttr.DEFAULT_VARIANT | DexAttr.DEFAULT_FORM;
|
||||
|
||||
const defaultStarterNatures: Nature[] = [];
|
||||
|
||||
@ -1944,6 +1944,7 @@ export class GameData {
|
||||
fixStarterData(systemData: SystemSaveData): void {
|
||||
for (const starterId of defaultStarterSpecies) {
|
||||
systemData.starterData[starterId].abilityAttr |= AbilityAttr.ABILITY_1;
|
||||
systemData.dexData[starterId].caughtAttr |= DexAttr.FEMALE;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,8 +1,6 @@
|
||||
import { allMoves } from "#app/data/move";
|
||||
import { Abilities } from "#app/enums/abilities";
|
||||
import { Stat } from "#app/enums/stat";
|
||||
import { DamagePhase } from "#app/phases/damage-phase";
|
||||
import { MoveEffectPhase } from "#app/phases/move-effect-phase";
|
||||
import { Moves } from "#enums/moves";
|
||||
import { Species } from "#enums/species";
|
||||
import GameManager from "#test/utils/gameManager";
|
||||
@ -26,18 +24,18 @@ describe("Abilities - Hustle", () => {
|
||||
|
||||
beforeEach(() => {
|
||||
game = new GameManager(phaserGame);
|
||||
game.override.ability(Abilities.HUSTLE);
|
||||
game.override.moveset([Moves.TACKLE, Moves.GIGA_DRAIN, Moves.FISSURE]);
|
||||
game.override.startingLevel(5);
|
||||
game.override.disableCrits();
|
||||
game.override.enemyLevel(5);
|
||||
game.override.enemyMoveset(SPLASH_ONLY);
|
||||
game.override.enemySpecies(Species.SHUCKLE);
|
||||
game.override.enemyAbility(Abilities.BALL_FETCH);
|
||||
game.override
|
||||
.ability(Abilities.HUSTLE)
|
||||
.moveset([Moves.TACKLE, Moves.GIGA_DRAIN, Moves.FISSURE])
|
||||
.disableCrits()
|
||||
.battleType("single")
|
||||
.enemyMoveset(SPLASH_ONLY)
|
||||
.enemySpecies(Species.SHUCKLE)
|
||||
.enemyAbility(Abilities.BALL_FETCH);
|
||||
});
|
||||
|
||||
it("increases the user's Attack stat by 50%", async () => {
|
||||
await game.startBattle([Species.PIKACHU]);
|
||||
await game.classicMode.startBattle([Species.PIKACHU]);
|
||||
const pikachu = game.scene.getPlayerPokemon()!;
|
||||
const atk = pikachu.stats[Stat.ATK];
|
||||
|
||||
@ -45,25 +43,25 @@ describe("Abilities - Hustle", () => {
|
||||
|
||||
game.move.select(Moves.TACKLE);
|
||||
await game.move.forceHit();
|
||||
await game.phaseInterceptor.to(DamagePhase);
|
||||
await game.phaseInterceptor.to("DamagePhase");
|
||||
|
||||
expect(pikachu.getBattleStat).toHaveReturnedWith(atk * 1.5);
|
||||
expect(pikachu.getBattleStat).toHaveReturnedWith(Math.floor(atk * 1.5));
|
||||
});
|
||||
|
||||
it("lowers the accuracy of the user's physical moves by 20%", async () => {
|
||||
await game.startBattle([Species.PIKACHU]);
|
||||
await game.classicMode.startBattle([Species.PIKACHU]);
|
||||
const pikachu = game.scene.getPlayerPokemon()!;
|
||||
|
||||
vi.spyOn(pikachu, "getAccuracyMultiplier");
|
||||
|
||||
game.move.select(Moves.TACKLE);
|
||||
await game.phaseInterceptor.to(MoveEffectPhase);
|
||||
await game.phaseInterceptor.to("MoveEffectPhase");
|
||||
|
||||
expect(pikachu.getAccuracyMultiplier).toHaveReturnedWith(0.8);
|
||||
});
|
||||
|
||||
it("does not affect non-physical moves", async () => {
|
||||
await game.startBattle([Species.PIKACHU]);
|
||||
await game.classicMode.startBattle([Species.PIKACHU]);
|
||||
const pikachu = game.scene.getPlayerPokemon()!;
|
||||
const spatk = pikachu.stats[Stat.SPATK];
|
||||
|
||||
@ -71,7 +69,7 @@ describe("Abilities - Hustle", () => {
|
||||
vi.spyOn(pikachu, "getAccuracyMultiplier");
|
||||
|
||||
game.move.select(Moves.GIGA_DRAIN);
|
||||
await game.phaseInterceptor.to(DamagePhase);
|
||||
await game.phaseInterceptor.to("DamagePhase");
|
||||
|
||||
expect(pikachu.getBattleStat).toHaveReturnedWith(spatk);
|
||||
expect(pikachu.getAccuracyMultiplier).toHaveReturnedWith(1);
|
||||
@ -81,7 +79,7 @@ describe("Abilities - Hustle", () => {
|
||||
game.override.startingLevel(100);
|
||||
game.override.enemyLevel(30);
|
||||
|
||||
await game.startBattle([Species.PIKACHU]);
|
||||
await game.classicMode.startBattle([Species.PIKACHU]);
|
||||
const pikachu = game.scene.getPlayerPokemon()!;
|
||||
const enemyPokemon = game.scene.getEnemyPokemon()!;
|
||||
|
||||
@ -89,7 +87,7 @@ describe("Abilities - Hustle", () => {
|
||||
vi.spyOn(allMoves[Moves.FISSURE], "calculateBattleAccuracy");
|
||||
|
||||
game.move.select(Moves.FISSURE);
|
||||
await game.phaseInterceptor.to(DamagePhase);
|
||||
await game.phaseInterceptor.to("DamagePhase");
|
||||
|
||||
expect(enemyPokemon.turnData.damageTaken).toBe(enemyPokemon.getMaxHp());
|
||||
expect(pikachu.getAccuracyMultiplier).toHaveReturnedWith(1);
|
||||
|
@ -1,5 +1,4 @@
|
||||
import { BattleStat } from "#app/data/battle-stat";
|
||||
import { TurnEndPhase } from "#app/phases/turn-end-phase";
|
||||
import { Abilities } from "#enums/abilities";
|
||||
import { Moves } from "#enums/moves";
|
||||
import { Species } from "#enums/species";
|
||||
@ -24,22 +23,23 @@ describe("Abilities - Wind Rider", () => {
|
||||
|
||||
beforeEach(() => {
|
||||
game = new GameManager(phaserGame);
|
||||
game.override.battleType("single");
|
||||
game.override.enemySpecies(Species.SHIFTRY);
|
||||
game.override.enemyAbility(Abilities.WIND_RIDER);
|
||||
game.override.moveset([Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM]);
|
||||
game.override.enemyMoveset(SPLASH_ONLY);
|
||||
game.override
|
||||
.battleType("single")
|
||||
.enemySpecies(Species.SHIFTRY)
|
||||
.enemyAbility(Abilities.WIND_RIDER)
|
||||
.moveset([Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM])
|
||||
.enemyMoveset(SPLASH_ONLY);
|
||||
});
|
||||
|
||||
it("takes no damage from wind moves and its Attack is increased by one stage when hit by one", async () => {
|
||||
await game.startBattle([Species.MAGIKARP]);
|
||||
await game.classicMode.startBattle([Species.MAGIKARP]);
|
||||
const shiftry = game.scene.getEnemyPokemon()!;
|
||||
|
||||
expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(0);
|
||||
|
||||
game.move.select(Moves.PETAL_BLIZZARD);
|
||||
|
||||
await game.phaseInterceptor.to(TurnEndPhase);
|
||||
await game.phaseInterceptor.to("TurnEndPhase");
|
||||
|
||||
expect(shiftry.isFullHp()).toBe(true);
|
||||
expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(1);
|
||||
@ -49,14 +49,14 @@ describe("Abilities - Wind Rider", () => {
|
||||
game.override.ability(Abilities.WIND_RIDER);
|
||||
game.override.enemySpecies(Species.MAGIKARP);
|
||||
|
||||
await game.startBattle([Species.SHIFTRY]);
|
||||
await game.classicMode.startBattle([Species.SHIFTRY]);
|
||||
const shiftry = game.scene.getPlayerPokemon()!;
|
||||
|
||||
expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(0);
|
||||
|
||||
game.move.select(Moves.TAILWIND);
|
||||
|
||||
await game.phaseInterceptor.to(TurnEndPhase);
|
||||
await game.phaseInterceptor.to("TurnEndPhase");
|
||||
|
||||
expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(1);
|
||||
});
|
||||
@ -65,7 +65,7 @@ describe("Abilities - Wind Rider", () => {
|
||||
game.override.ability(Abilities.WIND_RIDER);
|
||||
game.override.enemySpecies(Species.MAGIKARP);
|
||||
|
||||
await game.startBattle([Species.SHIFTRY]);
|
||||
await game.classicMode.startBattle([Species.SHIFTRY]);
|
||||
const magikarp = game.scene.getEnemyPokemon()!;
|
||||
const shiftry = game.scene.getPlayerPokemon()!;
|
||||
|
||||
@ -74,16 +74,18 @@ describe("Abilities - Wind Rider", () => {
|
||||
|
||||
game.move.select(Moves.TAILWIND);
|
||||
|
||||
await game.phaseInterceptor.to(TurnEndPhase);
|
||||
await game.phaseInterceptor.to("TurnEndPhase");
|
||||
|
||||
expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(1);
|
||||
expect(magikarp.summonData.battleStats[BattleStat.ATK]).toBe(0);
|
||||
});
|
||||
|
||||
it("does not increase Attack when Tailwind is present on opposing side", async () => {
|
||||
game.override.enemySpecies(Species.MAGIKARP);
|
||||
game.override
|
||||
.enemySpecies(Species.MAGIKARP)
|
||||
.ability(Abilities.WIND_RIDER);
|
||||
|
||||
await game.startBattle([Species.SHIFTRY]);
|
||||
await game.classicMode.startBattle([Species.SHIFTRY]);
|
||||
const magikarp = game.scene.getEnemyPokemon()!;
|
||||
const shiftry = game.scene.getPlayerPokemon()!;
|
||||
|
||||
@ -92,7 +94,7 @@ describe("Abilities - Wind Rider", () => {
|
||||
|
||||
game.move.select(Moves.TAILWIND);
|
||||
|
||||
await game.phaseInterceptor.to(TurnEndPhase);
|
||||
await game.phaseInterceptor.to("TurnEndPhase");
|
||||
|
||||
expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(1);
|
||||
expect(magikarp.summonData.battleStats[BattleStat.ATK]).toBe(0);
|
||||
@ -101,7 +103,7 @@ describe("Abilities - Wind Rider", () => {
|
||||
it("does not interact with Sandstorm", async () => {
|
||||
game.override.enemySpecies(Species.MAGIKARP);
|
||||
|
||||
await game.startBattle([Species.SHIFTRY]);
|
||||
await game.classicMode.startBattle([Species.SHIFTRY]);
|
||||
const shiftry = game.scene.getPlayerPokemon()!;
|
||||
|
||||
expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(0);
|
||||
@ -109,7 +111,7 @@ describe("Abilities - Wind Rider", () => {
|
||||
|
||||
game.move.select(Moves.SANDSTORM);
|
||||
|
||||
await game.phaseInterceptor.to(TurnEndPhase);
|
||||
await game.phaseInterceptor.to("TurnEndPhase");
|
||||
|
||||
expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(0);
|
||||
expect(shiftry.hp).lessThan(shiftry.getMaxHp());
|
||||
|
@ -1,5 +1,4 @@
|
||||
import GameManager from "#app/test/utils/gameManager";
|
||||
import { getMovePosition } from "#app/test/utils/gameManagerUtils";
|
||||
import { Moves } from "#enums/moves";
|
||||
import { Species } from "#enums/species";
|
||||
import Phaser from "phaser";
|
||||
@ -32,28 +31,28 @@ describe("Moves - Fake Out", () => {
|
||||
});
|
||||
|
||||
it("can only be used on the first turn a pokemon is sent out", async() => {
|
||||
await game.startBattle();
|
||||
await game.classicMode.startBattle();
|
||||
|
||||
const enemy = game.scene.getEnemyPokemon()!;
|
||||
|
||||
game.doAttack(getMovePosition(game.scene, 0, Moves.FAKE_OUT));
|
||||
game.move.select(Moves.FAKE_OUT);
|
||||
await game.toNextTurn();
|
||||
|
||||
expect(enemy.hp).toBeLessThan(enemy.getMaxHp());
|
||||
const postTurnOneHp = enemy.hp;
|
||||
|
||||
game.doAttack(getMovePosition(game.scene, 0, Moves.FAKE_OUT));
|
||||
game.move.select(Moves.FAKE_OUT);
|
||||
await game.toNextTurn();
|
||||
|
||||
expect(enemy.hp).toBe(postTurnOneHp);
|
||||
|
||||
game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH));
|
||||
game.move.select(Moves.SPLASH);
|
||||
await game.doKillOpponents();
|
||||
await game.toNextWave();
|
||||
|
||||
const newEnemy = game.scene.getEnemyPokemon()!;
|
||||
|
||||
game.doAttack(getMovePosition(game.scene, 0, Moves.FAKE_OUT));
|
||||
game.move.select(Moves.FAKE_OUT);
|
||||
await game.toNextTurn();
|
||||
|
||||
expect(newEnemy.hp).toBe(newEnemy.getMaxHp());
|
||||
@ -61,11 +60,11 @@ describe("Moves - Fake Out", () => {
|
||||
|
||||
it("can be used again if recalled and sent back out", async() => {
|
||||
game.override.startingWave(4);
|
||||
await game.startBattle();
|
||||
await game.classicMode.startBattle();
|
||||
|
||||
const enemy1 = game.scene.getEnemyPokemon()!;
|
||||
|
||||
game.doAttack(getMovePosition(game.scene, 0, Moves.FAKE_OUT));
|
||||
game.move.select(Moves.FAKE_OUT);
|
||||
await game.phaseInterceptor.to("MoveEndPhase");
|
||||
|
||||
expect(enemy1.hp).toBeLessThan(enemy1.getMaxHp());
|
||||
@ -73,7 +72,7 @@ describe("Moves - Fake Out", () => {
|
||||
await game.doKillOpponents();
|
||||
await game.toNextWave();
|
||||
|
||||
game.doAttack(getMovePosition(game.scene, 0, Moves.FAKE_OUT));
|
||||
game.move.select(Moves.FAKE_OUT);
|
||||
await game.toNextTurn();
|
||||
|
||||
const enemy2 = game.scene.getEnemyPokemon()!;
|
||||
|
@ -1,6 +1,5 @@
|
||||
import { BattlerIndex } from "#app/battle.js";
|
||||
import GameManager from "#app/test/utils/gameManager";
|
||||
import { getMovePosition } from "#app/test/utils/gameManagerUtils";
|
||||
import { Moves } from "#enums/moves";
|
||||
import { Species } from "#enums/species";
|
||||
import Phaser from "phaser";
|
||||
@ -35,11 +34,11 @@ describe("Moves - Gigaton Hammer", () => {
|
||||
});
|
||||
|
||||
it("can't be used two turns in a row", async() => {
|
||||
await game.startBattle();
|
||||
await game.classicMode.startBattle();
|
||||
|
||||
const enemy1 = game.scene.getEnemyPokemon()!;
|
||||
|
||||
game.doAttack(getMovePosition(game.scene, 0, Moves.GIGATON_HAMMER));
|
||||
game.move.select(Moves.GIGATON_HAMMER);
|
||||
await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]);
|
||||
await game.phaseInterceptor.to("MoveEndPhase");
|
||||
|
||||
@ -48,7 +47,7 @@ describe("Moves - Gigaton Hammer", () => {
|
||||
await game.doKillOpponents();
|
||||
await game.toNextWave();
|
||||
|
||||
game.doAttack(getMovePosition(game.scene, 0, Moves.GIGATON_HAMMER));
|
||||
game.move.select(Moves.GIGATON_HAMMER);
|
||||
await game.toNextTurn();
|
||||
|
||||
const enemy2 = game.scene.getEnemyPokemon()!;
|
||||
@ -58,11 +57,11 @@ describe("Moves - Gigaton Hammer", () => {
|
||||
|
||||
it("can be used again if recalled and sent back out", async() => {
|
||||
game.override.startingWave(4);
|
||||
await game.startBattle();
|
||||
await game.classicMode.startBattle();
|
||||
|
||||
const enemy1 = game.scene.getEnemyPokemon()!;
|
||||
|
||||
game.doAttack(getMovePosition(game.scene, 0, Moves.GIGATON_HAMMER));
|
||||
game.move.select(Moves.GIGATON_HAMMER);
|
||||
await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]);
|
||||
await game.phaseInterceptor.to("MoveEndPhase");
|
||||
|
||||
@ -71,7 +70,7 @@ describe("Moves - Gigaton Hammer", () => {
|
||||
await game.doKillOpponents();
|
||||
await game.toNextWave();
|
||||
|
||||
game.doAttack(getMovePosition(game.scene, 0, Moves.GIGATON_HAMMER));
|
||||
game.move.select(Moves.GIGATON_HAMMER);
|
||||
await game.toNextTurn();
|
||||
|
||||
const enemy2 = game.scene.getEnemyPokemon()!;
|
||||
|