From abacd29808a2f2fe225903168c8b3721db436568 Mon Sep 17 00:00:00 2001 From: Kris Johnson <11083252+KrisXV@users.noreply.github.com> Date: Sun, 6 Oct 2024 11:02:54 -0600 Subject: [PATCH] Remove Gen-NEXT --- config/formats.ts | 8 - data/mods/gennext/README.md | 535 -------- data/mods/gennext/abilities.ts | 684 ---------- data/mods/gennext/conditions.ts | 387 ------ data/mods/gennext/formats-data.ts | 62 - data/mods/gennext/items.ts | 178 --- data/mods/gennext/moves.ts | 2118 ----------------------------- data/mods/gennext/pokedex.ts | 18 - data/mods/gennext/scripts.ts | 145 -- server/chat-commands/info.ts | 12 - sim/pokemon.ts | 1 - 11 files changed, 4148 deletions(-) delete mode 100644 data/mods/gennext/README.md delete mode 100644 data/mods/gennext/abilities.ts delete mode 100644 data/mods/gennext/conditions.ts delete mode 100644 data/mods/gennext/formats-data.ts delete mode 100644 data/mods/gennext/items.ts delete mode 100644 data/mods/gennext/moves.ts delete mode 100644 data/mods/gennext/pokedex.ts delete mode 100644 data/mods/gennext/scripts.ts diff --git a/config/formats.ts b/config/formats.ts index 2af2516a17ce..5b2b2334a8cc 100644 --- a/config/formats.ts +++ b/config/formats.ts @@ -385,14 +385,6 @@ export const Formats: import('../sim/dex-formats').FormatList = [ pokemon.apparentType = pokemon.getTypes(true).join('/'); }, }, - { - name: "[Gen 6] NEXT OU", - mod: 'gennext', - searchShow: false, - challengeShow: false, - ruleset: ['Obtainable', 'Standard NEXT', 'Team Preview'], - banlist: ['Uber'], - }, // Draft League /////////////////////////////////////////////////////////////////// diff --git a/data/mods/gennext/README.md b/data/mods/gennext/README.md deleted file mode 100644 index 4403733a35ee..000000000000 --- a/data/mods/gennext/README.md +++ /dev/null @@ -1,535 +0,0 @@ -Generation NEXT! -======================================================================== - -Instructions ------------------------------------------------------------------------- - -Gen-NEXT hasn't been updated in a very long time, but is still playable by -using the `/challenge gen6nextou` command in a PM chat box. - -Manifesto ------------------------------------------------------------------------- - -The goal of NEXT is to improve the diversity of the OU metagame by only doing -things that could plausibly be done between gens. - -Specifically, the core rules of NEXT are: - -1. no base stat changes -2. no removing from movepools -3. no removing from ability distribution -4. no typing changes (except on formes) -5. no buffing OU mons, except maybe tiny buffs to mons at the bottom of OU -6. no doing things that make zero sense flavor-wise - -What's left is mainly changes to how abilities and moves work, which is -most of what NEXT is about. - -A good example is what Game Freak did by giving Ditto the Imposter ability. -This gave a Ditto a role in OU, while still making sense flavor-wise, and -without removing anything it used to have. - -A good example of what NEXT changes is Cherrim. We have taken an interesting -idea (ability designed for Sunny Day support) and made it viable in OU. - -This approach is in sharp contrast to many mods that do change many things on -NEXT's "don't change" list. The result is a metagame that feels a lot like -a new generation: existing OU threats stay mostly the same, but many new -threats and strategies are introduced. - -And yes, we know that "no base stat changes" has been broken in Gen 6. We're -still not doing it, because it's hard to constrain and hard to keep track of. - -Recent changes ------------------------------------------------------------------------- - -A changelog for NEXT is available here: - -https://github.com/smogon/pokemon-showdown/commits/master/data/mods/gennext - -Changes ------------------------------------------------------------------------- - -Generation NEXT currently makes the following changes: - -Major changes: - -- Stealth Rock now does 1/4 damage against Flying-types, and 1/8 damage against - everything else. - -- Drives will change Genesect's typing immediately after switch-in, to Bug/Ice, - Bug/Fire, Bug/Electric, or Bug/Water. However, Download will not activate for - Genesect unless it holds a Drive. - -- Unown gets an item named Strange Orb (select "Stick" in the teambuilder) - It doubles its SpA, SpD, and Spe, and changes its type to the type of its - Hidden Power. - -- Weather moves, such as Sunny Day, Rain Dance, Hail, and Sandstorm have +1 - Priority. - -- Forecast will make weather moves last forever. Cherrim will make Sunny Day - last forever. Phione will make Rain Dance last forever. Cryogonal will make - Hail last forever. Probopass will make Sandstorm last forever. - -- Hail is improved: - - Silver Wind, Ominous Wind, and Avalanche deal 1.5x damage in Hail - - Snow Cloak no longer modifies evasion, but instead decreases damage by 25% - in Hail (and 12.5% out of Hail) - - Ice Body has 30% chance of freezing a contact move (and grants passive - healing out of Hail, too) - - Thick Fat, Marvel Scale, and Flame Body grant immunity to Hail damage - -- Freezing doesn't have a 20% thaw chance. Instead, thawing happens at the end - of the second turn. Because this new freeze effect is a nerf, Blizzard now - has a 30% chance of inflicting freeze. - -- Swift Swim, Chlorophyll, and Sand Rush are nerfed to give a 1.5x speed buff instead. - -- Every Hidden Ability is released. - -- Moves with a charge turn are now a lot more powerful. They remove Protect and - Substitute before hitting, they always crit (although their base power has - been adjusted accordingly), they have perfect accuracy, and one other change - depending on the move: - - SolarBeam: heal 50% on the charge turn, 80 bp - - Razor Wind: 100% confusion, 60 bp - - Skull Bash: +1 Def, +1 SpD, +1 accuracy on the charge turn, 70 bp - - Sky Attack: 100% -1 Def, 95 bp - - Freeze Shock: 100% paralysis, 95 bp - - Ice Burn: 100% burn, 95 bp - - Bounce: 30% paralysis, 60 bp - - Fly: 100% -1 Def, 60 bp - - Dig: 100% -1 Def, 60 bp - - Dive: 100% -1 Def, 60 bp - - Shadow Force: 100% Ghost-Curse, 40 bp - - Sky Drop: 100% -1 Def, 60 bp - - Phantom Force: 100% -1 Def, 60 bp - -- Recharge moves are similarly buffed. They have 100 base power, always crit, - and they only recharge if they KO. Be careful - in return for a KO, they - still give the foe a free switch-in _and_ a turn to set up. - -- Flower Gift now only boosts Sp. Def, but if Sunny Day is used while Cherrim - is out, the next switch-in also receives +1 SpD - -- All Quiver Dancers (except Smeargle) get an item named Gossamer Wing (Select - "Stick" in the teambuilder). It makes them take half damage from Rock, Ice, - and Electric moves if they are Flying type, prevents them from taking - double SR damage, heals 1/16 after using a Status move, and makes Twister - do 1.5x Damage. - -- Swarm also makes the user take half damage from Rock, Ice, Electric moves, - and Stealth Rock if they are Flying type. - -- Relic Song switches Meloetta's SpA and Atk EVs, boosts, and certain natures, - specifically: Modest <-> Adamant, Jolly <-> Timid, other natures are left - untouched. It's now 60 base power +1 priority, with no secondary. - -- Shuckle gets Berry Shell (select "Stick" in the teambuilder), which gives a - 50% boost to Defense and Sp. Def. - -- Ambipom, Spinda, and Mr. Mime get Sketch as an egg move, allowing it to use - exactly one move not normally in its learnset. - -- Spinda gets V-Create, Superpower, Close Combat, Overheat, Leaf Storm, Draco - Meteor. - -- Echoed Voice now has 80 base power, hits once, and then, 2 turns later, - hits again for 80 base power. It's like Doom Desire, except it still hits - that first time. - -- Confusion now deals 30 base power damage every attack, but does not stop - the attack. It now lasts 3-5 turns. - -- Parental Bond now deals half damage on both hits, but confers perfect - accuracy like all multi-hit moves. - -- Life Orb now behaves much more consistently as normal recoil. Reckless - will boost every move if Life Orb is held, and Rock Head will negate Life - Orb recoil. - -- Twister is now a 80 base power Flying move with a 30% confusion chance - -- Floette-Eternal-Flower is released. - -New mechanic: Signature Pokémon: - -- Certain moves have a Signature Pokémon associated with them. A move will - deal 1.5x its usual damage when used by its Signature Pokémon. Some of these - moves also receive other changes that apply to all Pokémon using the move - - those changes are listed in parentheses. - - - Flareon: Fire Fang (20% burn, 30% flinch, 100% accuracy) - - - Walrein: Ice Fang (20% freeze, 30% flinch, 100% accuracy) - - - Luxray: Thunder Fang (20% paralysis, 30% flinch, 100% accuracy) - - - Drapion: Poison Fang (65 base power, 100% toxic poison, 30% flinch) - - - Seviper: Poison Tail (60 base power, 60% toxic poison) - - - Muk: Sludge (60 base power, 100% poison) - - - Weezing: Smog (75 base power, 100% poison, 100% accuracy) - - - Rapidash: Flame Charge (60 base power) - - - Darmanitan: Flame Wheel - - - Eelektross: Spark - - - Hitmontop: Triple Kick - - - Kingdra: BubbleBeam (30% -1 Spe) - - - Galvantula: Electroweb (60 base power, 100% accuracy) - - - Skarmory: Steel Wing (60 base power, 100% accuracy, 50% +1 Def) - - - Beautifly: Giga Drain - - - Glaceon: Icy Wind (60 base power, 100% accuracy) - - - Swampert: Mud Shot (60 base power, 100% accuracy) - - - Kyurem: Glaciate (80 base power, 100% accuracy) - - - Octillery: Octazooka (75 base power, 90% accuracy, 100% -1 accuracy) - - - Serperior: Leaf Tornado (75 base power, 90% accuracy, 100% -1 accuracy) - - - Weavile: Ice Shard - - - Sharpedo: Aqua Jet - - - Hitmonchan: Mach Punch - - - Banette: Shadow Sneak - - - Masquerain: Surf (10% -1 Spe) - - - Snorlax: Snore (100 base power) - - - Persian: Slash (60 base power 30% -1 Def) - -- Again, note that while the Signature Pokémon will get the 1.5x damage boost, - all Pokémon will get the other changes to the move listed above. - -New mechanic: Intrinsics: - -- Pokémon that previously get Levitate are now immune to Ground intrinsically, although - Mold Breaker still bypasses this immunity. Instead, many of them get new abilities - in addition to their Ground immunity: - - - Azelf: Steadfast - - - Bronzong: Heatproof - - - Claydol: Filter - - - Cryogonal: Ice Body - - - Eelektross: Poison Heal - - - Flygon: Compoundeyes, Sand Rush - - - Hydreigon: Sheer Force - - - Mesprit: Serene Grace - - - Mismagius: Cursed Body - - - Rotom (all formes): Trace - - - Unown: Shadow Tag - - - Uxie: Synchronize - - - Weezing: Aftermath - -New: Type-specific items: - -- Big Root: also acts like Leftovers + Shell Bell for Grass types - -- Black Sludge: heals 1/8 per turn for pure Poison types - -- Focus Band: breaks on first hit, but allows pure Fighting types to survive - that hit with 1 HP (so basically it'd be a Focus sash that stays intact - after residual damage); does nothing for other Pokémon - -- Wise Glasses: 1.2x Special damage for pure Psychic types - -- Muscle Band: 1.2x Physical damage for pure Fighting types - -Minor move changes: - -- Parabolic Charge now has 40 base power, but gives -1 SpA, -1 SpD to the - target and +1 SpA, +1 SpD to the user - -- Draining Kiss now has 40 base power, but gives -1 SpA, -1 Atk to the - target and +1 SpA, +1 Atk to the user - -- Defend Order and Heal Order now have +1 priority - -- Rock Throw now removes Stealth Rock from the user's side of the field, - and has 100% accuracy - -- Rapid Spin now has 30 base power - -- Rock Throw and Rapid Spin remove hazards before fainting from Rocky - Helmet etc. And double in power if they remove hazards. - -- All moves' accuracy is rounded up to the nearest multiple of 10% - (including Jump Kick) - -- Charge Beam and Rock Slide are now 100% accurate - -- Blue Flare has 30% burn chance, Fire Blast has 20% burn chance and is - 80% accurate - -- Focus Blast has 30% accuracy (use HP Fighting unless you have No Guard) - -- Close Combat has been nerfed: it now gives -2 Def, -2 SpD - -- Moves that were originally perfect accuracy have their base power increased - to 90 (this includes Aerial Ace, Disarming Voice, and Aura Sphere, among - others) - -- Scald and Steam Eruption's damage is no longer affected by weather: - instead, they get 60% burn chance in sun - -- High Jump Kick now has 100 base power - -- Shadow Ball now has 90 base power and 30% -SpD - -- Multi-hit moves are now all perfect-accuracy - -- Silver Wind, Ominous Wind, and AncientPower have a 100% chance of raising - one of Def/SpA/SpD/Spe at random, rather than a 10% chance of raising every - stat - -- Twineedle has a new base power of 50 - -- Tri Attack now hits 3 times and has a base power of 30 - -- Strength now has a 30% chance of raising user's Atk - -- Cut and Rock Smash are 50 base power and now have a 100% chance of - lowering foe's Def - -- Psycho Cut's Base Power is now 90 - -- Drill Peck, Needle Arm, Attack Order, and Leaf Blade's Base - Powers are now 100 - -- Stomp and Steamroller now have 100 Base Power and perfect accuracy to - reflect their thematic status as counters to Minimize - -- Bide is now a +1 priority move that gives the user Endure (the user - survives all move damage with at least 1 HP) for its duration. Bide fails - if the user has 1 HP when it's used, or if the user's last move used was - Bide. - -- Withdraw gives +1 SpD as well as +1 Def - -- Muddy Water is now 85 base power and 100% accurate - -- Leech Life is now 75 base power - -- Sound-based moves are no longer affected by immunities (ghosts can hear - things) - -- Bonemerang, Bone Club and Bone Rush are no longer affected by immunities - (you can throw a bone to hit birds), Bone Rush nerfed to 20 base power - since it should never be viable - -- Wing Attack and Power Gem are now like Dual Chop: 40 base power, 2-hit - -- Autotomize now gives +3 Speed - -- Zoroark gets a significantly wider movepool. It now learns: Ice Beam, Giga - Drain, Earthquake, Stone Edge, Superpower, X-Scissor - -- If Illusion is active, Night Daze now displays as a random non-Status move - in the copied Pokémon's moveset - -- Selfdestruct and Explosion are now 200 and 250 base power autocrit moves, - respectively, and they are both perfect-accuracy - -- Acid and Acid Spray aren't affected by immunities - -- Protect does not protect Substitutes (with passive healing being more - common, Sub/Protect stalling could be overpowered) and Substitutes increase - accuracy against them to 100% - -- Dizzy Punch is 90 base power, 50% confusion chance - -- Sacred Sword now has 95 base power - -- Egg Bomb is now 40 base power autocrit - -- Minimize only increases evasion by one stage - -- Double Team takes 25% of user's max HP (like Substitute) - -Minor learnset changes: - -- Azumarill gets Belly Drum with no incompatibilities - -- Mantine gets many new moves: Recover, Whirlwind, Baton Pass, Wish, Soak, - Lock-On, Acid Spray, Octazooka, Stockpile - -- Masquerain gets Surf - -- Butterfree, Beautifly, Masquerain, and Mothim get Hurricane - -- Roserade gets Sludge - -- Meloetta gets Fiery Dance - -- Galvantula gets Zap Cannon - -- Virizion gets Horn Leech - -- Scolipede and Steelix get Coil - -- Lumineon, Ampharos, and Lanturn get Tail Glow - -- Rotom formes learn more things: - - Rotom-Wash: BubbleBeam - - Rotom-Fan: Hurricane, Twister - - Rotom-Frost: Frost Breath - - Rotom-Heat: Heat Wave - - Rotom-Mow: Magical Leaf - -- Starters get a new ability option - - Venusaur: Leaf Guard - - Charizard: Flame Body - - Blastoise: Shell Armor - - Meganium: Harvest - - Typhlosion: Magma Armor - - Feraligatr: Strong Jaw - - Sceptile: Limber - - Blaziken: Reckless - - Swampert: Hydration - - Torterra: Weak Armor - - Infernape: No Guard - - Empoleon: Ice Body - - Serperior: Own Tempo - - Emboar: Sheer Force - - Samurott: Technician - - Chesnaught: Battle Armor - - Delphox: Magic Guard - - Greninja: Pickpocket - -- Crawdaunt's Hidden Ability is now Tough Claws (this is because of a - nerf to Adaptability which is discussed below) - -Minor ability changes: - -- Static, Poison Point, and Cute Charm now always activate on - contact. - -- Weak Armor reduces incoming move damage by 1/10 of the user's max HP - and increases the user's Speed for the first hit after switch-in (and - does not activate again until the next switch-in) instead of its - previous effect - -- Shell Armor and Battle Armor reduce incoming move damage by 1/10 of - the user's max HP in addition to their crit negation (also, Shell - Armor is removed when using Shell Smash) - -- Magma Armor reduces incoming move damage by 1/10 of the user's max HP, - provides immunity to Hail and freeze, and provides a one-time immunity - to Water and Ice, after which it turns into Battle Armor - -- Prism Armor reduces incoming move damage by 1/10 of the user's max HP in addition to its normal effects. - -- Adaptability is now 1.33x to non-STAB moves instead of to STAB moves - -- Shadow Tag now lasts only one turn - -- Static and Poison Point have a 100% chance of activating - -- Speed Boost does not activate on turns Protect, Detect, Endure, etc - are used - -- Telepathy grants Imprison on switch-in - -- Compound Eyes and Keen Eye now grant 1.6x accuracy (this replaces Keen - Eye's previous effect) - -- Victory Star grants 1.5x accuracy (but only for the user) - -- Solid Rock and Filter now reduce damage of SE moves by 1/2, not 1/4 - -- Iron Fist now grants a 1.33x boost to punching moves - -- Outrage, Thrash, and Petal Dance don't lock if the user has Own Tempo - -- Stench now grants a 40% flinch chance - -- Slow Start now only lasts 3 turns instead of 5 - -- Truant will only activate if a move succeeds (e.g. not if it misses, fails, - or is Protected against), and will heal the user by 33% during its Truant - turn - -- Clear Body and White Smoke prevents all stat lowering (relevant: the Regis' - Superpower, Metagross' Hammer Arm, and Torkoal's Overheat) - -- Thick Fat grants half damage from Fighting - -- Aftermath no longer requires contact, and is buffed to deal 1/3 of the - foe's max HP - -- Cursed Body works like Aftermath now, but instead of dealing damage, it - causes the foe to be Cursed (like Ghost-type Curse) - -- Gluttony allows a Pokémon to use a Berry twice - -- Heatproof now grants the user immunity to Fire and burns - -- Guts, Quick Feet, and Toxic Boost take half damage from poisoning - -- Guts, Quick Feet, and Flare Boost take half damage from burns - -- Sand Veil grants 20% damage reduction in sand (this replaces Sand Veil's - usual effect) - -- Water Veil grans 12.5% damage reduction out of rain and 25% damage - reduction in rain, in addition to its usual effect - -- Multiscale decreases damage by 1/3 rather than 1/2 (Sorry, Dragonite, - this is in exchange for a usable physical Flying STAB from a buffed - Aerial Ace) - -Minor item changes: - -- Zoom Lens now grants 1.6x accuracy - -- Wide Lens now grants 1.3x accuracy - -Bans: - -- The OU banlist (i.e. Pokémon considered Uber) is now: - - Every Pokémon with over 600 BST except Slaking, Regigigas, and Hoopa-Unbound - - Deoxys (all formes) - - Darkrai - - Shaymin-Sky - -- The following clauses are in effect: - - OHKO Clause - - Sleep Clause - - Soul Dew is banned - -Specifically, differences from regular OU: - -- unbanned: Aegislash, Blaziken, Genesect, Landorus, Gengarite, Kangaskhanite, - Lucarionite, Mawilite, Salamencite - -- banned: Hoopa-Unbound, Kyurem, Kyurem-Black - -- There is no Moody Clause or Evasion Clause diff --git a/data/mods/gennext/abilities.ts b/data/mods/gennext/abilities.ts deleted file mode 100644 index d1d39969fe31..000000000000 --- a/data/mods/gennext/abilities.ts +++ /dev/null @@ -1,684 +0,0 @@ -export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTable = { - swiftswim: { - inherit: true, - onModifySpe(spe, pokemon) { - if (this.field.isWeather(['raindance', 'primordialsea'])) { - return this.chainModify(1.5); - } - }, - shortDesc: "If Rain Dance is active, this Pokemon's Speed is multiplied by 1.5.", - }, - chlorophyll: { - inherit: true, - onModifySpe(spe) { - if (this.field.isWeather(['sunnyday', 'desolateland'])) { - return this.chainModify(1.5); - } - }, - shortDesc: "If Sunny Day is active, this Pokemon's Speed is multiplied by 1.5.", - }, - sandrush: { - inherit: true, - onModifySpe(spe, pokemon) { - if (this.field.isWeather('sandstorm')) { - return this.chainModify(1.5); - } - }, - shortDesc: "If Sandstorm is active, this Pokemon's Speed is multiplied by 1.5.", - }, - slushrush: { - inherit: true, - onModifySpe(spe, pokemon) { - if (this.field.isWeather('hail')) { - return this.chainModify(1.5); - } - }, - shortDesc: "If Hail is active, this Pokemon's Speed is multiplied by 1.5.", - }, - forecast: { - inherit: true, - onModifyMove(move) { - if (move.weather) { - const weather = move.weather; - move.weather = ''; - move.onHit = function (target, source) { - this.field.setWeather(weather, source, this.dex.abilities.get('forecast')); - this.field.weatherState.duration = 0; - }; - move.target = 'self'; - } - }, - desc: "If this Pokemon is a Castform, its type changes to the current weather condition's type, except Sandstorm. Weather moves last forever.", - shortDesc: "Castform's type changes to the current weather condition's type, except Sandstorm; weather moves last forever.", - }, - thickfat: { - inherit: true, - onImmunity(type, pokemon) { - if (type === 'hail') return false; - }, - onSourceModifyAtk(atk, attacker, defender, move) { - if (move.type === 'Ice' || move.type === 'Fire' || move.type === 'Fighting') { - this.add('-message', "The attack was weakened by Thick Fat!"); - return this.chainModify(0.5); - } - }, - onSourceModifySpA(atk, attacker, defender, move) { - if (move.type === 'Ice' || move.type === 'Fire' || move.type === 'Fighting') { - this.add('-message', "The attack was weakened by Thick Fat!"); - return this.chainModify(0.5); - } - }, - desc: "If a Pokemon uses a Fire- or Ice- or Fighting-type attack against this Pokemon, that Pokemon's attacking stat is halved when calculating the damage to this Pokemon. This Pokemon takes no damage from Hail.", - shortDesc: "Fire/Ice/Fighting-type moves against this Pokemon deal damage with a halved attacking stat; immunity to Hail.", - }, - marvelscale: { - inherit: true, - onImmunity(type, pokemon) { - if (type === 'hail') return false; - }, - desc: "If this Pokemon has a major status condition, its Defense is multiplied by 1.5. This Pokemon takes no damage from Hail.", - shortDesc: "If this Pokemon is statused, its Defense is 1.5x; immunity to Hail.", - }, - snowcloak: { - inherit: true, - onSourceBasePower(basePower) { - if (this.field.isWeather('hail')) { - return basePower * 3 / 4; - } - return basePower * 7 / 8; - }, - onModifyAccuracy() {}, - desc: "If Hail is active, attacks against this Pokemon do 25% less than normal. If Hail is not active, attacks against this Pokemon do 12.5% less than normal. This Pokemon takes no damage from Hail.", - shortDesc: "If Hail is active, attacks against this Pokemon do 25% less; immunity to Hail.", - }, - sandveil: { - inherit: true, - desc: "If Sandstorm is active, attacks against this Pokemon do 25% less than normal. If Sandstorm is not active, attacks against this Pokemon do 12.5% less than normal. This Pokemon takes no damage from Sandstorm.", - shortDesc: "If Sandstorm is active, attacks against this Pokemon do 25% less; immunity to Sandstorm.", - onSourceBasePower(basePower) { - if (this.field.isWeather('sandstorm')) { - return basePower * 4 / 5; - } - }, - onModifyAccuracy() {}, - }, - waterveil: { - inherit: true, - onSourceBasePower(basePower) { - if (this.field.isWeather(['raindance', 'primordialsea'])) { - return basePower * 3 / 4; - } - return basePower * 7 / 8; - }, - desc: "If Rain Dance is active, attacks against this Pokemon do 25% less than normal. This Pokemon cannot be burned. Gaining this Ability while burned cures it.", - shortDesc: "If Rain Dance is active, attacks against this Pokemon do 25% less; This Pokemon cannot be burned.", - }, - icebody: { - inherit: true, - desc: "This Pokemon restores 1/16 of its maximum HP, rounded down, at the end of each turn. This Pokemon takes no damage from Hail. There is a 30% chance a Pokemon making contact with this Pokemon will be frozen.", - shortDesc: "This Pokemon heals 1/16 of its max HP each turn; immunity to Hail; 30% chance a Pokemon making contact with this Pokemon will be frozen.", - onResidual(target, source, effect) { - this.heal(target.baseMaxhp / 16); - }, - onDamagingHit(damage, target, source, move) { - if (move.flags['contact'] && this.field.isWeather('hail')) { - if (this.randomChance(3, 10)) { - source.trySetStatus('frz', target); - } - } - }, - onWeather() {}, - }, - flamebody: { - inherit: true, - onImmunity(type, pokemon) { - if (type === 'hail') return false; - }, - shortDesc: "30% chance a Pokemon making contact with this Pokemon will be burned; immunity to Hail.", - }, - static: { - inherit: true, - onDamagingHit(damage, target, source, move) { - if (move.flags['contact']) { - source.trySetStatus('par', target); - } - }, - shortDesc: "100% chance a Pokemon making contact with this Pokemon will be paralyzed.", - }, - cutecharm: { - inherit: true, - onDamagingHit(damage, target, source, move) { - if (move.flags['contact']) { - source.addVolatile('Attract', target); - } - }, - desc: "There is a 100% chance a Pokemon making contact with this Pokemon will become infatuated if it is of the opposite gender.", - shortDesc: "100% chance of infatuating Pokemon of the opposite gender if they make contact.", - }, - poisonpoint: { - inherit: true, - onDamagingHit(damage, target, source, move) { - if (move.flags['contact']) { - source.trySetStatus('psn', target); - } - }, - shortDesc: "100% chance a Pokemon making contact with this Pokemon will be poisoned.", - }, - flowergift: { - inherit: true, - onModifyMove(move) { - if (move.id === 'sunnyday') { - const weather = move.weather as string; - move.weather = ''; - move.onHit = function (target, source) { - this.field.setWeather(weather, source, this.dex.abilities.get('flowergift')); - this.field.weatherState.duration = 0; - }; - move.target = 'self'; - move.sideCondition = 'flowergift'; - } - }, - onUpdate(pokemon) { - if (this.field.isWeather(['sunnyday', 'desolateland'])) { - if (pokemon.isActive && pokemon.species.id === 'cherrim' && this.effectState.forme !== 'Sunshine') { - this.effectState.forme = 'Sunshine'; - this.add('-formechange', pokemon, 'Cherrim-Sunshine', '[msg]'); - this.boost({spd: 1}); - } - } else if (pokemon.isActive && pokemon.species.id === 'cherrim' && this.effectState.forme) { - delete this.effectState.forme; - this.add('-formechange', pokemon, 'Cherrim', '[msg]'); - } - }, - condition: { - onSwitchInPriority: 1, - onSwitchIn(target) { - if (!target.fainted) { - this.boost({spd: 1}, target, target, this.dex.abilities.get('flowergift')); - } - target.side.removeSideCondition('flowergift'); - }, - }, - desc: "If this Pokemon is a Cherrim and Sunny Day is active, it changes to Sunshine Form and the Special Defense of it is multiplied by 1.5. The next Pokemon that switches in gets its Special Defense also multiplied by 1.5.", - shortDesc: "If user is Cherrim and Sunny Day is active, its Sp. Def is multiplied by 1.5; the next switch-in also gets its SpD multiplied by 1.5.", - }, - slowstart: { - inherit: true, - condition: { - duration: 3, - onStart(target) { - this.add('-start', target, 'Slow Start'); - }, - onModifyAtk(atk, pokemon) { - if (pokemon.ability !== 'slowstart') { - pokemon.removeVolatile('slowstart'); - return; - } - return atk / 2; - }, - onModifySpe(spe, pokemon) { - if (pokemon.ability !== 'slowstart') { - pokemon.removeVolatile('slowstart'); - return; - } - return spe / 2; - }, - onEnd(target) { - this.add('-end', target, 'Slow Start'); - }, - }, - shortDesc: "On switch-in, this Pokemon's Attack and Speed are halved for 3 turns.", - }, - compoundeyes: { - inherit: true, - desc: "The accuracy of this Pokemon's moves receives a 60% increase; for example, a 50% accurate move becomes 80% accurate.", - shortDesc: "This Pokemon's moves have their Accuracy boosted to 1.6x.", - onSourceModifyAccuracy(accuracy) { - if (typeof accuracy !== 'number') return; - this.debug('compoundeyes - enhancing accuracy'); - return accuracy * 1.6; - }, - }, - keeneye: { - inherit: true, - desc: "The accuracy of this Pokemon's moves receives a 60% increase; for example, a 50% accurate move becomes 80% accurate.", - shortDesc: "This Pokemon's moves have their Accuracy boosted to 1.6x.", - onModifyMove(move) { - if (typeof move.accuracy !== 'number') return; - this.debug('keeneye - enhancing accuracy'); - move.accuracy *= 1.6; - }, - }, - solidrock: { - inherit: true, - shortDesc: "This Pokemon receives 1/2 damage from supereffective attacks.", - onSourceModifyDamage(damage, attacker, defender, move) { - if (defender.getMoveHitData(move).typeMod > 0) { - this.add('-message', "The attack was weakened by Solid Rock!"); - return this.chainModify(0.5); - } - }, - }, - filter: { - inherit: true, - shortDesc: "This Pokemon receives 1/2 damage from supereffective attacks.", - onSourceModifyDamage(damage, attacker, defender, move) { - if (defender.getMoveHitData(move).typeMod > 0) { - this.add('-message', "The attack was weakened by Filter!"); - return this.chainModify(0.5); - } - }, - }, - heatproof: { - inherit: true, - desc: "The user is completely immune to Fire-type moves and burn damage.", - shortDesc: "The user is immune to Fire type attacks and burn damage.", - onImmunity(type, pokemon) { - if (type === 'Fire' || type === 'brn') return false; - }, - }, - reckless: { - inherit: true, - onBasePower(basePower, attacker, defender, move) { - if (move.recoil || move.hasCrashDamage || attacker.item === 'lifeorb') { - this.debug('Reckless boost'); - return basePower * 12 / 10; - } - }, - desc: "This Pokemon's attacks with recoil or crash damage or if the user is holding a Life Orb have their power multiplied by 1.2. Does not affect Struggle.", - shortDesc: "This Pokemon's attacks with recoil or crash damage or the user's item is Life Orb have 1.2x power; not Struggle.", - }, - clearbody: { - inherit: true, - onTryBoost(boost, target, source) { - let i: BoostID; - for (i in boost) { - if (boost[i]! < 0) { - delete boost[i]; - this.add("-message", target.name + "'s stats were not lowered! (placeholder)"); - } - } - }, - shortDesc: "Prevents any negative stat changes on this Pokemon.", - }, - whitesmoke: { - inherit: true, - onTryBoost(boost, target, source) { - let i: BoostID; - for (i in boost) { - if (boost[i]! < 0) { - delete boost[i]; - this.add("-message", target.name + "'s stats were not lowered! (placeholder)"); - } - } - }, - shortDesc: "Prevents any negative stat changes on this Pokemon.", - }, - rockhead: { - inherit: true, - onDamage(damage, target, source, effect) { - if (effect && ['lifeorb', 'recoil'].includes(effect.id)) return false; - }, - desc: "This Pokemon does not take recoil damage besides Struggle, and crash damage.", - shortDesc: "This Pokemon does not take recoil damage besides Struggle/crash damage.", - }, - download: { - inherit: true, - onStart(pokemon) { - if (pokemon.species.baseSpecies === 'Genesect') { - if (!pokemon.getItem().onDrive) return; - } - let totaldef = 0; - let totalspd = 0; - for (const foe of pokemon.foes()) { - totaldef += foe.storedStats.def; - totalspd += foe.storedStats.spd; - } - if (totaldef && totaldef >= totalspd) { - this.boost({spa: 1}); - } else if (totalspd) { - this.boost({atk: 1}); - } - }, - desc: "On switch-in, this Pokemon's Attack or Special Attack is raised by 1 stage based on the weaker combined defensive stat of all opposing Pokemon. Attack is raised if their Defense is lower, and Special Attack is raised if their Special Defense is the same or lower. If the user is a Genesect, this will not have effect unless it holds a Drive.", - shortDesc: "On switch-in, Attack or Sp. Atk is raised 1 stage based on the foes' weaker Defense; Genesect must hold a plate for the effect to work.", - }, - victorystar: { - inherit: true, - onAllyModifyMove(move) { - if (typeof move.accuracy === 'number') { - move.accuracy *= 1.5; - } - }, - shortDesc: "This Pokemon's moves' accuracy is multiplied by 1.5.", - }, - shellarmor: { - inherit: true, - onDamage(damage, target, source, effect) { - if (effect && effect.effectType === 'Move') { - this.add('-message', "Its damage was reduced by Shell Armor!"); - damage -= target.maxhp / 10; - if (damage < 0) damage = 0; - return damage; - } - }, - onHit(target, source, move) { - if (move.id === 'shellsmash') { - target.setAbility(''); - } - }, - desc: "This Pokemon cannot be struck by a critical hit. This ability also reduces incoming move damage by 1/10 of the user's max HP. If the user uses Shell Smash, this ability's effect ends.", - shortDesc: "This Pokemon can't be struck critical hit; reduces incoming move damage by 1/10 of the user's max HP.", - }, - prismarmor: { - inherit: true, - onDamage(damage, target, source, effect) { - if (effect && effect.effectType === 'Move') { - this.add('-message', "Its damage was reduced by Prism Armor!"); - damage -= target.maxhp / 10; - if (damage < 0) damage = 0; - return damage; - } - }, - desc: "This Pokemon receives 3/4 damage from supereffective attacks. Moongeist Beam, Sunsteel Strike, and the Abilities Mold Breaker, Teravolt, and Turboblaze cannot ignore this Ability. This ability also reduces incoming move damage by 1/10 of the user's max HP.", - shortDesc: "This Pokemon receives 3/4 damage from supereffective attacks; reduces incoming move damage by 1/10 of the user's max HP.", - }, - battlearmor: { - inherit: true, - onDamage(damage, target, source, effect) { - if (effect && effect.effectType === 'Move') { - this.add('-message', "Its damage was reduced by Battle Armor!"); - damage -= target.maxhp / 10; - if (damage < 0) damage = 0; - return damage; - } - }, - desc: "This Pokemon cannot be struck by a critical hit. This ability also reduces incoming move damage by 1/10 of the user's max HP.", - shortDesc: "This Pokemon can't be struck critical hit; reduces incoming move damage by 1/10 of the user's max HP.", - }, - weakarmor: { - inherit: true, - onDamage(damage, target, source, effect) { - if (effect && effect.effectType === 'Move') { - this.add('-message', "Its damage was reduced by Weak Armor!"); - damage -= target.maxhp / 10; - if (damage < 0) damage = 0; - target.setAbility(''); - this.boost({spe: 1}); - return damage; - } - }, - onDamagingHit() {}, - desc: "This ability reduces incoming move damage by 1/10 of the user's max HP and increases the user's Speed for the first hit after switch-in (and does not activate again until the next switch-in).", - shortDesc: "Reduces incoming move damage by 1/10 of the user's max HP and increases the user's Spe for the 1st hit after switch-in (doesn't activate until next switch-in).", - }, - magmaarmor: { - inherit: true, - onImmunity(type, pokemon) { - if (type === 'hail') return false; - if (type === 'frz') return false; - }, - onDamage(damage, target, source, effect) { - if (effect && effect.effectType === 'Move') { - damage -= target.maxhp / 10; - if (damage < 0) damage = 0; - if (effect.type === 'Ice' || effect.type === 'Water') { - this.add('-activate', target, 'ability: Magma Armor'); - target.setAbility('battlearmor'); - damage = 0; - } else { - this.add('-message', "Its damage was reduced by Magma Armor!"); - } - return damage; - } - }, - desc: "This ability reduces incoming move damage by 1/10 of the user's max HP, provides immunity to Hail and freeze, and provides a one-time immunity to Water and Ice (after which it turns into Battle Armor).", - shortDesc: "Reduces incoming move damage by 1/10 of the user's max HP, provides immunity to Hail & Frz, and provides a 1 time immunity to Water and Ice.", - }, - multiscale: { - inherit: true, - onSourceModifyDamage(damage, source, target, move) { - if (target.hp >= target.maxhp) { - this.add('-message', "The attack was slightly weakened by Multiscale!"); - return this.chainModify(2 / 3); - } - }, - shortDesc: "If this Pokemon is at full HP, damage taken from attacks is lessened by 1/3.", - }, - ironfist: { - inherit: true, - onBasePower(basePower, attacker, defender, move) { - if (move.flags['punch']) { - return basePower * 1.33; - } - }, - desc: "This Pokemon's punch-based attacks have their power multiplied by 1.33.", - shortDesc: "This Pokemon's punch-based attacks have 1.33x power. Sucker Punch is not boosted.", - }, - stench: { - inherit: true, - onModifyMove(move) { - if (move.category !== "Status") { - this.debug('Adding Stench flinch'); - if (!move.secondaries) move.secondaries = []; - for (const secondary of move.secondaries) { - if (secondary.volatileStatus === 'flinch') return; - } - move.secondaries.push({ - chance: 40, - volatileStatus: 'flinch', - }); - } - }, - shortDesc: "This Pokemon's attacks without a chance to flinch have a 40% chance to flinch.", - }, - aftermath: { - inherit: true, - onDamagingHit(damage, target, source, move) { - if (!target.hp) { - this.damage(source.baseMaxhp / 3, source, target, null, true); - } - }, - desc: "If this Pokemon is knocked out, that move's user loses 1/4 of its maximum HP, rounded down. If any active Pokemon has the Ability Damp, this effect is prevented.", - shortDesc: "If this Pokemon is KOed, that move's user loses 1/4 its max HP.", - }, - cursedbody: { - desc: "When this Pokemon faints, attacker is Cursed.", - shortDesc: "When this Pokemon faints, attacker is Cursed.", - onFaint(target, source, effect) { - if (effect && effect.effectType === 'Move' && source) { - source.addVolatile('curse'); - } - }, - name: "Cursed Body", - rating: 3, - num: 130, - }, - gluttony: { - inherit: true, - onResidualOrder: 26, - onResidualSubOrder: 1, - onResidual(pokemon) { - if (!pokemon.m.gluttonyFlag && !pokemon.item && this.dex.items.get(pokemon.lastItem).isBerry) { - pokemon.m.gluttonyFlag = true; - pokemon.setItem(pokemon.lastItem); - pokemon.lastItem = ''; - this.add("-item", pokemon, pokemon.item, '[from] ability: Gluttony'); - } - }, - shortDesc: "When this Pokemon has 1/2 or less of its maximum HP, it uses certain Berries early. Each berry has 2 uses.", - }, - guts: { - inherit: true, - onDamage(damage, attacker, defender, effect) { - if (effect && (effect.id === 'brn' || effect.id === 'psn' || effect.id === 'tox')) { - return damage / 2; - } - }, - desc: "If this Pokemon has a major status condition, its Attack is multiplied by 1.5; burn's physical damage halving is ignored; takes half damage from burn/poison/toxic.", - shortDesc: "If this Pokemon is statused, its Attack is 1.5x; ignores burn halving physical damage; takes 1/2 damage from brn/psn/tox.", - }, - quickfeet: { - inherit: true, - onDamage(damage, attacker, defender, effect) { - if (effect && (effect.id === 'brn' || effect.id === 'psn' || effect.id === 'tox')) { - return damage / 2; - } - }, - desc: "If this Pokemon has a major status condition, its Speed is multiplied by 1.5; the Speed drop from paralysis is ignored; takes half damage from burn/poison/toxic.", - shortDesc: "If this Pokemon is statused, its Speed is 1.5x; ignores Speed drop from paralysis; takes 1/2 damage from brn/psn/tox.", - }, - toxicboost: { - inherit: true, - onDamage(damage, attacker, defender, effect) { - if (effect && (effect.id === 'psn' || effect.id === 'tox')) { - return damage / 2; - } - }, - desc: "While this Pokemon is poisoned, the power of its physical attacks is multiplied by 1.5; takes half damage from poison/toxic.", - shortDesc: "While this Pokemon is poisoned, its physical attacks have 1.5x power; takes 1/2 damage from psn/tox.", - }, - truant: { - inherit: true, - onBeforeMove() {}, - onModifyMove(move, pokemon) { - if (!move.self) move.self = {}; - if (!move.self.volatileStatus) move.self.volatileStatus = 'truant'; - }, - condition: { - duration: 2, - onStart(pokemon) { - this.add('-start', pokemon, 'Truant'); - }, - onBeforeMovePriority: 99, - onBeforeMove(pokemon, target, move) { - if (pokemon.removeVolatile('truant')) { - this.add('cant', pokemon, 'ability: Truant'); - this.heal(pokemon.baseMaxhp / 3); - return false; - } - }, - }, - shortDesc: "This Pokemon will not be able to move the turn after a successful move; heals 1/3 of its max HP on its Truant turn.", - }, - flareboost: { - inherit: true, - onDamage(damage, defender, attacker, effect) { - if (effect && (effect.id === 'brn')) { - return damage / 2; - } - }, - desc: "While this Pokemon is burned, the power of its special attacks is multiplied by 1.5; takes half damage from burns.", - shortDesc: "While this Pokemon is burned, its special attacks have 1.5x power; takes 1/2 damage from brn.", - }, - telepathy: { - inherit: true, - onStart(target) { - this.add('-start', target, 'move: Imprison'); - }, - onFoeDisableMove(pokemon) { - for (const moveSlot of this.effectState.target.moveSlots) { - pokemon.disableMove(moveSlot.id, 'hidden'); - } - pokemon.maybeDisabled = true; - }, - onFoeBeforeMove(attacker, defender, move) { - if (move.id !== 'struggle' && this.effectState.target.hasMove(move.id) && !move.isZ) { - this.add('cant', attacker, 'move: Imprison', move); - return false; - } - }, - shortDesc: "This Pokemon does not take damage from attacks made by its allies; imprisons the target upon entry.", - }, - speedboost: { - inherit: true, - onResidualPriority: -1, - onResidual(pokemon) { - if (pokemon.activeTurns && !pokemon.volatiles['stall']) { - this.boost({spe: 1}); - } - }, - desc: "This Pokemon's Speed is raised by 1 stage at the end of each full turn it has been on the field. This ability does not activate on turns Protect, Detect, Endure, etc are used.", - }, - parentalbond: { - inherit: true, - onModifyMove(move, pokemon, target) { - if (move.category === 'Status' || move.selfdestruct || move.multihit) return; - if (!target) return; - // singles, or single-target move - if (this.activePerHalf === 1 || ['any', 'normal', 'randomNormal'].includes(move.target)) { - move.multihit = 2; - move.accuracy = true; - pokemon.addVolatile('parentalbond'); - } - }, - condition: { - duration: 1, - onBasePowerPriority: 8, - onBasePower(basePower) { - return this.chainModify(0.5); - }, - }, - desc: "This Pokemon's damaging moves become multi-hit moves that hit twice. Both hits' damage are halved. Does not affect multi-hit moves or moves that have multiple targets. The moves that are affected will never miss.", - shortDesc: "This Pokemon's damaging moves hit twice. Both hits have their damage halved. Moves affected have -- accuracy.", - }, - swarm: { - inherit: true, - onFoeBasePower(basePower, attacker, defender, move) { - if (defender.hasType('Flying')) { - if (move.type === 'Rock' || move.type === 'Electric' || move.type === 'Ice') { - this.add('-message', "The attack was weakened by Swarm!"); - return basePower / 2; - } - } - }, - onDamage(damage, defender, attacker, effect) { - if (defender.hasType('Flying')) { - if (effect && effect.id === 'stealthrock') { - return damage / 2; - } - } - }, - desc: "When this Pokemon has 1/3 or less of its maximum HP, rounded down, its attacking stat is multiplied by 1.5 while using a Bug-type attack. The user takes half damage from Rock, Ice, Electric moves, and Stealth Rock if they are Flying type.", - shortDesc: "When this Pokemon has 1/3 or less of its max HP, its Bug attacks do 1.5x damage. The user takes 1/2 damage from Rock/Ice/Electric moves, and Stealth Rock, if the user is Flying type.", - }, - adaptability: { - inherit: true, - onModifySTAB() {}, - onBasePower(power, attacker, defender, move) { - if (!attacker.hasType(move.type)) { - return this.chainModify(1.33); - } - }, - desc: "This Pokemon's moves that don't match one of its types have an attack bonus of 1.33.", - shortDesc: "This Pokemon's non-STAB moves is 1.33x.", - }, - shadowtag: { - desc: "For the first turn after this Pokemon switches in, prevent adjacent opposing Pokemon from choosing to switch out unless they are immune to trapping or also have this Ability.", - shortDesc: "Prevents adjacent foes from choosing to switch for one turn.", - inherit: true, - onStart(pokemon) { - pokemon.addVolatile('shadowtag'); - }, - condition: { - duration: 2, - onFoeTrapPokemon(pokemon) { - if (pokemon.ability !== 'shadowtag') { - pokemon.tryTrap(true); - } - }, - }, - onBeforeMovePriority: 15, - onBeforeMove(pokemon) { - pokemon.removeVolatile('shadowtag'); - }, - onFoeMaybeTrapPokemon(pokemon, source) { - if (!source) source = this.effectState.target; - if (!source || !pokemon.isAdjacent(source)) return; - if (pokemon.ability !== 'shadowtag' && !source.volatiles['shadowtag']) { - pokemon.maybeTrapped = true; - } - }, - onFoeTrapPokemon(pokemon) {}, - }, -}; diff --git a/data/mods/gennext/conditions.ts b/data/mods/gennext/conditions.ts deleted file mode 100644 index 45375d2b14cc..000000000000 --- a/data/mods/gennext/conditions.ts +++ /dev/null @@ -1,387 +0,0 @@ -export const Conditions: import('../../../sim/dex-conditions').ModdedConditionDataTable = { - frz: { - name: 'frz', - effectType: 'Status', - onStart(target) { - this.add('-status', target, 'frz'); - }, - duration: 2, - onBeforeMovePriority: 2, - onBeforeMove(pokemon, target, move) { - if (move.flags['defrost']) { - pokemon.cureStatus(); - return; - } - this.add('cant', pokemon, 'frz'); - return false; - }, - onHit(target, source, move) { - if (move.type === 'Fire' && move.category !== 'Status' || move.flags['defrost']) { - target.cureStatus(); - } - }, - onEnd(target) { - this.add('-curestatus', target, 'frz'); - }, - }, - lockedmove: { - // Outrage, Thrash, Petal Dance... - name: 'lockedmove', - durationCallback() { - return this.random(2, 4); - }, - onResidual(target) { - const move = target.lastMove as Move; - if (!move.self || move.self.volatileStatus !== 'lockedmove') { - // don't lock, and bypass confusion for calming - delete target.volatiles['lockedmove']; - } else if (target.ability === 'owntempo') { - // Own Tempo prevents locking - delete target.volatiles['lockedmove']; - } - }, - onEnd(target) { - target.addVolatile('confusion'); - }, - onLockMove(pokemon) { - return pokemon.lastMove!.id; - }, - }, - confusion: { - // this is a volatile status - name: 'confusion', - onStart(target, source, sourceEffect) { - if (sourceEffect && sourceEffect.id === 'lockedmove') { - this.add('-start', target, 'confusion', '[fatigue]'); - } else { - this.add('-start', target, 'confusion'); - } - this.effectState.time = this.random(3, 4); - }, - onEnd(target) { - this.add('-end', target, 'confusion'); - }, - onBeforeMove(pokemon) { - pokemon.volatiles['confusion'].time--; - if (!pokemon.volatiles['confusion'].time) { - pokemon.removeVolatile('confusion'); - return; - } - const damage = this.actions.getDamage(pokemon, pokemon, 40); - if (typeof damage !== 'number') throw new Error("Confusion damage not dealt"); - this.directDamage(damage); - }, - }, - - // weather! - - raindance: { - inherit: true, - onBasePower(basePower, attacker, defender, move) { - if (move.id === 'scald' || move.id === 'steameruption') { - return; - } - if (move.type === 'Water') { - this.debug('rain water boost'); - return basePower * 1.5; - } - if (move.type === 'Fire') { - this.debug('rain fire suppress'); - return basePower * 0.5; - } - }, - }, - sunnyday: { - inherit: true, - onBasePower(basePower, attacker, defender, move) { - if (move.id === 'scald' || move.id === 'steameruption') { - return; - } - if (move.type === 'Fire') { - this.debug('Sunny Day fire boost'); - return basePower * 1.5; - } - if (move.type === 'Water') { - this.debug('Sunny Day water suppress'); - return basePower * 0.5; - } - }, - }, - - // intrinsics! - - bidestall: { - name: 'bidestall', - duration: 3, - }, - - unown: { - // Unown: Shadow Tag - onImmunity(type, pokemon) { - if (type === 'Ground' && !this.suppressingAbility(pokemon)) return false; - }, - onStart(pokemon) { - if (pokemon.ability === 'levitate') { - pokemon.ability = 'shadowtag' as ID; - pokemon.baseAbility = 'shadowtag' as ID; - } - if (pokemon.transformed) return; - pokemon.setType(pokemon.hpType || 'Dark'); - }, - }, - bronzong: { - // Bronzong: Heatproof - onImmunity(type, pokemon) { - if (type === 'Ground' && !this.suppressingAbility(pokemon)) return false; - }, - onStart(pokemon) { - if (pokemon.ability === 'levitate') { - pokemon.ability = 'heatproof' as ID; - pokemon.baseAbility = 'heatproof' as ID; - } - }, - }, - weezing: { - // Weezing: Aftermath - onImmunity(type, pokemon) { - if (type === 'Ground' && !this.suppressingAbility(pokemon)) return false; - }, - onStart(pokemon) { - if (pokemon.ability === 'levitate') { - pokemon.ability = 'aftermath' as ID; - pokemon.baseAbility = 'aftermath' as ID; - } - }, - }, - flygon: { - // Flygon: Compoundeyes - onImmunity(type, pokemon) { - if (type === 'Ground' && !this.suppressingAbility(pokemon)) return false; - }, - onStart(pokemon) { - if (pokemon.ability === 'levitate') { - pokemon.ability = 'compoundeyes' as ID; - pokemon.baseAbility = 'compoundeyes' as ID; - } - }, - }, - eelektross: { - // Eelektross: Poison Heal - onImmunity(type, pokemon) { - if (type === 'Ground' && !this.suppressingAbility(pokemon)) return false; - }, - onStart(pokemon) { - if (pokemon.ability === 'levitate') { - pokemon.ability = 'poisonheal' as ID; - pokemon.baseAbility = 'poisonheal' as ID; - } - }, - }, - claydol: { - // Claydol: Filter - onImmunity(type, pokemon) { - if (type === 'Ground' && !this.suppressingAbility(pokemon)) return false; - }, - onStart(pokemon) { - if (pokemon.ability === 'levitate') { - pokemon.ability = 'filter' as ID; - pokemon.baseAbility = 'filter' as ID; - } - }, - }, - gengar: { - // Gengar: Cursed Body - onImmunity(type, pokemon) { - if (pokemon.species.id !== 'gengarmega' && type === 'Ground' && !this.suppressingAbility(pokemon)) return false; - }, - onStart(pokemon) { - if (pokemon.ability === 'levitate') { - pokemon.ability = 'cursedbody' as ID; - pokemon.baseAbility = 'cursedbody' as ID; - } - }, - }, - mismagius: { - // Mismagius: Cursed Body - onImmunity(type, pokemon) { - if (type === 'Ground' && !this.suppressingAbility(pokemon)) return false; - }, - onStart(pokemon) { - if (pokemon.ability === 'levitate') { - pokemon.ability = 'cursedbody' as ID; - pokemon.baseAbility = 'cursedbody' as ID; - } - }, - }, - mesprit: { - // Mesprit: Serene Grace - onImmunity(type, pokemon) { - if (type === 'Ground' && !this.suppressingAbility(pokemon)) return false; - }, - onStart(pokemon) { - if (pokemon.ability === 'levitate') { - pokemon.ability = 'serenegrace' as ID; - pokemon.baseAbility = 'serenegrace' as ID; - } - }, - }, - uxie: { - // Uxie: Synchronize - onImmunity(type, pokemon) { - if (type === 'Ground' && !this.suppressingAbility(pokemon)) return false; - }, - onStart(pokemon) { - if (pokemon.ability === 'levitate') { - pokemon.ability = 'synchronize' as ID; - pokemon.baseAbility = 'synchronize' as ID; - } - }, - }, - azelf: { - // Azelf: Steadfast - onImmunity(type, pokemon) { - if (type === 'Ground' && !this.suppressingAbility(pokemon)) return false; - }, - onStart(pokemon) { - if (pokemon.ability === 'levitate') { - pokemon.ability = 'steadfast' as ID; - pokemon.baseAbility = 'steadfast' as ID; - } - }, - }, - hydreigon: { - // Hydreigon: Sheer Force - onImmunity(type, pokemon) { - if (type === 'Ground' && !this.suppressingAbility(pokemon)) return false; - }, - onStart(pokemon) { - if (pokemon.ability === 'levitate') { - pokemon.ability = 'sheerforce' as ID; - pokemon.baseAbility = 'sheerforce' as ID; - } - }, - }, - rotom: { - // All Rotoms: Trace - onImmunity(type, pokemon) { - if (type === 'Ground' && !this.suppressingAbility(pokemon)) return false; - }, - onStart(pokemon) { - if (pokemon.ability === 'levitate') { - pokemon.ability = 'trace' as ID; - pokemon.baseAbility = 'trace' as ID; - } - }, - }, - rotomheat: { - // All Rotoms: Trace - onImmunity(type, pokemon) { - if (type === 'Ground' && !this.suppressingAbility(pokemon)) return false; - }, - onStart(pokemon) { - if (pokemon.ability === 'levitate') { - pokemon.ability = 'trace' as ID; - pokemon.baseAbility = 'trace' as ID; - } - }, - }, - rotomwash: { - // All Rotoms: Trace - onImmunity(type, pokemon) { - if (type === 'Ground' && !this.suppressingAbility(pokemon)) return false; - }, - onStart(pokemon) { - if (pokemon.ability === 'levitate') { - pokemon.ability = 'trace' as ID; - pokemon.baseAbility = 'trace' as ID; - } - }, - }, - rotomfan: { - // All Rotoms: Trace - onImmunity(type, pokemon) { - if (type === 'Ground' && !this.suppressingAbility(pokemon)) return false; - }, - onStart(pokemon) { - if (pokemon.ability === 'levitate') { - pokemon.ability = 'trace' as ID; - pokemon.baseAbility = 'trace' as ID; - } - }, - }, - rotomfrost: { - // All Rotoms: Trace - onImmunity(type, pokemon) { - if (type === 'Ground' && !this.suppressingAbility(pokemon)) return false; - }, - onStart(pokemon) { - if (pokemon.ability === 'levitate') { - pokemon.ability = 'trace' as ID; - pokemon.baseAbility = 'trace' as ID; - } - }, - }, - rotommow: { - // All Rotoms: Trace - onImmunity(type, pokemon) { - if (type === 'Ground' && !this.suppressingAbility(pokemon)) return false; - }, - onStart(pokemon) { - if (pokemon.ability === 'levitate') { - pokemon.ability = 'trace' as ID; - pokemon.baseAbility = 'trace' as ID; - } - }, - }, - cryogonal: { - // Cryogonal: infinite hail, Ice Body - onModifyMove(move) { - if (move.id === 'hail') { - const weather = move.weather as string; - move.weather = ''; - move.onHit = function (target, source) { - this.field.setWeather(weather, source, this.dex.abilities.get('snowwarning')); - this.field.weatherState.duration = 0; - }; - move.target = 'self'; - } - }, - onImmunity(type, pokemon) { - if (type === 'Ground' && !this.suppressingAbility(pokemon)) return false; - }, - onStart(pokemon) { - if (pokemon.ability === 'levitate') { - pokemon.ability = 'icebody' as ID; - pokemon.baseAbility = 'icebody' as ID; - } - }, - }, - probopass: { - // Probopass: infinite sand - onModifyMove(move) { - if (move.id === 'sandstorm') { - const weather = move.weather as string; - move.weather = ''; - move.onHit = function (target, source) { - this.field.setWeather(weather, source, this.dex.abilities.get('sandstream')); - this.field.weatherState.duration = 0; - }; - move.target = 'self'; - } - }, - }, - phione: { - // Phione: infinite rain - onModifyMove(move) { - if (move.id === 'raindance') { - const weather = move.weather as string; - move.weather = ''; - move.onHit = function (target, source) { - this.field.setWeather(weather, source, this.dex.abilities.get('drizzle')); - this.field.weatherState.duration = 0; - }; - move.target = 'self'; - } - }, - }, -}; diff --git a/data/mods/gennext/formats-data.ts b/data/mods/gennext/formats-data.ts deleted file mode 100644 index 9d0f7c76481e..000000000000 --- a/data/mods/gennext/formats-data.ts +++ /dev/null @@ -1,62 +0,0 @@ -export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormatsDataTable = { - aegislash: { - inherit: true, - tier: "OU", - }, - blaziken: { - inherit: true, - tier: "OU", - }, - blazikenmega: { - inherit: true, - tier: "OU", - }, - genesect: { - inherit: true, - tier: "OU", - }, - gengarmega: { - inherit: true, - tier: "OU", - }, - greninja: { - inherit: true, - tier: "OU", - }, - kangaskhanmega: { - inherit: true, - tier: "OU", - }, - landorus: { - inherit: true, - tier: "OU", - }, - mawilemega: { - inherit: true, - tier: "OU", - }, - salamencemega: { - inherit: true, - tier: "OU", - }, - deoxysdefense: { - inherit: true, - tier: "Uber", - }, - deoxysspeed: { - inherit: true, - tier: "Uber", - }, - hoopaunbound: { - inherit: true, - tier: "OU", - }, - kyurem: { - inherit: true, - tier: "Uber", - }, - kyuremblack: { - inherit: true, - tier: "Uber", - }, -}; diff --git a/data/mods/gennext/items.ts b/data/mods/gennext/items.ts deleted file mode 100644 index 0f854a74fb67..000000000000 --- a/data/mods/gennext/items.ts +++ /dev/null @@ -1,178 +0,0 @@ -export const Items: import('../../../sim/dex-items').ModdedItemDataTable = { - burndrive: { - inherit: true, - onBasePower(basePower, user, target, move) {}, - desc: "Changes Genesect to Genesect-Burn.", - }, - chilldrive: { - inherit: true, - onBasePower(basePower, user, target, move) {}, - desc: "Changes Genesect to Genesect-Chill.", - }, - dousedrive: { - inherit: true, - onBasePower(basePower, user, target, move) {}, - desc: "Changes Genesect to Genesect-Douse.", - }, - shockdrive: { - inherit: true, - onBasePower(basePower, user, target, move) {}, - desc: "Changes Genesect to Genesect-Shock.", - }, - widelens: { - inherit: true, - onSourceModifyAccuracy(accuracy) { - if (typeof accuracy === 'number') { - return accuracy * 1.3; - } - }, - desc: "The accuracy of attacks by the holder is 1.6x.", - }, - zoomlens: { - inherit: true, - onSourceModifyAccuracy(accuracy, target) { - if (typeof accuracy === 'number' && !this.queue.willMove(target)) { - this.debug('Zoom Lens boosting accuracy'); - return accuracy * 1.6; - } - }, - desc: "The accuracy of attacks by the holder is 1.6x if it moves after its target.", - }, - bigroot: { - inherit: true, - onAfterMoveSecondarySelf(source, target) { - if (source.hasType('Grass')) { - this.heal(source.lastDamage / 8, source); - } - }, - onResidualOrder: 5, - onResidualSubOrder: 2, - onResidual(pokemon) { - if (pokemon.hasType('Grass')) { - this.heal(pokemon.baseMaxhp / 16); - } - }, - desc: "Holder gains 1.3x HP from draining/Aqua Ring/Ingrain/Leech Seed/Strength Sap; If the user is a Grass type, the holder heals 1/16 of its max HP every turn, and for every damaging move the holder uses 1/8th of the damage dealt is restored.", - shortDesc: "Holder gains 1.3x from most healing moves; if the user is a Grass type, Leftovers & Shell Bell effects occur.", - }, - blacksludge: { - inherit: true, - onResidualOrder: 5, - onResidualSubOrder: 2, - onResidual(pokemon) { - if (pokemon.hasType('Poison')) { - this.heal(pokemon.baseMaxhp / (pokemon.getTypes().length === 1 ? 8 : 16)); - } else { - this.damage(pokemon.baseMaxhp / 8); - } - }, - desc: "Each turn, if holder is a Poison type, restores 1/16 max HP; loses 1/8 if not. Pure Poison types restore 1/8 max HP.", - }, - focusband: { - inherit: true, - onDamage(damage, target, source, effect) { - const types = target.getTypes(); - if (types.length === 1 && types[0] === 'Fighting' && - effect && effect.effectType === 'Move' && - target.useItem()) { - if (damage >= target.hp) { - this.add("-message", target.name + " held on using its Focus Band!"); - return target.hp - 1; - } else { - this.add("-message", target.name + "'s Focus Band broke!"); - } - } - }, - desc: "Breaks on first hit, but allows pure Fighting types to survive that hit with 1 HP.", - }, - wiseglasses: { - inherit: true, - onBasePower(basePower, user, target, move) { - if (move.category === 'Special') { - const types = user.getTypes(); - if (types.length === 1 && types[0] === 'Psychic') { - return basePower * 1.2; - } - return basePower * 1.1; - } - }, - desc: "Holder's special attacks have 1.1x power. Pure Psychic types special attacks have 1.2x power.", - shortDesc: "Holder's SpA have 1.1x power. Pure Psychic types SpA have 1.2x power.", - }, - muscleband: { - inherit: true, - onBasePower(basePower, user, target, move) { - if (move.category === 'Physical') { - const types = user.getTypes(); - if (types.length === 1 && types[0] === 'Fighting') { - return basePower * 1.2; - } - return basePower * 1.1; - } - }, - desc: "Holder's physical attacks have 1.1x power. Pure Fighting types physical attacks have 1.2x power.", - shortDesc: "Holder's Atk have 1.1x power. Pure Fighting types Atk have 1.2x power.", - }, - stick: { - inherit: true, - // The Stick is a stand-in for a number of pokemon-exclusive items - // introduced with Gen Next - onModifyCritRatio(critRatio, user) { - if (user.species.id === 'farfetchd') { - return critRatio + 2; - } - }, - onModifyDef(def, pokemon) { - if (pokemon.species.name === 'Shuckle') { - return def * 1.5; - } - }, - onModifySpA(spa, pokemon) { - if (pokemon.species.name === 'Unown') { - return spa * 2; - } - }, - onModifySpD(spd, pokemon) { - if (pokemon.species.name === 'Unown') { - return spd * 2; - } - if (pokemon.species.name === 'Shuckle') { - return spd * 1.5; - } - }, - onModifySpe(spe, pokemon) { - if (pokemon.species.name === 'Unown') { - return spe * 2; - } - }, - onFoeBasePower(basePower, attacker, defender, move) { - const GossamerWingUsers = ["Butterfree", "Masquerain", "Beautifly", "Mothim", "Vivillon"]; - if (GossamerWingUsers.includes(defender.species.name)) { - if (['Rock', 'Electric', 'Ice'].includes(move.type)) { - this.add('-message', "The attack was weakened by GoassamerWing!"); - return basePower / 2; - } - } - }, - onDamage(damage, defender, attacker, effect) { - const GossamerWingUsers = ["Butterfree", "Masquerain", "Beautifly", "Mothim", "Vivillon"]; - if (GossamerWingUsers.includes(defender.species.name)) { - if (effect && effect.id === 'stealthrock') { - return damage / 2; - } - } - }, - onAfterMoveSecondarySelf(source, target, move) { - const GossamerWingUsers = ["Butterfree", "Masquerain", "Beautifly", "Mothim", "Vivillon"]; - if (move.effectType === 'Move' && move.category === 'Status' && GossamerWingUsers.includes(source.species.name)) { - this.heal(source.baseMaxhp / 16); - } - }, - // onResidual(pokemon) { - // if (pokemon.species.name === 'Shuckle') { - // this.heal(this.clampIntRange(pokemon.maxhp / 16, 1)); - // } - // }, - desc: "Raises Farfetch\u2019d's critical hit rate two stages.", - }, -}; diff --git a/data/mods/gennext/moves.ts b/data/mods/gennext/moves.ts deleted file mode 100644 index 26df7b43a958..000000000000 --- a/data/mods/gennext/moves.ts +++ /dev/null @@ -1,2118 +0,0 @@ -export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = { - /****************************************************************** - Perfect accuracy moves: - - base power increased to 90 - - Justification: - - perfect accuracy is too underpowered to have such low base power - - it's not even an adequate counter to accuracy boosting, which - is why the latter is banned in OU - - Precedent: - - Giga Drain and Drain Punch, similar 60 base power moves, have - been upgraded - ******************************************************************/ - aerialace: { - inherit: true, - basePower: 90, - }, - feintattack: { - inherit: true, - basePower: 90, - }, - shadowpunch: { - inherit: true, - basePower: 90, - }, - magnetbomb: { - inherit: true, - basePower: 90, - }, - magicalleaf: { - inherit: true, - basePower: 90, - }, - shockwave: { - inherit: true, - basePower: 90, - }, - swift: { - inherit: true, - basePower: 90, - }, - disarmingvoice: { - inherit: true, - basePower: 90, - }, - aurasphere: { - inherit: true, - basePower: 90, - }, - clearsmog: { - inherit: true, - basePower: 90, - }, - /****************************************************************** - HMs: - - shouldn't suck (as much) - - Justification: - - there are HMs that don't suck - - Precedent: - - Dive! Technically, it was to be in-line with Dig, but still. - ******************************************************************/ - strength: { - inherit: true, - secondary: { - chance: 30, - self: { - boosts: { - atk: 1, - }, - }, - }, - shortDesc: "30% chance of raising user's Atk by 1 stage.", - desc: "This move has a 30% chance of raising the user's Attack by one stage.", - }, - cut: { - inherit: true, - accuracy: 100, - secondary: { - chance: 100, - boosts: { - def: -1, - }, - }, - desc: "100% chance of lowering the target's Defense by one stage.", - shortDesc: "Lowers the target's Def by 1 stage.", - }, - rocksmash: { - inherit: true, - basePower: 50, - secondary: { - chance: 100, - boosts: { - def: -1, - }, - }, - desc: "100% chance of lowering the target's Defense by one stage.", - shortDesc: "Lowers the target's Def by 1 stage.", - }, - /****************************************************************** - Weather moves: - - have increased priority - - Justification: - - several Rain abusers get Prankster, which makes Rain otherwise - overpowered - ******************************************************************/ - raindance: { - inherit: true, - priority: 1, - }, - sunnyday: { - inherit: true, - priority: 1, - }, - sandstorm: { - inherit: true, - priority: 1, - }, - hail: { - inherit: true, - priority: 1, - }, - /****************************************************************** - Substitute: - - has precedence over Protect - - makes all moves hit against it - Minimize: - - only +1 evasion - Double Team: - - -25% maxhp when used - - Justification: - - Sub/Protect stalling is annoying - - Evasion stalling is annoying - ******************************************************************/ - substitute: { - inherit: true, - condition: { - onStart(target) { - this.add('-start', target, 'Substitute'); - this.effectState.hp = Math.floor(target.maxhp / 4); - delete target.volatiles['partiallytrapped']; - }, - onAccuracyPriority: -100, - onAccuracy(accuracy, target, source, move) { - return 100; - }, - onTryPrimaryHitPriority: 2, - onTryPrimaryHit(target, source, move) { - if (target === source || move.flags['bypasssub'] || move.infiltrates) { - return; - } - let damage = this.actions.getDamage(source, target, move); - if (!damage) { - return null; - } - damage = this.runEvent('SubDamage', target, source, move, damage); - if (!damage) { - return damage; - } - if (damage > target.volatiles['substitute'].hp) { - damage = target.volatiles['substitute'].hp as number; - } - target.volatiles['substitute'].hp -= damage; - source.lastDamage = damage; - if (target.volatiles['substitute'].hp <= 0) { - target.removeVolatile('substitute'); - } else { - this.add('-activate', target, 'Substitute', '[damage]'); - } - if (move.recoil) { - this.damage(this.clampIntRange(Math.round(damage * move.recoil[0] / move.recoil[1]), 1), source, target, 'recoil'); - } - if (move.drain) { - this.heal(Math.ceil(damage * move.drain[0] / move.drain[1]), source, target, 'drain'); - } - this.runEvent('AfterSubDamage', target, source, move, damage); - return this.HIT_SUBSTITUTE; - }, - onEnd(target) { - this.add('-end', target, 'Substitute'); - }, - }, - }, - protect: { - inherit: true, - condition: { - duration: 1, - onStart(target) { - this.add('-singleturn', target, 'Protect'); - }, - onTryHitPriority: 3, - onTryHit(target, source, move) { - if (target.volatiles['substitute'] || !move.flags['protect']) return; - this.add('-activate', target, 'Protect'); - const lockedmove = source.getVolatile('lockedmove'); - if (lockedmove) { - // Outrage counter is reset - if (source.volatiles['lockedmove'].duration === 2) { - delete source.volatiles['lockedmove']; - } - } - return null; - }, - }, - }, - kingsshield: { - inherit: true, - condition: { - duration: 1, - onStart(target) { - this.add('-singleturn', target, 'Protect'); - }, - onTryHitPriority: 3, - onTryHit(target, source, move) { - if (target.volatiles['substitute'] || !move.flags['protect'] || move.category === 'Status') return; - this.add('-activate', target, 'Protect'); - const lockedmove = source.getVolatile('lockedmove'); - if (lockedmove) { - // Outrage counter is reset - if (source.volatiles['lockedmove'].duration === 2) { - delete source.volatiles['lockedmove']; - } - } - if (move.flags['contact']) { - this.boost({atk: -2}, source, target, move); - } - return null; - }, - }, - }, - spikyshield: { - inherit: true, - condition: { - duration: 1, - onStart(target) { - this.add('-singleturn', target, 'move: Protect'); - }, - onTryHitPriority: 3, - onTryHit(target, source, move) { - if (target.volatiles['substitute'] || !move.flags['protect']) return; - if (move && (move.target === 'self' || move.id === 'suckerpunch')) return; - this.add('-activate', target, 'move: Protect'); - if (move.flags['contact']) { - this.damage(source.baseMaxhp / 8, source, target); - } - return null; - }, - }, - }, - minimize: { - inherit: true, - boosts: { - evasion: 1, - }, - desc: "Raises the user's evasiveness by 1 stages. Whether or not the user's evasiveness was changed, Body Slam, Dragon Rush, Flying Press, Heat Crash, Heavy Slam, Phantom Force, Shadow Force, Steamroller, and Stomp will not check accuracy and have their damage doubled if used against the user while it is active.", - shortDesc: "Raises the user's evasiveness by 1.", - }, - doubleteam: { - inherit: true, - onTryHit(target) { - if (target.boosts.evasion >= 6) { - return false; - } - if (target.hp <= target.maxhp / 4 || target.maxhp === 1) { // Shedinja clause - return false; - } - }, - onHit(target) { - this.directDamage(target.maxhp / 4); - }, - boosts: { - evasion: 1, - }, - desc: "Raises the user's evasiveness by 1 stage; the user loses 1/4 of its max HP.", - shortDesc: "Raises the user's evasiveness by 1; the user loses 25% of its max HP.", - }, - /****************************************************************** - Two-turn moves: - - now a bit better - - Justification: - - Historically, these moves are useless. - ******************************************************************/ - solarbeam: { - inherit: true, - basePower: 80, - basePowerCallback(pokemon, target) { - return 80; - }, - willCrit: true, - accuracy: true, - onTryHit(target) { - target.removeVolatile('substitute'); - }, - condition: { - duration: 2, - onLockMove: 'solarbeam', - onStart(pokemon) { - this.heal(pokemon.baseMaxhp / 2); - }, - }, - desc: "This attack charges on the first turn and executes on the second. Power is halved if the weather is Hail, Rain Dance, or Sandstorm. If the user is holding a Power Herb or the weather is Sunny Day, the move completes in one turn. The user heals 1/2 of its max HP during the charge turn. This move removes the target's Substitute (if one is active), and bypasses Protect. This move is also a guaranteed critical hit.", - shortDesc: "Charges turn 1. Hits turn 2. No charge in sunlight. Heals 1/2 of the user's max HP, on charge.", - flags: {charge: 1, mirror: 1, metronome: 1}, - breaksProtect: true, - }, - razorwind: { - inherit: true, - basePower: 60, - willCrit: true, - accuracy: true, - onTryHit(target) { - target.removeVolatile('substitute'); - }, - secondary: { - chance: 100, - volatileStatus: 'confusion', - }, - desc: "Has a higher chance for a critical hit. This attack charges on the first turn and executes on the second. If the user is holding a Power Herb, the move completes in one turn. 100% chance to confuse the target. This move removes the target's Substitute (if one is active), and bypasses Protect. This move is also a guaranteed critical hit.", - shortDesc: "Charges, then hits foe(s) turn 2. High crit ratio. Confuses target.", - flags: {charge: 1, mirror: 1, metronome: 1}, - breaksProtect: true, - }, - skullbash: { - inherit: true, - basePower: 70, - willCrit: true, - accuracy: true, - onTryHit(target) { - target.removeVolatile('substitute'); - }, - onTryMove(attacker, defender, move) { - if (attacker.removeVolatile(move.id)) { - return; - } - this.add('-prepare', attacker, move.name); - this.boost({def: 1, spd: 1, accuracy: 1}, attacker, attacker, move); - if (!this.runEvent('ChargeMove', attacker, defender, move)) { - return; - } - attacker.addVolatile('twoturnmove', defender); - return null; - }, - flags: {contact: 1, charge: 1, mirror: 1, metronome: 1}, - breaksProtect: true, - desc: "This attack charges on the first turn and executes on the second. Raises the user's Defense, Special Defense, and Accuracy by 1 stage on the first turn. If the user is holding a Power Herb, the move completes in one turn. This move removes the target's Substitute (if one is active), and bypasses Protect. This move is also a guaranteed critical hit.", - shortDesc: "Raises user's Def, SpD, Acc by 1 on turn 1. Hits turn 2.", - }, - skyattack: { - inherit: true, - basePower: 95, - willCrit: true, - accuracy: true, - onTryHit(target) { - target.removeVolatile('substitute'); - }, - secondary: { - chance: 100, - boosts: { - def: -1, - }, - }, - flags: {charge: 1, mirror: 1, distance: 1, metronome: 1}, - breaksProtect: true, - desc: "Has a 30% chance to flinch the target and a higher chance for a critical hit. This attack charges on the first turn and executes on the second. If the user is holding a Power Herb, the move completes in one turn. 100% chance to lower the target's Defense by one stage. This move removes the target's Substitute (if one is active), and bypasses Protect. This move is also a guaranteed critical hit.", - shortDesc: "Charges, then hits turn 2. 30% flinch. High crit.", - }, - freezeshock: { - inherit: true, - basePower: 95, - willCrit: true, - accuracy: true, - onTryHit(target) { - target.removeVolatile('substitute'); - }, - secondary: { - chance: 100, - status: 'par', - }, - flags: {charge: 1, mirror: 1, metronome: 1}, - breaksProtect: true, - desc: "Has a 100% chance to paralyze the target. This attack charges on the first turn and executes on the second. If the user is holding a Power Herb, the move completes in one turn. This move removes the target's Substitute (if one is active), and bypasses Protect. This move is also a guaranteed critical hit.", - shortDesc: "Charges turn 1. Hits turn 2. 100% paralyze.", - }, - iceburn: { - inherit: true, - basePower: 95, - willCrit: true, - accuracy: true, - onTryHit(target) { - target.removeVolatile('substitute'); - }, - secondary: { - chance: 100, - status: 'brn', - }, - flags: {charge: 1, mirror: 1, metronome: 1}, - breaksProtect: true, - desc: "Has a 100% chance to burn the target. This attack charges on the first turn and executes on the second. If the user is holding a Power Herb, the move completes in one turn. This move removes the target's Substitute (if one is active), and bypasses Protect. This move is also a guaranteed critical hit.", - shortDesc: "Charges turn 1. Hits turn 2. 100% burn.", - }, - bounce: { - inherit: true, - basePower: 60, - willCrit: true, - accuracy: true, - onTryHit(target) { - target.removeVolatile('substitute'); - }, - flags: {contact: 1, charge: 1, mirror: 1, gravity: 1, distance: 1, metronome: 1}, - breaksProtect: true, - desc: "Has a 30% chance to paralyze the target. This attack charges on the first turn and executes on the second. On the first turn, the user avoids all attacks other than Gust, Hurricane, Sky Uppercut, Smack Down, Thousand Arrows, Thunder, and Twister. If the user is holding a Power Herb, the move completes in one turn. This move removes the target's Substitute (if one is active), and bypasses Protect. This move is also a guaranteed critical hit.", - shortDesc: "Bounces turn 1. Hits turn 2. 30% paralyze.", - }, - fly: { - inherit: true, - basePower: 60, - willCrit: true, - accuracy: true, - onTryHit(target) { - target.removeVolatile('substitute'); - }, - secondary: { - chance: 100, - boosts: { - def: -1, - }, - }, - flags: {contact: 1, charge: 1, mirror: 1, gravity: 1, distance: 1, metronome: 1}, - breaksProtect: true, - desc: "This attack charges on the first turn and executes on the second. On the first turn, the user avoids all attacks other than Gust, Hurricane, Sky Uppercut, Smack Down, Thousand Arrows, Thunder, and Twister. If the user is holding a Power Herb, the move completes in one turn. 100% chance to lower the target's Defense by one stage. This move removes the target's Substitute (if one is active), and bypasses Protect. This move is also a guaranteed critical hit.", - shortDesc: "Flies up on first turn, then strikes the next turn. Lowers target's Def by 1 stage.", - }, - dig: { - inherit: true, - basePower: 60, - willCrit: true, - accuracy: true, - onTryHit(target) { - target.removeVolatile('substitute'); - }, - secondary: { - chance: 100, - boosts: { - def: -1, - }, - }, - desc: "This attack charges on the first turn and executes on the second. On the first turn, the user avoids all attacks other than Earthquake and Magnitude but takes double damage from them, and is also unaffected by weather. If the user is holding a Power Herb, the move completes in one turn. 100% chance to lower the target's Defense by one stage. This move removes the target's Substitute (if one is active), and bypasses Protect. This move is also a guaranteed critical hit.", - shortDesc: "Digs underground turn 1, strikes turn 2. Lowers target's Def by 1 stage.", - flags: {contact: 1, charge: 1, mirror: 1, nonsky: 1, metronome: 1}, - breaksProtect: true, - }, - dive: { - inherit: true, - basePower: 60, - willCrit: true, - accuracy: true, - onTryHit(target) { - target.removeVolatile('substitute'); - }, - secondary: { - chance: 100, - boosts: { - def: -1, - }, - }, - desc: "This attack charges on the first turn and executes on the second. On the first turn, the user avoids all attacks other than Surf and Whirlpool but takes double damage from them, and is also unaffected by weather. If the user is holding a Power Herb, the move completes in one turn. 100% chance to lower the target's Defense by one stage. This move removes the target's Substitute (if one is active), and bypasses Protect. This move is also a guaranteed critical hit.", - shortDesc: "Dives underwater turn 1, strikes turn 2. Lowers target's Def by 1 stage.", - flags: {contact: 1, charge: 1, mirror: 1, nonsky: 1, metronome: 1}, - breaksProtect: true, - }, - phantomforce: { - inherit: true, - basePower: 60, - willCrit: true, - accuracy: true, - onTryHit(target) { - target.removeVolatile('substitute'); - }, - secondary: { - chance: 100, - boosts: { - def: -1, - }, - }, - desc: "If this move is successful, it breaks through the target's Detect, King's Shield, Protect, or Spiky Shield for this turn, allowing other Pokemon to attack the target normally. If the target's side is protected by Crafty Shield, Mat Block, Quick Guard, or Wide Guard, that protection is also broken for this turn and other Pokemon may attack the target's side normally. This attack charges on the first turn and executes on the second. On the first turn, the user avoids all attacks. If the user is holding a Power Herb, the move completes in one turn. Damage doubles and no accuracy check is done if the target has used Minimize while active. 100% chance to lower the target's Defense by one stage. This move removes the target's Substitute (if one is active). This move is also a guaranteed critical hit.", - shortDesc: "Disappears turn 1. Hits turn 2. Breaks protection. Lowers target's Def by 1 stage.", - }, - shadowforce: { - inherit: true, - basePower: 40, - willCrit: true, - accuracy: true, - onTryHit(target) { - target.removeVolatile('substitute'); - }, - secondary: { - chance: 100, - volatileStatus: 'curse', - }, - desc: "If this move is successful, it breaks through the target's Detect, King's Shield, Protect, or Spiky Shield for this turn, allowing other Pokemon to attack the target normally. If the target's side is protected by Crafty Shield, Mat Block, Quick Guard, or Wide Guard, that protection is also broken for this turn and other Pokemon may attack the target's side normally. This attack charges on the first turn and executes on the second. On the first turn, the user avoids all attacks. If the user is holding a Power Herb, the move completes in one turn. Damage doubles and no accuracy check is done if the target has used Minimize while active. 100% chance to inflict a curse (ghost type) onto the target. This move removes the target's Substitute (if one is active). This move is also a guaranteed critical hit.", - shortDesc: "Disappears turn 1. Hits turn 2. Breaks protection. Curses the target.", - }, - skydrop: { - inherit: true, - basePower: 60, - willCrit: true, - accuracy: true, - secondary: { - chance: 100, - boosts: { - def: -1, - }, - }, - desc: "This attack takes the target into the air with the user on the first turn and executes on the second. Pokemon weighing 200kg or more cannot be lifted. On the first turn, the user and the target avoid all attacks other than Gust, Hurricane, Sky Uppercut, Smack Down, Thousand Arrows, Thunder, and Twister. The user and the target cannot make a move between turns, but the target can select a move to use. This move cannot damage Flying-type Pokemon. Fails on the first turn if the target is an ally or if the target has a substitute. Lowers the target's Defense by one stage. This move is a guaranteed critical hit. This move ignores Protection.", - shortDesc: "User and foe fly up turn 1. Damages on turn 2. Lowers target's Def by 1 stage.", - flags: {contact: 1, charge: 1, mirror: 1, gravity: 1, distance: 1, metronome: 1}, - breaksProtect: true, - }, - hyperbeam: { - inherit: true, - accuracy: true, - basePower: 100, - willCrit: true, - self: null, - onHit(target, source) { - if (!target.hp) { - source.addVolatile('mustrecharge'); - } - }, - desc: "If this move is successful, the user must recharge on the following turn and cannot make a move. If the target is knocked out by this move, the user does not have to recharge. This move is a guaranteed critical hit.", - shortDesc: "User cannot move next turn, if the target isn't KO'ed.", - }, - gigaimpact: { - inherit: true, - accuracy: true, - basePower: 100, - willCrit: true, - self: null, - onHit(target, source) { - if (!target.hp) { - source.addVolatile('mustrecharge'); - } - }, - desc: "If this move is successful, the user must recharge on the following turn and cannot make a move. If the target is knocked out by this move, the user does not have to recharge. This move is a guaranteed critical hit.", - shortDesc: "User cannot move next turn, if the target isn't KO'ed.", - }, - blastburn: { - inherit: true, - accuracy: true, - basePower: 100, - willCrit: true, - self: null, - onHit(target, source) { - if (!target.hp) { - source.addVolatile('mustrecharge'); - } - }, - desc: "If this move is successful, the user must recharge on the following turn and cannot make a move. If the target is knocked out by this move, the user does not have to recharge. This move is a guaranteed critical hit.", - shortDesc: "User cannot move next turn, if the target isn't KO'ed.", - }, - frenzyplant: { - inherit: true, - accuracy: true, - basePower: 100, - willCrit: true, - self: null, - onHit(target, source) { - if (!target.hp) { - source.addVolatile('mustrecharge'); - } - }, - desc: "If this move is successful, the user must recharge on the following turn and cannot make a move. If the target is knocked out by this move, the user does not have to recharge. This move is a guaranteed critical hit.", - shortDesc: "User cannot move next turn, if the target isn't KO'ed.", - }, - hydrocannon: { - inherit: true, - accuracy: true, - basePower: 100, - willCrit: true, - self: null, - onHit(target, source) { - if (!target.hp) { - source.addVolatile('mustrecharge'); - } - }, - desc: "If this move is successful, the user must recharge on the following turn and cannot make a move. If the target is knocked out by this move, the user does not have to recharge. This move is a guaranteed critical hit.", - shortDesc: "User cannot move next turn, if the target isn't KO'ed.", - }, - rockwrecker: { - inherit: true, - accuracy: true, - basePower: 100, - willCrit: true, - self: null, - onHit(target, source) { - if (!target.hp) { - source.addVolatile('mustrecharge'); - } - }, - desc: "If this move is successful, the user must recharge on the following turn and cannot make a move. If the target is knocked out by this move, the user does not have to recharge. This move is a guaranteed critical hit.", - shortDesc: "User cannot move next turn, if the target isn't KO'ed.", - }, - roaroftime: { - inherit: true, - accuracy: true, - basePower: 100, - willCrit: true, - self: null, - onHit(target, source) { - if (!target.hp) { - source.addVolatile('mustrecharge'); - } - }, - desc: "If this move is successful, the user must recharge on the following turn and cannot make a move. If the target is knocked out by this move, the user does not have to recharge. This move is a guaranteed critical hit.", - shortDesc: "User cannot move next turn, if the target isn't KO'ed.", - }, - bide: { - inherit: true, - onTryHit(pokemon) { - return this.queue.willAct() && this.runEvent('StallMove', pokemon); - }, - condition: { - duration: 2, - onLockMove: 'bide', - onStart(pokemon) { - if (pokemon.removeVolatile('bidestall') || pokemon.hp <= 1) return false; - pokemon.addVolatile('bidestall'); - this.effectState.totalDamage = 0; - this.add('-start', pokemon, 'Bide'); - }, - onDamagePriority: -11, - onDamage(damage, target, source, effect) { - if (!effect || effect.effectType !== 'Move') return; - if (!source || source.isAlly(target)) return; - if (effect.effectType === 'Move' && damage >= target.hp) { - damage = target.hp - 1; - } - this.effectState.totalDamage += damage; - this.effectState.sourceSlot = source.getSlot(); - return damage; - }, - onAfterSetStatus(status, pokemon) { - if (status.id === 'slp') { - pokemon.removeVolatile('bide'); - pokemon.removeVolatile('bidestall'); - } - }, - onBeforeMove(pokemon, t, move) { - if (this.effectState.duration === 1) { - if (!this.effectState.totalDamage) { - this.add('-end', pokemon, 'Bide'); - this.add('-fail', pokemon); - return false; - } - this.add('-end', pokemon, 'Bide'); - const target = this.getAtSlot(this.effectState.sourceSlot); - const moveData = { - damage: this.effectState.totalDamage * 2, - } as unknown as ActiveMove; - this.actions.moveHit(target, pokemon, this.dex.getActiveMove('bide'), moveData); - return false; - } - this.add('-activate', pokemon, 'Bide'); - return false; - }, - onMoveAborted(pokemon) { - pokemon.removeVolatile('bide'); - }, - }, - }, - /****************************************************************** - Snore: - - base power increased to 100 - - Justification: - - Sleep Talk needs some competition - ******************************************************************/ - snore: { - inherit: true, - basePower: 100, - onBasePower(power, user) { - if (user.species.id === 'snorlax') return power * 1.5; - }, - ignoreImmunity: true, - desc: "Has a 30% chance to flinch the target. Fails if the user is not asleep. If the user is a Snorlax, this move does 1.5x more damage.", - }, - /****************************************************************** - Sound-based Normal-type moves: - - not affected by immunities - - Justification: - - they're already affected by Soundproof, also, ghosts can hear - sounds - ******************************************************************/ - boomburst: { - inherit: true, - ignoreImmunity: true, - }, - hypervoice: { - inherit: true, - ignoreImmunity: true, - }, - round: { - inherit: true, - ignoreImmunity: true, - }, - uproar: { - inherit: true, - ignoreImmunity: true, - }, - /****************************************************************** - Bonemerang, Bone Rush, Bone Club moves: - - not affected by Ground immunities - - Bone Rush nerfed to 20 base power so it's not viable on Lucario - - Justification: - - flavor, also Marowak could use a buff - ******************************************************************/ - bonemerang: { - inherit: true, - ignoreImmunity: true, - accuracy: true, - }, - bonerush: { - inherit: true, - basePower: 20, - ignoreImmunity: true, - accuracy: true, - }, - boneclub: { - inherit: true, - ignoreImmunity: true, - accuracy: 90, - }, - /****************************************************************** - Relic Song: - - now 60 bp priority move with no secondary - - Justification: - - Meloetta-P needs viability - ******************************************************************/ - relicsong: { - inherit: true, - basePower: 60, - ignoreImmunity: true, - onHit(target, pokemon) { - if (pokemon.baseSpecies.name !== 'Meloetta' || pokemon.transformed) { - return; - } - const natureChange: {[k: string]: string} = { - Modest: 'Adamant', - Adamant: 'Modest', - Timid: 'Jolly', - Jolly: 'Timid', - }; - let tmpAtkEVs: number; - let Atk2SpA: number; - if (pokemon.species.id === 'meloettapirouette' && pokemon.formeChange('Meloetta', this.effect, false, '[msg]')) { - tmpAtkEVs = pokemon.set.evs.atk; - pokemon.set.evs.atk = pokemon.set.evs.spa; - pokemon.set.evs.spa = tmpAtkEVs; - if (natureChange[pokemon.set.nature]) pokemon.set.nature = natureChange[pokemon.set.nature]; - Atk2SpA = (pokemon.boosts.spa || 0) - (pokemon.boosts.atk || 0); - this.boost({ - atk: Atk2SpA, - spa: -Atk2SpA, - }, pokemon); - } else if (pokemon.formeChange('Meloetta-Pirouette', this.effect, false, '[msg]')) { - tmpAtkEVs = pokemon.set.evs.atk; - pokemon.set.evs.atk = pokemon.set.evs.spa; - pokemon.set.evs.spa = tmpAtkEVs; - if (natureChange[pokemon.set.nature]) pokemon.set.nature = natureChange[pokemon.set.nature]; - Atk2SpA = (pokemon.boosts.spa || 0) - (pokemon.boosts.atk || 0); - this.boost({ - atk: Atk2SpA, - spa: -Atk2SpA, - }, pokemon); - } - // renderer takes care of this for us - pokemon.transformed = false; - }, - priority: 1, - secondary: null, - desc: "Has a 10% chance to cause the target to fall asleep. If this move is successful on at least one target and the user is a Meloetta, it changes to Pirouette Forme if it is currently in Aria Forme, or changes to Aria Forme if it is currently in Pirouette Forme. This forme change does not happen if the Meloetta has the Ability Sheer Force. The Pirouette Forme reverts to Aria Forme when Meloetta is not active. This move also switches Meloetta's SpA and Atk EVs, boosts, and certain natures, specifically: Modest <-> Adamant, Jolly <-> Timid, other natures are left untouched.", - }, - /****************************************************************** - Defend Order, Heal Order: - - now +1 priority - - Justification: - - Vespiquen needs viability - ******************************************************************/ - defendorder: { - inherit: true, - priority: 1, - }, - healorder: { - inherit: true, - priority: 1, - }, - /****************************************************************** - Stealth Rock: - - 1/4 damage to Flying-types, 1/8 damage to everything else - - Justification: - - Never has one move affected the viability of types been affected - by one move to such an extent. Stealth Rock makes many - interesting pokemon NU, changing it gives them a fighting chance. - - Flavor justification: - - Removes from it the status of only residual damage affected by - weaknesses/resistances, which is nice. The double damage to - Flying can be explained as counteracting Flying's immunity to - Spikes. - ******************************************************************/ - stealthrock: { - inherit: true, - condition: { - // this is a side condition - onSideStart(side) { - this.add('-sidestart', side, 'move: Stealth Rock'); - }, - onEntryHazard(pokemon) { - let factor = 2; - if (pokemon.hasType('Flying')) factor = 4; - this.damage(pokemon.maxhp * factor / 16); - }, - }, - desc: "Sets up a hazard on the foe's side of the field. Flying types take 1/4 of their max HP from this hazard. Everything else takes 1/8 of their max HP. Can be removed from the foe's side if any foe uses Rapid Spin or Defog, or is hit by Defog.", - shortDesc: "Hurts foes on switch-in (1/8 for every type except Flying types take 1/4).", - }, - /****************************************************************** - Silver Wind, Ominous Wind, AncientPower: - - 100% chance of raising one stat, instead of 10% chance of raising - all stats - - Silver Wind, Ominous Wind: 90 base power in Hail - - Justification: - - Hail sucks - - Precedent: - - Many weathers strengthen moves. SolarBeam's base power is - modified by weather. - - Flavor justification: - - Winds are more damaging when it's hailing. - ******************************************************************/ - silverwind: { - inherit: true, - basePowerCallback() { - if (this.field.isWeather('hail')) { - return 90; - } - return 60; - }, - secondary: { - chance: 100, - self: { - onHit(target, source) { - const stats: BoostID[] = []; - let stat: BoostID; - for (stat in target.boosts) { - if (stat !== 'accuracy' && stat !== 'evasion' && stat !== 'atk' && target.boosts[stat] < 6) { - stats.push(stat); - } - } - if (stats.length) { - const randomStat = this.sample(stats); - const boost: SparseBoostsTable = {}; - boost[randomStat] = 1; - this.boost(boost); - } else { - return false; - } - }, - }, - }, - desc: "Has a 100% chance to raise the user's Attack, Defense, Special Attack, Special Defense, and Speed by 1 stage. This attack's base power becomes 90, if the weather is set to Hail.", - shortDesc: "Raises all stats by 1 (not acc/eva).", - }, - ominouswind: { - inherit: true, - basePowerCallback() { - if (this.field.isWeather('hail')) { - return 90; - } - return 60; - }, - secondary: { - chance: 100, - self: { - onHit(target, source) { - const stats: BoostID[] = []; - let stat: BoostID; - for (stat in target.boosts) { - if (stat !== 'accuracy' && stat !== 'evasion' && stat !== 'atk' && target.boosts[stat] < 6) { - stats.push(stat); - } - } - if (stats.length) { - const randomStat = this.sample(stats); - const boost: SparseBoostsTable = {}; - boost[randomStat] = 1; - this.boost(boost); - } else { - return false; - } - }, - }, - }, - desc: "Has a 100% chance to raise the user's Attack, Defense, Special Attack, Special Defense, and Speed by 1 stage. This attack's base power becomes 90, if the weather is set to Hail.", - shortDesc: "Raises all stats by 1 (not acc/eva).", - }, - ancientpower: { - inherit: true, - secondary: { - chance: 100, - self: { - onHit(target, source) { - const stats: BoostID[] = []; - let stat: BoostID; - for (stat in target.boosts) { - if (stat !== 'accuracy' && stat !== 'evasion' && stat !== 'atk' && target.boosts[stat] < 6) { - stats.push(stat); - } - } - if (stats.length) { - const randomStat = this.sample(stats); - const boost: SparseBoostsTable = {}; - boost[randomStat] = 1; - this.boost(boost); - } else { - return false; - } - }, - }, - }, - desc: "Has a 100% chance to raise the user's Attack, Defense, Special Attack, Special Defense, and Speed by 1 stage.", - shortDesc: "Raises all stats by 1 (not acc/eva).", - }, - /****************************************************************** - Moves relating to Hail: - - boost in some way - - Justification: - - Hail sucks - ******************************************************************/ - avalanche: { - inherit: true, - basePowerCallback(pokemon, source) { - const lastAttackedBy = pokemon.getLastAttackedBy(); - if (lastAttackedBy) { - if (lastAttackedBy.damage > 0 && lastAttackedBy.thisTurn) { - this.debug('Boosted for getting hit by ' + lastAttackedBy.move); - return this.field.isWeather('hail') ? 180 : 120; - } - } - return this.field.isWeather('hail') ? 90 : 60; - }, - desc: "Power doubles if the user was hit by the target this turn. If the weather is set to hail, this move does 1.5x more damage.", - shortDesc: "Power doubles if user is damaged by the target.", - }, - /****************************************************************** - Direct phazing moves: - - changed to perfect accuracy - - Justification: - - NEXT has buffed perfect accuracy to the point where unbanning - +evasion could be viable. - - as the primary counter to set-up, these should be able to counter - DT (and subDT) in case they are ever unbanned. - - Precedent: - - Haze, a move with a similar role, has perfect accuracy - - Flavor justification: - - Whirlwinds and roaring are wide-area enough that dodging them - isn't generally feasible. - ******************************************************************/ - roar: { - inherit: true, - accuracy: true, - }, - whirlwind: { - inherit: true, - accuracy: true, - }, - /****************************************************************** - Multi-hit moves: - - changed to perfect accuracy - - Justification: - - as an Interesting Mechanic in terms of being able to hit past - Substitute, it could use a buff - - Flavor justification: - - You're going to attack that many times and they're all going to - miss? - ******************************************************************/ - doublehit: { - inherit: true, - accuracy: true, - }, - armthrust: { - inherit: true, - accuracy: true, - }, - barrage: { - inherit: true, - accuracy: true, - }, - beatup: { - inherit: true, - accuracy: true, - }, - bulletseed: { - inherit: true, - accuracy: true, - }, - cometpunch: { - inherit: true, - accuracy: true, - }, - doublekick: { - inherit: true, - accuracy: true, - }, - doubleslap: { - inherit: true, - accuracy: true, - }, - dualchop: { - inherit: true, - accuracy: true, - }, - furyattack: { - inherit: true, - accuracy: true, - }, - furyswipes: { - inherit: true, - accuracy: true, - }, - geargrind: { - inherit: true, - accuracy: true, - }, - iciclespear: { - inherit: true, - accuracy: true, - }, - pinmissile: { - inherit: true, - accuracy: true, - }, - rockblast: { - inherit: true, - accuracy: true, - }, - spikecannon: { - inherit: true, - accuracy: true, - }, - tailslap: { - inherit: true, - accuracy: true, - }, - watershuriken: { - inherit: true, - accuracy: true, - }, - /****************************************************************** - Draining moves: - - buff Leech Life - - Justification: - - Poison, Bug, Grass, and Ghost make sense for draining types. - ******************************************************************/ - leechlife: { - inherit: true, - basePower: 75, - }, - /****************************************************************** - Flying moves: - - now a bit better - - Justification: - - Flying has always been the type that's suffered from limited - distribution. Let's see how it does without that disadvantage. - ******************************************************************/ - twister: { - inherit: true, - basePower: 80, - onBasePower(power, user) { - const GossamerWingUsers = [ - "Butterfree", "Venomoth", "Masquerain", "Dustox", "Beautifly", "Mothim", "Lilligant", "Volcarona", "Vivillon", - ]; - if (user.hasItem('stick') && GossamerWingUsers.includes(user.species.name)) { - return power * 1.5; - } - }, - secondary: { - chance: 30, - volatileStatus: 'confusion', - }, - desc: "Has a 30% chance to flinch the target. Damage doubles if the target is using Bounce, Fly, or Sky Drop. If the user holds the Gossamer Wing, this move does 1.5x more damage.", - shortDesc: "30% chance to flinch the foe(s).", - pp: 15, - type: "Flying", - }, - wingattack: { - inherit: true, - basePower: 40, - accuracy: true, - multihit: [2, 2], - desc: "This move hits twice.", - shortDesc: "Hits twice.", - }, - /****************************************************************** - Moves with not enough drawbacks: - - intensify drawbacks - - Justification: - - Close Combat is way too common. - ******************************************************************/ - closecombat: { - inherit: true, - self: { - boosts: { - def: -2, - spd: -2, - }, - }, - desc: "Lowers the user's Defense and Special Defense by 2 stage.", - shortDesc: "Lowers the user's Defense and Sp. Def by 2.", - }, - /****************************************************************** - Blizzard: - - 30% freeze chance - - Justification: - - freeze was nerfed, Blizzard can now have Thunder/Hurricane-like - secondary chances. - ******************************************************************/ - blizzard: { - inherit: true, - secondary: { - chance: 30, - status: 'frz', - }, - desc: "Has a 30% chance to freeze the target. If the weather is Hail, this move does not check accuracy.", - shortDesc: "30% chance to freeze foe(s). Can't miss in hail.", - }, - /****************************************************************** - Special Ghost and Fighting: - - buff Ghost, nerf Fighting - - Justification: - - Special Fighting shouldn't be so strong. - - Special Ghost is buffed to compensate for having to use HP - Fighting after this - ******************************************************************/ - focusblast: { - inherit: true, - accuracy: 30, - }, - shadowball: { - inherit: true, - basePower: 90, - secondary: { - chance: 30, - boosts: { - spd: -1, - }, - }, - desc: "Has a 30% chance to lower the target's Special Defense by 1 stage.", - shortDesc: "30% chance to lower the target's Sp. Def by 1.", - }, - /****************************************************************** - Selfdestruct and Explosion: - - 200 and 250 base power autocrit - - Justification: - - these were nerfed unreasonably in gen 5, they're now somewhat - usable again. - ******************************************************************/ - selfdestruct: { - inherit: true, - basePower: 200, - accuracy: true, - willCrit: true, - desc: "The user faints after using this move, even if this move fails for having no target. This move is prevented from executing if any active Pokemon has the Ability Damp. This move is a guaranteed critical hit.", - }, - explosion: { - inherit: true, - basePower: 250, - accuracy: true, - willCrit: true, - desc: "The user faints after using this move, even if this move fails for having no target. This move is prevented from executing if any active Pokemon has the Ability Damp. This move is a guaranteed critical hit.", - }, - /****************************************************************** - Scald and Steam Eruption: - - base power not affected by weather - - 60% burn in sun - - Justification: - - rain could use a nerf - ******************************************************************/ - scald: { - inherit: true, - onModifyMove(move) { - switch (this.field.effectiveWeather()) { - case 'sunnyday': - move.secondary!.chance = 60; - break; - } - }, - desc: "Has a 30% chance to burn the target. The target thaws out if it is frozen. If the weather is set to Sunny Day, there is a 60% chance to burn the target.", - }, - steameruption: { - inherit: true, - accuracy: 100, - onModifyMove(move) { - switch (this.field.effectiveWeather()) { - case 'sunnyday': - move.secondary!.chance = 60; - break; - } - }, - desc: "Has a 30% chance to burn the target. The target thaws out if it is frozen. If the weather is set to Sunny Day, there is a 60% chance to burn the target.", - }, - /****************************************************************** - High Jump Kick: - - 100 bp - - Justification: - - Blaziken nerf - ******************************************************************/ - highjumpkick: { - inherit: true, - basePower: 100, - }, - /****************************************************************** - Echoed Voice: - - change - - Justification: - - no one uses Echoed Voice. - ******************************************************************/ - echoedvoice: { - inherit: true, - basePower: 80, - basePowerCallback() { - return 80; - }, - ignoreImmunity: true, - onHit(target, source) { - if (!target.side.addSlotCondition(target, 'futuremove')) return false; - Object.assign(target.side.slotConditions[target.position]['futuremove'], { - duration: 3, - move: 'echoedvoice', - source: source, - moveData: { - id: 'echoedvoice', - name: "Echoed Voice", - accuracy: 100, - basePower: 80, - category: "Special", - priority: 0, - flags: {metronome: 1, futuremove: 1}, - ignoreImmunity: false, - effectType: 'Move', - type: 'Normal', - }, - }); - this.add('-start', source, 'move: Echoed Voice'); - return null; - }, - desc: "Deals damage two turns after this move is used. At the end of that turn, the damage is calculated at that time and dealt to the Pokemon at the position the target had when the move was used. If the user is no longer active at the time, damage is calculated based on the user's natural Special Attack stat, types, and level, with no boosts from its held item or Ability. Fails if this move or Future Sight is already in effect for the target's position.", - shortDesc: "Hits two turns after being used.", - }, - /****************************************************************** - Rapid Spin, Rock Throw: - - remove hazards before dealing damage - - double damage if hazards are removed - - Rock Throw removes SR only - - Rapid Spin now has base power 30 - - Rock Throw now has accuracy 100 - - Justification: - - hazards could use a nerf - ******************************************************************/ - rapidspin: { - inherit: true, - basePower: 30, - onBasePower(power, user) { - let doubled = false; - if (user.removeVolatile('leechseed')) { - this.add('-end', user, 'Leech Seed', '[from] move: Rapid Spin', '[of] ' + user); - doubled = true; - } - const sideConditions = ['spikes', 'toxicspikes', 'stealthrock']; - for (const condition of sideConditions) { - if (user.side.removeSideCondition(condition)) { - this.add('-sideend', user.side, this.dex.conditions.get(condition).name, '[from] move: Rapid Spin', '[of] ' + user); - doubled = true; - } - } - if (user.volatiles['partiallytrapped']) { - this.add('-remove', user, user.volatiles['partiallytrapped'].sourceEffect.name, '[from] move: Rapid Spin', '[of] ' + user, '[partiallytrapped]'); - doubled = true; - delete user.volatiles['partiallytrapped']; - } - if (doubled) return power * 2; - }, - self: undefined, - desc: "If this move is successful the user removes hazards before it attacks, the effects of Leech Seed and partial-trapping moves end for the user, and all hazards are removed from the user's side of the field. This move does double the damage, if a hazard is removed.", - }, - rockthrow: { - inherit: true, - accuracy: 100, - onBasePower(power, user) { - if (user.side.removeSideCondition('stealthrock')) { - this.add('-sideend', user.side, "Stealth Rock", '[from] move: Rapid Spin', '[of] ' + user); - return power * 2; - } - }, - desc: "This move attempts to remove Stealth Rocks from the user's side, if Stealth Rocks are removed this move does double the damage.", - shortDesc: "Frees the user of Stealth Rock, does 2x damage if it does.", - }, - /****************************************************************** - New feature: Signature Pokemon - - Selected weak moves receive a 1.5x damage boost when used by a - compatible Pokemon. - - Justification: - - Gives a use for many otherwise competitively unviable moves - - This is the sort of change that Game Freak is likely to make - ******************************************************************/ - firefang: { - inherit: true, - onBasePower(power, user) { - if (user.species.id === 'flareon') return this.chainModify(1.5); - }, - accuracy: 100, - secondaries: [ - {chance: 20, status: 'brn'}, - {chance: 30, volatileStatus: 'flinch'}, - ], - desc: "Has a 20% chance to burn the target and a 30% chance to flinch it. If the user is a Flareon, this move does 1.5x more damage.", - shortDesc: "20% chance to burn. 30% chance to flinch.", - }, - icefang: { - inherit: true, - onBasePower(power, user) { - if (user.species.id === 'walrein') return this.chainModify(1.5); - }, - accuracy: 100, - secondaries: [ - {chance: 20, status: 'frz'}, - {chance: 30, volatileStatus: 'flinch'}, - ], - desc: "Has a 20% chance to freeze the target and a 30% chance to flinch it. If the user is a Walrein, this move does 1.5x more damage.", - shortDesc: "20% chance to freeze. 30% chance to flinch.", - }, - thunderfang: { - inherit: true, - onBasePower(power, user) { - if (user.species.id === 'luxray') return this.chainModify(1.5); - }, - accuracy: 100, - secondaries: [ - {chance: 20, status: 'par'}, - {chance: 30, volatileStatus: 'flinch'}, - ], - desc: "Has a 20% chance to paralyze the target and a 30% chance to flinch it. If the user is a Luxray, this move does 1.5x more damage.", - shortDesc: "20% chance to paralyze. 30% chance to flinch.", - }, - poisonfang: { - inherit: true, - onBasePower(power, user) { - if (user.species.id === 'drapion') return this.chainModify(1.5); - }, - accuracy: 100, - secondaries: [ - {chance: 100, status: 'tox'}, - {chance: 30, volatileStatus: 'flinch'}, - ], - desc: "Has a 100% chance to badly poison the target and a 30% chance to flinch it. If the user is a Drapion, this move does 1.5x more damage.", - shortDesc: "100% chance to badly poison. 30% chance to flinch.", - }, - poisontail: { - inherit: true, - basePower: 60, - onBasePower(power, user) { - if (user.species.id === 'seviper') return this.chainModify(1.5); - }, - accuracy: 100, - secondary: { - chance: 60, - status: 'tox', - }, - desc: "Has a 60% chance to badly poison the target and a higher chance for a critical hit. If the user is a Seviper, this move does 1.5x more damage.", - shortDesc: "High critical hit ratio. 60% chance to badly poison.", - }, - slash: { - inherit: true, - basePower: 60, - onBasePower(power, user) { - if (user.species.id === 'persian') return this.chainModify(1.5); - }, - secondary: { - chance: 30, - boosts: { - def: -1, - }, - }, - desc: "Has a higher chance for a critical hit. 30% chance to lower the target's Defense by one stage. If the user is a Persian, this move does 1.5x more damage.", - shortDesc: "High critical hit ratio. 30% chance to lower Def by 1.", - }, - sludge: { - inherit: true, - basePower: 60, - onBasePower(power, user) { - if (user.species.id === 'muk') return this.chainModify(1.5); - }, - secondary: { - chance: 100, - status: 'psn', - }, - desc: "Has a 100% chance to poison the target. If the user is a Muk, this move does 1.5x more damage.", - shortDesc: "100% chance to poison the target.", - }, - smog: { - inherit: true, - basePower: 75, - accuracy: 100, - onBasePower(power, user) { - if (user.species.id === 'weezing') return this.chainModify(1.5); - }, - secondary: { - chance: 100, - status: 'psn', - }, - desc: "Has a 100% chance to poison the target. If the user is a Weezing, this move does 1.5x more damage.", - shortDesc: "100% chance to poison the target.", - }, - flamecharge: { - inherit: true, - basePower: 60, - onBasePower(power, user) { - if (user.species.id === 'rapidash') return this.chainModify(1.5); - }, - desc: "Has a 100% chance to raise the user's Speed by 1 stage. If the user is a Rapidash, this move does 1.5x more damage.", - }, - flamewheel: { - inherit: true, - onBasePower(power, user) { - if (user.species.id === 'darmanitan') return this.chainModify(1.5); - }, - desc: "Has a 10% chance to burn the target. If the user is a Darmanitan, this move does 1.5x more damage.", - }, - spark: { - inherit: true, - onBasePower(power, user) { - if (user.species.id === 'eelektross') return this.chainModify(1.5); - }, - desc: "Has a 30% chance to paralyze the target. If the user is an Eelektross, this move does 1.5x more damage.", - }, - triplekick: { - inherit: true, - onBasePower(power, user) { - if (user.species.id === 'hitmontop') return this.chainModify(1.5); - }, - accuracy: true, - desc: "Hits three times. Power increases to 20 for the second hit and 30 for the third. This move checks accuracy for each hit, and the attack ends if the target avoids any of the hits. If one of the hits breaks the target's substitute, it will take damage for the remaining hits. If the user has the Ability Skill Link, this move will always hit three times. If the user is a Hitmontop, this move does 1.5x more damage.", - }, - bubblebeam: { - inherit: true, - onBasePower(power, user) { - if (user.species.id === 'kingdra') return this.chainModify(1.5); - }, - secondary: { - chance: 30, - boosts: { - spe: -1, - }, - }, - desc: "Has a 30% chance to lower the target's Speed by 1 stage. If the user is a Kingdra, this move does 1.5x more damage.", - shortDesc: "30% chance to lower the target's Speed by 1.", - }, - electroweb: { - inherit: true, - basePower: 60, - onBasePower(power, user) { - if (user.species.id === 'galvantula') return this.chainModify(1.5); - }, - desc: "Has a 100% chance to lower the target's Speed by 1 stage. If the user is a Galvantula, this move does 1.5x more damage.", - accuracy: 100, - }, - gigadrain: { - inherit: true, - basePower: 60, - onBasePower(power, user) { - if (user.species.id === 'beautifly') return this.chainModify(1.5); - }, - desc: "The user recovers 1/2 the HP lost by the target, rounded half up. If Big Root is held by the user, the HP recovered is 1.3x normal, rounded half down. If the user is a Beautifly, this move does 1.5x more damage.", - accuracy: 100, - }, - icywind: { - inherit: true, - basePower: 60, - onBasePower(power, user) { - if (user.species.id === 'glaceon') return this.chainModify(1.5); - }, - desc: "Has a 100% chance to lower the target's Speed by 1 stage. If the user is a Glaceon, this move does 1.5x more damage.", - accuracy: 100, - }, - mudshot: { - inherit: true, - basePower: 60, - onBasePower(power, user) { - if (user.species.id === 'swampert') return this.chainModify(1.5); - }, - desc: "Has a 100% chance to lower the target's Speed by 1 stage. If the user is a Swampert, this move does 1.5x more damage.", - accuracy: 100, - }, - glaciate: { - inherit: true, - basePower: 80, - onBasePower(power, user) { - if (user.species.id === 'kyurem') return this.chainModify(1.5); - }, - desc: "Has a 100% chance to lower the target's Speed by 1 stage. If the user is a Kyurem, this move does 1.5x more damage.", - accuracy: 100, - }, - octazooka: { - inherit: true, - basePower: 75, - onBasePower(power, user) { - if (user.species.id === 'octillery') return this.chainModify(1.5); - }, - accuracy: 90, - secondary: { - chance: 100, - boosts: { - accuracy: -1, - }, - }, - desc: "Has a 100% chance to lower the target's accuracy by 1 stage. If the user is a Octillery, this move does 1.5x more damage.", - shortDesc: "100% chance to lower the target's accuracy by 1.", - }, - leaftornado: { - inherit: true, - basePower: 75, - onBasePower(power, user) { - if (user.species.id === 'serperior') return this.chainModify(1.5); - }, - accuracy: 90, - secondary: { - chance: 100, - boosts: { - accuracy: -1, - }, - }, - desc: "Has a 100% chance to lower the target's accuracy by 1 stage. If the user is a Serperior, this move does 1.5x more damage.", - shortDesc: "100% chance to lower the target's accuracy by 1.", - }, - iceshard: { - inherit: true, - onBasePower(power, user) { - if (user.species.id === 'weavile') return this.chainModify(1.5); - }, - desc: "If the user is a Weavile, this move does 1.5x more damage.", - }, - aquajet: { - inherit: true, - onBasePower(power, user) { - if (user.species.id === 'sharpedo') return this.chainModify(1.5); - }, - desc: "If the user is a Sharpedo, this move does 1.5x more damage.", - }, - machpunch: { - inherit: true, - onBasePower(power, user) { - if (user.species.id === 'hitmonchan') return this.chainModify(1.5); - }, - desc: "If the user is a Hitmonchan, this move does 1.5x more damage.", - }, - shadowsneak: { - inherit: true, - onBasePower(power, user) { - if (user.species.id === 'banette') return this.chainModify(1.5); - }, - desc: "If the user is a Banette, this move does 1.5x more damage.", - }, - steelwing: { - inherit: true, - basePower: 60, - onBasePower(power, user) { - if (user.species.id === 'skarmory') return this.chainModify(1.5); - }, - accuracy: 100, - secondary: { - chance: 50, - self: { - boosts: { - def: 1, - }, - }, - }, - desc: "Has a 50% chance to raise the user's Defense by 1 stage. If the user is a Skarmory, this move does 1.5x more damage.", - shortDesc: "50% chance to raise the user's Defense by 1.", - }, - surf: { - inherit: true, - onBasePower(power, user) { - if (user.species.id === 'masquerain') return this.chainModify(1.5); - }, - secondary: { - chance: 10, - boosts: { - spe: -1, - }, - }, - desc: "Damage doubles if the target is using Dive. 10% chance to lower the target's Speed by one stage. If the user is a Masquerain, this move does 1.5x more damage.", - shortDesc: "Power doubles on Dive. 10% chance to lower Spe by 1.", - }, - hiddenpower: { - inherit: true, - onBasePower(power, user) { - if (user.species.id === 'unown') return this.chainModify(1.5); - }, - }, - /****************************************************************** - Moves with accuracy not a multiple of 10% - - round up to a multiple of 10% - - Rock Slide and Charge Beam also round up to 100% - - Justification: - - missing Hydro Pump is losing a gamble, but missing V-create is - nothing but hax - - Rock Slide is included for being similar enough to Air Slash - - Charge Beam is included because its 30% chance of no boost is enough - ******************************************************************/ - jumpkick: { - inherit: true, - accuracy: 100, - }, - razorshell: { - inherit: true, - accuracy: 100, - }, - drillrun: { - inherit: true, - accuracy: 100, - }, - vcreate: { - inherit: true, - accuracy: 100, - }, - aeroblast: { - inherit: true, - accuracy: 100, - }, - sacredfire: { - inherit: true, - accuracy: 100, - }, - spacialrend: { - inherit: true, - accuracy: 100, - }, - originpulse: { - inherit: true, - accuracy: 90, - }, - precipiceblades: { - inherit: true, - accuracy: 90, - }, - airslash: { - inherit: true, - accuracy: 100, - }, - rockslide: { - inherit: true, - accuracy: 100, - }, - chargebeam: { - inherit: true, - accuracy: 100, - }, - aircutter: { - inherit: true, - accuracy: 100, - }, - furycutter: { - inherit: true, - accuracy: 100, - }, - flyingpress: { - inherit: true, - accuracy: 100, - }, - crushclaw: { - inherit: true, - accuracy: 100, - }, - razorleaf: { - inherit: true, - accuracy: 100, - }, - stringshot: { - inherit: true, - accuracy: 100, - }, - metalclaw: { - inherit: true, - accuracy: 100, - }, - diamondstorm: { - inherit: true, - accuracy: 100, - }, - snarl: { - inherit: true, - accuracy: 100, - }, - powerwhip: { - inherit: true, - accuracy: 90, - }, - seedflare: { - inherit: true, - accuracy: 90, - }, - willowisp: { - inherit: true, - accuracy: 90, - }, - meteormash: { - inherit: true, - accuracy: 90, - }, - boltstrike: { - inherit: true, - accuracy: 90, - secondary: { - chance: 30, - status: 'par', - }, - desc: "Has a 30% chance to paralyze the target.", - shortDesc: "30% chance to paralyze the target.", - }, - blueflare: { - inherit: true, - accuracy: 90, - secondary: { - chance: 30, - status: 'brn', - }, - desc: "Has a 30% chance to burn the target.", - shortDesc: "30% chance to burn the target.", - }, - dragonrush: { - inherit: true, - accuracy: 80, - }, - rocktomb: { - inherit: true, - accuracy: 100, - }, - fireblast: { - inherit: true, - accuracy: 80, - secondary: { - chance: 20, - status: 'brn', - }, - desc: "Has a 20% chance to burn the target.", - shortDesc: "20% chance to burn the target.", - }, - irontail: { - inherit: true, - accuracy: 80, - }, - magmastorm: { - inherit: true, - accuracy: 80, - }, - megahorn: { - inherit: true, - accuracy: 90, - }, - megapunch: { - inherit: true, - accuracy: 90, - }, - megakick: { - inherit: true, - accuracy: 80, - }, - slam: { - inherit: true, - accuracy: 80, - }, - rollingkick: { - inherit: true, - accuracy: 90, - }, - takedown: { - inherit: true, - accuracy: 90, - }, - mudbomb: { - inherit: true, - accuracy: 90, - }, - mirrorshot: { - inherit: true, - accuracy: 90, - }, - rockclimb: { - inherit: true, - accuracy: 90, - }, - poisonpowder: { - inherit: true, - accuracy: 80, - }, - stunspore: { - inherit: true, - accuracy: 80, - }, - sleeppowder: { - inherit: true, - accuracy: 80, - }, - sweetkiss: { - inherit: true, - accuracy: 80, - }, - lovelykiss: { - inherit: true, - accuracy: 80, - }, - whirlpool: { - inherit: true, - accuracy: 90, - }, - firespin: { - inherit: true, - accuracy: 90, - }, - clamp: { - inherit: true, - accuracy: 90, - }, - sandtomb: { - inherit: true, - accuracy: 90, - }, - bind: { - inherit: true, - accuracy: 90, - }, - grasswhistle: { - inherit: true, - accuracy: 60, - }, - sing: { - inherit: true, - accuracy: 60, - }, - supersonic: { - inherit: true, - accuracy: 60, - }, - screech: { - inherit: true, - accuracy: 90, - }, - metalsound: { - inherit: true, - accuracy: 90, - }, - /****************************************************************** - Signature moves and other moves with limited distribution: - - buffed in various ways - - Justification: - - more metagame variety is always good - ******************************************************************/ - psychocut: { - inherit: true, - basePower: 90, - }, - twineedle: { - inherit: true, - accuracy: true, - basePower: 50, - }, - drillpeck: { - inherit: true, - basePower: 100, - pp: 10, - }, - needlearm: { - inherit: true, - basePower: 100, - pp: 10, - }, - leafblade: { - inherit: true, - basePower: 100, - pp: 10, - }, - attackorder: { - inherit: true, - basePower: 100, - pp: 10, - }, - withdraw: { - inherit: true, - boosts: { - def: 1, - spd: 1, - }, - desc: "Raises the user's Defense and Special Defense by 1 stage.", - shortDesc: "Raises the user's Def and SpD by 1.", - }, - paraboliccharge: { - inherit: true, - basePower: 40, - secondary: { - chance: 100, - boosts: { - spa: -1, - spd: -1, - }, - self: { - boosts: { - spa: 1, - spd: 1, - }, - }, - }, - desc: "The user recovers 1/2 the HP lost by the target, rounded half up. If Big Root is held by the user, the HP recovered is 1.3x normal, rounded half down. 100% chance to lower the target's Special Attack and Special Defense by one stage, and boost the user's Special Attack and Special Defense by one stage.", - }, - drainingkiss: { - inherit: true, - basePower: 40, - secondary: { - chance: 100, - boosts: { - spa: -1, - atk: -1, - }, - self: { - boosts: { - spa: 1, - atk: 1, - }, - }, - }, - desc: "The user recovers 3/4 the HP lost by the target, rounded half up. If Big Root is held by the user, the HP recovered is 1.3x normal, rounded half down. 100% chance to lower the target's Special Attack and Special Defense by one stage, and boost the user's Special Attack and Special Defense by one stage.", - }, - stomp: { - inherit: true, - basePower: 100, - accuracy: true, - pp: 10, - }, - steamroller: { - inherit: true, - basePower: 100, - accuracy: true, - pp: 10, - }, - crabhammer: { - inherit: true, - basePower: 100, - accuracy: 100, - }, - autotomize: { - inherit: true, - boosts: { - spe: 3, - }, - desc: "Raises the user's Speed by 3 stages. If the user's Speed was changed, the user's weight is reduced by 100kg as long as it remains active. This effect is stackable but cannot reduce the user's weight to less than 0.1kg.", - shortDesc: "Raises the user's Speed by 3; user loses 100 kg.", - }, - dizzypunch: { - inherit: true, - basePower: 90, - secondary: { - chance: 50, - volatileStatus: 'confusion', - }, - desc: "Has a 50% chance to confuse the target.", - shortDesc: "50% chance to confuse the target.", - }, - nightdaze: { - inherit: true, - accuracy: 100, - onModifyMove(move, user) { - if (user.illusion) { - const illusionMoves = user.illusion.moves.filter(m => this.dex.moves.get(m).category !== 'Status'); - if (!illusionMoves.length) return; - // I'll figure out a better fix for this later - (move as any).name = this.dex.moves.get(this.sample(illusionMoves)).name; - } - }, - desc: "Has a 40% chance to lower the target's accuracy by 1 stage. If Illusion is active, displays as a random non-Status move in the copied Pokémon's moveset.", - }, - muddywater: { - inherit: true, - basePower: 85, - accuracy: 100, - }, - powergem: { - inherit: true, - basePower: 40, - accuracy: true, - multihit: [2, 2], - desc: "Hits twice. If the first hit breaks the target's substitute, it will take damage for the second hit.", - shortDesc: "Hits 2 times in one turn.", - }, - acid: { - inherit: true, - ignoreImmunity: true, - }, - acidspray: { - inherit: true, - ignoreImmunity: true, - }, - eggbomb: { - inherit: true, - accuracy: 80, - basePower: 60, - willCrit: true, - desc: "This move is always a critical hit unless the target is under the effect of Lucky Chant or has the Abilities Battle Armor or Shell Armor.", - shortDesc: "Always results in a critical hit.", - }, - sacredsword: { - inherit: true, - basePower: 95, - }, - triattack: { - inherit: true, - accuracy: true, - basePower: 30, - desc: "Hits 3 times. Has a 10% chance to burn, paralyze or freeze the target each time.", - shortDesc: "Hits 3x; 10% chance to paralyze/burn/freeze.", - multihit: [3, 3], - secondary: { - chance: 10, - onHit(target, source) { - const result = this.random(3); - if (result === 0) { - target.trySetStatus('brn', source); - } else if (result === 1) { - target.trySetStatus('par', source); - } else { - target.trySetStatus('frz', source); - } - }, - }, - }, - /****************************************************************** - Custom moves: - ******************************************************************/ - magikarpsrevenge: { - num: 0, - accuracy: true, - basePower: 120, - category: "Physical", - desc: "Has a 100% chance to confuse the target and lower its Defense and Special Attack by 1 stage. The user recovers 1/2 the HP lost by the target, rounded half up. If Big Root is held by the user, the HP recovered is 1.3x normal, rounded half down. The user steals the foe's boosts. If this move is successful, the weather changes to rain unless it is already in effect, and the user gains the effects of Aqua Ring and Magic Coat.", - shortDesc: "Does many things turn 1. Can't move turn 2.", - name: "Magikarp's Revenge", - pp: 10, - priority: 0, - flags: {contact: 1, recharge: 1, protect: 1, mirror: 1, heal: 1, metronome: 1, nosketch: 1}, - drain: [1, 2], - onTry(pokemon) { - if (pokemon.species.name !== 'Magikarp') { - this.add('-fail', pokemon, 'move: Magikarp\'s Revenge'); - return null; - } - }, - self: { - onHit(source) { - this.field.setWeather('raindance'); - source.addVolatile('magiccoat'); - source.addVolatile('aquaring'); - }, - volatileStatus: 'mustrecharge', - }, - secondary: { - chance: 100, - volatileStatus: 'confusion', - boosts: { - def: -1, - spa: -1, - }, - }, - stealsBoosts: true, - target: "normal", - type: "Water", - contestType: "Cute", - }, -}; diff --git a/data/mods/gennext/pokedex.ts b/data/mods/gennext/pokedex.ts deleted file mode 100644 index aa23f340d210..000000000000 --- a/data/mods/gennext/pokedex.ts +++ /dev/null @@ -1,18 +0,0 @@ -export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable = { - genesectdouse: { - inherit: true, - types: ["Bug", "Water"], - }, - genesectshock: { - inherit: true, - types: ["Bug", "Electric"], - }, - genesectburn: { - inherit: true, - types: ["Bug", "Fire"], - }, - genesectchill: { - inherit: true, - types: ["Bug", "Ice"], - }, -}; diff --git a/data/mods/gennext/scripts.ts b/data/mods/gennext/scripts.ts deleted file mode 100644 index c0916bf04b6b..000000000000 --- a/data/mods/gennext/scripts.ts +++ /dev/null @@ -1,145 +0,0 @@ -export const Scripts: ModdedBattleScriptsData = { - inherit: 'gen6', - init() { - this.modData('Pokedex', 'cherrimsunshine').types = ['Grass', 'Fire']; - - // Give Hurricane to all the Bug/Flying Quiver-dancers - // Precedent: Volcarona - this.modData('Learnsets', 'masquerain').learnset.hurricane = ['5L100']; - this.modData('Learnsets', 'butterfree').learnset.hurricane = ['5L100']; - this.modData('Learnsets', 'beautifly').learnset.hurricane = ['5L100']; - this.modData('Learnsets', 'mothim').learnset.hurricane = ['5L100']; - - // Masquerain also gets Surf because we want it to be viable - this.modData('Learnsets', 'masquerain').learnset.surf = ['5M']; - - // Roserade gets Sludge - this.modData('Learnsets', 'roserade').learnset.sludge = ['5L100']; - - // Meloetta: Fiery Dance - this.modData('Learnsets', 'meloetta').learnset.fierydance = ['5L100']; - - // Galvantula: Zap Cannon - this.modData('Learnsets', 'galvantula').learnset.zapcannon = ['5L100']; - - // Virizion: Horn Leech - this.modData('Learnsets', 'virizion').learnset.hornleech = ['5L100']; - - // Scolipede, Milotic, Steelix: Coil - this.modData('Learnsets', 'milotic').learnset.coil = ['5L100']; - this.modData('Learnsets', 'scolipede').learnset.coil = ['5L100']; - this.modData('Learnsets', 'steelix').learnset.coil = ['5L100']; - - // Rotoms: lots of moves - this.modData('Learnsets', 'rotomwash').learnset.bubblebeam = ['5L100']; - this.modData('Learnsets', 'rotomfan').learnset.hurricane = ['5L100']; - this.modData('Learnsets', 'rotomfan').learnset.twister = ['5L100']; - this.modData('Learnsets', 'rotomfrost').learnset.frostbreath = ['5L100']; - this.modData('Learnsets', 'rotomheat').learnset.heatwave = ['5L100']; - this.modData('Learnsets', 'rotommow').learnset.magicalleaf = ['5L100']; - - // Zororark: much wider movepool - this.modData('Learnsets', 'zoroark').learnset.earthquake = ['5M']; - this.modData('Learnsets', 'zoroark').learnset.stoneedge = ['5M']; - this.modData('Learnsets', 'zoroark').learnset.icebeam = ['5M']; - this.modData('Learnsets', 'zoroark').learnset.xscissor = ['5M']; - this.modData('Learnsets', 'zoroark').learnset.gigadrain = ['5T']; - this.modData('Learnsets', 'zoroark').learnset.superpower = ['5T']; - - // Mantine: lots of moves - this.modData('Learnsets', 'mantine').learnset.recover = ['5L100']; - this.modData('Learnsets', 'mantine').learnset.whirlwind = ['5L100']; - this.modData('Learnsets', 'mantine').learnset.batonpass = ['5L100']; - this.modData('Learnsets', 'mantine').learnset.wish = ['5L100']; - this.modData('Learnsets', 'mantine').learnset.soak = ['5L100']; - this.modData('Learnsets', 'mantine').learnset.lockon = ['5L100']; - this.modData('Learnsets', 'mantine').learnset.acidspray = ['5L100']; - this.modData('Learnsets', 'mantine').learnset.octazooka = ['5L100']; - this.modData('Learnsets', 'mantine').learnset.stockpile = ['5L100']; - - // eggSketch! :D - this.modData('Learnsets', 'aipom').learnset.sketch = ['5E']; - this.modData('Learnsets', 'spinda').learnset.sketch = ['5E']; - this.modData('Learnsets', 'mimejr').learnset.sketch = ['5E']; - - // Tail Glow :D - this.modData('Learnsets', 'finneon').learnset.tailglow = ['5L100']; - this.modData('Learnsets', 'lumineon').learnset.tailglow = ['5L100']; - this.modData('Learnsets', 'mareep').learnset.tailglow = ['5L100']; - this.modData('Learnsets', 'ampharos').learnset.tailglow = ['5L100']; - this.modData('Learnsets', 'chinchou').learnset.tailglow = ['5L100']; - this.modData('Learnsets', 'lanturn').learnset.tailglow = ['5L100']; - - // Spinda: Contrary - this.modData('Learnsets', 'spinda').learnset.vcreate = ['5L100']; - this.modData('Learnsets', 'spinda').learnset.superpower = ['5L100']; - this.modData('Learnsets', 'spinda').learnset.closecombat = ['5L100']; - this.modData('Learnsets', 'spinda').learnset.overheat = ['5L100']; - this.modData('Learnsets', 'spinda').learnset.leafstorm = ['5L100']; - this.modData('Learnsets', 'spinda').learnset.dracometeor = ['5L100']; - - // Venusaur - this.modData('Pokedex', 'venusaur').abilities['1'] = 'Leaf Guard'; - // Charizard - this.modData('Pokedex', 'charizard').abilities['1'] = 'Flame Body'; - // Blastoise - this.modData('Pokedex', 'blastoise').abilities['1'] = 'Shell Armor'; - // Meganium - this.modData('Pokedex', 'meganium').abilities['1'] = 'Harvest'; - // Typhlosion - this.modData('Pokedex', 'typhlosion').abilities['1'] = 'Magma Armor'; - // Feraligatr - this.modData('Pokedex', 'feraligatr').abilities['1'] = 'Strong Jaw'; - // Sceptile - this.modData('Pokedex', 'sceptile').abilities['1'] = 'Limber'; - // Blaziken - this.modData('Pokedex', 'blaziken').abilities['1'] = 'Reckless'; - // Swampert - this.modData('Pokedex', 'swampert').abilities['1'] = 'Hydration'; - // Torterra - this.modData('Pokedex', 'torterra').abilities['1'] = 'Weak Armor'; - // Infernape - this.modData('Pokedex', 'infernape').abilities['1'] = 'No Guard'; - // Empoleon - this.modData('Pokedex', 'empoleon').abilities['1'] = 'Ice Body'; - // Serperior - this.modData('Pokedex', 'serperior').abilities['1'] = 'Own Tempo'; - // Emboar - this.modData('Pokedex', 'emboar').abilities['1'] = 'Sheer Force'; - // Samurott - this.modData('Pokedex', 'samurott').abilities['1'] = 'Technician'; - // Chesnaught - this.modData('Pokedex', 'chesnaught').abilities['1'] = 'Battle Armor'; - // Delphox - this.modData('Pokedex', 'delphox').abilities['1'] = 'Magic Guard'; - // Greninja - this.modData('Pokedex', 'greninja').abilities['1'] = 'Pickpocket'; - - // Levitate mons - this.modData('Pokedex', 'unown').abilities['1'] = 'Shadow Tag'; - this.modData('Pokedex', 'flygon').abilities['1'] = 'Compound Eyes'; - this.modData('Pokedex', 'flygon').abilities['H'] = 'Sand Rush'; - this.modData('Pokedex', 'weezing').abilities['1'] = 'Aftermath'; - this.modData('Pokedex', 'eelektross').abilities['1'] = 'Poison Heal'; - this.modData('Pokedex', 'claydol').abilities['1'] = 'Filter'; - this.modData('Pokedex', 'mismagius').abilities['1'] = 'Cursed Body'; - this.modData('Pokedex', 'cryogonal').abilities['1'] = 'Ice Body'; - this.modData('Pokedex', 'mesprit').abilities['1'] = 'Serene Grace'; - this.modData('Pokedex', 'uxie').abilities['1'] = 'Synchronize'; - this.modData('Pokedex', 'azelf').abilities['1'] = 'Steadfast'; - this.modData('Pokedex', 'hydreigon').abilities['1'] = 'Sheer Force'; - // Rotoms - this.modData('Pokedex', 'rotom').abilities['1'] = 'Trace'; - this.modData('Pokedex', 'rotomwash').abilities['1'] = 'Trace'; - this.modData('Pokedex', 'rotomheat').abilities['1'] = 'Trace'; - this.modData('Pokedex', 'rotommow').abilities['1'] = 'Trace'; - this.modData('Pokedex', 'rotomfrost').abilities['1'] = 'Trace'; - this.modData('Pokedex', 'rotomfan').abilities['1'] = 'Trace'; - - // Adaptability change - this.modData('Pokedex', 'crawdaunt').abilities['H'] = 'Tough Claws'; - - // Vespiquen - this.modData('Pokedex', 'vespiquen').abilities['1'] = 'Swarm'; - }, -}; diff --git a/server/chat-commands/info.ts b/server/chat-commands/info.ts index fb7c470f5a22..be814ff80cea 100644 --- a/server/chat-commands/info.ts +++ b/server/chat-commands/info.ts @@ -1832,18 +1832,6 @@ export const commands: Chat.ChatCommands = { `!cap - Show everyone that information. Requires: + % @ # ~`, ], - gennext(target, room, user) { - if (!this.runBroadcast()) return; - this.sendReplyBox( - "NEXT (also called Gen-NEXT) is a mod that makes changes to the game:
" + - `- README: overview of NEXT
` + - "Example replays:
" + - `- Zergo vs Mr Weegle Snarf
` + - `- NickMP vs Khalogie` - ); - }, - gennexthelp: [`/gennext - Provides information on the Gen-NEXT mod.`], - battlerules(target, room, user) { return this.parse(`/join view-battlerules`); }, diff --git a/sim/pokemon.ts b/sim/pokemon.ts index f7813951618c..5f1c3680702a 100644 --- a/sim/pokemon.ts +++ b/sim/pokemon.ts @@ -283,7 +283,6 @@ export class Pokemon { * An object for storing untyped data, for mods to use. */ m: { - gluttonyFlag?: boolean, // Gen-NEXT innate?: string, // Partners in Crime originalSpecies?: string, // Mix and Mega [key: string]: any,