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": {
|
"0": {
|
||||||
|
"bc4524": "af5457",
|
||||||
"31638c": "324a26",
|
"31638c": "324a26",
|
||||||
"101010": "101010",
|
|
||||||
"5aa5ce": "40683c",
|
"5aa5ce": "40683c",
|
||||||
"a5e6ff": "b6d9ac",
|
"ce4252": "af2c4f",
|
||||||
"7bceef": "789c6e",
|
|
||||||
"ced6ef": "c09e99",
|
|
||||||
"737384": "774644",
|
|
||||||
"ffffff": "f1dcd8",
|
"ffffff": "f1dcd8",
|
||||||
"8c4231": "420b0c",
|
"8c4231": "420b0c",
|
||||||
"ffde4a": "c66f68",
|
|
||||||
"c57b31": "551917",
|
|
||||||
"ffffad": "f4bfb6",
|
"ffffad": "f4bfb6",
|
||||||
|
"ffde4a": "c66f68",
|
||||||
|
"7bceef": "789c6e",
|
||||||
|
"a5e6ff": "b6d9ac",
|
||||||
|
"737384": "774644",
|
||||||
"f7b531": "af5457",
|
"f7b531": "af5457",
|
||||||
"ce4252": "af2c4f",
|
"c57b31": "551917",
|
||||||
"bc4524": "af5457",
|
"ced6ef": "c09e99"
|
||||||
"00e5e7": "00e5e7"
|
|
||||||
},
|
},
|
||||||
"1": {
|
"1": {
|
||||||
|
"bc4524": "3d325e",
|
||||||
"31638c": "143a72",
|
"31638c": "143a72",
|
||||||
"101010": "101010",
|
|
||||||
"5aa5ce": "4060bc",
|
"5aa5ce": "4060bc",
|
||||||
"a5e6ff": "b4b3ff",
|
"ce4252": "b75558",
|
||||||
"7bceef": "657ddf",
|
|
||||||
"ced6ef": "a8b5dd",
|
|
||||||
"737384": "737384",
|
|
||||||
"ffffff": "e5ecff",
|
"ffffff": "e5ecff",
|
||||||
"8c4231": "17103f",
|
"8c4231": "17103f",
|
||||||
"ffde4a": "534e72",
|
|
||||||
"c57b31": "2a1f50",
|
|
||||||
"ffffad": "87879b",
|
"ffffad": "87879b",
|
||||||
|
"ffde4a": "534e72",
|
||||||
|
"7bceef": "657ddf",
|
||||||
|
"a5e6ff": "b4b3ff",
|
||||||
"f7b531": "3d325e",
|
"f7b531": "3d325e",
|
||||||
"ce4252": "b75558",
|
"c57b31": "2a1f50",
|
||||||
"bc4524": "3d325e",
|
"ced6ef": "a8b5dd"
|
||||||
"00e5e7": "00e5e7"
|
},
|
||||||
|
"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": [
|
"279": [
|
||||||
1,
|
1,
|
||||||
1,
|
1,
|
||||||
2
|
1
|
||||||
],
|
],
|
||||||
"280": [
|
"280": [
|
||||||
0,
|
0,
|
||||||
|
@ -13,7 +13,6 @@ import { TrainerType } from "#enums/trainer-type";
|
|||||||
import { Nature } from "./nature";
|
import { Nature } from "./nature";
|
||||||
import { Moves } from "#app/enums/moves.js";
|
import { Moves } from "#app/enums/moves.js";
|
||||||
import { TypeColor, TypeShadow } from "#app/enums/color.js";
|
import { TypeColor, TypeShadow } from "#app/enums/color.js";
|
||||||
import { Gender } from "./gender";
|
|
||||||
import { pokemonEvolutions } from "./pokemon-evolutions";
|
import { pokemonEvolutions } from "./pokemon-evolutions";
|
||||||
import { pokemonFormChanges } from "./pokemon-forms";
|
import { pokemonFormChanges } from "./pokemon-forms";
|
||||||
|
|
||||||
@ -659,7 +658,6 @@ export class FreshStartChallenge extends Challenge {
|
|||||||
pokemon.luck = 0; // No luck
|
pokemon.luck = 0; // No luck
|
||||||
pokemon.shiny = false; // Not shiny
|
pokemon.shiny = false; // Not shiny
|
||||||
pokemon.variant = 0; // Not shiny
|
pokemon.variant = 0; // Not shiny
|
||||||
pokemon.gender = Gender.MALE; // Starters default to male
|
|
||||||
pokemon.formIndex = 0; // Froakie should be base form
|
pokemon.formIndex = 0; // Froakie should be base form
|
||||||
pokemon.ivs = [10, 10, 10, 10, 10, 10]; // Default IVs of 10 for all stats
|
pokemon.ivs = [10, 10, 10, 10, 10, 10]; // Default IVs of 10 for all stats
|
||||||
return true;
|
return true;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import { BattleSpec } from "#enums/battle-spec";
|
import { BattleSpec } from "#enums/battle-spec";
|
||||||
import { TrainerType } from "#enums/trainer-type";
|
import { TrainerType } from "#enums/trainer-type";
|
||||||
import {trainerConfigs} from "./trainer-config";
|
import { trainerConfigs } from "./trainer-config";
|
||||||
|
|
||||||
export interface TrainerTypeMessages {
|
export interface TrainerTypeMessages {
|
||||||
encounter?: string | string[],
|
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]: [
|
[TrainerType.FLARE_GRUNT]: [
|
||||||
{
|
{
|
||||||
encounter: [
|
encounter: [
|
||||||
|
@ -66,34 +66,34 @@ export enum FormChangeItem {
|
|||||||
|
|
||||||
BLUE_ORB = 50,
|
BLUE_ORB = 50,
|
||||||
RED_ORB,
|
RED_ORB,
|
||||||
SHARP_METEORITE,
|
|
||||||
HARD_METEORITE,
|
|
||||||
SMOOTH_METEORITE,
|
|
||||||
ADAMANT_CRYSTAL,
|
ADAMANT_CRYSTAL,
|
||||||
LUSTROUS_GLOBE,
|
LUSTROUS_GLOBE,
|
||||||
GRISEOUS_CORE,
|
GRISEOUS_CORE,
|
||||||
REVEAL_GLASS,
|
REVEAL_GLASS,
|
||||||
GRACIDEA,
|
|
||||||
MAX_MUSHROOMS,
|
MAX_MUSHROOMS,
|
||||||
DARK_STONE,
|
DARK_STONE,
|
||||||
LIGHT_STONE,
|
LIGHT_STONE,
|
||||||
PRISON_BOTTLE,
|
PRISON_BOTTLE,
|
||||||
N_LUNARIZER,
|
|
||||||
N_SOLARIZER,
|
|
||||||
RUSTED_SWORD,
|
RUSTED_SWORD,
|
||||||
RUSTED_SHIELD,
|
RUSTED_SHIELD,
|
||||||
ICY_REINS_OF_UNITY,
|
ICY_REINS_OF_UNITY,
|
||||||
SHADOW_REINS_OF_UNITY,
|
SHADOW_REINS_OF_UNITY,
|
||||||
WELLSPRING_MASK,
|
ULTRANECROZIUM_Z,
|
||||||
HEARTHFLAME_MASK,
|
|
||||||
CORNERSTONE_MASK,
|
SHARP_METEORITE = 100,
|
||||||
|
HARD_METEORITE,
|
||||||
|
SMOOTH_METEORITE,
|
||||||
|
GRACIDEA,
|
||||||
SHOCK_DRIVE,
|
SHOCK_DRIVE,
|
||||||
BURN_DRIVE,
|
BURN_DRIVE,
|
||||||
CHILL_DRIVE,
|
CHILL_DRIVE,
|
||||||
DOUSE_DRIVE,
|
DOUSE_DRIVE,
|
||||||
ULTRANECROZIUM_Z,
|
N_SOLARIZER,
|
||||||
|
N_LUNARIZER,
|
||||||
FIST_PLATE = 100,
|
WELLSPRING_MASK,
|
||||||
|
HEARTHFLAME_MASK,
|
||||||
|
CORNERSTONE_MASK,
|
||||||
|
FIST_PLATE,
|
||||||
SKY_PLATE,
|
SKY_PLATE,
|
||||||
TOXIC_PLATE,
|
TOXIC_PLATE,
|
||||||
EARTH_PLATE,
|
EARTH_PLATE,
|
||||||
@ -129,7 +129,7 @@ export enum FormChangeItem {
|
|||||||
DRAGON_MEMORY,
|
DRAGON_MEMORY,
|
||||||
DARK_MEMORY,
|
DARK_MEMORY,
|
||||||
FAIRY_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;
|
export type SpeciesFormChangeConditionPredicate = (p: Pokemon) => boolean;
|
||||||
|
@ -604,6 +604,6 @@
|
|||||||
"DRAGON_MEMORY": "Drachen-Disc",
|
"DRAGON_MEMORY": "Drachen-Disc",
|
||||||
"DARK_MEMORY": "Unlicht-Disc",
|
"DARK_MEMORY": "Unlicht-Disc",
|
||||||
"FAIRY_MEMORY": "Feen-Disc",
|
"FAIRY_MEMORY": "Feen-Disc",
|
||||||
"BLANK_MEMORY": "Leere-Disc"
|
"NORMAL_MEMORY": "Normal-Disc"
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -10,5 +10,5 @@
|
|||||||
"eternamaxChange": "{{preName}} hat sich zu {{pokemonName}} unendynamaximiert!",
|
"eternamaxChange": "{{preName}} hat sich zu {{pokemonName}} unendynamaximiert!",
|
||||||
"revertChange": "{{pokemonName}} hat seine ursprüngliche Form zurückerlangt!",
|
"revertChange": "{{pokemonName}} hat seine ursprüngliche Form zurückerlangt!",
|
||||||
"formChange": "{{preName}} hat seine Form geändert!",
|
"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",
|
"DRAGON_MEMORY": "Dragon Memory",
|
||||||
"DARK_MEMORY": "Dark Memory",
|
"DARK_MEMORY": "Dark Memory",
|
||||||
"FAIRY_MEMORY": "Fairy Memory",
|
"FAIRY_MEMORY": "Fairy Memory",
|
||||||
"BLANK_MEMORY": "Blank Memory"
|
"NORMAL_MEMORY": "Normal Memory"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -604,6 +604,6 @@
|
|||||||
"DRAGON_MEMORY": "Disco dragón",
|
"DRAGON_MEMORY": "Disco dragón",
|
||||||
"DARK_MEMORY": "Disco siniestro",
|
"DARK_MEMORY": "Disco siniestro",
|
||||||
"FAIRY_MEMORY": "Disco hada",
|
"FAIRY_MEMORY": "Disco hada",
|
||||||
"BLANK_MEMORY": "Disco en blanco"
|
"NORMAL_MEMORY": "Disco normal"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -450,6 +450,6 @@
|
|||||||
"DRAGON_MEMORY": "ROM Dragon",
|
"DRAGON_MEMORY": "ROM Dragon",
|
||||||
"DARK_MEMORY": "ROM Ténèbres",
|
"DARK_MEMORY": "ROM Ténèbres",
|
||||||
"FAIRY_MEMORY": "ROM Fée",
|
"FAIRY_MEMORY": "ROM Fée",
|
||||||
"BLANK_MEMORY": "ROM Vierge"
|
"NORMAL_MEMORY": "ROM Normal"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -604,6 +604,6 @@
|
|||||||
"DRAGON_MEMORY": "ROM Drago",
|
"DRAGON_MEMORY": "ROM Drago",
|
||||||
"DARK_MEMORY": "ROM Buio",
|
"DARK_MEMORY": "ROM Buio",
|
||||||
"FAIRY_MEMORY": "ROM Folletto",
|
"FAIRY_MEMORY": "ROM Folletto",
|
||||||
"BLANK_MEMORY": "ROM Vuota"
|
"NORMAL_MEMORY": "ROM Normale"
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -604,6 +604,6 @@
|
|||||||
"DRAGON_MEMORY": "드래곤메모리",
|
"DRAGON_MEMORY": "드래곤메모리",
|
||||||
"DARK_MEMORY": "다크메모리",
|
"DARK_MEMORY": "다크메모리",
|
||||||
"FAIRY_MEMORY": "페어리메모리",
|
"FAIRY_MEMORY": "페어리메모리",
|
||||||
"BLANK_MEMORY": "빈메모리"
|
"NORMAL_MEMORY": "일반메모리"
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -604,6 +604,6 @@
|
|||||||
"DRAGON_MEMORY": "Memória do Dragão",
|
"DRAGON_MEMORY": "Memória do Dragão",
|
||||||
"DARK_MEMORY": "Memória Sombria",
|
"DARK_MEMORY": "Memória Sombria",
|
||||||
"FAIRY_MEMORY": "Memória de Fada",
|
"FAIRY_MEMORY": "Memória de Fada",
|
||||||
"BLANK_MEMORY": "Memória Vazia"
|
"NORMAL_MEMORY": "Memória Normal"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -604,6 +604,6 @@
|
|||||||
"DRAGON_MEMORY": "龙存储碟",
|
"DRAGON_MEMORY": "龙存储碟",
|
||||||
"DARK_MEMORY": "黑暗存储碟",
|
"DARK_MEMORY": "黑暗存储碟",
|
||||||
"FAIRY_MEMORY": "妖精存储碟",
|
"FAIRY_MEMORY": "妖精存储碟",
|
||||||
"BLANK_MEMORY": "空白存储碟"
|
"NORMAL_MEMORY": "一般存储碟"
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -600,6 +600,6 @@
|
|||||||
"DRAGON_MEMORY": "龍記憶碟",
|
"DRAGON_MEMORY": "龍記憶碟",
|
||||||
"DARK_MEMORY": "黑暗記憶碟",
|
"DARK_MEMORY": "黑暗記憶碟",
|
||||||
"FAIRY_MEMORY": "妖精記憶碟",
|
"FAIRY_MEMORY": "妖精記憶碟",
|
||||||
"BLANK_MEMORY": "空白記憶碟"
|
"NORMAL_MEMORY": "一般記憶碟"
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1220,7 +1220,7 @@ class EvolutionItemModifierTypeGenerator extends ModifierTypeGenerator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class FormChangeItemModifierTypeGenerator extends ModifierTypeGenerator {
|
class FormChangeItemModifierTypeGenerator extends ModifierTypeGenerator {
|
||||||
constructor() {
|
constructor(rare: boolean) {
|
||||||
super((party: Pokemon[], pregenArgs?: any[]) => {
|
super((party: Pokemon[], pregenArgs?: any[]) => {
|
||||||
if (pregenArgs && (pregenArgs.length === 1) && (pregenArgs[0] in FormChangeItem)) {
|
if (pregenArgs && (pregenArgs.length === 1) && (pregenArgs[0] in FormChangeItem)) {
|
||||||
return new FormChangeItemModifierType(pregenArgs[0] as FormChangeItem);
|
return new FormChangeItemModifierType(pregenArgs[0] as FormChangeItem);
|
||||||
@ -1262,7 +1262,8 @@ class FormChangeItemModifierTypeGenerator extends ModifierTypeGenerator {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return formChangeItemTriggers;
|
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.
|
// 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) {
|
if (!formChangeItemPool.length) {
|
||||||
@ -1467,7 +1468,8 @@ export const modifierTypes = {
|
|||||||
|
|
||||||
EVOLUTION_ITEM: () => new EvolutionItemModifierTypeGenerator(false),
|
EVOLUTION_ITEM: () => new EvolutionItemModifierTypeGenerator(false),
|
||||||
RARE_EVOLUTION_ITEM: () => new EvolutionItemModifierTypeGenerator(true),
|
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_EVOLVE_ITEM: () => new EvolutionItemModifierType(EvolutionItem.SUPER_EVO_ITEM),
|
||||||
FORCE_FUSE_EVOLVE_ITEM: () => new EvolutionItemModifierType(EvolutionItem.SUPER_EVO_ITEM_FUSION),
|
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.PP_MAX, 3),
|
||||||
new WeightedModifierType(modifierTypes.MINT, 4),
|
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.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.AMULET_COIN, skipInLastClassicWaveOrDefault(3)),
|
||||||
new WeightedModifierType(modifierTypes.EVIOLITE, (party: Pokemon[]) => {
|
new WeightedModifierType(modifierTypes.EVIOLITE, (party: Pokemon[]) => {
|
||||||
if (evioliteOverride == "on" || (evioliteOverride != "off" && (!party[0].scene.gameMode.isFreshStartChallenge() && party[0].scene.gameData.unlocks[Unlockables.EVIOLITE]))) {
|
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.KINGS_ROCK, 3),
|
||||||
new WeightedModifierType(modifierTypes.LOCK_CAPSULE, skipInLastClassicWaveOrDefault(3)),
|
new WeightedModifierType(modifierTypes.LOCK_CAPSULE, skipInLastClassicWaveOrDefault(3)),
|
||||||
new WeightedModifierType(modifierTypes.SUPER_EXP_CHARM, skipInLastClassicWaveOrDefault(8)),
|
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.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.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),
|
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 {
|
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);
|
.reduce((total: integer, value: integer) => total += value, 0), 0, 14);
|
||||||
return luck || 0;
|
return luck || 0;
|
||||||
}
|
}
|
||||||
|
@ -72,7 +72,7 @@ export class SwitchSummonPhase extends SummonPhase {
|
|||||||
i18next.t("battle:playerComeBack", { pokemonName: getPokemonNameWithAffix(pokemon) }) :
|
i18next.t("battle:playerComeBack", { pokemonName: getPokemonNameWithAffix(pokemon) }) :
|
||||||
i18next.t("battle:trainerComeBack", {
|
i18next.t("battle:trainerComeBack", {
|
||||||
trainerName: this.scene.currentBattle.trainer?.getName(!(this.fieldIndex % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER),
|
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");
|
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[] = [];
|
const defaultStarterNatures: Nature[] = [];
|
||||||
|
|
||||||
@ -1944,6 +1944,7 @@ export class GameData {
|
|||||||
fixStarterData(systemData: SystemSaveData): void {
|
fixStarterData(systemData: SystemSaveData): void {
|
||||||
for (const starterId of defaultStarterSpecies) {
|
for (const starterId of defaultStarterSpecies) {
|
||||||
systemData.starterData[starterId].abilityAttr |= AbilityAttr.ABILITY_1;
|
systemData.starterData[starterId].abilityAttr |= AbilityAttr.ABILITY_1;
|
||||||
|
systemData.dexData[starterId].caughtAttr |= DexAttr.FEMALE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,8 +1,6 @@
|
|||||||
import { allMoves } from "#app/data/move";
|
import { allMoves } from "#app/data/move";
|
||||||
import { Abilities } from "#app/enums/abilities";
|
import { Abilities } from "#app/enums/abilities";
|
||||||
import { Stat } from "#app/enums/stat";
|
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 { Moves } from "#enums/moves";
|
||||||
import { Species } from "#enums/species";
|
import { Species } from "#enums/species";
|
||||||
import GameManager from "#test/utils/gameManager";
|
import GameManager from "#test/utils/gameManager";
|
||||||
@ -26,18 +24,18 @@ describe("Abilities - Hustle", () => {
|
|||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
game = new GameManager(phaserGame);
|
game = new GameManager(phaserGame);
|
||||||
game.override.ability(Abilities.HUSTLE);
|
game.override
|
||||||
game.override.moveset([Moves.TACKLE, Moves.GIGA_DRAIN, Moves.FISSURE]);
|
.ability(Abilities.HUSTLE)
|
||||||
game.override.startingLevel(5);
|
.moveset([Moves.TACKLE, Moves.GIGA_DRAIN, Moves.FISSURE])
|
||||||
game.override.disableCrits();
|
.disableCrits()
|
||||||
game.override.enemyLevel(5);
|
.battleType("single")
|
||||||
game.override.enemyMoveset(SPLASH_ONLY);
|
.enemyMoveset(SPLASH_ONLY)
|
||||||
game.override.enemySpecies(Species.SHUCKLE);
|
.enemySpecies(Species.SHUCKLE)
|
||||||
game.override.enemyAbility(Abilities.BALL_FETCH);
|
.enemyAbility(Abilities.BALL_FETCH);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("increases the user's Attack stat by 50%", async () => {
|
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 pikachu = game.scene.getPlayerPokemon()!;
|
||||||
const atk = pikachu.stats[Stat.ATK];
|
const atk = pikachu.stats[Stat.ATK];
|
||||||
|
|
||||||
@ -45,25 +43,25 @@ describe("Abilities - Hustle", () => {
|
|||||||
|
|
||||||
game.move.select(Moves.TACKLE);
|
game.move.select(Moves.TACKLE);
|
||||||
await game.move.forceHit();
|
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 () => {
|
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()!;
|
const pikachu = game.scene.getPlayerPokemon()!;
|
||||||
|
|
||||||
vi.spyOn(pikachu, "getAccuracyMultiplier");
|
vi.spyOn(pikachu, "getAccuracyMultiplier");
|
||||||
|
|
||||||
game.move.select(Moves.TACKLE);
|
game.move.select(Moves.TACKLE);
|
||||||
await game.phaseInterceptor.to(MoveEffectPhase);
|
await game.phaseInterceptor.to("MoveEffectPhase");
|
||||||
|
|
||||||
expect(pikachu.getAccuracyMultiplier).toHaveReturnedWith(0.8);
|
expect(pikachu.getAccuracyMultiplier).toHaveReturnedWith(0.8);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("does not affect non-physical moves", async () => {
|
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 pikachu = game.scene.getPlayerPokemon()!;
|
||||||
const spatk = pikachu.stats[Stat.SPATK];
|
const spatk = pikachu.stats[Stat.SPATK];
|
||||||
|
|
||||||
@ -71,7 +69,7 @@ describe("Abilities - Hustle", () => {
|
|||||||
vi.spyOn(pikachu, "getAccuracyMultiplier");
|
vi.spyOn(pikachu, "getAccuracyMultiplier");
|
||||||
|
|
||||||
game.move.select(Moves.GIGA_DRAIN);
|
game.move.select(Moves.GIGA_DRAIN);
|
||||||
await game.phaseInterceptor.to(DamagePhase);
|
await game.phaseInterceptor.to("DamagePhase");
|
||||||
|
|
||||||
expect(pikachu.getBattleStat).toHaveReturnedWith(spatk);
|
expect(pikachu.getBattleStat).toHaveReturnedWith(spatk);
|
||||||
expect(pikachu.getAccuracyMultiplier).toHaveReturnedWith(1);
|
expect(pikachu.getAccuracyMultiplier).toHaveReturnedWith(1);
|
||||||
@ -81,7 +79,7 @@ describe("Abilities - Hustle", () => {
|
|||||||
game.override.startingLevel(100);
|
game.override.startingLevel(100);
|
||||||
game.override.enemyLevel(30);
|
game.override.enemyLevel(30);
|
||||||
|
|
||||||
await game.startBattle([Species.PIKACHU]);
|
await game.classicMode.startBattle([Species.PIKACHU]);
|
||||||
const pikachu = game.scene.getPlayerPokemon()!;
|
const pikachu = game.scene.getPlayerPokemon()!;
|
||||||
const enemyPokemon = game.scene.getEnemyPokemon()!;
|
const enemyPokemon = game.scene.getEnemyPokemon()!;
|
||||||
|
|
||||||
@ -89,7 +87,7 @@ describe("Abilities - Hustle", () => {
|
|||||||
vi.spyOn(allMoves[Moves.FISSURE], "calculateBattleAccuracy");
|
vi.spyOn(allMoves[Moves.FISSURE], "calculateBattleAccuracy");
|
||||||
|
|
||||||
game.move.select(Moves.FISSURE);
|
game.move.select(Moves.FISSURE);
|
||||||
await game.phaseInterceptor.to(DamagePhase);
|
await game.phaseInterceptor.to("DamagePhase");
|
||||||
|
|
||||||
expect(enemyPokemon.turnData.damageTaken).toBe(enemyPokemon.getMaxHp());
|
expect(enemyPokemon.turnData.damageTaken).toBe(enemyPokemon.getMaxHp());
|
||||||
expect(pikachu.getAccuracyMultiplier).toHaveReturnedWith(1);
|
expect(pikachu.getAccuracyMultiplier).toHaveReturnedWith(1);
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
import { BattleStat } from "#app/data/battle-stat";
|
import { BattleStat } from "#app/data/battle-stat";
|
||||||
import { TurnEndPhase } from "#app/phases/turn-end-phase";
|
|
||||||
import { Abilities } from "#enums/abilities";
|
import { Abilities } from "#enums/abilities";
|
||||||
import { Moves } from "#enums/moves";
|
import { Moves } from "#enums/moves";
|
||||||
import { Species } from "#enums/species";
|
import { Species } from "#enums/species";
|
||||||
@ -24,22 +23,23 @@ describe("Abilities - Wind Rider", () => {
|
|||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
game = new GameManager(phaserGame);
|
game = new GameManager(phaserGame);
|
||||||
game.override.battleType("single");
|
game.override
|
||||||
game.override.enemySpecies(Species.SHIFTRY);
|
.battleType("single")
|
||||||
game.override.enemyAbility(Abilities.WIND_RIDER);
|
.enemySpecies(Species.SHIFTRY)
|
||||||
game.override.moveset([Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM]);
|
.enemyAbility(Abilities.WIND_RIDER)
|
||||||
game.override.enemyMoveset(SPLASH_ONLY);
|
.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 () => {
|
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()!;
|
const shiftry = game.scene.getEnemyPokemon()!;
|
||||||
|
|
||||||
expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(0);
|
expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(0);
|
||||||
|
|
||||||
game.move.select(Moves.PETAL_BLIZZARD);
|
game.move.select(Moves.PETAL_BLIZZARD);
|
||||||
|
|
||||||
await game.phaseInterceptor.to(TurnEndPhase);
|
await game.phaseInterceptor.to("TurnEndPhase");
|
||||||
|
|
||||||
expect(shiftry.isFullHp()).toBe(true);
|
expect(shiftry.isFullHp()).toBe(true);
|
||||||
expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(1);
|
expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(1);
|
||||||
@ -49,14 +49,14 @@ describe("Abilities - Wind Rider", () => {
|
|||||||
game.override.ability(Abilities.WIND_RIDER);
|
game.override.ability(Abilities.WIND_RIDER);
|
||||||
game.override.enemySpecies(Species.MAGIKARP);
|
game.override.enemySpecies(Species.MAGIKARP);
|
||||||
|
|
||||||
await game.startBattle([Species.SHIFTRY]);
|
await game.classicMode.startBattle([Species.SHIFTRY]);
|
||||||
const shiftry = game.scene.getPlayerPokemon()!;
|
const shiftry = game.scene.getPlayerPokemon()!;
|
||||||
|
|
||||||
expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(0);
|
expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(0);
|
||||||
|
|
||||||
game.move.select(Moves.TAILWIND);
|
game.move.select(Moves.TAILWIND);
|
||||||
|
|
||||||
await game.phaseInterceptor.to(TurnEndPhase);
|
await game.phaseInterceptor.to("TurnEndPhase");
|
||||||
|
|
||||||
expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(1);
|
expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(1);
|
||||||
});
|
});
|
||||||
@ -65,7 +65,7 @@ describe("Abilities - Wind Rider", () => {
|
|||||||
game.override.ability(Abilities.WIND_RIDER);
|
game.override.ability(Abilities.WIND_RIDER);
|
||||||
game.override.enemySpecies(Species.MAGIKARP);
|
game.override.enemySpecies(Species.MAGIKARP);
|
||||||
|
|
||||||
await game.startBattle([Species.SHIFTRY]);
|
await game.classicMode.startBattle([Species.SHIFTRY]);
|
||||||
const magikarp = game.scene.getEnemyPokemon()!;
|
const magikarp = game.scene.getEnemyPokemon()!;
|
||||||
const shiftry = game.scene.getPlayerPokemon()!;
|
const shiftry = game.scene.getPlayerPokemon()!;
|
||||||
|
|
||||||
@ -74,16 +74,18 @@ describe("Abilities - Wind Rider", () => {
|
|||||||
|
|
||||||
game.move.select(Moves.TAILWIND);
|
game.move.select(Moves.TAILWIND);
|
||||||
|
|
||||||
await game.phaseInterceptor.to(TurnEndPhase);
|
await game.phaseInterceptor.to("TurnEndPhase");
|
||||||
|
|
||||||
expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(1);
|
expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(1);
|
||||||
expect(magikarp.summonData.battleStats[BattleStat.ATK]).toBe(0);
|
expect(magikarp.summonData.battleStats[BattleStat.ATK]).toBe(0);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("does not increase Attack when Tailwind is present on opposing side", async () => {
|
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 magikarp = game.scene.getEnemyPokemon()!;
|
||||||
const shiftry = game.scene.getPlayerPokemon()!;
|
const shiftry = game.scene.getPlayerPokemon()!;
|
||||||
|
|
||||||
@ -92,7 +94,7 @@ describe("Abilities - Wind Rider", () => {
|
|||||||
|
|
||||||
game.move.select(Moves.TAILWIND);
|
game.move.select(Moves.TAILWIND);
|
||||||
|
|
||||||
await game.phaseInterceptor.to(TurnEndPhase);
|
await game.phaseInterceptor.to("TurnEndPhase");
|
||||||
|
|
||||||
expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(1);
|
expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(1);
|
||||||
expect(magikarp.summonData.battleStats[BattleStat.ATK]).toBe(0);
|
expect(magikarp.summonData.battleStats[BattleStat.ATK]).toBe(0);
|
||||||
@ -101,7 +103,7 @@ describe("Abilities - Wind Rider", () => {
|
|||||||
it("does not interact with Sandstorm", async () => {
|
it("does not interact with Sandstorm", async () => {
|
||||||
game.override.enemySpecies(Species.MAGIKARP);
|
game.override.enemySpecies(Species.MAGIKARP);
|
||||||
|
|
||||||
await game.startBattle([Species.SHIFTRY]);
|
await game.classicMode.startBattle([Species.SHIFTRY]);
|
||||||
const shiftry = game.scene.getPlayerPokemon()!;
|
const shiftry = game.scene.getPlayerPokemon()!;
|
||||||
|
|
||||||
expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(0);
|
expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(0);
|
||||||
@ -109,7 +111,7 @@ describe("Abilities - Wind Rider", () => {
|
|||||||
|
|
||||||
game.move.select(Moves.SANDSTORM);
|
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.summonData.battleStats[BattleStat.ATK]).toBe(0);
|
||||||
expect(shiftry.hp).lessThan(shiftry.getMaxHp());
|
expect(shiftry.hp).lessThan(shiftry.getMaxHp());
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
import GameManager from "#app/test/utils/gameManager";
|
import GameManager from "#app/test/utils/gameManager";
|
||||||
import { getMovePosition } from "#app/test/utils/gameManagerUtils";
|
|
||||||
import { Moves } from "#enums/moves";
|
import { Moves } from "#enums/moves";
|
||||||
import { Species } from "#enums/species";
|
import { Species } from "#enums/species";
|
||||||
import Phaser from "phaser";
|
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() => {
|
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()!;
|
const enemy = game.scene.getEnemyPokemon()!;
|
||||||
|
|
||||||
game.doAttack(getMovePosition(game.scene, 0, Moves.FAKE_OUT));
|
game.move.select(Moves.FAKE_OUT);
|
||||||
await game.toNextTurn();
|
await game.toNextTurn();
|
||||||
|
|
||||||
expect(enemy.hp).toBeLessThan(enemy.getMaxHp());
|
expect(enemy.hp).toBeLessThan(enemy.getMaxHp());
|
||||||
const postTurnOneHp = enemy.hp;
|
const postTurnOneHp = enemy.hp;
|
||||||
|
|
||||||
game.doAttack(getMovePosition(game.scene, 0, Moves.FAKE_OUT));
|
game.move.select(Moves.FAKE_OUT);
|
||||||
await game.toNextTurn();
|
await game.toNextTurn();
|
||||||
|
|
||||||
expect(enemy.hp).toBe(postTurnOneHp);
|
expect(enemy.hp).toBe(postTurnOneHp);
|
||||||
|
|
||||||
game.doAttack(getMovePosition(game.scene, 0, Moves.SPLASH));
|
game.move.select(Moves.SPLASH);
|
||||||
await game.doKillOpponents();
|
await game.doKillOpponents();
|
||||||
await game.toNextWave();
|
await game.toNextWave();
|
||||||
|
|
||||||
const newEnemy = game.scene.getEnemyPokemon()!;
|
const newEnemy = game.scene.getEnemyPokemon()!;
|
||||||
|
|
||||||
game.doAttack(getMovePosition(game.scene, 0, Moves.FAKE_OUT));
|
game.move.select(Moves.FAKE_OUT);
|
||||||
await game.toNextTurn();
|
await game.toNextTurn();
|
||||||
|
|
||||||
expect(newEnemy.hp).toBe(newEnemy.getMaxHp());
|
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() => {
|
it("can be used again if recalled and sent back out", async() => {
|
||||||
game.override.startingWave(4);
|
game.override.startingWave(4);
|
||||||
await game.startBattle();
|
await game.classicMode.startBattle();
|
||||||
|
|
||||||
const enemy1 = game.scene.getEnemyPokemon()!;
|
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");
|
await game.phaseInterceptor.to("MoveEndPhase");
|
||||||
|
|
||||||
expect(enemy1.hp).toBeLessThan(enemy1.getMaxHp());
|
expect(enemy1.hp).toBeLessThan(enemy1.getMaxHp());
|
||||||
@ -73,7 +72,7 @@ describe("Moves - Fake Out", () => {
|
|||||||
await game.doKillOpponents();
|
await game.doKillOpponents();
|
||||||
await game.toNextWave();
|
await game.toNextWave();
|
||||||
|
|
||||||
game.doAttack(getMovePosition(game.scene, 0, Moves.FAKE_OUT));
|
game.move.select(Moves.FAKE_OUT);
|
||||||
await game.toNextTurn();
|
await game.toNextTurn();
|
||||||
|
|
||||||
const enemy2 = game.scene.getEnemyPokemon()!;
|
const enemy2 = game.scene.getEnemyPokemon()!;
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
import { BattlerIndex } from "#app/battle.js";
|
import { BattlerIndex } from "#app/battle.js";
|
||||||
import GameManager from "#app/test/utils/gameManager";
|
import GameManager from "#app/test/utils/gameManager";
|
||||||
import { getMovePosition } from "#app/test/utils/gameManagerUtils";
|
|
||||||
import { Moves } from "#enums/moves";
|
import { Moves } from "#enums/moves";
|
||||||
import { Species } from "#enums/species";
|
import { Species } from "#enums/species";
|
||||||
import Phaser from "phaser";
|
import Phaser from "phaser";
|
||||||
@ -35,11 +34,11 @@ describe("Moves - Gigaton Hammer", () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it("can't be used two turns in a row", async() => {
|
it("can't be used two turns in a row", async() => {
|
||||||
await game.startBattle();
|
await game.classicMode.startBattle();
|
||||||
|
|
||||||
const enemy1 = game.scene.getEnemyPokemon()!;
|
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.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]);
|
||||||
await game.phaseInterceptor.to("MoveEndPhase");
|
await game.phaseInterceptor.to("MoveEndPhase");
|
||||||
|
|
||||||
@ -48,7 +47,7 @@ describe("Moves - Gigaton Hammer", () => {
|
|||||||
await game.doKillOpponents();
|
await game.doKillOpponents();
|
||||||
await game.toNextWave();
|
await game.toNextWave();
|
||||||
|
|
||||||
game.doAttack(getMovePosition(game.scene, 0, Moves.GIGATON_HAMMER));
|
game.move.select(Moves.GIGATON_HAMMER);
|
||||||
await game.toNextTurn();
|
await game.toNextTurn();
|
||||||
|
|
||||||
const enemy2 = game.scene.getEnemyPokemon()!;
|
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() => {
|
it("can be used again if recalled and sent back out", async() => {
|
||||||
game.override.startingWave(4);
|
game.override.startingWave(4);
|
||||||
await game.startBattle();
|
await game.classicMode.startBattle();
|
||||||
|
|
||||||
const enemy1 = game.scene.getEnemyPokemon()!;
|
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.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]);
|
||||||
await game.phaseInterceptor.to("MoveEndPhase");
|
await game.phaseInterceptor.to("MoveEndPhase");
|
||||||
|
|
||||||
@ -71,7 +70,7 @@ describe("Moves - Gigaton Hammer", () => {
|
|||||||
await game.doKillOpponents();
|
await game.doKillOpponents();
|
||||||
await game.toNextWave();
|
await game.toNextWave();
|
||||||
|
|
||||||
game.doAttack(getMovePosition(game.scene, 0, Moves.GIGATON_HAMMER));
|
game.move.select(Moves.GIGATON_HAMMER);
|
||||||
await game.toNextTurn();
|
await game.toNextTurn();
|
||||||
|
|
||||||
const enemy2 = game.scene.getEnemyPokemon()!;
|
const enemy2 = game.scene.getEnemyPokemon()!;
|
||||||
|