mirror of
https://github.com/smogon/pokemon-showdown.git
synced 2026-06-02 22:08:36 -05:00
Merge remote-tracking branch 'upstream/master' into types-num
This commit is contained in:
commit
0be04d382f
2
LICENSE
2
LICENSE
|
|
@ -1,6 +1,6 @@
|
|||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2011-2024 Guangcong Luo and other contributors http://pokemonshowdown.com/
|
||||
Copyright (c) 2011-2026 Guangcong Luo and other contributors http://pokemonshowdown.com/
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
|
|
|||
|
|
@ -25,6 +25,15 @@ exports.bindaddress = '0.0.0.0';
|
|||
*/
|
||||
exports.wsdeflate = null;
|
||||
|
||||
/**
|
||||
* lazysockets - disables eager initialization of network services
|
||||
* Turn this on if you'd prefer to manually connect Showdown to the network,
|
||||
* or you intend to run it offline.
|
||||
*
|
||||
* @type {boolean}
|
||||
*/
|
||||
exports.lazysockets = false;
|
||||
|
||||
/*
|
||||
// example:
|
||||
exports.wsdeflate = {
|
||||
|
|
|
|||
1431
config/formats.ts
1431
config/formats.ts
File diff suppressed because it is too large
Load Diff
|
|
@ -2017,7 +2017,7 @@ export const Abilities: import('../sim/dex-abilities').AbilityDataTable = {
|
|||
}
|
||||
},
|
||||
onEnd(pokemon) {
|
||||
if (pokemon.illusion) {
|
||||
if (pokemon.illusion && !pokemon.beingCalledBack) {
|
||||
this.debug('illusion cleared');
|
||||
pokemon.illusion = null;
|
||||
const details = pokemon.getUpdatedDetails();
|
||||
|
|
@ -2333,10 +2333,7 @@ export const Abilities: import('../sim/dex-abilities').AbilityDataTable = {
|
|||
return;
|
||||
}
|
||||
if (this.checkMoveMakesContact(move, source, target, !source.isAlly(target))) {
|
||||
const oldAbility = source.setAbility('lingeringaroma', target);
|
||||
if (oldAbility) {
|
||||
this.add('-activate', target, 'ability: Lingering Aroma', this.dex.abilities.get(oldAbility).name, `[of] ${source}`);
|
||||
}
|
||||
source.setAbility('lingeringaroma', target);
|
||||
}
|
||||
},
|
||||
flags: {},
|
||||
|
|
@ -2714,10 +2711,7 @@ export const Abilities: import('../sim/dex-abilities').AbilityDataTable = {
|
|||
return;
|
||||
}
|
||||
if (this.checkMoveMakesContact(move, source, target, !source.isAlly(target))) {
|
||||
const oldAbility = source.setAbility('mummy', target);
|
||||
if (oldAbility) {
|
||||
this.add('-activate', target, 'ability: Mummy', this.dex.abilities.get(oldAbility).name, `[of] ${source}`);
|
||||
}
|
||||
source.setAbility('mummy', target);
|
||||
}
|
||||
},
|
||||
flags: {},
|
||||
|
|
@ -4255,6 +4249,10 @@ export const Abilities: import('../sim/dex-abilities').AbilityDataTable = {
|
|||
return this.chainModify(0.5);
|
||||
}
|
||||
},
|
||||
onEnd(pokemon) {
|
||||
if (pokemon.beingCalledBack) return;
|
||||
this.add('-end', pokemon, 'Slow Start', '[silent]');
|
||||
},
|
||||
flags: {},
|
||||
name: "Slow Start",
|
||||
rating: -1,
|
||||
|
|
@ -5266,20 +5264,7 @@ export const Abilities: import('../sim/dex-abilities').AbilityDataTable = {
|
|||
},
|
||||
wanderingspirit: {
|
||||
onDamagingHit(damage, target, source, move) {
|
||||
if (source.getAbility().flags['failskillswap'] || target.volatiles['dynamax']) return;
|
||||
|
||||
if (this.checkMoveMakesContact(move, source, target)) {
|
||||
const targetCanBeSet = this.runEvent('SetAbility', target, source, this.effect, source.ability);
|
||||
if (!targetCanBeSet) return targetCanBeSet;
|
||||
const sourceAbility = source.setAbility('wanderingspirit', target);
|
||||
if (!sourceAbility) return;
|
||||
if (target.isAlly(source)) {
|
||||
this.add('-activate', target, 'Skill Swap', '', '', `[of] ${source}`);
|
||||
} else {
|
||||
this.add('-activate', target, 'ability: Wandering Spirit', this.dex.abilities.get(sourceAbility).name, 'Wandering Spirit', `[of] ${source}`);
|
||||
}
|
||||
target.setAbility(sourceAbility);
|
||||
}
|
||||
if (this.checkMoveMakesContact(move, source, target)) this.skillSwap(source, target);
|
||||
},
|
||||
flags: {},
|
||||
name: "Wandering Spirit",
|
||||
|
|
|
|||
|
|
@ -91,8 +91,10 @@ export const Aliases: import('../sim/dex').AliasesTable = {
|
|||
zaou: "[Gen 9] Legends Z-A OU",
|
||||
legendsou: "[Gen 9] Legends Z-A OU",
|
||||
plzaou: "[Gen 9] Legends Z-A OU",
|
||||
omotm: "[Gen 9] Pokebilities",
|
||||
lcotm: "[Gen 9] Tera Override",
|
||||
omotm: "[Gen 9] Flipped",
|
||||
lcotm: "[Gen 9] The Loser's Game",
|
||||
ommotm: "[Gen 9] STABmons Mix and Mega",
|
||||
ommspotlight: "[Gen 9] STABmons Mix and Mega",
|
||||
|
||||
// mega evos --- 1st ordered alphabetically by species, 2nd by alias
|
||||
megasnow: "Abomasnow-Mega",
|
||||
|
|
|
|||
574
data/items.ts
574
data/items.ts
File diff suppressed because it is too large
Load Diff
|
|
@ -32244,18 +32244,22 @@ export const Learnsets: import('../sim/dex-species').LearnsetDataTable = {
|
|||
smeargle: {
|
||||
learnset: {
|
||||
captivate: ["5D"],
|
||||
falseswipe: ["5S1"],
|
||||
flamethrower: ["6S2"],
|
||||
furyswipes: ["6S2"],
|
||||
meanlook: ["5S1"],
|
||||
odorsleuth: ["5S1"],
|
||||
seismictoss: ["6S2"],
|
||||
sketch: ["9L1", "7L1", "7V", "6L1", "6S2", "5L1", "5D", "4L1", "3L1", "3S0"],
|
||||
doubleslap: ["3S1"],
|
||||
falseswipe: ["5S2"],
|
||||
flamethrower: ["6S3"],
|
||||
furyswipes: ["6S3"],
|
||||
irontail: ["3S1"],
|
||||
meanlook: ["5S2"],
|
||||
odorsleuth: ["5S2"],
|
||||
seismictoss: ["6S3"],
|
||||
sketch: ["9L1", "7L1", "7V", "6L1", "6S3", "5L1", "5D", "4L1", "3L1", "3S1", "3S0"],
|
||||
sleeptalk: ["5D"],
|
||||
spore: ["5S1"],
|
||||
spore: ["5S2"],
|
||||
tailwhip: ["3S1"],
|
||||
},
|
||||
eventData: [
|
||||
{generation: 3, level: 10, gender: "M", abilities: ["owntempo"], moves: ["sketch"], pokeball: "pokeball"},
|
||||
{generation: 3, level: 45, abilities: ["owntempo"], moves: ["sketch", "tailwhip", "doubleslap", "irontail"]},
|
||||
{generation: 5, level: 50, gender: "F", nature: "Jolly", ivs: {atk: 31, spe: 31}, abilities: ["technician"], moves: ["falseswipe", "spore", "odorsleuth", "meanlook"], pokeball: "cherishball"},
|
||||
{generation: 6, level: 40, gender: "M", nature: "Jolly", abilities: ["owntempo"], moves: ["sketch", "furyswipes", "seismictoss", "flamethrower"], pokeball: "cherishball"},
|
||||
],
|
||||
|
|
@ -53582,7 +53586,7 @@ export const Learnsets: import('../sim/dex-species').LearnsetDataTable = {
|
|||
{generation: 6, level: 1, moves: ["tailglow", "bubble", "watersport", "heartswap"], pokeball: "cherishball"},
|
||||
{generation: 6, level: 100, moves: ["tailglow", "bubble", "watersport"], pokeball: "cherishball"},
|
||||
{generation: 7, level: 15, moves: ["tailglow", "waterpulse", "aquaring", "heartswap"], pokeball: "cherishball"},
|
||||
{generation: 8, moves: ['tailglow', 'watergun'], pokeball: 'pokeball', source: "gen8bdsp"},
|
||||
{generation: 8, level: 1, moves: ['tailglow', 'watergun'], pokeball: 'pokeball', source: "gen8bdsp"},
|
||||
{generation: 8, level: 50, moves: ["waterpulse", "zenheadbutt", "moonblast", "bubble"], source: "gen8legends"},
|
||||
{generation: 9, level: 50, shiny: true, nature: "Calm", ivs: {hp: 31, atk: 20, def: 31, spa: 20, spd: 31, spe: 20}, moves: ["bubblebeam", "acidarmor", "whirlpool", "waterpulse"], pokeball: "cherishball"},
|
||||
],
|
||||
|
|
@ -89284,7 +89288,7 @@ export const Learnsets: import('../sim/dex-species').LearnsetDataTable = {
|
|||
waterpulse: ["9M"],
|
||||
},
|
||||
eventData: [
|
||||
{generation: 9, moves: ["bodyslam", "amnesia", "icespinner", "doubleedge"]},
|
||||
{generation: 9, level: 50, moves: ["bodyslam", "amnesia", "icespinner", "doubleedge"]},
|
||||
],
|
||||
},
|
||||
frigibax: {
|
||||
|
|
|
|||
|
|
@ -223,6 +223,24 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = {
|
|||
},
|
||||
skillswap: {
|
||||
inherit: true,
|
||||
onTryHit(target, source) {
|
||||
const targetAbility = target.getAbility();
|
||||
const sourceAbility = source.getAbility();
|
||||
if (sourceAbility.flags['failskillswap'] || targetAbility.flags['failskillswap'] || target.volatiles['dynamax']) {
|
||||
return false;
|
||||
}
|
||||
let sourceCanBeSet = this.runEvent('SetAbility', source, source, this.effect, targetAbility);
|
||||
if (!this.dex.abilities.get(sourceAbility).exists && this.dex.items.get(sourceAbility.id).exists) {
|
||||
sourceCanBeSet = this.runEvent('TakeItem', source, source, this.effect, this.dex.items.get(sourceAbility.id));
|
||||
}
|
||||
|
||||
if (!sourceCanBeSet) return sourceCanBeSet;
|
||||
let targetCanBeSet = this.runEvent('SetAbility', target, source, this.effect, sourceAbility);
|
||||
if (!this.dex.abilities.get(targetAbility).exists && this.dex.items.get(targetAbility.id).exists) {
|
||||
targetCanBeSet = this.runEvent('TakeItem', target, source, this.effect, this.dex.items.get(targetAbility.id));
|
||||
}
|
||||
if (!targetCanBeSet) return targetCanBeSet;
|
||||
},
|
||||
onHit(target, source, move) {
|
||||
const targetAbility = target.getAbility();
|
||||
const sourceAbility = source.getAbility();
|
||||
|
|
|
|||
|
|
@ -63,10 +63,16 @@ export const Scripts: ModdedBattleScriptsData = {
|
|||
);
|
||||
},
|
||||
setAbility(ability, source, sourceEffect, isFromFormeChange = false, isTransform = false) {
|
||||
const allThings = new Set([
|
||||
...(this.m.scrambled.abilities as { thing: string }[]).map(e => e.thing),
|
||||
...(this.m.scrambled.items as { thing: string }[]).map(e => e.thing),
|
||||
...(this.m.scrambled.moves as { thing: string }[]).map(e => e.thing),
|
||||
this.ability, ...this.moveSlots.map(e => e.move), this.item,
|
||||
].map(this.battle.toID));
|
||||
|
||||
let isBMMAbil = false;
|
||||
let isOldBMMAbil = false;
|
||||
if (!this.hp) return false;
|
||||
if (!this.battle.dex.abilities.get(ability).exists) isBMMAbil = true;
|
||||
if (typeof ability === 'string') {
|
||||
if (this.battle.dex.abilities.get(ability).exists) {
|
||||
ability = this.battle.dex.abilities.get(ability);
|
||||
|
|
@ -85,13 +91,18 @@ export const Scripts: ModdedBattleScriptsData = {
|
|||
} as Ability;
|
||||
}
|
||||
}
|
||||
if (ability.name.length && !this.battle.dex.abilities.get(ability).exists) isBMMAbil = true;
|
||||
if (!sourceEffect && this.battle.effect) sourceEffect = this.battle.effect;
|
||||
let oldAbility;
|
||||
if (this.battle.dex.abilities.get(this.ability).exists) {
|
||||
oldAbility = this.battle.dex.abilities.get(this.ability);
|
||||
} else {
|
||||
let abil = this.battle.dex.items.getByID(this.ability) as Item | Move;
|
||||
if (!abil.exists) abil = this.battle.dex.moves.getByID(this.ability);
|
||||
if (!abil.exists) {
|
||||
abil = this.battle.dex.moves.getByID(this.ability);
|
||||
} else {
|
||||
if (!this.battle.runEvent('TakeItem', this, source, null, abil as Item)) return false;
|
||||
}
|
||||
oldAbility = {
|
||||
id: this.ability,
|
||||
name: abil.name || this.ability,
|
||||
|
|
@ -103,6 +114,9 @@ export const Scripts: ModdedBattleScriptsData = {
|
|||
} as Ability;
|
||||
isOldBMMAbil = true;
|
||||
}
|
||||
|
||||
if (allThings.has(ability.id)) return false;
|
||||
|
||||
if (!isFromFormeChange) {
|
||||
if (ability.flags['cantsuppress'] || this.getAbility().flags['cantsuppress']) return false;
|
||||
}
|
||||
|
|
@ -195,14 +209,22 @@ export const Scripts: ModdedBattleScriptsData = {
|
|||
if (!source) source = this;
|
||||
if (this.battle.gen <= 4) {
|
||||
if (source.itemKnockedOff) return false;
|
||||
if (this.battle.toID(this.ability) === 'multitype') return false;
|
||||
if (this.battle.toID(source.ability) === 'multitype') return false;
|
||||
if (this.battle.toID(this.ability) === 'multitype' || (this.m.scrambled.abilities as { thing: string }[])
|
||||
.findIndex(e => this.battle.toID(e.thing) === 'multitype') >= 0) {
|
||||
return false;
|
||||
}
|
||||
if (this.battle.toID(source.ability) === 'multitype' || (source.m.scrambled.abilities as { thing: string }[])
|
||||
.findIndex(e => this.battle.toID(e.thing) === 'multitype') >= 0) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
const item = this.getItem();
|
||||
if (this.battle.runEvent('TakeItem', this, source, null, item)) {
|
||||
this.item = '';
|
||||
let wrongSlot = (this.m.scrambled.abilities as { inSlot: string }[]).findIndex(e => e.inSlot === 'Item');
|
||||
if (wrongSlot >= 0) {
|
||||
const dexAbil = this.battle.dex.abilities.get(this.m.scrambled.abilities[wrongSlot].thing);
|
||||
if (dexAbil.flags['failskillswap']) return false;
|
||||
this.removeVolatile('ability:' + this.battle.toID(this.m.scrambled.abilities[wrongSlot].thing));
|
||||
this.m.scrambled.abilities.splice(wrongSlot, 1);
|
||||
} else if ((this.m.scrambled.moves as { inSlot: string }[]).findIndex(e => e.inSlot === 'Item') >= 0) {
|
||||
|
|
@ -225,17 +247,27 @@ export const Scripts: ModdedBattleScriptsData = {
|
|||
return false;
|
||||
},
|
||||
setItem(item, source, effect) {
|
||||
const allThings = new Set([
|
||||
...(this.m.scrambled.abilities as { thing: string }[]).map(e => e.thing),
|
||||
...(this.m.scrambled.items as { thing: string }[]).map(e => e.thing),
|
||||
...(this.m.scrambled.moves as { thing: string }[]).map(e => e.thing),
|
||||
this.ability, ...this.moveSlots.map(e => e.move), this.item,
|
||||
].map(this.battle.toID));
|
||||
|
||||
let isBMMItem = false;
|
||||
let isOldBMMItem = false;
|
||||
if (!this.hp || !this.isActive) return false;
|
||||
if (!this.battle.dex.items.get(item).exists) isBMMItem = true;
|
||||
if (typeof item === 'string') {
|
||||
if (this.battle.dex.items.get(item).exists) {
|
||||
if (!item.length || this.battle.dex.items.get(item).exists) {
|
||||
item = this.battle.dex.items.get(item);
|
||||
} else {
|
||||
const itemString = item;
|
||||
let newData = this.battle.dex.abilities.get(itemString) as Ability | Move;
|
||||
if (!newData.exists) newData = this.battle.dex.moves.get(itemString);
|
||||
if (!newData.exists) {
|
||||
newData = this.battle.dex.moves.get(itemString);
|
||||
} else {
|
||||
if ((newData as Ability).flags['failskillswap']) return false;
|
||||
}
|
||||
item = {
|
||||
id: newData.id || itemString,
|
||||
name: newData.name || itemString,
|
||||
|
|
@ -246,6 +278,8 @@ export const Scripts: ModdedBattleScriptsData = {
|
|||
} as Item;
|
||||
}
|
||||
}
|
||||
if (item.name.length && !this.battle.dex.items.get(item).exists) isBMMItem = true;
|
||||
if (allThings.has(item.id)) return false;
|
||||
const effectid = this.battle.effect ? this.battle.effect.id : '';
|
||||
if (RESTORATIVE_BERRIES.has('leppaberry' as ID)) {
|
||||
const inflicted = ['trick', 'switcheroo'].includes(effectid);
|
||||
|
|
@ -340,9 +374,11 @@ export const Scripts: ModdedBattleScriptsData = {
|
|||
|
||||
const isBMM = this.volatiles[item.id]?.inSlot;
|
||||
if (isBMM) {
|
||||
const dexItem = this.battle.dex.items.get(item.name);
|
||||
this.removeVolatile(item.id);
|
||||
this.m.scrambled.items.splice((this.m.scrambled.items as { thing: string, inSlot: string }[]).findIndex(e =>
|
||||
e.thing === this.battle.toID(item.name) && e.inSlot === isBMM), 1);
|
||||
const itemIndex = (this.m.scrambled.items as { thing: string, inSlot: string }[]).findIndex(e =>
|
||||
this.battle.toID(e.thing) === dexItem.id && e.inSlot === isBMM);
|
||||
if (itemIndex >= 0) this.m.scrambled.items.splice(itemIndex, 1);
|
||||
if (isBMM === 'Ability') this.setAbility('No Ability');
|
||||
} else {
|
||||
this.lastItem = this.item;
|
||||
|
|
@ -391,9 +427,11 @@ export const Scripts: ModdedBattleScriptsData = {
|
|||
|
||||
const isBMM = this.volatiles[item.id]?.inSlot;
|
||||
if (isBMM) {
|
||||
const dexItem = this.battle.dex.items.get(item.name);
|
||||
this.removeVolatile(item.id);
|
||||
this.m.scrambled.items.splice((this.m.scrambled.items as { thing: string, inSlot: string }[]).findIndex(e =>
|
||||
e.thing === this.battle.toID(item.name) && e.inSlot === isBMM), 1);
|
||||
const itemIndex = (this.m.scrambled.items as { thing: string, inSlot: string }[]).findIndex(e =>
|
||||
this.battle.toID(e.thing) === dexItem.id && e.inSlot === isBMM);
|
||||
if (itemIndex >= 0) this.m.scrambled.items.splice(itemIndex, 1);
|
||||
if (isBMM === 'Ability') this.setAbility('No Ability');
|
||||
} else {
|
||||
this.lastItem = this.item;
|
||||
|
|
|
|||
|
|
@ -953,4 +953,41 @@ export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTa
|
|||
},
|
||||
shortDesc: "This Pokemon can poison a Pokemon regardless of its typing and hit them with Poison moves.",
|
||||
},
|
||||
jellobody: {
|
||||
onTryHit(pokemon, target, move) {
|
||||
if (move.selfSwitch) {
|
||||
this.add('-immune', pokemon, '[from] ability: Jello Body');
|
||||
this.heal(target.baseMaxhp / 2);
|
||||
return null;
|
||||
}
|
||||
},
|
||||
onModifyMove(move, source, target) {
|
||||
move.drain = [1, 2];
|
||||
},
|
||||
flags: { breakable: 1 },
|
||||
name: "Jello Body",
|
||||
rating: 5,
|
||||
num: -122,
|
||||
shortDesc: "Immune to pivot moves, heals 50% HP when hit by one. All moves drain 50%.",
|
||||
},
|
||||
nibblenibble: {
|
||||
onPrepareHit(source, target, move) {
|
||||
if (move.category === 'Status' || move.multihit || move.flags['noparentalbond'] || move.flags['charge'] ||
|
||||
move.flags['futuremove'] || move.spreadHit || move.isZ || move.isMax || !move.flags['bite']) return;
|
||||
move.multihit = 2;
|
||||
move.multihitType = 'parentalbond';
|
||||
},
|
||||
// Damage modifier implemented in BattleActions#modifyDamage()
|
||||
onSourceModifySecondaries(secondaries, target, source, move) {
|
||||
if (move.multihitType === 'parentalbond' && move.id === 'secretpower' && move.hit < 2) {
|
||||
// hack to prevent accidentally suppressing King's Rock/Razor Fang
|
||||
return secondaries.filter(effect => effect.volatileStatus === 'flinch');
|
||||
}
|
||||
},
|
||||
flags: {},
|
||||
name: "Nibble Nibble",
|
||||
rating: 5,
|
||||
num: -123,
|
||||
shortDesc: "Parental Bond but for Bite moves.",
|
||||
},
|
||||
};
|
||||
|
|
|
|||
|
|
@ -13,12 +13,10 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = {
|
|||
masquerainite: {
|
||||
name: "Masquerainite",
|
||||
spritenum: 1,
|
||||
megaStone: "Masquerain-Mega",
|
||||
megaEvolves: "Masquerain",
|
||||
megaStone: { "Masquerain": "Masquerain-Mega" },
|
||||
itemUser: ["Masquerain"],
|
||||
onTakeItem(item, source) {
|
||||
if (item.megaEvolves === source.baseSpecies.baseSpecies) return false;
|
||||
return true;
|
||||
return !item.megaStone?.[source.baseSpecies.baseSpecies];
|
||||
},
|
||||
num: -1,
|
||||
gen: 9,
|
||||
|
|
@ -59,12 +57,10 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = {
|
|||
typhlosionite: {
|
||||
name: "Typhlosionite",
|
||||
spritenum: 1,
|
||||
megaStone: "Typhlosion-Mega",
|
||||
megaEvolves: "Typhlosion",
|
||||
megaStone: { "Typhlosion": "Typhlosion-Mega" },
|
||||
itemUser: ["Typhlosion"],
|
||||
onTakeItem(item, source) {
|
||||
if (item.megaEvolves === source.baseSpecies.baseSpecies) return false;
|
||||
return true;
|
||||
return !item.megaStone?.[source.baseSpecies.baseSpecies];
|
||||
},
|
||||
num: -2,
|
||||
gen: 9,
|
||||
|
|
@ -127,14 +123,28 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = {
|
|||
},
|
||||
onDamagePriority: -40,
|
||||
onDamage(damage, target, source, effect) {
|
||||
const chance = Math.max(Math.floor(target.hp / target.maxhp), 10);
|
||||
const chance = Math.max(Math.floor(100 - (target.maxhp - target.hp)), 10);
|
||||
if (this.randomChance(chance, 100) && damage >= target.hp && effect && effect.effectType === 'Move') {
|
||||
this.add("-activate", target, "item: Focus Band");
|
||||
return target.hp - 1;
|
||||
} else {
|
||||
return damage;
|
||||
}
|
||||
},
|
||||
num: 230,
|
||||
gen: 2,
|
||||
desc: "Chance to survive attack equal to percentage of remaining HP, minimum 10%.",
|
||||
},
|
||||
raticite: {
|
||||
name: "Raticite",
|
||||
spritenum: 1,
|
||||
megaStone: { "Raticate": "Raticate-Mega" },
|
||||
itemUser: ["Raticate"],
|
||||
onTakeItem(item, source) {
|
||||
return !item.megaStone?.[source.baseSpecies.baseSpecies];
|
||||
},
|
||||
num: -3,
|
||||
gen: 9,
|
||||
desc: "If held by a Raticate, this item allows it to Mega Evolve in battle.",
|
||||
},
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1311,10 +1311,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = {
|
|||
this.add('-fail', source, 'move: Crowverload');
|
||||
return this.NOT_FAIL;
|
||||
}
|
||||
if (source.hp <= source.maxhp / 4) {
|
||||
this.add('-fail', source, 'move: Substitute', '[weak]');
|
||||
return this.NOT_FAIL;
|
||||
}
|
||||
},
|
||||
onAfterMove(source, target, move) {
|
||||
this.actions.useMove('substitute', source, { });
|
||||
|
|
@ -1532,16 +1528,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = {
|
|||
return false;
|
||||
}
|
||||
},
|
||||
onTryHeal(damage, target, source, effect) {
|
||||
if (effect && (effect.id === 'zpower' || (effect as Move).isZ)) return damage;
|
||||
if (source && target !== source && target.hp !== target.maxhp && effect.name === "Pollen Puff") {
|
||||
this.attrLastMove('[still]');
|
||||
// FIXME: Wrong error message, correct one not supported yet
|
||||
this.add('cant', source, 'move: Electric Terrain', effect);
|
||||
return null;
|
||||
}
|
||||
return false;
|
||||
},
|
||||
onFieldResidualOrder: 27,
|
||||
onFieldResidualSubOrder: 7,
|
||||
onFieldEnd() {
|
||||
|
|
@ -1635,6 +1621,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = {
|
|||
target: "normal",
|
||||
type: "Normal",
|
||||
contestType: "Cute",
|
||||
shortDesc: "Present but better.",
|
||||
},
|
||||
sinisterarrows: {
|
||||
num: -1016,
|
||||
|
|
@ -1712,9 +1699,54 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = {
|
|||
target: "normal",
|
||||
type: "Ghost",
|
||||
contestType: "Clever",
|
||||
shortDesc: "Hits for 4 turns, even if user switches out.",
|
||||
},
|
||||
mortalspin: {
|
||||
inherit: true,
|
||||
category: "Special",
|
||||
},
|
||||
lastbreakfast: {
|
||||
num: -1020,
|
||||
accuracy: 100,
|
||||
basePower: 80,
|
||||
category: "Physical",
|
||||
name: "Last Breakfast",
|
||||
pp: 15,
|
||||
priority: 0,
|
||||
flags: { protect: 1, mirror: 1, metronome: 1, contact: 1, bite: 1 },
|
||||
onHit(target, source, move) {
|
||||
const numberBerries = 0 + 1 * Number(source.side.totalFainted);
|
||||
for (let i = 0; i < numberBerries; i++) {
|
||||
const possibleBerries = ['aguavberry', 'apicotberry', 'enigmaberry', 'figyberry', 'ganlonberry', 'iapapaberry',
|
||||
'keeberry', 'lansatberry', 'leppaberry', 'liechiberry', 'lumberry', 'magoberry',
|
||||
'marangaberry', 'micleberry',
|
||||
'oranberry', 'petayaberry', 'salacberry', 'sitrusberry', 'starfberry', 'wikiberry',
|
||||
'aspearberry', 'cheriberry', 'chestoberry', 'lumberry', 'pechaberry', 'rawstberry', 'persimberry'];
|
||||
const chosenBerry = this.sample(possibleBerries);
|
||||
const berry = this.dex.items.get(chosenBerry);
|
||||
if (source.hp && berry.isBerry) {
|
||||
if (this.singleEvent('Eat', berry, null, source, source, move)) {
|
||||
this.runEvent('EatItem', source, source, move, berry);
|
||||
}
|
||||
if (berry.onEat) source.ateBerry = true;
|
||||
}
|
||||
}
|
||||
},
|
||||
onTryMove() {
|
||||
this.attrLastMove('[still]');
|
||||
},
|
||||
onPrepareHit(target, source) {
|
||||
this.add('-anim', source, 'Curse', target);
|
||||
this.add('-anim', source, 'Bug Bite', target);
|
||||
},
|
||||
secondary: null,
|
||||
target: "normal",
|
||||
type: "Ghost",
|
||||
contestType: "Cute",
|
||||
shortDesc: "Eats X random berries, where X is fainted teammates.",
|
||||
},
|
||||
superfang: {
|
||||
inherit: true,
|
||||
flags: { contact: 1, protect: 1, mirror: 1, metronome: 1, bite: 1 },
|
||||
},
|
||||
};
|
||||
|
|
|
|||
|
|
@ -482,10 +482,33 @@ export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable
|
|||
ogerponcornerstone: {
|
||||
inherit: true,
|
||||
abilities: { 0: "Solid Rock" },
|
||||
types: ["Psychic", "Normal"],
|
||||
},
|
||||
glimmora: {
|
||||
inherit: true,
|
||||
abilities: { 0: "Corrosion" },
|
||||
},
|
||||
wobbuffet: {
|
||||
inherit: true,
|
||||
abilities: { 0: "Jello Body" },
|
||||
},
|
||||
raticate: {
|
||||
inherit: true,
|
||||
abilities: { 0: "Hustle" },
|
||||
baseStats: { hp: 90, atk: 81, def: 60, spa: 50, spd: 70, spe: 97 },
|
||||
},
|
||||
raticatemega: {
|
||||
num: -977,
|
||||
name: "Raticate-Mega",
|
||||
baseSpecies: "Raticate",
|
||||
forme: "Mega",
|
||||
types: ["Normal", "Ghost"],
|
||||
genderRatio: { M: 0.5, F: 0.5 },
|
||||
baseStats: { hp: 90, atk: 105, def: 60, spa: 50, spd: 70, spe: 173 },
|
||||
abilities: { 0: "Nibble Nibble" },
|
||||
heightm: 0.7,
|
||||
weightkg: 5,
|
||||
color: "Black",
|
||||
eggGroups: ["Field"],
|
||||
requiredItem: "Raticite",
|
||||
},
|
||||
};
|
||||
|
|
|
|||
|
|
@ -294,5 +294,11 @@ export const Scripts: ModdedBattleScriptsData = {
|
|||
|
||||
this.modData('Learnsets', 'glimmora').learnset.icebeam = ['9L1'];
|
||||
this.modData('Learnsets', 'glimmora').learnset.malignantchain = ['9L1'];
|
||||
|
||||
this.modData('Learnsets', 'wobbuffet').learnset.nightshade = ['9L1'];
|
||||
this.modData('Learnsets', 'wobbuffet').learnset.guillotine = ['9L1'];
|
||||
this.modData('Learnsets', 'wobbuffet').learnset.shedtail = ['9L1'];
|
||||
|
||||
this.modData('Learnsets', 'raticate').learnset.lastbreakfast = ['9L1'];
|
||||
},
|
||||
};
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
|
|||
tier: "LC",
|
||||
},
|
||||
charmeleon: {
|
||||
tier: "ZU",
|
||||
tier: "ZUBL",
|
||||
},
|
||||
charizard: {
|
||||
tier: "UUBL",
|
||||
|
|
@ -57,7 +57,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
|
|||
tier: "LC",
|
||||
},
|
||||
raticate: {
|
||||
tier: "NU",
|
||||
tier: "PU",
|
||||
},
|
||||
spearow: {
|
||||
tier: "LC",
|
||||
|
|
@ -69,7 +69,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
|
|||
tier: "LC",
|
||||
},
|
||||
arbok: {
|
||||
tier: "NU",
|
||||
tier: "PU",
|
||||
},
|
||||
pichu: {
|
||||
tier: "LC",
|
||||
|
|
@ -267,7 +267,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
|
|||
tier: "UU",
|
||||
},
|
||||
farfetchd: {
|
||||
tier: "NU",
|
||||
tier: "PU",
|
||||
},
|
||||
doduo: {
|
||||
tier: "ZU",
|
||||
|
|
@ -345,10 +345,10 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
|
|||
tier: "NU",
|
||||
},
|
||||
hitmonchan: {
|
||||
tier: "PUBL",
|
||||
tier: "PU",
|
||||
},
|
||||
hitmontop: {
|
||||
tier: "PU",
|
||||
tier: "NU",
|
||||
},
|
||||
lickitung: {
|
||||
tier: "NU",
|
||||
|
|
@ -540,7 +540,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
|
|||
tier: "LC",
|
||||
},
|
||||
furret: {
|
||||
tier: "PUBL",
|
||||
tier: "PU",
|
||||
},
|
||||
hoothoot: {
|
||||
tier: "LC",
|
||||
|
|
@ -558,7 +558,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
|
|||
tier: "LC",
|
||||
},
|
||||
ariados: {
|
||||
tier: "ZU",
|
||||
tier: "ZUBL",
|
||||
},
|
||||
chinchou: {
|
||||
tier: "NU",
|
||||
|
|
@ -591,7 +591,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
|
|||
tier: "LC",
|
||||
},
|
||||
azumarill: {
|
||||
tier: "NU",
|
||||
tier: "PU",
|
||||
},
|
||||
sudowoodo: {
|
||||
tier: "NU",
|
||||
|
|
@ -645,7 +645,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
|
|||
tier: "OU",
|
||||
},
|
||||
dunsparce: {
|
||||
tier: "NU",
|
||||
tier: "PU",
|
||||
},
|
||||
gligar: {
|
||||
tier: "UU",
|
||||
|
|
@ -705,7 +705,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
|
|||
tier: "OU",
|
||||
},
|
||||
houndour: {
|
||||
tier: "NU",
|
||||
tier: "PU",
|
||||
},
|
||||
houndoom: {
|
||||
tier: "UUBL",
|
||||
|
|
|
|||
|
|
@ -573,6 +573,15 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = {
|
|||
},
|
||||
pursuit: {
|
||||
inherit: true,
|
||||
beforeTurnCallback(pokemon, target) {
|
||||
if (pokemon.isAlly(target)) return;
|
||||
target.addVolatile('pursuit');
|
||||
const data = target.volatiles['pursuit'];
|
||||
if (!data.sources) {
|
||||
data.sources = [];
|
||||
}
|
||||
data.sources.push(pokemon);
|
||||
},
|
||||
onModifyMove() {},
|
||||
condition: {
|
||||
duration: 1,
|
||||
|
|
|
|||
|
|
@ -63,7 +63,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
|
|||
tier: "LC",
|
||||
},
|
||||
fearow: {
|
||||
tier: "UU",
|
||||
tier: "RUBL",
|
||||
},
|
||||
ekans: {
|
||||
tier: "LC",
|
||||
|
|
@ -312,7 +312,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
|
|||
tier: "ZU",
|
||||
},
|
||||
hypno: {
|
||||
tier: "UU",
|
||||
tier: "RU",
|
||||
},
|
||||
krabby: {
|
||||
tier: "LC",
|
||||
|
|
@ -930,7 +930,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
|
|||
tier: "LC",
|
||||
},
|
||||
manectric: {
|
||||
tier: "UU",
|
||||
tier: "RU",
|
||||
},
|
||||
plusle: {
|
||||
tier: "NU",
|
||||
|
|
|
|||
|
|
@ -578,6 +578,20 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = {
|
|||
inherit: true,
|
||||
basePower: 70,
|
||||
},
|
||||
pursuit: {
|
||||
inherit: true,
|
||||
beforeTurnCallback(pokemon, target) {
|
||||
if (['frz', 'slp'].includes(pokemon.status) ||
|
||||
(pokemon.hasAbility('truant') && pokemon.truantTurn)) return;
|
||||
if (pokemon.isAlly(target)) return;
|
||||
target.addVolatile('pursuit');
|
||||
const data = target.volatiles['pursuit'];
|
||||
if (!data.sources) {
|
||||
data.sources = [];
|
||||
}
|
||||
data.sources.push(pokemon);
|
||||
},
|
||||
},
|
||||
recover: {
|
||||
inherit: true,
|
||||
pp: 20,
|
||||
|
|
|
|||
|
|
@ -4356,6 +4356,7 @@ export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTab
|
|||
toxic: ["3M"],
|
||||
uproar: ["3E"],
|
||||
waterpulse: ["3M"],
|
||||
wish: ["3E"],
|
||||
},
|
||||
},
|
||||
delcatty: {
|
||||
|
|
@ -4813,6 +4814,7 @@ export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTab
|
|||
thunderbolt: ["3M"],
|
||||
thunderwave: ["3L4"],
|
||||
toxic: ["3M"],
|
||||
wish: ["3E"],
|
||||
},
|
||||
},
|
||||
minun: {
|
||||
|
|
@ -4846,6 +4848,7 @@ export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTab
|
|||
thunderbolt: ["3M"],
|
||||
thunderwave: ["3L4"],
|
||||
toxic: ["3M"],
|
||||
wish: ["3E"],
|
||||
},
|
||||
},
|
||||
volbeat: {
|
||||
|
|
@ -5462,6 +5465,7 @@ export const Learnsets: import('../../../sim/dex-species').ModdedLearnsetDataTab
|
|||
trick: ["3E"],
|
||||
uproar: ["3L5"],
|
||||
waterpulse: ["3M"],
|
||||
wish: ["3E"],
|
||||
},
|
||||
},
|
||||
trapinch: {
|
||||
|
|
|
|||
|
|
@ -1332,6 +1332,18 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = {
|
|||
},
|
||||
pursuit: {
|
||||
inherit: true,
|
||||
beforeTurnCallback(pokemon) {
|
||||
if (['frz', 'slp'].includes(pokemon.status) ||
|
||||
(pokemon.hasAbility('truant') && pokemon.volatiles['truant'])) return;
|
||||
for (const target of pokemon.foes()) {
|
||||
target.addVolatile('pursuit');
|
||||
const data = target.volatiles['pursuit'];
|
||||
if (!data.sources) {
|
||||
data.sources = [];
|
||||
}
|
||||
data.sources.push(pokemon);
|
||||
}
|
||||
},
|
||||
condition: {
|
||||
duration: 1,
|
||||
onBeforeSwitchOut(pokemon) {
|
||||
|
|
@ -1354,7 +1366,11 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = {
|
|||
}
|
||||
}
|
||||
}
|
||||
this.actions.runMove('pursuit', source, source.getLocOf(pokemon));
|
||||
const move = this.dex.getActiveMove('pursuit');
|
||||
source.moveUsed(move, pokemon.position);
|
||||
if (this.actions.useMove(move, source, { target: pokemon }) && source.getItem().isChoice) {
|
||||
source.addVolatile('choicelock');
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
|
|
@ -1538,19 +1554,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = {
|
|||
this.add('-activate', source, 'move: Mimic', move.name);
|
||||
},
|
||||
},
|
||||
skillswap: {
|
||||
inherit: true,
|
||||
onHit(target, source) {
|
||||
const targetAbility = target.ability;
|
||||
const sourceAbility = source.ability;
|
||||
if (targetAbility === sourceAbility || source.hasItem('griseousorb') || target.hasItem('griseousorb')) {
|
||||
return false;
|
||||
}
|
||||
this.add('-activate', source, 'move: Skill Swap');
|
||||
source.setAbility(targetAbility);
|
||||
target.setAbility(sourceAbility);
|
||||
},
|
||||
},
|
||||
sleeptalk: {
|
||||
inherit: true,
|
||||
onTryHit(pokemon) {
|
||||
|
|
|
|||
|
|
@ -55,10 +55,6 @@ export const Scripts: ModdedBattleScriptsData = {
|
|||
// Weather
|
||||
baseDamage = this.battle.runEvent('WeatherModifyDamage', pokemon, target, move, baseDamage);
|
||||
|
||||
if (this.battle.gen === 3 && move.category === 'Physical' && !Math.floor(baseDamage)) {
|
||||
baseDamage = 1;
|
||||
}
|
||||
|
||||
baseDamage += 2;
|
||||
|
||||
const isCrit = target.getMoveHitData(move).crit;
|
||||
|
|
|
|||
|
|
@ -794,19 +794,6 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = {
|
|||
inherit: true,
|
||||
flags: { protect: 1, reflectable: 1, mirror: 1, sound: 1, metronome: 1 },
|
||||
},
|
||||
skillswap: {
|
||||
inherit: true,
|
||||
onHit(target, source) {
|
||||
const targetAbility = target.ability;
|
||||
const sourceAbility = source.ability;
|
||||
if (targetAbility === sourceAbility) {
|
||||
return false;
|
||||
}
|
||||
this.add('-activate', source, 'move: Skill Swap', this.dex.abilities.get(targetAbility), this.dex.abilities.get(sourceAbility), `[of] ${target}`);
|
||||
source.setAbility(targetAbility);
|
||||
target.setAbility(sourceAbility);
|
||||
},
|
||||
},
|
||||
skullbash: {
|
||||
inherit: true,
|
||||
basePower: 100,
|
||||
|
|
|
|||
|
|
@ -1678,7 +1678,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
|
|||
doublesTier: "DUber",
|
||||
},
|
||||
jirachi: {
|
||||
tier: "OU",
|
||||
tier: "(OU)",
|
||||
doublesTier: "DUber",
|
||||
},
|
||||
deoxys: {
|
||||
|
|
|
|||
46
data/mods/gen6mixandmega/items.ts
Normal file
46
data/mods/gen6mixandmega/items.ts
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
export const Items: import('../../../sim/dex-items').ModdedItemDataTable = {
|
||||
blueorb: {
|
||||
inherit: true,
|
||||
onSwitchIn(pokemon) {
|
||||
if (pokemon.isActive && !pokemon.species.isPrimal && !pokemon.transformed) {
|
||||
// @ts-expect-error modded
|
||||
const species: Species = this.actions.getMixedSpecies(pokemon.m.originalSpecies, 'Kyogre-Primal', pokemon);
|
||||
if (pokemon.m.originalSpecies === 'Kyogre') {
|
||||
pokemon.formeChange(species, this.effect, true);
|
||||
} else {
|
||||
pokemon.formeChange(species, this.effect, true);
|
||||
pokemon.baseSpecies = species;
|
||||
this.add('-start', pokemon, 'Blue Orb', '[silent]');
|
||||
}
|
||||
}
|
||||
},
|
||||
onTakeItem: false,
|
||||
},
|
||||
redorb: {
|
||||
inherit: true,
|
||||
onSwitchIn(pokemon) {
|
||||
if (pokemon.isActive && !pokemon.species.isPrimal && !pokemon.transformed) {
|
||||
// @ts-expect-error modded
|
||||
const species: Species = this.actions.getMixedSpecies(pokemon.m.originalSpecies, 'Groudon-Primal', pokemon);
|
||||
if (pokemon.m.originalSpecies === 'Groudon') {
|
||||
pokemon.formeChange(species, this.effect, true);
|
||||
} else {
|
||||
pokemon.formeChange(species, this.effect, true);
|
||||
pokemon.baseSpecies = species;
|
||||
this.add('-start', pokemon, 'Red Orb', '[silent]');
|
||||
const apparentSpecies = pokemon.illusion ? pokemon.illusion.species.name : pokemon.m.originalSpecies;
|
||||
const oSpecies = this.dex.species.get(apparentSpecies);
|
||||
if (pokemon.illusion) {
|
||||
const types = oSpecies.types;
|
||||
if (types.length > 1 || types[types.length - 1] !== 'Fire') {
|
||||
this.add('-start', pokemon, 'typechange', (types[0] !== 'Fire' ? types[0] + '/' : '') + 'Fire', '[silent]');
|
||||
}
|
||||
} else if (oSpecies.types.length !== pokemon.species.types.length || oSpecies.types[1] !== pokemon.species.types[1]) {
|
||||
this.add('-start', pokemon, 'typechange', pokemon.species.types.join('/'), '[silent]');
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
onTakeItem: false,
|
||||
},
|
||||
};
|
||||
117
data/mods/gen6mixandmega/scripts.ts
Normal file
117
data/mods/gen6mixandmega/scripts.ts
Normal file
|
|
@ -0,0 +1,117 @@
|
|||
export const Scripts: ModdedBattleScriptsData = {
|
||||
gen: 6,
|
||||
inherit: 'gen6',
|
||||
init() {
|
||||
for (const i in this.data.Items) {
|
||||
if (!this.data.Items[i].megaStone) continue;
|
||||
this.modData('Items', i).onTakeItem = false;
|
||||
}
|
||||
},
|
||||
actions: {
|
||||
canMegaEvo(pokemon) {
|
||||
if (pokemon.species.isMega || pokemon.species.isPrimal) return null;
|
||||
|
||||
const item = pokemon.getItem();
|
||||
if (item.megaStone) {
|
||||
const values = Object.values(item.megaStone);
|
||||
if (values.includes(pokemon.name)) return null;
|
||||
return values[0];
|
||||
} else if (pokemon.baseMoves.includes('dragonascent')) {
|
||||
return 'Rayquaza-Mega';
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
},
|
||||
runMegaEvo(pokemon) {
|
||||
if (pokemon.species.isMega || pokemon.species.isPrimal) return false;
|
||||
|
||||
const species: Species = (this as any).getMixedSpecies(pokemon.m.originalSpecies, pokemon.canMegaEvo, pokemon);
|
||||
|
||||
// Do we have a proper sprite for it? Code for when megas actually exist
|
||||
if (this.dex.species.get(pokemon.canMegaEvo as any).baseSpecies === pokemon.m.originalSpecies) {
|
||||
pokemon.formeChange(species, pokemon.getItem(), true);
|
||||
} else {
|
||||
const oSpecies = this.dex.species.get(pokemon.m.originalSpecies);
|
||||
const oMegaSpecies = this.dex.species.get((species as any).originalSpecies);
|
||||
pokemon.formeChange(species, pokemon.getItem(), true);
|
||||
this.battle.add('-start', pokemon, oMegaSpecies.requiredItem, '[silent]');
|
||||
if (oSpecies.types.join('/') !== pokemon.species.types.join('/')) {
|
||||
this.battle.add('-start', pokemon, 'typechange', pokemon.species.types.join('/'), '[silent]');
|
||||
}
|
||||
}
|
||||
|
||||
pokemon.canMegaEvo = false;
|
||||
return true;
|
||||
},
|
||||
getMixedSpecies(originalForme, formeChange, pokemon) {
|
||||
const originalSpecies = this.dex.species.get(originalForme);
|
||||
const formeChangeSpecies = this.dex.species.get(formeChange);
|
||||
if (originalSpecies.baseSpecies === formeChangeSpecies.baseSpecies) {
|
||||
return formeChangeSpecies;
|
||||
}
|
||||
const deltas = (this as any).getFormeChangeDeltas(formeChangeSpecies, pokemon);
|
||||
const species = (this as any).mutateOriginalSpecies(originalSpecies, deltas);
|
||||
return species;
|
||||
},
|
||||
getFormeChangeDeltas(formeChangeSpecies, pokemon) {
|
||||
// Should be fine as long as Necrozma-U doesn't get added or Game Freak makes me sad with some convoluted forme change
|
||||
const baseSpecies = this.dex.species.get(formeChangeSpecies.isMega ?
|
||||
formeChangeSpecies.battleOnly as string : formeChangeSpecies.baseSpecies);
|
||||
const deltas: {
|
||||
ability: string,
|
||||
baseStats: SparseStatsTable,
|
||||
weighthg: number,
|
||||
heightm: number,
|
||||
originalSpecies: string,
|
||||
requiredItem: string | undefined,
|
||||
type?: string,
|
||||
formeType?: string,
|
||||
isMega?: boolean,
|
||||
} = {
|
||||
ability: formeChangeSpecies.abilities['0'],
|
||||
baseStats: {},
|
||||
weighthg: formeChangeSpecies.weighthg - baseSpecies.weighthg,
|
||||
heightm: ((formeChangeSpecies.heightm * 10) - (baseSpecies.heightm * 10)) / 10,
|
||||
originalSpecies: formeChangeSpecies.name,
|
||||
requiredItem: formeChangeSpecies.requiredItem,
|
||||
};
|
||||
let statId: StatID;
|
||||
for (statId in formeChangeSpecies.baseStats) {
|
||||
deltas.baseStats[statId] = formeChangeSpecies.baseStats[statId] - baseSpecies.baseStats[statId];
|
||||
}
|
||||
let formeType: string | null = null;
|
||||
if (formeChangeSpecies.types.length > baseSpecies.types.length) {
|
||||
deltas.type = formeChangeSpecies.types[1];
|
||||
} else if (formeChangeSpecies.types.length < baseSpecies.types.length) {
|
||||
deltas.type = baseSpecies.types[0];
|
||||
} else if (formeChangeSpecies.types[1] !== baseSpecies.types[1]) {
|
||||
deltas.type = formeChangeSpecies.types[1];
|
||||
}
|
||||
if (formeChangeSpecies.isMega && !formeType) formeType = 'Mega';
|
||||
if (formeChangeSpecies.isPrimal) formeType = 'Primal';
|
||||
if (formeType) deltas.formeType = formeType;
|
||||
return deltas;
|
||||
},
|
||||
mutateOriginalSpecies(speciesOrForme, deltas) {
|
||||
if (!deltas) throw new TypeError("Must specify deltas!");
|
||||
const species = this.dex.deepClone(this.dex.species.get(speciesOrForme));
|
||||
species.abilities = { '0': deltas.ability };
|
||||
if (species.types[0] === deltas.type) {
|
||||
species.types = [deltas.type];
|
||||
} else if (deltas.type) {
|
||||
species.types = [species.types[0], deltas.type];
|
||||
}
|
||||
const baseStats = species.baseStats;
|
||||
for (const statName in baseStats) {
|
||||
baseStats[statName] = this.battle.clampIntRange(baseStats[statName] + deltas.baseStats[statName], 1, 255);
|
||||
}
|
||||
species.weighthg = Math.max(1, species.weighthg + deltas.weighthg);
|
||||
species.heightm = Math.max(0.1, ((species.heightm * 10) + (deltas.heightm * 10)) / 10);
|
||||
species.originalSpecies = deltas.originalSpecies;
|
||||
species.requiredItem = deltas.requiredItem;
|
||||
if (deltas.formeType === 'Mega' || deltas.isMega) species.isMega = true;
|
||||
if (deltas.formeType === 'Primal') species.isPrimal = true;
|
||||
return species;
|
||||
},
|
||||
},
|
||||
};
|
||||
|
|
@ -592,7 +592,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
|
|||
doublesTier: "NFE",
|
||||
},
|
||||
tangrowth: {
|
||||
tier: "OU",
|
||||
tier: "(OU)",
|
||||
doublesTier: "(DUU)",
|
||||
},
|
||||
kangaskhan: {
|
||||
|
|
|
|||
46
data/mods/gen7mixandmega/items.ts
Normal file
46
data/mods/gen7mixandmega/items.ts
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
export const Items: import('../../../sim/dex-items').ModdedItemDataTable = {
|
||||
blueorb: {
|
||||
inherit: true,
|
||||
onSwitchIn(pokemon) {
|
||||
if (pokemon.isActive && !pokemon.species.isPrimal && !pokemon.transformed) {
|
||||
// @ts-expect-error modded
|
||||
const species: Species = this.actions.getMixedSpecies(pokemon.m.originalSpecies, 'Kyogre-Primal', pokemon);
|
||||
if (pokemon.m.originalSpecies === 'Kyogre') {
|
||||
pokemon.formeChange(species, this.effect, true);
|
||||
} else {
|
||||
pokemon.formeChange(species, this.effect, true);
|
||||
pokemon.baseSpecies = species;
|
||||
this.add('-start', pokemon, 'Blue Orb', '[silent]');
|
||||
}
|
||||
}
|
||||
},
|
||||
onTakeItem: false,
|
||||
},
|
||||
redorb: {
|
||||
inherit: true,
|
||||
onSwitchIn(pokemon) {
|
||||
if (pokemon.isActive && !pokemon.species.isPrimal && !pokemon.transformed) {
|
||||
// @ts-expect-error modded
|
||||
const species: Species = this.actions.getMixedSpecies(pokemon.m.originalSpecies, 'Groudon-Primal', pokemon);
|
||||
if (pokemon.m.originalSpecies === 'Groudon') {
|
||||
pokemon.formeChange(species, this.effect, true);
|
||||
} else {
|
||||
pokemon.formeChange(species, this.effect, true);
|
||||
pokemon.baseSpecies = species;
|
||||
this.add('-start', pokemon, 'Red Orb', '[silent]');
|
||||
const apparentSpecies = pokemon.illusion ? pokemon.illusion.species.name : pokemon.m.originalSpecies;
|
||||
const oSpecies = this.dex.species.get(apparentSpecies);
|
||||
if (pokemon.illusion) {
|
||||
const types = oSpecies.types;
|
||||
if (types.length > 1 || types[types.length - 1] !== 'Fire') {
|
||||
this.add('-start', pokemon, 'typechange', (types[0] !== 'Fire' ? types[0] + '/' : '') + 'Fire', '[silent]');
|
||||
}
|
||||
} else if (oSpecies.types.length !== pokemon.species.types.length || oSpecies.types[1] !== pokemon.species.types[1]) {
|
||||
this.add('-start', pokemon, 'typechange', pokemon.species.types.join('/'), '[silent]');
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
onTakeItem: false,
|
||||
},
|
||||
};
|
||||
121
data/mods/gen7mixandmega/scripts.ts
Normal file
121
data/mods/gen7mixandmega/scripts.ts
Normal file
|
|
@ -0,0 +1,121 @@
|
|||
export const Scripts: ModdedBattleScriptsData = {
|
||||
gen: 7,
|
||||
inherit: 'gen7',
|
||||
init() {
|
||||
for (const i in this.data.Items) {
|
||||
if (!this.data.Items[i].megaStone) continue;
|
||||
this.modData('Items', i).onTakeItem = false;
|
||||
}
|
||||
},
|
||||
actions: {
|
||||
canMegaEvo(pokemon) {
|
||||
if (pokemon.species.isMega || pokemon.species.isPrimal) return null;
|
||||
|
||||
const item = pokemon.getItem();
|
||||
if (item.megaStone) {
|
||||
const values = Object.values(item.megaStone);
|
||||
if (values.includes(pokemon.name)) return null;
|
||||
return values[0];
|
||||
} else if (pokemon.baseMoves.includes('dragonascent')) {
|
||||
return 'Rayquaza-Mega';
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
},
|
||||
runMegaEvo(pokemon) {
|
||||
if (pokemon.species.isMega || pokemon.species.isPrimal) return false;
|
||||
|
||||
const isUltraBurst = !pokemon.canMegaEvo;
|
||||
|
||||
const species: Species = (this as any).getMixedSpecies(pokemon.m.originalSpecies,
|
||||
pokemon.canMegaEvo || pokemon.canUltraBurst, pokemon);
|
||||
|
||||
// Do we have a proper sprite for it? Code for when megas actually exist
|
||||
if (isUltraBurst || this.dex.species.get(pokemon.canMegaEvo as any).baseSpecies === pokemon.m.originalSpecies) {
|
||||
pokemon.formeChange(species, pokemon.getItem(), true);
|
||||
} else {
|
||||
const oSpecies = this.dex.species.get(pokemon.m.originalSpecies);
|
||||
const oMegaSpecies = this.dex.species.get((species as any).originalSpecies);
|
||||
pokemon.formeChange(species, pokemon.getItem(), true);
|
||||
this.battle.add('-start', pokemon, oMegaSpecies.requiredItem, '[silent]');
|
||||
if (oSpecies.types.join('/') !== pokemon.species.types.join('/')) {
|
||||
this.battle.add('-start', pokemon, 'typechange', pokemon.species.types.join('/'), '[silent]');
|
||||
}
|
||||
}
|
||||
|
||||
pokemon.canMegaEvo = false;
|
||||
if (isUltraBurst) pokemon.canUltraBurst = null;
|
||||
return true;
|
||||
},
|
||||
getMixedSpecies(originalForme, formeChange, pokemon) {
|
||||
const originalSpecies = this.dex.species.get(originalForme);
|
||||
const formeChangeSpecies = this.dex.species.get(formeChange);
|
||||
if (originalSpecies.baseSpecies === formeChangeSpecies.baseSpecies) {
|
||||
return formeChangeSpecies;
|
||||
}
|
||||
const deltas = (this as any).getFormeChangeDeltas(formeChangeSpecies, pokemon);
|
||||
const species = (this as any).mutateOriginalSpecies(originalSpecies, deltas);
|
||||
return species;
|
||||
},
|
||||
getFormeChangeDeltas(formeChangeSpecies, pokemon) {
|
||||
// Should be fine as long as Necrozma-U doesn't get added or Game Freak makes me sad with some convoluted forme change
|
||||
const baseSpecies = this.dex.species.get(formeChangeSpecies.isMega ?
|
||||
formeChangeSpecies.battleOnly as string : formeChangeSpecies.baseSpecies);
|
||||
const deltas: {
|
||||
ability: string,
|
||||
baseStats: SparseStatsTable,
|
||||
weighthg: number,
|
||||
heightm: number,
|
||||
originalSpecies: string,
|
||||
requiredItem: string | undefined,
|
||||
type?: string,
|
||||
formeType?: string,
|
||||
isMega?: boolean,
|
||||
} = {
|
||||
ability: formeChangeSpecies.abilities['0'],
|
||||
baseStats: {},
|
||||
weighthg: formeChangeSpecies.weighthg - baseSpecies.weighthg,
|
||||
heightm: ((formeChangeSpecies.heightm * 10) - (baseSpecies.heightm * 10)) / 10,
|
||||
originalSpecies: formeChangeSpecies.name,
|
||||
requiredItem: formeChangeSpecies.requiredItem,
|
||||
};
|
||||
let statId: StatID;
|
||||
for (statId in formeChangeSpecies.baseStats) {
|
||||
deltas.baseStats[statId] = formeChangeSpecies.baseStats[statId] - baseSpecies.baseStats[statId];
|
||||
}
|
||||
let formeType: string | null = null;
|
||||
if (formeChangeSpecies.types.length > baseSpecies.types.length) {
|
||||
deltas.type = formeChangeSpecies.types[1];
|
||||
} else if (formeChangeSpecies.types.length < baseSpecies.types.length) {
|
||||
deltas.type = baseSpecies.types[0];
|
||||
} else if (formeChangeSpecies.types[1] !== baseSpecies.types[1]) {
|
||||
deltas.type = formeChangeSpecies.types[1];
|
||||
}
|
||||
if (formeChangeSpecies.isMega && !formeType) formeType = 'Mega';
|
||||
if (formeChangeSpecies.isPrimal) formeType = 'Primal';
|
||||
if (formeType) deltas.formeType = formeType;
|
||||
return deltas;
|
||||
},
|
||||
mutateOriginalSpecies(speciesOrForme, deltas) {
|
||||
if (!deltas) throw new TypeError("Must specify deltas!");
|
||||
const species = this.dex.deepClone(this.dex.species.get(speciesOrForme));
|
||||
species.abilities = { '0': deltas.ability };
|
||||
if (species.types[0] === deltas.type) {
|
||||
species.types = [deltas.type];
|
||||
} else if (deltas.type) {
|
||||
species.types = [species.types[0], deltas.type];
|
||||
}
|
||||
const baseStats = species.baseStats;
|
||||
for (const statName in baseStats) {
|
||||
baseStats[statName] = this.battle.clampIntRange(baseStats[statName] + deltas.baseStats[statName], 1, 255);
|
||||
}
|
||||
species.weighthg = Math.max(1, species.weighthg + deltas.weighthg);
|
||||
species.heightm = Math.max(0.1, ((species.heightm * 10) + (deltas.heightm * 10)) / 10);
|
||||
species.originalSpecies = deltas.originalSpecies;
|
||||
species.requiredItem = deltas.requiredItem;
|
||||
if (deltas.formeType === 'Mega' || deltas.isMega) species.isMega = true;
|
||||
if (deltas.formeType === 'Primal') species.isPrimal = true;
|
||||
return species;
|
||||
},
|
||||
},
|
||||
};
|
||||
|
|
@ -2922,7 +2922,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
|
|||
isNonstandard: "Past",
|
||||
},
|
||||
victini: {
|
||||
tier: "OU",
|
||||
tier: "(OU)",
|
||||
doublesTier: "DUU",
|
||||
natDexTier: "OU",
|
||||
},
|
||||
|
|
|
|||
|
|
@ -92,10 +92,10 @@ export const Rulesets: import('../../../sim/dex-formats').ModdedFormatDataTable
|
|||
if (["Zacian", "Zamazenta"].includes(species.baseSpecies) && this.toID(set.item).startsWith('rusted')) {
|
||||
species = this.dex.species.get(set.species + "-Crowned");
|
||||
}
|
||||
if (set.item && this.dex.items.get(set.item).megaStone) {
|
||||
if (set.item) {
|
||||
const item = this.dex.items.get(set.item);
|
||||
if (item.megaEvolves === species.baseSpecies) {
|
||||
species = this.dex.species.get(Array.isArray(item.megaStone) ? item.megaStone[0] : item.megaStone);
|
||||
if (item.megaStone?.[species.baseSpecies]) {
|
||||
species = this.dex.species.get(item.megaStone[species.baseSpecies]);
|
||||
}
|
||||
}
|
||||
if (
|
||||
|
|
@ -123,8 +123,8 @@ export const Rulesets: import('../../../sim/dex-formats').ModdedFormatDataTable
|
|||
}
|
||||
if (set.item) {
|
||||
const item = this.dex.items.get(set.item);
|
||||
if (item.megaEvolves === set.species) {
|
||||
godSpecies = this.dex.species.get(Array.isArray(item.megaStone) ? item.megaStone[0] : item.megaStone);
|
||||
if (item.megaStone?.[set.species]) {
|
||||
godSpecies = this.dex.species.get(item.megaStone[set.species]);
|
||||
}
|
||||
if (["Zacian", "Zamazenta"].includes(godSpecies.baseSpecies) && item.id.startsWith('rusted')) {
|
||||
godSpecies = this.dex.species.get(set.species + "-Crowned");
|
||||
|
|
|
|||
115
data/mods/gen8mixandmega/scripts.ts
Normal file
115
data/mods/gen8mixandmega/scripts.ts
Normal file
|
|
@ -0,0 +1,115 @@
|
|||
export const Scripts: ModdedBattleScriptsData = {
|
||||
gen: 8,
|
||||
inherit: 'gen8',
|
||||
init() {
|
||||
for (const i in this.data.Items) {
|
||||
const item = this.data.Items[i];
|
||||
if (!item.megaStone || item.isNonstandard !== 'Past') continue;
|
||||
this.modData('Items', i).onTakeItem = false;
|
||||
this.modData('Items', i).isNonstandard = null;
|
||||
if (item.megaStone) {
|
||||
for (const megaEvo of Object.values(item.megaStone)) {
|
||||
this.modData('FormatsData', this.toID(megaEvo)).isNonstandard = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
actions: {
|
||||
canMegaEvo(pokemon) {
|
||||
if (pokemon.species.isMega) return null;
|
||||
|
||||
const item = pokemon.getItem();
|
||||
if (!item.megaStone) return null;
|
||||
return Object.values(item.megaStone)[0];
|
||||
},
|
||||
runMegaEvo(pokemon) {
|
||||
if (pokemon.species.isMega) return false;
|
||||
|
||||
const species: Species = (this as any).getMixedSpecies(pokemon.m.originalSpecies, pokemon.canMegaEvo, pokemon);
|
||||
|
||||
/* Do we have a proper sprite for it? Code for when megas actually exist
|
||||
if (this.dex.species.get(pokemon.canMegaEvo!).baseSpecies === pokemon.m.originalSpecies) {
|
||||
pokemon.formeChange(species, pokemon.getItem(), true);
|
||||
} else { */
|
||||
const oSpecies = this.dex.species.get(pokemon.m.originalSpecies);
|
||||
const oMegaSpecies = this.dex.species.get((species as any).originalSpecies);
|
||||
pokemon.formeChange(species, pokemon.getItem(), true);
|
||||
this.battle.add('-start', pokemon, oMegaSpecies.requiredItem, '[silent]');
|
||||
if (oSpecies.types.join('/') !== pokemon.species.types.join('/')) {
|
||||
this.battle.add('-start', pokemon, 'typechange', pokemon.species.types.join('/'), '[silent]');
|
||||
}
|
||||
// }
|
||||
|
||||
pokemon.canMegaEvo = false;
|
||||
return true;
|
||||
},
|
||||
getMixedSpecies(originalForme, formeChange, pokemon) {
|
||||
const originalSpecies = this.dex.species.get(originalForme);
|
||||
const formeChangeSpecies = this.dex.species.get(formeChange);
|
||||
const deltas = (this as any).getFormeChangeDeltas(formeChangeSpecies, pokemon);
|
||||
const species = (this as any).mutateOriginalSpecies(originalSpecies, deltas);
|
||||
return species;
|
||||
},
|
||||
getFormeChangeDeltas(formeChangeSpecies, pokemon) {
|
||||
// Should be fine as long as Necrozma-U doesn't get added or Game Freak makes me sad with some convoluted forme change
|
||||
let baseSpecies = this.dex.species.get(formeChangeSpecies.isMega ?
|
||||
formeChangeSpecies.battleOnly as string : formeChangeSpecies.baseSpecies);
|
||||
if (formeChangeSpecies.name === 'Zygarde-Mega') {
|
||||
baseSpecies = this.dex.species.get('Zygarde-Complete');
|
||||
}
|
||||
const deltas: {
|
||||
ability: string,
|
||||
baseStats: SparseStatsTable,
|
||||
weighthg: number,
|
||||
heightm: number,
|
||||
originalSpecies: string,
|
||||
requiredItem: string | undefined,
|
||||
type?: string,
|
||||
formeType?: string,
|
||||
isMega?: boolean,
|
||||
} = {
|
||||
ability: formeChangeSpecies.abilities['0'],
|
||||
baseStats: {},
|
||||
weighthg: formeChangeSpecies.weighthg - baseSpecies.weighthg,
|
||||
heightm: ((formeChangeSpecies.heightm * 10) - (baseSpecies.heightm * 10)) / 10,
|
||||
originalSpecies: formeChangeSpecies.name,
|
||||
requiredItem: formeChangeSpecies.requiredItem,
|
||||
};
|
||||
let statId: StatID;
|
||||
for (statId in formeChangeSpecies.baseStats) {
|
||||
deltas.baseStats[statId] = formeChangeSpecies.baseStats[statId] - baseSpecies.baseStats[statId];
|
||||
}
|
||||
if (formeChangeSpecies.types.length > baseSpecies.types.length) {
|
||||
deltas.type = formeChangeSpecies.types[1];
|
||||
} else if (formeChangeSpecies.types.length < baseSpecies.types.length) {
|
||||
deltas.type = 'mono';
|
||||
} else if (formeChangeSpecies.types[1] !== baseSpecies.types[1]) {
|
||||
deltas.type = formeChangeSpecies.types[1];
|
||||
}
|
||||
deltas.isMega = true;
|
||||
return deltas;
|
||||
},
|
||||
mutateOriginalSpecies(speciesOrForme, deltas) {
|
||||
if (!deltas) throw new TypeError("Must specify deltas!");
|
||||
const species = this.dex.deepClone(this.dex.species.get(speciesOrForme));
|
||||
species.abilities = { '0': deltas.ability };
|
||||
if (species.types[0] === deltas.type) {
|
||||
species.types = [deltas.type];
|
||||
} else if (deltas.type === 'mono') {
|
||||
species.types = [species.types[0]];
|
||||
} else if (deltas.type) {
|
||||
species.types = [species.types[0], deltas.type];
|
||||
}
|
||||
const baseStats = species.baseStats;
|
||||
for (const statName in baseStats) {
|
||||
baseStats[statName] = this.battle.clampIntRange(baseStats[statName] + deltas.baseStats[statName], 1, 255);
|
||||
}
|
||||
species.weighthg = Math.max(1, species.weighthg + deltas.weighthg);
|
||||
species.heightm = Math.max(0.1, ((species.heightm * 10) + (deltas.heightm * 10)) / 10);
|
||||
species.originalSpecies = deltas.originalSpecies;
|
||||
species.requiredItem = deltas.requiredItem;
|
||||
if (deltas.isMega) species.isMega = true;
|
||||
return species;
|
||||
},
|
||||
},
|
||||
};
|
||||
|
|
@ -2,15 +2,15 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = {
|
|||
slowbronite: {
|
||||
inherit: true,
|
||||
onTakeItem(item, source) {
|
||||
if (item.megaEvolves === source.baseSpecies.name || item.megaStone === source.baseSpecies.name) return false;
|
||||
return true;
|
||||
return !item.megaStone || (!item.megaStone[source.baseSpecies.name] &&
|
||||
!Object.values(item.megaStone).includes(source.baseSpecies.name));
|
||||
},
|
||||
},
|
||||
greninjite: {
|
||||
inherit: true,
|
||||
onTakeItem(item, source) {
|
||||
if (item.megaEvolves === source.baseSpecies.name || item.megaStone === source.baseSpecies.name) return false;
|
||||
return true;
|
||||
return !item.megaStone || (!item.megaStone[source.baseSpecies.name] &&
|
||||
!Object.values(item.megaStone).includes(source.baseSpecies.name));
|
||||
},
|
||||
},
|
||||
zygardite: {
|
||||
|
|
|
|||
|
|
@ -57,23 +57,8 @@ export const Scripts: ModdedBattleScriptsData = {
|
|||
pokemon.baseMoves.includes(this.battle.toID(altForme.requiredMove)) && !item.zMove) {
|
||||
return altForme.name;
|
||||
}
|
||||
if (Array.isArray(item.megaEvolves)) {
|
||||
if (!Array.isArray(item.megaStone)) {
|
||||
throw new Error(`${item.name}#megaEvolves and ${item.name}#megaStone type mismatch`);
|
||||
}
|
||||
if (item.megaEvolves.length !== item.megaStone.length) {
|
||||
throw new Error(`${item.name}#megaEvolves and ${item.name}#megaStone length mismatch`);
|
||||
}
|
||||
const index = item.megaEvolves.indexOf(species.name);
|
||||
if (index < 0) return null;
|
||||
return item.megaStone[index];
|
||||
} else {
|
||||
if (item.megaEvolves === species.name) {
|
||||
if (Array.isArray(item.megaStone)) throw new Error(`${item.name}#megaEvolves and ${item.name}#megaStone type mismatch`);
|
||||
return item.megaStone;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
if (!item.megaStone) return null;
|
||||
return item.megaStone[species.name];
|
||||
},
|
||||
runMegaEvo(pokemon) {
|
||||
const speciesid = pokemon.canMegaEvo || pokemon.canUltraBurst;
|
||||
|
|
|
|||
|
|
@ -14,11 +14,9 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = {
|
|||
name: "Flygonite",
|
||||
spritenum: 111,
|
||||
itemUser: ["Flygon"],
|
||||
megaEvolves: "Flygon",
|
||||
megaStone: "Trapinch",
|
||||
megaStone: { "Flygon": "Trapinch" },
|
||||
onTakeItem(item, source) {
|
||||
if (item.megaEvolves === source.baseSpecies.baseSpecies) return false;
|
||||
return true;
|
||||
return !item.megaStone?.[source.baseSpecies.baseSpecies];
|
||||
},
|
||||
desc: "If held by a Flygon, this item allows it to Mega Evolve in battle.",
|
||||
},
|
||||
|
|
@ -36,7 +34,7 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = {
|
|||
gardevoirite: {
|
||||
inherit: true,
|
||||
itemUser: ["Ralts"],
|
||||
megaEvolves: "Ralts",
|
||||
megaStone: { "Ralts": "Gardevoir-Mega" },
|
||||
desc: "If held by a Ralts, this item allows it to Mega Evolve in battle.",
|
||||
},
|
||||
// Peary
|
||||
|
|
|
|||
|
|
@ -963,26 +963,11 @@ export const Scripts: ModdedBattleScriptsData = {
|
|||
pokemon.baseMoves.includes(this.battle.toID(altForme.requiredMove)) && !item.zMove) {
|
||||
return altForme.name;
|
||||
}
|
||||
if (!item.megaStone) return null;
|
||||
// a hacked-in Megazard X can mega evolve into Megazard Y, but not into Megazard X
|
||||
if (Array.isArray(item.megaEvolves)) {
|
||||
if (!Array.isArray(item.megaStone)) {
|
||||
throw new Error(`${item.name}#megaEvolves and ${item.name}#megaStone type mismatch`);
|
||||
}
|
||||
if (item.megaEvolves.length !== item.megaStone.length) {
|
||||
throw new Error(`${item.name}#megaEvolves and ${item.name}#megaStone length mismatch`);
|
||||
}
|
||||
// FIXME: Change to species.name when champions comes
|
||||
const index = item.megaEvolves.indexOf(species.baseSpecies);
|
||||
if (index < 0) return null;
|
||||
return item.megaStone[index];
|
||||
// FIXME: Change to species.name when champions comes
|
||||
} else {
|
||||
if (item.megaEvolves === species.baseSpecies) {
|
||||
if (Array.isArray(item.megaStone)) throw new Error(`${item.name}#megaEvolves and ${item.name}#megaStone type mismatch`);
|
||||
return item.megaStone;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
// FIXME: Change to species.name when champions comes
|
||||
const megaEvolution = item.megaStone[species.baseSpecies];
|
||||
return megaEvolution && megaEvolution !== species.name ? megaEvolution : null;
|
||||
},
|
||||
|
||||
// 1 Z per pokemon
|
||||
|
|
|
|||
|
|
@ -6,9 +6,11 @@ export const Scripts: ModdedBattleScriptsData = {
|
|||
if (!item.megaStone && !item.onDrive && !(item.onPlate && !item.zMove) && !item.onMemory) continue;
|
||||
this.modData('Items', i).onTakeItem = false;
|
||||
if (item.isNonstandard === "Past" || item.isNonstandard === "Future") this.modData('Items', i).isNonstandard = null;
|
||||
/* if (item.megaStone) {
|
||||
this.modData('FormatsData', this.toID(item.megaStone)).isNonstandard = null;
|
||||
} */
|
||||
if (item.megaStone) {
|
||||
for (const megaEvo of Object.values(item.megaStone)) {
|
||||
this.modData('FormatsData', this.toID(megaEvo)).isNonstandard = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
start() {
|
||||
|
|
@ -385,12 +387,8 @@ export const Scripts: ModdedBattleScriptsData = {
|
|||
if (pokemon.species.isMega) return null;
|
||||
|
||||
const item = pokemon.getItem();
|
||||
if (item.megaStone) {
|
||||
if (item.megaStone.includes(pokemon.baseSpecies.name)) return null;
|
||||
return Array.isArray(item.megaStone) ? item.megaStone[0] : item.megaStone;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
if (!item.megaStone) return null;
|
||||
return Object.values(item.megaStone)[0];
|
||||
},
|
||||
runMegaEvo(pokemon) {
|
||||
if (pokemon.species.isMega) return false;
|
||||
|
|
|
|||
|
|
@ -1,135 +0,0 @@
|
|||
export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTable = {
|
||||
mythicalpresence: {
|
||||
name: "Mythical Presence",
|
||||
shortDesc: "Lowers opposing Pokemon Special Attack by 1 stage when switching in.",
|
||||
onStart(pokemon) {
|
||||
let activated = false;
|
||||
for (const target of pokemon.adjacentFoes()) {
|
||||
if (!activated) {
|
||||
this.add('-ability', pokemon, 'Mythical Presence', 'boost');
|
||||
activated = true;
|
||||
}
|
||||
if (target.volatiles['substitute']) {
|
||||
this.add('-immune', target);
|
||||
} else {
|
||||
this.boost({ spa: -1 }, target, pokemon, null, true);
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
powerconstruct: {
|
||||
onResidualOrder: 27,
|
||||
onResidual(pokemon) {
|
||||
if (pokemon.baseSpecies.baseSpecies !== 'Flocura' || pokemon.transformed || !pokemon.hp) return;
|
||||
if (pokemon.species.id === 'flocuranexus' || pokemon.hp > pokemon.maxhp / 2) return;
|
||||
this.add('-activate', pokemon, 'ability: Power Construct');
|
||||
pokemon.formeChange('Flocura-Nexus', this.effect, true);
|
||||
pokemon.baseMaxhp = Math.floor(Math.floor(
|
||||
2 * pokemon.species.baseStats['hp'] + pokemon.set.ivs['hp'] + Math.floor(pokemon.set.evs['hp'] / 4) + 100
|
||||
) * pokemon.level / 100 + 10);
|
||||
const newMaxHP = pokemon.volatiles['dynamax'] ? (2 * pokemon.baseMaxhp) : pokemon.baseMaxhp;
|
||||
pokemon.hp = newMaxHP - (pokemon.maxhp - pokemon.hp);
|
||||
pokemon.maxhp = newMaxHP;
|
||||
this.add('-heal', pokemon, pokemon.getHealth, '[silent]');
|
||||
},
|
||||
flags: { failroleplay: 1, noreceiver: 1, noentrain: 1, notrace: 1, failskillswap: 1, cantsuppress: 1 },
|
||||
name: "Power Construct",
|
||||
rating: 5,
|
||||
num: 211,
|
||||
},
|
||||
battlebond: {
|
||||
shortDesc: "Change to a stronger forme after getting a KO.",
|
||||
onSourceAfterFaint(length, target, source, effect) {
|
||||
if (effect?.effectType !== 'Move') {
|
||||
return;
|
||||
}
|
||||
if (source.species.id === 'soleron' && source.hp && !source.transformed && source.side.foe.pokemonLeft) {
|
||||
this.add('-activate', source, 'ability: Battle Bond');
|
||||
source.formeChange('Soleron-Awakened', this.effect, true);
|
||||
}
|
||||
},
|
||||
onModifyMovePriority: -1,
|
||||
flags: { failroleplay: 1, noreceiver: 1, noentrain: 1, notrace: 1, failskillswap: 1, cantsuppress: 1 },
|
||||
name: "Battle Bond",
|
||||
rating: 4,
|
||||
num: 210,
|
||||
},
|
||||
crystalheart: {
|
||||
shortDesc: "User becomes Crystal type. While Crystal type, 33% boost to Def and SpD",
|
||||
onStart(pokemon) {
|
||||
if (pokemon.hasType('Crystal')) return false;
|
||||
if (!pokemon.addType('Crystal')) return false;
|
||||
pokemon.setType(["Crystal"]);
|
||||
this.add('-start', pokemon, 'typechange', 'Crystal', '[from] ability: Crystal Heart');
|
||||
},
|
||||
onModifyDefPriority: 6,
|
||||
onModifyDef(def, pokemon) {
|
||||
if (pokemon.hasType('Crystal')) return this.chainModify(1 + (1 / 3));
|
||||
},
|
||||
onModifySpDPriority: 6,
|
||||
onModifySpD(spd, pokemon) {
|
||||
if (pokemon.hasType('Crystal')) return this.chainModify(1 + (1 / 3));
|
||||
},
|
||||
name: "Crystal Heart",
|
||||
},
|
||||
wildheart: {
|
||||
onStart(pokemon) {
|
||||
if (pokemon.hasType('Feral')) return false;
|
||||
if (!pokemon.addType('Feral')) return false;
|
||||
pokemon.setType(["Feral"]);
|
||||
this.add('-start', pokemon, 'typechange', "Feral", '[from] ability: Wild Heart');
|
||||
},
|
||||
onModifyAtkPriority: 6,
|
||||
onModifyAtk(atk, pokemon) {
|
||||
if (pokemon.hasType('Feral')) return this.chainModify(1 + (1 / 3));
|
||||
},
|
||||
onModifySpAPriority: 6,
|
||||
onModifySpA(spa, pokemon) {
|
||||
if (pokemon.hasType('Feral')) return this.chainModify(1 + (1 / 3));
|
||||
},
|
||||
name: "Wild Heart",
|
||||
shortDesc: "User becomes Feral type. While Feral type, 33% boost to Atk and SpA",
|
||||
},
|
||||
schooling: {
|
||||
onStart(pokemon) {
|
||||
if (pokemon.baseSpecies.baseSpecies !== 'Jaegorm' || pokemon.transformed) return;
|
||||
if (pokemon.hp > pokemon.maxhp / 4) {
|
||||
if (pokemon.species.id === 'jaegorm') {
|
||||
pokemon.formeChange('Jaegorm-Collective');
|
||||
}
|
||||
} else {
|
||||
if (pokemon.species.id === 'jaegormcollective') {
|
||||
pokemon.formeChange('Jaegorm');
|
||||
}
|
||||
}
|
||||
},
|
||||
onResidualOrder: 27,
|
||||
onResidual(pokemon) {
|
||||
if (
|
||||
pokemon.baseSpecies.baseSpecies !== 'Jaegorm' || pokemon.transformed || !pokemon.hp
|
||||
) return;
|
||||
if (pokemon.hp > pokemon.maxhp / 4) {
|
||||
if (pokemon.species.id === 'jaegorm') {
|
||||
pokemon.formeChange('Jaegorm-Collective');
|
||||
}
|
||||
} else {
|
||||
if (pokemon.species.id === 'jaegormcollective') {
|
||||
pokemon.formeChange('Jaegorm');
|
||||
}
|
||||
}
|
||||
},
|
||||
flags: { failroleplay: 1, noreceiver: 1, noentrain: 1, notrace: 1, failskillswap: 1, cantsuppress: 1 },
|
||||
name: "Schooling",
|
||||
shortDesc: "If user is Jaegorm, changes to Collective Form if it has > 1/4 max HP, else Solo Form.",
|
||||
rating: 3,
|
||||
num: 208,
|
||||
},
|
||||
shellbunker: {
|
||||
onDamage(damage, target, source, effect) {
|
||||
if (effect.effectType !== 'Move' || !target.hurtThisTurn) return damage;
|
||||
return damage / 2;
|
||||
},
|
||||
name: "Shell Bunker",
|
||||
shortDesc: "After taking damage, Def and SpD are doubled for the rest of the turn.",
|
||||
},
|
||||
};
|
||||
|
|
@ -1,67 +0,0 @@
|
|||
export const Conditions: import('../../../sim/dex-conditions').ModdedConditionDataTable = {
|
||||
frz: {
|
||||
name: 'frz',
|
||||
/*
|
||||
start: " [Pokemon] was chilled!",
|
||||
alreadyStarted: " [POKEMON] is already chilled!",
|
||||
end: " [POKEMON] warmed up!",
|
||||
endFromItem: " [POKEMON]'s [ITEM] warmed it up!",
|
||||
endFromMove: " [POKEMON]'s [MOVE] warmed it up!",
|
||||
cant: "[POKEMON] is chilled!",
|
||||
*/
|
||||
effectType: 'Status',
|
||||
onStart(target, source, sourceEffect) {
|
||||
if (sourceEffect && sourceEffect.effectType === 'Ability') {
|
||||
this.add('-status', target, 'frz', '[from] ability: ' + sourceEffect.name, `[of] ${source}`);
|
||||
} else {
|
||||
this.add('-status', target, 'frz');
|
||||
}
|
||||
},
|
||||
onResidualOrder: 9,
|
||||
onResidual(pokemon) {
|
||||
this.damage(pokemon.baseMaxhp / 16);
|
||||
},
|
||||
onModifySpA(spa, pokemon) {
|
||||
return this.chainModify(0.5);
|
||||
},
|
||||
},
|
||||
slp: {
|
||||
name: 'slp',
|
||||
effectType: 'Status',
|
||||
onStart(target, source, sourceEffect) {
|
||||
if (sourceEffect && sourceEffect.effectType === 'Ability') {
|
||||
this.add('-status', target, 'slp', '[from] ability: ' + sourceEffect.name, `[of] ${source}`);
|
||||
} else if (sourceEffect && sourceEffect.effectType === 'Move') {
|
||||
this.add('-status', target, 'slp', '[from] move: ' + sourceEffect.name);
|
||||
} else {
|
||||
this.add('-status', target, 'slp');
|
||||
}
|
||||
// 1-3 turns
|
||||
this.effectState.startTime = 3;
|
||||
const sleepMoves = ["sleeppowder", "spore", "grasswhistle", "darkvoid", "hypnosis"];
|
||||
if (sourceEffect && sourceEffect.effectType === 'Move') {
|
||||
if (sleepMoves.includes(sourceEffect.id)) this.effectState.startTime = 2;
|
||||
}
|
||||
this.effectState.time = this.effectState.startTime;
|
||||
},
|
||||
onBeforeMovePriority: 10,
|
||||
onBeforeMove(pokemon, target, move) {
|
||||
if (pokemon.hasAbility('earlybird')) {
|
||||
pokemon.statusState.time--;
|
||||
}
|
||||
pokemon.statusState.time--;
|
||||
if (pokemon.statusState.time <= 0) {
|
||||
pokemon.cureStatus();
|
||||
return;
|
||||
}
|
||||
this.add('cant', pokemon, 'slp');
|
||||
if (move.sleepUsable) {
|
||||
return;
|
||||
}
|
||||
return false;
|
||||
},
|
||||
onModifySpe(spe, pokemon) {
|
||||
return this.chainModify(0.5);
|
||||
},
|
||||
},
|
||||
};
|
||||
|
|
@ -1,218 +0,0 @@
|
|||
export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormatsDataTable = {
|
||||
arbrella: {
|
||||
tier: "OU",
|
||||
doublesTier: "DOU",
|
||||
},
|
||||
krachiten: {
|
||||
tier: "OU",
|
||||
doublesTier: "DOU",
|
||||
},
|
||||
scalaron: {
|
||||
tier: "OU",
|
||||
doublesTier: "DOU",
|
||||
},
|
||||
rantler: {
|
||||
tier: "OU",
|
||||
doublesTier: "DOU",
|
||||
},
|
||||
woolora: {
|
||||
tier: "OU",
|
||||
doublesTier: "DOU",
|
||||
},
|
||||
albatrygon: {
|
||||
tier: "OU",
|
||||
doublesTier: "DOU",
|
||||
},
|
||||
orchile: {
|
||||
tier: "OU",
|
||||
doublesTier: "DOU",
|
||||
},
|
||||
embuck: {
|
||||
tier: "OU",
|
||||
doublesTier: "DOU",
|
||||
},
|
||||
cindoe: {
|
||||
tier: "OU",
|
||||
doublesTier: "DOU",
|
||||
},
|
||||
cobracotta: {
|
||||
tier: "OU",
|
||||
doublesTier: "DOU",
|
||||
},
|
||||
minillow: {
|
||||
tier: "OU",
|
||||
doublesTier: "DOU",
|
||||
},
|
||||
crossont: {
|
||||
tier: "OU",
|
||||
doublesTier: "DOU",
|
||||
},
|
||||
torgeist: {
|
||||
tier: "OU",
|
||||
doublesTier: "DOU",
|
||||
},
|
||||
platypad: {
|
||||
tier: "OU",
|
||||
doublesTier: "DOU",
|
||||
},
|
||||
lumoth: {
|
||||
tier: "OU",
|
||||
doublesTier: "DOU",
|
||||
},
|
||||
aurorowl: {
|
||||
tier: "OU",
|
||||
doublesTier: "DOU",
|
||||
},
|
||||
carapex: {
|
||||
tier: "OU",
|
||||
doublesTier: "DOU",
|
||||
},
|
||||
dojodo: {
|
||||
tier: "OU",
|
||||
doublesTier: "DOU",
|
||||
},
|
||||
nunopod: {
|
||||
tier: "OU",
|
||||
doublesTier: "DOU",
|
||||
},
|
||||
zeploom: {
|
||||
tier: "OU",
|
||||
doublesTier: "DOU",
|
||||
},
|
||||
sturgard: {
|
||||
tier: "OU",
|
||||
doublesTier: "DOU",
|
||||
},
|
||||
brawnkey: {
|
||||
tier: "OU",
|
||||
doublesTier: "DOU",
|
||||
},
|
||||
salamalix: {
|
||||
tier: "OU",
|
||||
doublesTier: "DOU",
|
||||
},
|
||||
cinnastar: {
|
||||
tier: "OU",
|
||||
doublesTier: "DOU",
|
||||
},
|
||||
muabboa: {
|
||||
tier: "OU",
|
||||
doublesTier: "DOU",
|
||||
},
|
||||
harzodia: {
|
||||
tier: "OU",
|
||||
doublesTier: "DOU",
|
||||
},
|
||||
cyllindrake: {
|
||||
tier: "OU",
|
||||
doublesTier: "DOU",
|
||||
},
|
||||
kodokai: {
|
||||
tier: "OU",
|
||||
doublesTier: "DOU",
|
||||
},
|
||||
electangle: {
|
||||
tier: "OU",
|
||||
doublesTier: "DOU",
|
||||
},
|
||||
dolphena: {
|
||||
tier: "OU",
|
||||
doublesTier: "DOU",
|
||||
},
|
||||
soleron: {
|
||||
tier: "OU",
|
||||
doublesTier: "DOU",
|
||||
},
|
||||
jaegorm: {
|
||||
tier: "OU",
|
||||
doublesTier: "DOU",
|
||||
},
|
||||
elemadillo: {
|
||||
tier: "OU",
|
||||
doublesTier: "DOU",
|
||||
},
|
||||
axolacred: {
|
||||
tier: "OU",
|
||||
doublesTier: "DOU",
|
||||
},
|
||||
roscenti: {
|
||||
tier: "OU",
|
||||
doublesTier: "DOU",
|
||||
},
|
||||
blunderbusk: {
|
||||
tier: "OU",
|
||||
doublesTier: "DOU",
|
||||
},
|
||||
barracoth: {
|
||||
tier: "OU",
|
||||
doublesTier: "DOU",
|
||||
},
|
||||
jamborai: {
|
||||
tier: "OU",
|
||||
doublesTier: "DOU",
|
||||
},
|
||||
dracoil: {
|
||||
tier: "OU",
|
||||
doublesTier: "DOU",
|
||||
},
|
||||
celespirit: {
|
||||
tier: "OU",
|
||||
doublesTier: "DOU",
|
||||
},
|
||||
noxtrice: {
|
||||
tier: "OU",
|
||||
doublesTier: "DOU",
|
||||
},
|
||||
avastar: {
|
||||
tier: "OU",
|
||||
doublesTier: "DOU",
|
||||
},
|
||||
faerenheit: {
|
||||
tier: "OU",
|
||||
doublesTier: "DOU",
|
||||
},
|
||||
cellsius: {
|
||||
tier: "OU",
|
||||
doublesTier: "DOU",
|
||||
},
|
||||
kelven: {
|
||||
tier: "OU",
|
||||
doublesTier: "DOU",
|
||||
},
|
||||
salaos: {
|
||||
tier: "OU",
|
||||
doublesTier: "DOU",
|
||||
},
|
||||
morndos: {
|
||||
tier: "OU",
|
||||
doublesTier: "DOU",
|
||||
},
|
||||
pythos: {
|
||||
tier: "OU",
|
||||
doublesTier: "DOU",
|
||||
},
|
||||
corundell: {
|
||||
tier: "OU",
|
||||
doublesTier: "DOU",
|
||||
},
|
||||
quadringo: {
|
||||
tier: "OU",
|
||||
doublesTier: "DOU",
|
||||
},
|
||||
saphor: {
|
||||
tier: "OU",
|
||||
doublesTier: "DOU",
|
||||
},
|
||||
fenreil: {
|
||||
tier: "OU",
|
||||
doublesTier: "DOU",
|
||||
},
|
||||
efflor: {
|
||||
tier: "OU",
|
||||
doublesTier: "DOU",
|
||||
},
|
||||
flocura: {
|
||||
tier: "OU",
|
||||
doublesTier: "DOU",
|
||||
},
|
||||
};
|
||||
|
|
@ -1,88 +0,0 @@
|
|||
export const Items: import('../../../sim/dex-items').ModdedItemDataTable = {
|
||||
crystalorb: {
|
||||
name: "Crystal Orb",
|
||||
num: 1001,
|
||||
desc: "The holder's secondary type is replaced with Crystal. 20% boost to Crystal attacks.",
|
||||
onBeforeSwitchIn(pokemon) {
|
||||
if (this.effectState.usedSuperType && this.effectState.superTypeUser !== pokemon.fullname) return false;
|
||||
if (pokemon.hasType('Crystal')) return false;
|
||||
if (!pokemon.addType('Crystal')) return false;
|
||||
pokemon.setType([pokemon.types[0], "Crystal"]);
|
||||
this.effectState.usedSuperType = true;
|
||||
this.effectState.superTypeUser = "first_switch";
|
||||
},
|
||||
onStart(pokemon) {
|
||||
if (this.effectState.usedSuperType && this.effectState.superTypeUser === "first_switch") {
|
||||
this.add('-message', pokemon.name + " is a Crystal type!");
|
||||
this.effectState.superTypeUser = pokemon.fullname;
|
||||
}
|
||||
if (this.effectState.usedSuperType && this.effectState.superTypeUser === pokemon.fullname) {
|
||||
this.add('-start', pokemon, 'typechange', pokemon.getTypes(true).join('/'), '[silent]');
|
||||
}
|
||||
},
|
||||
onUpdate(pokemon) {
|
||||
if (
|
||||
this.effectState.usedSuperType && this.effectState.superTypeUser === pokemon.fullname && !pokemon.hasType('Crystal')
|
||||
) {
|
||||
pokemon.setType([pokemon.types[0], "Crystal"]);
|
||||
this.add('-start', pokemon, 'typechange', pokemon.getTypes(true).join('/'), '[silent]');
|
||||
}
|
||||
},
|
||||
onTakeItem(item, pokemon, source) {
|
||||
if (source?.hasType("Crystal")) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
},
|
||||
onBasePowerPriority: 15,
|
||||
onBasePower(basePower, user, target, move) {
|
||||
if (move && move.type === 'Crystal') {
|
||||
return this.chainModify([0x1333, 0x1000]);
|
||||
}
|
||||
},
|
||||
gen: 9,
|
||||
},
|
||||
feralorb: {
|
||||
name: "Feral Orb",
|
||||
num: 1002,
|
||||
desc: "The holder's secondary type is replaced with Feral. 20% boost to Feral attacks.",
|
||||
onBeforeSwitchIn(pokemon) {
|
||||
if (this.effectState.usedSuperType && this.effectState.superTypeUser !== pokemon.fullname) return false;
|
||||
if (pokemon.hasType('Feral')) return false;
|
||||
if (!pokemon.addType('Feral')) return false;
|
||||
pokemon.setType([pokemon.types[0], "Feral"]);
|
||||
this.effectState.usedSuperType = true;
|
||||
this.effectState.superTypeUser = "first_switch";
|
||||
},
|
||||
onStart(pokemon) {
|
||||
if (this.effectState.usedSuperType && this.effectState.superTypeUser === "first_switch") {
|
||||
this.add('-message', pokemon.name + " is a Feral type!");
|
||||
this.effectState.superTypeUser = pokemon.fullname;
|
||||
}
|
||||
if (this.effectState.usedSuperType && this.effectState.superTypeUser === pokemon.fullname) {
|
||||
this.add('-start', pokemon, 'typechange', pokemon.getTypes(true).join('/'), '[silent]');
|
||||
}
|
||||
},
|
||||
onUpdate(pokemon) {
|
||||
if (
|
||||
this.effectState.usedSuperType && this.effectState.superTypeUser === pokemon.fullname && !pokemon.hasType('Feral')
|
||||
) {
|
||||
pokemon.setType([pokemon.types[0], "Feral"]);
|
||||
this.add('-start', pokemon, 'typechange', pokemon.getTypes(true).join('/'), '[silent]');
|
||||
}
|
||||
},
|
||||
onTakeItem(item, pokemon, source) {
|
||||
if (source?.hasType("Feral")) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
},
|
||||
onBasePowerPriority: 15,
|
||||
onBasePower(basePower, user, target, move) {
|
||||
if (move && move.type === 'Feral') {
|
||||
return this.chainModify([0x1333, 0x1000]);
|
||||
}
|
||||
},
|
||||
gen: 9,
|
||||
},
|
||||
};
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -1,551 +0,0 @@
|
|||
export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable = {
|
||||
arbrella: {
|
||||
num: 2001,
|
||||
name: "Arbrella",
|
||||
types: ["Grass", "Ground"],
|
||||
baseStats: { hp: 80, atk: 115, def: 100, spa: 80, spd: 80, spe: 75 },
|
||||
abilities: { 0: "Overgrow", H: "Tough Claws" },
|
||||
weightkg: 211,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
krachiten: {
|
||||
num: 2002,
|
||||
name: "Krachiten",
|
||||
types: ["Water", "Bug"],
|
||||
baseStats: { hp: 90, atk: 120, def: 70, spa: 78, spd: 60, spe: 112 },
|
||||
abilities: { 0: "Torrent", H: "Sniper" },
|
||||
weightkg: 59,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
scalaron: {
|
||||
num: 2003,
|
||||
name: "Scalaron",
|
||||
types: ["Fire", "Flying"],
|
||||
baseStats: { hp: 90, atk: 70, def: 90, spa: 100, spd: 105, spe: 75 },
|
||||
abilities: { 0: "Blaze", H: "Filter" },
|
||||
weightkg: 70,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
rantler: {
|
||||
num: 2004,
|
||||
name: "Rantler",
|
||||
types: ["Normal", "Ice"],
|
||||
baseStats: { hp: 68, atk: 118, def: 94, spa: 43, spd: 79, spe: 73 },
|
||||
abilities: { 0: "Intimidate", 1: "Slush Rush", H: "Tough Claws" },
|
||||
weightkg: 67,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
woolora: {
|
||||
num: 2005,
|
||||
name: "Woolora",
|
||||
types: ["Fairy"],
|
||||
baseStats: { hp: 70, atk: 75, def: 70, spa: 95, spd: 115, spe: 70 },
|
||||
abilities: { 0: "Fluffy", 1: "Rattled", H: "Pastel Veil" },
|
||||
weightkg: 50.3,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
albatrygon: {
|
||||
num: 2006,
|
||||
name: "Albatrygon",
|
||||
types: ["Flying"],
|
||||
baseStats: { hp: 80, atk: 105, def: 70, spa: 65, spd: 60, spe: 95 },
|
||||
abilities: { 0: "Prankster", 1: "Klutz", H: "Unburden" },
|
||||
weightkg: 10.1,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
orchile: {
|
||||
num: 2007,
|
||||
name: "Orchile",
|
||||
types: ["Grass", "Fairy"],
|
||||
baseStats: { hp: 65, atk: 60, def: 75, spa: 110, spd: 121, spe: 64 },
|
||||
abilities: { 0: "Sweet Veil", 1: "Aroma Veil", H: "Flower Veil" },
|
||||
weightkg: 45,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
embuck: {
|
||||
num: 2008,
|
||||
name: "Embuck",
|
||||
types: ["Fire", "Fighting"],
|
||||
baseStats: { hp: 90, atk: 125, def: 80, spa: 83, spd: 65, spe: 82 },
|
||||
abilities: { 0: "Intimidate", H: "Flash Fire" },
|
||||
weightkg: 113,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
cindoe: {
|
||||
num: 2009,
|
||||
name: "Cindoe",
|
||||
types: ["Fire", "Dark"],
|
||||
baseStats: { hp: 80, atk: 74, def: 55, spa: 110, spd: 100, spe: 106 },
|
||||
abilities: { 0: "Natural Cure", H: "Flash Fire" },
|
||||
weightkg: 67,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
cobracotta: {
|
||||
num: 2010,
|
||||
name: "Cobracotta",
|
||||
types: ["Grass", "Poison"],
|
||||
baseStats: { hp: 80, atk: 90, def: 95, spa: 80, spd: 115, spe: 35 },
|
||||
abilities: { 0: "Mold Breaker", 1: "Weak Armor", H: "Heatproof" },
|
||||
weightkg: 68,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
minillow: {
|
||||
num: 2011,
|
||||
name: "Minillow",
|
||||
types: ["Water", "Fairy"],
|
||||
baseStats: { hp: 70, atk: 64, def: 75, spa: 90, spd: 95, spe: 81 },
|
||||
abilities: { 0: "Swift Swim", 1: "Dazzling", H: "Adaptability" },
|
||||
weightkg: 22,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
crossont: {
|
||||
num: 2012,
|
||||
name: "Crossont",
|
||||
types: ["Bug", "Fighting"],
|
||||
baseStats: { hp: 80, atk: 125, def: 100, spa: 60, spd: 80, spe: 80 },
|
||||
abilities: { 0: "Sniper", 1: "Long Reach", H: "Gooey" },
|
||||
weightkg: 121,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
torgeist: {
|
||||
num: 2013,
|
||||
name: "Torgeist",
|
||||
types: ["Ghost", "Flying"],
|
||||
baseStats: { hp: 55, atk: 65, def: 95, spa: 115, spd: 100, spe: 105 },
|
||||
abilities: { 0: "Cursed Body", 1: "Clear Body", H: "Merciless" },
|
||||
weightkg: 9.7,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
platypad: {
|
||||
num: 2014,
|
||||
name: "Platypad",
|
||||
types: ["Grass", "Water"],
|
||||
baseStats: { hp: 120, atk: 100, def: 80, spa: 100, spd: 80, spe: 40 },
|
||||
abilities: { 0: "Thick Fat", 1: "Triage", H: "Flower Veil" },
|
||||
weightkg: 89,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
lumoth: {
|
||||
num: 2015,
|
||||
name: "Lumoth",
|
||||
types: ["Bug", "Ghost"],
|
||||
baseStats: { hp: 60, atk: 55, def: 91, spa: 110, spd: 85, spe: 94 },
|
||||
abilities: { 0: "Levitate" },
|
||||
weightkg: 0.5,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
aurorowl: {
|
||||
num: 2016,
|
||||
name: "Aurorowl",
|
||||
types: ["Ice", "Flying"],
|
||||
baseStats: { hp: 70, atk: 70, def: 65, spa: 95, spd: 95, spe: 115 },
|
||||
abilities: { 0: "Snow Cloak", H: "Technician" },
|
||||
weightkg: 15,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
carapex: {
|
||||
num: 2017,
|
||||
name: "Carapex",
|
||||
types: ["Bug", "Flying"],
|
||||
baseStats: { hp: 75, atk: 105, def: 155, spa: 55, spd: 90, spe: 60 },
|
||||
abilities: { 0: "Wind Rider", 1: "Mold Breaker", H: "Sturdy" },
|
||||
weightkg: 135,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
dojodo: {
|
||||
num: 2018,
|
||||
name: "Dojodo",
|
||||
types: ["Fighting"],
|
||||
baseStats: { hp: 90, atk: 115, def: 80, spa: 65, spd: 100, spe: 80 },
|
||||
abilities: { 0: "Iron Fist", 1: "Stamina", H: "Supreme Overlord" },
|
||||
weightkg: 53,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
nunopod: {
|
||||
num: 2019,
|
||||
name: "Nunopod",
|
||||
types: ["Ground", "Bug"],
|
||||
baseStats: { hp: 80, atk: 110, def: 125, spa: 68, spd: 75, spe: 67 },
|
||||
abilities: { 0: "Earth Eater", H: "Opportunist" },
|
||||
weightkg: 68,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
zeploom: {
|
||||
num: 2020,
|
||||
name: "Zeploom",
|
||||
types: ["Grass", "Ground"],
|
||||
baseStats: { hp: 55, atk: 55, def: 145, spa: 65, spd: 150, spe: 45 },
|
||||
abilities: { 0: "Wind Rider", H: "Levitate" },
|
||||
weightkg: 5,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
brawnkey: {
|
||||
num: 2021,
|
||||
name: "Brawnkey",
|
||||
types: ["Steel", "Fighting"],
|
||||
baseStats: { hp: 95, atk: 105, def: 105, spa: 85, spd: 80, spe: 50 },
|
||||
abilities: { 0: "Levitate" },
|
||||
weightkg: 85,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
salamalix: {
|
||||
num: 2022,
|
||||
name: "Salamalix",
|
||||
types: ["Rock", "Steel"],
|
||||
baseStats: { hp: 70, atk: 120, def: 120, spa: 45, spd: 65, spe: 90 },
|
||||
abilities: { 0: "No Guard", 1: "Mold Breaker", H: "Intimidate" },
|
||||
weightkg: 85,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
cinnastar: {
|
||||
num: 2023,
|
||||
name: "Cinnastar",
|
||||
types: ["Rock", "Poison"],
|
||||
baseStats: { hp: 110, atk: 95, def: 80, spa: 95, spd: 80, spe: 80 },
|
||||
abilities: { 0: "Liquid Ooze", H: "Regenerator" },
|
||||
weightkg: 56,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
muabboa: {
|
||||
num: 2024,
|
||||
name: "MuabBoa",
|
||||
types: ["Ground", "Fighting"],
|
||||
baseStats: { hp: 65, atk: 100, def: 75, spa: 55, spd: 65, spe: 120 },
|
||||
abilities: { 0: "Anticipation", 1: "Sand Rush", H: "Inner Focus" },
|
||||
weightkg: 25,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
volvolpa: {
|
||||
num: 2025,
|
||||
name: "Volvolpa",
|
||||
types: ["Electric", "Ice"],
|
||||
baseStats: { hp: 76, atk: 97, def: 64, spa: 70, spd: 102, spe: 121 },
|
||||
abilities: { 0: "Slush Rush", 1: "Volt Absorb", H: "Strong Jaw" },
|
||||
weightkg: 27,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
harzodia: {
|
||||
num: 2026,
|
||||
name: "Harzodia",
|
||||
types: ["Psychic"],
|
||||
baseStats: { hp: 65, atk: 55, def: 75, spa: 125, spd: 75, spe: 95 },
|
||||
abilities: { 0: "Prankster", 1: "Unburden", H: "Solar Power" },
|
||||
weightkg: 35,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
cyllindrake: {
|
||||
num: 2027,
|
||||
name: "Cyllindrake",
|
||||
types: ["Steel", "Dragon"],
|
||||
baseStats: { hp: 70, atk: 85, def: 115, spa: 95, spd: 70, spe: 110 },
|
||||
abilities: { 0: "Heavy Metal", 1: "Punk Rock", H: "Scrappy" },
|
||||
weightkg: 180,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
kodokai: {
|
||||
num: 2028,
|
||||
name: "Kodokai",
|
||||
types: ["Ghost", "Fire"],
|
||||
baseStats: { hp: 110, atk: 65, def: 100, spa: 110, spd: 90, spe: 30 },
|
||||
abilities: { 0: "White Smoke", H: "Aroma Veil" },
|
||||
weightkg: 50,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
electangle: {
|
||||
num: 2029,
|
||||
name: "Electangle",
|
||||
types: ["Steel", "Electric"],
|
||||
baseStats: { hp: 120, atk: 90, def: 110, spa: 90, spd: 90, spe: 25 },
|
||||
abilities: { 0: "Filter" },
|
||||
weightkg: 190,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
dolphena: {
|
||||
num: 2030,
|
||||
name: "Dolphena",
|
||||
types: ["Water", "Dragon"],
|
||||
baseStats: { hp: 95, atk: 125, def: 80, spa: 84, spd: 75, spe: 81 },
|
||||
abilities: { 0: "Anger Point", H: "Mythical Presence" },
|
||||
weightkg: 271,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
elemadillo: {
|
||||
num: 2035,
|
||||
name: "Elemadillo",
|
||||
types: ["Steel", "Electric"],
|
||||
baseStats: { hp: 67, atk: 94, def: 73, spa: 103, spd: 64, spe: 129 },
|
||||
abilities: { 0: "Weak Armor", 1: "Motor Drive", H: "Stalwart" },
|
||||
weightkg: 58,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
axolacred: {
|
||||
num: 2036,
|
||||
name: "Axolacred",
|
||||
types: ["Dragon"],
|
||||
baseStats: { hp: 85, atk: 90, def: 85, spa: 95, spd: 95, spe: 65 },
|
||||
abilities: { 0: "Magic Guard", H: "Purifying Salt" },
|
||||
weightkg: 33,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
roscenti: {
|
||||
num: 2037,
|
||||
name: "Roscenti",
|
||||
types: ["Bug", "Grass"],
|
||||
baseStats: { hp: 80, atk: 115, def: 100, spa: 75, spd: 80, spe: 100 },
|
||||
abilities: { 0: "Sheer Force", 1: "Chlorophyll", H: "Skill Link" },
|
||||
eggGroups: ["Undiscovered"],
|
||||
weightkg: 37,
|
||||
},
|
||||
blunderbusk: {
|
||||
num: 2038,
|
||||
name: "Blunderbusk",
|
||||
types: ["Water"],
|
||||
baseStats: { hp: 73, atk: 67, def: 124, spa: 128, spd: 89, spe: 24 },
|
||||
abilities: { 0: "Mega Launcher", H: "Shell Bunker" },
|
||||
weightkg: 86,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
barracoth: {
|
||||
num: 2039,
|
||||
name: "Barracoth",
|
||||
types: ["Ice", "Water"],
|
||||
baseStats: { hp: 140, atk: 115, def: 110, spa: 55, spd: 65, spe: 35 },
|
||||
abilities: { 0: "Filter", 1: "Thick Fat", H: "Multiscale" },
|
||||
weightkg: 356,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
jamborai: {
|
||||
num: 2040,
|
||||
name: "Jamborai",
|
||||
types: ["Poison", "Psychic"],
|
||||
baseStats: { hp: 75, atk: 55, def: 125, spa: 120, spd: 85, spe: 65 },
|
||||
abilities: { 0: "Clear Body", 1: "Gooey", H: "Water Absorb" },
|
||||
weightkg: 84,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
dracoil: {
|
||||
num: 2041,
|
||||
name: "Dracoil",
|
||||
types: ["Dragon", "Flying"],
|
||||
baseStats: { hp: 105, atk: 106, def: 85, spa: 96, spd: 60, spe: 78 },
|
||||
abilities: { 0: "Mythical Presence", 1: "Gluttony", H: "Marvel Scale" },
|
||||
weightkg: 428,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
celespirit: {
|
||||
num: 2042,
|
||||
name: "Celespirit",
|
||||
types: ["Ghost"],
|
||||
baseStats: { hp: 75, atk: 61, def: 73, spa: 117, spd: 135, spe: 69 },
|
||||
abilities: { 0: "Levitate", H: "Power Spot" },
|
||||
weightkg: 25.8,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
noxtrice: {
|
||||
num: 2043,
|
||||
name: "Noxtrice",
|
||||
types: ["Poison", "Fire"],
|
||||
baseStats: { hp: 65, atk: 118, def: 75, spa: 63, spd: 80, spe: 114 },
|
||||
abilities: { 0: "Poison Touch", H: "Flash Fire" },
|
||||
weightkg: 73.7,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
sturgard: {
|
||||
num: 2055,
|
||||
name: "Sturgard",
|
||||
types: ["Water", "Ground"],
|
||||
baseStats: { hp: 105, atk: 110, def: 105, spa: 65, spd: 70, spe: 70 },
|
||||
abilities: { 0: "Rock Head", 1: "Battle Armor", H: "Mold Breaker" },
|
||||
weightkg: 143,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
avastar: {
|
||||
num: 2034,
|
||||
name: "Avastar",
|
||||
types: ["Psychic", "Steel"],
|
||||
baseStats: { hp: 75, atk: 85, def: 110, spa: 115, spd: 100, spe: 60 },
|
||||
abilities: { 0: "Stalwart", 1: "Heavy Metal", H: "Shell Bunker" },
|
||||
weightkg: 999.9,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
faerenheit: {
|
||||
num: 2044,
|
||||
name: "Faerenheit",
|
||||
types: ["Fire", "Fairy"],
|
||||
baseStats: { hp: 71, atk: 83, def: 127, spa: 97, spd: 109, spe: 83 },
|
||||
abilities: { 0: "Beast Boost" },
|
||||
weightkg: 2.1,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
cellsius: {
|
||||
num: 2045,
|
||||
name: "Cellsius",
|
||||
types: ["Water", "Fairy"],
|
||||
baseStats: { hp: 71, atk: 83, def: 83, spa: 109, spd: 127, spe: 97 },
|
||||
abilities: { 0: "Beast Boost" },
|
||||
weightkg: 2.4,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
kelven: {
|
||||
num: 2046,
|
||||
name: "Kelven",
|
||||
types: ["Ice", "Fairy"],
|
||||
baseStats: { hp: 71, atk: 127, def: 109, spa: 83, spd: 83, spe: 97 },
|
||||
abilities: { 0: "Beast Boost" },
|
||||
weightkg: 2.8,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
salaos: {
|
||||
num: 2047,
|
||||
name: "Salaos",
|
||||
types: ["Dark"],
|
||||
baseStats: { hp: 75, atk: 85, def: 90, spa: 110, spd: 130, spe: 90 },
|
||||
abilities: { 0: "Good as Gold" },
|
||||
weightkg: 74,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
morndos: {
|
||||
num: 2048,
|
||||
name: "Morndos",
|
||||
types: ["Dark", "Flying"],
|
||||
baseStats: { hp: 110, atk: 90, def: 75, spa: 90, spd: 85, spe: 130 },
|
||||
abilities: { 0: "Synchronize" },
|
||||
weightkg: 56,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
pythos: {
|
||||
num: 2049,
|
||||
name: "Pythos",
|
||||
types: ["Dark"],
|
||||
baseStats: { hp: 90, atk: 110, def: 130, spa: 85, spd: 90, spe: 75 },
|
||||
abilities: { 0: "Guts" },
|
||||
weightkg: 178,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
corundell: {
|
||||
num: 2050,
|
||||
name: "Corundell",
|
||||
types: ["Rock", "Electric"],
|
||||
baseStats: { hp: 75, atk: 100, def: 130, spa: 105, spd: 80, spe: 110 },
|
||||
abilities: { 0: "Lightning Rod", H: "Protosynthesis" },
|
||||
weightkg: 137,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
quadringo: {
|
||||
num: 2051,
|
||||
name: "Quadringo",
|
||||
types: ["Fairy", "Dragon"],
|
||||
baseStats: { hp: 80, atk: 120, def: 95, spa: 100, spd: 120, spe: 85 },
|
||||
abilities: { 0: "Hydration", 1: "Pastel Veil", H: "Inner Focus" },
|
||||
weightkg: 156,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
saphor: {
|
||||
num: 2052,
|
||||
name: "Saphor",
|
||||
types: ["Ground", "Normal"],
|
||||
baseStats: { hp: 95, atk: 100, def: 105, spa: 100, spd: 105, spe: 95 },
|
||||
abilities: { 0: "Thick Fat", 1: "Crystal Heart" },
|
||||
weightkg: 638,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
fenreil: {
|
||||
num: 2053,
|
||||
name: "Fenreil",
|
||||
types: ["Dark", "Normal"],
|
||||
baseStats: { hp: 80, atk: 105, def: 97, spa: 105, spd: 97, spe: 116 },
|
||||
abilities: { 0: "Natural Cure", 1: "Wild Heart" },
|
||||
weightkg: 232,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
soleron: {
|
||||
num: 2031,
|
||||
name: "Soleron",
|
||||
types: ["Electric", "Flying"],
|
||||
baseStats: { hp: 70, atk: 75, def: 65, spa: 115, spd: 75, spe: 115 },
|
||||
abilities: { 0: "Battle Bond" },
|
||||
otherFormes: ["Soleron-Awakened"],
|
||||
formeOrder: ["Soleron", "Soleron-Awakened"],
|
||||
weightkg: 12,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
soleronawakened: {
|
||||
num: 2031,
|
||||
name: "Soleron-Awakened",
|
||||
baseSpecies: "Soleron",
|
||||
forme: "Awakened",
|
||||
types: ["Electric", "Flying"],
|
||||
baseStats: { hp: 70, atk: 105, def: 85, spa: 135, spd: 95, spe: 125 },
|
||||
abilities: { 0: "Battle Bond" },
|
||||
requiredAbility: "Battle Bond",
|
||||
battleOnly: "Soleron",
|
||||
weightkg: 24,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
efflor: {
|
||||
num: 2032,
|
||||
name: "Efflor",
|
||||
types: ["Rock", "Grass"],
|
||||
baseStats: { hp: 80, atk: 85, def: 110, spa: 105, spd: 110, spe: 25 },
|
||||
abilities: { 0: "Solid Rock", 1: "Unaware", H: "Seed Sower" },
|
||||
weightkg: 113,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
pictagon: {
|
||||
num: 2055,
|
||||
name: "Pictagon",
|
||||
types: ["Dragon", "Ghost"],
|
||||
baseStats: { hp: 105, atk: 105, def: 60, spa: 80, spd: 85, spe: 95 },
|
||||
abilities: { 0: "Clear Body", 1: "Infiltrator", H: "No Guard" },
|
||||
weightkg: 113,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
jaegorm: {
|
||||
num: 2033,
|
||||
name: "Jaegorm",
|
||||
types: ["Bug", "Psychic"],
|
||||
baseStats: { hp: 60, atk: 65, def: 40, spa: 130, spd: 40, spe: 130 },
|
||||
abilities: { 0: "Schooling" },
|
||||
otherFormes: ["Jaegorm-Collective"],
|
||||
formeOrder: ["Jaegorm", "Jaegorm-Collective"],
|
||||
weightkg: 10,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
jaegormcollective: {
|
||||
num: 2033,
|
||||
name: "Jaegorm-Collective",
|
||||
baseSpecies: "Jaegorm",
|
||||
forme: "Collective",
|
||||
types: ["Bug", "Psychic"],
|
||||
baseStats: { hp: 60, atk: 145, def: 130, spa: 100, spd: 130, spe: 80 },
|
||||
abilities: { 0: "Schooling" },
|
||||
requiredAbility: "Schooling",
|
||||
battleOnly: "Jaegorm",
|
||||
weightkg: 122,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
flocura: {
|
||||
num: 2054,
|
||||
name: "Flocura",
|
||||
types: ["Grass", "Psychic"],
|
||||
baseStats: { hp: 55, atk: 85, def: 55, spa: 107, spd: 180, spe: 118 },
|
||||
abilities: { 0: "Levitate", H: "Power Construct" },
|
||||
otherFormes: ["Flocura-Nexus"],
|
||||
formeOrder: ["Flocura", "Flocura-Nexus"],
|
||||
weightkg: 7.1,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
flocuranexus: {
|
||||
num: 2054,
|
||||
name: "Flocura-Nexus",
|
||||
baseSpecies: "Flocura",
|
||||
forme: "Nexus",
|
||||
types: ["Grass", "Psychic"],
|
||||
baseStats: { hp: 105, atk: 125, def: 105, spa: 137, spd: 180, spe: 48 },
|
||||
abilities: { 0: "Levitate", H: "Power Construct" },
|
||||
requiredAbility: "Power Construct",
|
||||
battleOnly: "Flocura",
|
||||
weightkg: 999,
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
};
|
||||
|
|
@ -1,38 +0,0 @@
|
|||
export const Rulesets: import('../../../sim/dex-formats').ModdedFormatDataTable = {
|
||||
supertypemovesrule: {
|
||||
effectType: 'Rule',
|
||||
name: 'Super Type Moves Rule',
|
||||
desc: 'Prevents pokemon from using Crystal or Feral moves unless they have a matching type.',
|
||||
onBeforeMove(pokemon, target, move) {
|
||||
move = {
|
||||
...this.dex.moves.get(move),
|
||||
hit: move.hit,
|
||||
};
|
||||
if (move.type === "Crystal" && !pokemon.hasType("Crystal")) return false;
|
||||
if (move.type === "Feral" && !pokemon.hasType("Feral")) return false;
|
||||
},
|
||||
onDisableMove(pokemon) {
|
||||
for (const moveSlot of pokemon.moveSlots) {
|
||||
const move = this.dex.moves.get(moveSlot.id);
|
||||
if ((move.type === "Crystal" && !pokemon.hasType("Crystal")) || (move.type === "Feral" && !pokemon.hasType("Feral"))) {
|
||||
pokemon.disableMove(moveSlot.id, false);
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
spriteviewer: {
|
||||
effectType: 'ValidatorRule',
|
||||
name: 'Sprite Viewer',
|
||||
desc: "Displays a fakemon's sprite in chat when it is switched in for the first time",
|
||||
onBegin() {
|
||||
this.add('rule', 'Sprite Viewer: Displays sprites in chat');
|
||||
},
|
||||
onSwitchIn(pokemon) {
|
||||
if (!this.effectState[pokemon.species.id]) {
|
||||
this.add('-message', `${pokemon.species.name}'s Sprite:`);
|
||||
this.add(`raw|<img src="https://raw.githubusercontent.com/scoopapa/DH2/refs/heads/main/data/mods/scootopia/sprites/front/${pokemon.species.id}.png" height="96" width="96">`);
|
||||
this.effectState[pokemon.species.id] = true;
|
||||
}
|
||||
},
|
||||
},
|
||||
};
|
||||
|
|
@ -1,550 +0,0 @@
|
|||
export const TypeChart: import('../../../sim/dex-data').ModdedTypeDataTable = {
|
||||
bug: {
|
||||
num: 6,
|
||||
damageTaken: {
|
||||
Bug: 0,
|
||||
Dark: 0,
|
||||
Dragon: 0,
|
||||
Electric: 0,
|
||||
Fairy: 0,
|
||||
Fighting: 2,
|
||||
Fire: 1,
|
||||
Flying: 1,
|
||||
Ghost: 0,
|
||||
Grass: 2,
|
||||
Ground: 2,
|
||||
Ice: 0,
|
||||
Normal: 0,
|
||||
Poison: 0,
|
||||
Psychic: 0,
|
||||
Rock: 1,
|
||||
Steel: 0,
|
||||
Water: 0,
|
||||
Crystal: 0,
|
||||
Feral: 0,
|
||||
},
|
||||
HPivs: { atk: 30, def: 30, spd: 30 },
|
||||
HPdvs: { atk: 13, def: 13 },
|
||||
},
|
||||
dark: {
|
||||
num: 16,
|
||||
damageTaken: {
|
||||
prankster: 3,
|
||||
Bug: 1,
|
||||
Dark: 2,
|
||||
Dragon: 0,
|
||||
Electric: 0,
|
||||
Fairy: 1,
|
||||
Fighting: 1,
|
||||
Fire: 0,
|
||||
Flying: 0,
|
||||
Ghost: 2,
|
||||
Grass: 0,
|
||||
Ground: 0,
|
||||
Ice: 0,
|
||||
Normal: 0,
|
||||
Poison: 0,
|
||||
Psychic: 3,
|
||||
Rock: 0,
|
||||
Steel: 0,
|
||||
Water: 0,
|
||||
Crystal: 1,
|
||||
Feral: 0,
|
||||
},
|
||||
HPivs: {},
|
||||
},
|
||||
dragon: {
|
||||
num: 15,
|
||||
damageTaken: {
|
||||
Bug: 0,
|
||||
Dark: 0,
|
||||
Dragon: 1,
|
||||
Electric: 2,
|
||||
Fairy: 1,
|
||||
Fighting: 0,
|
||||
Fire: 2,
|
||||
Flying: 0,
|
||||
Ghost: 0,
|
||||
Grass: 2,
|
||||
Ground: 0,
|
||||
Ice: 1,
|
||||
Normal: 0,
|
||||
Poison: 0,
|
||||
Psychic: 0,
|
||||
Rock: 0,
|
||||
Steel: 0,
|
||||
Water: 2,
|
||||
Crystal: 0,
|
||||
Feral: 2,
|
||||
},
|
||||
HPivs: { atk: 30 },
|
||||
HPdvs: { def: 14 },
|
||||
},
|
||||
electric: {
|
||||
num: 12,
|
||||
damageTaken: {
|
||||
par: 3,
|
||||
Bug: 0,
|
||||
Dark: 0,
|
||||
Dragon: 0,
|
||||
Electric: 2,
|
||||
Fairy: 0,
|
||||
Fighting: 0,
|
||||
Fire: 0,
|
||||
Flying: 2,
|
||||
Ghost: 0,
|
||||
Grass: 0,
|
||||
Ground: 1,
|
||||
Ice: 0,
|
||||
Normal: 0,
|
||||
Poison: 0,
|
||||
Psychic: 0,
|
||||
Rock: 0,
|
||||
Steel: 2,
|
||||
Water: 0,
|
||||
Crystal: 2,
|
||||
Feral: 0,
|
||||
},
|
||||
HPivs: { spa: 30 },
|
||||
HPdvs: { atk: 14 },
|
||||
},
|
||||
fairy: {
|
||||
num: 17,
|
||||
damageTaken: {
|
||||
Bug: 2,
|
||||
Dark: 2,
|
||||
Dragon: 3,
|
||||
Electric: 0,
|
||||
Fairy: 0,
|
||||
Fighting: 2,
|
||||
Fire: 0,
|
||||
Flying: 0,
|
||||
Ghost: 0,
|
||||
Grass: 0,
|
||||
Ground: 0,
|
||||
Ice: 0,
|
||||
Normal: 0,
|
||||
Poison: 1,
|
||||
Psychic: 0,
|
||||
Rock: 0,
|
||||
Steel: 1,
|
||||
Water: 0,
|
||||
Crystal: 0,
|
||||
Feral: 1,
|
||||
},
|
||||
},
|
||||
fighting: {
|
||||
num: 1,
|
||||
damageTaken: {
|
||||
Bug: 2,
|
||||
Dark: 2,
|
||||
Dragon: 0,
|
||||
Electric: 0,
|
||||
Fairy: 1,
|
||||
Fighting: 0,
|
||||
Fire: 0,
|
||||
Flying: 1,
|
||||
Ghost: 0,
|
||||
Grass: 0,
|
||||
Ground: 0,
|
||||
Ice: 0,
|
||||
Normal: 0,
|
||||
Poison: 0,
|
||||
Psychic: 1,
|
||||
Rock: 2,
|
||||
Steel: 0,
|
||||
Water: 0,
|
||||
Crystal: 2,
|
||||
Feral: 0,
|
||||
},
|
||||
HPivs: { def: 30, spa: 30, spd: 30, spe: 30 },
|
||||
HPdvs: { atk: 12, def: 12 },
|
||||
},
|
||||
fire: {
|
||||
num: 9,
|
||||
damageTaken: {
|
||||
brn: 3,
|
||||
Bug: 2,
|
||||
Dark: 0,
|
||||
Dragon: 0,
|
||||
Electric: 0,
|
||||
Fairy: 2,
|
||||
Fighting: 0,
|
||||
Fire: 2,
|
||||
Flying: 0,
|
||||
Ghost: 0,
|
||||
Grass: 2,
|
||||
Ground: 1,
|
||||
Ice: 2,
|
||||
Normal: 0,
|
||||
Poison: 0,
|
||||
Psychic: 0,
|
||||
Rock: 1,
|
||||
Steel: 2,
|
||||
Water: 1,
|
||||
Crystal: 1,
|
||||
Feral: 2,
|
||||
},
|
||||
HPivs: { atk: 30, spa: 30, spe: 30 },
|
||||
HPdvs: { atk: 14, def: 12 },
|
||||
},
|
||||
flying: {
|
||||
num: 2,
|
||||
damageTaken: {
|
||||
Bug: 2,
|
||||
Dark: 0,
|
||||
Dragon: 0,
|
||||
Electric: 1,
|
||||
Fairy: 0,
|
||||
Fighting: 2,
|
||||
Fire: 0,
|
||||
Flying: 0,
|
||||
Ghost: 0,
|
||||
Grass: 2,
|
||||
Ground: 3,
|
||||
Ice: 1,
|
||||
Normal: 0,
|
||||
Poison: 0,
|
||||
Psychic: 0,
|
||||
Rock: 1,
|
||||
Steel: 0,
|
||||
Water: 0,
|
||||
Crystal: 0,
|
||||
Feral: 1,
|
||||
},
|
||||
HPivs: { hp: 30, atk: 30, def: 30, spa: 30, spd: 30 },
|
||||
HPdvs: { atk: 12, def: 13 },
|
||||
},
|
||||
ghost: {
|
||||
num: 7,
|
||||
damageTaken: {
|
||||
trapped: 3,
|
||||
Bug: 2,
|
||||
Dark: 1,
|
||||
Dragon: 0,
|
||||
Electric: 0,
|
||||
Fairy: 0,
|
||||
Fighting: 3,
|
||||
Fire: 0,
|
||||
Flying: 0,
|
||||
Ghost: 1,
|
||||
Grass: 0,
|
||||
Ground: 0,
|
||||
Ice: 0,
|
||||
Normal: 3,
|
||||
Poison: 2,
|
||||
Psychic: 0,
|
||||
Rock: 0,
|
||||
Steel: 0,
|
||||
Water: 0,
|
||||
Crystal: 1,
|
||||
Feral: 2,
|
||||
},
|
||||
HPivs: { def: 30, spd: 30 },
|
||||
HPdvs: { atk: 13, def: 14 },
|
||||
},
|
||||
grass: {
|
||||
num: 11,
|
||||
damageTaken: {
|
||||
powder: 3,
|
||||
Bug: 1,
|
||||
Dark: 0,
|
||||
Dragon: 0,
|
||||
Electric: 2,
|
||||
Fairy: 0,
|
||||
Fighting: 0,
|
||||
Fire: 1,
|
||||
Flying: 1,
|
||||
Ghost: 0,
|
||||
Grass: 2,
|
||||
Ground: 2,
|
||||
Ice: 1,
|
||||
Normal: 0,
|
||||
Poison: 1,
|
||||
Psychic: 0,
|
||||
Rock: 0,
|
||||
Steel: 0,
|
||||
Water: 2,
|
||||
Crystal: 0,
|
||||
Feral: 1,
|
||||
},
|
||||
HPivs: { atk: 30, spa: 30 },
|
||||
HPdvs: { atk: 14, def: 14 },
|
||||
},
|
||||
ground: {
|
||||
num: 4,
|
||||
damageTaken: {
|
||||
sandstorm: 3,
|
||||
Bug: 0,
|
||||
Dark: 0,
|
||||
Dragon: 0,
|
||||
Electric: 3,
|
||||
Fairy: 0,
|
||||
Fighting: 0,
|
||||
Fire: 0,
|
||||
Flying: 0,
|
||||
Ghost: 0,
|
||||
Grass: 1,
|
||||
Ground: 0,
|
||||
Ice: 1,
|
||||
Normal: 0,
|
||||
Poison: 2,
|
||||
Psychic: 0,
|
||||
Rock: 2,
|
||||
Steel: 0,
|
||||
Water: 1,
|
||||
Crystal: 0,
|
||||
Feral: 0,
|
||||
},
|
||||
HPivs: { spa: 30, spd: 30 },
|
||||
HPdvs: { atk: 12 },
|
||||
},
|
||||
ice: {
|
||||
num: 14,
|
||||
damageTaken: {
|
||||
hail: 3,
|
||||
frz: 3,
|
||||
Bug: 0,
|
||||
Dark: 0,
|
||||
Dragon: 0,
|
||||
Electric: 0,
|
||||
Fairy: 0,
|
||||
Fighting: 1,
|
||||
Fire: 1,
|
||||
Flying: 0,
|
||||
Ghost: 0,
|
||||
Grass: 0,
|
||||
Ground: 0,
|
||||
Ice: 2,
|
||||
Normal: 0,
|
||||
Poison: 0,
|
||||
Psychic: 0,
|
||||
Rock: 1,
|
||||
Steel: 1,
|
||||
Water: 0,
|
||||
Crystal: 0,
|
||||
Feral: 0,
|
||||
},
|
||||
HPivs: { atk: 30, def: 30 },
|
||||
HPdvs: { def: 13 },
|
||||
},
|
||||
normal: {
|
||||
num: 0,
|
||||
damageTaken: {
|
||||
Bug: 0,
|
||||
Dark: 0,
|
||||
Dragon: 0,
|
||||
Electric: 0,
|
||||
Fairy: 0,
|
||||
Fighting: 1,
|
||||
Fire: 0,
|
||||
Flying: 0,
|
||||
Ghost: 3,
|
||||
Grass: 0,
|
||||
Ground: 0,
|
||||
Ice: 0,
|
||||
Normal: 0,
|
||||
Poison: 0,
|
||||
Psychic: 0,
|
||||
Rock: 0,
|
||||
Steel: 0,
|
||||
Water: 0,
|
||||
Crystal: 0,
|
||||
Feral: 1,
|
||||
},
|
||||
},
|
||||
poison: {
|
||||
num: 3,
|
||||
damageTaken: {
|
||||
psn: 3,
|
||||
tox: 3,
|
||||
Bug: 2,
|
||||
Dark: 0,
|
||||
Dragon: 0,
|
||||
Electric: 0,
|
||||
Fairy: 2,
|
||||
Fighting: 2,
|
||||
Fire: 0,
|
||||
Flying: 0,
|
||||
Ghost: 0,
|
||||
Grass: 2,
|
||||
Ground: 1,
|
||||
Ice: 0,
|
||||
Normal: 0,
|
||||
Poison: 2,
|
||||
Psychic: 1,
|
||||
Rock: 0,
|
||||
Steel: 0,
|
||||
Water: 0,
|
||||
Crystal: 0,
|
||||
Feral: 2,
|
||||
},
|
||||
HPivs: { def: 30, spa: 30, spd: 30 },
|
||||
HPdvs: { atk: 12, def: 14 },
|
||||
},
|
||||
psychic: {
|
||||
num: 13,
|
||||
damageTaken: {
|
||||
Bug: 1,
|
||||
Dark: 1,
|
||||
Dragon: 0,
|
||||
Electric: 0,
|
||||
Fairy: 0,
|
||||
Fighting: 2,
|
||||
Fire: 0,
|
||||
Flying: 0,
|
||||
Ghost: 1,
|
||||
Grass: 0,
|
||||
Ground: 0,
|
||||
Ice: 0,
|
||||
Normal: 0,
|
||||
Poison: 0,
|
||||
Psychic: 2,
|
||||
Rock: 0,
|
||||
Steel: 0,
|
||||
Water: 0,
|
||||
Crystal: 0,
|
||||
Feral: 0,
|
||||
},
|
||||
HPivs: { atk: 30, spe: 30 },
|
||||
HPdvs: { def: 12 },
|
||||
},
|
||||
rock: {
|
||||
num: 5,
|
||||
damageTaken: {
|
||||
sandstorm: 3,
|
||||
Bug: 0,
|
||||
Dark: 0,
|
||||
Dragon: 0,
|
||||
Electric: 0,
|
||||
Fairy: 0,
|
||||
Fighting: 1,
|
||||
Fire: 2,
|
||||
Flying: 2,
|
||||
Ghost: 0,
|
||||
Grass: 1,
|
||||
Ground: 1,
|
||||
Ice: 0,
|
||||
Normal: 2,
|
||||
Poison: 2,
|
||||
Psychic: 0,
|
||||
Rock: 0,
|
||||
Steel: 1,
|
||||
Water: 1,
|
||||
Crystal: 0,
|
||||
Feral: 0,
|
||||
},
|
||||
HPivs: { def: 30, spd: 30, spe: 30 },
|
||||
HPdvs: { atk: 13, def: 12 },
|
||||
},
|
||||
steel: {
|
||||
num: 8,
|
||||
damageTaken: {
|
||||
psn: 3,
|
||||
tox: 3,
|
||||
sandstorm: 3,
|
||||
Bug: 2,
|
||||
Dark: 0,
|
||||
Dragon: 2,
|
||||
Electric: 0,
|
||||
Fairy: 2,
|
||||
Fighting: 1,
|
||||
Fire: 1,
|
||||
Flying: 2,
|
||||
Ghost: 0,
|
||||
Grass: 2,
|
||||
Ground: 1,
|
||||
Ice: 2,
|
||||
Normal: 2,
|
||||
Poison: 3,
|
||||
Psychic: 2,
|
||||
Rock: 2,
|
||||
Steel: 2,
|
||||
Water: 0,
|
||||
Crystal: 2,
|
||||
Feral: 0,
|
||||
},
|
||||
HPivs: { spd: 30 },
|
||||
HPdvs: { atk: 13 },
|
||||
},
|
||||
water: {
|
||||
num: 10,
|
||||
damageTaken: {
|
||||
Bug: 0,
|
||||
Dark: 0,
|
||||
Dragon: 0,
|
||||
Electric: 1,
|
||||
Fairy: 0,
|
||||
Fighting: 0,
|
||||
Fire: 2,
|
||||
Flying: 0,
|
||||
Ghost: 0,
|
||||
Grass: 1,
|
||||
Ground: 0,
|
||||
Ice: 2,
|
||||
Normal: 0,
|
||||
Poison: 0,
|
||||
Psychic: 0,
|
||||
Rock: 0,
|
||||
Steel: 2,
|
||||
Water: 2,
|
||||
Crystal: 0,
|
||||
Feral: 1,
|
||||
},
|
||||
HPivs: { atk: 30, def: 30, spa: 30 },
|
||||
HPdvs: { atk: 14, def: 13 },
|
||||
},
|
||||
crystal: {
|
||||
num: -1,
|
||||
damageTaken: {
|
||||
brn: 3,
|
||||
sandstorm: 3,
|
||||
Bug: 0,
|
||||
Dark: 2,
|
||||
Dragon: 0,
|
||||
Electric: 1,
|
||||
Fairy: 0,
|
||||
Fighting: 1,
|
||||
Fire: 2,
|
||||
Flying: 0,
|
||||
Ghost: 0,
|
||||
Grass: 0,
|
||||
Ground: 2,
|
||||
Ice: 0,
|
||||
Normal: 2,
|
||||
Poison: 0,
|
||||
Psychic: 0,
|
||||
Rock: 2,
|
||||
Steel: 1,
|
||||
Water: 2,
|
||||
Crystal: 2,
|
||||
Feral: 2,
|
||||
},
|
||||
},
|
||||
feral: {
|
||||
num: -1,
|
||||
damageTaken: {
|
||||
slp: 3,
|
||||
Bug: 0,
|
||||
Dark: 0,
|
||||
Dragon: 1,
|
||||
Electric: 0,
|
||||
Fairy: 2,
|
||||
Fighting: 0,
|
||||
Fire: 1,
|
||||
Flying: 0,
|
||||
Ghost: 2,
|
||||
Grass: 0,
|
||||
Ground: 0,
|
||||
Ice: 2,
|
||||
Normal: 0,
|
||||
Poison: 1,
|
||||
Psychic: 0,
|
||||
Rock: 0,
|
||||
Steel: 0,
|
||||
Water: 0,
|
||||
Crystal: 0,
|
||||
Feral: 0,
|
||||
},
|
||||
},
|
||||
};
|
||||
113
data/mods/sixbysix/formats-data.ts
Normal file
113
data/mods/sixbysix/formats-data.ts
Normal file
|
|
@ -0,0 +1,113 @@
|
|||
export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormatsDataTable = {
|
||||
kingdraclassic: {
|
||||
tier: "OU",
|
||||
},
|
||||
kingdrabrinepool: {
|
||||
tier: "OU",
|
||||
},
|
||||
kingdradruid: {
|
||||
tier: "OU",
|
||||
},
|
||||
kingdrabard: {
|
||||
tier: "OU",
|
||||
},
|
||||
kingdragourmet: {
|
||||
tier: "OU",
|
||||
},
|
||||
kingdraancient: {
|
||||
tier: "OU",
|
||||
},
|
||||
nidoqueenclassic: {
|
||||
tier: "OU",
|
||||
},
|
||||
nidoqueenerudite: {
|
||||
tier: "OU",
|
||||
},
|
||||
nidoqueenvolcanic: {
|
||||
tier: "OU",
|
||||
},
|
||||
nidoqueenrosegold: {
|
||||
tier: "OU",
|
||||
},
|
||||
nidoqueenshaman: {
|
||||
tier: "OU",
|
||||
},
|
||||
nidoqueenjasper: {
|
||||
tier: "OU",
|
||||
},
|
||||
bisharpcenturion: {
|
||||
tier: "OU",
|
||||
},
|
||||
bisharpsavage: {
|
||||
tier: "OU",
|
||||
},
|
||||
bisharpronin: {
|
||||
tier: "OU",
|
||||
},
|
||||
bisharpmantis: {
|
||||
tier: "OU",
|
||||
},
|
||||
bisharprevenant: {
|
||||
tier: "OU",
|
||||
},
|
||||
bisharpassassin: {
|
||||
tier: "OU",
|
||||
},
|
||||
corviknightthunderbird: {
|
||||
tier: "OU",
|
||||
},
|
||||
corviknightgenie: {
|
||||
tier: "OU",
|
||||
},
|
||||
corviknightyeti: {
|
||||
tier: "OU",
|
||||
},
|
||||
corviknightanalytical: {
|
||||
tier: "OU",
|
||||
},
|
||||
corviknightmartian: {
|
||||
tier: "OU",
|
||||
},
|
||||
corviknightfalcon: {
|
||||
tier: "OU",
|
||||
},
|
||||
krookodileinfernal: {
|
||||
tier: "OU",
|
||||
},
|
||||
krookodileabyssal: {
|
||||
tier: "OU",
|
||||
},
|
||||
krookodilewetlander: {
|
||||
tier: "OU",
|
||||
},
|
||||
krookodilecavedweller: {
|
||||
tier: "OU",
|
||||
},
|
||||
krookodilecliffside: {
|
||||
tier: "OU",
|
||||
},
|
||||
krookodilequantum: {
|
||||
tier: "OU",
|
||||
},
|
||||
ogerponmuerta: {
|
||||
tier: "OU",
|
||||
},
|
||||
ogerponeaster: {
|
||||
tier: "OU",
|
||||
},
|
||||
ogerponankh: {
|
||||
tier: "OU",
|
||||
},
|
||||
ogerponeid: {
|
||||
tier: "OU",
|
||||
},
|
||||
ogerponvessel: {
|
||||
tier: "OU",
|
||||
},
|
||||
ogerponkitsune: {
|
||||
tier: "OU",
|
||||
},
|
||||
ogerpontealtera: {
|
||||
tier: "Illegal",
|
||||
},
|
||||
};
|
||||
32
data/mods/sixbysix/items.ts
Normal file
32
data/mods/sixbysix/items.ts
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
export const Items: import('../../../sim/dex-items').ModdedItemDataTable = {
|
||||
cornerstonemask: {
|
||||
name: "Cornerstone Mask",
|
||||
spritenum: 758,
|
||||
fling: {
|
||||
basePower: 60,
|
||||
},
|
||||
num: 2406,
|
||||
gen: 9,
|
||||
desc: "No competitive use.",
|
||||
},
|
||||
hearthflamemask: {
|
||||
name: "Hearthflame Mask",
|
||||
spritenum: 760,
|
||||
fling: {
|
||||
basePower: 60,
|
||||
},
|
||||
desc: "No competitive use.",
|
||||
num: 2408,
|
||||
gen: 9,
|
||||
},
|
||||
wellspringmask: {
|
||||
name: "Wellspring Mask",
|
||||
spritenum: 759,
|
||||
fling: {
|
||||
basePower: 60,
|
||||
},
|
||||
desc: "No competitive use.",
|
||||
num: 2407,
|
||||
gen: 9,
|
||||
},
|
||||
};
|
||||
2580
data/mods/sixbysix/learnsets.ts
Normal file
2580
data/mods/sixbysix/learnsets.ts
Normal file
File diff suppressed because it is too large
Load Diff
542
data/mods/sixbysix/pokedex.ts
Normal file
542
data/mods/sixbysix/pokedex.ts
Normal file
|
|
@ -0,0 +1,542 @@
|
|||
export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable = {
|
||||
kingdra: {
|
||||
inherit: true,
|
||||
otherFormes: ["Kingdra-Classic", "Kingdra-Brinepool", "Kingdra-Druid", "Kingdra-Bard", "Kingdra-Gourmet", "Kingdra-Ancient"],
|
||||
formeOrder: ["Kingdra", "Kingdra-Classic", "Kingdra-Brinepool", "Kingdra-Druid", "Kingdra-Bard", "Kingdra-Gourmet", "Kingdra-Ancient"],
|
||||
},
|
||||
kingdraclassic: {
|
||||
num: 230,
|
||||
name: "Kingdra-Classic",
|
||||
baseSpecies: "Kingdra",
|
||||
forme: "Classic",
|
||||
types: ["Water", "Dragon"],
|
||||
baseStats: { hp: 90, atk: 70, def: 80, spa: 130, spd: 90, spe: 90 },
|
||||
abilities: { 0: "Berserk", 1: "Heatproof", H: "Dry Skin" },
|
||||
heightm: 1.8,
|
||||
weightkg: 152,
|
||||
color: "Blue",
|
||||
prevo: '',
|
||||
eggGroups: ["Water 1", "Dragon"],
|
||||
},
|
||||
kingdrabrinepool: {
|
||||
num: 230,
|
||||
name: "Kingdra-Brinepool",
|
||||
baseSpecies: "Kingdra",
|
||||
forme: "Brinepool",
|
||||
types: ["Water", "Poison"],
|
||||
baseStats: { hp: 130, atk: 35, def: 105, spa: 130, spd: 85, spe: 65 },
|
||||
abilities: { 0: "Storm Drain", 1: "Purifying Salt", H: "Dry Skin" },
|
||||
heightm: 1.8,
|
||||
weightkg: 152,
|
||||
color: "Blue",
|
||||
prevo: '',
|
||||
eggGroups: ["Water 1", "Dragon"],
|
||||
},
|
||||
kingdradruid: {
|
||||
num: 230,
|
||||
name: "Kingdra-Druid",
|
||||
baseSpecies: "Kingdra",
|
||||
forme: "Druid",
|
||||
types: ["Steel", "Dragon"],
|
||||
baseStats: { hp: 105, atk: 65, def: 90, spa: 120, spd: 120, spe: 50 },
|
||||
abilities: { 0: "Berserk", 1: "Heatproof", H: "Water Absorb" },
|
||||
heightm: 1.8,
|
||||
weightkg: 152,
|
||||
color: "Blue",
|
||||
prevo: '',
|
||||
eggGroups: ["Water 1", "Dragon"],
|
||||
},
|
||||
kingdrabard: {
|
||||
num: 230,
|
||||
name: "Kingdra-Bard",
|
||||
baseSpecies: "Kingdra",
|
||||
forme: "Bard",
|
||||
types: ["Water", "Fairy"],
|
||||
baseStats: { hp: 90, atk: 70, def: 80, spa: 130, spd: 100, spe: 80 },
|
||||
abilities: { 0: "Punk Rock", 1: "Cute Charm", H: "Dancer" },
|
||||
heightm: 1.8,
|
||||
weightkg: 152,
|
||||
color: "Blue",
|
||||
prevo: '',
|
||||
eggGroups: ["Water 1", "Dragon"],
|
||||
},
|
||||
kingdragourmet: {
|
||||
num: 230,
|
||||
name: "Kingdra-Gourmet",
|
||||
baseSpecies: "Kingdra",
|
||||
forme: "Gourmet",
|
||||
types: ["Normal", "Dragon"],
|
||||
baseStats: { hp: 110, atk: 110, def: 80, spa: 90, spd: 100, spe: 60 },
|
||||
abilities: { 0: "Emergency Exit", 1: "Thick Fat", H: "Poison Heal" },
|
||||
heightm: 1.8,
|
||||
weightkg: 152,
|
||||
color: "Blue",
|
||||
prevo: '',
|
||||
eggGroups: ["Water 1", "Dragon"],
|
||||
},
|
||||
kingdraancient: {
|
||||
num: 230,
|
||||
name: "Kingdra-Ancient",
|
||||
baseSpecies: "Kingdra",
|
||||
forme: "Ancient",
|
||||
types: ["Fire", "Grass"],
|
||||
baseStats: { hp: 89, atk: 89, def: 91, spa: 111, spd: 91, spe: 79 },
|
||||
abilities: { 0: "Competitive", 1: "Heatproof", H: "Protosynthesis" },
|
||||
heightm: 1.8,
|
||||
weightkg: 152,
|
||||
color: "Blue",
|
||||
prevo: '',
|
||||
eggGroups: ["Water 1", "Dragon"],
|
||||
},
|
||||
nidoqueen: {
|
||||
inherit: true,
|
||||
otherFormes: ["Nidoqueen-Classic", "Nidoqueen-Erudite", "Nidoqueen-Volcanic", "Nidoqueen-Rosegold", "Nidoqueen-Shaman", "Nidoqueen-Jasper"],
|
||||
formeOrder: ["Nidoqueen", "Nidoqueen-Classic", "Nidoqueen-Erudite", "Nidoqueen-Volcanic", "Nidoqueen-Rosegold", "Nidoqueen-Shaman", "Nidoqueen-Jasper"],
|
||||
},
|
||||
nidoqueenclassic: {
|
||||
num: 31,
|
||||
name: "Nidoqueen-Classic",
|
||||
baseSpecies: "Nidoqueen",
|
||||
forme: "Classic",
|
||||
types: ["Poison", "Ground"],
|
||||
gender: "F",
|
||||
baseStats: { hp: 135, atk: 115, def: 60, spa: 90, spd: 85, spe: 55 },
|
||||
abilities: { 0: "Poison Point", 1: "Cheek Pouch", H: "Serene Grace" },
|
||||
heightm: 1.3,
|
||||
weightkg: 60,
|
||||
color: "Blue",
|
||||
prevo: '',
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
nidoqueenerudite: {
|
||||
num: 31,
|
||||
name: "Nidoqueen-Erudite",
|
||||
baseSpecies: "Nidoqueen",
|
||||
forme: "Erudite",
|
||||
types: ["Psychic", "Ground"],
|
||||
gender: "F",
|
||||
baseStats: { hp: 95, atk: 100, def: 80, spa: 115, spd: 110, spe: 40 },
|
||||
abilities: { 0: "Cute Charm", 1: "Regenerator", H: "Serene Grace" },
|
||||
heightm: 1.3,
|
||||
weightkg: 60,
|
||||
color: "Blue",
|
||||
prevo: '',
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
nidoqueenvolcanic: {
|
||||
num: 31,
|
||||
name: "Nidoqueen-Volcanic",
|
||||
baseSpecies: "Nidoqueen",
|
||||
forme: "Volcanic",
|
||||
types: ["Fire", "Ground"],
|
||||
gender: "F",
|
||||
baseStats: { hp: 125, atk: 75, def: 100, spa: 110, spd: 75, spe: 55 },
|
||||
abilities: { 0: "Flame Body", 1: "Cheek Pouch", H: "Sheer Force" },
|
||||
heightm: 1.3,
|
||||
weightkg: 60,
|
||||
color: "Blue",
|
||||
prevo: '',
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
nidoqueenrosegold: {
|
||||
num: 31,
|
||||
name: "Nidoqueen-Rosegold",
|
||||
baseSpecies: "Nidoqueen",
|
||||
forme: "Rosegold",
|
||||
types: ["Poison", "Grass"],
|
||||
gender: "F",
|
||||
baseStats: { hp: 125, atk: 70, def: 100, spa: 100, spd: 85, spe: 60 },
|
||||
abilities: { 0: "Rough Skin", 1: "Cheek Pouch", H: "Shield Dust" },
|
||||
heightm: 1.3,
|
||||
weightkg: 60,
|
||||
color: "Blue",
|
||||
prevo: '',
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
nidoqueenshaman: {
|
||||
num: 31,
|
||||
name: "Nidoqueen-Shaman",
|
||||
baseSpecies: "Nidoqueen",
|
||||
forme: "Shaman",
|
||||
types: ["Poison", "Ghost"],
|
||||
gender: "F",
|
||||
baseStats: { hp: 95, atk: 120, def: 60, spa: 90, spd: 80, spe: 95 },
|
||||
abilities: { 0: "Toxic Chain", 1: "Regenerator", H: "Sheer Force" },
|
||||
heightm: 1.3,
|
||||
weightkg: 60,
|
||||
color: "Blue",
|
||||
prevo: '',
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
nidoqueenjasper: {
|
||||
num: 31,
|
||||
name: "Nidoqueen-Jasper",
|
||||
baseSpecies: "Nidoqueen",
|
||||
forme: "Jasper",
|
||||
types: ["Poison", "Rock"],
|
||||
gender: "F",
|
||||
baseStats: { hp: 135, atk: 125, def: 70, spa: 80, spd: 85, spe: 45 },
|
||||
abilities: { 0: "Clear Body", 1: "Earth Eater", H: "Sand Stream" },
|
||||
heightm: 1.3,
|
||||
weightkg: 60,
|
||||
color: "Blue",
|
||||
prevo: '',
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
bisharp: {
|
||||
inherit: true,
|
||||
otherFormes: ["Bisharp-Centurion", "Bisharp-Savage", "Bisharp-Ronin", "Bisharp-Mantis", "Bisharp-Revenant", "Bisharp-Assassin"],
|
||||
formeOrder: ["Bisharp", "Bisharp-Centurion", "Bisharp-Savage", "Bisharp-Ronin", "Bisharp-Mantis", "Bisharp-Revenant", "Bisharp-Assassin"],
|
||||
},
|
||||
bisharpcenturion: {
|
||||
num: 625,
|
||||
name: "Bisharp-Centurion",
|
||||
baseSpecies: "Bisharp",
|
||||
forme: "Centurion",
|
||||
types: ["Fighting", "Steel"],
|
||||
baseStats: { hp: 70, atk: 140, def: 115, spa: 55, spd: 70, spe: 70 },
|
||||
abilities: { 0: "Overcoat", 1: "Technician", H: "Solar Power" },
|
||||
heightm: 1.6,
|
||||
weightkg: 70,
|
||||
color: "Red",
|
||||
prevo: '',
|
||||
eggGroups: ["Human-Like"],
|
||||
},
|
||||
bisharpsavage: {
|
||||
num: 625,
|
||||
name: "Bisharp-Savage",
|
||||
baseSpecies: "Bisharp",
|
||||
forme: "Savage",
|
||||
types: ["Grass", "Steel"],
|
||||
baseStats: { hp: 90, atk: 110, def: 135, spa: 40, spd: 80, spe: 65 },
|
||||
abilities: { 0: "Bulletproof", 1: "Technician", H: "Leaf Guard" },
|
||||
heightm: 1.6,
|
||||
weightkg: 70,
|
||||
color: "Red",
|
||||
prevo: '',
|
||||
eggGroups: ["Human-Like"],
|
||||
},
|
||||
bisharpronin: {
|
||||
num: 625,
|
||||
name: "Bisharp-Ronin",
|
||||
baseSpecies: "Bisharp",
|
||||
forme: "Ronin",
|
||||
types: ["Fighting", "Poison"],
|
||||
baseStats: { hp: 70, atk: 115, def: 110, spa: 45, spd: 70, spe: 110 },
|
||||
abilities: { 0: "Overcoat", 1: "Technician", H: "Dry Skin" },
|
||||
heightm: 1.6,
|
||||
weightkg: 70,
|
||||
color: "Red",
|
||||
prevo: '',
|
||||
eggGroups: ["Human-Like"],
|
||||
},
|
||||
bisharpmantis: {
|
||||
num: 625,
|
||||
name: "Bisharp-Mantis",
|
||||
baseSpecies: "Bisharp",
|
||||
forme: "Mantis",
|
||||
types: ["Dark", "Bug"],
|
||||
baseStats: { hp: 80, atk: 120, def: 105, spa: 45, spd: 85, spe: 85 },
|
||||
abilities: { 0: "Overcoat", 1: "Sharpness", H: "Orichalcum Pulse" },
|
||||
heightm: 1.6,
|
||||
weightkg: 70,
|
||||
color: "Red",
|
||||
prevo: '',
|
||||
eggGroups: ["Human-Like"],
|
||||
},
|
||||
bisharprevenant: {
|
||||
num: 625,
|
||||
name: "Bisharp-Revenant",
|
||||
baseSpecies: "Bisharp",
|
||||
forme: "Revenant",
|
||||
types: ["Ghost", "Steel"],
|
||||
baseStats: { hp: 80, atk: 135, def: 120, spa: 45, spd: 70, spe: 70 },
|
||||
abilities: { 0: "Magic Bounce", 1: "Mirror Armor", H: "Justified" },
|
||||
heightm: 1.6,
|
||||
weightkg: 70,
|
||||
color: "Red",
|
||||
prevo: '',
|
||||
eggGroups: ["Human-Like"],
|
||||
},
|
||||
bisharpassassin: {
|
||||
num: 625,
|
||||
name: "Bisharp-Assassin",
|
||||
baseSpecies: "Bisharp",
|
||||
forme: "Assassin",
|
||||
types: ["Fighting", "Ice"],
|
||||
baseStats: { hp: 80, atk: 130, def: 110, spa: 55, spd: 70, spe: 75 },
|
||||
abilities: { 0: "Dazzling", 1: "No Guard", H: "Slush Rush" },
|
||||
heightm: 1.6,
|
||||
weightkg: 70,
|
||||
color: "Red",
|
||||
prevo: '',
|
||||
eggGroups: ["Human-Like"],
|
||||
},
|
||||
corviknight: {
|
||||
inherit: true,
|
||||
otherFormes: ["Corviknight-Thunderbird", "Corviknight-Genie", "Corviknight-Yeti", "Corviknight-Analytical", "Corviknight-Martian", "Corviknight-Falcon"],
|
||||
formeOrder: ["Corviknight", "Corviknight-Thunderbird", "Corviknight-Genie", "Corviknight-Yeti", "Corviknight-Analytical", "Corviknight-Martian", "Corviknight-Falcon"],
|
||||
},
|
||||
corviknightthunderbird: {
|
||||
num: 823,
|
||||
name: "Corviknight-Thunderbird",
|
||||
baseSpecies: "Corviknight",
|
||||
forme: "Thunderbird",
|
||||
types: ["Flying", "Electric"],
|
||||
baseStats: { hp: 85, atk: 55, def: 105, spa: 115, spd: 85, spe: 85 },
|
||||
abilities: { 0: "Pickpocket", 1: "Quick Feet", H: "Drizzle" },
|
||||
heightm: 2.2,
|
||||
weightkg: 75,
|
||||
color: "Purple",
|
||||
prevo: '',
|
||||
eggGroups: ["Flying"],
|
||||
},
|
||||
corviknightgenie: {
|
||||
num: 823,
|
||||
name: "Corviknight-Genie",
|
||||
baseSpecies: "Corviknight",
|
||||
forme: "Genie",
|
||||
types: ["Flying", "Ground"],
|
||||
baseStats: { hp: 89, atk: 45, def: 95, spa: 120, spd: 90, spe: 91 },
|
||||
abilities: { 0: "Intimidate", 1: "Sand Force", H: "Prankster" },
|
||||
heightm: 2.2,
|
||||
weightkg: 75,
|
||||
color: "Purple",
|
||||
prevo: '',
|
||||
eggGroups: ["Flying"],
|
||||
},
|
||||
corviknightyeti: {
|
||||
num: 823,
|
||||
name: "Corviknight-Yeti",
|
||||
baseSpecies: "Corviknight",
|
||||
forme: "Yeti",
|
||||
types: ["Flying", "Ice"],
|
||||
baseStats: { hp: 85, atk: 55, def: 80, spa: 95, spd: 110, spe: 110 },
|
||||
abilities: { 0: "Mummy", 1: "Quick Feet", H: "Snow Warning" },
|
||||
heightm: 2.2,
|
||||
weightkg: 75,
|
||||
color: "Purple",
|
||||
prevo: '',
|
||||
eggGroups: ["Flying"],
|
||||
},
|
||||
corviknightanalytical: {
|
||||
num: 823,
|
||||
name: "Corviknight-Analytical",
|
||||
baseSpecies: "Corviknight",
|
||||
forme: "Analytical",
|
||||
types: ["Psychic", "Electric"],
|
||||
baseStats: { hp: 85, atk: 55, def: 80, spa: 110, spd: 85, spe: 115 },
|
||||
abilities: { 0: "Pickpocket", 1: "Flare Boost", H: "Psychic Surge" },
|
||||
heightm: 2.2,
|
||||
weightkg: 75,
|
||||
color: "Purple",
|
||||
prevo: '',
|
||||
eggGroups: ["Flying"],
|
||||
},
|
||||
corviknightmartian: {
|
||||
num: 823,
|
||||
name: "Corviknight-Martian",
|
||||
baseSpecies: "Corviknight",
|
||||
forme: "Martian",
|
||||
types: ["Psychic", "Steel"],
|
||||
baseStats: { hp: 95, atk: 45, def: 120, spa: 100, spd: 105, spe: 65 },
|
||||
abilities: { 0: "Iron Barbs", 1: "Quick Feet", H: "Hadron Engine" },
|
||||
heightm: 2.2,
|
||||
weightkg: 75,
|
||||
color: "Purple",
|
||||
prevo: '',
|
||||
eggGroups: ["Flying"],
|
||||
},
|
||||
corviknightfalcon: {
|
||||
num: 823,
|
||||
name: "Corviknight-Falcon",
|
||||
baseSpecies: "Corviknight",
|
||||
forme: "Falcon",
|
||||
types: ["Flying", "Fighting"],
|
||||
baseStats: { hp: 86, atk: 95, def: 75, spa: 75, spd: 85, spe: 114 },
|
||||
abilities: { 0: "Pickpocket", 1: "Guts", H: "Delta Stream" },
|
||||
heightm: 2.2,
|
||||
weightkg: 75,
|
||||
color: "Purple",
|
||||
prevo: '',
|
||||
eggGroups: ["Flying"],
|
||||
},
|
||||
krookodile: {
|
||||
inherit: true,
|
||||
otherFormes: ["Krookodile-Infernal", "Krookodile-Abyssal", "Krookodile-Wetlander", "Krookodile-Cave Dweller", "Krookodile-Cliffside", "Krookodile-Quantum"],
|
||||
formeOrder: ["Krookodile", "Krookodile-Infernal", "Krookodile-Abyssal", "Krookodile-Wetlander", "Krookodile-Cave Dweller", "Krookodile-Cliffside", "Krookodile-Quantum"],
|
||||
},
|
||||
krookodileinfernal: {
|
||||
num: 553,
|
||||
name: "Krookodile-Infernal",
|
||||
baseSpecies: "Krookodile",
|
||||
forme: "Infernal",
|
||||
types: ["Fire", "Dark"],
|
||||
baseStats: { hp: 90, atk: 80, def: 85, spa: 105, spd: 90, spe: 100 },
|
||||
abilities: { 0: "Magic Guard", 1: "Wonder Skin", H: "Sturdy" },
|
||||
heightm: 1.5,
|
||||
weightkg: 96.3,
|
||||
color: "Red",
|
||||
prevo: '',
|
||||
eggGroups: ["Field"],
|
||||
},
|
||||
krookodileabyssal: {
|
||||
num: 553,
|
||||
name: "Krookodile-Abyssal",
|
||||
baseSpecies: "Krookodile",
|
||||
forme: "Abyssal",
|
||||
types: ["Ground", "Dark"],
|
||||
baseStats: { hp: 90, atk: 120, def: 85, spa: 75, spd: 90, spe: 90 },
|
||||
abilities: { 0: "Rock Head", 1: "Wonder Skin", H: "Multiscale" },
|
||||
heightm: 1.5,
|
||||
weightkg: 96.3,
|
||||
color: "Red",
|
||||
prevo: '',
|
||||
eggGroups: ["Field"],
|
||||
},
|
||||
krookodilewetlander: {
|
||||
num: 553,
|
||||
name: "Krookodile-Wetlander",
|
||||
baseSpecies: "Krookodile",
|
||||
forme: "Wetlander",
|
||||
types: ["Grass", "Water"],
|
||||
baseStats: { hp: 100, atk: 100, def: 75, spa: 85, spd: 110, spe: 80 },
|
||||
abilities: { 0: "Rock Head", 1: "Wonder Skin", H: "Wind Rider" },
|
||||
heightm: 1.5,
|
||||
weightkg: 96.3,
|
||||
color: "Red",
|
||||
prevo: '',
|
||||
eggGroups: ["Field"],
|
||||
},
|
||||
krookodilecavedweller: {
|
||||
num: 553,
|
||||
name: "Krookodile-Cave Dweller",
|
||||
baseSpecies: "Krookodile",
|
||||
forme: "Cave Dweller",
|
||||
types: ["Fire", "Rock"],
|
||||
baseStats: { hp: 80, atk: 110, def: 75, spa: 85, spd: 80, spe: 120 },
|
||||
abilities: { 0: "Magic Guard", 1: "Wonder Skin", H: "Sturdy" },
|
||||
heightm: 1.5,
|
||||
weightkg: 96.3,
|
||||
color: "Red",
|
||||
prevo: '',
|
||||
eggGroups: ["Field"],
|
||||
},
|
||||
krookodilecliffside: {
|
||||
num: 553,
|
||||
name: "Krookodile-Cliffside",
|
||||
baseSpecies: "Krookodile",
|
||||
forme: "Cliffside",
|
||||
types: ["Dragon", "Dark"],
|
||||
baseStats: { hp: 90, atk: 70, def: 85, spa: 115, spd: 80, spe: 110 },
|
||||
abilities: { 0: "Intimidate", 1: "Merciless", H: "Mold Breaker" },
|
||||
heightm: 1.5,
|
||||
weightkg: 96.3,
|
||||
color: "Red",
|
||||
prevo: '',
|
||||
eggGroups: ["Field"],
|
||||
},
|
||||
krookodilequantum: {
|
||||
num: 553,
|
||||
name: "Krookodile-Quantum",
|
||||
baseSpecies: "Krookodile",
|
||||
forme: "Quantum",
|
||||
types: ["Electric", "Rock"],
|
||||
baseStats: { hp: 95, atk: 100, def: 85, spa: 85, spd: 85, spe: 100 },
|
||||
abilities: { 0: "Rock Head", 1: "Prankster", H: "Sturdy" },
|
||||
heightm: 1.5,
|
||||
weightkg: 96.3,
|
||||
color: "Red",
|
||||
prevo: '',
|
||||
eggGroups: ["Field"],
|
||||
},
|
||||
ogerpon: {
|
||||
inherit: true,
|
||||
otherFormes: ["Ogerpon-Muerta", "Ogerpon-Easter", "Ogerpon-Ankh", "Ogerpon-Eid", "Ogerpon-Vessel", "Ogerpon-Kitsune"],
|
||||
formeOrder: ["Ogerpon", "Ogerpon-Muerta", "Ogerpon-Easter", "Ogerpon-Ankh", "Ogerpon-Eid", "Ogerpon-Vessel", "Ogerpon-Kitsune"],
|
||||
},
|
||||
ogerponmuerta: {
|
||||
num: 1017,
|
||||
name: "Ogerpon-Muerta",
|
||||
baseSpecies: "Ogerpon",
|
||||
forme: "Muerta",
|
||||
types: ["Fairy", "Ghost"],
|
||||
gender: "F",
|
||||
baseStats: { hp: 90, atk: 120, def: 70, spa: 100, spd: 90, spe: 130 },
|
||||
abilities: { 0: "Wandering Spirit" },
|
||||
heightm: 1.2,
|
||||
weightkg: 39.8,
|
||||
color: "Green",
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
ogerponeaster: {
|
||||
num: 1017,
|
||||
name: "Ogerpon-Easter",
|
||||
baseSpecies: "Ogerpon",
|
||||
forme: "Easter",
|
||||
types: ["Fairy", "Normal"],
|
||||
gender: "F",
|
||||
baseStats: { hp: 105, atk: 95, def: 95, spa: 110, spd: 80, spe: 115 },
|
||||
abilities: { 0: "Pickpocket" },
|
||||
heightm: 1.2,
|
||||
weightkg: 39.8,
|
||||
color: "Green",
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
ogerponankh: {
|
||||
num: 1017,
|
||||
name: "Ogerpon-Ankh",
|
||||
baseSpecies: "Ogerpon",
|
||||
forme: "Ankh",
|
||||
types: ["Ghost"],
|
||||
gender: "F",
|
||||
baseStats: { hp: 85, atk: 130, def: 70, spa: 130, spd: 90, spe: 95 },
|
||||
abilities: { 0: "Mummy", H: "Good as Gold" },
|
||||
heightm: 1.2,
|
||||
weightkg: 39.8,
|
||||
color: "Green",
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
ogerponeid: {
|
||||
num: 1017,
|
||||
name: "Ogerpon-Eid",
|
||||
baseSpecies: "Ogerpon",
|
||||
forme: "Eid",
|
||||
types: ["Water", "Ghost"],
|
||||
gender: "F",
|
||||
baseStats: { hp: 95, atk: 98, def: 100, spa: 105, spd: 110, spe: 92 },
|
||||
abilities: { 0: "Tangling Hair" },
|
||||
heightm: 1.2,
|
||||
weightkg: 39.8,
|
||||
color: "Green",
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
ogerponvessel: {
|
||||
num: 1017,
|
||||
name: "Ogerpon-Vessel",
|
||||
baseSpecies: "Ogerpon",
|
||||
forme: "Vessel",
|
||||
types: ["Bug", "Fighting"],
|
||||
gender: "F",
|
||||
baseStats: { hp: 95, atk: 115, def: 80, spa: 80, spd: 80, spe: 150 },
|
||||
abilities: { 0: "Trace" },
|
||||
heightm: 1.2,
|
||||
weightkg: 39.8,
|
||||
color: "Green",
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
ogerponkitsune: {
|
||||
num: 1017,
|
||||
name: "Ogerpon-Kitsune",
|
||||
baseSpecies: "Ogerpon",
|
||||
forme: "Kitsune",
|
||||
types: ["Fairy"],
|
||||
gender: "F",
|
||||
baseStats: { hp: 100, atk: 100, def: 100, spa: 100, spd: 100, spe: 100 },
|
||||
abilities: { 0: "Protean" },
|
||||
heightm: 1.2,
|
||||
weightkg: 39.8,
|
||||
color: "Green",
|
||||
eggGroups: ["Undiscovered"],
|
||||
},
|
||||
};
|
||||
17
data/mods/sixbysix/rulesets.ts
Normal file
17
data/mods/sixbysix/rulesets.ts
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
export const Rulesets: import('../../../sim/dex-formats').ModdedFormatDataTable = {
|
||||
spriteviewer: {
|
||||
effectType: 'ValidatorRule',
|
||||
name: 'Sprite Viewer',
|
||||
desc: "Displays a fakemon's sprite in chat when it is switched in for the first time",
|
||||
onBegin() {
|
||||
this.add('rule', 'Sprite Viewer: Displays sprites in chat');
|
||||
},
|
||||
onSwitchIn(pokemon) {
|
||||
if (!this.effectState[pokemon.species.id]) {
|
||||
this.add('-message', `${pokemon.species.name}'s Sprite:`);
|
||||
this.add(`raw|<img src="https://raw.githubusercontent.com/scoopapa/DH2/refs/heads/main/data/mods/sixbysix/sprites/front/${pokemon.species.id}.png" height="96" width="96">`);
|
||||
this.effectState[pokemon.species.id] = true;
|
||||
}
|
||||
},
|
||||
},
|
||||
};
|
||||
|
|
@ -1,3 +1,3 @@
|
|||
export const Scripts: ModdedBattleScriptsData = {
|
||||
gen: 9,
|
||||
};
|
||||
export const Scripts: ModdedBattleScriptsData = {
|
||||
gen: 9,
|
||||
};
|
||||
|
|
@ -3480,7 +3480,7 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = {
|
|||
flags: { protect: 1, reflectable: 1, mirror: 1, metronome: 1, nosketch: 1 },
|
||||
status: 'slp',
|
||||
onTry(source, target, move) {
|
||||
if (source.species.name === 'Darkrai' || move.hasBounced) {
|
||||
if (source.species.baseSpecies === 'Darkrai' || move.hasBounced) {
|
||||
return;
|
||||
}
|
||||
this.add('-fail', source, 'move: Dark Void');
|
||||
|
|
@ -14914,10 +14914,9 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = {
|
|||
priority: 0,
|
||||
flags: { contact: 1, protect: 1, mirror: 1, metronome: 1 },
|
||||
beforeTurnCallback(pokemon) {
|
||||
for (const side of this.sides) {
|
||||
if (side.hasAlly(pokemon)) continue;
|
||||
side.addSideCondition('pursuit', pokemon);
|
||||
const data = side.getSideConditionData('pursuit');
|
||||
for (const target of pokemon.foes()) {
|
||||
target.addVolatile('pursuit');
|
||||
const data = target.volatiles['pursuit'];
|
||||
if (!data.sources) {
|
||||
data.sources = [];
|
||||
}
|
||||
|
|
@ -14927,9 +14926,6 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = {
|
|||
onModifyMove(move, source, target) {
|
||||
if (target?.beingCalledBack || target?.switchFlag) move.accuracy = true;
|
||||
},
|
||||
onTryHit(target, pokemon) {
|
||||
target.side.removeSideCondition('pursuit');
|
||||
},
|
||||
condition: {
|
||||
duration: 1,
|
||||
onBeforeSwitchOut(pokemon) {
|
||||
|
|
@ -17213,35 +17209,8 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = {
|
|||
pp: 10,
|
||||
priority: 0,
|
||||
flags: { protect: 1, mirror: 1, bypasssub: 1, allyanim: 1, metronome: 1 },
|
||||
onTryHit(target, source) {
|
||||
const targetAbility = target.getAbility();
|
||||
const sourceAbility = source.getAbility();
|
||||
if (sourceAbility.flags['failskillswap'] || targetAbility.flags['failskillswap'] || target.volatiles['dynamax']) {
|
||||
return false;
|
||||
}
|
||||
const sourceCanBeSet = this.runEvent('SetAbility', source, source, this.effect, targetAbility);
|
||||
if (!sourceCanBeSet) return sourceCanBeSet;
|
||||
const targetCanBeSet = this.runEvent('SetAbility', target, source, this.effect, sourceAbility);
|
||||
if (!targetCanBeSet) return targetCanBeSet;
|
||||
},
|
||||
onHit(target, source, move) {
|
||||
const targetAbility = target.getAbility();
|
||||
const sourceAbility = source.getAbility();
|
||||
if (target.isAlly(source)) {
|
||||
this.add('-activate', source, 'move: Skill Swap', '', '', `[of] ${target}`);
|
||||
} else {
|
||||
this.add('-activate', source, 'move: Skill Swap', targetAbility, sourceAbility, `[of] ${target}`);
|
||||
}
|
||||
this.singleEvent('End', sourceAbility, source.abilityState, source);
|
||||
this.singleEvent('End', targetAbility, target.abilityState, target);
|
||||
source.ability = targetAbility.id;
|
||||
target.ability = sourceAbility.id;
|
||||
source.abilityState = this.initEffectState({ id: this.toID(source.ability), target: source });
|
||||
target.abilityState = this.initEffectState({ id: this.toID(target.ability), target });
|
||||
source.volatileStaleness = undefined;
|
||||
if (!target.isAlly(source)) target.volatileStaleness = 'external';
|
||||
this.singleEvent('Start', targetAbility, source.abilityState, source);
|
||||
this.singleEvent('Start', sourceAbility, target.abilityState, target);
|
||||
return this.skillSwap(source, target);
|
||||
},
|
||||
secondary: null,
|
||||
target: "normal",
|
||||
|
|
|
|||
|
|
@ -926,7 +926,7 @@
|
|||
]
|
||||
},
|
||||
"swanna": {
|
||||
"level": 84,
|
||||
"level": 82,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Fast Attacker",
|
||||
|
|
@ -937,7 +937,7 @@
|
|||
]
|
||||
},
|
||||
"typhlosionmega": {
|
||||
"level": 84,
|
||||
"level": 82,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Fast Attacker",
|
||||
|
|
@ -954,7 +954,7 @@
|
|||
]
|
||||
},
|
||||
"terapagos": {
|
||||
"level": 84,
|
||||
"level": 82,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Bulky Setup",
|
||||
|
|
@ -982,7 +982,7 @@
|
|||
]
|
||||
},
|
||||
"genesectburn": {
|
||||
"level": 84,
|
||||
"level": 82,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Wallbreaker",
|
||||
|
|
@ -1004,7 +1004,7 @@
|
|||
]
|
||||
},
|
||||
"genesectdouse": {
|
||||
"level": 84,
|
||||
"level": 82,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Wallbreaker",
|
||||
|
|
@ -1015,7 +1015,7 @@
|
|||
]
|
||||
},
|
||||
"genesectshock": {
|
||||
"level": 84,
|
||||
"level": 80,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Wallbreaker",
|
||||
|
|
@ -1162,5 +1162,27 @@
|
|||
"teraTypes": ["Grass"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"wobbuffet": {
|
||||
"level": 84,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Bulky Support",
|
||||
"movepool": ["Counter", "Mirror Coat", "Shed Tail", "Encore", "Guillotine", "Night Shade"],
|
||||
"abilities": ["Jello Body"],
|
||||
"teraTypes": ["Dark", "Steel"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"raticatemega": {
|
||||
"level": 84,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Fast Attacker",
|
||||
"movepool": ["Super Fang", "Hyper Fang", "Last Breakfast", "U-turn"],
|
||||
"abilities": ["Hustle"],
|
||||
"teraTypes": ["Normal"]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -236,6 +236,8 @@ export class RandomChatBatsTeams extends RandomTeams {
|
|||
if (species.id === 'feraligatrmega') this.incompatibleMoves(moves, movePool, 'thunderfang', 'poisonfang');
|
||||
if (species.id === 'salazzle') this.incompatibleMoves(moves, movePool, 'malignantchain', 'venoshock');
|
||||
if (species.id === 'glimmora') this.incompatibleMoves(moves, movePool, 'powergem', 'meteorbeam');
|
||||
if (species.id === 'wobbuffet') this.incompatibleMoves(moves, movePool, 'shedtail', 'encore');
|
||||
if (species.id === 'wobbuffet') this.incompatibleMoves(moves, movePool, 'nightshade', 'guillotine');
|
||||
}
|
||||
|
||||
override randomMoveset(
|
||||
|
|
@ -724,6 +726,7 @@ export class RandomChatBatsTeams extends RandomTeams {
|
|||
if (species.id === 'ogerponcornerstone') return 'Cornerstone Mask';
|
||||
if (species.id === 'glimmora' && moves.has('meteorbeam')) return 'Power Herb';
|
||||
if (species.id === 'glimmora') return 'Air Balloon';
|
||||
if (species.id === 'wobbuffet') return 'Covert Cloak';
|
||||
}
|
||||
|
||||
override randomSet(
|
||||
|
|
@ -897,7 +900,7 @@ export class RandomChatBatsTeams extends RandomTeams {
|
|||
let leadsRemaining = this.format.gameType === 'doubles' ? 2 : 1;
|
||||
while (baseSpeciesPool.length && pokemon.length < this.maxTeamSize) {
|
||||
const baseSpecies = this.sampleNoReplace(baseSpeciesPool);
|
||||
if (hasMega && (baseSpecies === "Typhlosion" || baseSpecies === "Altaria")) continue;
|
||||
if (hasMega && (baseSpecies === "Typhlosion" || baseSpecies === "Altaria" || baseSpecies === "Raticate")) continue;
|
||||
const currentSpeciesPool: Species[] = [];
|
||||
// Check if the base species has a mega forme available
|
||||
// let canMega = false;
|
||||
|
|
@ -1008,7 +1011,7 @@ export class RandomChatBatsTeams extends RandomTeams {
|
|||
// if (potd?.exists && (pokemon.length === 1 || this.maxTeamSize === 1)) species = potd;
|
||||
|
||||
// testing code
|
||||
// if (pokemon.length === 0 || this.maxTeamSize === 1) species = this.dex.species.get('Feraligatr-Mega');
|
||||
// if (pokemon.length === 0 || this.maxTeamSize === 1) species = this.dex.species.get('Raticate-Mega');
|
||||
|
||||
let set: RandomTeamsTypes.RandomSet;
|
||||
|
||||
|
|
|
|||
|
|
@ -574,7 +574,8 @@
|
|||
},
|
||||
"mrmime": {
|
||||
"level": 75,
|
||||
"moves": ["psychic", "seismictoss", "thunderbolt", "thunderwave"]
|
||||
"moves": ["psychic", "thunderbolt", "thunderwave"],
|
||||
"exclusiveMoves": ["counter", "seismictoss", "seismictoss"]
|
||||
},
|
||||
"scyther": {
|
||||
"level": 75,
|
||||
|
|
@ -608,7 +609,8 @@
|
|||
},
|
||||
"gyarados": {
|
||||
"level": 74,
|
||||
"moves": ["blizzard", "bodyslam", "bodyslam", "hyperbeam", "thunderbolt"],
|
||||
"moves": ["blizzard", "hyperbeam", "thunderbolt"],
|
||||
"essentialMoves": ["bodyslam"],
|
||||
"exclusiveMoves": ["hydropump", "surf", "surf"]
|
||||
},
|
||||
"lapras": {
|
||||
|
|
@ -658,8 +660,7 @@
|
|||
},
|
||||
"kabuto": {
|
||||
"level": 88,
|
||||
"moves": ["blizzard", "bodyslam", "slash"],
|
||||
"exclusiveMoves": ["hydropump", "surf", "surf"]
|
||||
"moves": ["blizzard", "bodyslam", "slash", "surf"]
|
||||
},
|
||||
"kabutops": {
|
||||
"level": 75,
|
||||
|
|
@ -704,8 +705,8 @@
|
|||
},
|
||||
"dragonite": {
|
||||
"level": 74,
|
||||
"moves": ["bodyslam", "hyperbeam", "thunderbolt", "thunderwave", "thunderwave"],
|
||||
"essentialMoves": ["blizzard"]
|
||||
"moves": ["bodyslam", "hyperbeam", "thunderbolt"],
|
||||
"essentialMoves": ["blizzard", "thunderwave"]
|
||||
},
|
||||
"mewtwo": {
|
||||
"level": 60,
|
||||
|
|
|
|||
|
|
@ -387,7 +387,7 @@
|
|||
"sets": [
|
||||
{
|
||||
"role": "Setup Sweeper",
|
||||
"movepool": ["calmmind", "encore", "firepunch", "icepunch", "psychic", "recover", "substitute", "thunderpunch"],
|
||||
"movepool": ["calmmind", "encore", "firepunch", "hiddenpowerdark", "psychic", "recover", "substitute", "thunderpunch"],
|
||||
"abilities": ["Synchronize"],
|
||||
"preferredTypes": ["Fire"]
|
||||
}
|
||||
|
|
@ -474,7 +474,7 @@
|
|||
},
|
||||
{
|
||||
"role": "Setup Sweeper",
|
||||
"movepool": ["calmmind", "psychic", "rest", "surf"],
|
||||
"movepool": ["calmmind", "psychic", "surf", "thunderwave"],
|
||||
"abilities": ["Own Tempo"]
|
||||
},
|
||||
{
|
||||
|
|
@ -544,13 +544,13 @@
|
|||
"sets": [
|
||||
{
|
||||
"role": "Wallbreaker",
|
||||
"movepool": ["explosion", "fireblast", "hiddenpowerground", "rest", "sludgebomb", "toxic"],
|
||||
"movepool": ["explosion", "fireblast", "hiddenpowerground", "sludgebomb", "toxic"],
|
||||
"abilities": ["Sticky Hold"],
|
||||
"preferredTypes": ["Ground"]
|
||||
},
|
||||
{
|
||||
"role": "Setup Sweeper",
|
||||
"movepool": ["curse", "hiddenpowerground", "rest", "sludgebomb"],
|
||||
"movepool": ["curse", "explosion", "hiddenpowerground", "sludgebomb"],
|
||||
"abilities": ["Sticky Hold"]
|
||||
}
|
||||
]
|
||||
|
|
@ -1063,7 +1063,7 @@
|
|||
"sets": [
|
||||
{
|
||||
"role": "Setup Sweeper",
|
||||
"movepool": ["doubleedge", "dragondance", "earthquake", "healbell", "hiddenpowerflying", "rest", "substitute"],
|
||||
"movepool": ["doubleedge", "dragondance", "earthquake", "healbell", "hiddenpowerflying", "substitute"],
|
||||
"abilities": ["Inner Focus"],
|
||||
"preferredTypes": ["Ground"]
|
||||
},
|
||||
|
|
@ -1479,7 +1479,7 @@
|
|||
},
|
||||
{
|
||||
"role": "Setup Sweeper",
|
||||
"movepool": ["calmmind", "psychic", "rest", "surf"],
|
||||
"movepool": ["calmmind", "psychic", "surf", "thunderwave"],
|
||||
"abilities": ["Own Tempo"]
|
||||
},
|
||||
{
|
||||
|
|
@ -1564,7 +1564,7 @@
|
|||
"sets": [
|
||||
{
|
||||
"role": "Bulky Setup",
|
||||
"movepool": ["bodyslam", "curse", "earthquake", "rest", "shadowball"],
|
||||
"movepool": ["bodyslam", "curse", "earthquake", "rest", "shadowball", "sleeptalk"],
|
||||
"abilities": ["Serene Grace"]
|
||||
},
|
||||
{
|
||||
|
|
@ -2482,11 +2482,6 @@
|
|||
"role": "Bulky Support",
|
||||
"movepool": ["encore", "moonlight", "seismictoss", "thunderwave", "toxic"],
|
||||
"abilities": ["Oblivious"]
|
||||
},
|
||||
{
|
||||
"role": "Generalist",
|
||||
"movepool": ["batonpass", "encore", "seismictoss", "substitute", "thunderwave", "toxic"],
|
||||
"abilities": ["Oblivious"]
|
||||
}
|
||||
]
|
||||
},
|
||||
|
|
@ -2561,7 +2556,7 @@
|
|||
"sets": [
|
||||
{
|
||||
"role": "Bulky Attacker",
|
||||
"movepool": ["explosion", "fireblast", "flamethrower", "hiddenpowergrass", "rest", "toxic"],
|
||||
"movepool": ["explosion", "fireblast", "flamethrower", "hiddenpowergrass", "toxic"],
|
||||
"abilities": ["White Smoke"]
|
||||
}
|
||||
]
|
||||
|
|
@ -2571,7 +2566,7 @@
|
|||
"sets": [
|
||||
{
|
||||
"role": "Setup Sweeper",
|
||||
"movepool": ["calmmind", "firepunch", "psychic", "substitute", "thunderpunch"],
|
||||
"movepool": ["calmmind", "firepunch", "hiddenpowerdark", "psychic", "substitute"],
|
||||
"abilities": ["Thick Fat"],
|
||||
"preferredTypes": ["Fire"]
|
||||
}
|
||||
|
|
@ -2602,11 +2597,11 @@
|
|||
},
|
||||
{
|
||||
"role": "Staller",
|
||||
"movepool": ["dragonclaw", "earthquake", "fireblast", "protect", "toxic"],
|
||||
"movepool": ["dragonclaw", "earthquake", "fireblast", "protect", "rockslide", "toxic"],
|
||||
"abilities": ["Levitate"]
|
||||
},
|
||||
{
|
||||
"role": "Bulky Attacker",
|
||||
"role": "Staller",
|
||||
"movepool": ["dragonclaw", "earthquake", "fireblast", "rockslide", "substitute", "toxic"],
|
||||
"abilities": ["Levitate"]
|
||||
}
|
||||
|
|
@ -3053,7 +3048,12 @@
|
|||
"sets": [
|
||||
{
|
||||
"role": "Wallbreaker",
|
||||
"movepool": ["earthquake", "hiddenpowerbug", "overheat", "rockslide", "substitute", "swordsdance", "thunderwave"],
|
||||
"movepool": ["earthquake", "overheat", "rockslide", "thunderwave"],
|
||||
"abilities": ["Drought"]
|
||||
},
|
||||
{
|
||||
"role": "Setup Sweeper",
|
||||
"movepool": ["earthquake", "hiddenpowerbug", "rockslide", "substitute", "swordsdance", "thunderwave"],
|
||||
"abilities": ["Drought"],
|
||||
"preferredTypes": ["Rock"]
|
||||
}
|
||||
|
|
@ -3086,9 +3086,8 @@
|
|||
},
|
||||
{
|
||||
"role": "Setup Sweeper",
|
||||
"movepool": ["calmmind", "firepunch", "icepunch", "psychic", "substitute", "thunderbolt"],
|
||||
"abilities": ["Serene Grace"],
|
||||
"preferredTypes": ["Fire"]
|
||||
"movepool": ["calmmind", "firepunch", "icepunch", "psychic", "thunderbolt"],
|
||||
"abilities": ["Serene Grace"]
|
||||
}
|
||||
]
|
||||
},
|
||||
|
|
@ -3097,7 +3096,7 @@
|
|||
"sets": [
|
||||
{
|
||||
"role": "Fast Attacker",
|
||||
"movepool": ["extremespeed", "firepunch", "icebeam", "psychoboost", "shadowball", "superpower"],
|
||||
"movepool": ["extremespeed", "icebeam", "psychoboost", "shadowball", "superpower"],
|
||||
"abilities": ["Pressure"],
|
||||
"preferredTypes": ["Fighting", "Ghost"]
|
||||
}
|
||||
|
|
@ -3108,7 +3107,7 @@
|
|||
"sets": [
|
||||
{
|
||||
"role": "Fast Attacker",
|
||||
"movepool": ["extremespeed", "firepunch", "icebeam", "psychoboost", "shadowball", "superpower"],
|
||||
"movepool": ["extremespeed", "icebeam", "psychoboost", "shadowball", "superpower"],
|
||||
"abilities": ["Pressure"],
|
||||
"preferredTypes": ["Fighting", "Ghost"]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -467,16 +467,10 @@ export class RandomGen3Teams extends RandomGen4Teams {
|
|||
if (species.id === 'marowak') return 'Thick Club';
|
||||
if (species.id === 'pikachu') return 'Light Ball';
|
||||
if (species.id === 'shedinja') return 'Lum Berry';
|
||||
if (species.id === 'shuckle') return 'Leftovers';
|
||||
if (species.id === 'unown') return counter.get('Physical') ? 'Choice Band' : 'Twisted Spoon';
|
||||
if (species.id === 'deoxys' || species.id === 'deoxysattack') return 'White Herb';
|
||||
|
||||
if (moves.has('trick')) return 'Choice Band';
|
||||
if (
|
||||
moves.has('rest') && !moves.has('sleeptalk') &&
|
||||
// Altaria wants Chesto Berry on Dragon Dance + Rest
|
||||
(moves.has('dragondance') || !['Early Bird', 'Natural Cure', 'Shed Skin'].includes(ability))
|
||||
) return 'Chesto Berry';
|
||||
|
||||
// Medium priority items
|
||||
if (counter.get('Physical') >= 4) return 'Choice Band';
|
||||
|
|
|
|||
|
|
@ -1325,7 +1325,7 @@
|
|||
"sets": [
|
||||
{
|
||||
"role": "Fast Support",
|
||||
"movepool": ["destinybond", "explosion", "spikes", "thunderwave", "toxicspikes", "waterfall"],
|
||||
"movepool": ["destinybond", "explosion", "poisonjab", "spikes", "thunderwave", "toxicspikes", "waterfall"],
|
||||
"abilities": ["Poison Point", "Swift Swim"]
|
||||
}
|
||||
]
|
||||
|
|
@ -2123,9 +2123,14 @@
|
|||
"sets": [
|
||||
{
|
||||
"role": "Fast Attacker",
|
||||
"movepool": ["hiddenpowergrass", "hydropump", "icebeam", "selfdestruct", "waterspout"],
|
||||
"movepool": ["hydropump", "icebeam", "selfdestruct", "waterspout"],
|
||||
"abilities": ["Water Veil"],
|
||||
"preferredTypes": ["Ice"]
|
||||
},
|
||||
{
|
||||
"role": "Bulky Attacker",
|
||||
"movepool": ["icebeam", "selfdestruct", "surf", "toxic"],
|
||||
"abilities": ["Water Veil"]
|
||||
}
|
||||
]
|
||||
},
|
||||
|
|
@ -3022,9 +3027,14 @@
|
|||
"movepool": ["destinybond", "hiddenpowerfighting", "painsplit", "shadowball", "substitute", "taunt", "willowisp"],
|
||||
"abilities": ["Levitate"]
|
||||
},
|
||||
{
|
||||
"role": "Setup Sweeper",
|
||||
"movepool": ["hiddenpowerfighting", "nastyplot", "shadowball", "substitute", "thunderbolt"],
|
||||
"abilities": ["Levitate"]
|
||||
},
|
||||
{
|
||||
"role": "Wallbreaker",
|
||||
"movepool": ["hiddenpowerfighting", "nastyplot", "shadowball", "thunderbolt", "trick"],
|
||||
"movepool": ["hiddenpowerfighting", "shadowball", "thunderbolt", "trick"],
|
||||
"abilities": ["Levitate"]
|
||||
}
|
||||
]
|
||||
|
|
|
|||
|
|
@ -3065,9 +3065,14 @@
|
|||
"abilities": ["Levitate"]
|
||||
},
|
||||
{
|
||||
"role": "Wallbreaker",
|
||||
"movepool": ["hiddenpowerfighting", "nastyplot", "shadowball", "thunderbolt", "trick"],
|
||||
"role": "Setup Sweeper",
|
||||
"movepool": ["hiddenpowerfighting", "nastyplot", "shadowball", "substitute", "thunderbolt"],
|
||||
"abilities": ["Levitate"]
|
||||
},
|
||||
{
|
||||
"role": "Wallbreaker",
|
||||
"movepool": ["hiddenpowerfighting", "shadowball", "thunderbolt", "trick"],
|
||||
"abilities": ["Levitate"]
|
||||
}
|
||||
]
|
||||
},
|
||||
|
|
@ -3274,7 +3279,7 @@
|
|||
{
|
||||
"role": "Fast Attacker",
|
||||
"movepool": ["flashcannon", "hiddenpowerfire", "hiddenpowerground", "hiddenpowerice", "thunderbolt", "voltswitch"],
|
||||
"abilities": ["Magnet Pull"]
|
||||
"abilities": ["Analytic", "Magnet Pull"]
|
||||
},
|
||||
{
|
||||
"role": "Staller",
|
||||
|
|
@ -4574,7 +4579,7 @@
|
|||
},
|
||||
{
|
||||
"role": "Wallbreaker",
|
||||
"movepool": ["bugbuzz", "energyball", "thunder", "voltswitch"],
|
||||
"movepool": ["bugbuzz", "gigadrain", "thunder", "voltswitch"],
|
||||
"abilities": ["Compound Eyes"]
|
||||
}
|
||||
]
|
||||
|
|
|
|||
|
|
@ -31,6 +31,11 @@
|
|||
"role": "Bulky Attacker",
|
||||
"movepool": ["airslash", "earthquake", "fireblast", "roost", "willowisp"],
|
||||
"abilities": ["Blaze", "Solar Power"]
|
||||
},
|
||||
{
|
||||
"role": "Setup Sweeper",
|
||||
"movepool": ["acrobatics", "earthquake", "flareblitz", "swordsdance"],
|
||||
"abilities": ["Blaze"]
|
||||
}
|
||||
]
|
||||
},
|
||||
|
|
@ -791,9 +796,14 @@
|
|||
"sets": [
|
||||
{
|
||||
"role": "Fast Attacker",
|
||||
"movepool": ["dazzlinggleam", "encore", "focusblast", "healingwish", "nastyplot", "psychic", "psyshock", "shadowball"],
|
||||
"movepool": ["dazzlinggleam", "encore", "focusblast", "healingwish", "psychic", "psyshock", "shadowball", "thunderbolt"],
|
||||
"abilities": ["Filter"],
|
||||
"preferredTypes": ["Psychic"]
|
||||
"preferredTypes": ["Fighting"]
|
||||
},
|
||||
{
|
||||
"role": "Setup Sweeper",
|
||||
"movepool": ["dazzlinggleam", "encore", "focusblast", "nastyplot", "psychic", "psyshock"],
|
||||
"abilities": ["Filter"]
|
||||
}
|
||||
]
|
||||
},
|
||||
|
|
@ -1500,7 +1510,7 @@
|
|||
"sets": [
|
||||
{
|
||||
"role": "Fast Support",
|
||||
"movepool": ["destinybond", "spikes", "taunt", "thunderwave", "toxicspikes", "waterfall"],
|
||||
"movepool": ["destinybond", "poisonjab", "spikes", "taunt", "thunderwave", "toxicspikes", "waterfall"],
|
||||
"abilities": ["Intimidate"]
|
||||
}
|
||||
]
|
||||
|
|
@ -1617,12 +1627,14 @@
|
|||
{
|
||||
"role": "Wallbreaker",
|
||||
"movepool": ["energyball", "fireblast", "gunkshot", "hydropump", "icebeam", "scald"],
|
||||
"abilities": ["Sniper"]
|
||||
"abilities": ["Sniper"],
|
||||
"preferredTypes": ["Poison"]
|
||||
},
|
||||
{
|
||||
"role": "Bulky Attacker",
|
||||
"movepool": ["energyball", "fireblast", "gunkshot", "icebeam", "scald", "thunderwave"],
|
||||
"abilities": ["Sniper"]
|
||||
"abilities": ["Sniper"],
|
||||
"preferredTypes": ["Poison"]
|
||||
}
|
||||
]
|
||||
},
|
||||
|
|
@ -2263,8 +2275,13 @@
|
|||
"level": 86,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Wallbreaker",
|
||||
"movepool": ["aquatail", "earthquake", "headsmash", "heavyslam", "rockpolish", "stealthrock"],
|
||||
"role": "Setup Sweeper",
|
||||
"movepool": ["earthquake", "headsmash", "heavyslam", "rockpolish"],
|
||||
"abilities": ["Rock Head"]
|
||||
},
|
||||
{
|
||||
"role": "Bulky Attacker",
|
||||
"movepool": ["aquatail", "earthquake", "headsmash", "heavyslam", "stealthrock"],
|
||||
"abilities": ["Rock Head"],
|
||||
"preferredTypes": ["Ground"]
|
||||
}
|
||||
|
|
@ -3273,12 +3290,7 @@
|
|||
"sets": [
|
||||
{
|
||||
"role": "Bulky Support",
|
||||
"movepool": ["metalburst", "roar", "rockblast", "stealthrock", "toxic"],
|
||||
"abilities": ["Sturdy"]
|
||||
},
|
||||
{
|
||||
"role": "Staller",
|
||||
"movepool": ["metalburst", "protect", "roar", "rockblast", "stealthrock", "toxic"],
|
||||
"movepool": ["metalburst", "protect", "roar", "rockslide", "stealthrock", "toxic"],
|
||||
"abilities": ["Sturdy"]
|
||||
}
|
||||
]
|
||||
|
|
@ -3689,7 +3701,7 @@
|
|||
{
|
||||
"role": "Fast Attacker",
|
||||
"movepool": ["flashcannon", "hiddenpowerground", "thunderbolt", "voltswitch"],
|
||||
"abilities": ["Magnet Pull"]
|
||||
"abilities": ["Analytic", "Magnet Pull"]
|
||||
},
|
||||
{
|
||||
"role": "Staller",
|
||||
|
|
@ -5893,11 +5905,6 @@
|
|||
"sylveon": {
|
||||
"level": 84,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Bulky Attacker",
|
||||
"movepool": ["calmmind", "hiddenpowerground", "hypervoice", "protect", "psyshock", "wish"],
|
||||
"abilities": ["Pixilate"]
|
||||
},
|
||||
{
|
||||
"role": "Bulky Setup",
|
||||
"movepool": ["calmmind", "hypervoice", "protect", "wish"],
|
||||
|
|
|
|||
|
|
@ -97,7 +97,7 @@ export class RandomGen6Teams extends RandomGen7Teams {
|
|||
Normal: movePool => movePool.includes('boomburst'),
|
||||
Poison: (movePool, moves, abilities, types, counter) => !counter.get('Poison'),
|
||||
Psychic: (movePool, moves, abilities, types, counter) => (
|
||||
!counter.get('Psychic') && (types.has('Fighting') || movePool.includes('calmmind'))
|
||||
!counter.get('Psychic') && (types.has('Fighting') || types.has('Fairy') || movePool.includes('calmmind'))
|
||||
),
|
||||
Rock: (movePool, moves, abilities, types, counter, species) => (!counter.get('Rock') && species.baseStats.atk >= 80),
|
||||
Steel: (movePool, moves, abilities, types, counter, species) => (!counter.get('Steel') && species.baseStats.atk >= 100),
|
||||
|
|
@ -250,6 +250,8 @@ export class RandomGen6Teams extends RandomGen7Teams {
|
|||
['switcheroo', 'suckerpunch'],
|
||||
// Jirachi
|
||||
['bodyslam', 'healingwish'],
|
||||
// Bastiodon
|
||||
[['roar', 'protect'], ['metalburst', 'protect']],
|
||||
];
|
||||
|
||||
for (const pair of incompatiblePairs) this.incompatibleMoves(moves, movePool, pair[0], pair[1]);
|
||||
|
|
@ -732,12 +734,6 @@ export class RandomGen6Teams extends RandomGen7Teams {
|
|||
)
|
||||
) return 'Rocky Helmet';
|
||||
if (['kingsshield', 'protect', 'spikyshield', 'substitute'].some(m => moves.has(m))) return 'Leftovers';
|
||||
if (
|
||||
this.dex.getEffectiveness('Ground', species) >= 2 &&
|
||||
ability !== 'Levitate'
|
||||
) {
|
||||
return 'Air Balloon';
|
||||
}
|
||||
if (
|
||||
(role === 'Fast Support' || moves.has('stickyweb')) && isLead && defensiveStatTotal < 255 &&
|
||||
!counter.get('recovery') && (counter.get('hazards') || counter.get('setup')) &&
|
||||
|
|
|
|||
|
|
@ -33,6 +33,11 @@
|
|||
"abilities": ["Blaze", "Solar Power"],
|
||||
"preferredTypes": ["Normal"]
|
||||
},
|
||||
{
|
||||
"role": "Setup Sweeper",
|
||||
"movepool": ["acrobatics", "earthquake", "flareblitz", "swordsdance"],
|
||||
"abilities": ["Blaze"]
|
||||
},
|
||||
{
|
||||
"role": "Bulky Attacker",
|
||||
"movepool": ["airslash", "earthquake", "fireblast", "roost", "willowisp"],
|
||||
|
|
@ -975,9 +980,14 @@
|
|||
"sets": [
|
||||
{
|
||||
"role": "Fast Attacker",
|
||||
"movepool": ["dazzlinggleam", "encore", "focusblast", "healingwish", "nastyplot", "psychic", "psyshock", "shadowball"],
|
||||
"movepool": ["dazzlinggleam", "encore", "focusblast", "healingwish", "psychic", "psyshock", "shadowball", "thunderbolt"],
|
||||
"abilities": ["Filter"],
|
||||
"preferredTypes": ["Psychic"]
|
||||
"preferredTypes": ["Fighting"]
|
||||
},
|
||||
{
|
||||
"role": "Setup Sweeper",
|
||||
"movepool": ["dazzlinggleam", "encore", "focusblast", "nastyplot", "psychic", "psyshock"],
|
||||
"abilities": ["Filter"]
|
||||
}
|
||||
]
|
||||
},
|
||||
|
|
@ -1716,7 +1726,7 @@
|
|||
"sets": [
|
||||
{
|
||||
"role": "Fast Support",
|
||||
"movepool": ["destinybond", "spikes", "taunt", "thunderwave", "toxicspikes", "waterfall"],
|
||||
"movepool": ["destinybond", "poisonjab", "spikes", "taunt", "thunderwave", "toxicspikes", "waterfall"],
|
||||
"abilities": ["Intimidate"]
|
||||
}
|
||||
]
|
||||
|
|
@ -1770,10 +1780,15 @@
|
|||
"level": 82,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Wallbreaker",
|
||||
"role": "Setup Sweeper",
|
||||
"movepool": ["closecombat", "facade", "knockoff", "swordsdance"],
|
||||
"abilities": ["Guts"]
|
||||
},
|
||||
{
|
||||
"role": "Wallbreaker",
|
||||
"movepool": ["closecombat", "facade", "knockoff", "megahorn"],
|
||||
"abilities": ["Guts"]
|
||||
},
|
||||
{
|
||||
"role": "Fast Attacker",
|
||||
"movepool": ["closecombat", "knockoff", "megahorn", "stoneedge"],
|
||||
|
|
@ -2493,8 +2508,13 @@
|
|||
"level": 87,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Wallbreaker",
|
||||
"movepool": ["aquatail", "earthquake", "headsmash", "heavyslam", "rockpolish", "stealthrock"],
|
||||
"role": "Setup Sweeper",
|
||||
"movepool": ["earthquake", "headsmash", "heavyslam", "rockpolish"],
|
||||
"abilities": ["Rock Head"]
|
||||
},
|
||||
{
|
||||
"role": "Bulky Attacker",
|
||||
"movepool": ["aquatail", "earthquake", "headsmash", "heavyslam", "stealthrock"],
|
||||
"abilities": ["Rock Head"],
|
||||
"preferredTypes": ["Ground"]
|
||||
}
|
||||
|
|
@ -3557,12 +3577,7 @@
|
|||
"sets": [
|
||||
{
|
||||
"role": "Bulky Support",
|
||||
"movepool": ["metalburst", "roar", "rockblast", "stealthrock", "toxic"],
|
||||
"abilities": ["Sturdy"]
|
||||
},
|
||||
{
|
||||
"role": "Staller",
|
||||
"movepool": ["metalburst", "protect", "roar", "rockblast", "stealthrock", "toxic"],
|
||||
"movepool": ["metalburst", "protect", "roar", "rockslide", "stealthrock", "toxic"],
|
||||
"abilities": ["Sturdy"]
|
||||
}
|
||||
]
|
||||
|
|
@ -4003,7 +4018,7 @@
|
|||
{
|
||||
"role": "Fast Attacker",
|
||||
"movepool": ["flashcannon", "hiddenpowerground", "thunderbolt", "voltswitch"],
|
||||
"abilities": ["Magnet Pull"]
|
||||
"abilities": ["Analytic", "Magnet Pull"]
|
||||
},
|
||||
{
|
||||
"role": "Staller",
|
||||
|
|
@ -6363,11 +6378,6 @@
|
|||
"sylveon": {
|
||||
"level": 85,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Bulky Attacker",
|
||||
"movepool": ["calmmind", "hiddenpowerground", "hypervoice", "protect", "psyshock", "wish"],
|
||||
"abilities": ["Pixilate"]
|
||||
},
|
||||
{
|
||||
"role": "Bulky Setup",
|
||||
"movepool": ["calmmind", "hypervoice", "protect", "wish"],
|
||||
|
|
@ -6833,7 +6843,7 @@
|
|||
"sets": [
|
||||
{
|
||||
"role": "AV Pivot",
|
||||
"movepool": ["earthquake", "hiddenpowergrass", "hydropump", "icebeam", "scald", "uturn"],
|
||||
"movepool": ["earthquake", "hydropump", "icebeam", "scald", "uturn"],
|
||||
"abilities": ["Schooling"],
|
||||
"preferredTypes": ["Ice"]
|
||||
},
|
||||
|
|
@ -7420,7 +7430,12 @@
|
|||
"sets": [
|
||||
{
|
||||
"role": "Bulky Attacker",
|
||||
"movepool": ["bulkup", "hornleech", "megahorn", "stoneedge", "superpower", "woodhammer"],
|
||||
"movepool": ["hornleech", "megahorn", "stoneedge", "superpower", "woodhammer"],
|
||||
"abilities": ["Grassy Surge"]
|
||||
},
|
||||
{
|
||||
"role": "Bulky Setup",
|
||||
"movepool": ["hornleech", "stoneedge", "superpower", "swordsdance", "woodhammer"],
|
||||
"abilities": ["Grassy Surge"]
|
||||
}
|
||||
]
|
||||
|
|
@ -7468,7 +7483,7 @@
|
|||
},
|
||||
{
|
||||
"role": "Z-Move user",
|
||||
"movepool": ["calmmind", "moonblast", "moongeistbeam", "psyshock", "roost"],
|
||||
"movepool": ["calmmind", "moongeistbeam", "psyshock", "roost"],
|
||||
"abilities": ["Shadow Shield"]
|
||||
}
|
||||
]
|
||||
|
|
@ -7477,7 +7492,7 @@
|
|||
"level": 79,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Fast Support",
|
||||
"role": "Bulky Attacker",
|
||||
"movepool": ["grassknot", "hiddenpowerfire", "hiddenpowerground", "powergem", "sludgewave", "stealthrock", "thunderbolt", "toxicspikes"],
|
||||
"abilities": ["Beast Boost"],
|
||||
"preferredTypes": ["Rock"]
|
||||
|
|
|
|||
|
|
@ -135,7 +135,7 @@ export class RandomGen7Teams extends RandomGen8Teams {
|
|||
Poison: (movePool, moves, abilities, types, counter) => !counter.get('Poison'),
|
||||
Psychic: (movePool, moves, abilities, types, counter) => (
|
||||
!counter.get('Psychic') && (
|
||||
types.has('Fighting') || movePool.includes('psychicfangs') || movePool.includes('calmmind')
|
||||
types.has('Fighting') || types.has('Fairy') || movePool.includes('psychicfangs') || movePool.includes('calmmind')
|
||||
)
|
||||
),
|
||||
Rock: (movePool, moves, abilities, types, counter, species) => (!counter.get('Rock') && species.baseStats.atk >= 80),
|
||||
|
|
@ -367,6 +367,8 @@ export class RandomGen7Teams extends RandomGen8Teams {
|
|||
['switcheroo', 'suckerpunch'],
|
||||
// Jirachi
|
||||
['bodyslam', 'healingwish'],
|
||||
// Bastiodon
|
||||
[['roar', 'protect'], ['metalburst', 'protect']],
|
||||
];
|
||||
|
||||
for (const pair of incompatiblePairs) this.incompatibleMoves(moves, movePool, pair[0], pair[1]);
|
||||
|
|
@ -955,12 +957,6 @@ export class RandomGen7Teams extends RandomGen8Teams {
|
|||
)
|
||||
) return 'Rocky Helmet';
|
||||
if (['kingsshield', 'protect', 'spikyshield', 'substitute'].some(m => moves.has(m))) return 'Leftovers';
|
||||
if (
|
||||
this.dex.getEffectiveness('Ground', species) >= 2 &&
|
||||
ability !== 'Levitate' && species.id !== 'golemalola'
|
||||
) {
|
||||
return 'Air Balloon';
|
||||
}
|
||||
if (
|
||||
(role === 'Fast Support' || moves.has('stickyweb')) && isLead && defensiveStatTotal < 255 &&
|
||||
!counter.get('recovery') && (counter.get('hazards') || counter.get('setup')) &&
|
||||
|
|
@ -1607,8 +1603,7 @@ export class RandomGen7Teams extends RandomGen8Teams {
|
|||
if (isMonotype) {
|
||||
// Prevents Mega Evolutions from breaking the type limits
|
||||
if (itemData.megaStone) {
|
||||
const megaSpecies = this.dex.species.get(Array.isArray(itemData.megaStone) ?
|
||||
itemData.megaStone[0] : itemData.megaStone);
|
||||
const megaSpecies = this.dex.species.get(Object.values(itemData.megaStone)[0]);
|
||||
if (types.length > megaSpecies.types.length) types = [species.types[0]];
|
||||
// Only check the second type because a Mega Evolution should always share the first type with its base forme.
|
||||
if (megaSpecies.types[1] && types[1] && megaSpecies.types[1] !== types[1]) {
|
||||
|
|
|
|||
|
|
@ -418,7 +418,7 @@
|
|||
},
|
||||
"articunogalar": {
|
||||
"level": 81,
|
||||
"moves": ["airslash", "calmmind", "freezingglare", "recover"],
|
||||
"moves": ["calmmind", "freezingglare", "hurricane", "recover"],
|
||||
"doublesLevel": 81,
|
||||
"doublesMoves": ["calmmind", "freezingglare", "hurricane", "recover", "tailwind"],
|
||||
"noDynamaxMoves": ["calmmind", "freezingglare", "hurricane", "recover"]
|
||||
|
|
@ -458,7 +458,7 @@
|
|||
},
|
||||
"mewtwo": {
|
||||
"level": 71,
|
||||
"moves": ["fireblast", "nastyplot", "psystrike", "recover", "shadowball"],
|
||||
"moves": ["aurasphere", "fireblast", "nastyplot", "psystrike", "recover"],
|
||||
"doublesLevel": 74,
|
||||
"doublesMoves": ["aurasphere", "icebeam", "nastyplot", "psystrike", "recover"]
|
||||
},
|
||||
|
|
@ -1820,7 +1820,7 @@
|
|||
},
|
||||
"sylveon": {
|
||||
"level": 83,
|
||||
"moves": ["calmmind", "hypervoice", "mysticalfire", "protect", "psyshock", "shadowball", "wish"],
|
||||
"moves": ["calmmind", "hypervoice", "mysticalfire", "protect", "psyshock", "wish"],
|
||||
"doublesLevel": 80,
|
||||
"doublesMoves": ["calmmind", "hypervoice", "mysticalfire", "protect", "psyshock"]
|
||||
},
|
||||
|
|
@ -2149,7 +2149,7 @@
|
|||
},
|
||||
"silvallyice": {
|
||||
"level": 83,
|
||||
"moves": ["flamecharge", "multiattack", "psychicfangs", "swordsdance"],
|
||||
"moves": ["flamecharge", "multiattack", "rockslide", "swordsdance"],
|
||||
"doublesLevel": 88,
|
||||
"doublesMoves": ["flamethrower", "multiattack", "partingshot", "tailwind", "thunderbolt"]
|
||||
},
|
||||
|
|
@ -2161,7 +2161,7 @@
|
|||
},
|
||||
"silvallypsychic": {
|
||||
"level": 83,
|
||||
"moves": ["crunch", "multiattack", "swordsdance", "uturn"],
|
||||
"moves": ["flamecharge", "multiattack", "swordsdance", "xscissor"],
|
||||
"doublesLevel": 88,
|
||||
"doublesMoves": ["flamethrower", "multiattack", "partingshot", "tailwind", "xscissor"]
|
||||
},
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -49,7 +49,7 @@
|
|||
},
|
||||
{
|
||||
"role": "Doubles Bulky Attacker",
|
||||
"movepool": ["Dragon Tail", "Glare", "Gunk Shot", "Knock Off", "Toxic Spikes"],
|
||||
"movepool": ["Glare", "Gunk Shot", "Knock Off", "Toxic Spikes"],
|
||||
"abilities": ["Intimidate"],
|
||||
"teraTypes": ["Dark"]
|
||||
}
|
||||
|
|
@ -186,7 +186,7 @@
|
|||
"role": "Doubles Support",
|
||||
"movepool": ["Aurora Veil", "Blizzard", "Moonblast", "Protect"],
|
||||
"abilities": ["Snow Warning"],
|
||||
"teraTypes": ["Ice", "Steel", "Water"]
|
||||
"teraTypes": ["Steel", "Water"]
|
||||
}
|
||||
]
|
||||
},
|
||||
|
|
@ -349,7 +349,7 @@
|
|||
"level": 85,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Doubles Bulky Attacker",
|
||||
"role": "Doubles Support",
|
||||
"movepool": ["Acid Spray", "Hydro Pump", "Icy Wind", "Knock Off", "Muddy Water", "Sludge Bomb", "Toxic Spikes"],
|
||||
"abilities": ["Clear Body"],
|
||||
"teraTypes": ["Grass"]
|
||||
|
|
@ -451,8 +451,8 @@
|
|||
"sets": [
|
||||
{
|
||||
"role": "Doubles Bulky Attacker",
|
||||
"movepool": ["Drain Punch", "Gunk Shot", "Haze", "Helping Hand", "Ice Punch", "Knock Off", "Poison Gas", "Poison Jab", "Shadow Sneak"],
|
||||
"abilities": ["Poison Touch"],
|
||||
"movepool": ["Drain Punch", "Gunk Shot", "Helping Hand", "Ice Punch", "Knock Off", "Poison Gas", "Poison Jab", "Shadow Sneak"],
|
||||
"abilities": ["Poison Touch", "Sticky Hold"],
|
||||
"teraTypes": ["Dark"]
|
||||
}
|
||||
]
|
||||
|
|
@ -589,9 +589,9 @@
|
|||
"level": 91,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Doubles Support",
|
||||
"role": "Doubles Bulky Attacker",
|
||||
"movepool": ["Clear Smog", "Fire Blast", "Gunk Shot", "Poison Gas", "Protect", "Taunt", "Will-O-Wisp"],
|
||||
"abilities": ["Levitate", "Neutralizing Gas"],
|
||||
"abilities": ["Levitate"],
|
||||
"teraTypes": ["Dark"]
|
||||
}
|
||||
]
|
||||
|
|
@ -602,13 +602,13 @@
|
|||
{
|
||||
"role": "Doubles Bulky Attacker",
|
||||
"movepool": ["Gunk Shot", "Poison Gas", "Protect", "Strange Steam", "Taunt", "Will-O-Wisp"],
|
||||
"abilities": ["Levitate", "Neutralizing Gas"],
|
||||
"abilities": ["Levitate"],
|
||||
"teraTypes": ["Dark", "Steel"]
|
||||
},
|
||||
{
|
||||
"role": "Offensive Protect",
|
||||
"movepool": ["Dazzling Gleam", "Fire Blast", "Gunk Shot", "Protect"],
|
||||
"abilities": ["Levitate", "Neutralizing Gas"],
|
||||
"abilities": ["Levitate"],
|
||||
"teraTypes": ["Fire"]
|
||||
}
|
||||
]
|
||||
|
|
@ -848,7 +848,7 @@
|
|||
"sets": [
|
||||
{
|
||||
"role": "Doubles Fast Attacker",
|
||||
"movepool": ["Freezing Glare", "Hurricane", "Protect", "Recover", "Tailwind"],
|
||||
"movepool": ["Freezing Glare", "Hurricane", "Protect", "Tailwind"],
|
||||
"abilities": ["Competitive"],
|
||||
"teraTypes": ["Flying", "Ground", "Steel"]
|
||||
}
|
||||
|
|
@ -886,10 +886,16 @@
|
|||
"level": 79,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Doubles Bulky Attacker",
|
||||
"movepool": ["Brave Bird", "Fire Blast", "Heat Wave", "Protect", "Scorching Sands", "Tailwind"],
|
||||
"role": "Doubles Support",
|
||||
"movepool": ["Brave Bird", "Fire Blast", "Heat Wave", "Protect", "Tailwind"],
|
||||
"abilities": ["Flame Body"],
|
||||
"teraTypes": ["Fire", "Ground"]
|
||||
},
|
||||
{
|
||||
"role": "Doubles Bulky Attacker",
|
||||
"movepool": ["Brave Bird", "Fire Blast", "Heat Wave", "Scorching Sands", "Tailwind"],
|
||||
"abilities": ["Flame Body"],
|
||||
"teraTypes": ["Ground"]
|
||||
}
|
||||
]
|
||||
},
|
||||
|
|
@ -1289,7 +1295,13 @@
|
|||
"sets": [
|
||||
{
|
||||
"role": "Doubles Bulky Attacker",
|
||||
"movepool": ["Crunch", "Gunk Shot", "Icy Wind", "Throat Chop", "Toxic Spikes"],
|
||||
"movepool": ["Crunch", "Gunk Shot", "Icy Wind", "Toxic Spikes"],
|
||||
"abilities": ["Intimidate"],
|
||||
"teraTypes": ["Flying"]
|
||||
},
|
||||
{
|
||||
"role": "Doubles Support",
|
||||
"movepool": ["Gunk Shot", "Icy Wind", "Throat Chop", "Toxic Spikes"],
|
||||
"abilities": ["Intimidate"],
|
||||
"teraTypes": ["Flying"]
|
||||
}
|
||||
|
|
@ -1538,7 +1550,7 @@
|
|||
"role": "Doubles Bulky Setup",
|
||||
"movepool": ["Dragon Dance", "High Horsepower", "Knock Off", "Protect", "Rock Slide", "Stone Edge"],
|
||||
"abilities": ["Sand Stream"],
|
||||
"teraTypes": ["Ghost", "Rock"]
|
||||
"teraTypes": ["Ghost"]
|
||||
},
|
||||
{
|
||||
"role": "Doubles Bulky Attacker",
|
||||
|
|
@ -1721,7 +1733,13 @@
|
|||
"sets": [
|
||||
{
|
||||
"role": "Doubles Bulky Attacker",
|
||||
"movepool": ["After You", "Double-Edge", "Encore", "Icy Wind", "Knock Off", "Slack Off", "Thunder Wave"],
|
||||
"movepool": ["Double-Edge", "Icy Wind", "Knock Off", "Slack Off", "Thunder Wave"],
|
||||
"abilities": ["Vital Spirit"],
|
||||
"teraTypes": ["Ghost"]
|
||||
},
|
||||
{
|
||||
"role": "Doubles Support",
|
||||
"movepool": ["Body Slam", "Encore", "Icy Wind", "Knock Off"],
|
||||
"abilities": ["Vital Spirit"],
|
||||
"teraTypes": ["Ghost"]
|
||||
}
|
||||
|
|
@ -1963,7 +1981,7 @@
|
|||
{
|
||||
"role": "Offensive Protect",
|
||||
"movepool": ["Flamethrower", "Glare", "Gunk Shot", "Knock Off", "Protect"],
|
||||
"abilities": ["Infiltrator"],
|
||||
"abilities": ["Shed Skin"],
|
||||
"teraTypes": ["Dark", "Fire", "Poison"]
|
||||
}
|
||||
]
|
||||
|
|
@ -2289,6 +2307,18 @@
|
|||
"movepool": ["Headlong Rush", "Protect", "Shell Smash", "Wood Hammer"],
|
||||
"abilities": ["Overgrow"],
|
||||
"teraTypes": ["Fire", "Ground"]
|
||||
},
|
||||
{
|
||||
"role": "Doubles Setup Sweeper",
|
||||
"movepool": ["Headlong Rush", "Rock Slide", "Shell Smash", "Wood Hammer"],
|
||||
"abilities": ["Overgrow"],
|
||||
"teraTypes": ["Rock"]
|
||||
},
|
||||
{
|
||||
"role": "Doubles Setup Sweeper",
|
||||
"movepool": ["Headlong Rush", "Protect", "Rock Slide", "Shell Smash"],
|
||||
"abilities": ["Overgrow"],
|
||||
"teraTypes": ["Rock"]
|
||||
}
|
||||
]
|
||||
},
|
||||
|
|
@ -2555,7 +2585,7 @@
|
|||
"role": "Doubles Support",
|
||||
"movepool": ["High Horsepower", "Slack Off", "Stealth Rock", "Stone Edge", "Whirlwind"],
|
||||
"abilities": ["Sand Stream"],
|
||||
"teraTypes": ["Dragon", "Rock", "Steel", "Water"]
|
||||
"teraTypes": ["Dragon", "Steel", "Water"]
|
||||
}
|
||||
]
|
||||
},
|
||||
|
|
@ -2624,8 +2654,8 @@
|
|||
"level": 84,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Doubles Bulky Attacker",
|
||||
"movepool": ["Body Press", "Electroweb", "Flash Cannon", "Protect", "Thunderbolt", "Volt Switch"],
|
||||
"role": "Doubles Support",
|
||||
"movepool": ["Electroweb", "Flash Cannon", "Protect", "Thunderbolt", "Volt Switch"],
|
||||
"abilities": ["Sturdy"],
|
||||
"teraTypes": ["Flying"]
|
||||
}
|
||||
|
|
@ -2670,7 +2700,7 @@
|
|||
"sets": [
|
||||
{
|
||||
"role": "Choice Item user",
|
||||
"movepool": ["Fire Blast", "Focus Blast", "Heat Wave", "Scorching Sands", "Thunderbolt"],
|
||||
"movepool": ["Fire Blast", "Focus Blast", "Heat Wave", "Thunderbolt"],
|
||||
"abilities": ["Flame Body"],
|
||||
"teraTypes": ["Fighting", "Fire", "Grass"]
|
||||
},
|
||||
|
|
@ -3167,9 +3197,15 @@
|
|||
"sets": [
|
||||
{
|
||||
"role": "Doubles Setup Sweeper",
|
||||
"movepool": ["Calm Mind", "Fire Blast", "Judgment", "Recover", "Sludge Bomb"],
|
||||
"movepool": ["Calm Mind", "Fire Blast", "Judgment", "Recover"],
|
||||
"abilities": ["Multitype"],
|
||||
"teraTypes": ["Fire", "Poison"]
|
||||
"teraTypes": ["Fire"]
|
||||
},
|
||||
{
|
||||
"role": "Doubles Bulky Setup",
|
||||
"movepool": ["Calm Mind", "Judgment", "Recover", "Sludge Bomb"],
|
||||
"abilities": ["Multitype"],
|
||||
"teraTypes": ["Poison"]
|
||||
}
|
||||
]
|
||||
},
|
||||
|
|
@ -3189,9 +3225,9 @@
|
|||
"sets": [
|
||||
{
|
||||
"role": "Doubles Bulky Setup",
|
||||
"movepool": ["Calm Mind", "Dazzling Gleam", "Earth Power", "Fire Blast", "Recover"],
|
||||
"movepool": ["Calm Mind", "Dazzling Gleam", "Earth Power", "Recover"],
|
||||
"abilities": ["Multitype"],
|
||||
"teraTypes": ["Fairy", "Fire", "Ground"]
|
||||
"teraTypes": ["Fairy", "Ground"]
|
||||
},
|
||||
{
|
||||
"role": "Doubles Support",
|
||||
|
|
@ -3228,9 +3264,15 @@
|
|||
"sets": [
|
||||
{
|
||||
"role": "Doubles Setup Sweeper",
|
||||
"movepool": ["Calm Mind", "Earth Power", "Fire Blast", "Judgment", "Recover"],
|
||||
"movepool": ["Calm Mind", "Earth Power", "Judgment", "Recover"],
|
||||
"abilities": ["Multitype"],
|
||||
"teraTypes": ["Flying", "Ground"]
|
||||
},
|
||||
{
|
||||
"role": "Doubles Support",
|
||||
"movepool": ["Judgment", "Recover", "Snarl", "Tailwind", "Taunt", "Will-O-Wisp"],
|
||||
"abilities": ["Multitype"],
|
||||
"teraTypes": ["Steel"]
|
||||
}
|
||||
]
|
||||
},
|
||||
|
|
@ -3241,13 +3283,13 @@
|
|||
"role": "Doubles Setup Sweeper",
|
||||
"movepool": ["Brick Break", "Extreme Speed", "Phantom Force", "Swords Dance"],
|
||||
"abilities": ["Multitype"],
|
||||
"teraTypes": ["Ghost", "Normal"]
|
||||
"teraTypes": ["Normal"]
|
||||
},
|
||||
{
|
||||
"role": "Doubles Bulky Setup",
|
||||
"movepool": ["Calm Mind", "Dazzling Gleam", "Focus Blast", "Judgment", "Recover"],
|
||||
"movepool": ["Calm Mind", "Focus Blast", "Judgment", "Recover"],
|
||||
"abilities": ["Multitype"],
|
||||
"teraTypes": ["Fairy", "Fighting"]
|
||||
"teraTypes": ["Fighting"]
|
||||
}
|
||||
]
|
||||
},
|
||||
|
|
@ -3267,9 +3309,15 @@
|
|||
"sets": [
|
||||
{
|
||||
"role": "Doubles Bulky Setup",
|
||||
"movepool": ["Calm Mind", "Fire Blast", "Ice Beam", "Judgment", "Recover"],
|
||||
"movepool": ["Calm Mind", "Ice Beam", "Judgment", "Recover"],
|
||||
"abilities": ["Multitype"],
|
||||
"teraTypes": ["Ground", "Ice"]
|
||||
"teraTypes": ["Dragon", "Steel", "Water"]
|
||||
},
|
||||
{
|
||||
"role": "Doubles Bulky Attacker",
|
||||
"movepool": ["Calm Mind", "Fire Blast", "Judgment", "Recover"],
|
||||
"abilities": ["Multitype"],
|
||||
"teraTypes": ["Fire"]
|
||||
},
|
||||
{
|
||||
"role": "Doubles Setup Sweeper",
|
||||
|
|
@ -3283,10 +3331,16 @@
|
|||
"level": 73,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Doubles Bulky Setup",
|
||||
"movepool": ["Calm Mind", "Earth Power", "Judgment", "Recover", "Thunderbolt"],
|
||||
"role": "Doubles Setup Sweeper",
|
||||
"movepool": ["Calm Mind", "Earth Power", "Judgment", "Recover"],
|
||||
"abilities": ["Multitype"],
|
||||
"teraTypes": ["Electric", "Ground"]
|
||||
"teraTypes": ["Ground"]
|
||||
},
|
||||
{
|
||||
"role": "Doubles Bulky Setup",
|
||||
"movepool": ["Calm Mind", "Judgment", "Recover", "Thunderbolt"],
|
||||
"abilities": ["Multitype"],
|
||||
"teraTypes": ["Electric"]
|
||||
}
|
||||
]
|
||||
},
|
||||
|
|
@ -3486,7 +3540,13 @@
|
|||
"sets": [
|
||||
{
|
||||
"role": "Doubles Bulky Attacker",
|
||||
"movepool": ["Encore", "Helping Hand", "Moonblast", "Tailwind", "Taunt"],
|
||||
"movepool": ["Encore", "Moonblast", "Tailwind", "Taunt"],
|
||||
"abilities": ["Prankster"],
|
||||
"teraTypes": ["Fire", "Ghost", "Steel"]
|
||||
},
|
||||
{
|
||||
"role": "Doubles Support",
|
||||
"movepool": ["Encore", "Helping Hand", "Moonblast", "Tailwind"],
|
||||
"abilities": ["Prankster"],
|
||||
"teraTypes": ["Fire", "Ghost", "Steel"]
|
||||
}
|
||||
|
|
@ -3884,7 +3944,7 @@
|
|||
{
|
||||
"role": "Doubles Setup Sweeper",
|
||||
"movepool": ["Bug Buzz", "Heat Wave", "Protect", "Quiver Dance"],
|
||||
"abilities": ["Flame Body", "Swarm"],
|
||||
"abilities": ["Flame Body"],
|
||||
"teraTypes": ["Fire", "Ground", "Water"]
|
||||
},
|
||||
{
|
||||
|
|
@ -3972,14 +4032,14 @@
|
|||
"level": 79,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Bulky Protect",
|
||||
"role": "Doubles Support",
|
||||
"movepool": ["Grass Knot", "Knock Off", "Protect", "Snarl", "Taunt", "Thunder Wave", "Thunderbolt"],
|
||||
"abilities": ["Prankster"],
|
||||
"teraTypes": ["Steel"]
|
||||
},
|
||||
{
|
||||
"role": "Offensive Protect",
|
||||
"movepool": ["Acrobatics", "Grass Knot", "Knock Off", "Protect", "Snarl", "Wildbolt Storm"],
|
||||
"movepool": ["Acrobatics", "Grass Knot", "Knock Off", "Protect", "Wildbolt Storm"],
|
||||
"abilities": ["Defiant"],
|
||||
"teraTypes": ["Electric", "Flying", "Steel"]
|
||||
},
|
||||
|
|
@ -4242,13 +4302,7 @@
|
|||
"sets": [
|
||||
{
|
||||
"role": "Doubles Bulky Attacker",
|
||||
"movepool": ["Fake Out", "Fake Tears", "Helping Hand", "Light Screen", "Psychic", "Reflect"],
|
||||
"abilities": ["Prankster"],
|
||||
"teraTypes": ["Dark", "Steel"]
|
||||
},
|
||||
{
|
||||
"role": "Doubles Support",
|
||||
"movepool": ["Fake Out", "Helping Hand", "Psychic", "Thunder Wave"],
|
||||
"movepool": ["Fake Out", "Helping Hand", "Light Screen", "Psychic", "Reflect", "Thunder Wave"],
|
||||
"abilities": ["Prankster"],
|
||||
"teraTypes": ["Dark", "Steel"]
|
||||
}
|
||||
|
|
@ -4317,7 +4371,7 @@
|
|||
"role": "Tera Blast user",
|
||||
"movepool": ["Hyper Voice", "Protect", "Quick Attack", "Tera Blast"],
|
||||
"abilities": ["Pixilate"],
|
||||
"teraTypes": ["Fire", "Ground"]
|
||||
"teraTypes": ["Ground"]
|
||||
}
|
||||
]
|
||||
},
|
||||
|
|
@ -4593,7 +4647,7 @@
|
|||
"sets": [
|
||||
{
|
||||
"role": "Doubles Wallbreaker",
|
||||
"movepool": ["Drain Punch", "Gunk Shot", "Ice Hammer", "Protect", "Wide Guard"],
|
||||
"movepool": ["Drain Punch", "Gunk Shot", "Ice Hammer", "Protect"],
|
||||
"abilities": ["Iron Fist"],
|
||||
"teraTypes": ["Fire", "Poison"]
|
||||
}
|
||||
|
|
@ -4609,7 +4663,7 @@
|
|||
"teraTypes": ["Ground"]
|
||||
},
|
||||
{
|
||||
"role": "Doubles Bulky Setup",
|
||||
"role": "Bulky Protect",
|
||||
"movepool": ["Air Slash", "Protect", "Quiver Dance", "Revelation Dance"],
|
||||
"abilities": ["Dancer"],
|
||||
"teraTypes": ["Ground"]
|
||||
|
|
@ -4626,7 +4680,7 @@
|
|||
"teraTypes": ["Ground"]
|
||||
},
|
||||
{
|
||||
"role": "Doubles Bulky Setup",
|
||||
"role": "Bulky Protect",
|
||||
"movepool": ["Air Slash", "Protect", "Quiver Dance", "Revelation Dance"],
|
||||
"abilities": ["Dancer"],
|
||||
"teraTypes": ["Ground"]
|
||||
|
|
@ -4643,7 +4697,7 @@
|
|||
"teraTypes": ["Fighting", "Ground"]
|
||||
},
|
||||
{
|
||||
"role": "Doubles Bulky Setup",
|
||||
"role": "Bulky Protect",
|
||||
"movepool": ["Air Slash", "Protect", "Quiver Dance", "Revelation Dance"],
|
||||
"abilities": ["Dancer"],
|
||||
"teraTypes": ["Fighting", "Ground"]
|
||||
|
|
@ -4660,7 +4714,7 @@
|
|||
"teraTypes": ["Fighting", "Ground"]
|
||||
},
|
||||
{
|
||||
"role": "Doubles Bulky Setup",
|
||||
"role": "Bulky Protect",
|
||||
"movepool": ["Air Slash", "Protect", "Quiver Dance", "Revelation Dance"],
|
||||
"abilities": ["Dancer"],
|
||||
"teraTypes": ["Fighting", "Ground"]
|
||||
|
|
@ -5010,13 +5064,13 @@
|
|||
{
|
||||
"role": "Doubles Setup Sweeper",
|
||||
"movepool": ["Clanging Scales", "Clangorous Soul", "Drain Punch", "Iron Head"],
|
||||
"abilities": ["Soundproof"],
|
||||
"abilities": ["Bulletproof", "Soundproof"],
|
||||
"teraTypes": ["Steel"]
|
||||
},
|
||||
{
|
||||
"role": "Doubles Bulky Setup",
|
||||
"movepool": ["Clanging Scales", "Clangorous Soul", "Iron Head", "Protect"],
|
||||
"abilities": ["Soundproof"],
|
||||
"abilities": ["Bulletproof", "Soundproof"],
|
||||
"teraTypes": ["Steel"]
|
||||
},
|
||||
{
|
||||
|
|
@ -5273,7 +5327,7 @@
|
|||
"sets": [
|
||||
{
|
||||
"role": "Doubles Bulky Attacker",
|
||||
"movepool": ["Fake Out", "Light Screen", "Parting Shot", "Reflect", "Spirit Break"],
|
||||
"movepool": ["Fake Out", "Light Screen", "Parting Shot", "Reflect", "Spirit Break", "Thunder Wave"],
|
||||
"abilities": ["Prankster"],
|
||||
"teraTypes": ["Steel"]
|
||||
},
|
||||
|
|
@ -5476,7 +5530,13 @@
|
|||
"sets": [
|
||||
{
|
||||
"role": "Offensive Protect",
|
||||
"movepool": ["Draco Meteor", "Dragon Darts", "Fire Blast", "Protect", "Shadow Ball"],
|
||||
"movepool": ["Draco Meteor", "Dragon Darts", "Protect", "Shadow Ball"],
|
||||
"abilities": ["Clear Body"],
|
||||
"teraTypes": ["Dragon"]
|
||||
},
|
||||
{
|
||||
"role": "Offensive Protect",
|
||||
"movepool": ["Dragon Darts", "Fire Blast", "Protect", "Shadow Ball"],
|
||||
"abilities": ["Clear Body"],
|
||||
"teraTypes": ["Dragon"]
|
||||
},
|
||||
|
|
@ -5868,9 +5928,15 @@
|
|||
},
|
||||
{
|
||||
"role": "Doubles Fast Attacker",
|
||||
"movepool": ["First Impression", "Leech Life", "Protect", "Sucker Punch"],
|
||||
"movepool": ["First Impression", "Knock Off", "Protect", "Sucker Punch"],
|
||||
"abilities": ["Tinted Lens"],
|
||||
"teraTypes": ["Bug"]
|
||||
"teraTypes": ["Bug", "Dark"]
|
||||
},
|
||||
{
|
||||
"role": "Doubles Wallbreaker",
|
||||
"movepool": ["First Impression", "Knock Off", "Leech Life", "Protect"],
|
||||
"abilities": ["Tinted Lens"],
|
||||
"teraTypes": ["Bug"]
|
||||
}
|
||||
]
|
||||
},
|
||||
|
|
@ -6018,7 +6084,7 @@
|
|||
"sets": [
|
||||
{
|
||||
"role": "Doubles Bulky Attacker",
|
||||
"movepool": ["Electroweb", "Muddy Water", "Slack Off", "Thunder Wave", "Thunderbolt", "Volt Switch"],
|
||||
"movepool": ["Electroweb", "Muddy Water", "Slack Off", "Thunder Wave", "Thunderbolt"],
|
||||
"abilities": ["Electromorphosis"],
|
||||
"teraTypes": ["Water"]
|
||||
}
|
||||
|
|
@ -6159,7 +6225,7 @@
|
|||
{
|
||||
"role": "Doubles Support",
|
||||
"movepool": ["Encore", "Fake Out", "Gigaton Hammer", "Knock Off", "Play Rough", "Stealth Rock"],
|
||||
"abilities": ["Mold Breaker"],
|
||||
"abilities": ["Mold Breaker", "Own Tempo"],
|
||||
"teraTypes": ["Steel", "Water"]
|
||||
}
|
||||
]
|
||||
|
|
@ -6490,7 +6556,7 @@
|
|||
"sets": [
|
||||
{
|
||||
"role": "Doubles Wallbreaker",
|
||||
"movepool": ["Close Combat", "First Impression", "Flare Blitz", "U-turn", "Wild Charge"],
|
||||
"movepool": ["Close Combat", "First Impression", "Flare Blitz", "Protect", "U-turn", "Wild Charge"],
|
||||
"abilities": ["Protosynthesis"],
|
||||
"teraTypes": ["Bug", "Electric", "Fighting", "Fire"]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -643,7 +643,7 @@
|
|||
},
|
||||
{
|
||||
"role": "Bulky Setup",
|
||||
"movepool": ["Calm Mind", "Giga Drain", "Psychic", "Psyshock", "Substitute"],
|
||||
"movepool": ["Calm Mind", "Giga Drain", "Psychic", "Psyshock", "Sleep Powder", "Substitute"],
|
||||
"abilities": ["Harvest"],
|
||||
"teraTypes": ["Steel"]
|
||||
}
|
||||
|
|
@ -695,7 +695,7 @@
|
|||
{
|
||||
"role": "Setup Sweeper",
|
||||
"movepool": ["Drain Punch", "Ice Punch", "Knock Off", "Mach Punch", "Rapid Spin", "Swords Dance"],
|
||||
"abilities": ["Inner Focus", "Iron Fist"],
|
||||
"abilities": ["Iron Fist"],
|
||||
"teraTypes": ["Dark", "Fighting"]
|
||||
},
|
||||
{
|
||||
|
|
@ -703,6 +703,12 @@
|
|||
"movepool": ["Bulk Up", "Drain Punch", "Knock Off", "Poison Jab", "Rapid Spin"],
|
||||
"abilities": ["Iron Fist"],
|
||||
"teraTypes": ["Dark", "Poison", "Steel"]
|
||||
},
|
||||
{
|
||||
"role": "Bulky Support",
|
||||
"movepool": ["Drain Punch", "Encore", "Knock Off", "Poison Jab", "Rapid Spin", "Taunt"],
|
||||
"abilities": ["Iron Fist"],
|
||||
"teraTypes": ["Steel"]
|
||||
}
|
||||
]
|
||||
},
|
||||
|
|
@ -2382,6 +2388,12 @@
|
|||
"luvdisc": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Fast Support",
|
||||
"movepool": ["Endeavor", "Flip Turn", "Substitute", "Surf"],
|
||||
"abilities": ["Swift Swim"],
|
||||
"teraTypes": ["Ghost", "Ground"]
|
||||
},
|
||||
{
|
||||
"role": "Fast Support",
|
||||
"movepool": ["Endeavor", "Substitute", "Surf", "Whirlpool"],
|
||||
|
|
@ -3185,7 +3197,7 @@
|
|||
"sets": [
|
||||
{
|
||||
"role": "Wallbreaker",
|
||||
"movepool": ["Earthquake", "Ice Shard", "Icicle Crash", "Knock Off", "Stealth Rock", "Trailblaze"],
|
||||
"movepool": ["Earthquake", "Ice Shard", "Icicle Crash", "Knock Off", "Stealth Rock"],
|
||||
"abilities": ["Thick Fat"],
|
||||
"teraTypes": ["Ground", "Ice"]
|
||||
}
|
||||
|
|
@ -3247,7 +3259,7 @@
|
|||
},
|
||||
{
|
||||
"role": "Bulky Support",
|
||||
"movepool": ["Earthquake", "Pain Split", "Poltergeist", "Will-O-Wisp"],
|
||||
"movepool": ["Earthquake", "Pain Split", "Poltergeist", "Shadow Sneak", "Will-O-Wisp"],
|
||||
"abilities": ["Frisk"],
|
||||
"teraTypes": ["Dark", "Fairy"]
|
||||
},
|
||||
|
|
@ -3288,7 +3300,13 @@
|
|||
"role": "Bulky Attacker",
|
||||
"movepool": ["Hydro Pump", "Nasty Plot", "Pain Split", "Thunderbolt", "Trick", "Volt Switch", "Will-O-Wisp"],
|
||||
"abilities": ["Levitate"],
|
||||
"teraTypes": ["Electric", "Water"]
|
||||
"teraTypes": ["Electric", "Steel"]
|
||||
},
|
||||
{
|
||||
"role": "Bulky Support",
|
||||
"movepool": ["Discharge", "Hydro Pump", "Pain Split", "Volt Switch", "Will-O-Wisp"],
|
||||
"abilities": ["Levitate"],
|
||||
"teraTypes": ["Electric", "Steel"]
|
||||
}
|
||||
]
|
||||
},
|
||||
|
|
@ -3299,7 +3317,13 @@
|
|||
"role": "Bulky Attacker",
|
||||
"movepool": ["Nasty Plot", "Overheat", "Pain Split", "Thunderbolt", "Volt Switch", "Will-O-Wisp"],
|
||||
"abilities": ["Levitate"],
|
||||
"teraTypes": ["Electric", "Fire"]
|
||||
"teraTypes": ["Electric", "Fire", "Steel"]
|
||||
},
|
||||
{
|
||||
"role": "Bulky Support",
|
||||
"movepool": ["Discharge", "Overheat", "Pain Split", "Volt Switch", "Will-O-Wisp"],
|
||||
"abilities": ["Levitate"],
|
||||
"teraTypes": ["Electric", "Steel"]
|
||||
}
|
||||
]
|
||||
},
|
||||
|
|
@ -3319,7 +3343,7 @@
|
|||
"sets": [
|
||||
{
|
||||
"role": "Bulky Attacker",
|
||||
"movepool": ["Air Slash", "Nasty Plot", "Thunderbolt", "Volt Switch", "Will-O-Wisp"],
|
||||
"movepool": ["Air Slash", "Nasty Plot", "Thunder Wave", "Thunderbolt", "Volt Switch", "Will-O-Wisp"],
|
||||
"abilities": ["Levitate"],
|
||||
"teraTypes": ["Electric", "Steel"]
|
||||
}
|
||||
|
|
@ -3740,16 +3764,10 @@
|
|||
"level": 69,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Bulky Support",
|
||||
"movepool": ["Focus Blast", "Judgment", "Recover", "Will-O-Wisp"],
|
||||
"role": "Bulky Attacker",
|
||||
"movepool": ["Calm Mind", "Focus Blast", "Judgment", "Recover", "Will-O-Wisp"],
|
||||
"abilities": ["Multitype"],
|
||||
"teraTypes": ["Fighting", "Normal"]
|
||||
},
|
||||
{
|
||||
"role": "Bulky Setup",
|
||||
"movepool": ["Calm Mind", "Focus Blast", "Judgment", "Recover"],
|
||||
"abilities": ["Multitype"],
|
||||
"teraTypes": ["Fighting", "Ghost", "Normal"]
|
||||
"teraTypes": ["Dark", "Fighting"]
|
||||
}
|
||||
]
|
||||
},
|
||||
|
|
@ -4017,7 +4035,13 @@
|
|||
"sets": [
|
||||
{
|
||||
"role": "Fast Support",
|
||||
"movepool": ["Encore", "Giga Drain", "Leech Seed", "Moonblast", "Stun Spore", "Substitute", "U-turn"],
|
||||
"movepool": ["Encore", "Giga Drain", "Moonblast", "Stun Spore", "U-turn"],
|
||||
"abilities": ["Prankster"],
|
||||
"teraTypes": ["Poison", "Steel"]
|
||||
},
|
||||
{
|
||||
"role": "Bulky Support",
|
||||
"movepool": ["Encore", "Leech Seed", "Moonblast", "Substitute"],
|
||||
"abilities": ["Prankster"],
|
||||
"teraTypes": ["Poison", "Steel"]
|
||||
}
|
||||
|
|
@ -5011,7 +5035,7 @@
|
|||
"sets": [
|
||||
{
|
||||
"role": "Wallbreaker",
|
||||
"movepool": ["Drain Punch", "Horn Leech", "Poltergeist", "Rest", "Trick Room", "Will-O-Wisp", "Wood Hammer"],
|
||||
"movepool": ["Drain Punch", "Horn Leech", "Poltergeist", "Rest", "Will-O-Wisp", "Wood Hammer"],
|
||||
"abilities": ["Natural Cure"],
|
||||
"teraTypes": ["Fighting"]
|
||||
},
|
||||
|
|
@ -5515,9 +5539,9 @@
|
|||
"sets": [
|
||||
{
|
||||
"role": "Setup Sweeper",
|
||||
"movepool": ["Drain Punch", "Play Rough", "Shadow Sneak", "Swords Dance", "Wood Hammer"],
|
||||
"movepool": ["Drain Punch", "Play Rough", "Shadow Sneak", "Swords Dance"],
|
||||
"abilities": ["Disguise"],
|
||||
"teraTypes": ["Fairy", "Fighting", "Grass"]
|
||||
"teraTypes": ["Fairy", "Fighting"]
|
||||
},
|
||||
{
|
||||
"role": "Fast Bulky Setup",
|
||||
|
|
@ -6563,7 +6587,7 @@
|
|||
"sets": [
|
||||
{
|
||||
"role": "Bulky Support",
|
||||
"movepool": ["Body Press", "Play Rough", "Protect", "Stomping Tantrum", "Wish"],
|
||||
"movepool": ["Body Press", "Play Rough", "Protect", "Wish", "Yawn"],
|
||||
"abilities": ["Well-Baked Body"],
|
||||
"teraTypes": ["Steel"]
|
||||
}
|
||||
|
|
@ -7126,7 +7150,7 @@
|
|||
"sets": [
|
||||
{
|
||||
"role": "Bulky Attacker",
|
||||
"movepool": ["Close Combat", "Seed Bomb", "Spore", "Sucker Punch"],
|
||||
"movepool": ["Close Combat", "Crunch", "Spore", "Sucker Punch"],
|
||||
"abilities": ["Protosynthesis"],
|
||||
"teraTypes": ["Fighting", "Poison"]
|
||||
},
|
||||
|
|
|
|||
|
|
@ -104,7 +104,7 @@ const SPEED_CONTROL = [
|
|||
];
|
||||
// Moves that shouldn't be the only STAB moves:
|
||||
const NO_STAB = [
|
||||
'accelerock', 'aquajet', 'bounce', 'breakingswipe', 'bulletpunch', 'chatter', 'chloroblast', 'clearsmog', 'covet',
|
||||
'acidspray', 'accelerock', 'aquajet', 'bounce', 'breakingswipe', 'bulletpunch', 'chatter', 'chloroblast', 'clearsmog', 'covet',
|
||||
'dragontail', 'doomdesire', 'electroweb', 'eruption', 'explosion', 'fakeout', 'feint', 'flamecharge', 'flipturn', 'futuresight',
|
||||
'grassyglide', 'iceshard', 'icywind', 'incinerate', 'infestation', 'machpunch', 'meteorbeam', 'mortalspin', 'nuzzle', 'pluck', 'pursuit',
|
||||
'quickattack', 'rapidspin', 'reversal', 'selfdestruct', 'shadowsneak', 'skydrop', 'snarl', 'strugglebug', 'suckerpunch', 'trailblaze',
|
||||
|
|
@ -501,7 +501,7 @@ export class RandomTeams {
|
|||
|
||||
// Team-based move culls
|
||||
if (teamDetails.screens) {
|
||||
if (movePool.includes('auroraveil')) this.fastPop(movePool, movePool.indexOf('auroraveil'));
|
||||
if (movePool.includes('auroraveil') && !isDoubles) this.fastPop(movePool, movePool.indexOf('auroraveil'));
|
||||
if (movePool.length >= this.maxMoveCount + 2) {
|
||||
if (movePool.includes('reflect')) this.fastPop(movePool, movePool.indexOf('reflect'));
|
||||
if (movePool.includes('lightscreen')) this.fastPop(movePool, movePool.indexOf('lightscreen'));
|
||||
|
|
@ -568,7 +568,6 @@ export class RandomTeams {
|
|||
[SETUP, HAZARDS],
|
||||
[SETUP, ['defog', 'nuzzle', 'toxic', 'yawn', 'haze']],
|
||||
[PHYSICAL_SETUP, PHYSICAL_SETUP],
|
||||
[SPECIAL_SETUP, 'thunderwave'],
|
||||
['substitute', PIVOT_MOVES],
|
||||
[SPEED_SETUP, ['aquajet', 'rest', 'trickroom']],
|
||||
['curse', ['irondefense', 'rapidspin']],
|
||||
|
|
@ -816,12 +815,6 @@ export class RandomTeams {
|
|||
}
|
||||
}
|
||||
|
||||
// Enforce Encore on Whimsicott
|
||||
if (movePool.includes('encore') && species.id === 'whimsicott') {
|
||||
counter = this.addMove('encore', moves, types, abilities, teamDetails, species, isLead, isDoubles,
|
||||
movePool, teraType, role);
|
||||
}
|
||||
|
||||
// Enforce moves in doubles
|
||||
if (isDoubles) {
|
||||
const doublesEnforcedMoves = ['mortalspin', 'spore'];
|
||||
|
|
@ -841,11 +834,6 @@ export class RandomTeams {
|
|||
counter = this.addMove('tailwind', moves, types, abilities, teamDetails, species, isLead, isDoubles,
|
||||
movePool, teraType, role);
|
||||
}
|
||||
// Enforce Thunder Wave on Prankster users as well
|
||||
if (movePool.includes('thunderwave') && abilities.includes('Prankster')) {
|
||||
counter = this.addMove('thunderwave', moves, types, abilities, teamDetails, species, isLead, isDoubles,
|
||||
movePool, teraType, role);
|
||||
}
|
||||
}
|
||||
|
||||
// Enforce STAB priority
|
||||
|
|
@ -1111,7 +1099,6 @@ export class RandomTeams {
|
|||
// Hard-code abilities here
|
||||
if (species.id === 'drifblim') return moves.has('defog') ? 'Aftermath' : 'Unburden';
|
||||
if (abilities.includes('Flash Fire') && this.dex.getEffectiveness('Fire', teraType) >= 1) return 'Flash Fire';
|
||||
if (species.id === 'hitmonchan' && counter.get('ironfist')) return 'Iron Fist';
|
||||
if ((species.id === 'thundurus' || species.id === 'tornadus') && !counter.get('Physical')) return 'Prankster';
|
||||
if (species.id === 'swampert' && (counter.get('Water') || moves.has('flipturn'))) return 'Torrent';
|
||||
if (species.id === 'toucannon' && counter.get('skilllink')) return 'Skill Link';
|
||||
|
|
@ -3020,7 +3007,6 @@ export class RandomTeams {
|
|||
): RandomTeamsTypes.RandomFactorySet | null {
|
||||
const setList = this.random1v1FactorySets[species.name].sets;
|
||||
|
||||
const itemsLimited = ['choicespecs', 'choiceband', 'choicescarf'];
|
||||
const movesLimited: { [k: string]: string } = {};
|
||||
const abilitiesLimited: { [k: string]: string } = {};
|
||||
|
||||
|
|
@ -3039,7 +3025,8 @@ export class RandomTeams {
|
|||
if (!Array.isArray(ogItem)) ogItem = [ogItem];
|
||||
for (const itemString of ogItem) {
|
||||
const itemId = toID(itemString);
|
||||
if (itemsLimited.includes(itemId) && teamData.has[itemId]) continue;
|
||||
if (teamData.has[itemId]) continue;
|
||||
teamData.has[itemId] = 1;
|
||||
allowedItems.push(itemString);
|
||||
}
|
||||
if (!allowedItems.length) continue;
|
||||
|
|
@ -3130,14 +3117,6 @@ export class RandomTeams {
|
|||
weaknesses: {},
|
||||
resistances: {},
|
||||
};
|
||||
const resistanceAbilities: { [k: string]: string[] } = {
|
||||
dryskin: ['Water'], waterabsorb: ['Water'], stormdrain: ['Water'],
|
||||
flashfire: ['Fire'], heatproof: ['Fire'], waterbubble: ['Fire'], wellbakedbody: ['Fire'],
|
||||
lightningrod: ['Electric'], motordrive: ['Electric'], voltabsorb: ['Electric'],
|
||||
sapsipper: ['Grass'],
|
||||
thickfat: ['Ice', 'Fire'],
|
||||
eartheater: ['Ground'], levitate: ['Ground'],
|
||||
};
|
||||
const movesLimited: { [k: string]: string } = {};
|
||||
const abilitiesLimited: { [k: string]: string } = {};
|
||||
const limitFactor = Math.ceil(this.maxTeamSize / 3);
|
||||
|
|
@ -3185,7 +3164,7 @@ export class RandomTeams {
|
|||
for (const typeName of this.dex.types.names()) {
|
||||
// it's weak to the type
|
||||
if (this.dex.getEffectiveness(typeName, species) > 0 && this.dex.getImmunity(typeName, types)) {
|
||||
if (teamData.weaknesses[typeName] >= 2 * limitFactor) {
|
||||
if (teamData.weaknesses[typeName] >= limitFactor) {
|
||||
skip = true;
|
||||
break;
|
||||
}
|
||||
|
|
@ -3196,6 +3175,22 @@ export class RandomTeams {
|
|||
|
||||
const set = this.random1v1FactorySet(species, teamData);
|
||||
if (!set) continue;
|
||||
teamData.has[toID(set.item)] = 1;
|
||||
|
||||
const atkEVs = set.evs['atk'];
|
||||
const spaEVs = set.evs['spa'];
|
||||
const physMoveCount = set.moves.map(x => this.dex.moves.get(x).category).filter(x => x === 'Physical').length;
|
||||
const specMoveCount = set.moves.map(x => this.dex.moves.get(x).category).filter(x => x === 'Special').length;
|
||||
const atkBoostingMoves = set.moves.map(x => this.dex.moves.get(x))
|
||||
.filter(x => (x.target === 'self' && x.boosts?.atk) || (x.id === 'curse' && !species.types.includes('Ghost'))).length;
|
||||
const spaBoostingMoves = set.moves.map(x => this.dex.moves.get(x))
|
||||
.filter(x => (x.target === 'self' && x.boosts?.spa) || x.id === 'takeheart').length;
|
||||
if (teamData.has['physical'] && (atkEVs || physMoveCount >= 2 || atkBoostingMoves)) continue;
|
||||
if (teamData.has['special'] && (spaEVs || specMoveCount >= 2 || spaBoostingMoves)) continue;
|
||||
if (!teamData.has['physical']) teamData.has['physical'] = 0;
|
||||
if (!teamData.has['special']) teamData.has['special'] = 0;
|
||||
if (atkEVs || physMoveCount >= 2 || atkBoostingMoves) teamData.has['physical']++;
|
||||
if (spaEVs || specMoveCount >= 2 || spaBoostingMoves) teamData.has['special']++;
|
||||
|
||||
// Limit 1 of any type combination
|
||||
let typeCombo = types.slice().sort().join();
|
||||
|
|
@ -3240,16 +3235,7 @@ export class RandomTeams {
|
|||
|
||||
for (const typeName of this.dex.types.names()) {
|
||||
const typeMod = this.dex.getEffectiveness(typeName, types);
|
||||
// Track resistances because we will require it for triple weaknesses
|
||||
if (
|
||||
typeMod < 0 ||
|
||||
resistanceAbilities[ability.id]?.includes(typeName) ||
|
||||
!this.dex.getImmunity(typeName, types)
|
||||
) {
|
||||
// We don't care about the number of resistances, so just set to 1
|
||||
teamData.resistances[typeName] = 1;
|
||||
// Track weaknesses
|
||||
} else if (typeMod > 0) {
|
||||
if (typeMod > 0) {
|
||||
teamData.weaknesses[typeName] = (teamData.weaknesses[typeName] || 0) + 1;
|
||||
}
|
||||
}
|
||||
|
|
@ -3259,9 +3245,7 @@ export class RandomTeams {
|
|||
// Quality control we cannot afford for monotype
|
||||
if (!teamData.forceResult && !this.forceMonotype) {
|
||||
for (const type in teamData.weaknesses) {
|
||||
// We reject if our team is triple weak to any type without having a resist
|
||||
if (teamData.resistances[type]) continue;
|
||||
if (teamData.weaknesses[type] >= 2 * limitFactor) return this.random1v1FactoryTeam(side, ++depth);
|
||||
if (teamData.weaknesses[type] >= limitFactor) return this.random1v1FactoryTeam(side, ++depth);
|
||||
}
|
||||
}
|
||||
return pokemon;
|
||||
|
|
|
|||
|
|
@ -1101,7 +1101,7 @@
|
|||
"level": 5,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Setup Sweeper",
|
||||
"role": "Bulky Setup",
|
||||
"movepool": ["Dual Wingbeat", "Earthquake", "Knock Off", "Swords Dance"],
|
||||
"abilities": ["Immunity"],
|
||||
"teraTypes": ["Steel", "Water"]
|
||||
|
|
@ -1970,7 +1970,7 @@
|
|||
"level": 6,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Setup Sweeper",
|
||||
"role": "Bulky Setup",
|
||||
"movepool": ["Iron Head", "Night Slash", "Sucker Punch", "Swords Dance"],
|
||||
"abilities": ["Defiant"],
|
||||
"teraTypes": ["Dark", "Fairy", "Steel"]
|
||||
|
|
@ -2599,7 +2599,7 @@
|
|||
]
|
||||
},
|
||||
"skiddo": {
|
||||
"level": 7,
|
||||
"level": 6,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Bulky Setup",
|
||||
|
|
|
|||
|
|
@ -1,856 +0,0 @@
|
|||
{
|
||||
"albatrygon": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Fast Support",
|
||||
"movepool": ["Sticky Web", "Taunt", "Encore", "Brave Bird", "Memento", "Parting Shot"],
|
||||
"abilities": ["Prankster"]
|
||||
},
|
||||
{
|
||||
"role": "Setup Sweeper",
|
||||
"movepool": ["Tidy Up", "Brave Bird", "Drill Peck", "Feral Rush", "Feral Bite", "Sacred Sword"],
|
||||
"abilities": ["Prankster"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"aurorowl": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Setup Sweeper",
|
||||
"movepool": ["Frost Breath", "Air Cutter", "Focus Blast", "Nasty Plot"],
|
||||
"abilities": ["Technician"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"arbrella": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Wallbreaker",
|
||||
"movepool": ["Earthquake", "Wood Hammer", "Swords Dance", "Synthesis", "Stone Edge", "Superpower"],
|
||||
"abilities": ["Tough Claws"]
|
||||
},
|
||||
{
|
||||
"role": "Choice Scarf",
|
||||
"movepool": ["Earthquake", "Wood Hammer", "Stone Edge", "Superpower"],
|
||||
"abilities": ["Tough Claws"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"avastar": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Bulky Support",
|
||||
"movepool": ["Thunder Wave", "Heavy Slam", "Psychic", "Recover", "Teleport"],
|
||||
"abilities": ["Shell Bunker"]
|
||||
},
|
||||
{
|
||||
"role": "Setup Sweeper",
|
||||
"movepool": ["Calm Mind", "Psychic", "Flash Cannon", "Recover", "Thunderbolt"],
|
||||
"abilities": ["Shell Bunker"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"axolacred": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Bulky Support",
|
||||
"movepool": ["Stealth Rock", "Dragon Tail", "Roost", "Core Enforcer", "Scald", "Defog", "Shed Tail"],
|
||||
"abilities": ["Magic Guard"]
|
||||
},
|
||||
{
|
||||
"role": "Bulky Attacker",
|
||||
"movepool": ["Feral Rush", "Core Enforcer", "Flip Turn", "Recover"],
|
||||
"abilities": ["Magic Guard"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"barracoth": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Bulky Support",
|
||||
"movepool": ["Sheer Cold", "Flip Turn", "Triple Axel", "Slack Off"],
|
||||
"abilities": ["Multiscale", "Filter"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"blunderbusk": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Bulky Attacker",
|
||||
"movepool": ["Hydro Pump", "Aura Sphere", "Ice Beam", "Dark Pulse", "Dragon Pulse"],
|
||||
"abilities": ["Mega Launcher"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"brawnkey": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Bulky Support",
|
||||
"movepool": ["Stealth Rock", "Drain Punch", "Iron Head", "Chilly Reception", "Spikes"],
|
||||
"abilities": ["Levitate"]
|
||||
},
|
||||
{
|
||||
"role": "Setup Sweeper",
|
||||
"movepool": ["Iron Defense", "Body Press", "Iron Head", "Stealth Rock"],
|
||||
"abilities": ["Levitate"]
|
||||
},
|
||||
{
|
||||
"role": "Setup Sweeper",
|
||||
"movepool": ["Bulk Up", "Drain Punch", "Iron Head", "Stealth Rock"],
|
||||
"abilities": ["Levitate"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"carapex": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Setup Sweeper",
|
||||
"movepool": ["Tailwind", "Acrobatics", "Earthquake", "Stone Edge"],
|
||||
"abilities": ["Wind Rider"]
|
||||
},
|
||||
{
|
||||
"role": "Bulky Support",
|
||||
"movepool": ["Stealth Rock", "Roost", "Body Press", "Knock Off", "Crystal Bash", "U-Turn"],
|
||||
"abilities": ["Wind Rider"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"celespirit": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Bulky Support",
|
||||
"movepool": ["Sheer Cold", "Moonlight", "Hex", "Ice Beam", "Moonblast"],
|
||||
"abilities": ["Levitate"]
|
||||
},
|
||||
{
|
||||
"role": "Setup Sweeper",
|
||||
"movepool": ["Calm Mind", "Crystal Burst", "Shadow Ball", "Moonlight"],
|
||||
"abilities": ["Levitate"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"cellsius": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Setup Sweeper",
|
||||
"movepool": ["Calm Mind", "Hydro Pump", "Moonblast", "Ice Beam", "Psychic"],
|
||||
"abilities": ["Beast Boost"]
|
||||
},
|
||||
{
|
||||
"role": "Fast Attacker",
|
||||
"movepool": ["Hydro Pump", "Moonblast", "Ice Beam", "Flip Turn", "Psychic"],
|
||||
"abilities": ["Beast Boost"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"cindoe": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Fast Support",
|
||||
"movepool": ["Overheat", "Fiery Wrath", "Parting Shot", "Morning Sun"],
|
||||
"abilities": ["Natural Cure"]
|
||||
},
|
||||
{
|
||||
"role": "Setup Sweeper",
|
||||
"movepool": ["Nasty Plot", "Fiery Wrath", "Fire Blast", "Morning Sun"],
|
||||
"abilities": ["Natural Cure"]
|
||||
},
|
||||
{
|
||||
"role": "Setup Sweeper",
|
||||
|
||||
"movepool": ["Nasty Plot", "Fiery Wrath", "Crystal Burst", "Morning Sun"],
|
||||
"abilities": ["Natural Cure"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"cinnastar": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "AV Pivot",
|
||||
"movepool": ["Sludge Bomb", "Earth Power", "Focus Blast", "Mortal Spin"],
|
||||
"abilities": ["Regenerator"]
|
||||
},
|
||||
{
|
||||
"role": "Bulky Support",
|
||||
"movepool": ["Earth Power", "Mortal Spin", "Recover", "Stealth Rock", "Power Gem"],
|
||||
"abilities": ["Regenerator"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"cobracotta": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Bulky Support",
|
||||
"movepool": ["Poison Fang", "Leech Seed", "Knock Off", "Synthesis", "Stealth Rock", "Power Whip"],
|
||||
"abilities": ["Heatproof"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"corundell": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Fast Attacker",
|
||||
"movepool": ["Meteor Beam", "Power Gem", "Overheat", "Earth Power", "Volt Switch", "Energy Ball"],
|
||||
"abilities": ["Lightning Rod"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"crossont": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Bulky Support",
|
||||
"movepool": ["Spikes", "Recover", "Knock Off", "Circle Throw"],
|
||||
"abilities": ["Mold Breaker", "Sniper"]
|
||||
},
|
||||
{
|
||||
"role": "Bulky Attacker",
|
||||
|
||||
"movepool": ["Crystal Cutter", "Close Combat", "Bulk Up", "Substitute"],
|
||||
"abilities": ["Sniper"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"cyllindrake": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Bulky Support",
|
||||
"movepool": ["Body Press", "Rapid Spin", "Morning Sun", "Stealth Rock", "Boomburst"],
|
||||
"abilities": ["Scrappy"]
|
||||
},
|
||||
{
|
||||
"role": "Fast Support",
|
||||
"movepool": ["Stealth Rock", "Rapid Spin", "Steel Beam", "Fire Blast"],
|
||||
"abilities": ["Scrappy"]
|
||||
},
|
||||
{
|
||||
"role": "Fast Attacker",
|
||||
|
||||
"movepool": ["Feral Shriek", "Flash Cannon", "Earth Power", "Feral Spray", "Rapid Spin"],
|
||||
"abilities": ["Punk Rock"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"dojodo": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Setup Sweeper",
|
||||
"movepool": ["Bulk Up", "Drain Punch", "Jet Punch", "Knock Off", "Substitute"],
|
||||
"abilities": ["Supreme Overlord"]
|
||||
},
|
||||
{
|
||||
"role": "Setup Sweeper",
|
||||
|
||||
"movepool": ["Bulk Up", "Drain Punch", "Crystal Bash", "Jet Punch", "Crystal Healing"],
|
||||
"abilities": ["Supreme Overlord"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"dolphena": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Setup Sweeper",
|
||||
"movepool": ["Coil", "Scale Shot", "Iron Tail", "Liquidation"],
|
||||
"abilities": ["Mythical Presence"]
|
||||
},
|
||||
{
|
||||
"role": "Setup Sweeper",
|
||||
"movepool": ["Dragon Dance", "Scale Shot", "Liquidation", "Iron Head", "Substitute"],
|
||||
"abilities": ["Mythical Presence"]
|
||||
},
|
||||
{
|
||||
"role": "Setup Sweeper",
|
||||
"movepool": ["Coil", "Scale Shot", "Iron Tail", "Liquidation"],
|
||||
|
||||
"abilities": ["Mythical Presence"]
|
||||
},
|
||||
{
|
||||
"role": "Bulky Support",
|
||||
"movepool": ["Defog", "Flip Turn", "Moonlight", "Dragon Tail"],
|
||||
"abilities": ["Mythical Presence"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"dracoil": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Bulky Support",
|
||||
"movepool": ["Defog", "Roost", "U-Turn", "Hurricane", "Fire Blast", "Glare", "Draco Meteor", "Earthquake"],
|
||||
"abilities": ["Mythical Presence"]
|
||||
},
|
||||
{
|
||||
"role": "Setup Sweeper",
|
||||
"movepool": ["Dragon Dance", "Acrobatics", "Substitute", "Earthquake"],
|
||||
"abilities": ["Gluttony"]
|
||||
},
|
||||
{
|
||||
"role": "Setup Sweeper",
|
||||
"movepool": ["Dragon Dance", "Dragon Rush", "Coil", "Earthquake", "Dual Wingbeat"],
|
||||
"abilities": ["Mythical Presence"]
|
||||
},
|
||||
{
|
||||
"role": "Bulky Support",
|
||||
"movepool": ["Feral Bite", "Dragon Tail", "Roost", "Glare", "Defog"],
|
||||
"abilities": ["Mythical Presence"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"efflor": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Bulky Support",
|
||||
"movepool": ["Giga Drain", "Leech Seed", "Rapid Spin", "Stealth Rock", "Chilly Reception"],
|
||||
"abilities": ["Seed Sower"]
|
||||
},
|
||||
{
|
||||
"role": "Bulky Setup",
|
||||
"movepool": ["Curse", "Stone Edge", "Body Press", "Synthesis"],
|
||||
"abilities": ["Unaware"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"electangle": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Bulky Support",
|
||||
"movepool": ["Gyro Ball", "Stealth Rock", "Body Press", "Volt Switch", "Discharge"],
|
||||
"abilities": ["Filter"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"elemadillo": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Fast Attacker",
|
||||
"movepool": ["Flash Cannon", "Thunderbolt", "Volt Switch", "Energy Ball"],
|
||||
"abilities": ["Motor Drive", "Weak Armor"]
|
||||
},
|
||||
{
|
||||
"role": "Fast Attacker",
|
||||
|
||||
"movepool": ["Feral Power", "Flash Cannon", "Earth Power", "Feral Resilience"],
|
||||
"abilities": ["Motor Drive", "Weak Armor"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"embuck": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Bulky Support",
|
||||
"movepool": ["Blaze Kick", "Will-o-Wisp", "Morning Sun", "U-Turn", "Close Combat"],
|
||||
"abilities": ["Intimidate"]
|
||||
},
|
||||
{
|
||||
"role": "Bulky Support",
|
||||
|
||||
"movepool": ["Blaze Kick", "Crystal Bash", "Will-o-Wisp", "Morning Sun", "U-Turn"],
|
||||
"abilities": ["Intimidate"]
|
||||
},
|
||||
{
|
||||
"role": "Fast Attacker",
|
||||
"movepool": ["Flare Blitz", "Wild Charge", "U-Turn", "Close Combat"],
|
||||
"abilities": ["Intimidate"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"faerenheit": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Bulky Setup",
|
||||
"movepool": ["Calm Mind", "Lava Plume", "Moonblast", "Morning Sun"],
|
||||
"abilities": ["Beast Boost"]
|
||||
},
|
||||
{
|
||||
"role": "Bulky Setup",
|
||||
|
||||
"movepool": ["Calm Mind", "Lava Plume", "Crystal Cage", "Morning Sun"],
|
||||
"abilities": ["Beast Boost"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"fenreil": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Fast Attacker",
|
||||
"movepool": ["Double Edge", "Knock Off", "Superpower", "U-Turn"],
|
||||
"abilities": ["Natural Cure"]
|
||||
},
|
||||
{
|
||||
"role": "Fast Attacker",
|
||||
|
||||
"movepool": ["Feral Bite", "Knock Off", "Iron Head", "Feral Shred"],
|
||||
"abilities": ["Natural Cure"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"flocura": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Fast Support",
|
||||
"movepool": ["Stealth Rock", "Thunder Wave", "U-Turn", "Leaf Storm"],
|
||||
"abilities": ["Power Construct"]
|
||||
},
|
||||
{
|
||||
"role": "Setup Sweeper",
|
||||
"movepool": ["Nasty Plot", "Giga Drain", "Psychic", "Earth Power"],
|
||||
"abilities": ["Levitate"]
|
||||
},
|
||||
{
|
||||
"role": "Setup Sweeper",
|
||||
|
||||
"movepool": ["Nasty Plot", "Giga Drain", "Feral Power", "Earth Power"],
|
||||
"abilities": ["Levitate"]
|
||||
},
|
||||
{
|
||||
"role": "Fast Attacker",
|
||||
"movepool": ["Leaf Storm", "U-Turn", "Psychic", "Earth Power"],
|
||||
"abilities": ["Levitate"]
|
||||
},
|
||||
{
|
||||
"role": "Bulky Support",
|
||||
"movepool": ["Leech Seed", "U-Turn", "Thunder Wave", "Psychic", "Giga Drain", "Stealth Rock"],
|
||||
"abilities": ["Power Construct"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"harzodia": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Bulky Support",
|
||||
"movepool": ["Light Screen", "Reflect", "Teleport", "Thunder Wave", "Psychic"],
|
||||
"abilities": ["Prankster"]
|
||||
},
|
||||
{
|
||||
"role": "Setup Sweeper",
|
||||
"movepool": ["Meteor Beam", "Psychic", "Shadow Ball", "Calm Mind", "Focus Blast"],
|
||||
"abilities": ["Unburden"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"jaegorm": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Fast Attacker",
|
||||
"movepool": ["First Impression", "U-Turn", "Photon Ray", "Knock Off", "Superpower", "Earthquake"],
|
||||
"abilities": ["Schooling"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"jamborai": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Bulky Support",
|
||||
"movepool": ["Mortal Spin", "Recover", "Pyschic", "Scald", "Teleport"],
|
||||
"abilities": ["Water Absorb"]
|
||||
},
|
||||
{
|
||||
"role": "Bulky Setup",
|
||||
"movepool": ["Calm Mind", "Recover", "Pyschic", "Scald", "Sludge Bomb", "Stored Power"],
|
||||
"abilities": ["Water Absorb"]
|
||||
},
|
||||
{
|
||||
"role": "Bulky Support",
|
||||
|
||||
"movepool": ["Mortal Spin", "Recover", "Crystal Cage", "Crystal Healing", "Teleport"],
|
||||
"abilities": ["Gooey"]
|
||||
},
|
||||
{
|
||||
"role": "Bulky Setup",
|
||||
|
||||
"movepool": ["Crystal Fortification", "Recover", "Stored Power", "Crystal Beam"],
|
||||
"abilities": ["Gooey"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"kodokai": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Bulky Support",
|
||||
|
||||
"movepool": ["Crystal Cage", "Hex", "Will-o-Wisp", "Moonlight"],
|
||||
"abilities": ["Aroma Veil"]
|
||||
},
|
||||
{
|
||||
"role": "Bulky Support",
|
||||
"movepool": ["Wish", "Hex", "Will-o-Wisp", "Moonlight"],
|
||||
"abilities": ["Aroma Veil"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"krachiten": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Fast Attacker",
|
||||
"movepool": ["First Impression", "U-Turn", "Liquidation", "Rapid Spin"],
|
||||
"abilities": ["Torrent"]
|
||||
},
|
||||
{
|
||||
"role": "Fast Attacker",
|
||||
|
||||
"movepool": ["Crystal Cutter", "U-Turn", "Aqua Cutter", "Superpower", "Rapid Spin"],
|
||||
"abilities": ["Sniper"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"lumoth": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Setup Sweeper",
|
||||
"movepool": ["Quiver Dance", "Hex", "Sleep Powder", "Bug Buzz"],
|
||||
"abilities": ["Levitate"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"minillow": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Setup Sweeper",
|
||||
"movepool": ["Nasty Plot", "Agility", "Hydro Pump", "Moonblast", "Substitute"],
|
||||
"abilities": ["Adaptability"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"muabboa": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Fast Attacker",
|
||||
"movepool": ["Earthquake", "U-Turn", "Close Combat", "Knock Off"],
|
||||
"abilities": ["Inner Focus"]
|
||||
},
|
||||
{
|
||||
"role": "Setup Sweeper",
|
||||
|
||||
"movepool": ["Swords Dance", "Earthquake", "Feral Rush", "Close Combat"],
|
||||
"abilities": ["Inner Focus"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"noxtrice": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Fast Support",
|
||||
"movepool": ["Poison Jab", "Flare Blitz", "Roost", "U-Turn"],
|
||||
"abilities": ["Poison Touch"]
|
||||
},
|
||||
{
|
||||
"role": "Setup Sweeper",
|
||||
"movepool": ["Gunk Shot", "Flare Blitz", "Earthquake", "Dragon Dance"],
|
||||
"abilities": ["Poison Touch"]
|
||||
},
|
||||
{
|
||||
"role": "Setup Sweeper",
|
||||
"movepool": ["Gunk Shot", "Feral Rush", "Earthquake", "Dragon Dance"],
|
||||
"abilities": ["Flash Fire"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"nunopod": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Bulky Support",
|
||||
"movepool": ["Earthquake", "Body Press", "Triple Axel", "Flip Turn", "Stealth Rock", "Rapid Spin", "Recover"],
|
||||
"abilities": ["Opportunist"]
|
||||
},
|
||||
{
|
||||
"role": "Bulky Support",
|
||||
|
||||
"movepool": ["Crystal Bash", "Body Press", "Earthquake", "Flip Turn", "Stealth Rock", "Rapid Spin", "Recover"],
|
||||
"abilities": ["Opportunist"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"orchile": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Bulky Support",
|
||||
"movepool": ["Moonblast", "Earth Power", "Will-o-Wisp", "Strength Sap", "Spikes"],
|
||||
"abilities": ["Flower Veil"]
|
||||
},
|
||||
{
|
||||
"role": "Bulky Setup",
|
||||
"movepool": ["Moonblast", "Earth Power", "Calm Mind", "Strength Sap"],
|
||||
"abilities": ["Flower Veil"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"platypad": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Bulky Support",
|
||||
"movepool": ["Revival Blessing", "Wave Crash", "Flip Turn", "Synthesis"],
|
||||
"abilities": ["Flower Veil"]
|
||||
},
|
||||
{
|
||||
"role": "Bulky Setup",
|
||||
|
||||
"movepool": ["Feral Resilience", "Feral Breath", "Giga Drain", "Synthesis"],
|
||||
"abilities": ["Triage"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"pythos": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Bulky Setup",
|
||||
"movepool": ["Coil", "Knock Off", "Iron Tail", "Sucker Punch", "Superpower", "Facade"],
|
||||
"abilities": ["Guts"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"quadringo": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Bulky Support",
|
||||
"movepool": ["Defog", "Roost", "Dragon Tail", "Earthquake", "Moonblast"],
|
||||
"abilities": ["Pastel Veil"]
|
||||
},
|
||||
{
|
||||
"role": "Bulky Setup",
|
||||
"movepool": ["Calm Mind", "Moonblast", "Mystical Fire", "Roost"],
|
||||
"abilities": ["Pastel Veil"]
|
||||
},
|
||||
{
|
||||
"role": "Fast Attacker",
|
||||
"movepool": ["Moonblast", "Draco Meteor", "Mystical Fire", "Earthquake"],
|
||||
"abilities": ["Pastel Veil"]
|
||||
},
|
||||
{
|
||||
"role": "Fast Attacker",
|
||||
|
||||
"movepool": ["Feral Rush", "Earthquake", "Feral Shred", "Roost"],
|
||||
"abilities": ["Pastel Veil"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"rantler": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Fast Attacker",
|
||||
"movepool": ["Double Edge", "Ice Spinner", "Superpower", "Earthquake"],
|
||||
"abilities": ["Slush Rush"]
|
||||
},
|
||||
{
|
||||
"role": "Setup Sweeper",
|
||||
"movepool": ["Swords Dance", "Double Edge", "Ice Spinner", "Superpower", "Earthquake", "Quick Attack"],
|
||||
"abilities": ["Slush Rush"]
|
||||
},
|
||||
{
|
||||
"role": "Fast Attacker",
|
||||
"movepool": ["Double Edge", "Ice Spinner", "Superpower", "Quick Attack", "Fake Out"],
|
||||
"abilities": ["Tough Claws"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"roscenti": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Fast Attacker",
|
||||
"movepool": ["First Impression", "U-Turn", "Superpower", "Rock Blast", "Bullet Seed"],
|
||||
"abilities": ["Skill Link"]
|
||||
},
|
||||
{
|
||||
"role": "Fast Attacker",
|
||||
|
||||
"movepool": ["First Impression", "U-Turn", "Feral Rush", "Drill Run", "Iron Tail"],
|
||||
"abilities": ["Sheer Force"]
|
||||
},
|
||||
{
|
||||
"role": "Fast Attacker",
|
||||
|
||||
"movepool": ["First Impression", "U-Turn", "Crystal Tail", "Superpower", "Rock Slide"],
|
||||
"abilities": ["Sheer Force"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"salamalix": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Bulky Support",
|
||||
"movepool": ["Stealth Rock", "Spikes", "Stone Edge", "Close Combat", "Iron Head"],
|
||||
"abilities": ["Intimidate"]
|
||||
},
|
||||
{
|
||||
"role": "Bulky Setup",
|
||||
"movepool": ["Swords Dance", "Iron Head", "Close Combat", "Accelerock"],
|
||||
"abilities": ["Intimidate"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"salaos": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Bulky Support",
|
||||
"movepool": ["Toxic", "Recover", "Fiery Wrath", "Scald", "Flamethrower", "Toxic Spikes"],
|
||||
"abilities": ["Good as Gold"]
|
||||
},
|
||||
{
|
||||
"role": "Bulky Support",
|
||||
|
||||
"movepool": ["Toxic", "Recover", "Crystal Cage", "Flamethrower", "Toxic Spikes"],
|
||||
"abilities": ["Good as Gold"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"saphor": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Bulky Support",
|
||||
"movepool": ["Stealth Rock", "Earthquake", "Body Slam", "Slack Off", "Roar", "Heal Bell"],
|
||||
"abilities": ["Thick Fat"]
|
||||
},
|
||||
{
|
||||
"role": "Bulky Support",
|
||||
|
||||
"movepool": ["Stealth Rock", "Crystal Tail", "Crystal Shard", "Slack Off", "Roar", "Crystal Healing"],
|
||||
"abilities": ["Thick Fat"]
|
||||
},
|
||||
{
|
||||
"role": "Bulky Setup",
|
||||
|
||||
"movepool": ["Bulk Up", "Crystal Cutter", "Slack Off", "Body Press"],
|
||||
"abilities": ["Thick Fat"]
|
||||
},
|
||||
{
|
||||
"role": "Bulky Setup",
|
||||
|
||||
"movepool": ["Calm Mind", "Crystal Cage", "Slack Off", "Focus Blast"],
|
||||
"abilities": ["Thick Fat"]
|
||||
},
|
||||
{
|
||||
"role": "Fast Attacker",
|
||||
"movepool": ["Headlong Rush", "Double Edge", "Heavy Slam", "Superpower", "Stone Edge"],
|
||||
"abilities": ["Thick Fat"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"scalaron": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Bulky Support",
|
||||
"movepool": ["Flamethrower", "Hurricane", "Roost", "U-Turn", "Defog", "Toxic", "Will-o-Wisp"],
|
||||
"abilities": ["Filter"]
|
||||
},
|
||||
{
|
||||
"role": "Bulky Support",
|
||||
|
||||
"movepool": ["Flamethrower", "Crystal Cage", "Roost", "U-Turn", "Defog", "Will-o-Wisp", "Crystal Shard"],
|
||||
"abilities": ["Filter"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"soleron": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Fast Attacker",
|
||||
"movepool": ["Thunderbolt", "Hurricane", "Heat Wave", "U-Turn", "Air Slash", "Volt Switch", "Roost"],
|
||||
"abilities": ["Battle Bond"]
|
||||
},
|
||||
{
|
||||
"role": "Fast Attacker",
|
||||
"movepool": ["Thunderbolt", "Feral Power", "Feral Spray", "Volt Switch", "Roost"],
|
||||
|
||||
"abilities": ["Battle Bond"]
|
||||
},
|
||||
{
|
||||
"role": "Fast Attacker",
|
||||
"movepool": ["Thunderbolt", "Crystal Burst", "Heat Wave", "Volt Switch", "Hurricane"],
|
||||
|
||||
"abilities": ["Battle Bond"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"torgeist": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Fast Attacker",
|
||||
"movepool": ["Toxic Thread", "Hex", "Hurricane", "Heat Wave", "Pain Split", "Taunt"],
|
||||
"abilities": ["Merciless"]
|
||||
},
|
||||
{
|
||||
"role": "Fast Attacker",
|
||||
|
||||
"movepool": ["Toxic Thread", "Hex", "Feral Power", "Pain Split", "Taunt", "Nasty Plot"],
|
||||
"abilities": ["Merciless"]
|
||||
},
|
||||
{
|
||||
"role": "Setup Sweeper",
|
||||
|
||||
"movepool": ["Will-o-Wisp", "Hex", "Feral Power", "Nasty Plot"],
|
||||
"abilities": ["Cursed Body"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"woolora": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Bulky Setup",
|
||||
"movepool": ["Calm Mind", "Cotton Guard", "Stored Power", "Draining Kiss"],
|
||||
"abilities": ["Fluffy", "Pastel Veil"]
|
||||
},
|
||||
{
|
||||
"role": "Bulky Setup",
|
||||
"movepool": ["Calm Mind", "Moonlight", "Stored Power", "Moonblast"],
|
||||
"abilities": ["Fluffy"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"zeploom": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Bulky Support",
|
||||
"movepool": ["Energy Siphon", "Synthesis", "Stealth Rock", "U-Turn", "Defog", "Toxic", "Earth Power"],
|
||||
"abilities": ["Wind Rider"]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
557
data/random-battles/sixbysix/random-sets.json
Normal file
557
data/random-battles/sixbysix/random-sets.json
Normal file
|
|
@ -0,0 +1,557 @@
|
|||
{
|
||||
"kingdraancient": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Fast Bulky Setup",
|
||||
"movepool": ["Fire Blast", "Agility", "Energy Ball", "Hydro Pump"],
|
||||
"abilities": ["Protosynthesis"]
|
||||
},
|
||||
{
|
||||
"role": "Bulky Attacker",
|
||||
"movepool": ["Giga Drain", "Fire Blast", "Flip Turn", "Synthesis"],
|
||||
"abilities": ["Competitive"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"kingdrabard": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Setup Sweeper",
|
||||
"movepool": ["Hydro Pump", "Agility", "Psychic Noise", "Alluring Voice"],
|
||||
"abilities": ["Punk Rock"]
|
||||
},
|
||||
{
|
||||
"role": "Wallbreaker",
|
||||
"movepool": ["Hydro Pump", "Flip Turn", "Psychic Noise", "Alluring Voice"],
|
||||
"abilities": ["Punk Rock"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"kingdrabrinepool": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Bulky Support",
|
||||
"movepool": ["Scald", "Protect", "Knock Off", "Mortal Spin"],
|
||||
"abilities": ["Purifying Salt"]
|
||||
},
|
||||
{
|
||||
"role": "Wallbreaker",
|
||||
"movepool": ["Hydro Pump", "Water Shuriken", "Sludge Wave", "Flip Turn"],
|
||||
"abilities": ["Purifying Salt", "Storm Drain"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"kingdraclassic": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Setup Sweeper",
|
||||
"movepool": ["Hydro Pump", "Draco Meteor", "Agility", "Ice Beam"],
|
||||
"abilities": ["Berserk"]
|
||||
},
|
||||
{
|
||||
"role": "Wallbreaker",
|
||||
"movepool": ["Hydro Pump", "Draco Meteor", "Flip Turn", "Ice Beam"],
|
||||
"abilities": ["Berserk"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"kingdradruid": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Wallbreaker",
|
||||
"movepool": ["Tachyon Cutter", "Draco Meteor", "Flamethrower", "Ice Beam"],
|
||||
"abilities": ["Berserk"]
|
||||
},
|
||||
{
|
||||
"role": "Bulky Setup",
|
||||
"movepool": ["Tachyon Cutter", "Protect", "Flamethrower", "Calm Mind"],
|
||||
"abilities": ["Berserk"]
|
||||
},
|
||||
{
|
||||
"role": "Bulky Attacker",
|
||||
"movepool": ["Doom Desire", "Parting Shot", "Draco Meteor", "Protect"],
|
||||
"abilities": ["Berserk", "Heatproof"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"kingdragourmet": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Bulky Support",
|
||||
"movepool": ["Facade", "Baneful Bunker", "Knock Off", "Toxic"],
|
||||
"abilities": ["Poison Heal"]
|
||||
},
|
||||
{
|
||||
"role": "Bulky Attacker",
|
||||
"movepool": ["Facade", "Fake Out", "Knock Off", "Flip Turn"],
|
||||
"abilities": ["Poison Heal"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"nidoqueenclassic": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Bulky Support",
|
||||
"movepool": ["Barb Barrage", "Earthquake", "Spikes", "Slack Off"],
|
||||
"abilities": ["Poison Point"]
|
||||
},
|
||||
{
|
||||
"role": "Bulky Attacker",
|
||||
"movepool": ["Poison Jab", "Earthquake", "Ice Punch", "Slack Off"],
|
||||
"abilities": ["Sheer Force"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"nidoqueenerudite": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Bulky Setup",
|
||||
"movepool": ["Calm Mind", "Earth Power", "Psychic", "Slack Off"],
|
||||
"abilities": ["Sheer Force"]
|
||||
},
|
||||
{
|
||||
"role": "Bulky Attacker",
|
||||
"movepool": ["Trick Room", "Earth Power", "Psychic", "Ice Beam"],
|
||||
"abilities": ["Sheer Force"]
|
||||
},
|
||||
{
|
||||
"role": "Bulky Support",
|
||||
"movepool": ["Future Sight", "Earth Power", "Roar", "Chilly Reception"],
|
||||
"abilities": ["Regenerator"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"nidoqueenjasper": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Bulky Support",
|
||||
"movepool": ["Salt Cure", "Earthquake", "Protect", "Glare"],
|
||||
"abilities": ["Earth Eater"]
|
||||
},
|
||||
{
|
||||
"role": "Wallbreaker",
|
||||
"movepool": ["Accelerock", "Earthquake", "Gunk Rock", "Stone Edge"],
|
||||
"abilities": ["Earth Eater"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"nidoqueenrosegold": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Bulky Support",
|
||||
"movepool": ["Slack Off", "Giga Drain", "Earth Power", "Toxic Spikes"],
|
||||
"abilities": ["Rough Skin"]
|
||||
},
|
||||
{
|
||||
"role": "Bulky Attacker",
|
||||
"movepool": ["Spiky Shield", "Earth Power", "Sludge Bomb", "Leech Seed"],
|
||||
"abilities": ["Rough Skin"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"nidoqueenshaman": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Wallbreaker",
|
||||
"movepool": ["Poltergeist", "Poison Jab", "Superpower", "Shadow Sneak"],
|
||||
"abilities": ["Toxic Chain"]
|
||||
},
|
||||
{
|
||||
"role": "AV Pivot",
|
||||
"movepool": ["Poltergeist", "Poison Jab", "Earthquake", "Shadow Sneak"],
|
||||
"abilities": ["Regenerator"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"nidoqueenvolcanic": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Bulky Support",
|
||||
"movepool": ["Protect", "Lava Plume", "Earth Power", "Wish"],
|
||||
"abilities": ["Flame Body"]
|
||||
},
|
||||
{
|
||||
"role": "Wallbreaker",
|
||||
"movepool": ["Thunderbolt", "Fire Blast", "Earth Power", "Ice Beam"],
|
||||
"abilities": ["Sheer Force"]
|
||||
},
|
||||
{
|
||||
"role": "Bulky Attacker",
|
||||
"movepool": ["Protect", "Fire Blast", "Earth Power", "Wish"],
|
||||
"abilities": ["Sheer Force"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"bisharpassassin": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Wallbreaker",
|
||||
"movepool": ["Triple Axel", "Dynamic Punch", "Parting Shot", "Ice Shard"],
|
||||
"abilities": ["No Guard"]
|
||||
},
|
||||
{
|
||||
"role": "Bulky Setup",
|
||||
"movepool": ["Triple Axel", "Dynamic Punch", "Curse", "Ice Shard"],
|
||||
"abilities": ["No Guard"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"bisharpcenturion": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Wallbreaker",
|
||||
"movepool": ["Bullet Punch", "Superpower", "Switcheroo", "Iron Head"],
|
||||
"abilities": ["Technician"]
|
||||
},
|
||||
{
|
||||
"role": "Wallbreaker",
|
||||
"movepool": ["Bullet Punch", "Drain Punch", "Bulk Up", "Iron Head"],
|
||||
"abilities": ["Technician"]
|
||||
},
|
||||
{
|
||||
"role": "Setup Sweeper",
|
||||
"movepool": ["Bullet Punch", "Drain Punch", "Swords Dance", "Iron Head"],
|
||||
"abilities": ["Technician"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"bisharpmantis": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Fast Attacker",
|
||||
"movepool": ["Ceaseless Edge", "Leech Life", "First Impression", "Bitter Blade"],
|
||||
"abilities": ["Orichalcum Pulse"]
|
||||
},
|
||||
{
|
||||
"role": "Setup Sweeper",
|
||||
"movepool": ["Sucker Punch", "Leech Life", "Swords Dance", "Bitter Blade"],
|
||||
"abilities": ["Orichalcum Pulse"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"bisharprevenant": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Bulky Attacker",
|
||||
"movepool": ["Recover", "Shadow Sneak", "Sacred Sword", "Poltergeist"],
|
||||
"abilities": ["Magic Bounce"]
|
||||
},
|
||||
{
|
||||
"role": "Bulky Setup",
|
||||
"movepool": ["Recover", "Shadow Sneak", "Swords Dance", "Behemoth Blade"],
|
||||
"abilities": ["Magic Bounce"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"bisharpronin": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Fast Attacker",
|
||||
"movepool": ["Barb Barrage", "U-turn", "Sacred Sword", "Stealth Rock"],
|
||||
"abilities": ["Technician"]
|
||||
},
|
||||
{
|
||||
"role": "Wallbreaker",
|
||||
"movepool": ["Barb Barrage", "U-turn", "Sacred Sword", "Bulldoze"],
|
||||
"abilities": ["Technician"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"bisharpsavage": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Bulky Support",
|
||||
"movepool": ["Leech Seed", "Bullet Punch", "Power Whip", "Thunder Wave"],
|
||||
"abilities": ["Technician"]
|
||||
},
|
||||
{
|
||||
"role": "Bulky Setup",
|
||||
"movepool": ["Bulk Up", "Bullet Punch", "Power Whip", "Body Press"],
|
||||
"abilities": ["Technician"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"corviknightanalytical": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Fast Attacker",
|
||||
"movepool": ["Psychic", "Thunderbolt", "U-turn", "Heat Wave"],
|
||||
"abilities": ["Psychic Surge"]
|
||||
},
|
||||
{
|
||||
"role": "Fast Support",
|
||||
"movepool": ["Reflect", "Light Screen", "U-turn", "Psychic"],
|
||||
"abilities": ["Psychic Surge"]
|
||||
},
|
||||
{
|
||||
"role": "Fast Bulky Setup",
|
||||
"movepool": ["Psychic", "Thunderbolt", "Calm Mind", "Heat Wave"],
|
||||
"abilities": ["Psychic Surge"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"corviknightfalcon": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Fast Attacker",
|
||||
"movepool": ["Brave Bird", "Close Combat", "U-turn", "Knock Off"],
|
||||
"abilities": ["Guts"]
|
||||
},
|
||||
{
|
||||
"role": "Fast Support",
|
||||
"movepool": ["Reflect", "Light Screen", "U-turn", "Taunt"],
|
||||
"abilities": ["Delta Stream"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"corviknightgenie": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Fast Bulky Setup",
|
||||
"movepool": ["Earth Power", "Calm Mind", "Heat Wave", "Rest"],
|
||||
"abilities": ["Prankster"]
|
||||
},
|
||||
{
|
||||
"role": "AV Pivot",
|
||||
"movepool": ["Scorching Sands", "U-turn", "Heat Wave", "Thunderbolt"],
|
||||
"abilities": ["Intimidate"]
|
||||
},
|
||||
{
|
||||
"role": "Fast Support",
|
||||
"movepool": ["Reflect", "Light Screen", "U-turn", "Earth Power"],
|
||||
"abilities": ["Prankster"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"corviknightmartian": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Bulky Attacker",
|
||||
"movepool": ["Trick Room", "Teleport", "Thunderbolt", "Psychic"],
|
||||
"abilities": ["Hadron Engine"]
|
||||
},
|
||||
{
|
||||
"role": "Bulky Support",
|
||||
"movepool": ["Doom Desire", "Teleport", "Thunderbolt", "Psychic"],
|
||||
"abilities": ["Hadron Engine"]
|
||||
},
|
||||
{
|
||||
"role": "Bulky Setup",
|
||||
"movepool": ["Calm Mind", "Flash Cannon", "Thunderbolt", "Psychic Noise"],
|
||||
"abilities": ["Hadron Engine"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"corviknightthunderbird": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Fast Attacker",
|
||||
"movepool": ["Thunder", "Hurricane", "U-turn", "Roost"],
|
||||
"abilities": ["Drizzle"]
|
||||
},
|
||||
{
|
||||
"role": "Fast Support",
|
||||
"movepool": ["Reflect", "Light Screen", "U-turn", "Hurricane"],
|
||||
"abilities": ["Drizzle"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"corviknightyeti": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Fast Attacker",
|
||||
"movepool": ["Blizzard", "Bleakwind Storm", "Volt Switch", "Roost"],
|
||||
"abilities": ["Snow Warning"]
|
||||
},
|
||||
{
|
||||
"role": "Fast Support",
|
||||
"movepool": ["Reflect", "Light Screen", "U-turn", "Blizzard"],
|
||||
"abilities": ["Snow Warning"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"krookodileabyssal": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Setup Sweeper",
|
||||
"movepool": ["Dragon Dance", "Earthquake", "Knock Off", "Flare Blitz"],
|
||||
"abilities": ["Multiscale"]
|
||||
},
|
||||
{
|
||||
"role": "Fast Attacker",
|
||||
"movepool": ["Parting Shot", "Earthquake", "Knock Off", "Flare Blitz"],
|
||||
"abilities": ["Multiscale"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"krookodilecavedweller": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Fast Attacker",
|
||||
"movepool": ["Parting Shot", "Earthquake", "Stone Edge", "Flare Blitz"],
|
||||
"abilities": ["Magic Guard"]
|
||||
},
|
||||
{
|
||||
"role": "Wallbreaker",
|
||||
"movepool": ["Explosion", "Earthquake", "Stone Edge", "Flare Blitz"],
|
||||
"abilities": ["Magic Guard"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"krookodilecliffside": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Fast Attacker",
|
||||
"movepool": ["Parting Shot", "Dark Pulse", "Draco Meteor", "Flamethrower"],
|
||||
"abilities": ["Intimidate"]
|
||||
},
|
||||
{
|
||||
"role": "Wallbreaker",
|
||||
"movepool": ["Switcheroo", "Dark Pulse", "Draco Meteor", "Flamethrower"],
|
||||
"abilities": ["Intimidate"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"krookodileinfernal": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Fast Attacker",
|
||||
"movepool": ["Parting Shot", "Magma Storm", "Fiery Wrath", "Eruption"],
|
||||
"abilities": ["Magic Guard"]
|
||||
},
|
||||
{
|
||||
"role": "Fast Support",
|
||||
"movepool": ["Parting Shot", "Fire Lash", "Knock Off", "Will-O-Wisp"],
|
||||
"abilities": ["Magic Guard"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"krookodilequantum": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Fast Attacker",
|
||||
"movepool": ["Parting Shot", "Volt Tackle", "Head Smash", "Earthquake"],
|
||||
"abilities": ["Rock Head"]
|
||||
},
|
||||
{
|
||||
"role": "Fast Support",
|
||||
"movepool": ["Parting Shot", "Encore", "Head Smash", "Volt Tackle"],
|
||||
"abilities": ["Prankster"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"krookodilewetlander": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Fast Attacker",
|
||||
"movepool": ["Synthesis", "Wave Crash", "Wood Hammer", "Knock Off"],
|
||||
"abilities": ["Wind Rider", "Wonder Skin"]
|
||||
},
|
||||
{
|
||||
"role": "Wallbreaker",
|
||||
"movepool": ["Parting Shot", "Wave Crash", "Wood Hammer", "Knock Off"],
|
||||
"abilities": ["Wind Rider", "Wonder Skin"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"ogerponankh": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Setup Sweeper",
|
||||
"movepool": ["Swords Dance", "Poltergeist", "Earthquake", "Stone Edge"],
|
||||
"abilities": ["Good as Gold"]
|
||||
},
|
||||
{
|
||||
"role": "Wallbreaker",
|
||||
"movepool": ["U-turn", "Shadow Ball", "Earth Power", "Dazzling Gleam"],
|
||||
"abilities": ["Good as Gold"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"ogerponeaster": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Fast Attacker",
|
||||
"movepool": ["U-turn", "Moonblast", "Hyper Voice", "Mystical Fire"],
|
||||
"abilities": ["Pickpocket"]
|
||||
},
|
||||
{
|
||||
"role": "Setup Sweeper",
|
||||
"movepool": ["Calm Mind", "Moonblast", "Soft-Boiled", "Mystical Fire"],
|
||||
"abilities": ["Pickpocket"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"ogerponeid": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Fast Attacker",
|
||||
"movepool": ["Knock Off", "Recover", "Surf", "Shadow Ball"],
|
||||
"abilities": ["Tangling Hair"]
|
||||
},
|
||||
{
|
||||
"role": "Fast Support",
|
||||
"movepool": ["Hex", "Recover", "Surf", "Toxic"],
|
||||
"abilities": ["Tangling Hair"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"ogerponkitsune": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Fast Attacker",
|
||||
"movepool": ["Knock Off", "U-turn", "Earth Power", "Power Whip"],
|
||||
"abilities": ["Protean"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"ogerponmuerta": {
|
||||
"level": 100,
|
||||
"sets": [
|
||||
{
|
||||
"role": "Fast Attacker",
|
||||
"movepool": ["Poltergeist", "Moonblast", "U-turn", "Will-O-Wisp"],
|
||||
"abilities": ["Wandering Spirit"]
|
||||
},
|
||||
{
|
||||
"role": "Wallbreaker",
|
||||
"movepool": ["Poltergeist", "Moonblast", "U-turn", "Shadow Sneak"],
|
||||
"abilities": ["Wandering Spirit"]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -1507,17 +1507,9 @@ export const Rulesets: import('../sim/dex-formats').FormatDataTable = {
|
|||
typeTable = typeTable.filter(type => species.types.includes(type));
|
||||
}
|
||||
const item = this.dex.items.get(set.item);
|
||||
if (item.megaStone) {
|
||||
if (Array.isArray(item.megaStone)) {
|
||||
const index = (item.megaEvolves as string[]).indexOf(species.name);
|
||||
if (index >= 0) {
|
||||
species = this.dex.species.get(item.megaStone[index]);
|
||||
typeTable = typeTable.filter(type => species.types.includes(type));
|
||||
}
|
||||
} else {
|
||||
species = this.dex.species.get(item.megaStone);
|
||||
typeTable = typeTable.filter(type => species.types.includes(type));
|
||||
}
|
||||
if (item.megaStone?.[species.name]) {
|
||||
species = this.dex.species.get(item.megaStone[species.name]);
|
||||
typeTable = typeTable.filter(type => species.types.includes(type));
|
||||
}
|
||||
if (item.id === "ultranecroziumz" && species.baseSpecies === "Necrozma") {
|
||||
species = this.dex.species.get("Necrozma-Ultra");
|
||||
|
|
@ -1556,17 +1548,9 @@ export const Rulesets: import('../sim/dex-formats').FormatDataTable = {
|
|||
}
|
||||
color = species.color;
|
||||
const item = this.dex.items.get(set.item);
|
||||
if (item.megaStone) {
|
||||
if (Array.isArray(item.megaStone)) {
|
||||
const index = (item.megaEvolves as string[]).indexOf(species.name);
|
||||
if (index >= 0) {
|
||||
species = this.dex.species.get(item.megaStone[index]);
|
||||
color = species.color;
|
||||
}
|
||||
} else {
|
||||
species = this.dex.species.get(item.megaStone);
|
||||
color = species.color;
|
||||
}
|
||||
if (item.megaStone?.[species.name]) {
|
||||
species = this.dex.species.get(item.megaStone[species.name]);
|
||||
color = species.color;
|
||||
}
|
||||
if (item.id === "ultranecroziumz" && species.baseSpecies === "Necrozma") {
|
||||
species = this.dex.species.get("Necrozma-Ultra");
|
||||
|
|
@ -1622,35 +1606,6 @@ export const Rulesets: import('../sim/dex-formats').FormatDataTable = {
|
|||
this.add('rule', 'Terastal Clause: You cannot Terastallize');
|
||||
},
|
||||
},
|
||||
arceusevlimit: {
|
||||
effectType: 'ValidatorRule',
|
||||
name: 'Arceus EV Limit',
|
||||
desc: "Restricts Arceus to a maximum of 100 EVs in any one stat, and only multiples of 10",
|
||||
onValidateSet(set) {
|
||||
const species = this.dex.species.get(set.species);
|
||||
if (species.num === 493 && set.evs) {
|
||||
let stat: StatID;
|
||||
for (stat in set.evs) {
|
||||
const ev = set.evs[stat];
|
||||
if (ev > 100) {
|
||||
return [
|
||||
"Arceus can't have more than 100 EVs in any stat, because Arceus is only obtainable from level 100 events.",
|
||||
"Level 100 Pokemon can only gain EVs from vitamins (Carbos etc), which are capped at 100 EVs.",
|
||||
];
|
||||
}
|
||||
if (!(
|
||||
ev % 10 === 0 ||
|
||||
(ev % 10 === 8 && ev % 4 === 0)
|
||||
)) {
|
||||
return [
|
||||
"Arceus can only have EVs that are multiples of 10, because Arceus is only obtainable from level 100 events.",
|
||||
"Level 100 Pokemon can only gain EVs from vitamins (Carbos etc), which boost in multiples of 10.",
|
||||
];
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
inversemod: {
|
||||
effectType: 'Rule',
|
||||
name: 'Inverse Mod',
|
||||
|
|
@ -2666,12 +2621,10 @@ export const Rulesets: import('../sim/dex-formats').FormatDataTable = {
|
|||
) {
|
||||
species = this.dex.species.get(`${species.baseSpecies}-Crowned`);
|
||||
}
|
||||
if (set.item && this.dex.items.get(set.item).megaStone) {
|
||||
if (set.item) {
|
||||
const item = this.dex.items.get(set.item);
|
||||
if (item.megaEvolves?.includes(species.name)) {
|
||||
species = this.dex.species.get(Array.isArray(item.megaEvolves) ?
|
||||
(item.megaStone as string[])[item.megaEvolves.indexOf(species.name)] :
|
||||
item.megaStone as string);
|
||||
if (item.megaStone?.[species.name]) {
|
||||
species = this.dex.species.get(item.megaStone[species.name]);
|
||||
}
|
||||
}
|
||||
if (this.ruleTable.isRestrictedSpecies(species) ||
|
||||
|
|
@ -2693,10 +2646,8 @@ export const Rulesets: import('../sim/dex-formats').FormatDataTable = {
|
|||
}
|
||||
if (set.item) {
|
||||
const item = this.dex.items.get(set.item);
|
||||
if (item.megaEvolves?.includes(set.species)) {
|
||||
godSpecies = this.dex.species.get(Array.isArray(item.megaEvolves) ?
|
||||
(item.megaStone as string[])[item.megaEvolves.indexOf(set.species)] :
|
||||
item.megaStone as string);
|
||||
if (item.megaStone?.[set.species]) {
|
||||
godSpecies = this.dex.species.get(item.megaStone[set.species]);
|
||||
}
|
||||
if (["Zacian", "Zamazenta"].includes(godSpecies.baseSpecies) && item.id.startsWith('rusted')) {
|
||||
godSpecies = this.dex.species.get(set.species + "-Crowned");
|
||||
|
|
|
|||
|
|
@ -122,7 +122,7 @@ export function visualize(value: any, depth = 0): string {
|
|||
return `${constructor} (${value.size}) { ${mapped.join(', ')} }`;
|
||||
case 'Set':
|
||||
if (depth > 2) return `Set`;
|
||||
return `${constructor} (${value.size}) { ${[...value].map(v => visualize(v), depth + 1).join(', ')} }`;
|
||||
return `${constructor} (${value.size}) { ${[...value].map(v => visualize(v, depth + 1)).join(', ')} }`;
|
||||
}
|
||||
|
||||
if (value.toString) {
|
||||
|
|
|
|||
|
|
@ -675,9 +675,9 @@ export const commands: Chat.ChatCommands = {
|
|||
if (!target) target = user.name;
|
||||
|
||||
const values = await Ladders.visualizeAll(target);
|
||||
let buffer = `<div class="ladder"><table>`;
|
||||
buffer += Utils.html`<tr><td colspan="8">User: <strong>${target}</strong></td></tr>`;
|
||||
|
||||
let buffer = `<div class="ladder">`;
|
||||
buffer += Utils.html`<div>User: <strong>${target}</strong></div>`;
|
||||
buffer += `<div style="overflow-x: auto;"><table>`;
|
||||
const ratings = values.join(``);
|
||||
if (!ratings) {
|
||||
buffer += `<tr><td colspan="8"><em>${this.tr`This user has not played any ladder games yet.`}</em></td></tr>`;
|
||||
|
|
@ -685,8 +685,7 @@ export const commands: Chat.ChatCommands = {
|
|||
buffer += `<tr><th>${this.tr`Format`}</th><th><abbr title="Elo rating">Elo</abbr></th><th>${this.tr`W`}</th><th>${this.tr`L`}</th><th>${this.tr`Total`}</th>`;
|
||||
buffer += ratings;
|
||||
}
|
||||
buffer += `</table></div>`;
|
||||
|
||||
buffer += `</table></div></div>`;
|
||||
this.sendReply(`|raw|${buffer}`);
|
||||
},
|
||||
rankhelp: [
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ SOURCE FOR LINKREGEX (compile with https://regexfree.k55.io/ )
|
|||
(
|
||||
# characters allowed inside URL paths
|
||||
(
|
||||
[^\s()&<>[\]] | & | "
|
||||
[^\s()&<>[\]`] | & | "
|
||||
|
|
||||
# parentheses in URLs should be matched, so they're not confused
|
||||
# for parentheses around URLs
|
||||
|
|
@ -60,7 +60,7 @@ SOURCE FOR LINKREGEX (compile with https://regexfree.k55.io/ )
|
|||
(?! [^ ]*> )
|
||||
|
||||
*/
|
||||
export const linkRegex = /(?:(?:https?:\/\/[a-z0-9-]+(?:\.[a-z0-9-]+)*|www\.[a-z0-9-]+(?:\.[a-z0-9-]+)+|\b[a-z0-9-]+(?:\.[a-z0-9-]+)*\.(?:(?:com?|org|net|edu|info|us|jp)\b|[a-z]{2,3}(?=:[0-9]|\/)))(?::[0-9]+)?(?:\/(?:(?:[^\s()&<>[\]]|&|"|\((?:[^\s()<>&[\]]|&)*\)|\[(?:[^\s()<>&[\]]|&)*])*(?:[^\s()[\]{}".,!?;:&<>*`^~\\]|\((?:[^\s()<>&[\]]|&)*\)))?)?|[a-z0-9.]+@[a-z0-9-]+(?:\.[a-z0-9-]+)*\.[a-z]{2,})(?![^ ]*>)/ig;
|
||||
export const linkRegex = /(?:(?:https?:\/\/[a-z0-9-]+(?:\.[a-z0-9-]+)*|www\.[a-z0-9-]+(?:\.[a-z0-9-]+)+|\b[a-z0-9-]+(?:\.[a-z0-9-]+)*\.(?:(?:com?|org|net|edu|info|us|jp)\b|[a-z]{2,3}(?=:[0-9]|\/)))(?::[0-9]+)?(?:\/(?:(?:[^\s()&<>[\]`]|&|"|\((?:[^\s()<>&[\]]|&)*\)|\[(?:[^\s()<>&[\]]|&)*])*(?:[^\s()[\]{}".,!?;:&<>*`^~\\]|\((?:[^\s()<>&[\]]|&)*\)))?)?|[a-z0-9.]+@[a-z0-9-]+(?:\.[a-z0-9-]+)*\.[a-z]{2,})(?![^ ]*>)/ig;
|
||||
|
||||
/**
|
||||
* A span is a part of the text that's formatted. In the text:
|
||||
|
|
@ -422,7 +422,12 @@ class TextFormatter {
|
|||
let i = start + 2;
|
||||
// Find </a> or </u>.
|
||||
// We need to check the location of `>` to disambiguate from </small>.
|
||||
while (this.at(i) !== '<' || this.at(i + 1) !== '/' || this.at(i + 3) !== '>') i++;
|
||||
while (this.at(i) !== '<' || this.at(i + 1) !== '/' || this.at(i + 3) !== '>') {
|
||||
if (i >= this.str.length) {
|
||||
throw new Error(`Unclosed URL span when parsing: ${this.str}`);
|
||||
}
|
||||
i++;
|
||||
}
|
||||
i += 4;
|
||||
this.pushSlice(i);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -259,8 +259,11 @@ export class Auction extends Rooms.SimpleRoomGame {
|
|||
sendBidInfo() {
|
||||
let buf = `<div class="infobox">`;
|
||||
buf += Utils.html`Player: <username>${this.nominatedPlayer.name}</username> `;
|
||||
if (this.type === 'auction') buf += `Top bid: <b>${this.highestBid}</b> `;
|
||||
if (this.type === 'auction') buf += Utils.html`Top bidder: <b>${this.highestBidder.name}</b><br/>`;
|
||||
if (this.type === 'auction') {
|
||||
buf += `Top bid: <b>${this.highestBid}</b> `;
|
||||
buf += Utils.html`Top bidder: <b>${this.highestBidder.name}</b> `;
|
||||
buf += `Managers: ${this.highestBidder.getManagers().map(m => `<username class="username">${Utils.escapeHTML(m)}</username>`).join(' ')}<br/>`;
|
||||
}
|
||||
buf += Utils.html`Tiers Played: <b>${this.nominatedPlayer.tiersPlayed.length ? `${this.nominatedPlayer.tiersPlayed.join(', ')}` : 'N/A'}</b><br/>`;
|
||||
buf += Utils.html`Tiers Not Played: <b>${this.nominatedPlayer.tiersNotPlayed.length ? `${this.nominatedPlayer.tiersNotPlayed.join(', ')}` : 'N/A'}</b>`;
|
||||
buf += `</div>`;
|
||||
|
|
|
|||
|
|
@ -29,14 +29,23 @@ function getMegaStone(stone: string, mod = 'gen9'): Item | null {
|
|||
id: move.id,
|
||||
name: move.name,
|
||||
fullname: move.name,
|
||||
megaEvolves: 'Rayquaza',
|
||||
megaStone: 'Rayquaza-Mega',
|
||||
megaStone: { 'Rayquaza': 'Rayquaza-Mega' },
|
||||
exists: true,
|
||||
// Adding extra values to appease typescript
|
||||
gen: 6,
|
||||
num: -1,
|
||||
effectType: 'Item',
|
||||
sourceEffect: '',
|
||||
isBerry: false,
|
||||
ignoreKlutz: false,
|
||||
isGem: false,
|
||||
isPokeball: false,
|
||||
isPrimalOrb: false,
|
||||
shortDesc: "",
|
||||
desc: "",
|
||||
isNonstandard: null,
|
||||
noCopy: false,
|
||||
affectsFainted: false,
|
||||
} as Item;
|
||||
} else {
|
||||
return null;
|
||||
|
|
@ -131,8 +140,8 @@ export const commands: Chat.ChatCommands = {
|
|||
megaSpecies = dex.species.get(forcedForme);
|
||||
baseSpecies = dex.species.get(forcedForme.split('-')[0]);
|
||||
} else {
|
||||
megaSpecies = dex.species.get(Array.isArray(stone.megaStone) ? stone.megaStone[0] : stone.megaStone);
|
||||
baseSpecies = dex.species.get(Array.isArray(stone.megaEvolves) ? stone.megaEvolves[0] : stone.megaEvolves);
|
||||
megaSpecies = dex.species.get(Object.values(stone.megaStone!)[0]);
|
||||
baseSpecies = dex.species.get(Object.keys(stone.megaStone!)[0]);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
|
@ -282,8 +291,8 @@ export const commands: Chat.ChatCommands = {
|
|||
megaSpecies = dex.species.get(forcedForme);
|
||||
baseSpecies = dex.species.get(forcedForme.split('-')[0]);
|
||||
} else {
|
||||
megaSpecies = dex.species.get(Array.isArray(aStone.megaStone) ? aStone.megaStone[0] : aStone.megaStone);
|
||||
baseSpecies = dex.species.get(Array.isArray(aStone.megaEvolves) ? aStone.megaEvolves[0] : aStone.megaEvolves);
|
||||
megaSpecies = dex.species.get(Object.values(aStone.megaStone!)[0]);
|
||||
baseSpecies = dex.species.get(Object.keys(aStone.megaStone!)[0]);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
|
@ -840,20 +849,30 @@ export const commands: Chat.ChatCommands = {
|
|||
|
||||
reevo: 'showevo',
|
||||
showevo(target, room, user, connection, cmd) {
|
||||
if (!this.runBroadcast()) return;
|
||||
const targetid = toID(target);
|
||||
const args = target.split(',');
|
||||
if (!toID(args[0])) return this.parse('/help reevohelp');
|
||||
this.runBroadcast();
|
||||
let dex = Dex;
|
||||
if (args[1] && toID(args[1]) in Dex.dexes) {
|
||||
dex = Dex.dexes[toID(args[1])];
|
||||
} else if (room?.battle) {
|
||||
const format = Dex.formats.get(room.battle.format);
|
||||
dex = Dex.mod(format.mod);
|
||||
}
|
||||
|
||||
const targetid = toID(args[0]);
|
||||
const isReEvo = cmd === 'reevo';
|
||||
if (!targetid) return this.parse(`/help ${isReEvo ? 're' : 'show'}evo`);
|
||||
const evo = Dex.species.get(target);
|
||||
const evo = dex.species.get(targetid);
|
||||
if (!evo.exists) {
|
||||
throw new Chat.ErrorMessage(`Error: Pok\u00e9mon ${target} not found.`);
|
||||
throw new Chat.ErrorMessage(`Error: Pok\u00e9mon ${targetid} not found.`);
|
||||
}
|
||||
if (!evo.prevo) {
|
||||
const evoBaseSpecies = Dex.species.get(
|
||||
const evoBaseSpecies = dex.species.get(
|
||||
(Array.isArray(evo.battleOnly) ? evo.battleOnly[0] : evo.battleOnly) || evo.changesFrom || evo.name
|
||||
);
|
||||
if (!evoBaseSpecies.prevo) throw new Chat.ErrorMessage(`Error: ${evoBaseSpecies.name} is not an evolution.`);
|
||||
const prevoSpecies = Dex.species.get(evoBaseSpecies.prevo);
|
||||
const prevoSpecies = dex.species.get(evoBaseSpecies.prevo);
|
||||
const deltas = Utils.deepClone(evo);
|
||||
if (!isReEvo) {
|
||||
deltas.tier = 'CE';
|
||||
|
|
@ -892,14 +911,14 @@ export const commands: Chat.ChatCommands = {
|
|||
const details = {
|
||||
Gen: evo.gen,
|
||||
Weight: `${deltas.weighthg < 0 ? "" : "+"}${deltas.weighthg / 10} kg`,
|
||||
Stage: (Dex.species.get(prevoSpecies.prevo).exists ? 3 : 2),
|
||||
Stage: (dex.species.get(prevoSpecies.prevo).exists ? 3 : 2),
|
||||
};
|
||||
this.sendReply(`|raw|${Chat.getDataPokemonHTML(deltas)}`);
|
||||
if (!isReEvo) {
|
||||
this.sendReply(`|raw|<font size="1"><font color="#686868">Gen:</font> ${details["Gen"]} |  <font color="#686868">Weight:</font> ${details["Weight"]} |  <font color="#686868">Stage:</font> ${details["Stage"]}</font>`);
|
||||
}
|
||||
} else {
|
||||
const prevoSpecies = Dex.species.get(evo.prevo);
|
||||
const prevoSpecies = dex.species.get(evo.prevo);
|
||||
const deltas = Utils.deepClone(evo);
|
||||
if (!isReEvo) {
|
||||
deltas.tier = 'CE';
|
||||
|
|
@ -932,7 +951,7 @@ export const commands: Chat.ChatCommands = {
|
|||
const details = {
|
||||
Gen: evo.gen,
|
||||
Weight: `${deltas.weighthg < 0 ? "" : "+"}${deltas.weighthg / 10} kg`,
|
||||
Stage: (Dex.species.get(prevoSpecies.prevo).exists ? 3 : 2),
|
||||
Stage: (dex.species.get(prevoSpecies.prevo).exists ? 3 : 2),
|
||||
};
|
||||
this.sendReply(`|raw|${Chat.getDataPokemonHTML(deltas)}`);
|
||||
if (!isReEvo) {
|
||||
|
|
|
|||
|
|
@ -257,21 +257,21 @@ function getLetsGoMoves(species: string | Species) {
|
|||
return data.moves.map(formatMove).sort().join(`, `);
|
||||
}
|
||||
|
||||
function battleFactorySets(species: string | Species, tier: string | null, gen = 'gen9', isBSS = false) {
|
||||
function battleFactorySets(species: string | Species, tier: string | null, gen = 'gen9', isBSS = false, is1v1 = false) {
|
||||
species = Dex.species.get(species);
|
||||
if (typeof species.battleOnly === 'string') {
|
||||
species = Dex.species.get(species.battleOnly);
|
||||
}
|
||||
gen = toID(gen);
|
||||
const genNum = parseInt(gen[3]);
|
||||
if (isNaN(genNum) || genNum < 6 || (isBSS && genNum < 7)) return null;
|
||||
if (isNaN(genNum) || genNum < 6 || (isBSS && genNum < 7) || (is1v1 && genNum < 9)) return null;
|
||||
const statsFile = JSON.parse(
|
||||
FS(`data/random-battles/gen${genNum}/${isBSS ? `bss-` : ``}factory-sets.json`).readIfExistsSync() ||
|
||||
FS(`data/random-battles/gen${genNum}/${isBSS ? `bss-` : is1v1 ? `1v1-` : ``}factory-sets.json`).readIfExistsSync() ||
|
||||
"{}"
|
||||
);
|
||||
if (!Object.keys(statsFile).length) return null;
|
||||
let buf = ``;
|
||||
if (!isBSS) {
|
||||
if (!isBSS && !is1v1) {
|
||||
if (!tier) throw new Chat.ErrorMessage(`Please provide a valid tier.`);
|
||||
if (!(toID(tier) in TIERS)) throw new Chat.ErrorMessage(`That tier isn't supported.`);
|
||||
if (!(TIERS[toID(tier)] in statsFile)) {
|
||||
|
|
@ -330,19 +330,26 @@ function battleFactorySets(species: string | Species, tier: string | null, gen =
|
|||
buf += `</ul></details>`;
|
||||
}
|
||||
} else {
|
||||
const format = Dex.formats.get(`${gen}bssfactory`);
|
||||
if (!(species.id in statsFile)) throw new Chat.ErrorMessage(`${species.name} doesn't have any sets in ${format.name}.`);
|
||||
const setObj = statsFile[species.id];
|
||||
const format = Dex.formats.get(`${gen}${is1v1 ? '1v1' : 'bss'}factory`);
|
||||
if (!((is1v1 ? species.name : species.id) in statsFile))
|
||||
throw new Chat.ErrorMessage(`${species.name} doesn't have any sets in ${format.name}.`);
|
||||
const setObj = statsFile[is1v1 ? species.name : species.id];
|
||||
if (genNum >= 9) {
|
||||
buf += `Species rarity: ${setObj.weight} (higher is more common, max 10)<br />`;
|
||||
buf += `Sets for ${species.name} in ${format.name}:<br />`;
|
||||
for (const [i, set] of setObj.sets.entries()) {
|
||||
buf += `<details class="details"><summary>Set ${i + 1} (${set.weight}%)</summary>`;
|
||||
buf += `<ul style="list-style-type:none;padding-left:0;">`;
|
||||
buf += `<li>${Dex.forFormat(format).species.get(set.species).name} @ ${set.item.map(formatItem).join(" / ")}</li>`;
|
||||
buf += `<li>Ability: ${set.ability.map(formatAbility).join(" / ")}</li>`;
|
||||
buf += `<li>Level: 50</li>`;
|
||||
buf += `<li>Tera Type: ${set.teraType.map(formatType).join(' / ')}</li>`;
|
||||
const item = !Array.isArray(set.item) ? [set.item] : set.item;
|
||||
buf += `<li>${Dex.forFormat(format).species.get(set.species).name} @ ${item.map(formatItem).join(" / ")}</li>`;
|
||||
const ability = !Array.isArray(set.ability) ? [set.ability] : set.ability;
|
||||
buf += `<li>Ability: ${ability.map(formatAbility).join(" / ")}</li>`;
|
||||
if (isBSS) {
|
||||
buf += `<li>Level: 50</li>`;
|
||||
} else if (set.level) {
|
||||
buf += `<li>Level: ${set.level}</li>`;
|
||||
}
|
||||
if (!is1v1) buf += `<li>Tera Type: ${set.teraType.map(formatType).join(' / ')}</li>`;
|
||||
if (set.evs) {
|
||||
buf += `<li>EVs: `;
|
||||
const evs: string[] = [];
|
||||
|
|
@ -353,7 +360,8 @@ function battleFactorySets(species: string | Species, tier: string | null, gen =
|
|||
}
|
||||
buf += `${evs.join(" / ")}</li>`;
|
||||
}
|
||||
buf += `<li>${formatNature(set.nature)} Nature</li>`;
|
||||
const nature = !Array.isArray(set.nature) ? [set.nature] : set.nature;
|
||||
buf += `<li>${nature.map(formatNature).join(" / ")} Nature</li>`;
|
||||
if (set.ivs) {
|
||||
buf += `<li>IVs: `;
|
||||
const ivs: string[] = [];
|
||||
|
|
@ -603,10 +611,12 @@ export const commands: Chat.ChatCommands = {
|
|||
`/randomdoublesbattle OR /randdubs [pokemon], [gen] - Same as above, but instead displays Random Doubles Battle moves.`,
|
||||
],
|
||||
|
||||
'1v1factory': 'battlefactory',
|
||||
bssfactory: 'battlefactory',
|
||||
battlefactory(target, room, user, connection, cmd) {
|
||||
if (!this.runBroadcast()) return;
|
||||
const isBSS = cmd === 'bssfactory';
|
||||
const is1v1 = cmd === '1v1factory';
|
||||
if (isBSS) {
|
||||
const args = target.split(',');
|
||||
if (!args[0]) return this.parse(`/help battlefactory`);
|
||||
|
|
@ -619,6 +629,15 @@ export const commands: Chat.ChatCommands = {
|
|||
const bssSets = battleFactorySets(species, null, mod, true);
|
||||
if (!bssSets) return this.parse(`/help battlefactory`);
|
||||
return this.sendReplyBox(bssSets);
|
||||
} else if (is1v1) {
|
||||
if (!target) return this.parse(`/help battlefactory`);
|
||||
const species = Dex.species.get(target);
|
||||
if (!species.exists) {
|
||||
throw new Chat.ErrorMessage(`Error: Pok\u00e9mon '${target.trim()}' not found.`);
|
||||
}
|
||||
const onevoneSets = battleFactorySets(species, null, 'gen9', false, true);
|
||||
if (!onevoneSets) return this.parse(`/help battlefactory`);
|
||||
return this.sendReplyBox(onevoneSets);
|
||||
} else {
|
||||
const args = target.split(',');
|
||||
if (!args[0]) return this.parse(`/help battlefactory`);
|
||||
|
|
|
|||
|
|
@ -373,7 +373,7 @@ class SSBSetsHTML extends Chat.JSX.Component<{ target: string }> {
|
|||
<SSBInnateHTML name={setName} dex={dex} baseDex={baseDex} />
|
||||
<SSBPokemonHTML species={set.species} dex={dex} baseDex={baseDex} />
|
||||
{(!Array.isArray(set.item) && item.megaStone) && <SSBPokemonHTML
|
||||
species={Array.isArray(item.megaStone) ? item.megaStone[0] : item.megaStone} dex={dex} baseDex={baseDex}
|
||||
species={Object.values(item.megaStone)[0]} dex={dex} baseDex={baseDex}
|
||||
/>}
|
||||
{/* keys and Kennedy have an itemless forme change */}
|
||||
{['Rayquaza'].includes(set.species) && <SSBPokemonHTML species={`${set.species}-Mega`} dex={dex} baseDex={baseDex} />}
|
||||
|
|
|
|||
|
|
@ -134,7 +134,7 @@ export function getSpeciesName(set: PokemonSet, format: Format) {
|
|||
} else if (species === "Groudon" && item.name === "Red Orb") {
|
||||
return "Groudon-Primal";
|
||||
} else if (item.megaStone) {
|
||||
return Array.isArray(item.megaStone) ? item.megaStone[0] : item.megaStone;
|
||||
return Object.values(item.megaStone)[0];
|
||||
} else if (species === "Rayquaza" && moves.includes('Dragon Ascent') && !item.zMove && megaRayquazaPossible) {
|
||||
return "Rayquaza-Mega";
|
||||
} else if (species === "Poltchageist-Artisan") { // Babymons from here on out
|
||||
|
|
|
|||
|
|
@ -1021,3 +1021,13 @@ export const roomSettings: Chat.SettingsHandler[] = [
|
|||
] : [['disabled', true]],
|
||||
}),
|
||||
];
|
||||
|
||||
export const destroy = () => {
|
||||
for (const [, v] of otds) {
|
||||
if (v.autoStartTimer) {
|
||||
clearInterval(v.autoStartTimer);
|
||||
v.autoStartTimer = null;
|
||||
v.room.modlog({ action: `${v.id.toUpperCase()} TIMER RESTART` });
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -167,7 +167,7 @@ export class FriendsDatabase {
|
|||
}
|
||||
private async query(input: DatabaseRequest) {
|
||||
const process = PM.acquire();
|
||||
if (!process || !Config.usesqlite) {
|
||||
if (!process || !Config.usesqlite || !Config.usesqlitefriends) {
|
||||
return null;
|
||||
}
|
||||
const result = await process.query(input);
|
||||
|
|
@ -431,7 +431,7 @@ export const PM = new ProcessManager.QueryProcessManager<DatabaseRequest, Databa
|
|||
|
||||
if (!PM.isParentProcess) {
|
||||
ConfigLoader.ensureLoaded();
|
||||
if (Config.usesqlite) {
|
||||
if (Config.usesqlite && Config.usesqlitefriends) {
|
||||
FriendsDatabase.setupDatabase();
|
||||
}
|
||||
global.Monitor = {
|
||||
|
|
|
|||
|
|
@ -127,7 +127,9 @@ function setupGlobals() {
|
|||
global.TeamValidatorAsync = TeamValidatorAsync;
|
||||
|
||||
global.Sockets = Sockets;
|
||||
Sockets.start(Config.subprocessescache);
|
||||
if (!Config.lazysockets) {
|
||||
Sockets.start(Config.subprocessescache);
|
||||
}
|
||||
}
|
||||
|
||||
export const readyPromise = cleanupStale().then(() => {
|
||||
|
|
|
|||
|
|
@ -1078,7 +1078,7 @@ export abstract class BasicRoom {
|
|||
runAutoModchat() {
|
||||
if (!this.settings.autoModchat || this.settings.autoModchat.active) return;
|
||||
// they are staff and online
|
||||
const staff = Object.values(this.users).filter(u => this.auth.atLeast(u, '%'));
|
||||
const staff = Object.values(this.users).filter(u => this.auth.atLeast(u, '%') && u.statusType === 'online');
|
||||
if (!staff.length) {
|
||||
const { time } = this.settings.autoModchat;
|
||||
if (!time || time < 5) {
|
||||
|
|
|
|||
|
|
@ -100,7 +100,6 @@ export class BattleActions {
|
|||
|
||||
// will definitely switch out at this point
|
||||
|
||||
oldActive.illusion = null;
|
||||
this.battle.singleEvent('End', oldActive.getAbility(), oldActive.abilityState, oldActive);
|
||||
this.battle.singleEvent('End', oldActive.getItem(), oldActive.itemState, oldActive);
|
||||
|
||||
|
|
@ -1871,21 +1870,15 @@ export class BattleActions {
|
|||
pokemon.baseMoves.includes(toID(altForme.requiredMove)) && !item.zMove) {
|
||||
return altForme.name;
|
||||
}
|
||||
if (!item.megaStone) return null;
|
||||
// Temporary hardcode until generation shift
|
||||
if ((species.baseSpecies === "Floette" || species.baseSpecies === "Zygarde") && item.megaEvolves === species.name) {
|
||||
return item.megaStone as string;
|
||||
if ((species.baseSpecies === "Floette" || species.baseSpecies === "Zygarde") && item.megaStone[species.name]) {
|
||||
return item.megaStone[species.name];
|
||||
}
|
||||
// a hacked-in Megazard X can mega evolve into Megazard Y, but not into Megazard X
|
||||
if (Array.isArray(item.megaStone)) {
|
||||
// FIXME: Change to species.name when champions comes
|
||||
const index = (item.megaEvolves as string[]).indexOf(species.baseSpecies);
|
||||
if (index < 0) return null;
|
||||
return item.megaStone[index];
|
||||
// FIXME: Change to species.name when champions comes
|
||||
} else if (item.megaEvolves === species.baseSpecies && item.megaStone !== species.name) {
|
||||
return item.megaStone;
|
||||
}
|
||||
return null;
|
||||
// FIXME: Change to species.name when champions comes
|
||||
const megaEvolution = item.megaStone[species.baseSpecies];
|
||||
return megaEvolution && megaEvolution !== species.name ? megaEvolution : null;
|
||||
}
|
||||
|
||||
canUltraBurst(pokemon: Pokemon) {
|
||||
|
|
|
|||
|
|
@ -1298,6 +1298,39 @@ export class Battle {
|
|||
return !!move.flags['contact'];
|
||||
}
|
||||
|
||||
skillSwap(source: Pokemon, target: Pokemon) {
|
||||
if (source.fainted || target.fainted) return false;
|
||||
if (source.volatiles['dynamax'] || target.volatiles['dynamax']) return false;
|
||||
const sourceAbility = source.getAbility();
|
||||
const targetAbility = target.getAbility();
|
||||
if (sourceAbility.flags['failskillswap'] || targetAbility.flags['failskillswap']) return false;
|
||||
if (this.gen <= 5 && sourceAbility.id === targetAbility.id) return false;
|
||||
|
||||
const sourceEffect = this.dex.conditions.get('skillswap');
|
||||
const targetCanBeSet = this.runEvent('SetAbility', target, source, sourceEffect, sourceAbility);
|
||||
if (!targetCanBeSet) return targetCanBeSet;
|
||||
const sourceCanBeSet = this.runEvent('SetAbility', source, source, sourceEffect, targetAbility);
|
||||
if (!sourceCanBeSet) return sourceCanBeSet;
|
||||
|
||||
if (this.gen <= 4 || source.isAlly(target)) {
|
||||
this.add('-activate', source, 'Skill Swap');
|
||||
} else {
|
||||
this.add('-activate', source, 'Skill Swap', target, `[ability] ${targetAbility.name}`, `[ability2] ${sourceAbility.name}`);
|
||||
}
|
||||
this.singleEvent('End', sourceAbility, source.abilityState, source);
|
||||
this.singleEvent('End', targetAbility, target.abilityState, target);
|
||||
source.ability = targetAbility.id;
|
||||
target.ability = sourceAbility.id;
|
||||
source.abilityState = this.initEffectState({ id: toID(source.ability), target: source });
|
||||
target.abilityState = this.initEffectState({ id: toID(target.ability), target });
|
||||
source.volatileStaleness = undefined;
|
||||
if (!source.isAlly(target)) target.volatileStaleness = 'external';
|
||||
if (this.gen > 3) {
|
||||
this.singleEvent('Start', sourceAbility, target.abilityState, target);
|
||||
this.singleEvent('Start', targetAbility, source.abilityState, source);
|
||||
}
|
||||
}
|
||||
|
||||
getPokemon(fullname: string | Pokemon) {
|
||||
if (typeof fullname !== 'string') fullname = fullname.fullname;
|
||||
for (const side of this.sides) {
|
||||
|
|
@ -1790,7 +1823,7 @@ export class Battle {
|
|||
if (this.turn <= 100) return;
|
||||
|
||||
// the turn limit is not a part of Endless Battle Clause
|
||||
if (this.turn >= 1000) {
|
||||
if (this.turn > 1000) {
|
||||
this.add('message', `It is turn 1000. You have hit the turn limit!`);
|
||||
this.tie();
|
||||
return true;
|
||||
|
|
@ -3144,9 +3177,9 @@ export class Battle {
|
|||
this.log[this.lastMoveLine] = parts.join('|');
|
||||
}
|
||||
|
||||
debug(activity: string) {
|
||||
debug(...activity: Part[]) {
|
||||
if (this.debugMode) {
|
||||
this.add('debug', activity);
|
||||
this.add('debug', ...activity);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -85,7 +85,7 @@ export class DexAbilities {
|
|||
}
|
||||
|
||||
getByID(id: ID): Ability {
|
||||
if (id === '') return EMPTY_ABILITY;
|
||||
if (id === '' || id === 'constructor') return EMPTY_ABILITY;
|
||||
let ability = this.abilityCache.get(id);
|
||||
if (ability) return ability;
|
||||
|
||||
|
|
|
|||
|
|
@ -665,7 +665,7 @@ export class DexConditions {
|
|||
}
|
||||
|
||||
getByID(id: ID): Condition {
|
||||
if (id === '') return EMPTY_CONDITION;
|
||||
if (id === '' || id === 'constructor') return EMPTY_CONDITION;
|
||||
|
||||
let condition = this.conditionCache.get(id);
|
||||
if (condition) return condition;
|
||||
|
|
|
|||
|
|
@ -172,7 +172,7 @@ export class DexNatures {
|
|||
return this.getByID(toID(name));
|
||||
}
|
||||
getByID(id: ID): Nature {
|
||||
if (id === '') return EMPTY_NATURE;
|
||||
if (id === '' || id === 'constructor') return EMPTY_NATURE;
|
||||
let nature = this.natureCache.get(id);
|
||||
if (nature) return nature;
|
||||
|
||||
|
|
@ -297,7 +297,7 @@ export class DexTypes {
|
|||
}
|
||||
|
||||
getByID(id: ID): TypeInfo {
|
||||
if (id === '') return EMPTY_TYPE_INFO;
|
||||
if (id === '' || id === 'constructor') return EMPTY_TYPE_INFO;
|
||||
let type = this.typeCache.get(id);
|
||||
if (type) return type;
|
||||
|
||||
|
|
|
|||
|
|
@ -43,17 +43,11 @@ export class Item extends BasicEffect implements Readonly<BasicEffect> {
|
|||
*/
|
||||
readonly onMemory?: string;
|
||||
/**
|
||||
* If this is a mega stone: The name (e.g. Charizard-Mega-X) of the
|
||||
* forme this allows transformation into.
|
||||
* If this is a mega stone: A pair (e.g. Charizard: Charizard-Mega-X) of the
|
||||
* forme this allows transformation from and into.
|
||||
* undefined, if not a mega stone.
|
||||
*/
|
||||
readonly megaStone?: string | string[];
|
||||
/**
|
||||
* If this is a mega stone: The name (e.g. Charizard) of the
|
||||
* forme this allows transformation from.
|
||||
* undefined, if not a mega stone.
|
||||
*/
|
||||
readonly megaEvolves?: string | string[];
|
||||
readonly megaStone?: { [megaEvolves: string]: string };
|
||||
/**
|
||||
* If this is a Z crystal: true if the Z Crystal is generic
|
||||
* (e.g. Firium Z). If species-specific, the name
|
||||
|
|
@ -116,7 +110,6 @@ export class Item extends BasicEffect implements Readonly<BasicEffect> {
|
|||
this.onDrive = data.onDrive || undefined;
|
||||
this.onMemory = data.onMemory || undefined;
|
||||
this.megaStone = data.megaStone || undefined;
|
||||
this.megaEvolves = data.megaEvolves || undefined;
|
||||
this.zMove = data.zMove || undefined;
|
||||
this.zMoveType = data.zMoveType || undefined;
|
||||
this.zMoveFrom = data.zMoveFrom || undefined;
|
||||
|
|
@ -176,7 +169,7 @@ export class DexItems {
|
|||
}
|
||||
|
||||
getByID(id: ID): Item {
|
||||
if (id === '') return EMPTY_ITEM;
|
||||
if (id === '' || id === 'constructor') return EMPTY_ITEM;
|
||||
let item = this.itemCache.get(id);
|
||||
if (item) return item;
|
||||
if (this.dex.getAlias(id)) {
|
||||
|
|
|
|||
|
|
@ -621,7 +621,7 @@ export class DexMoves {
|
|||
}
|
||||
|
||||
getByID(id: ID): Move {
|
||||
if (id === '') return EMPTY_MOVE;
|
||||
if (id === '' || id === 'constructor') return EMPTY_MOVE;
|
||||
let move = this.moveCache.get(id);
|
||||
if (move) return move;
|
||||
if (this.dex.getAlias(id)) {
|
||||
|
|
|
|||
|
|
@ -436,7 +436,7 @@ export class DexSpecies {
|
|||
}
|
||||
|
||||
getByID(id: ID): Species {
|
||||
if (id === '') return EMPTY_SPECIES;
|
||||
if (id === '' || id === 'constructor') return EMPTY_SPECIES;
|
||||
let species: Mutable<Species> | undefined = this.speciesCache.get(id);
|
||||
if (species) return species;
|
||||
|
||||
|
|
|
|||
|
|
@ -1900,10 +1900,18 @@ export class Pokemon {
|
|||
this.ability = ability.id;
|
||||
this.abilityState = this.battle.initEffectState({ id: ability.id, target: this });
|
||||
if (sourceEffect && !isFromFormeChange && !isTransform) {
|
||||
if (source) {
|
||||
this.battle.add('-ability', this, ability.name, oldAbility.name, `[from] ${sourceEffect.fullname}`, `[of] ${source}`);
|
||||
} else {
|
||||
this.battle.add('-ability', this, ability.name, oldAbility.name, `[from] ${sourceEffect.fullname}`);
|
||||
switch (sourceEffect.id) {
|
||||
case 'mummy':
|
||||
case 'lingeringaroma':
|
||||
this.battle.add('-activate', source, sourceEffect.fullname, this, '[ability] ' + oldAbility.name);
|
||||
break;
|
||||
default:
|
||||
if (source) {
|
||||
this.battle.add('-ability', this, ability.name, oldAbility.name, `[from] ${sourceEffect.fullname}`, `[of] ${source}`);
|
||||
} else {
|
||||
this.battle.add('-ability', this, ability.name, oldAbility.name, `[from] ${sourceEffect.fullname}`);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (ability.id && this.battle.gen > 3 &&
|
||||
|
|
|
|||
|
|
@ -526,14 +526,8 @@ export class TeamValidator {
|
|||
|
||||
if (ruleTable.has('obtainableformes')) {
|
||||
const canMegaEvo = dex.gen <= 7 || ruleTable.has('+pokemontag:past');
|
||||
if (item.megaEvolves?.includes(species.name)) {
|
||||
if (!item.megaStone) throw new Error(`Item ${item.name} has no base form for mega evolution`);
|
||||
if (Array.isArray(item.megaEvolves)) {
|
||||
const idx = item.megaEvolves.indexOf(species.name);
|
||||
tierSpecies = dex.species.get(item.megaStone[idx]);
|
||||
} else {
|
||||
tierSpecies = dex.species.get(item.megaStone as string);
|
||||
}
|
||||
if (item.megaStone?.[species.name]) {
|
||||
tierSpecies = dex.species.get(item.megaStone[species.name]);
|
||||
} else if (item.id === 'redorb' && species.id === 'groudon') {
|
||||
tierSpecies = dex.species.get('Groudon-Primal');
|
||||
} else if (item.id === 'blueorb' && species.id === 'kyogre') {
|
||||
|
|
@ -2099,6 +2093,25 @@ export class TeamValidator {
|
|||
if (fastReturn) return true;
|
||||
problems.push(`${name} must be at least level ${eventData.level}${etc}.`);
|
||||
}
|
||||
if ((dex.gen === 3 || dex.gen === 4) && eventData.level === 100 && set.evs) {
|
||||
let statName: StatID;
|
||||
for (statName in set.evs) {
|
||||
const ev = set.evs[statName];
|
||||
if (ev > 100) {
|
||||
problems.push(
|
||||
`${name} can't have more than 100 EVs in any stat, because it is only obtainable from level 100 events. Level 100 Pokemon can only gain EVs from vitamins (Carbos etc), which are capped at 100 EVs.`,
|
||||
);
|
||||
}
|
||||
if (!(
|
||||
ev % 10 === 0 ||
|
||||
(ev % 10 === 8 && ev % 4 === 0)
|
||||
)) {
|
||||
problems.push(
|
||||
`${name} can only have EVs that are multiples of 10, because it is only obtainable from level 100 events. Level 100 Pokemon can only gain EVs from vitamins (Carbos etc), which boost in multiples of 10.`,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
if ((eventData.shiny === true && !set.shiny) || (!eventData.shiny && set.shiny)) {
|
||||
if (fastReturn) return true;
|
||||
const shinyReq = eventData.shiny ? ` be shiny` : ` not be shiny`;
|
||||
|
|
|
|||
|
|
@ -137,8 +137,8 @@ export class ExhaustiveRunner {
|
|||
const signatures = new Map();
|
||||
for (const id of pools.items.possible) {
|
||||
const item = dex.data.Items[id];
|
||||
if (item.megaEvolves) {
|
||||
const pokemon = toID(item.megaEvolves);
|
||||
if (item.megaStone) {
|
||||
const pokemon = toID(Object.keys(item.megaStone)[0]);
|
||||
const combo = { item: id };
|
||||
let combos = signatures.get(pokemon);
|
||||
if (!combos) {
|
||||
|
|
|
|||
|
|
@ -29,12 +29,16 @@ config.crashguard = false;
|
|||
config.watchconfig = false;
|
||||
// Don't try to write to file system
|
||||
config.nofswriting = true;
|
||||
// allow renaming without a token
|
||||
// Don't try to listen to the network
|
||||
config.lazysockets = true;
|
||||
// Allow renaming without a token
|
||||
config.noguestsecurity = true;
|
||||
// Test a normal ladder
|
||||
config.fakeladder = false;
|
||||
// Don't log monitor messages to the console (necessary so that chat monitor tests don't clog up stdout)
|
||||
config.loglevel = 3;
|
||||
// If sqlite is enabled at all, run tests in server/modlog
|
||||
config.usesqlitemodlog = true;
|
||||
|
||||
require('./../dist/lib/process-manager').ProcessManager.disabled = true;
|
||||
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ const assert = require('../../assert');
|
|||
|
||||
describe.skip("Friends lists", () => {
|
||||
const { FriendsDatabase } = require('../../../dist/server/friends');
|
||||
const test = (Config.usesqlite ? it : it.skip);
|
||||
const test = (Config.usesqlite && Config.usesqlitefriends ? it : it.skip);
|
||||
test("Should properly setup database", () => {
|
||||
assert.doesNotThrow(() => FriendsDatabase.setupDatabase(':memory:'));
|
||||
});
|
||||
|
|
|
|||
|
|
@ -3,6 +3,17 @@
|
|||
const assert = require('assert').strict;
|
||||
|
||||
describe('Chat', () => {
|
||||
it('should not infinite loop formatText', () => {
|
||||
assert.equal(
|
||||
Chat.formatText(`<\\\\||^^**~~\`\`https://a/Olaaaseusbobalhos\`\`~~**^^||\\\\`),
|
||||
`<<sub><span class="spoiler"><sup><b><s><code><a href="https://a/Olaaaseusbobalhos" rel="noopener" target="_blank">https://a/Olaaaseusbobalhos</a></code></s></b></sup></span></sub>`
|
||||
);
|
||||
assert.equal(
|
||||
Chat.formatText(`[[https://google.com/]]text`),
|
||||
`<a href="//www.google.com/search?ie=UTF-8&btnI&q=https%3A%2F%2Fgoogle.com%2F" target="_blank">https://google.com/</a>text`
|
||||
);
|
||||
});
|
||||
|
||||
it('should run formatText correctly', () => {
|
||||
assert.equal(
|
||||
Chat.formatText(`hi **__bold italics__** ^^superscript^^ \\\\subscript\\\\ normal ~~strikethrough~~ bye`),
|
||||
|
|
|
|||
|
|
@ -5,12 +5,8 @@
|
|||
|
||||
'use strict';
|
||||
|
||||
const ModlogConstructor = Config.usesqlite ? (require('../../dist/server/modlog')).Modlog : null;
|
||||
const modlog = ModlogConstructor ? new ModlogConstructor(':memory:', {}) : null;
|
||||
const assert = require('assert').strict;
|
||||
|
||||
Config.usesqlitemodlog = true;
|
||||
|
||||
const DATASET_A = [
|
||||
{ action: 'ROOMBAN', userid: 'sometroll', ip: '127.0.0.1', loggedBy: 'annika', note: 'FIRST ENTRY', time: 1 },
|
||||
{ action: 'LOCK', userid: 'sometroll', ip: '127.0.0.1', loggedBy: 'annika', note: 'ENTRY 2', time: 2 },
|
||||
|
|
@ -38,23 +34,26 @@ async function lastLine(database, roomid) {
|
|||
return database.get(prepared, [roomid]);
|
||||
}
|
||||
|
||||
(Config.usesqlite ? describe : describe.skip)('Modlog', () => {
|
||||
(Config.usesqlite && Config.usesqlitemodlog ? describe : describe.skip)('Modlog', () => {
|
||||
before(async () => {
|
||||
if (modlog.readyPromise) await modlog.readyPromise;
|
||||
if (Rooms.Modlog.readyPromise) {
|
||||
await Rooms.Modlog.readyPromise;
|
||||
}
|
||||
if (!Rooms.Modlog.databaseReady) throw new Error(`Failed to ready up modlog database`);
|
||||
});
|
||||
|
||||
describe('Modlog#prepareSQLSearch', () => {
|
||||
it('should respect the maxLines parameter', async () => {
|
||||
const query = modlog.prepareSQLSearch(['lobby'], 1337, false, { note: [], user: [], ip: [], action: [], actionTaker: [] });
|
||||
const query = Rooms.Modlog.prepareSQLSearch(['lobby'], 1337, false, { note: [], user: [], ip: [], action: [], actionTaker: [] });
|
||||
assert(query.queryText.endsWith('LIMIT ?'));
|
||||
assert(query.args.includes(1337));
|
||||
|
||||
const noMaxLines = modlog.prepareSQLSearch(['lobby'], 0, false, { note: [], user: [], ip: [], action: [], actionTaker: [] });
|
||||
const noMaxLines = Rooms.Modlog.prepareSQLSearch(['lobby'], 0, false, { note: [], user: [], ip: [], action: [], actionTaker: [] });
|
||||
assert(!noMaxLines.queryText.includes('LIMIT'));
|
||||
});
|
||||
|
||||
it('should attempt to respect onlyPunishments', async () => {
|
||||
const query = modlog.prepareSQLSearch(['lobby'], 0, true, { note: [], user: [], ip: [], action: [], actionTaker: [] });
|
||||
const query = Rooms.Modlog.prepareSQLSearch(['lobby'], 0, true, { note: [], user: [], ip: [], action: [], actionTaker: [] });
|
||||
assert(query.queryText.includes('action IN ('));
|
||||
assert(query.args.includes('WEEKLOCK'));
|
||||
});
|
||||
|
|
@ -62,20 +61,20 @@ async function lastLine(database, roomid) {
|
|||
|
||||
describe('Modlog#getSharedID', () => {
|
||||
it('should detect shared modlogs', () => {
|
||||
assert(modlog.getSharedID('battle-gen8randombattle-42'));
|
||||
assert(modlog.getSharedID('groupchat-annika-shitposting'));
|
||||
assert(modlog.getSharedID('help-mePleaseIAmTrappedInAUnitTestFactory'));
|
||||
assert(Rooms.Modlog.getSharedID('battle-gen8randombattle-42'));
|
||||
assert(Rooms.Modlog.getSharedID('groupchat-annika-shitposting'));
|
||||
assert(Rooms.Modlog.getSharedID('help-mePleaseIAmTrappedInAUnitTestFactory'));
|
||||
|
||||
assert(!modlog.getSharedID('1v1'));
|
||||
assert(!modlog.getSharedID('development'));
|
||||
assert(!Rooms.Modlog.getSharedID('1v1'));
|
||||
assert(!Rooms.Modlog.getSharedID('development'));
|
||||
});
|
||||
});
|
||||
|
||||
describe('Modlog#write', () => {
|
||||
it('should write messages serially to the modlog', async () => {
|
||||
await modlog.write('development', { note: 'This message is logged first', action: 'UNITTEST' });
|
||||
await modlog.write('development', { note: 'This message is logged second', action: 'UNITTEST' });
|
||||
const lines = await modlog.database.all(await modlog.database.prepare(
|
||||
await Rooms.Modlog.write('development', { note: 'This message is logged first', action: 'UNITTEST' });
|
||||
await Rooms.Modlog.write('development', { note: 'This message is logged second', action: 'UNITTEST' });
|
||||
const lines = await Rooms.Modlog.database.all(await Rooms.Modlog.database.prepare(
|
||||
// Order by modlog_id since the writes most likely happen at the same second
|
||||
`SELECT * FROM modlog WHERE roomid = 'development' ORDER BY modlog_id DESC LIMIT 2`
|
||||
));
|
||||
|
|
@ -85,8 +84,8 @@ async function lastLine(database, roomid) {
|
|||
});
|
||||
|
||||
it('should use overrideID if specified', async () => {
|
||||
await modlog.write('battle-gen8randombattle-1337', { note: "I'm testing overrideID", action: 'UNITTEST' }, 'heyadora');
|
||||
const line = await lastLine(modlog.database, 'battle-gen8randombattle-1337');
|
||||
await Rooms.Modlog.write('battle-gen8randombattle-1337', { note: "I'm testing overrideID", action: 'UNITTEST' }, 'heyadora');
|
||||
const line = await lastLine(Rooms.Modlog.database, 'battle-gen8randombattle-1337');
|
||||
assert.equal(line.note, "I'm testing overrideID");
|
||||
assert.equal(line.visual_roomid, 'heyadora');
|
||||
});
|
||||
|
|
@ -96,17 +95,17 @@ async function lastLine(database, roomid) {
|
|||
it('should rename modlogs', async () => {
|
||||
const entry = { note: 'This is in a modlog that will be renamed!', action: 'UNITTEST' };
|
||||
|
||||
await modlog.write('oldroom', entry);
|
||||
await modlog.rename('oldroom', 'newroom');
|
||||
const line = await lastLine(modlog.database, 'newroom');
|
||||
await Rooms.Modlog.write('oldroom', entry);
|
||||
await Rooms.Modlog.rename('oldroom', 'newroom');
|
||||
const line = await lastLine(Rooms.Modlog.database, 'newroom');
|
||||
|
||||
assert.equal(entry.action, line.action);
|
||||
assert.equal(entry.note, line.note);
|
||||
|
||||
const newEntry = { note: 'This modlog has been renamed!', action: 'UNITTEST' };
|
||||
await modlog.write('newroom', newEntry);
|
||||
await Rooms.Modlog.write('newroom', newEntry);
|
||||
|
||||
const newLine = await lastLine(modlog.database, 'newroom');
|
||||
const newLine = await lastLine(Rooms.Modlog.database, 'newroom');
|
||||
|
||||
assert.equal(newEntry.action, newLine.action);
|
||||
assert.equal(newEntry.note, newLine.note);
|
||||
|
|
@ -116,23 +115,23 @@ async function lastLine(database, roomid) {
|
|||
describe('Modlog#search', () => {
|
||||
before(async () => {
|
||||
for (const entry of DATASET_A) {
|
||||
await modlog.write('readingtest', entry);
|
||||
await Rooms.Modlog.write('readingtest', entry);
|
||||
}
|
||||
for (const entry of DATASET_B) {
|
||||
await modlog.write('readingtest2', entry);
|
||||
await Rooms.Modlog.write('readingtest2', entry);
|
||||
}
|
||||
});
|
||||
|
||||
it('should be capable of reading the entire modlog file', async () => {
|
||||
const results = await modlog.search('readingtest2', { note: [], user: [], ip: [], action: [], actionTaker: [] }, 10000);
|
||||
const results = await Rooms.Modlog.search('readingtest2', { note: [], user: [], ip: [], action: [], actionTaker: [] }, 10000);
|
||||
assert.equal(results.results.length, DATASET_B.length);
|
||||
});
|
||||
|
||||
it('user searches should be case-insensitive', async () => {
|
||||
const notExactUpper = await modlog.search('readingtest', { user: [{ search: 'sOmETRoll', isExact: false }], note: [], ip: [], action: [], actionTaker: [] });
|
||||
const notExactLower = await modlog.search('readingtest', { user: [{ search: 'sometroll', isExact: false }], note: [], ip: [], action: [], actionTaker: [] });
|
||||
const exactUpper = await modlog.search('readingtest', { user: [{ search: 'sOMEtroLL', isExact: true }], note: [], ip: [], action: [], actionTaker: [] });
|
||||
const exactLower = await modlog.search('readingtest', { user: [{ search: 'sometroll', isExact: true }], note: [], ip: [], action: [], actionTaker: [] });
|
||||
const notExactUpper = await Rooms.Modlog.search('readingtest', { user: [{ search: 'sOmETRoll', isExact: false }], note: [], ip: [], action: [], actionTaker: [] });
|
||||
const notExactLower = await Rooms.Modlog.search('readingtest', { user: [{ search: 'sometroll', isExact: false }], note: [], ip: [], action: [], actionTaker: [] });
|
||||
const exactUpper = await Rooms.Modlog.search('readingtest', { user: [{ search: 'sOMEtroLL', isExact: true }], note: [], ip: [], action: [], actionTaker: [] });
|
||||
const exactLower = await Rooms.Modlog.search('readingtest', { user: [{ search: 'sometroll', isExact: true }], note: [], ip: [], action: [], actionTaker: [] });
|
||||
|
||||
assert.deepEqual(notExactUpper.results, notExactLower.results);
|
||||
assert.deepEqual(exactUpper.results, exactLower.results);
|
||||
|
|
@ -141,17 +140,17 @@ async function lastLine(database, roomid) {
|
|||
// isExact is currently set up to search for the entire note equalling the search
|
||||
// this could be redesigned, but is what we currently test for.
|
||||
it('note searches should respect isExact', async () => {
|
||||
const notExact = await modlog.search('readingtest', { note: [{ search: 'has man', isExact: false }], user: [], ip: [], action: [], actionTaker: [] });
|
||||
const exact = await modlog.search('readingtest', { note: [{ search: 'has man', isExact: true }], user: [], ip: [], action: [], actionTaker: [] });
|
||||
const notExact = await Rooms.Modlog.search('readingtest', { note: [{ search: 'has man', isExact: false }], user: [], ip: [], action: [], actionTaker: [] });
|
||||
const exact = await Rooms.Modlog.search('readingtest', { note: [{ search: 'has man', isExact: true }], user: [], ip: [], action: [], actionTaker: [] });
|
||||
|
||||
assert.equal(exact.results.length, 0);
|
||||
assert(notExact.results.length);
|
||||
});
|
||||
|
||||
it('should be LIFO (last-in, first-out)', async () => {
|
||||
await modlog.write('lifotest', { note: 'firstwrite', action: 'UNITTEST', timestamp: 1 });
|
||||
await modlog.write('lifotest', { note: 'secondwrite', action: 'UNITTEST', timestamp: 2 });
|
||||
const search = await modlog.search('lifotest');
|
||||
await Rooms.Modlog.write('lifotest', { note: 'firstwrite', action: 'UNITTEST', timestamp: 1 });
|
||||
await Rooms.Modlog.write('lifotest', { note: 'secondwrite', action: 'UNITTEST', timestamp: 2 });
|
||||
const search = await Rooms.Modlog.search('lifotest');
|
||||
|
||||
// secondwrite was last in, so it should be first out (results[0])
|
||||
assert.notEqual(search.results[0].note, 'firstwrite');
|
||||
|
|
@ -163,8 +162,8 @@ async function lastLine(database, roomid) {
|
|||
});
|
||||
|
||||
it('should support limiting the number of responses', async () => {
|
||||
const unlimited = await modlog.search('readingtest');
|
||||
const limited = await modlog.search('readingtest', { note: [], user: [], ip: [], action: [], actionTaker: [] }, 5);
|
||||
const unlimited = await Rooms.Modlog.search('readingtest');
|
||||
const limited = await Rooms.Modlog.search('readingtest', { note: [], user: [], ip: [], action: [], actionTaker: [] }, 5);
|
||||
|
||||
assert.equal(limited.results.length, 5);
|
||||
assert(unlimited.results.length > limited.results.length);
|
||||
|
|
@ -180,8 +179,8 @@ async function lastLine(database, roomid) {
|
|||
});
|
||||
|
||||
it('should support filtering out non-punishment-related logs', async () => {
|
||||
const all = (await modlog.search('readingtest2', { note: [], user: [], ip: [], action: [], actionTaker: [] }, 20, false)).results;
|
||||
const onlyPunishments = (await modlog.search('readingtest2', { note: [], user: [], ip: [], action: [], actionTaker: [] }, 20, true)).results;
|
||||
const all = (await Rooms.Modlog.search('readingtest2', { note: [], user: [], ip: [], action: [], actionTaker: [] }, 20, false)).results;
|
||||
const onlyPunishments = (await Rooms.Modlog.search('readingtest2', { note: [], user: [], ip: [], action: [], actionTaker: [] }, 20, true)).results;
|
||||
|
||||
assert(all.length > onlyPunishments.length);
|
||||
assert.equal(
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user