Pokemon_server / test /sim /misc /endlessbattleclause.js
Jofthomas's picture
Jofthomas HF Staff
Upload 4781 files
5c2ed06 verified
'use strict';
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();
}