From 2bc4a51a50c87e2ff35ebde4ab3c4170d248b468 Mon Sep 17 00:00:00 2001 From: The Immortal Date: Tue, 3 Nov 2020 19:43:57 +0400 Subject: [PATCH] Random Battle improvements --- data/formats-data.ts | 12 ++++---- data/mods/gen2/random-teams.ts | 10 +++---- data/mods/gen7/random-teams.ts | 9 +++--- data/random-teams.ts | 53 +++++++++++++++++++--------------- 4 files changed, 45 insertions(+), 39 deletions(-) diff --git a/data/formats-data.ts b/data/formats-data.ts index bfd13a42b5..c164228a92 100644 --- a/data/formats-data.ts +++ b/data/formats-data.ts @@ -340,7 +340,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { }, ninetales: { randomBattleMoves: ["fireblast", "nastyplot", "scorchingsands", "solarbeam", "willowisp"], - randomBattleLevel: 86, + randomBattleLevel: 84, randomDoubleBattleMoves: ["heatwave", "nastyplot", "protect", "scorchingsands", "solarbeam"], randomDoubleBattleLevel: 84, tier: "NU", @@ -527,7 +527,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { }, politoed: { randomBattleMoves: ["encore", "icebeam", "protect", "rest", "scald", "toxic"], - randomBattleLevel: 82, + randomBattleLevel: 84, randomDoubleBattleMoves: ["earthpower", "haze", "helpinghand", "icywind", "muddywater", "protect"], randomDoubleBattleLevel: 84, tier: "(PU)", @@ -3163,7 +3163,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { doublesTier: "DUU", }, giratina: { - randomBattleMoves: ["aurasphere", "calmmind", "dracometeor", "rest", "shadowball", "sleeptalk", "willowisp"], + randomBattleMoves: ["defog", "hex", "rest", "toxic", "willowisp"], randomBattleLevel: 74, randomDoubleBattleMoves: ["calmmind", "dragonpulse", "rest", "shadowball", "willowisp"], randomDoubleBattleLevel: 74, @@ -3171,7 +3171,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { doublesTier: "DUber", }, giratinaorigin: { - randomBattleMoves: ["defog", "dracometeor", "earthquake", "hex", "thunderwave", "willowisp"], + randomBattleMoves: ["dualwingbeat", "honeclaws", "outrage", "poltergeist", "shadowsneak"], randomBattleLevel: 74, randomDoubleBattleMoves: ["breakingswipe", "dracometeor", "shadowball", "shadowsneak", "protect", "tailwind", "willowisp"], randomDoubleBattleLevel: 74, @@ -5312,7 +5312,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { doublesTier: "DUU", }, xurkitree: { - randomBattleMoves: ["dazzlinggleam", "energyball", "thunderbolt", "voltswitch"], + randomBattleMoves: ["dazzlinggleam", "energyball", "hypnosis", "thunderbolt", "voltswitch"], randomBattleLevel: 84, randomDoubleBattleMoves: ["dazzlinggleam", "energyball", "thunderbolt", "voltswitch"], randomDoubleBattleLevel: 84, @@ -6061,7 +6061,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = { doublesTier: "(DUber)", }, zarude: { - randomBattleMoves: ["bulkup", "closecombat", "darkestlariat", "powerwhip", "uturn"], + randomBattleMoves: ["bulkup", "closecombat", "darkestlariat", "junglehealing", "powerwhip", "uturn"], randomBattleLevel: 82, randomDoubleBattleMoves: ["closecombat", "darkestlariat", "junglehealing", "powerwhip", "protect", "rockslide"], randomDoubleBattleLevel: 80, diff --git a/data/mods/gen2/random-teams.ts b/data/mods/gen2/random-teams.ts index fb6a712c97..9906257502 100644 --- a/data/mods/gen2/random-teams.ts +++ b/data/mods/gen2/random-teams.ts @@ -136,12 +136,12 @@ export class RandomGen2Teams extends RandomGen3Teams { case 'destinybond': if (hasMove['explosion']) rejected = true; break; - case 'thief': - if (hasMove['rest'] || hasMove['substitute']) rejected = true; - break; case 'pursuit': if (hasMove['crunch'] && movePool.includes('sunnyday')) rejected = true; break; + case 'thief': + if (hasMove['rest'] || hasMove['substitute']) rejected = true; + break; // Status and illegal move rejections case 'confuseray': case 'roar': case 'whirlwind': @@ -190,10 +190,10 @@ export class RandomGen2Teams extends RandomGen3Teams { (movePool.includes('megahorn') || hasMove['present'] && movePool.includes('softboiled')) || (hasMove['rest'] && movePool.includes('sleeptalk') || (hasMove['sleeptalk'] && movePool.includes('rest'))) || (hasMove['sunnyday'] && movePool.includes('solarbeam') || (hasMove['solarbeam'] && movePool.includes('sunnyday'))) || - (movePool.includes('spore') || movePool.includes('meanlook') || movePool.includes('milkdrink') || movePool.includes('recover')) + (movePool.includes('meanlook') || movePool.includes('milkdrink') || movePool.includes('recover') || movePool.includes('spore')) )) { // Reject Status, non-STAB, or low basepower moves - if (move.category === 'Status' || !hasType[move.type] || move.basePower < 40 && !move.multihit) { + if (move.category === 'Status' || !hasType[move.type] || move.basePower && move.basePower < 40) { rejected = true; } } diff --git a/data/mods/gen7/random-teams.ts b/data/mods/gen7/random-teams.ts index 2bfcbfc1c2..baf34bdc12 100644 --- a/data/mods/gen7/random-teams.ts +++ b/data/mods/gen7/random-teams.ts @@ -391,7 +391,7 @@ export class RandomGen7Teams extends RandomTeams { if (counter.setupType !== 'Special' && counter.stab > 1) rejected = true; break; case 'quickattack': - if (hasType['Normal'] && (!counter.stab || counter['Normal'] > 2)) rejected = true; + if (!!counter['recovery'] || hasType['Normal'] && (!counter.stab || counter['Normal'] > 2)) rejected = true; if (hasMove['feint'] || hasType['Rock'] && !!counter.Status) rejected = true; break; case 'weatherball': @@ -479,7 +479,7 @@ export class RandomGen7Teams extends RandomTeams { break; case 'substitute': if (hasMove['dracometeor'] || hasMove['leafstorm'] && !hasAbility['Contrary']) rejected = true; - if (hasMove['pursuit'] || hasMove['rest'] || hasMove['taunt'] || hasMove['uturn'] || hasMove['voltswitch'] || hasMove['whirlwind']) rejected = true; + if (hasMove['encore'] || hasMove['pursuit'] || hasMove['rest'] || hasMove['taunt'] || hasMove['uturn'] || hasMove['voltswitch'] || hasMove['whirlwind']) rejected = true; if (movePool.includes('copycat')) rejected = true; break; case 'powersplit': @@ -532,12 +532,13 @@ export class RandomGen7Teams extends RandomTeams { (hasAbility['Slow Start'] && movePool.includes('substitute')) || ((movePool.includes('recover') || movePool.includes('roost') || movePool.includes('slackoff') || movePool.includes('softboiled')) && !!counter.Status && !counter.setupType && !hasMove['healingwish'] && !hasMove['trick'] && !hasMove['trickroom']) || - (movePool.includes('milkdrink') || movePool.includes('stickyweb') && !counter.setupType && !teamDetails.stickyWeb) || + (movePool.includes('milkdrink') || movePool.includes('shoreup') || movePool.includes('stickyweb') && !counter.setupType && !teamDetails.stickyWeb) || + (isLead && movePool.includes('stealthrock') && !!counter.Status && !counter.setupType && !counter['speedsetup'] && !hasMove['substitute']) || (species.requiredMove && movePool.includes(toID(species.requiredMove))) )) { // Reject Status or non-STAB if (!isSetup && !move.weather && !move.stallingMove && !move.damage && (move.category !== 'Status' || !move.flags.heal)) { - if (move.category === 'Status' || !hasType[move.type] || move.basePower < 40 && !move.multihit) { + if (move.category === 'Status' || !hasType[move.type] || move.basePower && move.basePower < 40 && !move.multihit) { rejected = true; } } diff --git a/data/random-teams.ts b/data/random-teams.ts index 5ec2764362..fada91c7c1 100644 --- a/data/random-teams.ts +++ b/data/random-teams.ts @@ -647,7 +647,7 @@ export class RandomTeams { switch (moveid) { // Not very useful without their supporting moves - case 'acrobatics': case 'drainingkiss': + case 'acrobatics': case 'drainingkiss': case 'junglehealing': if (!counter.setupType && !isDoubles) rejected = true; break; case 'destinybond': case 'healbell': @@ -734,8 +734,8 @@ export class RandomTeams { if ((hasMove['substitute'] && !hasType['Fighting']) || hasMove['toxic'] && movePool.includes('substitute')) rejected = true; if (moveid === 'closecombat' && (hasMove['highjumpkick'] || movePool.includes('highjumpkick')) && !counter.setupType) rejected = true; break; - case 'dracometeor': case 'stormthrow': - if (hasMove['rest'] && hasMove['sleeptalk']) rejected = true; + case 'defog': + if (counter.setupType || hasMove['healbell'] || hasMove['stealthrock'] || hasMove['toxicspikes'] || teamDetails.defog) rejected = true; break; case 'fakeout': if (counter.setupType || hasMove['protect'] || hasMove['rapidspin'] || hasMove['substitute'] || hasMove['uturn']) rejected = true; @@ -763,8 +763,8 @@ export class RandomTeams { if (counter.setupType && counter['Fighting'] >= 2) rejected = true; break; case 'shadowsneak': - if (hasMove['trickroom'] || !hasType['Ghost'] && !!counter['recovery']) rejected = true; - if (hasMove['substitute'] || hasMove['toxic'] || hasMove['rest'] && hasMove['sleeptalk']) rejected = true; + if (hasMove['substitute'] || hasMove['trickroom']) rejected = true; + if (hasMove['dualwingbeat'] || hasMove['toxic'] || hasMove['rest'] && hasMove['sleeptalk']) rejected = true; break; case 'spikes': if (counter.setupType || teamDetails.spikes && teamDetails.spikes > 1) rejected = true; @@ -872,6 +872,9 @@ export class RandomTeams { case 'seismictoss': if (hasMove['protect'] && hasType['Water']) rejected = true; break; + case 'stormthrow': + if (hasMove['rest'] && hasMove['sleeptalk']) rejected = true; + break; case 'superpower': if (hasMove['hydropump'] || counter.Physical >= 4 && movePool.includes('uturn')) rejected = true; if (hasMove['substitute'] && !hasAbility['Contrary']) rejected = true; @@ -889,6 +892,16 @@ export class RandomTeams { if (hasMove['earthpower'] || hasMove['toxic'] && movePool.includes('earthpower')) rejected = true; if (hasMove['willowisp']) rejected = true; break; + case 'airslash': + if ((hasMove['hurricane'] && !counter.setupType) || hasMove['rest'] && hasMove['sleeptalk']) rejected = true; + if (movePool.includes('flamethrower') || hasAbility['Simple'] && !!counter['recovery']) rejected = true; + break; + case 'bravebird': + if (hasMove['dragondance']) rejected = true; + break; + case 'hurricane': + if (hasAbility['Tinted Lens'] && counter.setupType && !isDoubles) rejected = true; + break; case 'photongeyser': if (hasMove['morningsun']) rejected = true; break; @@ -912,16 +925,6 @@ export class RandomTeams { if (hasMove['rockblast'] || hasMove['rockslide'] || !!counter.Status && movePool.includes('rockslide')) rejected = true; if (hasAbility['Guts'] && (!hasMove['dynamicpunch'] || hasMove['spikes'])) rejected = true; break; - case 'airslash': - if ((hasMove['hurricane'] && !counter.setupType) || hasMove['rest'] && hasMove['sleeptalk']) rejected = true; - if (movePool.includes('flamethrower') || hasAbility['Simple'] && !!counter['recovery']) rejected = true; - break; - case 'bravebird': - if (hasMove['dragondance']) rejected = true; - break; - case 'hurricane': - if (hasAbility['Tinted Lens'] && counter.setupType && !isDoubles) rejected = true; - break; case 'poltergeist': if (hasMove['knockoff']) rejected = true; break; @@ -961,12 +964,11 @@ export class RandomTeams { case 'haze': if ((hasMove['stealthrock'] || movePool.includes('stealthrock')) && !teamDetails.stealthRock) rejected = true; break; - case 'hypnosis': case 'willowisp': case 'yawn': - if (hasMove['thunderwave'] || hasMove['toxic']) rejected = true; + case 'hypnosis': + if (hasMove['voltswitch']) rejected = true; break; - case 'defog': - if (hasMove['healbell'] || hasMove['stealthrock'] || hasMove['toxicspikes'] || teamDetails.defog) rejected = true; - if (counter.setupType || hasMove['hex'] && !hasMove['thunderwave'] && !hasMove['willowisp']) rejected = true; + case 'willowisp': case 'yawn': + if (hasMove['thunderwave'] || hasMove['toxic']) rejected = true; break; case 'painsplit': case 'recover': case 'synthesis': if (hasMove['rest'] || hasMove['wish']) rejected = true; @@ -1026,10 +1028,11 @@ export class RandomTeams { ((movePool.includes('morningsun') || movePool.includes('recover') || movePool.includes('roost') || movePool.includes('slackoff') || movePool.includes('softboiled')) && !!counter.Status && !counter.setupType && !hasMove['healingwish'] && !hasMove['switcheroo'] && !hasMove['trick'] && !hasMove['trickroom'] && !isDoubles) || (movePool.includes('milkdrink') || movePool.includes('quiverdance') || movePool.includes('stickyweb') && !counter.setupType && !teamDetails.stickyWeb) || + (isLead && movePool.includes('stealthrock') && !!counter.Status && !counter.setupType && !counter['speedsetup'] && !hasMove['substitute']) || (isDoubles && species.baseStats.def >= 140 && movePool.includes('bodypress')) )) { // Reject Status, non-STAB, or low basepower moves - if (move.category === 'Status' || !hasType[move.type] || move.basePower < 50 && !move.multihit && !hasAbility['Technician']) { + if (move.category === 'Status' || !hasType[move.type] || move.basePower && move.basePower < 50 && !move.multihit && !hasAbility['Technician']) { rejected = true; } } @@ -1302,8 +1305,10 @@ export class RandomTeams { item = (ability === 'Grassy Surge') ? 'Grassy Seed' : ''; } else if (hasMove['auroraveil'] || hasMove['lightscreen'] && hasMove['reflect']) { item = 'Light Clay'; - } else if (hasMove['rest'] && !hasMove['sleeptalk'] && ability !== 'Shed Skin') { + } else if (hasMove['rest'] && !hasMove['sleeptalk'] && ability !== 'Pressure' && ability !== 'Shed Skin') { item = 'Chesto Berry'; + } else if (hasMove['hypnosis'] && ability === 'Beast Boost') { + item = 'Blunder Policy'; } else if (this.dex.getEffectiveness('Rock', species) >= 2 && !isDoubles) { item = 'Heavy-Duty Boots'; @@ -1369,12 +1374,12 @@ export class RandomTeams { item = 'Heavy-Duty Boots'; } else if (this.dex.getEffectiveness('Ground', species) >= 2 && !hasType['Poison'] && ability !== 'Levitate' && !hasAbility['Iron Barbs'] && !isDoubles) { item = 'Air Balloon'; - } else if (counter.damagingMoves.length >= 4 && !counter['Dragon'] && !counter['Normal'] && !isDoubles) { - item = 'Expert Belt'; } else if (counter.damagingMoves.length >= 3 && !counter['damage'] && ability !== 'Sturdy' && !hasMove['clearsmog'] && !hasMove['foulplay'] && !hasMove['rapidspin'] && !hasMove['substitute'] && !hasMove['uturn'] && !isDoubles && (!!counter['speedsetup'] || hasMove['trickroom'] || !!counter['drain'] || hasMove['psystrike'] || (species.baseStats.spe > 40 && species.baseStats.hp + species.baseStats.def + species.baseStats.spd < 275)) ) { item = 'Life Orb'; + } else if (counter.damagingMoves.length >= 4 && !counter['Dragon'] && !counter['Normal'] && !isDoubles) { + item = 'Expert Belt'; } else if ((hasMove['dragondance'] || hasMove['swordsdance']) && !isDoubles && (hasMove['outrage'] || !hasType['Bug'] && !hasType['Fire'] && !hasType['Ground'] && !hasType['Normal'] && !hasType['Poison'] && !['Pastel Veil', 'Storm Drain'].includes(ability)) ) {