Gen 5: Random Battle updates

- Various movepool changes
- Prevent Trick Room + Haze Cofagrigus
- Prevent Extreme Speed + Roost Dragonite
- Prevent Head Smash + Roost Archeops
- Give Bouffalant Sap Sipper
- Give Rain Dance and Sunny Day Pokemon Life Orb
- Remove Rocky Helmet Ferrothorn
- Improve Leftovers, Life Orb, and Focus Sash selection
- Fix Unown's level
This commit is contained in:
The Immortal 2021-01-21 18:32:13 +04:00
parent bd6ad76a9c
commit 7ab649a666
2 changed files with 50 additions and 80 deletions

View File

@ -202,7 +202,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = {
tier: "LC",
},
venomoth: {
randomBattleMoves: ["batonpass", "bugbuzz", "quiverdance", "roost", "sleeppowder", "sludgebomb", "substitute"],
randomBattleMoves: ["bugbuzz", "quiverdance", "roost", "sleeppowder", "substitute"],
tier: "RUBL",
doublesTier: "DUU",
},
@ -210,7 +210,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = {
tier: "LC",
},
dugtrio: {
randomBattleMoves: ["earthquake", "reversal", "stealthrock", "stoneedge", "substitute", "suckerpunch"],
randomBattleMoves: ["aerialace", "earthquake", "memento", "stealthrock", "stoneedge", "suckerpunch"],
tier: "(OU)",
doublesTier: "DUU",
},
@ -349,7 +349,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = {
doublesTier: "DUU",
},
farfetchd: {
randomBattleMoves: ["bravebird", "leafblade", "return", "roost", "swordsdance"],
randomBattleMoves: ["batonpass", "bravebird", "leafblade", "quickattack", "swordsdance"],
tier: "(NU)",
doublesTier: "DUU",
},
@ -393,7 +393,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = {
doublesTier: "NFE",
},
gengar: {
randomBattleMoves: ["disable", "focusblast", "painsplit", "shadowball", "sludgebomb", "substitute", "thunderbolt", "trick"],
randomBattleMoves: ["focusblast", "shadowball", "sludgebomb", "substitute", "thunderbolt", "trick", "willowisp"],
tier: "OU",
doublesTier: "DOU",
},
@ -526,7 +526,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = {
tier: "NFE",
},
kingdra: {
randomBattleMoves: ["dracometeor", "dragondance", "hiddenpowerelectric", "hydropump", "icebeam", "outrage", "raindance", "substitute", "waterfall"],
randomBattleMoves: ["dracometeor", "dragondance", "hiddenpowerelectric", "hydropump", "icebeam", "outrage", "raindance", "waterfall"],
tier: "UU",
doublesTier: "DOU",
},
@ -555,7 +555,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = {
doublesTier: "DUU",
},
scyther: {
randomBattleMoves: ["aerialace", "batonpass", "brickbreak", "bugbite", "quickattack", "roost", "swordsdance", "uturn"],
randomBattleMoves: ["aerialace", "batonpass", "brickbreak", "bugbite", "quickattack", "roost", "swordsdance"],
tier: "RU",
doublesTier: "NFE",
},
@ -699,7 +699,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = {
tier: "LC",
},
snorlax: {
randomBattleMoves: ["bodyslam", "crunch", "curse", "earthquake", "firepunch", "pursuit", "rest", "selfdestruct"],
randomBattleMoves: ["bodyslam", "crunch", "curse", "earthquake", "firepunch", "pursuit", "rest"],
tier: "UU",
doublesTier: "DUU",
},
@ -731,7 +731,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = {
doublesTier: "DOU",
},
mewtwo: {
randomBattleMoves: ["aurasphere", "calmmind", "fireblast", "icebeam", "psystrike", "recover", "taunt", "willowisp"],
randomBattleMoves: ["aurasphere", "calmmind", "fireblast", "icebeam", "psystrike", "recover", "taunt"],
tier: "Uber",
doublesTier: "DUber",
},
@ -1145,7 +1145,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = {
doublesTier: "DUU",
},
blaziken: {
randomBattleMoves: ["batonpass", "flareblitz", "highjumpkick", "protect", "stoneedge", "swordsdance"],
randomBattleMoves: ["flareblitz", "highjumpkick", "protect", "stoneedge", "swordsdance"],
tier: "Uber",
doublesTier: "DOU",
},
@ -1253,7 +1253,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = {
tier: "LC",
},
masquerain: {
randomBattleMoves: ["airslash", "batonpass", "bugbuzz", "quiverdance", "roost"],
randomBattleMoves: ["airslash", "bugbuzz", "hydropump", "quiverdance", "roost"],
tier: "(NU)",
doublesTier: "DUU",
},
@ -1261,7 +1261,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = {
tier: "LC",
},
breloom: {
randomBattleMoves: ["bulletseed", "focuspunch", "leechseed", "lowsweep", "machpunch", "spore", "stoneedge", "substitute", "swordsdance"],
randomBattleMoves: ["bulletseed", "focuspunch", "machpunch", "spore", "stoneedge", "substitute", "swordsdance"],
tier: "OU",
doublesTier: "DOU",
},
@ -1281,7 +1281,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = {
tier: "LC",
},
ninjask: {
randomBattleMoves: ["batonpass", "protect", "substitute", "swordsdance", "xscissor"],
randomBattleMoves: ["protect", "substitute", "swordsdance", "xscissor"],
tier: "NU",
doublesTier: "DUU",
},
@ -1567,7 +1567,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = {
tier: "LC",
},
dusclops: {
randomBattleMoves: ["curse", "nightshade", "rest", "willowisp"],
randomBattleMoves: ["nightshade", "rest", "sleeptalk", "willowisp"],
tier: "UU",
doublesTier: "NFE",
},
@ -1710,7 +1710,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = {
doublesTier: "DUber",
},
deoxys: {
randomBattleMoves: ["hiddenpowerfire", "icebeam", "lightscreen", "psychoboost", "reflect", "spikes", "stealthrock"],
randomBattleMoves: ["hiddenpowerfire", "icebeam", "lightscreen", "psychoboost", "reflect", "stealthrock"],
tier: "Uber",
doublesTier: "DUU",
},
@ -1804,7 +1804,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = {
tier: "LC",
},
rampardos: {
randomBattleMoves: ["crunch", "earthquake", "firepunch", "headsmash", "rockpolish", "rockslide", "superpower"],
randomBattleMoves: ["crunch", "earthquake", "firepunch", "headsmash", "rockpolish", "superpower"],
tier: "(NU)",
doublesTier: "DUU",
},
@ -1960,7 +1960,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = {
tier: "LC",
},
drapion: {
randomBattleMoves: ["aquatail", "crunch", "earthquake", "poisonjab", "pursuit", "swordsdance", "taunt", "toxicspikes", "whirlwind"],
randomBattleMoves: ["aquatail", "crunch", "earthquake", "poisonjab", "pursuit", "swordsdance", "taunt", "toxicspikes"],
tier: "RU",
doublesTier: "DUU",
},
@ -2049,7 +2049,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = {
doublesTier: "DUber",
},
heatran: {
randomBattleMoves: ["earthpower", "fireblast", "flashcannon", "hiddenpowerice", "lavaplume", "protect", "roar", "substitute", "stealthrock", "toxic"],
randomBattleMoves: ["earthpower", "fireblast", "flashcannon", "hiddenpowerice", "lavaplume", "protect", "roar", "stealthrock", "toxic"],
tier: "OU",
doublesTier: "DOU",
},
@ -2358,7 +2358,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = {
tier: "LC",
},
whimsicott: {
randomBattleMoves: ["encore", "leechseed", "substitute", "stunspore", "taunt", "uturn"],
randomBattleMoves: ["encore", "gigadrain", "leechseed", "stunspore", "taunt", "uturn"],
tier: "RU",
doublesTier: "DOU",
},
@ -2523,7 +2523,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = {
doublesTier: "DUU",
},
emolga: {
randomBattleMoves: ["agility", "airslash", "batonpass", "chargebeam", "roost", "substitute", "thunderbolt"],
randomBattleMoves: ["acrobatics", "encore", "roost", "thunderbolt", "toxic", "uturn"],
tier: "(NU)",
doublesTier: "DUU",
},
@ -2660,7 +2660,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = {
doublesTier: "DUU",
},
druddigon: {
randomBattleMoves: ["dragontail", "earthquake", "firepunch", "glare", "outrage", "suckerpunch", "stealthrock"],
randomBattleMoves: ["dragontail", "earthquake", "glare", "outrage", "stealthrock", "suckerpunch"],
tier: "RU",
doublesTier: "DUU",
},

