Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Gen 4: Fix Assist/Copycat/Metronome under Gravity/Heal Block #10757

Open
wants to merge 5 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 59 additions & 0 deletions data/mods/gen4/moves.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,32 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = {
},
},
},
assist: {
inherit: true,
onHit(target) {
const moves = [];
for (const pokemon of target.side.pokemon) {
if (pokemon === target) continue;
for (const moveSlot of pokemon.moveSlots) {
const moveid = moveSlot.id;
const move = this.dex.moves.get(moveid);
if (move.flags['noassist'] || move.isZ || move.isMax ||
KrisXV marked this conversation as resolved.
Show resolved Hide resolved
(this.field.pseudoWeather['gravity'] && move.flags['gravity']) ||
(target.volatiles['healblock'] && move.flags['heal'])
) {
continue;
}
moves.push(moveid);
}
}
let randomMove = '';
if (moves.length) randomMove = this.sample(moves);
if (!randomMove) {
return false;
}
this.actions.useMove(randomMove, target);
},
},
beatup: {
inherit: true,
basePower: 10,
Expand Down Expand Up @@ -198,6 +224,22 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = {
this.add('-start', target, 'typechange', type);
},
},
copycat: {
inherit: true,
onHit(pokemon) {
let move: Move | ActiveMove | null = this.lastMove;
if (!move) return;

if (move.isMax && move.baseMove) move = this.dex.moves.get(move.baseMove);
if (move.flags['failcopycat'] || move.isZ || move.isMax ||
KrisXV marked this conversation as resolved.
Show resolved Hide resolved
(this.field.pseudoWeather['gravity'] && move.flags['gravity']) ||
(pokemon.volatiles['healblock'] && move.flags['heal'])
) {
return false;
}
this.actions.useMove(move.id, pokemon);
},
},
cottonspore: {
inherit: true,
accuracy: 85,
Expand Down Expand Up @@ -1007,6 +1049,23 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = {
metronome: {
inherit: true,
flags: {noassist: 1, failcopycat: 1, nosleeptalk: 1, failmimic: 1},
onHit(pokemon) {
const moves = this.dex.moves.all().filter(move => (
(![2, 4].includes(this.gen) || !pokemon.moves.includes(move.id)) &&
(!move.isNonstandard || move.isNonstandard === 'Unobtainable') &&
move.flags['metronome'] &&
!(this.field.pseudoWeather['gravity'] && move.flags['gravity']) &&
!(pokemon.volatiles['healblock'] && move.flags['heal'])
));
let randomMove = '';
if (moves.length) {
moves.sort((a, b) => a.num - b.num);
randomMove = this.sample(moves).id;
}
if (!randomMove) return false;
pokemon.side.lastSelectedMove = this.toID(randomMove);
this.actions.useMove(randomMove, pokemon);
},
},
mimic: {
inherit: true,
Expand Down
6 changes: 2 additions & 4 deletions data/moves.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12187,9 +12187,8 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = {
pp: 10,
priority: 0,
flags: {failencore: 1, nosleeptalk: 1, noassist: 1, failcopycat: 1, failmimic: 1, failinstruct: 1},
onHit(target, source, effect) {
onHit(pokemon) {
const moves = this.dex.moves.all().filter(move => (
(![2, 4].includes(this.gen) || !source.moves.includes(move.id)) &&
(!move.isNonstandard || move.isNonstandard === 'Unobtainable') &&
move.flags['metronome']
));
Expand All @@ -12199,8 +12198,7 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = {
randomMove = this.sample(moves).id;
}
if (!randomMove) return false;
source.side.lastSelectedMove = this.toID(randomMove);
this.actions.useMove(randomMove, target);
this.actions.useMove(randomMove, pokemon);
},
callsMove: true,
secondary: null,
Expand Down
2 changes: 1 addition & 1 deletion test/TESTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ Check the test/ directory to see if a file already exists for the effect that yo
it(`test should start here`, function () {

});
}
});

To create the battle, use common.createBattle and pass in two arrays of teams. You can add additional flags as well:
- gameType: 'doubles', 'triples', 'multi', 'freeforall', etc (tests default to singles)
Expand Down
42 changes: 42 additions & 0 deletions test/sim/moves/assist.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
'use strict';

const assert = require('./../../assert');
const common = require('./../../common');

let battle;

describe(`[Gen 4] Assist`, function () {
afterEach(function () {
battle.destroy();
});

it(`should never call moves that would fail under Gravity`, function () {
battle = common.gen(4).createBattle([[
{species: 'furret', moves: ['assist']},
{species: 'smeargle', moves: ['bounce', 'fly', 'highjumpkick', 'splash']},
{species: 'smeargle', moves: ['bounce', 'fly', 'highjumpkick', 'splash']},
{species: 'smeargle', moves: ['bounce', 'fly', 'highjumpkick', 'splash']},
{species: 'smeargle', moves: ['doubleteam', 'fly', 'highjumpkick', 'splash']},
{species: 'smeargle', moves: ['bounce', 'fly', 'highjumpkick', 'splash']},
], [
{species: 'deoxys', moves: ['gravity']},
]]);
for (let i = 0; i < 5; i++) battle.makeChoices();
assert.statStage(battle.p1.active[0], 'evasion', 5);
});

it(`should never call moves that would fail under Heal Block`, function () {
battle = common.gen(4).createBattle([[
{species: 'furret', moves: ['assist']},
{species: 'smeargle', moves: ['recover', 'rest', 'roost', 'wish']},
{species: 'smeargle', moves: ['recover', 'rest', 'doubleteam', 'wish']},
{species: 'smeargle', moves: ['recover', 'rest', 'roost', 'wish']},
{species: 'smeargle', moves: ['recover', 'rest', 'roost', 'wish']},
{species: 'smeargle', moves: ['recover', 'rest', 'roost', 'wish']},
], [
{species: 'latios', moves: ['healblock']},
]]);
for (let i = 0; i < 5; i++) battle.makeChoices();
assert.statStage(battle.p1.active[0], 'evasion', 5);
});
});
Loading