Spaces:
Paused
Paused
| ; | |
| const assert = require('./../../assert'); | |
| const common = require('./../../common'); | |
| let battle; | |
| describe('Endless Battle Clause (slow)', () => { | |
| afterEach(() => battle.destroy()); | |
| it('should trigger on an infinite loop', () => { | |
| battle = common.createBattle({ endlessBattleClause: true }); | |
| battle.setPlayer('p1', { team: [{ species: "Caterpie", moves: ['tackle'] }] }); | |
| battle.setPlayer('p2', { team: [{ species: "Slowbro", item: 'leppaberry', moves: ['slackoff', 'healpulse', 'recycle'] }] }); | |
| const [victim, memeSlowbro] = [battle.p1.active[0], battle.p2.active[0]]; | |
| skipTurns(battle, 100); | |
| for (let i = 0; i < 100; i++) { | |
| if (battle.ended) { | |
| assert.equal(battle.winner, 'Player 1'); | |
| return; | |
| } | |
| let move; | |
| if (victim.hp < 150) { | |
| move = 'healpulse'; | |
| } else if (memeSlowbro.item === '') { | |
| move = 'recycle'; | |
| } else { | |
| move = 'slackoff'; | |
| } | |
| battle.makeChoices('default', `move ${move}`); | |
| } | |
| assert.fail("The battle did not end despite Endless Battle Clause"); | |
| }); | |
| it('should not trigger by both Pokemon eating a Leppa Berry they started with', () => { | |
| battle = common.createBattle({ endlessBattleClause: true }); | |
| battle.setPlayer('p1', { team: [{ species: "Sunkern", item: 'leppaberry', moves: ['synthesis'] }] }); | |
| battle.setPlayer('p2', { team: [{ species: "Sunkern", item: 'leppaberry', moves: ['synthesis'] }] }); | |
| skipTurns(battle, 100); | |
| for (let i = 0; i < 10; i++) { | |
| battle.makeChoices('move synthesis', 'move synthesis'); | |
| } | |
| assert.false(battle.ended); | |
| }); | |
| it('should only cause the battle to end if either side cannot switch to a non-stale Pokemon and at least one staleness is externally inflicted', () => { | |
| battle = common.createBattle({ endlessBattleClause: true }); | |
| battle.setPlayer('p1', { team: [ | |
| { species: "Blissey", level: 1, item: 'leppaberry', moves: ['recycle', 'extremespeed', 'floralhealing', 'block'] }, | |
| { species: "Magikarp", moves: ['splash'] }, | |
| ] }); | |
| battle.setPlayer('p2', { team: [ | |
| { species: "Magikarp", moves: ['splash'] }, | |
| { species: "Sunkern", item: 'leppaberry', moves: ['synthesis'] }, | |
| ] }); | |
| skipTurns(battle, 100); | |
| for (let i = 0; i < 8; i++) { | |
| battle.makeChoices('move extremespeed', 'move splash'); | |
| } | |
| // Blissey consumes a Leppa Berry that wasn't cycled = no staleness. | |
| assert.false(battle.ended); | |
| battle.makeChoices('move recycle', 'move splash'); | |
| assert.false(battle.ended); | |
| for (let i = 0; i < 8; i++) { | |
| battle.makeChoices('move extremespeed', 'move splash'); | |
| } | |
| // Blissey consumes a Leppa Berry which was cycled = internal staleness. | |
| assert.false(battle.ended); | |
| // Blissey inflicts external staleness on Magikarp. | |
| battle.makeChoices('move floralhealing', 'move splash'); | |
| // Magikarp can still be switched out to Sunkern at this point, so EBC still shouldn't trigger | |
| assert.false(battle.ended); | |
| battle.makeChoices('move block', 'move splash'); | |
| // Now that Magikarp is trapped, the termination condition should occur. | |
| assert(battle.ended); | |
| assert.equal(battle.winner, 'Player 2'); | |
| }); | |
| it('Fling should cause externally inflicted staleness', () => { | |
| battle = common.createBattle({ endlessBattleClause: true }); | |
| battle.setPlayer('p1', { team: [ | |
| { species: "Blissey", level: 1, item: 'leppaberry', moves: ['recycle', 'extremespeed', 'fling', 'block'] }, | |
| { species: "Magikarp", moves: ['splash'] }, | |
| ] }); | |
| battle.setPlayer('p2', { team: [ | |
| { species: "Magikarp", moves: ['splash'] }, | |
| { species: "Sunkern", item: 'leppaberry', moves: ['synthesis'] }, | |
| ] }); | |
| skipTurns(battle, 100); | |
| // Blissey inflicts external staleness on Magikarp. | |
| battle.makeChoices('move fling', 'move splash'); | |
| assert.false(battle.ended); | |
| battle.makeChoices('move recycle', 'move splash'); | |
| for (let i = 0; i < 8; i++) { | |
| battle.makeChoices('move extremespeed', 'move splash'); | |
| } | |
| assert.false(battle.ended); | |
| battle.makeChoices('move block', 'move splash'); | |
| // Now that Magikarp is trapped, the termination condition should occur. | |
| assert(battle.ended); | |
| assert.equal(battle.winner, 'Player 2'); | |
| }); | |
| it('Entrainment should cause externally inflicted staleness', () => { | |
| battle = common.createBattle({ endlessBattleClause: true }); | |
| battle.setPlayer('p1', { team: [ | |
| { species: "Blissey", ability: 'Levitate', level: 1, item: 'leppaberry', moves: ['recycle', 'extremespeed', 'entrainment', 'block'] }, | |
| { species: "Magikarp", moves: ['splash'] }, | |
| ] }); | |
| battle.setPlayer('p2', { team: [ | |
| { species: "Magikarp", ability: 'Illuminate', moves: ['splash'] }, | |
| { species: "Sunkern", item: 'leppaberry', moves: ['synthesis'] }, | |
| ] }); | |
| skipTurns(battle, 100); | |
| // Blissey inflicts external staleness on Magikarp. | |
| battle.makeChoices('move entrainment', 'move splash'); | |
| assert.false(battle.ended); | |
| for (let i = 0; i < 8; i++) { | |
| battle.makeChoices('move extremespeed', 'move splash'); | |
| } | |
| assert.false(battle.ended); | |
| battle.makeChoices('move recycle', 'move splash'); | |
| assert.false(battle.ended); | |
| for (let i = 0; i < 8; i++) { | |
| battle.makeChoices('move extremespeed', 'move splash'); | |
| } | |
| assert.false(battle.ended); | |
| battle.makeChoices('move block', 'move splash'); | |
| // Now that Magikarp is trapped, the termination condition should occur. | |
| assert(battle.ended); | |
| assert.equal(battle.winner, 'Player 2'); | |
| }); | |
| it('Entrainment\'s externally inflicted staleness should go away on switch', () => { | |
| battle = common.createBattle({ endlessBattleClause: true }); | |
| battle.setPlayer('p1', { team: [ | |
| { species: "Blissey", ability: 'Levitate', level: 1, item: 'leppaberry', moves: ['recycle', 'extremespeed', 'entrainment', 'block'] }, | |
| { species: "Magikarp", moves: ['splash'] }, | |
| ] }); | |
| battle.setPlayer('p2', { team: [ | |
| { species: "Magikarp", ability: 'Illuminate', moves: ['splash'] }, | |
| { species: "Sunkern", item: 'leppaberry', moves: ['synthesis'] }, | |
| ] }); | |
| skipTurns(battle, 100); | |
| // Blissey inflicts external staleness on Magikarp. | |
| battle.makeChoices('move entrainment', 'move splash'); | |
| assert.false(battle.ended); | |
| for (let i = 0; i < 8; i++) { | |
| battle.makeChoices('move extremespeed', 'move splash'); | |
| } | |
| assert.false(battle.ended); | |
| battle.makeChoices('move recycle', 'move splash'); | |
| assert.false(battle.ended); | |
| for (let i = 0; i < 8; i++) { | |
| battle.makeChoices('move extremespeed', 'move splash'); | |
| } | |
| assert.false(battle.ended); | |
| battle.makeChoices('move recycle', 'switch 2'); | |
| battle.makeChoices('move block', 'switch 2'); | |
| assert(!battle.ended); | |
| }); | |
| it('should allow for a maximum of 1000 turns', function () { | |
| this.timeout(0); | |
| battle = common.createBattle({ endlessBattleClause: true }); | |
| battle.setPlayer('p1', { team: [ | |
| { species: "Gengar", moves: ['splash'] }, | |
| { species: "Clefable", moves: ['splash'] }, | |
| ] }); | |
| battle.setPlayer('p2', { team: [ | |
| { species: "Blissey", moves: ['splash'] }, | |
| { species: "Vaporeon", moves: ['splash'] }, | |
| ] }); | |
| for (let i = 0; i < 998; i++) { | |
| battle.makeChoices('switch 2', 'switch 2'); | |
| } | |
| assert(!battle.ended); | |
| battle.makeChoices('switch 2', 'switch 2'); | |
| assert(battle.ended); | |
| }); | |
| it('Skill Swap should remove the user\'s staleness', () => { | |
| battle = common.createBattle({ endlessBattleClause: true }, [[ | |
| { species: "Furret", moves: ['skillswap'] }, | |
| ], [ | |
| { species: "Ampharos", moves: ['skillswap'] }, | |
| ]]); | |
| skipTurns(battle, 100); | |
| for (let i = 0; i < 8; i++) battle.makeChoices(); | |
| assert.false(battle.ended); | |
| }); | |
| }); | |
| // Endless Battle Clause doesn't take effect for 100 turns, so we artificially skip turns | |
| // to get the turn counter to be in the range which could possibly trigger the clause | |
| function skipTurns(battle, turns) { | |
| for (let i = 0; i < turns; i++) battle.endTurn(); | |
| } | |