Merge branch 'pagefaultgames:main' into main

This commit is contained in:
NxKarim 2024-04-17 03:03:01 -06:00 committed by GitHub
commit 04ed5058f8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 225 additions and 25 deletions

View File

@ -464,6 +464,26 @@ export class MoveImmunityAbAttr extends PreDefendAbAttr {
}
}
export class MoveImmunityStatChangeAbAttr extends MoveImmunityAbAttr {
private stat: BattleStat;
private levels: integer;
constructor(immuneCondition: PreDefendAbAttrCondition, stat: BattleStat, levels: integer) {
super(immuneCondition);
this.stat = stat;
this.levels = levels;
}
applyPreDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: PokemonMove, cancelled: Utils.BooleanHolder, args: any[]): boolean {
const ret = super.applyPreDefend(pokemon, passive, attacker, move, cancelled, args)
if (ret) {
pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ this.stat ], this.levels));
}
return ret;
}
}
export class PostDefendStatChangeAbAttr extends PostDefendAbAttr {
private condition: PokemonDefendCondition;
private stat: BattleStat;
@ -489,6 +509,25 @@ export class PostDefendStatChangeAbAttr extends PostDefendAbAttr {
}
}
export class PostDefendApplyBattlerTagAbAttr extends PostDefendAbAttr {
private condition: PokemonDefendCondition;
private tagType: BattlerTagType;
constructor(condition: PokemonDefendCondition, tagType: BattlerTagType) {
super(true);
this.condition = condition;
this.tagType = tagType;
}
applyPostDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: PokemonMove, hitResult: HitResult, args: any[]): boolean {
if (this.condition(pokemon, attacker, move.getMove())) {
pokemon.addTag(this.tagType, undefined, undefined, pokemon.id);
return true;
}
return false;
}
}
export class PostDefendTypeChangeAbAttr extends PostDefendAbAttr {
applyPostDefend(pokemon: Pokemon, passive: boolean, attacker: Pokemon, move: PokemonMove, hitResult: HitResult, args: any[]): boolean {
if (hitResult < HitResult.NO_EFFECT) {
@ -2570,7 +2609,9 @@ export function initAbilities() {
.attr(PostVictoryStatChangeAbAttr, BattleStat.ATK, 1),
new Ability(Abilities.JUSTIFIED, "Justified", "Being hit by a Dark-type move boosts the Attack stat of the Pokémon, for justice.", 5)
.attr(PostDefendStatChangeAbAttr, (target, user, move) => move.type === Type.DARK && move.category !== MoveCategory.STATUS, BattleStat.ATK, 1),
new Ability(Abilities.RATTLED, "Rattled (N)", "Dark-, Ghost-, and Bug-type moves scare the Pokémon and boost its Speed stat.", 5),
new Ability(Abilities.RATTLED, "Rattled (P)", "Intimidate or being hit by a Dark-, Ghost-, or Bug-type move will scare the Pokémon and boost its Speed stat.", 5)
.attr(PostDefendStatChangeAbAttr, (target, user, move) => move.category !== MoveCategory.STATUS && (move.type === Type.DARK || move.type === Type.BUG ||
move.type === Type.GHOST), BattleStat.SPD, 1),
new Ability(Abilities.MAGIC_BOUNCE, "Magic Bounce (N)", "Reflects status moves instead of getting hit by them.", 5)
.ignorable(),
new Ability(Abilities.SAP_SIPPER, "Sap Sipper", "Boosts the Attack stat if hit by a Grass-type move instead of taking damage.", 5)
@ -2594,7 +2635,8 @@ export function initAbilities() {
.attr(UncopiableAbilityAbAttr)
.attr(UnswappableAbilityAbAttr)
.attr(UnsuppressableAbilityAbAttr),
new Ability(Abilities.VICTORY_STAR, "Victory Star (N)", "Boosts the accuracy of its allies and itself.", 5),
new Ability(Abilities.VICTORY_STAR, "Victory Star (P)", "Boosts the accuracy of its allies and itself.", 5)
.attr(BattleStatMultiplierAbAttr, BattleStat.ACC, 1.1),
new Ability(Abilities.TURBOBLAZE, "Turboblaze", "Moves can be used on the target regardless of its Abilities.", 5)
.attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => getPokemonMessage(pokemon, ' is radiating a blazing aura!'))
.attr(MoveAbilityBypassAbAttr),
@ -2621,7 +2663,9 @@ export function initAbilities() {
.attr(MovePowerBoostAbAttr, (user, target, move) => move.hasFlag(MoveFlags.BITING_MOVE), 1.5),
new Ability(Abilities.REFRIGERATE, "Refrigerate", "Normal-type moves become Ice-type moves. The power of those moves is boosted a little.", 6)
.attr(MoveTypeChangePowerMultiplierAbAttr, Type.NORMAL, Type.ICE, 1.2),
new Ability(Abilities.SWEET_VEIL, "Sweet Veil (N)", "Prevents itself and ally Pokémon from falling asleep.", 6)
new Ability(Abilities.SWEET_VEIL, "Sweet Veil (P)", "Prevents itself and ally Pokémon from falling asleep.", 6)
.attr(StatusEffectImmunityAbAttr, StatusEffect.SLEEP)
.attr(BattlerTagImmunityAbAttr, BattlerTagType.DROWSY)
.ignorable(),
new Ability(Abilities.STANCE_CHANGE, "Stance Change", "The Pokémon changes its form to Blade Forme when it uses an attack move and changes to Shield Forme when it uses King's Shield.", 6)
.attr(UncopiableAbilityAbAttr)
@ -2871,7 +2915,7 @@ export function initAbilities() {
new Ability(Abilities.SEED_SOWER, "Seed Sower", "Turns the ground into Grassy Terrain when the Pokémon is hit by an attack.", 9)
.attr(PostDefendTerrainChangeAbAttr, TerrainType.GRASSY),
new Ability(Abilities.THERMAL_EXCHANGE, "Thermal Exchange", "Boosts the Attack stat when the Pokémon is hit by a Fire-type move. The Pokémon also cannot be burned.", 9)
.attr(PostDefendStatChangeAbAttr, (target, user, move) => move.type === Type.FIRE, BattleStat.ATK, 1)
.attr(PostDefendStatChangeAbAttr, (target, user, move) => move.type === Type.FIRE && move.category !== MoveCategory.STATUS, BattleStat.ATK, 1)
.attr(StatusEffectImmunityAbAttr, StatusEffect.BURN)
.ignorable(),
new Ability(Abilities.ANGER_SHELL, "Anger Shell (N)", "When an attack causes its HP to drop to half or less, the Pokémon gets angry. This lowers its Defense and Sp. Def stats but boosts its Attack, Sp. Atk, and Speed stats.", 9),
@ -2882,13 +2926,15 @@ export function initAbilities() {
new Ability(Abilities.WELL_BAKED_BODY, "Well-Baked Body", "The Pokémon takes no damage when hit by Fire-type moves. Instead, its Defense stat is sharply boosted.", 9)
.attr(TypeImmunityStatChangeAbAttr, Type.FIRE, BattleStat.DEF, 2)
.ignorable(),
new Ability(Abilities.WIND_RIDER, "Wind Rider (N)", "Boosts the Pokémon's Attack stat if Tailwind takes effect or if the Pokémon is hit by a wind move. The Pokémon also takes no damage from wind moves.", 9)
new Ability(Abilities.WIND_RIDER, "Wind Rider (P)", "Boosts the Pokémon's Attack stat if Tailwind takes effect or if the Pokémon is hit by a wind move. The Pokémon also takes no damage from wind moves.", 9)
.attr(MoveImmunityStatChangeAbAttr, (pokemon, attacker, move) => pokemon !== attacker && move.getMove().hasFlag(MoveFlags.WIND_MOVE), BattleStat.ATK, 1)
.ignorable(),
new Ability(Abilities.GUARD_DOG, "Guard Dog (N)", "Boosts the Pokémon's Attack stat if intimidated. Moves and items that would force the Pokémon to switch out also fail to work.", 9)
.ignorable(),
new Ability(Abilities.ROCKY_PAYLOAD, "Rocky Payload", "Powers up Rock-type moves.", 9)
.attr(MoveTypePowerBoostAbAttr, Type.ROCK),
new Ability(Abilities.WIND_POWER, "Wind Power (N)", "The Pokémon becomes charged when it is hit by a wind move, boosting the power of the next Electric-type move the Pokémon uses.", 9),
new Ability(Abilities.WIND_POWER, "Wind Power (P)", "The Pokémon becomes charged when it is hit by a wind move, boosting the power of the next Electric-type move the Pokémon uses.", 9)
.attr(PostDefendApplyBattlerTagAbAttr, (target, user, move) => move.hasFlag(MoveFlags.WIND_MOVE), BattlerTagType.CHARGED),
new Ability(Abilities.ZERO_TO_HERO, "Zero to Hero (N)", "The Pokémon transforms into its Hero Form when it switches out.", 9)
.attr(UncopiableAbilityAbAttr)
.attr(UnswappableAbilityAbAttr)
@ -2897,7 +2943,8 @@ export function initAbilities() {
new Ability(Abilities.COMMANDER, "Commander (N)", "When the Pokémon enters a battle, it goes inside the mouth of an ally Dondozo if one is on the field. The Pokémon then issues commands from there.", 9)
.attr(UncopiableAbilityAbAttr)
.attr(UnswappableAbilityAbAttr),
new Ability(Abilities.ELECTROMORPHOSIS, "Electromorphosis (N)", "The Pokémon becomes charged when it takes damage, boosting the power of the next Electric-type move the Pokémon uses.", 9),
new Ability(Abilities.ELECTROMORPHOSIS, "Electromorphosis", "The Pokémon becomes charged when it takes damage, boosting the power of the next Electric-type move the Pokémon uses.", 9)
.attr(PostDefendApplyBattlerTagAbAttr, (target, user, move) => move.category !== MoveCategory.STATUS, BattlerTagType.CHARGED),
new Ability(Abilities.PROTOSYNTHESIS, "Protosynthesis", "Boosts the Pokémon's most proficient stat in harsh sunlight or if the Pokémon is holding Booster Energy.", 9)
.conditionalAttr(getWeatherCondition(WeatherType.SUNNY, WeatherType.HARSH_SUN), PostSummonAddBattlerTagAbAttr, BattlerTagType.PROTOSYNTHESIS, 0, true)
.attr(PostWeatherChangeAddBattlerTagAttr, BattlerTagType.PROTOSYNTHESIS, 0, WeatherType.SUNNY, WeatherType.HARSH_SUN)

View File

@ -175,7 +175,7 @@ class MudSportTag extends WeakenMoveTypeTag {
}
onRemove(arena: Arena): void {
arena.scene.queueMessage('The effects of MUD SPORT\nhave faded.');
arena.scene.queueMessage('The effects of Mud Sport\nhave faded.');
}
}
@ -189,7 +189,7 @@ class WaterSportTag extends WeakenMoveTypeTag {
}
onRemove(arena: Arena): void {
arena.scene.queueMessage('The effects of WATER SPORT\nhave faded.');
arena.scene.queueMessage('The effects of Water Sport\nhave faded.');
}
}

View File

@ -922,11 +922,15 @@ export class HideSpriteTag extends BattlerTag {
export class TypeBoostTag extends BattlerTag {
public boostedType: Type;
public boostValue: number;
public oneUse: boolean;
constructor(tagType: BattlerTagType, sourceMove: Moves, boostedType: Type) {
constructor(tagType: BattlerTagType, sourceMove: Moves, boostedType: Type, boostValue: number, oneUse: boolean) {
super(tagType, BattlerTagLapseType.TURN_END, 1, sourceMove);
this.boostedType = boostedType;
this.boostValue = boostValue;
this.oneUse = oneUse;
}
lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean {
@ -1081,7 +1085,7 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: integer, sourc
case BattlerTagType.HIDDEN:
return new HideSpriteTag(tagType, turnCount, sourceMove);
case BattlerTagType.FIRE_BOOST:
return new TypeBoostTag(tagType, sourceMove, Type.FIRE);
return new TypeBoostTag(tagType, sourceMove, Type.FIRE, 1.5, false);
case BattlerTagType.CRIT_BOOST:
return new CritBoostTag(tagType, sourceMove);
case BattlerTagType.ALWAYS_CRIT:
@ -1098,6 +1102,8 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: integer, sourc
return new BattlerTag(tagType, BattlerTagLapseType.TURN_END, turnCount - 1, sourceMove);
case BattlerTagType.SALT_CURED:
return new SaltCuredTag(sourceId);
case BattlerTagType.CHARGED:
return new TypeBoostTag(tagType, sourceMove, Type.ELECTRIC, 2, true);
case BattlerTagType.NONE:
default:
return new BattlerTag(tagType, BattlerTagLapseType.CUSTOM, turnCount, sourceMove, sourceId);

View File

@ -4144,7 +4144,7 @@ export const biomeTrainerPools: BiomeTrainerPools = {
],
[ Species.MIME_JR, Type.PSYCHIC, Type.FAIRY, [ ]
],
[ Species.HAPPINY, Type.NORMAL, -1, []
[ Species.HAPPINY, Type.NORMAL, -1, [ ]
],
[ Species.CHATOT, Type.NORMAL, Type.FLYING, [
[ Biome.JUNGLE, BiomePoolTier.SUPER_RARE ]
@ -6057,7 +6057,7 @@ export const biomeTrainerPools: BiomeTrainerPools = {
[ Biome.SEABED, BiomePoolTier.BOSS ]
]
],
[ Species.TOXEL, Type.ELECTRIC, Type.POISON, []
[ Species.TOXEL, Type.ELECTRIC, Type.POISON, [ ]
],
[ Species.TOXTRICITY, Type.ELECTRIC, Type.POISON, [
[ Biome.SLUM, BiomePoolTier.RARE, [ TimeOfDay.DUSK, TimeOfDay.NIGHT ] ],

View File

@ -47,6 +47,7 @@ export enum BattlerTagType {
IGNORE_ACCURACY = "IGNORE_ACCURACY",
BYPASS_SLEEP = "BYPASS_SLEEP",
IGNORE_FLYING = "IGNORE_FLYING",
GROUNDED = "GROUNDED",
SALT_CURED = "SALT_CURED"
SALT_CURED = "SALT_CURED",
CHARGED = "CHARGED",
GROUNDED = "GROUNDED"
}

View File

@ -2676,7 +2676,7 @@ export class ForceSwitchOutAttr extends MoveEffectAttr {
private batonPass: boolean;
constructor(user?: boolean, batonPass?: boolean) {
super(false, MoveEffectTrigger.HIT, true);
super(false, MoveEffectTrigger.POST_APPLY, true);
this.user = !!user;
this.batonPass = !!batonPass;
}
@ -4038,7 +4038,6 @@ export function initMoves() {
.target(MoveTarget.RANDOM_NEAR_ENEMY),
new StatusMove(Moves.SANDSTORM, Type.ROCK, -1, 10, -1, 0, 2)
.attr(WeatherChangeAttr, WeatherType.SANDSTORM)
.windMove()
.target(MoveTarget.BOTH_SIDES),
new AttackMove(Moves.GIGA_DRAIN, Type.GRASS, MoveCategory.SPECIAL, 75, 100, 10, -1, 0, 2)
.attr(HitHealAttr)
@ -4224,7 +4223,7 @@ export function initMoves() {
.ignoresVirtual(),
new SelfStatusMove(Moves.CHARGE, Type.ELECTRIC, -1, 20, -1, 0, 3)
.attr(StatChangeAttr, BattleStat.SPDEF, 1, true)
.partial(),
.attr(AddBattlerTagAttr, BattlerTagType.CHARGED, true, true),
new StatusMove(Moves.TAUNT, Type.DARK, 100, 20, -1, 0, 3)
.unimplemented(),
new StatusMove(Moves.HELPING_HAND, Type.NORMAL, -1, 20, -1, 5, 3)
@ -4491,7 +4490,7 @@ export function initMoves() {
.makesContact(false)
.target(MoveTarget.ATTACKER),
new AttackMove(Moves.U_TURN, Type.BUG, MoveCategory.PHYSICAL, 70, 100, 20, -1, 0, 4)
.attr(ForceSwitchOutAttr, true),
.attr(ForceSwitchOutAttr, true, false),
new AttackMove(Moves.CLOSE_COMBAT, Type.FIGHTING, MoveCategory.PHYSICAL, 120, 100, 5, 100, 0, 4)
.attr(StatChangeAttr, [ BattleStat.DEF, BattleStat.SPDEF ], -1, true),
new AttackMove(Moves.PAYBACK, Type.DARK, MoveCategory.PHYSICAL, 50, 100, 10, -1, 0, 4)
@ -4895,7 +4894,7 @@ export function initMoves() {
new AttackMove(Moves.GRASS_PLEDGE, Type.GRASS, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 5)
.partial(),
new AttackMove(Moves.VOLT_SWITCH, Type.ELECTRIC, MoveCategory.SPECIAL, 70, 100, 20, -1, 0, 5)
.attr(ForceSwitchOutAttr, true),
.attr(ForceSwitchOutAttr, true, false),
new AttackMove(Moves.STRUGGLE_BUG, Type.BUG, MoveCategory.SPECIAL, 50, 100, 20, 100, 0, 5)
.attr(StatChangeAttr, BattleStat.SPATK, -1)
.target(MoveTarget.ALL_NEAR_ENEMIES),
@ -5041,7 +5040,7 @@ export function initMoves() {
.target(MoveTarget.ALL_NEAR_ENEMIES),
new StatusMove(Moves.PARTING_SHOT, Type.DARK, 100, 20, 100, 0, 6)
.attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.SPATK ], -1)
.attr(ForceSwitchOutAttr, true)
.attr(ForceSwitchOutAttr, true, false)
.soundBased(),
new StatusMove(Moves.TOPSY_TURVY, Type.DARK, -1, 20, -1, 0, 6)
.attr(InvertStatsAttr),
@ -5665,7 +5664,7 @@ export function initMoves() {
.attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.DEF ], 1)
.target(MoveTarget.NEAR_ALLY),
new AttackMove(Moves.FLIP_TURN, Type.WATER, MoveCategory.PHYSICAL, 60, 100, 20, -1, 0, 8)
.attr(ForceSwitchOutAttr, true),
.attr(ForceSwitchOutAttr, true, false),
new AttackMove(Moves.TRIPLE_AXEL, Type.ICE, MoveCategory.PHYSICAL, 20, 90, 10, -1, 0, 8)
.attr(MultiHitAttr, MultiHitType._3_INCR)
.attr(MissEffectAttr, (user: Pokemon, move: Move) => {

View File

@ -203,6 +203,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = {
[Species.BEEDRILL]: [
[ 0, Moves.TWINEEDLE ],
[ 1, Moves.FURY_ATTACK ],
[ 11, Moves.FURY_CUTTER ],
[ 14, Moves.RAGE ],
[ 17, Moves.PURSUIT ],
[ 20, Moves.FOCUS_ENERGY ],

View File

@ -1183,8 +1183,13 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
if (cancelled.value)
result = HitResult.NO_EFFECT;
else {
if (source.findTag(t => t instanceof TypeBoostTag && (t as TypeBoostTag).boostedType === type))
power.value *= 1.5;
let typeBoost = source.findTag(t => t instanceof TypeBoostTag && (t as TypeBoostTag).boostedType === type) as TypeBoostTag;
if (typeBoost) {
power.value *= typeBoost.boostValue;
if (typeBoost.oneUse) {
this.removeTag(typeBoost.tagType);
}
}
const arenaAttackTypeMultiplier = this.scene.arena.getAttackTypeMultiplier(type, source.isGrounded());
if (this.scene.arena.getTerrainType() === TerrainType.GRASSY && this.isGrounded() && type === Type.GROUND && move.moveTarget === MoveTarget.ALL_NEAR_OTHERS)
power.value /= 2;

View File

@ -1,4 +1,13 @@
export const move = {
interface MoveTranslationEntry {
name: string,
effect: string
}
interface MoveTranslations {
[key: string]: MoveTranslationEntry
}
export const move: MoveTranslations = {
"pound": {
name: "Pound",
effect: "The target is physically pounded with a long tail, a foreleg, or the like."
@ -3399,6 +3408,138 @@ export const move = {
name: "Take Heart",
effect: "The user lifts its spirits, curing its own status conditions and boosting its Sp. Atk and Sp. Def stats."
},
"gMaxWildfire": {
name: "G-Max Wildfire",
effect: "A Fire-type attack that Gigantamax Charizard use. This move continues to deal damage to opponents for four turns."
},
"gMaxBefuddle": {
name: "G-Max Befuddle",
effect: "A Bug-type attack that Gigantamax Butterfree use. This move inflicts the poisoned, paralyzed, or asleep status condition on opponents."
},
"gMaxVoltCrash": {
name: "G-Max Volt Crash",
effect: "An Electric-type attack that Gigantamax Pikachu use. This move paralyzes opponents."
},
"gMaxGoldRush": {
name: "G-Max Gold Rush",
effect: "A Normal-type attack that Gigantamax Meowth use. This move confuses opponents and also earns extra money."
},
"gMaxChiStrike": {
name: "G-Max Chi Strike",
effect: "A Fighting-type attack that Gigantamax Machamp use. This move raises the chance of critical hits."
},
"gMaxTerror": {
name: "G-Max Terror",
effect: "A Ghost-type attack that Gigantamax Gengar use. This Pokémon steps on the opposing Pokémon's shadow to prevent them from escaping."
},
"gMaxResonance": {
name: "G-Max Resonance",
effect: "An Ice-type attack that Gigantamax Lapras use. This move reduces the damage received for five turns."
},
"gMaxCuddle": {
name: "G-Max Cuddle",
effect: "A Normal-type attack that Gigantamax Eevee use. This move infatuates opponents."
},
"gMaxReplenish": {
name: "G-Max Replenish",
effect: "A Normal-type attack that Gigantamax Snorlax use. This move restores Berries that have been eaten."
},
"gMaxMalodor": {
name: "G-Max Malodor",
effect: "A Poison-type attack that Gigantamax Garbodor use. This move poisons opponents."
},
"gMaxStonesurge": {
name: "G-Max Stonesurge",
effect: "A Water-type attack that Gigantamax Drednaw use. This move scatters sharp rocks around the field."
},
"gMaxWindRage": {
name: "G-Max Wind Rage",
effect: "A Flying-type attack that Gigantamax Corviknight use. This move removes the effects of moves like Reflect and Light Screen."
},
"gMaxStunShock": {
name: "G-Max Stun Shock",
effect: "An Electric-type attack that Gigantamax Toxtricity use. This move poisons or paralyzes opponents."
},
"gMaxFinale": {
name: "G-Max Finale",
effect: "A Fairy-type attack that Gigantamax Alcremie use. This move heals the HP of allies."
},
"gMaxDepletion": {
name: "G-Max Depletion",
effect: "A Dragon-type attack that Gigantamax Duraludon use. Reduces the PP of the last move used."
},
"gMaxGravitas": {
name: "G-Max Gravitas",
effect: "A Psychic-type attack that Gigantamax Orbeetle use. This move changes gravity for five turns."
},
"gMaxVolcalith": {
name: "G-Max Volcalith",
effect: "A Rock-type attack that Gigantamax Coalossal use. This move continues to deal damage to opponents for four turns."
},
"gMaxSandblast": {
name: "G-Max Sandblast",
effect: "A Ground-type attack that Gigantamax Sandaconda use. Opponents are trapped in a raging sandstorm for four to five turns."
},
"gMaxSnooze": {
name: "G-Max Snooze",
effect: "A Dark-type attack that Gigantamax Grimmsnarl use. The user lets loose a huge yawn that lulls the targets into falling asleep on the next turn."
},
"gMaxTartness": {
name: "G-Max Tartness",
effect: "A Grass-type attack that Gigantamax Flapple use. This move reduces the opponents' evasiveness."
},
"gMaxSweetness": {
name: "G-Max Sweetness",
effect: "A Grass-type attack that Gigantamax Appletun use. This move heals the status conditions of allies."
},
"gMaxSmite": {
name: "G-Max Smite",
effect: "A Fairy-type attack that Gigantamax Hatterene use. This move confuses opponents."
},
"gMaxSteelsurge": {
name: "G-Max Steelsurge",
effect: "A Steel-type attack that Gigantamax Copperajah use. This move scatters sharp spikes around the field."
},
"gMaxMeltdown": {
name: "G-Max Meltdown",
effect: "A Steel-type attack that Gigantamax Melmetal use. This move makes opponents incapable of using the same move twice in a row."
},
"gMaxFoamBurst": {
name: "G-Max Foam Burst",
effect: "A Water-type attack that Gigantamax Kingler use. This move harshly lowers the Speed of opponents."
},
"gMaxCentiferno": {
name: "G-Max Centiferno",
effect: "A Fire-type attack that Gigantamax Centiskorch use. This move traps opponents in flames for four to five turns."
},
"gMaxVineLash": {
name: "G-Max Vine Lash",
effect: "A Grass-type attack that Gigantamax Venusaur use. This move continues to deal damage to opponents for four turns."
},
"gMaxCannonade": {
name: "G-Max Cannonade",
effect: "A Water-type attack that Gigantamax Blastoise use. This move continues to deal damage to opponents for four turns."
},
"gMaxDrumSolo": {
name: "G-Max Drum Solo",
effect: "A Grass-type attack that Gigantamax Rillaboom use. This move can be used on the target regardless of its Abilities."
},
"gMaxFireball": {
name: "G-Max Fireball",
effect: "A Fire-type attack that Gigantamax Cinderace use. This move can be used on the target regardless of its Abilities."
},
"gMaxHydrosnipe": {
name: "G-Max Hydrosnipe",
effect: "A Water-type attack that Gigantamax Inteleon use. This move can be used on the target regardless of its Abilities."
},
"gMaxOneBlow": {
name: "G-Max One Blow",
effect: "A Dark-type attack that Gigantamax Urshifu use. This single-strike move can ignore Max Guard."
},
"gMaxRapidFlow": {
name: "G-Max Rapid Flow",
effect: "A Water-type attack that Gigantamax Urshifu use. This rapid-strike move can ignore Max Guard."
},
"teraBlast": {
name: "Tera Blast",
effect: "If the user has Terastallized, it unleashes energy of its Tera Type. This move inflicts damage using the Attack or Sp. Atk stat-whichever is higher for the user."