pokemon-showdown/test/sim/abilities/neutralizinggas.js
Karthik b6d5fff24b
Unfix interaction between Gluttony and Neutralizing Gas ending (#8273)
Reverts #8250, but will keep gluttony test file and add more tests to it. This is being done because indirect sources of damages are not causing gluttony to trigger (such as belly drum).
2021-05-05 13:44:59 -04:00

280 lines
12 KiB
JavaScript

'use strict';
const assert = require('./../../assert');
const common = require('./../../common');
let battle;
describe('Neutralizing Gas', function () {
afterEach(function () {
battle.destroy();
});
it('should prevent switch-in abilities from activating', function () {
battle = common.createBattle();
battle.setPlayer('p1', {team: [{species: "Gyarados", ability: 'intimidate', moves: ['splash']}]});
battle.setPlayer('p2', {team: [{species: "Weezing", ability: 'neutralizinggas', moves: ['toxicspikes']}]});
assert.statStage(battle.p2.active[0], 'atk', 0);
});
it('should ignore damage-reducing abilities', function () {
battle = common.createBattle();
battle.setPlayer('p1', {team: [{species: "Weezing", ability: 'neutralizinggas', item: 'expertbelt', moves: ['sludgebomb']}]});
battle.setPlayer('p2', {team: [{species: "Mr. Mime", ability: 'filter', item: 'laggingtail', moves: ['substitute']}]});
battle.makeChoices('move sludgebomb', 'move substitute');
assert(!battle.p1.active[0].volatiles['substitute']);
});
it('should negate self-healing abilities', function () {
battle = common.createBattle();
battle.setPlayer('p1', {team: [{species: "Weezing", ability: 'neutralizinggas', moves: ['toxic']}]});
battle.setPlayer('p2', {team: [{species: "Breloom", ability: 'poisonheal', moves: ['swordsdance']}]});
battle.makeChoices('move toxic', 'move swordsdance');
assert.false.fullHP(battle.p2.active[0]);
});
it('should negate abilities that suppress item effects', function () {
battle = common.createBattle();
battle.setPlayer('p1', {team: [{species: "Weezing", ability: 'neutralizinggas', moves: ['reflect']}]});
battle.setPlayer('p2', {team: [{species: "Reuniclus", ability: 'magicguard', item: 'lifeorb', moves: ['shadowball']}]});
battle.makeChoices('move reflect', 'move shadowball');
assert.false.fullHP(battle.p2.active[0]);
});
it('should negate abilities that modify boosts', function () {
battle = common.createBattle();
battle.setPlayer('p1', {team: [{species: "Weezing", ability: 'neutralizinggas', moves: ['spore']}]});
battle.setPlayer('p2', {team: [{species: "Shuckle", ability: 'contrary', moves: ['sleeptalk', 'superpower']}]});
battle.makeChoices('move spore', 'move sleeptalk');
assert.statStage(battle.p2.active[0], 'atk', -1);
});
it(`should negate abilites that activate on switch-out`, function () {
battle = common.createBattle([
[{species: "Weezing", ability: 'neutralizinggas', moves: ['toxic']},
{species: "Type: Null", ability: 'battlearmor', moves: ['facade']}],
[{species: "Corsola", ability: 'naturalcure', moves: ['uturn']},
{species: "Magikarp", ability: 'rattled', moves: ['splash']}],
]);
battle.makeChoices('move toxic', 'move uturn');
battle.makeChoices('', 'switch 2');
battle.makeChoices('switch 2', 'switch 2');
assert.equal(battle.p2.active[0].status, 'tox');
});
it('should negate abilities that modify move type', function () {
battle = common.createBattle();
battle.setPlayer('p1', {team: [{species: "Gengar", ability: 'neutralizinggas', moves: ['laserfocus']}]});
battle.setPlayer('p2', {team: [{species: "Sylveon", ability: 'pixilate', moves: ['hypervoice']}]});
battle.makeChoices('move laserfocus', 'move hypervoice');
assert.fullHP(battle.p1.active[0]);
});
it("should negate abilities that damage the attacker", function () {
battle = common.createBattle();
battle.setPlayer('p1', {team: [
{species: 'Weezing-Galar', ability: 'neutralizinggas', moves: ['payback']},
]});
battle.setPlayer('p2', {team: [
{species: 'Ferrothorn', ability: 'ironbarbs', moves: ['rockpolish']},
]});
battle.makeChoices();
assert.fullHP(battle.p1.active[0]);
});
it('should not activate Imposter if Neutralizing Gas leaves the field', function () {
battle = common.createBattle();
battle.setPlayer('p1', {team: [
{species: "Weezing", ability: 'neutralizinggas', moves: ['snore']},
{species: "Greninja", ability: 'torrent', moves: ['teleport']},
]});
battle.setPlayer('p2', {team: [
{species: "Ditto", ability: 'imposter', moves: ['sleeptalk']},
]});
assert.notEqual(battle.p1.active[0].species, battle.p2.active[0].species);
battle.makeChoices('switch greninja', 'move sleeptalk');
assert.notEqual(battle.p1.active[0].species, battle.p2.active[0].species);
assert.notEqual(battle.p1.pokemon[1].species, battle.p2.active[0].species);
});
it(`should prevent Unburden's activation when it is active on the field`, function () {
battle = common.createBattle([[
{species: "Wynaut", ability: 'unburden', item: 'sitrusberry', evs: {hp: 4}, moves: ['bellydrum']},
], [
{species: "Pancham", ability: 'neutralizinggas', moves: ['sleeptalk']},
{species: "Whismur", moves: ['sleeptalk']},
]]);
const wynaut = battle.p1.active[0];
const originalSpeed = wynaut.getStat('spe');
battle.makeChoices();
assert.equal(wynaut.getStat('spe'), originalSpeed);
//The chance to trigger Unburden is gone, so it missed the timing and doesn't gain the speed post-NGas removal
battle.makeChoices('auto', 'switch 2');
assert.equal(wynaut.getStat('spe'), originalSpeed);
});
it(`should negate Unburden when Neutralizing Gas enters the field`, function () {
battle = common.createBattle([[
{species: "Wynaut", ability: 'unburden', item: 'sitrusberry', evs: {hp: 4}, moves: ['bellydrum']},
], [
{species: "Whismur", moves: ['sleeptalk']},
{species: "Pancham", ability: 'neutralizinggas', moves: ['sleeptalk']},
]]);
const wynaut = battle.p1.active[0];
const originalSpeed = wynaut.getStat('spe');
battle.makeChoices();
assert.equal(wynaut.getStat('spe'), originalSpeed * 2);
battle.makeChoices('auto', 'switch 2');
assert.equal(wynaut.getStat('spe'), originalSpeed);
battle.makeChoices('auto', 'switch 2');
assert.equal(wynaut.getStat('spe'), originalSpeed * 2);
});
it(`should cause Illusion to instantly wear off when Neutralizing Gas enters the field`, function () {
battle = common.createBattle([[
{species: "Zoroark", ability: 'illusion', moves: ['sleeptalk']},
{species: "Eternatus", moves: ['sleeptalk']},
], [
{species: "Wynaut", moves: ['sleeptalk']},
{species: "Weezing", ability: 'neutralizinggas', moves: ['sleeptalk']},
]]);
battle.makeChoices('auto', 'switch 2');
assert(battle.log.some(line => line.includes('|-end|p1a: Zoroark|Illusion')));
});
it(`should cause Slow Start to instantly wear off/restart when Neutralizing Gas leaves/enters the field`, function () {
battle = common.createBattle([[
{species: "Regigigas", ability: 'slowstart', moves: ['sleeptalk']},
{species: "Eternatus", moves: ['sleeptalk']},
], [
{species: "Wynaut", moves: ['sleeptalk']},
{species: "Weezing", ability: 'neutralizinggas', moves: ['sleeptalk']},
]]);
const regigigas = battle.p1.active[0];
const slowStartSpeed = regigigas.getStat('spe');
// Slow Start should be negated, so it should have its original, non-Slow Start speed
battle.makeChoices('auto', 'switch 2');
assert.equal(regigigas.getStat('spe'), slowStartSpeed * 2);
// Slow Start should be turned back on, so it should have its Slow Start speed again
battle.makeChoices('auto', 'switch 2');
assert.equal(regigigas.getStat('spe'), slowStartSpeed);
});
it.skip(`should not cause Gluttony to instantly eat Berries when Neutralizing Gas leaves the field`, function () {
battle = common.createBattle([[
{species: "Wynaut", ability: 'gluttony', item: 'aguavberry', evs: {hp: 4}, moves: ['bellydrum']},
], [
{species: "Pancham", ability: 'neutralizinggas', moves: ['sleeptalk']},
{species: "Whismur", level: 1, moves: ['seismictoss']},
]]);
const wynaut = battle.p1.active[0];
battle.makeChoices();
assert.equal(wynaut.hp, Math.floor(wynaut.maxhp / 2));
// Gluttony doesn't activate because it missed the timing
battle.makeChoices('auto', 'switch 2');
assert.equal(wynaut.hp, Math.floor(wynaut.maxhp / 2));
// Gluttony now has the opportunity to activate the Aguav Berry again on taking damage
battle.makeChoices();
assert.equal(wynaut.hp, Math.floor(wynaut.maxhp / 2) - 1 + Math.floor(wynaut.maxhp * 0.33));
});
it(`should not trigger twice if negated then replaced`, function () {
battle = common.createBattle([[
{species: "Weezing", ability: 'neutralizinggas', moves: ['sleeptalk']},
], [
{species: "Wynaut", ability: 'intrepidsword', moves: ['gastroacid', 'simplebeam']},
]]);
const wynaut = battle.p2.active[0];
battle.makeChoices();
assert.statStage(wynaut, 'atk', 1);
// We already negated NGas, so it shouldn't run other abilities again
battle.makeChoices('auto', 'move simplebeam');
assert.statStage(wynaut, 'atk', 1);
});
it(`should not re-trigger Unnerve if the ability was already triggered before`, function () {
battle = common.createBattle({gameType: 'doubles'}, [[
{species: "Bisharp", ability: 'defiant', moves: ['sleeptalk']},
{species: "Eternatus", ability: 'pressure', moves: ['sleeptalk']},
], [
{species: "Rookidee", ability: 'unnerve', moves: ['sleeptalk']},
{species: "Diglett", moves: ['sleeptalk']},
{species: "Weezing", ability: 'neutralizinggas', moves: ['sleeptalk']},
]]);
// Unnerve activates properly on lead
battle.makeChoices('auto', 'move sleeptalk, switch 3');
battle.makeChoices('auto', 'move sleeptalk, switch 3');
// It will become active again after a Neutralizing Gas cycle, but without the Ability message
battle.makeChoices('auto', 'move sleeptalk, switch 3');
const log = battle.getDebugLog();
const firstUnnerveIndex = log.indexOf('|-ability|p2a: Rookidee|Unnerve');
const secondUnnerveIndex = log.lastIndexOf('|-ability|p2a: Rookidee|Unnerve');
assert.equal(firstUnnerveIndex, secondUnnerveIndex, 'Unnerve should have only activated once.');
});
describe(`Ability reactivation order`, function () {
it(`should cause entrance Abilities to reactivate in order of Speed`, function () {
battle = common.createBattle({gameType: 'doubles'}, [[
{species: "Pincurchin", ability: 'electricsurge', moves: ['sleeptalk']},
{species: "Eternatus", moves: ['sleeptalk']},
], [
{species: "Rillaboom", ability: 'grassysurge', moves: ['sleeptalk']},
{species: "Weezing", ability: 'neutralizinggas', moves: ['sleeptalk']},
{species: "Diglett", moves: ['sleeptalk']},
]]);
battle.makeChoices('auto', 'move sleeptalk, switch 3');
assert(battle.field.isTerrain('electricterrain'));
});
it(`should cause non-entrance abilities to be active immediately`, function () {
battle = common.createBattle({gameType: 'doubles'}, [[
{species: "Bisharp", ability: 'defiant', moves: ['sleeptalk']},
{species: "Eternatus", moves: ['sleeptalk']},
], [
{species: "Salamence", ability: 'intimidate', moves: ['sleeptalk']},
{species: "Weezing", ability: 'neutralizinggas', moves: ['sleeptalk']},
{species: "Diglett", moves: ['sleeptalk']},
]]);
battle.makeChoices('auto', 'move sleeptalk, switch 3');
assert.statStage(battle.p1.active[0], 'atk', 1);
});
it(`should not give Unnerve priority in activation`, function () {
battle = common.createBattle({gameType: 'doubles'}, [[
{species: "Bisharp", ability: 'defiant', moves: ['sleeptalk']},
{species: "Eternatus", ability: 'pressure', moves: ['sleeptalk']},
], [
{species: "Rookidee", ability: 'unnerve', moves: ['sleeptalk']},
{species: "Weezing", ability: 'neutralizinggas', moves: ['sleeptalk']},
{species: "Diglett", moves: ['sleeptalk']},
]]);
battle.makeChoices('auto', 'move sleeptalk, switch 3');
const log = battle.getDebugLog();
const pressureIndex = log.indexOf('|-ability|p1b: Eternatus|Pressure');
const unnerveIndex = log.indexOf('|-ability|p2a: Rookidee|Unnerve');
assert(pressureIndex < unnerveIndex, 'Faster Pressure should activate before slower Unnerve');
});
});
});