'use strict'; const assert = require('./../../assert'); const common = require('./../../common'); let battle; describe('Metronome (item)', () => { afterEach(() => { battle.destroy(); }); it(`should increase the damage of moves that have been used successfully and consecutively`, () => { battle = common.createBattle([[ { species: 'wynaut', item: 'metronome', moves: ['psystrike'] }, ], [ { species: 'cleffa', evs: { hp: 252 }, ability: 'shellarmor', moves: ['sleeptalk'] }, ]]); battle.makeChoices(); const cleffa = battle.p2.active[0]; const hpAfterOneAttack = cleffa.hp; battle.makeChoices(); const damage = hpAfterOneAttack - cleffa.hp; assert.bounded(damage, [115, 137]); }); it(`should reset the multiplier after switching moves`, () => { battle = common.createBattle([[ { species: 'wynaut', item: 'metronome', moves: ['psystrike', 'sleeptalk'] }, ], [ { species: 'cleffa', evs: { hp: 252 }, ability: 'shellarmor', moves: ['sleeptalk'] }, ]]); battle.makeChoices(); const cleffa = battle.p2.active[0]; const hpAfterOneAttack = cleffa.hp; battle.makeChoices('move sleeptalk', 'auto'); battle.makeChoices(); const damage = hpAfterOneAttack - cleffa.hp; assert.bounded(damage, [96, 114]); }); it(`should reset the multiplier after hitting Protect`, () => { battle = common.createBattle([[ { species: 'wynaut', item: 'metronome', moves: ['psystrike'] }, ], [ { species: 'cleffa', evs: { hp: 252 }, ability: 'shellarmor', moves: ['sleeptalk', 'protect'] }, ]]); battle.makeChoices(); const cleffa = battle.p2.active[0]; const hpAfterOneAttack = cleffa.hp; battle.makeChoices('auto', 'move protect'); battle.makeChoices(); const damage = hpAfterOneAttack - cleffa.hp; assert.bounded(damage, [96, 114]); }); it(`should instantly start moves that use a charging turn at Metronome 1 boost level, then increase linearly`, () => { battle = common.createBattle([[ { species: 'dusknoir', item: 'metronome', moves: ['dig'] }, ], [ { species: 'blissey', ability: 'shellarmor', moves: ['softboiled'] }, ]]); battle.makeChoices(); battle.makeChoices(); const blissey = battle.p2.active[0]; let damage = blissey.maxhp - blissey.hp; // Metronome 1 and 2 damage rolls always overlap in range, so we can't use assert.bounded here. let possibleDamageRolls = [290, 294, 296, 300, 304, 307, 311, 314, 318, 320, 324, 328, 331, 335, 338, 342]; const damageWasMetronome1Boosted = possibleDamageRolls.includes(damage); assert(damageWasMetronome1Boosted, `Dig should be Metronome 1 boosted`); battle.makeChoices(); battle.makeChoices(); damage = blissey.maxhp - blissey.hp; possibleDamageRolls = [339, 343, 346, 350, 354, 358, 363, 367, 371, 374, 378, 382, 386, 391, 395, 399]; const damageWasMetronome2Boosted = possibleDamageRolls.includes(damage); assert(damageWasMetronome2Boosted, `Dig should be Metronome 2 boosted`); }); it(`should not instantly start moves that skip a charging turn at Metronome 1 boost level`, () => { battle = common.createBattle([[ { species: 'slowbro', item: 'metronome', moves: ['solarbeam'] }, ], [ { species: 'blissey', ability: 'shellarmor', moves: ['sunnyday'] }, { species: 'blissey', ability: 'cloudnine', moves: ['luckychant'] }, ]]); battle.makeChoices(); const blissey = battle.p2.active[0]; let damage = blissey.maxhp - blissey.hp; assert.bounded(damage, [67, 79], `Solar Beam should not be Metronome boosted`); battle.makeChoices('auto', 'switch 2'); battle.makeChoices(); const newBlissey = battle.p2.active[0]; damage = newBlissey.maxhp - newBlissey.hp; assert.bounded(damage, [80, 95], `Solar Beam should be Metronome 1 boosted`); }); it(`should use called moves to determine the Metronome multiplier`, () => { battle = common.createBattle([[ { species: 'goomy', item: 'metronome', moves: ['copycat', 'surf'] }, ], [ { species: 'clefable', evs: { hp: 252 }, ability: 'shellarmor', moves: ['softboiled', 'surf'] }, ]]); battle.makeChoices('move copycat', 'move surf'); const clefable = battle.p2.active[0]; let damage = clefable.maxhp - clefable.hp; assert.bounded(damage, [45, 53], `Surf should not be Metronome boosted`); const hpAfterOneAttack = clefable.hp; battle.makeChoices('move copycat', 'move surf'); damage = hpAfterOneAttack - clefable.hp; assert.bounded(damage, [54, 64], `Surf should be Metronome 1 boosted`); battle.makeChoices('move surf', 'move softboiled'); damage = clefable.maxhp - clefable.hp; assert.bounded(damage, [63, 74], `Surf should be Metronome 2 boosted`); }); });