@pkmn/sim 0.9.30 → 0.9.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/cjs/config/formats.js +58 -43
- package/build/cjs/config/formats.js.map +1 -1
- package/build/cjs/data/abilities.js +41 -41
- package/build/cjs/data/abilities.js.map +1 -1
- package/build/cjs/data/aliases.js +2 -2
- package/build/cjs/data/aliases.js.map +1 -1
- package/build/cjs/data/conditions.js +20 -20
- package/build/cjs/data/conditions.js.map +1 -1
- package/build/cjs/data/formats-data.js +1 -1
- package/build/cjs/data/items.js +5 -5
- package/build/cjs/data/items.js.map +1 -1
- package/build/cjs/data/mods/gen1/conditions.js +1 -2
- package/build/cjs/data/mods/gen1/conditions.js.map +1 -1
- package/build/cjs/data/mods/gen1/moves.js +2 -2
- package/build/cjs/data/mods/gen1/moves.js.map +1 -1
- package/build/cjs/data/mods/gen1/pokedex.js.map +1 -1
- package/build/cjs/data/mods/gen1/scripts.js +6 -6
- package/build/cjs/data/mods/gen1/scripts.js.map +1 -1
- package/build/cjs/data/mods/gen2/conditions.js +2 -2
- package/build/cjs/data/mods/gen2/conditions.js.map +1 -1
- package/build/cjs/data/mods/gen2/moves.js +3 -3
- package/build/cjs/data/mods/gen2/moves.js.map +1 -1
- package/build/cjs/data/mods/gen2/rulesets.js.map +1 -1
- package/build/cjs/data/mods/gen2/scripts.js +2 -2
- package/build/cjs/data/mods/gen2/scripts.js.map +1 -1
- package/build/cjs/data/mods/gen3/abilities.js +1 -1
- package/build/cjs/data/mods/gen3/abilities.js.map +1 -1
- package/build/cjs/data/mods/gen3/conditions.js +1 -1
- package/build/cjs/data/mods/gen3/conditions.js.map +1 -1
- package/build/cjs/data/mods/gen3/moves.js +5 -5
- package/build/cjs/data/mods/gen3/moves.js.map +1 -1
- package/build/cjs/data/mods/gen3/scripts.js +2 -2
- package/build/cjs/data/mods/gen3/scripts.js.map +1 -1
- package/build/cjs/data/mods/gen4/abilities.js +4 -4
- package/build/cjs/data/mods/gen4/abilities.js.map +1 -1
- package/build/cjs/data/mods/gen4/conditions.js +1 -1
- package/build/cjs/data/mods/gen4/conditions.js.map +1 -1
- package/build/cjs/data/mods/gen4/items.js +2 -2
- package/build/cjs/data/mods/gen4/items.js.map +1 -1
- package/build/cjs/data/mods/gen4/moves.js +22 -22
- package/build/cjs/data/mods/gen4/moves.js.map +1 -1
- package/build/cjs/data/mods/gen4/scripts.js +1 -1
- package/build/cjs/data/mods/gen4/scripts.js.map +1 -1
- package/build/cjs/data/mods/gen5/abilities.js +1 -1
- package/build/cjs/data/mods/gen5/abilities.js.map +1 -1
- package/build/cjs/data/mods/gen5/conditions.js +2 -2
- package/build/cjs/data/mods/gen5/conditions.js.map +1 -1
- package/build/cjs/data/mods/gen5/moves.js +6 -6
- package/build/cjs/data/mods/gen5/moves.js.map +1 -1
- package/build/cjs/data/mods/gen5/pokedex.js.map +1 -1
- package/build/cjs/data/mods/gen6/abilities.js +2 -2
- package/build/cjs/data/mods/gen6/abilities.js.map +1 -1
- package/build/cjs/data/mods/gen6/moves.js +1 -1
- package/build/cjs/data/mods/gen6/moves.js.map +1 -1
- package/build/cjs/data/mods/gen6/pokedex.js.map +1 -1
- package/build/cjs/data/mods/gen7/abilities.js.map +1 -1
- package/build/cjs/data/mods/gen7/moves.js +8 -8
- package/build/cjs/data/mods/gen7/moves.js.map +1 -1
- package/build/cjs/data/mods/gen7/pokedex.js.map +1 -1
- package/build/cjs/data/mods/gen8/abilities.js.map +1 -1
- package/build/cjs/data/mods/gen8/moves.js.map +1 -1
- package/build/cjs/data/mods/gen8/pokedex.js.map +1 -1
- package/build/cjs/data/moves.js +105 -103
- package/build/cjs/data/moves.js.map +1 -1
- package/build/cjs/data/pokedex.js.map +1 -1
- package/build/cjs/data/pokemongo.js.map +1 -1
- package/build/cjs/data/rulesets.js +0 -1
- package/build/cjs/data/rulesets.js.map +1 -1
- package/build/cjs/data/tags.js.map +1 -1
- package/build/cjs/data/text/abilities.js.map +1 -1
- package/build/cjs/data/text/default.js.map +1 -1
- package/build/cjs/data/text/items.js.map +1 -1
- package/build/cjs/data/text/moves.js.map +1 -1
- package/build/cjs/data/typechart.js.map +1 -1
- package/build/cjs/lib/utils.d.ts +5 -5
- package/build/cjs/lib/utils.js +21 -11
- package/build/cjs/lib/utils.js.map +1 -1
- package/build/cjs/sim/battle-actions.js +8 -8
- package/build/cjs/sim/battle-actions.js.map +1 -1
- package/build/cjs/sim/battle-queue.js +0 -1
- package/build/cjs/sim/battle-queue.js.map +1 -1
- package/build/cjs/sim/battle-stream.d.ts +3 -2
- package/build/cjs/sim/battle-stream.js +1 -1
- package/build/cjs/sim/battle-stream.js.map +1 -1
- package/build/cjs/sim/battle.d.ts +8 -8
- package/build/cjs/sim/battle.js +41 -44
- package/build/cjs/sim/battle.js.map +1 -1
- package/build/cjs/sim/dex-abilities.js.map +1 -1
- package/build/cjs/sim/dex-conditions.js +2 -2
- package/build/cjs/sim/dex-conditions.js.map +1 -1
- package/build/cjs/sim/dex-data.js +1 -1
- package/build/cjs/sim/dex-data.js.map +1 -1
- package/build/cjs/sim/dex-formats.d.ts +1 -0
- package/build/cjs/sim/dex-formats.js +95 -37
- package/build/cjs/sim/dex-formats.js.map +1 -1
- package/build/cjs/sim/dex-items.js.map +1 -1
- package/build/cjs/sim/dex-moves.js +2 -3
- package/build/cjs/sim/dex-moves.js.map +1 -1
- package/build/cjs/sim/exported-global-types.d.ts +1 -9
- package/build/cjs/sim/field.d.ts +1 -1
- package/build/cjs/sim/field.js +3 -3
- package/build/cjs/sim/field.js.map +1 -1
- package/build/cjs/sim/global-types.d.ts +1 -9
- package/build/cjs/sim/pokemon.d.ts +14 -25
- package/build/cjs/sim/pokemon.js +21 -22
- package/build/cjs/sim/pokemon.js.map +1 -1
- package/build/cjs/sim/side.d.ts +105 -11
- package/build/cjs/sim/side.js +6 -6
- package/build/cjs/sim/side.js.map +1 -1
- package/build/cjs/sim/state.d.ts +1 -1
- package/build/cjs/sim/state.js +3 -3
- package/build/cjs/sim/state.js.map +1 -1
- package/build/cjs/sim/team-validator.d.ts +2 -1
- package/build/cjs/sim/team-validator.js +37 -27
- package/build/cjs/sim/team-validator.js.map +1 -1
- package/build/cjs/sim/tools/random-player-ai.d.ts +4 -3
- package/build/cjs/sim/tools/random-player-ai.js +6 -7
- package/build/cjs/sim/tools/random-player-ai.js.map +1 -1
- package/build/cjs/sim/tools/runner.d.ts +2 -2
- package/build/cjs/sim/tools/runner.js +1 -1
- package/build/cjs/sim/tools/runner.js.map +1 -1
- package/build/esm/config/formats.mjs +58 -43
- package/build/esm/config/formats.mjs.map +1 -1
- package/build/esm/data/abilities.mjs +41 -41
- package/build/esm/data/abilities.mjs.map +1 -1
- package/build/esm/data/aliases.mjs +2 -2
- package/build/esm/data/aliases.mjs.map +1 -1
- package/build/esm/data/conditions.mjs +20 -20
- package/build/esm/data/conditions.mjs.map +1 -1
- package/build/esm/data/formats-data.mjs +1 -1
- package/build/esm/data/items.mjs +5 -5
- package/build/esm/data/items.mjs.map +1 -1
- package/build/esm/data/mods/gen1/conditions.mjs +1 -2
- package/build/esm/data/mods/gen1/conditions.mjs.map +1 -1
- package/build/esm/data/mods/gen1/moves.mjs +2 -2
- package/build/esm/data/mods/gen1/moves.mjs.map +1 -1
- package/build/esm/data/mods/gen1/pokedex.mjs.map +1 -1
- package/build/esm/data/mods/gen1/scripts.mjs +6 -6
- package/build/esm/data/mods/gen1/scripts.mjs.map +1 -1
- package/build/esm/data/mods/gen2/conditions.mjs +2 -2
- package/build/esm/data/mods/gen2/conditions.mjs.map +1 -1
- package/build/esm/data/mods/gen2/moves.mjs +3 -3
- package/build/esm/data/mods/gen2/moves.mjs.map +1 -1
- package/build/esm/data/mods/gen2/rulesets.mjs.map +1 -1
- package/build/esm/data/mods/gen2/scripts.mjs +2 -2
- package/build/esm/data/mods/gen2/scripts.mjs.map +1 -1
- package/build/esm/data/mods/gen3/abilities.mjs +1 -1
- package/build/esm/data/mods/gen3/abilities.mjs.map +1 -1
- package/build/esm/data/mods/gen3/conditions.mjs +1 -1
- package/build/esm/data/mods/gen3/conditions.mjs.map +1 -1
- package/build/esm/data/mods/gen3/moves.mjs +5 -5
- package/build/esm/data/mods/gen3/moves.mjs.map +1 -1
- package/build/esm/data/mods/gen3/scripts.mjs +2 -2
- package/build/esm/data/mods/gen3/scripts.mjs.map +1 -1
- package/build/esm/data/mods/gen4/abilities.mjs +4 -4
- package/build/esm/data/mods/gen4/abilities.mjs.map +1 -1
- package/build/esm/data/mods/gen4/conditions.mjs +1 -1
- package/build/esm/data/mods/gen4/conditions.mjs.map +1 -1
- package/build/esm/data/mods/gen4/items.mjs +2 -2
- package/build/esm/data/mods/gen4/items.mjs.map +1 -1
- package/build/esm/data/mods/gen4/moves.mjs +22 -22
- package/build/esm/data/mods/gen4/moves.mjs.map +1 -1
- package/build/esm/data/mods/gen4/scripts.mjs +1 -1
- package/build/esm/data/mods/gen4/scripts.mjs.map +1 -1
- package/build/esm/data/mods/gen5/abilities.mjs +1 -1
- package/build/esm/data/mods/gen5/abilities.mjs.map +1 -1
- package/build/esm/data/mods/gen5/conditions.mjs +2 -2
- package/build/esm/data/mods/gen5/conditions.mjs.map +1 -1
- package/build/esm/data/mods/gen5/moves.mjs +6 -6
- package/build/esm/data/mods/gen5/moves.mjs.map +1 -1
- package/build/esm/data/mods/gen5/pokedex.mjs.map +1 -1
- package/build/esm/data/mods/gen6/abilities.mjs +2 -2
- package/build/esm/data/mods/gen6/abilities.mjs.map +1 -1
- package/build/esm/data/mods/gen6/moves.mjs +1 -1
- package/build/esm/data/mods/gen6/moves.mjs.map +1 -1
- package/build/esm/data/mods/gen6/pokedex.mjs.map +1 -1
- package/build/esm/data/mods/gen7/abilities.mjs.map +1 -1
- package/build/esm/data/mods/gen7/moves.mjs +8 -8
- package/build/esm/data/mods/gen7/moves.mjs.map +1 -1
- package/build/esm/data/mods/gen7/pokedex.mjs.map +1 -1
- package/build/esm/data/mods/gen8/abilities.mjs.map +1 -1
- package/build/esm/data/mods/gen8/moves.mjs.map +1 -1
- package/build/esm/data/mods/gen8/pokedex.mjs.map +1 -1
- package/build/esm/data/moves.mjs +105 -103
- package/build/esm/data/moves.mjs.map +1 -1
- package/build/esm/data/pokedex.mjs.map +1 -1
- package/build/esm/data/pokemongo.mjs.map +1 -1
- package/build/esm/data/rulesets.mjs +0 -1
- package/build/esm/data/rulesets.mjs.map +1 -1
- package/build/esm/data/tags.mjs.map +1 -1
- package/build/esm/data/text/abilities.mjs.map +1 -1
- package/build/esm/data/text/default.mjs.map +1 -1
- package/build/esm/data/text/items.mjs.map +1 -1
- package/build/esm/data/text/moves.mjs.map +1 -1
- package/build/esm/data/typechart.mjs.map +1 -1
- package/build/esm/lib/utils.d.mts +5 -5
- package/build/esm/lib/utils.mjs +21 -11
- package/build/esm/lib/utils.mjs.map +1 -1
- package/build/esm/sim/battle-actions.mjs +8 -8
- package/build/esm/sim/battle-actions.mjs.map +1 -1
- package/build/esm/sim/battle-queue.mjs +0 -1
- package/build/esm/sim/battle-queue.mjs.map +1 -1
- package/build/esm/sim/battle-stream.d.mts +3 -2
- package/build/esm/sim/battle-stream.mjs +1 -1
- package/build/esm/sim/battle-stream.mjs.map +1 -1
- package/build/esm/sim/battle.d.mts +8 -8
- package/build/esm/sim/battle.mjs +41 -44
- package/build/esm/sim/battle.mjs.map +1 -1
- package/build/esm/sim/dex-abilities.mjs.map +1 -1
- package/build/esm/sim/dex-conditions.mjs +2 -2
- package/build/esm/sim/dex-conditions.mjs.map +1 -1
- package/build/esm/sim/dex-data.mjs +1 -1
- package/build/esm/sim/dex-data.mjs.map +1 -1
- package/build/esm/sim/dex-formats.d.mts +1 -0
- package/build/esm/sim/dex-formats.mjs +95 -37
- package/build/esm/sim/dex-formats.mjs.map +1 -1
- package/build/esm/sim/dex-items.mjs.map +1 -1
- package/build/esm/sim/dex-moves.mjs +2 -3
- package/build/esm/sim/dex-moves.mjs.map +1 -1
- package/build/esm/sim/exported-global-types.d.mts +1 -9
- package/build/esm/sim/field.d.mts +1 -1
- package/build/esm/sim/field.mjs +3 -3
- package/build/esm/sim/field.mjs.map +1 -1
- package/build/esm/sim/global-types.d.mts +1 -9
- package/build/esm/sim/pokemon.d.mts +14 -25
- package/build/esm/sim/pokemon.mjs +21 -22
- package/build/esm/sim/pokemon.mjs.map +1 -1
- package/build/esm/sim/side.d.mts +105 -11
- package/build/esm/sim/side.mjs +6 -6
- package/build/esm/sim/side.mjs.map +1 -1
- package/build/esm/sim/state.d.mts +1 -1
- package/build/esm/sim/state.mjs +3 -3
- package/build/esm/sim/state.mjs.map +1 -1
- package/build/esm/sim/team-validator.d.mts +2 -1
- package/build/esm/sim/team-validator.mjs +37 -27
- package/build/esm/sim/team-validator.mjs.map +1 -1
- package/build/esm/sim/tools/random-player-ai.d.mts +4 -3
- package/build/esm/sim/tools/random-player-ai.mjs +6 -7
- package/build/esm/sim/tools/random-player-ai.mjs.map +1 -1
- package/build/esm/sim/tools/runner.d.mts +2 -2
- package/build/esm/sim/tools/runner.mjs +1 -1
- package/build/esm/sim/tools/runner.mjs.map +1 -1
- package/package.json +1 -1
package/build/cjs/data/moves.js
CHANGED
|
@@ -359,7 +359,7 @@ exports.Moves = {
|
|
|
359
359
|
// this.effectState.counter should never be undefined here.
|
|
360
360
|
// However, just in case, use 1 if it is undefined.
|
|
361
361
|
const counter = this.effectState.counter || 1;
|
|
362
|
-
this.debug(
|
|
362
|
+
this.debug(`Ally Switch success chance: ${Math.round(100 / counter)}%`);
|
|
363
363
|
const success = this.randomChance(1, counter);
|
|
364
364
|
if (!success) {
|
|
365
365
|
delete pokemon.volatiles['allyswitch'];
|
|
@@ -597,7 +597,7 @@ exports.Moves = {
|
|
|
597
597
|
let success = false;
|
|
598
598
|
const allies = [...target.side.pokemon, ...target.side.allySide?.pokemon || []];
|
|
599
599
|
for (const ally of allies) {
|
|
600
|
-
if (ally !== source) {
|
|
600
|
+
if (ally !== source && !this.suppressingAbility(ally)) {
|
|
601
601
|
if (ally.hasAbility('sapsipper')) {
|
|
602
602
|
this.add('-immune', ally, '[from] ability: Sap Sipper');
|
|
603
603
|
continue;
|
|
@@ -763,10 +763,10 @@ exports.Moves = {
|
|
|
763
763
|
return false;
|
|
764
764
|
}
|
|
765
765
|
if (effect.name === 'Cute Charm') {
|
|
766
|
-
this.add('-start', pokemon, 'Attract', '[from] ability: Cute Charm',
|
|
766
|
+
this.add('-start', pokemon, 'Attract', '[from] ability: Cute Charm', `[of] ${source}`);
|
|
767
767
|
}
|
|
768
768
|
else if (effect.name === 'Destiny Knot') {
|
|
769
|
-
this.add('-start', pokemon, 'Attract', '[from] item: Destiny Knot',
|
|
769
|
+
this.add('-start', pokemon, 'Attract', '[from] item: Destiny Knot', `[of] ${source}`);
|
|
770
770
|
}
|
|
771
771
|
else {
|
|
772
772
|
this.add('-start', pokemon, 'Attract');
|
|
@@ -774,7 +774,7 @@ exports.Moves = {
|
|
|
774
774
|
},
|
|
775
775
|
onUpdate(pokemon) {
|
|
776
776
|
if (this.effectState.source && !this.effectState.source.isActive && pokemon.volatiles['attract']) {
|
|
777
|
-
this.debug(
|
|
777
|
+
this.debug(`Removing Attract volatile on ${pokemon}`);
|
|
778
778
|
pokemon.removeVolatile('attract');
|
|
779
779
|
}
|
|
780
780
|
},
|
|
@@ -957,7 +957,7 @@ exports.Moves = {
|
|
|
957
957
|
basePowerCallback(pokemon, target, move) {
|
|
958
958
|
const damagedByTarget = pokemon.attackedBy.some(p => p.source === target && p.damage > 0 && p.thisTurn);
|
|
959
959
|
if (damagedByTarget) {
|
|
960
|
-
this.debug(
|
|
960
|
+
this.debug(`BP doubled for getting hit by ${target}`);
|
|
961
961
|
return move.basePower * 2;
|
|
962
962
|
}
|
|
963
963
|
return move.basePower;
|
|
@@ -1212,7 +1212,7 @@ exports.Moves = {
|
|
|
1212
1212
|
basePowerCallback(pokemon, target, move) {
|
|
1213
1213
|
const currentSpecies = move.allies.shift().species;
|
|
1214
1214
|
const bp = 5 + Math.floor(currentSpecies.baseStats.atk / 10);
|
|
1215
|
-
this.debug(
|
|
1215
|
+
this.debug(`BP for ${currentSpecies.name} hit: ${bp}`);
|
|
1216
1216
|
return bp;
|
|
1217
1217
|
},
|
|
1218
1218
|
category: "Physical",
|
|
@@ -1316,7 +1316,7 @@ exports.Moves = {
|
|
|
1316
1316
|
source.item = myItem.id;
|
|
1317
1317
|
return false;
|
|
1318
1318
|
}
|
|
1319
|
-
this.add('-item', target, myItem.name, '[from] move: Bestow',
|
|
1319
|
+
this.add('-item', target, myItem.name, '[from] move: Bestow', `[of] ${source}`);
|
|
1320
1320
|
},
|
|
1321
1321
|
secondary: null,
|
|
1322
1322
|
target: "normal",
|
|
@@ -2006,7 +2006,7 @@ exports.Moves = {
|
|
|
2006
2006
|
onHit(target, source) {
|
|
2007
2007
|
const item = target.getItem();
|
|
2008
2008
|
if (source.hp && item.isBerry && target.takeItem(source)) {
|
|
2009
|
-
this.add('-enditem', target, item.name, '[from] stealeat', '[move] Bug Bite',
|
|
2009
|
+
this.add('-enditem', target, item.name, '[from] stealeat', '[move] Bug Bite', `[of] ${source}`);
|
|
2010
2010
|
if (this.singleEvent('Eat', item, null, source, null, null)) {
|
|
2011
2011
|
this.runEvent('EatItem', source, null, null, item);
|
|
2012
2012
|
if (item.id === 'leppaberry')
|
|
@@ -2814,7 +2814,7 @@ exports.Moves = {
|
|
|
2814
2814
|
flags: { contact: 1, protect: 1, mirror: 1, failmefirst: 1 },
|
|
2815
2815
|
onTry(source) {
|
|
2816
2816
|
const lastDamagedBy = source.getLastDamagedBy(true);
|
|
2817
|
-
if (
|
|
2817
|
+
if (!lastDamagedBy?.thisTurn)
|
|
2818
2818
|
return false;
|
|
2819
2819
|
},
|
|
2820
2820
|
onModifyTarget(targetRelayVar, source, target, move) {
|
|
@@ -3059,7 +3059,7 @@ exports.Moves = {
|
|
|
3059
3059
|
onHit(target, source) {
|
|
3060
3060
|
const item = target.takeItem(source);
|
|
3061
3061
|
if (item) {
|
|
3062
|
-
this.add('-enditem', target, item.name, '[from] move: Corrosive Gas',
|
|
3062
|
+
this.add('-enditem', target, item.name, '[from] move: Corrosive Gas', `[of] ${source}`);
|
|
3063
3063
|
}
|
|
3064
3064
|
else {
|
|
3065
3065
|
this.add('-fail', target, 'move: Corrosive Gas');
|
|
@@ -3275,7 +3275,7 @@ exports.Moves = {
|
|
|
3275
3275
|
target.item = yourItem.id; // bypass setItem so we don't break choicelock or anything
|
|
3276
3276
|
return;
|
|
3277
3277
|
}
|
|
3278
|
-
this.add('-item', source, yourItem, '[from] move: Covet',
|
|
3278
|
+
this.add('-item', source, yourItem, '[from] move: Covet', `[of] ${target}`);
|
|
3279
3279
|
},
|
|
3280
3280
|
secondary: null,
|
|
3281
3281
|
target: "normal",
|
|
@@ -3409,7 +3409,7 @@ exports.Moves = {
|
|
|
3409
3409
|
const hp = target.hp;
|
|
3410
3410
|
const maxHP = target.maxhp;
|
|
3411
3411
|
const bp = Math.floor(Math.floor((120 * (100 * Math.floor(hp * 4096 / maxHP)) + 2048 - 1) / 4096) / 100) || 1;
|
|
3412
|
-
this.debug(
|
|
3412
|
+
this.debug(`BP for ${hp}/${maxHP} HP: ${bp}`);
|
|
3413
3413
|
return bp;
|
|
3414
3414
|
},
|
|
3415
3415
|
category: "Physical",
|
|
@@ -3457,7 +3457,7 @@ exports.Moves = {
|
|
|
3457
3457
|
},
|
|
3458
3458
|
condition: {
|
|
3459
3459
|
onStart(pokemon, source) {
|
|
3460
|
-
this.add('-start', pokemon, 'Curse',
|
|
3460
|
+
this.add('-start', pokemon, 'Curse', `[of] ${source}`);
|
|
3461
3461
|
},
|
|
3462
3462
|
onResidualOrder: 12,
|
|
3463
3463
|
onResidual(pokemon) {
|
|
@@ -3639,13 +3639,13 @@ exports.Moves = {
|
|
|
3639
3639
|
if (target.side.removeSideCondition(targetCondition)) {
|
|
3640
3640
|
if (!removeAll.includes(targetCondition))
|
|
3641
3641
|
continue;
|
|
3642
|
-
this.add('-sideend', target.side, this.dex.conditions.get(targetCondition).name, '[from] move: Defog',
|
|
3642
|
+
this.add('-sideend', target.side, this.dex.conditions.get(targetCondition).name, '[from] move: Defog', `[of] ${source}`);
|
|
3643
3643
|
success = true;
|
|
3644
3644
|
}
|
|
3645
3645
|
}
|
|
3646
3646
|
for (const sideCondition of removeAll) {
|
|
3647
3647
|
if (source.side.removeSideCondition(sideCondition)) {
|
|
3648
|
-
this.add('-sideend', source.side, this.dex.conditions.get(sideCondition).name, '[from] move: Defog',
|
|
3648
|
+
this.add('-sideend', source.side, this.dex.conditions.get(sideCondition).name, '[from] move: Defog', `[of] ${source}`);
|
|
3649
3649
|
success = true;
|
|
3650
3650
|
}
|
|
3651
3651
|
}
|
|
@@ -3848,7 +3848,7 @@ exports.Moves = {
|
|
|
3848
3848
|
}
|
|
3849
3849
|
}
|
|
3850
3850
|
if (effect.effectType === 'Ability') {
|
|
3851
|
-
this.add('-start', pokemon, 'Disable', pokemon.lastMove.name, '[from] ability: ' + effect.name,
|
|
3851
|
+
this.add('-start', pokemon, 'Disable', pokemon.lastMove.name, '[from] ability: ' + effect.name, `[of] ${source}`);
|
|
3852
3852
|
}
|
|
3853
3853
|
else {
|
|
3854
3854
|
this.add('-start', pokemon, 'Disable', pokemon.lastMove.name);
|
|
@@ -4057,7 +4057,7 @@ exports.Moves = {
|
|
|
4057
4057
|
return false;
|
|
4058
4058
|
Object.assign(target.side.slotConditions[target.position]['futuremove'], {
|
|
4059
4059
|
move: 'doomdesire',
|
|
4060
|
-
source
|
|
4060
|
+
source,
|
|
4061
4061
|
moveData: {
|
|
4062
4062
|
id: 'doomdesire',
|
|
4063
4063
|
name: "Doom Desire",
|
|
@@ -4352,7 +4352,7 @@ exports.Moves = {
|
|
|
4352
4352
|
basePower: 150,
|
|
4353
4353
|
basePowerCallback(pokemon, target, move) {
|
|
4354
4354
|
const bp = move.basePower * pokemon.hp / pokemon.maxhp;
|
|
4355
|
-
this.debug(
|
|
4355
|
+
this.debug(`BP: ${bp}`);
|
|
4356
4356
|
return bp;
|
|
4357
4357
|
},
|
|
4358
4358
|
category: "Special",
|
|
@@ -4638,7 +4638,7 @@ exports.Moves = {
|
|
|
4638
4638
|
if (this.field.pseudoWeather.echoedvoice) {
|
|
4639
4639
|
bp = move.basePower * this.field.pseudoWeather.echoedvoice.multiplier;
|
|
4640
4640
|
}
|
|
4641
|
-
this.debug(
|
|
4641
|
+
this.debug(`BP: ${move.basePower}`);
|
|
4642
4642
|
return bp;
|
|
4643
4643
|
},
|
|
4644
4644
|
category: "Special",
|
|
@@ -4772,7 +4772,7 @@ exports.Moves = {
|
|
|
4772
4772
|
},
|
|
4773
4773
|
onFieldStart(field, source, effect) {
|
|
4774
4774
|
if (effect?.effectType === 'Ability') {
|
|
4775
|
-
this.add('-fieldstart', 'move: Electric Terrain', '[from] ability: ' + effect.name,
|
|
4775
|
+
this.add('-fieldstart', 'move: Electric Terrain', '[from] ability: ' + effect.name, `[of] ${source}`);
|
|
4776
4776
|
}
|
|
4777
4777
|
else {
|
|
4778
4778
|
this.add('-fieldstart', 'move: Electric Terrain');
|
|
@@ -4833,7 +4833,7 @@ exports.Moves = {
|
|
|
4833
4833
|
if (!isFinite(ratio))
|
|
4834
4834
|
ratio = 0;
|
|
4835
4835
|
const bp = [40, 60, 80, 120, 150][Math.min(ratio, 4)];
|
|
4836
|
-
this.debug(
|
|
4836
|
+
this.debug(`BP: ${bp}`);
|
|
4837
4837
|
return bp;
|
|
4838
4838
|
},
|
|
4839
4839
|
category: "Special",
|
|
@@ -5144,7 +5144,7 @@ exports.Moves = {
|
|
|
5144
5144
|
basePower: 150,
|
|
5145
5145
|
basePowerCallback(pokemon, target, move) {
|
|
5146
5146
|
const bp = move.basePower * pokemon.hp / pokemon.maxhp;
|
|
5147
|
-
this.debug(
|
|
5147
|
+
this.debug(`BP: ${bp}`);
|
|
5148
5148
|
return bp;
|
|
5149
5149
|
},
|
|
5150
5150
|
category: "Special",
|
|
@@ -5831,7 +5831,7 @@ exports.Moves = {
|
|
|
5831
5831
|
else {
|
|
5832
5832
|
bp = 20;
|
|
5833
5833
|
}
|
|
5834
|
-
this.debug(
|
|
5834
|
+
this.debug(`BP: ${bp}`);
|
|
5835
5835
|
return bp;
|
|
5836
5836
|
},
|
|
5837
5837
|
category: "Physical",
|
|
@@ -6038,7 +6038,7 @@ exports.Moves = {
|
|
|
6038
6038
|
if (!item.fling)
|
|
6039
6039
|
return false;
|
|
6040
6040
|
move.basePower = item.fling.basePower;
|
|
6041
|
-
this.debug(
|
|
6041
|
+
this.debug(`BP: ${move.basePower}`);
|
|
6042
6042
|
if (item.isBerry) {
|
|
6043
6043
|
move.onHit = function (foe) {
|
|
6044
6044
|
if (this.singleEvent('Eat', item, null, foe, null, null)) {
|
|
@@ -6312,7 +6312,9 @@ exports.Moves = {
|
|
|
6312
6312
|
name: "Focus Punch",
|
|
6313
6313
|
pp: 20,
|
|
6314
6314
|
priority: -3,
|
|
6315
|
-
flags: {
|
|
6315
|
+
flags: {
|
|
6316
|
+
contact: 1, protect: 1, punch: 1, failmefirst: 1, nosleeptalk: 1, noassist: 1, failcopycat: 1, failinstruct: 1,
|
|
6317
|
+
},
|
|
6316
6318
|
priorityChargeCallback(pokemon) {
|
|
6317
6319
|
pokemon.addVolatile('focuspunch');
|
|
6318
6320
|
},
|
|
@@ -6633,7 +6635,7 @@ exports.Moves = {
|
|
|
6633
6635
|
pokemon.addVolatile('furycutter');
|
|
6634
6636
|
}
|
|
6635
6637
|
const bp = this.clampIntRange(move.basePower * pokemon.volatiles['furycutter'].multiplier, 1, 160);
|
|
6636
|
-
this.debug(
|
|
6638
|
+
this.debug(`BP: ${bp}`);
|
|
6637
6639
|
return bp;
|
|
6638
6640
|
},
|
|
6639
6641
|
category: "Physical",
|
|
@@ -6729,7 +6731,7 @@ exports.Moves = {
|
|
|
6729
6731
|
return false;
|
|
6730
6732
|
Object.assign(target.side.slotConditions[target.position]['futuremove'], {
|
|
6731
6733
|
move: 'futuresight',
|
|
6732
|
-
source
|
|
6734
|
+
source,
|
|
6733
6735
|
moveData: {
|
|
6734
6736
|
id: 'futuresight',
|
|
6735
6737
|
name: "Future Sight",
|
|
@@ -7617,7 +7619,7 @@ exports.Moves = {
|
|
|
7617
7619
|
const steelHazard = this.dex.getActiveMove('Stealth Rock');
|
|
7618
7620
|
steelHazard.type = 'Steel';
|
|
7619
7621
|
const typeMod = this.clampIntRange(pokemon.runEffectiveness(steelHazard), -6, 6);
|
|
7620
|
-
this.damage(pokemon.maxhp *
|
|
7622
|
+
this.damage(pokemon.maxhp * (2 ** typeMod) / 8);
|
|
7621
7623
|
},
|
|
7622
7624
|
},
|
|
7623
7625
|
secondary: null,
|
|
@@ -7911,13 +7913,13 @@ exports.Moves = {
|
|
|
7911
7913
|
if (source.side.foe.removeSideCondition(targetCondition)) {
|
|
7912
7914
|
if (!removeAll.includes(targetCondition))
|
|
7913
7915
|
continue;
|
|
7914
|
-
this.add('-sideend', source.side.foe, this.dex.conditions.get(targetCondition).name, '[from] move: G-Max Wind Rage',
|
|
7916
|
+
this.add('-sideend', source.side.foe, this.dex.conditions.get(targetCondition).name, '[from] move: G-Max Wind Rage', `[of] ${source}`);
|
|
7915
7917
|
success = true;
|
|
7916
7918
|
}
|
|
7917
7919
|
}
|
|
7918
7920
|
for (const sideCondition of removeAll) {
|
|
7919
7921
|
if (source.side.removeSideCondition(sideCondition)) {
|
|
7920
|
-
this.add('-sideend', source.side, this.dex.conditions.get(sideCondition).name, '[from] move: G-Max Wind Rage',
|
|
7922
|
+
this.add('-sideend', source.side, this.dex.conditions.get(sideCondition).name, '[from] move: G-Max Wind Rage', `[of] ${source}`);
|
|
7921
7923
|
success = true;
|
|
7922
7924
|
}
|
|
7923
7925
|
}
|
|
@@ -7955,7 +7957,7 @@ exports.Moves = {
|
|
|
7955
7957
|
else {
|
|
7956
7958
|
bp = 20;
|
|
7957
7959
|
}
|
|
7958
|
-
this.debug(
|
|
7960
|
+
this.debug(`BP: ${bp}`);
|
|
7959
7961
|
return bp;
|
|
7960
7962
|
},
|
|
7961
7963
|
category: "Special",
|
|
@@ -8105,7 +8107,7 @@ exports.Moves = {
|
|
|
8105
8107
|
},
|
|
8106
8108
|
onFieldStart(field, source, effect) {
|
|
8107
8109
|
if (effect?.effectType === 'Ability') {
|
|
8108
|
-
this.add('-fieldstart', 'move: Grassy Terrain', '[from] ability: ' + effect.name,
|
|
8110
|
+
this.add('-fieldstart', 'move: Grassy Terrain', '[from] ability: ' + effect.name, `[of] ${source}`);
|
|
8109
8111
|
}
|
|
8110
8112
|
else {
|
|
8111
8113
|
this.add('-fieldstart', 'move: Grassy Terrain');
|
|
@@ -8372,7 +8374,7 @@ exports.Moves = {
|
|
|
8372
8374
|
const newspd = Math.floor((target.storedStats.spd + source.storedStats.spd) / 2);
|
|
8373
8375
|
target.storedStats.spd = newspd;
|
|
8374
8376
|
source.storedStats.spd = newspd;
|
|
8375
|
-
this.add('-activate', source, 'move: Guard Split',
|
|
8377
|
+
this.add('-activate', source, 'move: Guard Split', `[of] ${target}`);
|
|
8376
8378
|
},
|
|
8377
8379
|
secondary: null,
|
|
8378
8380
|
target: "normal",
|
|
@@ -8465,7 +8467,7 @@ exports.Moves = {
|
|
|
8465
8467
|
power = 1;
|
|
8466
8468
|
if (power > 150)
|
|
8467
8469
|
power = 150;
|
|
8468
|
-
this.debug(
|
|
8470
|
+
this.debug(`BP: ${power}`);
|
|
8469
8471
|
return power;
|
|
8470
8472
|
},
|
|
8471
8473
|
category: "Physical",
|
|
@@ -8560,7 +8562,7 @@ exports.Moves = {
|
|
|
8560
8562
|
const hp = target.hp;
|
|
8561
8563
|
const maxHP = target.maxhp;
|
|
8562
8564
|
const bp = Math.floor(Math.floor((100 * (100 * Math.floor(hp * 4096 / maxHP)) + 2048 - 1) / 4096) / 100) || 1;
|
|
8563
|
-
this.debug(
|
|
8565
|
+
this.debug(`BP for ${hp}/${maxHP} HP: ${bp}`);
|
|
8564
8566
|
return bp;
|
|
8565
8567
|
},
|
|
8566
8568
|
category: "Physical",
|
|
@@ -8674,7 +8676,7 @@ exports.Moves = {
|
|
|
8674
8676
|
let success = false;
|
|
8675
8677
|
const allies = [...target.side.pokemon, ...target.side.allySide?.pokemon || []];
|
|
8676
8678
|
for (const ally of allies) {
|
|
8677
|
-
if (ally !== source) {
|
|
8679
|
+
if (ally !== source && !this.suppressingAbility(ally)) {
|
|
8678
8680
|
if (ally.hasAbility('soundproof')) {
|
|
8679
8681
|
this.add('-immune', ally, '[from] ability: Soundproof');
|
|
8680
8682
|
continue;
|
|
@@ -8918,7 +8920,7 @@ exports.Moves = {
|
|
|
8918
8920
|
else {
|
|
8919
8921
|
bp = 40;
|
|
8920
8922
|
}
|
|
8921
|
-
this.debug(
|
|
8923
|
+
this.debug(`BP: ${bp}`);
|
|
8922
8924
|
return bp;
|
|
8923
8925
|
},
|
|
8924
8926
|
category: "Physical",
|
|
@@ -8980,7 +8982,7 @@ exports.Moves = {
|
|
|
8980
8982
|
else {
|
|
8981
8983
|
bp = 40;
|
|
8982
8984
|
}
|
|
8983
|
-
this.debug(
|
|
8985
|
+
this.debug(`BP: ${bp}`);
|
|
8984
8986
|
return bp;
|
|
8985
8987
|
},
|
|
8986
8988
|
category: "Physical",
|
|
@@ -9020,11 +9022,11 @@ exports.Moves = {
|
|
|
9020
9022
|
duration: 1,
|
|
9021
9023
|
onStart(target, source) {
|
|
9022
9024
|
this.effectState.multiplier = 1.5;
|
|
9023
|
-
this.add('-singleturn', target, 'Helping Hand',
|
|
9025
|
+
this.add('-singleturn', target, 'Helping Hand', `[of] ${source}`);
|
|
9024
9026
|
},
|
|
9025
9027
|
onRestart(target, source) {
|
|
9026
9028
|
this.effectState.multiplier *= 1.5;
|
|
9027
|
-
this.add('-singleturn', target, 'Helping Hand',
|
|
9029
|
+
this.add('-singleturn', target, 'Helping Hand', `[of] ${source}`);
|
|
9028
9030
|
},
|
|
9029
9031
|
onBasePowerPriority: 10,
|
|
9030
9032
|
onBasePower(basePower) {
|
|
@@ -9712,7 +9714,7 @@ exports.Moves = {
|
|
|
9712
9714
|
let bp = move.basePower;
|
|
9713
9715
|
const iceballData = pokemon.volatiles['iceball'];
|
|
9714
9716
|
if (iceballData?.hitCount) {
|
|
9715
|
-
bp *=
|
|
9717
|
+
bp *= 2 ** iceballData.contactHitCount;
|
|
9716
9718
|
}
|
|
9717
9719
|
if (iceballData && pokemon.status !== 'slp') {
|
|
9718
9720
|
iceballData.hitCount++;
|
|
@@ -9724,7 +9726,7 @@ exports.Moves = {
|
|
|
9724
9726
|
if (pokemon.volatiles['defensecurl']) {
|
|
9725
9727
|
bp *= 2;
|
|
9726
9728
|
}
|
|
9727
|
-
this.debug(
|
|
9729
|
+
this.debug(`BP: ${bp}`);
|
|
9728
9730
|
return bp;
|
|
9729
9731
|
},
|
|
9730
9732
|
category: "Physical",
|
|
@@ -10144,7 +10146,7 @@ exports.Moves = {
|
|
|
10144
10146
|
(target.moveSlots[moveIndex] && target.moveSlots[moveIndex].pp <= 0)) {
|
|
10145
10147
|
return false;
|
|
10146
10148
|
}
|
|
10147
|
-
this.add('-singleturn', target, 'move: Instruct',
|
|
10149
|
+
this.add('-singleturn', target, 'move: Instruct', `[of] ${source}`);
|
|
10148
10150
|
this.queue.prioritizeAction(this.queue.resolveAction({
|
|
10149
10151
|
choice: 'move',
|
|
10150
10152
|
pokemon: target,
|
|
@@ -10485,7 +10487,7 @@ exports.Moves = {
|
|
|
10485
10487
|
if (source.hp) {
|
|
10486
10488
|
const item = target.takeItem();
|
|
10487
10489
|
if (item) {
|
|
10488
|
-
this.add('-enditem', target, item.name, '[from] move: Knock Off',
|
|
10490
|
+
this.add('-enditem', target, item.name, '[from] move: Knock Off', `[of] ${source}`);
|
|
10489
10491
|
}
|
|
10490
10492
|
}
|
|
10491
10493
|
},
|
|
@@ -10939,7 +10941,7 @@ exports.Moves = {
|
|
|
10939
10941
|
},
|
|
10940
10942
|
onHit(target, source) {
|
|
10941
10943
|
source.addVolatile('lockon', target);
|
|
10942
|
-
this.add('-activate', source, 'move: Lock-On',
|
|
10944
|
+
this.add('-activate', source, 'move: Lock-On', `[of] ${target}`);
|
|
10943
10945
|
},
|
|
10944
10946
|
condition: {
|
|
10945
10947
|
noCopy: true, // doesn't get copied by Baton Pass
|
|
@@ -11002,7 +11004,7 @@ exports.Moves = {
|
|
|
11002
11004
|
else {
|
|
11003
11005
|
bp = 20;
|
|
11004
11006
|
}
|
|
11005
|
-
this.debug(
|
|
11007
|
+
this.debug(`BP: ${bp}`);
|
|
11006
11008
|
return bp;
|
|
11007
11009
|
},
|
|
11008
11010
|
category: "Physical",
|
|
@@ -11319,10 +11321,10 @@ exports.Moves = {
|
|
|
11319
11321
|
},
|
|
11320
11322
|
onFieldStart(target, source) {
|
|
11321
11323
|
if (source?.hasAbility('persistent')) {
|
|
11322
|
-
this.add('-fieldstart', 'move: Magic Room',
|
|
11324
|
+
this.add('-fieldstart', 'move: Magic Room', `[of] ${source}`, '[persistent]');
|
|
11323
11325
|
}
|
|
11324
11326
|
else {
|
|
11325
|
-
this.add('-fieldstart', 'move: Magic Room',
|
|
11327
|
+
this.add('-fieldstart', 'move: Magic Room', `[of] ${source}`);
|
|
11326
11328
|
}
|
|
11327
11329
|
for (const mon of this.getAllActive()) {
|
|
11328
11330
|
this.singleEvent('End', mon.getItem(), mon.itemState, mon);
|
|
@@ -12272,7 +12274,7 @@ exports.Moves = {
|
|
|
12272
12274
|
flags: { protect: 1, mirror: 1, metronome: 1, failmefirst: 1 },
|
|
12273
12275
|
onTry(source) {
|
|
12274
12276
|
const lastDamagedBy = source.getLastDamagedBy(true);
|
|
12275
|
-
if (
|
|
12277
|
+
if (!lastDamagedBy?.thisTurn)
|
|
12276
12278
|
return false;
|
|
12277
12279
|
},
|
|
12278
12280
|
onModifyTarget(targetRelayVar, source, target, move) {
|
|
@@ -12525,7 +12527,7 @@ exports.Moves = {
|
|
|
12525
12527
|
},
|
|
12526
12528
|
onHit(target, source) {
|
|
12527
12529
|
source.addVolatile('lockon', target);
|
|
12528
|
-
this.add('-activate', source, 'move: Mind Reader',
|
|
12530
|
+
this.add('-activate', source, 'move: Mind Reader', `[of] ${target}`);
|
|
12529
12531
|
},
|
|
12530
12532
|
secondary: null,
|
|
12531
12533
|
target: "normal",
|
|
@@ -12831,7 +12833,7 @@ exports.Moves = {
|
|
|
12831
12833
|
},
|
|
12832
12834
|
onFieldStart(field, source, effect) {
|
|
12833
12835
|
if (effect?.effectType === 'Ability') {
|
|
12834
|
-
this.add('-fieldstart', 'move: Misty Terrain', '[from] ability: ' + effect.name,
|
|
12836
|
+
this.add('-fieldstart', 'move: Misty Terrain', '[from] ability: ' + effect.name, `[of] ${source}`);
|
|
12835
12837
|
}
|
|
12836
12838
|
else {
|
|
12837
12839
|
this.add('-fieldstart', 'move: Misty Terrain');
|
|
@@ -12969,12 +12971,12 @@ exports.Moves = {
|
|
|
12969
12971
|
onAfterHit(target, pokemon, move) {
|
|
12970
12972
|
if (!move.hasSheerForce) {
|
|
12971
12973
|
if (pokemon.hp && pokemon.removeVolatile('leechseed')) {
|
|
12972
|
-
this.add('-end', pokemon, 'Leech Seed', '[from] move: Mortal Spin',
|
|
12974
|
+
this.add('-end', pokemon, 'Leech Seed', '[from] move: Mortal Spin', `[of] ${pokemon}`);
|
|
12973
12975
|
}
|
|
12974
12976
|
const sideConditions = ['spikes', 'toxicspikes', 'stealthrock', 'stickyweb', 'gmaxsteelsurge'];
|
|
12975
12977
|
for (const condition of sideConditions) {
|
|
12976
12978
|
if (pokemon.hp && pokemon.side.removeSideCondition(condition)) {
|
|
12977
|
-
this.add('-sideend', pokemon.side, this.dex.conditions.get(condition).name, '[from] move: Mortal Spin',
|
|
12979
|
+
this.add('-sideend', pokemon.side, this.dex.conditions.get(condition).name, '[from] move: Mortal Spin', `[of] ${pokemon}`);
|
|
12978
12980
|
}
|
|
12979
12981
|
}
|
|
12980
12982
|
if (pokemon.hp && pokemon.volatiles['partiallytrapped']) {
|
|
@@ -12985,12 +12987,12 @@ exports.Moves = {
|
|
|
12985
12987
|
onAfterSubDamage(damage, target, pokemon, move) {
|
|
12986
12988
|
if (!move.hasSheerForce) {
|
|
12987
12989
|
if (pokemon.hp && pokemon.removeVolatile('leechseed')) {
|
|
12988
|
-
this.add('-end', pokemon, 'Leech Seed', '[from] move: Mortal Spin',
|
|
12990
|
+
this.add('-end', pokemon, 'Leech Seed', '[from] move: Mortal Spin', `[of] ${pokemon}`);
|
|
12989
12991
|
}
|
|
12990
12992
|
const sideConditions = ['spikes', 'toxicspikes', 'stealthrock', 'stickyweb', 'gmaxsteelsurge'];
|
|
12991
12993
|
for (const condition of sideConditions) {
|
|
12992
12994
|
if (pokemon.hp && pokemon.side.removeSideCondition(condition)) {
|
|
12993
|
-
this.add('-sideend', pokemon.side, this.dex.conditions.get(condition).name, '[from] move: Mortal Spin',
|
|
12995
|
+
this.add('-sideend', pokemon.side, this.dex.conditions.get(condition).name, '[from] move: Mortal Spin', `[of] ${pokemon}`);
|
|
12994
12996
|
}
|
|
12995
12997
|
}
|
|
12996
12998
|
if (pokemon.hp && pokemon.volatiles['partiallytrapped']) {
|
|
@@ -13093,7 +13095,7 @@ exports.Moves = {
|
|
|
13093
13095
|
condition: {
|
|
13094
13096
|
duration: 5,
|
|
13095
13097
|
onFieldStart(field, source) {
|
|
13096
|
-
this.add('-fieldstart', 'move: Mud Sport',
|
|
13098
|
+
this.add('-fieldstart', 'move: Mud Sport', `[of] ${source}`);
|
|
13097
13099
|
},
|
|
13098
13100
|
onBasePowerPriority: 1,
|
|
13099
13101
|
onBasePower(basePower, attacker, defender, move) {
|
|
@@ -13237,7 +13239,7 @@ exports.Moves = {
|
|
|
13237
13239
|
if (!item.naturalGift)
|
|
13238
13240
|
return false;
|
|
13239
13241
|
move.basePower = item.naturalGift.basePower;
|
|
13240
|
-
this.debug(
|
|
13242
|
+
this.debug(`BP: ${move.basePower}`);
|
|
13241
13243
|
pokemon.setItem('');
|
|
13242
13244
|
pokemon.lastItem = item.id;
|
|
13243
13245
|
pokemon.usedItemThisTurn = true;
|
|
@@ -13634,7 +13636,7 @@ exports.Moves = {
|
|
|
13634
13636
|
volatileStatus: 'octolock',
|
|
13635
13637
|
condition: {
|
|
13636
13638
|
onStart(pokemon, source) {
|
|
13637
|
-
this.add('-start', pokemon, 'move: Octolock',
|
|
13639
|
+
this.add('-start', pokemon, 'move: Octolock', `[of] ${source}`);
|
|
13638
13640
|
},
|
|
13639
13641
|
onResidualOrder: 14,
|
|
13640
13642
|
onResidual(pokemon) {
|
|
@@ -13647,7 +13649,7 @@ exports.Moves = {
|
|
|
13647
13649
|
this.boost({ def: -1, spd: -1 }, pokemon, source, this.dex.getActiveMove('octolock'));
|
|
13648
13650
|
},
|
|
13649
13651
|
onTrapPokemon(pokemon) {
|
|
13650
|
-
if (this.effectState.source
|
|
13652
|
+
if (this.effectState.source?.isActive)
|
|
13651
13653
|
pokemon.tryTrap();
|
|
13652
13654
|
},
|
|
13653
13655
|
},
|
|
@@ -13953,7 +13955,7 @@ exports.Moves = {
|
|
|
13953
13955
|
onResidualOrder: 24,
|
|
13954
13956
|
onResidual(pokemon) {
|
|
13955
13957
|
const duration = pokemon.volatiles['perishsong'].duration;
|
|
13956
|
-
this.add('-start', pokemon,
|
|
13958
|
+
this.add('-start', pokemon, `perish${duration}`);
|
|
13957
13959
|
},
|
|
13958
13960
|
},
|
|
13959
13961
|
secondary: null,
|
|
@@ -14053,7 +14055,7 @@ exports.Moves = {
|
|
|
14053
14055
|
basePower: 0,
|
|
14054
14056
|
basePowerCallback(pokemon) {
|
|
14055
14057
|
const bp = Math.floor((pokemon.happiness * 10) / 25) || 1;
|
|
14056
|
-
this.debug(
|
|
14058
|
+
this.debug(`BP: ${bp}`);
|
|
14057
14059
|
return bp;
|
|
14058
14060
|
},
|
|
14059
14061
|
category: "Special",
|
|
@@ -14149,7 +14151,7 @@ exports.Moves = {
|
|
|
14149
14151
|
onHit(target, source) {
|
|
14150
14152
|
const item = target.getItem();
|
|
14151
14153
|
if (source.hp && item.isBerry && target.takeItem(source)) {
|
|
14152
|
-
this.add('-enditem', target, item.name, '[from] stealeat', '[move] Pluck',
|
|
14154
|
+
this.add('-enditem', target, item.name, '[from] stealeat', '[move] Pluck', `[of] ${source}`);
|
|
14153
14155
|
if (this.singleEvent('Eat', item, null, source, null, null)) {
|
|
14154
14156
|
this.runEvent('EatItem', source, null, null, item);
|
|
14155
14157
|
if (item.id === 'leppaberry')
|
|
@@ -14493,7 +14495,7 @@ exports.Moves = {
|
|
|
14493
14495
|
const newspa = Math.floor((target.storedStats.spa + source.storedStats.spa) / 2);
|
|
14494
14496
|
target.storedStats.spa = newspa;
|
|
14495
14497
|
source.storedStats.spa = newspa;
|
|
14496
|
-
this.add('-activate', source, 'move: Power Split',
|
|
14498
|
+
this.add('-activate', source, 'move: Power Split', `[of] ${target}`);
|
|
14497
14499
|
},
|
|
14498
14500
|
secondary: null,
|
|
14499
14501
|
target: "normal",
|
|
@@ -14575,7 +14577,7 @@ exports.Moves = {
|
|
|
14575
14577
|
basePower: 20,
|
|
14576
14578
|
basePowerCallback(pokemon, target, move) {
|
|
14577
14579
|
const bp = move.basePower + 20 * pokemon.positiveBoosts();
|
|
14578
|
-
this.debug(
|
|
14580
|
+
this.debug(`BP: ${bp}`);
|
|
14579
14581
|
return bp;
|
|
14580
14582
|
},
|
|
14581
14583
|
category: "Physical",
|
|
@@ -14910,7 +14912,7 @@ exports.Moves = {
|
|
|
14910
14912
|
},
|
|
14911
14913
|
onFieldStart(field, source, effect) {
|
|
14912
14914
|
if (effect?.effectType === 'Ability') {
|
|
14913
|
-
this.add('-fieldstart', 'move: Psychic Terrain', '[from] ability: ' + effect.name,
|
|
14915
|
+
this.add('-fieldstart', 'move: Psychic Terrain', '[from] ability: ' + effect.name, `[of] ${source}`);
|
|
14914
14916
|
}
|
|
14915
14917
|
else {
|
|
14916
14918
|
this.add('-fieldstart', 'move: Psychic Terrain');
|
|
@@ -15080,7 +15082,7 @@ exports.Moves = {
|
|
|
15080
15082
|
let power = 60 + 20 * target.positiveBoosts();
|
|
15081
15083
|
if (power > 200)
|
|
15082
15084
|
power = 200;
|
|
15083
|
-
this.debug(
|
|
15085
|
+
this.debug(`BP: ${power}`);
|
|
15084
15086
|
return power;
|
|
15085
15087
|
},
|
|
15086
15088
|
category: "Physical",
|
|
@@ -15491,12 +15493,12 @@ exports.Moves = {
|
|
|
15491
15493
|
onAfterHit(target, pokemon, move) {
|
|
15492
15494
|
if (!move.hasSheerForce) {
|
|
15493
15495
|
if (pokemon.hp && pokemon.removeVolatile('leechseed')) {
|
|
15494
|
-
this.add('-end', pokemon, 'Leech Seed', '[from] move: Rapid Spin',
|
|
15496
|
+
this.add('-end', pokemon, 'Leech Seed', '[from] move: Rapid Spin', `[of] ${pokemon}`);
|
|
15495
15497
|
}
|
|
15496
15498
|
const sideConditions = ['spikes', 'toxicspikes', 'stealthrock', 'stickyweb', 'gmaxsteelsurge'];
|
|
15497
15499
|
for (const condition of sideConditions) {
|
|
15498
15500
|
if (pokemon.hp && pokemon.side.removeSideCondition(condition)) {
|
|
15499
|
-
this.add('-sideend', pokemon.side, this.dex.conditions.get(condition).name, '[from] move: Rapid Spin',
|
|
15501
|
+
this.add('-sideend', pokemon.side, this.dex.conditions.get(condition).name, '[from] move: Rapid Spin', `[of] ${pokemon}`);
|
|
15500
15502
|
}
|
|
15501
15503
|
}
|
|
15502
15504
|
if (pokemon.hp && pokemon.volatiles['partiallytrapped']) {
|
|
@@ -15507,12 +15509,12 @@ exports.Moves = {
|
|
|
15507
15509
|
onAfterSubDamage(damage, target, pokemon, move) {
|
|
15508
15510
|
if (!move.hasSheerForce) {
|
|
15509
15511
|
if (pokemon.hp && pokemon.removeVolatile('leechseed')) {
|
|
15510
|
-
this.add('-end', pokemon, 'Leech Seed', '[from] move: Rapid Spin',
|
|
15512
|
+
this.add('-end', pokemon, 'Leech Seed', '[from] move: Rapid Spin', `[of] ${pokemon}`);
|
|
15511
15513
|
}
|
|
15512
15514
|
const sideConditions = ['spikes', 'toxicspikes', 'stealthrock', 'stickyweb', 'gmaxsteelsurge'];
|
|
15513
15515
|
for (const condition of sideConditions) {
|
|
15514
15516
|
if (pokemon.hp && pokemon.side.removeSideCondition(condition)) {
|
|
15515
|
-
this.add('-sideend', pokemon.side, this.dex.conditions.get(condition).name, '[from] move: Rapid Spin',
|
|
15517
|
+
this.add('-sideend', pokemon.side, this.dex.conditions.get(condition).name, '[from] move: Rapid Spin', `[of] ${pokemon}`);
|
|
15516
15518
|
}
|
|
15517
15519
|
}
|
|
15518
15520
|
if (pokemon.hp && pokemon.volatiles['partiallytrapped']) {
|
|
@@ -15699,7 +15701,7 @@ exports.Moves = {
|
|
|
15699
15701
|
return false;
|
|
15700
15702
|
}
|
|
15701
15703
|
}
|
|
15702
|
-
this.add('-start', source, 'typechange', '[from] move: Reflect Type',
|
|
15704
|
+
this.add('-start', source, 'typechange', '[from] move: Reflect Type', `[of] ${target}`);
|
|
15703
15705
|
source.setType(newBaseTypes);
|
|
15704
15706
|
source.addedType = target.addedType;
|
|
15705
15707
|
source.knownType = target.isAlly(source) && target.knownType;
|
|
@@ -15779,11 +15781,11 @@ exports.Moves = {
|
|
|
15779
15781
|
}
|
|
15780
15782
|
// insomnia and vital spirit checks are separate so that the message is accurate in multi-ability mods
|
|
15781
15783
|
if (source.hasAbility('insomnia')) {
|
|
15782
|
-
this.add('-fail', source, '[from] ability: Insomnia',
|
|
15784
|
+
this.add('-fail', source, '[from] ability: Insomnia', `[of] ${source}`);
|
|
15783
15785
|
return null;
|
|
15784
15786
|
}
|
|
15785
15787
|
if (source.hasAbility('vitalspirit')) {
|
|
15786
|
-
this.add('-fail', source, '[from] ability: Vital Spirit',
|
|
15788
|
+
this.add('-fail', source, '[from] ability: Vital Spirit', `[of] ${source}`);
|
|
15787
15789
|
return null;
|
|
15788
15790
|
}
|
|
15789
15791
|
},
|
|
@@ -15871,7 +15873,7 @@ exports.Moves = {
|
|
|
15871
15873
|
basePowerCallback(pokemon, target, move) {
|
|
15872
15874
|
const damagedByTarget = pokemon.attackedBy.some(p => p.source === target && p.damage > 0 && p.thisTurn);
|
|
15873
15875
|
if (damagedByTarget) {
|
|
15874
|
-
this.debug(
|
|
15876
|
+
this.debug(`BP doubled for getting hit by ${target}`);
|
|
15875
15877
|
return move.basePower * 2;
|
|
15876
15878
|
}
|
|
15877
15879
|
return move.basePower;
|
|
@@ -15912,7 +15914,7 @@ exports.Moves = {
|
|
|
15912
15914
|
else {
|
|
15913
15915
|
bp = 20;
|
|
15914
15916
|
}
|
|
15915
|
-
this.debug(
|
|
15917
|
+
this.debug(`BP: ${bp}`);
|
|
15916
15918
|
return bp;
|
|
15917
15919
|
},
|
|
15918
15920
|
category: "Physical",
|
|
@@ -16166,7 +16168,7 @@ exports.Moves = {
|
|
|
16166
16168
|
onHit(target, source) {
|
|
16167
16169
|
const oldAbility = source.setAbility(target.ability);
|
|
16168
16170
|
if (oldAbility) {
|
|
16169
|
-
this.add('-ability', source, source.getAbility().name, '[from] move: Role Play',
|
|
16171
|
+
this.add('-ability', source, source.getAbility().name, '[from] move: Role Play', `[of] ${target}`);
|
|
16170
16172
|
return;
|
|
16171
16173
|
}
|
|
16172
16174
|
return oldAbility;
|
|
@@ -16203,7 +16205,7 @@ exports.Moves = {
|
|
|
16203
16205
|
let bp = move.basePower;
|
|
16204
16206
|
const rolloutData = pokemon.volatiles['rollout'];
|
|
16205
16207
|
if (rolloutData?.hitCount) {
|
|
16206
|
-
bp *=
|
|
16208
|
+
bp *= 2 ** rolloutData.contactHitCount;
|
|
16207
16209
|
}
|
|
16208
16210
|
if (rolloutData && pokemon.status !== 'slp') {
|
|
16209
16211
|
rolloutData.hitCount++;
|
|
@@ -16215,7 +16217,7 @@ exports.Moves = {
|
|
|
16215
16217
|
if (pokemon.volatiles['defensecurl']) {
|
|
16216
16218
|
bp *= 2;
|
|
16217
16219
|
}
|
|
16218
|
-
this.debug(
|
|
16220
|
+
this.debug(`BP: ${bp}`);
|
|
16219
16221
|
return bp;
|
|
16220
16222
|
},
|
|
16221
16223
|
category: "Physical",
|
|
@@ -17517,17 +17519,17 @@ exports.Moves = {
|
|
|
17517
17519
|
const targetAbility = target.getAbility();
|
|
17518
17520
|
const sourceAbility = source.getAbility();
|
|
17519
17521
|
if (target.isAlly(source)) {
|
|
17520
|
-
this.add('-activate', source, 'move: Skill Swap', '', '',
|
|
17522
|
+
this.add('-activate', source, 'move: Skill Swap', '', '', `[of] ${target}`);
|
|
17521
17523
|
}
|
|
17522
17524
|
else {
|
|
17523
|
-
this.add('-activate', source, 'move: Skill Swap', targetAbility, sourceAbility,
|
|
17525
|
+
this.add('-activate', source, 'move: Skill Swap', targetAbility, sourceAbility, `[of] ${target}`);
|
|
17524
17526
|
}
|
|
17525
17527
|
this.singleEvent('End', sourceAbility, source.abilityState, source);
|
|
17526
17528
|
this.singleEvent('End', targetAbility, target.abilityState, target);
|
|
17527
17529
|
source.ability = targetAbility.id;
|
|
17528
17530
|
target.ability = sourceAbility.id;
|
|
17529
17531
|
source.abilityState = this.initEffectState({ id: this.toID(source.ability), target: source });
|
|
17530
|
-
target.abilityState = this.initEffectState({ id: this.toID(target.ability), target
|
|
17532
|
+
target.abilityState = this.initEffectState({ id: this.toID(target.ability), target });
|
|
17531
17533
|
source.volatileStaleness = undefined;
|
|
17532
17534
|
if (!target.isAlly(source))
|
|
17533
17535
|
target.volatileStaleness = 'external';
|
|
@@ -18085,7 +18087,7 @@ exports.Moves = {
|
|
|
18085
18087
|
return;
|
|
18086
18088
|
}
|
|
18087
18089
|
snatchUser.removeVolatile('snatch');
|
|
18088
|
-
this.add('-activate', snatchUser, 'move: Snatch',
|
|
18090
|
+
this.add('-activate', snatchUser, 'move: Snatch', `[of] ${source}`);
|
|
18089
18091
|
this.actions.useMove(move.id, snatchUser);
|
|
18090
18092
|
return null;
|
|
18091
18093
|
},
|
|
@@ -18405,7 +18407,7 @@ exports.Moves = {
|
|
|
18405
18407
|
const targetSpe = target.storedStats.spe;
|
|
18406
18408
|
target.storedStats.spe = source.storedStats.spe;
|
|
18407
18409
|
source.storedStats.spe = targetSpe;
|
|
18408
|
-
this.add('-activate', source, 'move: Speed Swap',
|
|
18410
|
+
this.add('-activate', source, 'move: Speed Swap', `[of] ${target}`);
|
|
18409
18411
|
},
|
|
18410
18412
|
secondary: null,
|
|
18411
18413
|
target: "normal",
|
|
@@ -18822,7 +18824,7 @@ exports.Moves = {
|
|
|
18822
18824
|
if (pokemon.hasItem('heavydutyboots'))
|
|
18823
18825
|
return;
|
|
18824
18826
|
const typeMod = this.clampIntRange(pokemon.runEffectiveness(this.dex.getActiveMove('stealthrock')), -6, 6);
|
|
18825
|
-
this.damage(pokemon.maxhp *
|
|
18827
|
+
this.damage(pokemon.maxhp * (2 ** typeMod) / 8);
|
|
18826
18828
|
},
|
|
18827
18829
|
},
|
|
18828
18830
|
secondary: null,
|
|
@@ -19127,7 +19129,7 @@ exports.Moves = {
|
|
|
19127
19129
|
basePower: 20,
|
|
19128
19130
|
basePowerCallback(pokemon, target, move) {
|
|
19129
19131
|
const bp = move.basePower + 20 * pokemon.positiveBoosts();
|
|
19130
|
-
this.debug(
|
|
19132
|
+
this.debug(`BP: ${bp}`);
|
|
19131
19133
|
return bp;
|
|
19132
19134
|
},
|
|
19133
19135
|
category: "Special",
|
|
@@ -19723,7 +19725,7 @@ exports.Moves = {
|
|
|
19723
19725
|
source.item = myItem.id;
|
|
19724
19726
|
return false;
|
|
19725
19727
|
}
|
|
19726
|
-
this.add('-activate', source, 'move: Trick',
|
|
19728
|
+
this.add('-activate', source, 'move: Trick', `[of] ${target}`);
|
|
19727
19729
|
if (myItem) {
|
|
19728
19730
|
target.setItem(myItem);
|
|
19729
19731
|
this.add('-item', target, myItem, '[from] move: Switcheroo');
|
|
@@ -20413,8 +20415,8 @@ exports.Moves = {
|
|
|
20413
20415
|
target.item = yourItem.id; // bypass setItem so we don't break choicelock or anything
|
|
20414
20416
|
return;
|
|
20415
20417
|
}
|
|
20416
|
-
this.add('-enditem', target, yourItem, '[silent]', '[from] move: Thief',
|
|
20417
|
-
this.add('-item', source, yourItem, '[from] move: Thief',
|
|
20418
|
+
this.add('-enditem', target, yourItem, '[silent]', '[from] move: Thief', `[of] ${source}`);
|
|
20419
|
+
this.add('-item', source, yourItem, '[from] move: Thief', `[of] ${target}`);
|
|
20418
20420
|
},
|
|
20419
20421
|
secondary: null,
|
|
20420
20422
|
target: "normal",
|
|
@@ -20891,11 +20893,11 @@ exports.Moves = {
|
|
|
20891
20893
|
if (!pokemon.isGrounded())
|
|
20892
20894
|
return;
|
|
20893
20895
|
if (pokemon.hasType('Poison')) {
|
|
20894
|
-
this.add('-sideend', pokemon.side, 'move: Toxic Spikes',
|
|
20896
|
+
this.add('-sideend', pokemon.side, 'move: Toxic Spikes', `[of] ${pokemon}`);
|
|
20895
20897
|
pokemon.side.removeSideCondition('toxicspikes');
|
|
20896
20898
|
}
|
|
20897
20899
|
else if (pokemon.hasType('Steel') || pokemon.hasItem('heavydutyboots')) {
|
|
20898
|
-
|
|
20900
|
+
// do nothing
|
|
20899
20901
|
}
|
|
20900
20902
|
else if (this.effectState.layers >= 2) {
|
|
20901
20903
|
pokemon.trySetStatus('tox', pokemon.side.foe.active[0]);
|
|
@@ -21029,7 +21031,7 @@ exports.Moves = {
|
|
|
21029
21031
|
source.item = myItem.id;
|
|
21030
21032
|
return false;
|
|
21031
21033
|
}
|
|
21032
|
-
this.add('-activate', source, 'move: Trick',
|
|
21034
|
+
this.add('-activate', source, 'move: Trick', `[of] ${target}`);
|
|
21033
21035
|
if (myItem) {
|
|
21034
21036
|
target.setItem(myItem);
|
|
21035
21037
|
this.add('-item', target, myItem, '[from] move: Trick');
|
|
@@ -21102,10 +21104,10 @@ exports.Moves = {
|
|
|
21102
21104
|
},
|
|
21103
21105
|
onFieldStart(target, source) {
|
|
21104
21106
|
if (source?.hasAbility('persistent')) {
|
|
21105
|
-
this.add('-fieldstart', 'move: Trick Room',
|
|
21107
|
+
this.add('-fieldstart', 'move: Trick Room', `[of] ${source}`, '[persistent]');
|
|
21106
21108
|
}
|
|
21107
21109
|
else {
|
|
21108
|
-
this.add('-fieldstart', 'move: Trick Room',
|
|
21110
|
+
this.add('-fieldstart', 'move: Trick Room', `[of] ${source}`);
|
|
21109
21111
|
}
|
|
21110
21112
|
},
|
|
21111
21113
|
onFieldRestart(target, source) {
|
|
@@ -21252,7 +21254,7 @@ exports.Moves = {
|
|
|
21252
21254
|
break;
|
|
21253
21255
|
}
|
|
21254
21256
|
}
|
|
21255
|
-
this.debug(
|
|
21257
|
+
this.debug(`BP: ${bp}`);
|
|
21256
21258
|
return bp;
|
|
21257
21259
|
},
|
|
21258
21260
|
category: "Special",
|
|
@@ -21480,7 +21482,7 @@ exports.Moves = {
|
|
|
21480
21482
|
basePower: 0,
|
|
21481
21483
|
basePowerCallback(pokemon) {
|
|
21482
21484
|
const bp = Math.floor((pokemon.happiness * 10) / 25) || 1;
|
|
21483
|
-
this.debug(
|
|
21485
|
+
this.debug(`BP: ${bp}`);
|
|
21484
21486
|
return bp;
|
|
21485
21487
|
},
|
|
21486
21488
|
category: "Physical",
|
|
@@ -21813,7 +21815,7 @@ exports.Moves = {
|
|
|
21813
21815
|
condition: {
|
|
21814
21816
|
duration: 5,
|
|
21815
21817
|
onFieldStart(field, source) {
|
|
21816
|
-
this.add('-fieldstart', 'move: Water Sport',
|
|
21818
|
+
this.add('-fieldstart', 'move: Water Sport', `[of] ${source}`);
|
|
21817
21819
|
},
|
|
21818
21820
|
onBasePowerPriority: 1,
|
|
21819
21821
|
onBasePower(basePower, attacker, defender, move) {
|
|
@@ -21840,7 +21842,7 @@ exports.Moves = {
|
|
|
21840
21842
|
basePower: 150,
|
|
21841
21843
|
basePowerCallback(pokemon, target, move) {
|
|
21842
21844
|
const bp = move.basePower * pokemon.hp / pokemon.maxhp;
|
|
21843
|
-
this.debug(
|
|
21845
|
+
this.debug(`BP: ${bp}`);
|
|
21844
21846
|
return bp;
|
|
21845
21847
|
},
|
|
21846
21848
|
category: "Special",
|
|
@@ -21913,7 +21915,7 @@ exports.Moves = {
|
|
|
21913
21915
|
move.basePower *= 2;
|
|
21914
21916
|
break;
|
|
21915
21917
|
}
|
|
21916
|
-
this.debug(
|
|
21918
|
+
this.debug(`BP: ${move.basePower}`);
|
|
21917
21919
|
},
|
|
21918
21920
|
secondary: null,
|
|
21919
21921
|
target: "normal",
|
|
@@ -22191,10 +22193,10 @@ exports.Moves = {
|
|
|
22191
22193
|
},
|
|
22192
22194
|
onFieldStart(field, source) {
|
|
22193
22195
|
if (source?.hasAbility('persistent')) {
|
|
22194
|
-
this.add('-fieldstart', 'move: Wonder Room',
|
|
22196
|
+
this.add('-fieldstart', 'move: Wonder Room', `[of] ${source}`, '[persistent]');
|
|
22195
22197
|
}
|
|
22196
22198
|
else {
|
|
22197
|
-
this.add('-fieldstart', 'move: Wonder Room',
|
|
22199
|
+
this.add('-fieldstart', 'move: Wonder Room', `[of] ${source}`);
|
|
22198
22200
|
}
|
|
22199
22201
|
},
|
|
22200
22202
|
onFieldRestart(target, source) {
|
|
@@ -22308,7 +22310,7 @@ exports.Moves = {
|
|
|
22308
22310
|
const hp = target.hp;
|
|
22309
22311
|
const maxHP = target.maxhp;
|
|
22310
22312
|
const bp = Math.floor(Math.floor((120 * (100 * Math.floor(hp * 4096 / maxHP)) + 2048 - 1) / 4096) / 100) || 1;
|
|
22311
|
-
this.debug(
|
|
22313
|
+
this.debug(`BP for ${hp}/${maxHP} HP: ${bp}`);
|
|
22312
22314
|
return bp;
|
|
22313
22315
|
},
|
|
22314
22316
|
category: "Special",
|
|
@@ -22357,7 +22359,7 @@ exports.Moves = {
|
|
|
22357
22359
|
noCopy: true, // doesn't get copied by Baton Pass
|
|
22358
22360
|
duration: 2,
|
|
22359
22361
|
onStart(target, source) {
|
|
22360
|
-
this.add('-start', target, 'move: Yawn',
|
|
22362
|
+
this.add('-start', target, 'move: Yawn', `[of] ${source}`);
|
|
22361
22363
|
},
|
|
22362
22364
|
onResidualOrder: 23,
|
|
22363
22365
|
onEnd(target) {
|