View File

@ -101,6 +101,9 @@ export class RandomGen5Teams extends RandomGen6Teams {
case 'batonpass':
if (!counter.setupType && !counter['speedsetup'] && !hasMove['substitute'] && !hasMove['wish'] && !hasAbility['Speed Boost']) rejected = true;
break;
case 'endeavor':
if (!isLead) rejected = true;
break;
case 'focuspunch':
if (!hasMove['substitute'] || counter.damagingMoves.length < 2 || hasMove['swordsdance']) rejected = true;
break;
@ -155,8 +158,8 @@ export class RandomGen5Teams extends RandomGen6Teams {
case 'fakeout':
if (counter.setupType || hasMove['substitute'] || hasMove['switcheroo'] || hasMove['trick']) rejected = true;
break;
case 'haze': case 'magiccoat': case 'pursuit': case 'selfdestruct': case 'spikes': case 'waterspout':
if (counter.setupType || !!counter['speedsetup'] || (hasMove['rest'] && hasMove['sleeptalk'])) rejected = true;
case 'haze': case 'magiccoat': case 'pursuit': case 'spikes': case 'waterspout':
if (counter.setupType || !!counter['speedsetup'] || hasMove['trickroom'] || (hasMove['rest'] && hasMove['sleeptalk'])) rejected = true;
break;
case 'healingwish':
if (counter.setupType || !!counter['recovery'] || hasMove['substitute']) rejected = true;
@ -194,7 +197,7 @@ export class RandomGen5Teams extends RandomGen6Teams {
if (counter.setupType || !!counter['speedsetup'] || hasMove['batonpass'] || hasMove['magnetrise'] || hasMove['uturn']) rejected = true;
break;
// Bit redundant to have both
// Ineffective having both
// Attacks:
case 'bugbite':
if (hasMove['uturn']) rejected = true;
@ -232,8 +235,8 @@ export class RandomGen5Teams extends RandomGen6Teams {
case 'bonemerang': case 'earthpower':
if (hasMove['earthquake']) rejected = true;
break;
case 'endeavor':
if (!isLead) rejected = true;
case 'extremespeed': case 'headsmash':
if (hasMove['roost']) rejected = true;
break;
case 'facade':
if (hasMove['suckerpunch'] && !hasType['Normal']) rejected = true;
@ -253,12 +256,6 @@ export class RandomGen5Teams extends RandomGen6Teams {
case 'psychic':
if (hasMove['psyshock']) rejected = true;
break;
case 'rockblast': case 'rockslide':
if (hasMove['headsmash'] || hasMove['stoneedge']) rejected = true;
break;
case 'stoneedge':
if (hasMove['headsmash']) rejected = true;
break;
case 'scald': case 'surf':
if (hasMove['hydropump']) rejected = true;
break;
@ -330,7 +327,7 @@ export class RandomGen5Teams extends RandomGen6Teams {
(hasType['Steel'] && hasAbility['Technician'] && !counter['Steel']) ||
(hasType['Water'] && (!counter['Water'] || (hasAbility['Adaptability'] && movePool.includes('waterfall'))) ||
(hasAbility['Bad Dreams'] && movePool.includes('darkvoid')) ||
(hasAbility['Contrary'] && !counter['contrary'] && species.name !== 'Shuckle') ||
(hasAbility['Contrary'] && !counter['contrary'] && forme !== 'Shuckle') ||
(hasAbility['Guts'] && hasType['Normal'] && movePool.includes('facade')) ||
(hasAbility['Slow Start'] && movePool.includes('substitute')) ||
(!counter.recovery && !counter.setupType && !hasMove['healingwish'] && (counter.Status > 1 || (species.nfe && !!counter['Status'])) &&
@ -439,15 +436,15 @@ export class RandomGen5Teams extends RandomGen6Teams {
} else if (ability === 'Pressure' || ability === 'Synchronize') {
rejectAbility = (counter.setupType || counter.Status < 2);
} else if (ability === 'Reckless' || ability === 'Rock Head') {
rejectAbility = !counter['recoil'];
rejectAbility = (!counter['recoil'] || hasAbility['Sap Sipper']);
} else if (ability === 'Regenerator') {
rejectAbility = hasAbility['Magic Guard'];
} else if (ability === 'Sand Force' || ability === 'Sand Rush') {
rejectAbility = !teamDetails['sand'];
} else if (ability === 'Serene Grace') {
rejectAbility = (!counter['serenegrace'] || species.name === 'Blissey');
rejectAbility = (!counter['serenegrace'] || forme === 'Blissey');
} else if (ability === 'Sheer Force') {
rejectAbility = (!counter['sheerforce'] || hasMove['fakeout'] || hasAbility['Iron Fist'] && counter['ironfist'] > counter['sheerforce']);
rejectAbility = (!counter['sheerforce'] || hasAbility['Guts']);
} else if (ability === 'Sturdy') {
rejectAbility = (!!counter['recoil'] && !counter['recovery']);
} else if (ability === 'Swarm') {
@ -493,24 +490,20 @@ export class RandomGen5Teams extends RandomGen6Teams {
item = species.requiredItem;
// First, the extra high-priority items
} else if (species.name === 'Marowak') {
} else if (forme === 'Marowak') {
item = 'Thick Club';
} else if (species.name === 'Deoxys-Attack') {
item = (isLead && hasMove['stealthrock']) ? 'Focus Sash' : 'Life Orb';
} else if (species.name === 'Farfetch\u2019d') {
} else if (forme === 'Farfetch\u2019d') {
item = 'Stick';
} else if (species.name === 'Pikachu') {
} else if (forme === 'Pikachu') {
item = 'Light Ball';
} else if (species.name === 'Shedinja' || species.name === 'Smeargle') {
} else if (forme === 'Shedinja' || forme === 'Smeargle') {
item = 'Focus Sash';
} else if (species.name === 'Unown') {
item = 'Choice Specs';
} else if (species.name === 'Wobbuffet' && hasMove['destinybond'] && this.randomChance(1, 2)) {
} else if (forme === 'Wobbuffet' && hasMove['destinybond'] && this.randomChance(1, 2)) {
item = 'Custap Berry';
} else if (ability === 'Imposter') {
item = 'Choice Scarf';
} else if (hasMove['trick'] && hasMove['gyroball']) {
item = (ability === 'Levitate' || hasType['Flying']) ? 'Macho Brace' : 'Iron Ball';
} else if (hasMove['switcheroo'] || hasMove['trick']) {
if (species.baseStats.spe >= 60 && species.baseStats.spe <= 108 && !counter['priority']) {
item = 'Choice Scarf';
@ -525,14 +518,14 @@ export class RandomGen5Teams extends RandomGen6Teams {
item = 'Sitrus Berry';
} else if ((ability === 'Magic Guard' || ability === 'Sheer Force') && counter.damagingMoves.length > 1) {
item = 'Life Orb';
} else if (hasMove['facade'] || ability === 'Poison Heal' || ability === 'Toxic Boost') {
} else if (ability === 'Poison Heal' || ability === 'Toxic Boost' || hasMove['facade']) {
item = 'Toxic Orb';
} else if (hasMove['rest'] && !hasMove['sleeptalk'] && ability !== 'Natural Cure' && ability !== 'Shed Skin') {
item = 'Chesto Berry';
} else if (hasMove['raindance']) {
item = 'Damp Rock';
item = (ability === 'Forecast') ? 'Damp Rock' : 'Life Orb';
} else if (hasMove['sunnyday']) {
item = 'Heat Rock';
item = (ability === 'Forecast' || ability === 'Flower Gift') ? 'Heat Rock' : 'Life Orb';
} else if (hasMove['lightscreen'] && hasMove['reflect']) {
item = 'Light Clay';
} else if (hasMove['acrobatics']) {
@ -560,39 +553,19 @@ export class RandomGen5Teams extends RandomGen6Teams {
item = species.baseStats.spa >= 100 && species.baseStats.spe >= 60 && species.baseStats.spe <= 108 && !counter['priority'] && this.randomChance(2, 3) ? 'Choice Scarf' : 'Choice Specs';
} else if (counter.Special >= 3 && hasMove['uturn']) {
item = (ability === 'Download') ? 'Choice Scarf' : 'Choice Specs';
} else if (this.dex.getEffectiveness('Ground', species) >= 2 && ability !== 'Levitate' && !hasMove['magnetrise']) {
} else if (this.dex.getEffectiveness('Ground', species) >= 2 && ability !== 'Levitate') {
item = 'Air Balloon';
} else if (hasMove['substitute'] && hasMove['reversal']) {
const eligibleTypes = [];
for (const setMoveid of moves) {
const move = this.dex.getMove(setMoveid);
if (!move.basePower && !move.basePowerCallback) continue;
eligibleTypes.push(move.type);
}
item = this.sample(eligibleTypes) + ' Gem';
} else if ((hasMove['flail'] || hasMove['reversal']) && ability !== 'Sturdy') {
item = 'Focus Sash';
} else if (ability === 'Slow Start' || hasMove['detect'] || hasMove['protect'] || hasMove['sleeptalk'] || hasMove['substitute']) {
} else if (hasType['Poison'] || hasMove['dragontail'] || hasMove['protect'] || hasMove['scald'] || hasMove['sleeptalk'] || hasMove['substitute']) {
item = 'Leftovers';
} else if (ability === 'Iron Barbs') {
item = 'Rocky Helmet';
} else if (species.name === 'Palkia' && (hasMove['dracometeor'] || hasMove['spacialrend']) && hasMove['hydropump']) {
} else if (forme === 'Palkia' && (hasMove['dracometeor'] || hasMove['spacialrend']) && hasMove['hydropump']) {
item = 'Lustrous Orb';
} else if (species.baseStats.hp + species.baseStats.def + species.baseStats.spd > 275) {
item = 'Leftovers';
} else if (counter.Physical + counter.Special >= 3 && counter.setupType && ability !== 'Sturdy' && !hasMove['rapidspin']) {
} else if (counter.damagingMoves.length >= 4) {
item = (forme === 'Deoxys-Attack' || counter['Normal'] || hasMove['suckerpunch']) ? 'Life Orb' : 'Expert Belt';
} else if (species.baseStats.spe >= 40 && counter.setupType && counter.damagingMoves.length >= 3 && ability !== 'Sturdy' && !hasMove['rapidspin']) {
item = hasMove['outrage'] ? 'Lum Berry' : 'Life Orb';
} else if (counter.Physical + counter.Special >= 4) {
item = counter['Normal'] ? 'Life Orb' : 'Expert Belt';
} else if (isLead && ability !== 'Regenerator' && ability !== 'Sturdy' && !counter['recoil'] && !counter['recovery'] && species.baseStats.hp + species.baseStats.def + species.baseStats.spd <= 275) {
} else if (isLead && !!counter['hazards'] && ability !== 'Regenerator' && ability !== 'Sturdy' && !counter['recovery'] && species.baseStats.hp + species.baseStats.def + species.baseStats.spd < 255) {
item = 'Focus Sash';
// This is the "REALLY can't think of a good item" cutoff
} else if (hasType['Poison']) {
item = 'Black Sludge';
} else if (this.dex.getEffectiveness('Rock', species) >= 1 || hasMove['dragontail']) {
item = 'Leftovers';
} else if (counter.Status <= 1 && ability !== 'Sturdy' && !hasMove['rapidspin'] && !hasMove['uturn']) {
} else if (counter.Status < 2 && ability !== 'Sturdy' && !hasMove['rapidspin'] && !hasMove['uturn'] && this.dex.getEffectiveness('Rock', species) < 1) {
item = 'Life Orb';
}
@ -617,16 +590,13 @@ export class RandomGen5Teams extends RandomGen6Teams {
Delibird: 100, 'Farfetch\u2019d': 100, Luvdisc: 100, Unown: 100,
};
let level = levelScale[species.tier] || (species.nfe ? 90 : 80);
if (customScale[forme]) level = customScale[forme];
if (customScale[species.name]) level = customScale[species.name];
// Prepare optimal HP
const srWeakness = this.dex.getEffectiveness('Rock', species);
while (evs.hp > 1) {
const hp = Math.floor(Math.floor(2 * species.baseStats.hp + (ivs.hp || 31) + Math.floor(evs.hp / 4) + 100) * level / 100 + 10);
if (hasMove['substitute'] && hasMove['reversal']) {
// Reversal users should be able to use four Substitutes
if (hp % 4 > 0) break;
} else if (hasMove['bellydrum'] && item === 'Sitrus Berry') {
if (hasMove['bellydrum'] && item === 'Sitrus Berry') {
// Belly Drum should activate Sitrus Berry
if (hp % 2 === 0) break;
} else {