'use strict'; const assert = require('./../../assert'); const common = require('./../../common'); let battle; describe('Hazards', () => { afterEach(() => { battle.destroy(); }); it(`should damage Pokemon before regular entrance Abilities`, () => { battle = common.createBattle([[ { species: 'wynaut', moves: ['uturn'] }, { species: 'shedinja', ability: 'electricsurge', moves: ['sleeptalk'] }, ], [ { species: 'landorus', moves: ['stealthrock'] }, ]]); battle.makeChoices(); battle.makeChoices('switch 2'); assert.false(battle.field.isTerrain('electricterrain')); }); it(`should damage multiple Pokemon switching in simulatenously by Speed order`, () => { battle = common.createBattle([[ { species: 'wynaut', moves: ['stealthrock', 'sleeptalk'] }, { species: 'kyogre', ability: 'drizzle', item: 'choicescarf', moves: ['sleeptalk'] }, ], [ { species: 'miltank', moves: ['stealthrock', 'finalgambit'] }, { species: 'landorus-therian', ability: 'intimidate', moves: ['sleeptalk'] }, ]]); battle.makeChoices(); battle.makeChoices('move sleeptalk', 'move finalgambit'); battle.makeChoices('switch 2', 'switch 2'); const log = battle.getDebugLog(); const rocksKyogreIndex = log.indexOf('|-damage|p1a: Kyogre|299/341|[from] Stealth Rock'); const abilityKyogreIndex = log.indexOf('ability: Drizzle|[of] p1a: Kyogre'); const rocksLandorusIndex = log.indexOf('|-damage|p2a: Landorus|280/319|[from] Stealth Rock'); const abilityLandorusIndex = log.indexOf('|-ability|p2a: Landorus|Intimidate'); assert(rocksKyogreIndex < abilityKyogreIndex, 'Stealth Rock should damage Kyogre before Drizzle activates.'); assert(abilityKyogreIndex < rocksLandorusIndex, 'Kyogre should activate Drizzle before Landorus takes rocks damage.'); assert(rocksLandorusIndex < abilityLandorusIndex, 'Stealth Rock should damage Landorus before Intimidate activates.'); }); it(`should set up hazards even if there is no target`, () => { battle = common.createBattle([[ { species: 'diglett', level: 1, moves: ['sleeptalk', 'finalgambit'] }, { species: 'diglett', level: 1, moves: ['sleeptalk', 'finalgambit'] }, { species: 'diglett', level: 1, moves: ['sleeptalk', 'finalgambit'] }, { species: 'diglett', level: 1, moves: ['sleeptalk', 'finalgambit'] }, ], [ { species: 'wynaut', item: 'laggingtail', moves: ['stealthrock', 'spikes', 'stickyweb', 'defog'] }, ]]); battle.makeChoices('move finalgambit', 'move stealthrock'); battle.makeChoices('switch 2'); assert.false.fullHP(battle.p1.active[0]); battle.makeChoices('move sleeptalk', 'move defog'); battle.makeChoices('move finalgambit', 'move spikes'); battle.makeChoices('switch 3'); assert.false.fullHP(battle.p1.active[0]); battle.makeChoices('move sleeptalk', 'move defog'); battle.makeChoices('move finalgambit', 'move stickyweb'); battle.makeChoices('switch 4'); assert.statStage(battle.p1.active[0], 'spe', -1); }); it(`should apply hazards in the order they were set up`, () => { battle = common.createBattle([[ { species: 'wynaut', moves: ['sleeptalk', 'uturn'] }, { species: 'whismur', moves: ['sleeptalk'] }, ], [ { species: 'landorus', moves: ['stealthrock', 'spikes', 'stickyweb', 'toxicspikes'] }, ]]); battle.makeChoices('move sleeptalk', 'move toxicspikes'); battle.makeChoices('move sleeptalk', 'move stickyweb'); battle.makeChoices('move sleeptalk', 'move spikes'); battle.makeChoices('move sleeptalk', 'move toxicspikes'); battle.makeChoices('move uturn', 'move stealthrock'); battle.makeChoices('switch 2'); const log = battle.getDebugLog(); const tSpikeIndex = log.indexOf('|-status|p1a: Whismur|tox'); const websIndex = log.indexOf('|-activate|p1a: Whismur|move: Sticky Web'); const spikesIndex = log.indexOf('|[from] Spikes'); const rocksIndex = log.indexOf('[from] Stealth Rock'); assert(tSpikeIndex < websIndex, 'Toxic Spikes should have poisoned before Sticky Web lowered speed.'); assert(websIndex < spikesIndex, 'Sticky Web should have lowered speed before Spikes damage.'); assert(spikesIndex < rocksIndex, 'Spikes should have damaged before Stealth Rock.'); }); it(`should allow Berries to trigger between hazards`, () => { battle = common.createBattle([[ { species: 'wynaut', moves: ['sleeptalk', 'uturn'] }, { species: 'shedinja', item: 'lumberry', moves: ['sleeptalk'] }, ], [ { species: 'landorus', moves: ['toxicspikes', 'stealthrock'] }, ]]); battle.makeChoices(); battle.makeChoices('move uturn', 'move stealthrock'); battle.makeChoices('switch 2'); const shedinja = battle.p1.active[0]; assert.false.holdsItem(shedinja, 'Shedinja should have lost Lum Berry before fainting to rocks.'); }); it(`should set up hazards to every opponents' side in a Free-for-all battle`, () => { battle = common.createBattle({ gameType: 'freeforall' }, [[ { species: 'Bronzong', moves: ['sleeptalk', 'stealthrock'] }, ], [ { species: 'Cufant', moves: ['sleeptalk'] }, ], [ { species: 'Qwilfish', moves: ['sleeptalk'] }, ], [ { species: 'Marowak', moves: ['stealthrock'] }, ]]); battle.makeChoices(); assert.deepEqual(battle.sides.map(side => !!side.sideConditions.stealthrock), [true, true, true, false]); battle.makeChoices('move stealthrock', 'auto', 'auto', 'auto'); assert.deepEqual(battle.sides.map(side => !!side.sideConditions.stealthrock), [true, true, true, true]); }); it(`should set up hazards even if there is no target in a Free-for-all battle`, () => { battle = common.createBattle({ gameType: 'freeforall' }, [[ { species: 'Bronzong', item: 'laggingtail', moves: ['sleeptalk', 'stealthrock'] }, ], [ { species: 'Wynaut', level: 1, moves: ['finalgambit'] }, { species: 'Cufant', moves: ['sleeptalk'] }, ], [ { species: 'Wynaut', level: 1, moves: ['finalgambit'] }, { species: 'Qwilfish', moves: ['sleeptalk'] }, ], [ { species: 'Wynaut', level: 1, moves: ['finalgambit'] }, { species: 'Marowak', moves: ['stealthrock'] }, ]]); battle.makeChoices('move stealthrock', 'move finalgambit 1', 'move finalgambit 1', 'move finalgambit 1'); assert.deepEqual(battle.sides.map(side => !!side.sideConditions.stealthrock), [false, true, true, true]); }); });