[Move] Fix bug for Spite and fully implement Eerie Spell (#2244)
* Bug fixes for spite, creates class to extend spite for eerie spell * Comments for clarity, creates class to extend ReducePpMoveAttr * Resolve reference error with AttackReducePpMoveAttr * Shows move failed in a clearer way with showMoveText * Localization of pp reduction moves * Fixes issue of eerie spell reducing pp when ratio is 0 * Removes unnecessary phase replacement * Remove partial implementation from eerie spell * Adds locale entry for ppReduced to other languages
This commit is contained in:
parent
2ef376e4df
commit
d5ec5c371b
|
@ -4917,14 +4917,36 @@ export class CopyMoveAttr extends OverrideMoveEffectAttr {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Attribute used for moves that reduce PP of the target's last used move.
|
||||||
|
* Used for Spite.
|
||||||
|
*/
|
||||||
export class ReducePpMoveAttr extends MoveEffectAttr {
|
export class ReducePpMoveAttr extends MoveEffectAttr {
|
||||||
|
protected reduction: number;
|
||||||
|
constructor(reduction: number) {
|
||||||
|
super();
|
||||||
|
this.reduction = reduction;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reduces the PP of the target's last-used move by an amount based on this attribute instance's {@linkcode reduction}.
|
||||||
|
*
|
||||||
|
* @param user {@linkcode Pokemon} that used the attack
|
||||||
|
* @param target {@linkcode Pokemon} targeted by the attack
|
||||||
|
* @param move {@linkcode Move} being used
|
||||||
|
* @param args N/A
|
||||||
|
* @returns {boolean} true
|
||||||
|
*/
|
||||||
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
|
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
|
||||||
// Null checks can be skipped due to condition function
|
// Null checks can be skipped due to condition function
|
||||||
const lastMove = target.getLastXMoves().find(() => true);
|
const lastMove = target.getLastXMoves().find(() => true);
|
||||||
const movesetMove = target.getMoveset().find(m => m.moveId === lastMove.move);
|
const movesetMove = target.getMoveset().find(m => m.moveId === lastMove.move);
|
||||||
const lastPpUsed = movesetMove.ppUsed;
|
const lastPpUsed = movesetMove.ppUsed;
|
||||||
movesetMove.ppUsed = Math.min(movesetMove.ppUsed + 4, movesetMove.getMovePp());
|
movesetMove.ppUsed = Math.min(movesetMove.ppUsed + this.reduction, movesetMove.getMovePp());
|
||||||
user.scene.queueMessage(`It reduced the PP of ${getPokemonMessage(target, `'s\n${movesetMove.getName()} by ${movesetMove.ppUsed - lastPpUsed}!`)}`);
|
|
||||||
|
const message = i18next.t("battle:ppReduced", {targetName: target.name, moveName: movesetMove.getName(), reduction: movesetMove.ppUsed - lastPpUsed});
|
||||||
|
|
||||||
|
user.scene.queueMessage(message);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -4959,6 +4981,42 @@ export class ReducePpMoveAttr extends MoveEffectAttr {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Attribute used for moves that damage target, and then reduce PP of the target's last used move.
|
||||||
|
* Used for Eerie Spell.
|
||||||
|
*/
|
||||||
|
export class AttackReducePpMoveAttr extends ReducePpMoveAttr {
|
||||||
|
constructor(reduction: number) {
|
||||||
|
super(reduction);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if the target has used a move prior to the attack. PP-reduction is applied through the super class if so.
|
||||||
|
*
|
||||||
|
* @param user {@linkcode Pokemon} that used the attack
|
||||||
|
* @param target {@linkcode Pokemon} targeted by the attack
|
||||||
|
* @param move {@linkcode Move} being used
|
||||||
|
* @param args N/A
|
||||||
|
* @returns {boolean} true
|
||||||
|
*/
|
||||||
|
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
|
||||||
|
const lastMove = target.getLastXMoves().find(() => true);
|
||||||
|
if (lastMove) {
|
||||||
|
const movesetMove = target.getMoveset().find(m => m.moveId === lastMove.move);
|
||||||
|
if (Boolean(movesetMove?.getPpRatio())) {
|
||||||
|
super.apply(user, target, move, args);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Override condition function to always perform damage. Instead, perform pp-reduction condition check in apply function above
|
||||||
|
getCondition(): MoveConditionFunc {
|
||||||
|
return (user, target, move) => true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: Review this
|
// TODO: Review this
|
||||||
const targetMoveCopiableCondition: MoveConditionFunc = (user, target, move) => {
|
const targetMoveCopiableCondition: MoveConditionFunc = (user, target, move) => {
|
||||||
const targetMoves = target.getMoveHistory().filter(m => !m.virtual);
|
const targetMoves = target.getMoveHistory().filter(m => !m.virtual);
|
||||||
|
@ -5990,7 +6048,7 @@ export function initMoves() {
|
||||||
new AttackMove(Moves.REVERSAL, Type.FIGHTING, MoveCategory.PHYSICAL, -1, 100, 15, -1, 0, 2)
|
new AttackMove(Moves.REVERSAL, Type.FIGHTING, MoveCategory.PHYSICAL, -1, 100, 15, -1, 0, 2)
|
||||||
.attr(LowHpPowerAttr),
|
.attr(LowHpPowerAttr),
|
||||||
new StatusMove(Moves.SPITE, Type.GHOST, 100, 10, -1, 0, 2)
|
new StatusMove(Moves.SPITE, Type.GHOST, 100, 10, -1, 0, 2)
|
||||||
.attr(ReducePpMoveAttr),
|
.attr(ReducePpMoveAttr, 4),
|
||||||
new AttackMove(Moves.POWDER_SNOW, Type.ICE, MoveCategory.SPECIAL, 40, 100, 25, 10, 0, 2)
|
new AttackMove(Moves.POWDER_SNOW, Type.ICE, MoveCategory.SPECIAL, 40, 100, 25, 10, 0, 2)
|
||||||
.attr(StatusEffectAttr, StatusEffect.FREEZE)
|
.attr(StatusEffectAttr, StatusEffect.FREEZE)
|
||||||
.target(MoveTarget.ALL_NEAR_ENEMIES),
|
.target(MoveTarget.ALL_NEAR_ENEMIES),
|
||||||
|
@ -7856,8 +7914,8 @@ export function initMoves() {
|
||||||
new AttackMove(Moves.ASTRAL_BARRAGE, Type.GHOST, MoveCategory.SPECIAL, 120, 100, 5, -1, 0, 8)
|
new AttackMove(Moves.ASTRAL_BARRAGE, Type.GHOST, MoveCategory.SPECIAL, 120, 100, 5, -1, 0, 8)
|
||||||
.target(MoveTarget.ALL_NEAR_ENEMIES),
|
.target(MoveTarget.ALL_NEAR_ENEMIES),
|
||||||
new AttackMove(Moves.EERIE_SPELL, Type.PSYCHIC, MoveCategory.SPECIAL, 80, 100, 5, 100, 0, 8)
|
new AttackMove(Moves.EERIE_SPELL, Type.PSYCHIC, MoveCategory.SPECIAL, 80, 100, 5, 100, 0, 8)
|
||||||
.soundBased()
|
.attr(AttackReducePpMoveAttr, 3)
|
||||||
.partial(),
|
.soundBased(),
|
||||||
new AttackMove(Moves.DIRE_CLAW, Type.POISON, MoveCategory.PHYSICAL, 80, 100, 15, 50, 0, 8)
|
new AttackMove(Moves.DIRE_CLAW, Type.POISON, MoveCategory.PHYSICAL, 80, 100, 15, 50, 0, 8)
|
||||||
.attr(MultiStatusEffectAttr, [StatusEffect.POISON, StatusEffect.PARALYSIS, StatusEffect.SLEEP]),
|
.attr(MultiStatusEffectAttr, [StatusEffect.POISON, StatusEffect.PARALYSIS, StatusEffect.SLEEP]),
|
||||||
new AttackMove(Moves.PSYSHIELD_BASH, Type.PSYCHIC, MoveCategory.PHYSICAL, 70, 90, 10, 100, 0, 8)
|
new AttackMove(Moves.PSYSHIELD_BASH, Type.PSYCHIC, MoveCategory.PHYSICAL, 70, 90, 10, 100, 0, 8)
|
||||||
|
|
|
@ -70,4 +70,5 @@ export const battle: SimpleTranslationEntries = {
|
||||||
"statHarshlyFell": "sinkt stark",
|
"statHarshlyFell": "sinkt stark",
|
||||||
"statSeverelyFell": "sinkt drastisch",
|
"statSeverelyFell": "sinkt drastisch",
|
||||||
"statWontGoAnyLower": "kann nicht weiter sinken",
|
"statWontGoAnyLower": "kann nicht weiter sinken",
|
||||||
|
"ppReduced": "It reduced the PP of {{targetName}}'s\n{{moveName}} by {{reduction}}!",
|
||||||
} as const;
|
} as const;
|
||||||
|
|
|
@ -70,4 +70,5 @@ export const battle: SimpleTranslationEntries = {
|
||||||
"statHarshlyFell": "harshly fell",
|
"statHarshlyFell": "harshly fell",
|
||||||
"statSeverelyFell": "severely fell",
|
"statSeverelyFell": "severely fell",
|
||||||
"statWontGoAnyLower": "won't go any lower",
|
"statWontGoAnyLower": "won't go any lower",
|
||||||
|
"ppReduced": "It reduced the PP of {{targetName}}'s\n{{moveName}} by {{reduction}}!",
|
||||||
} as const;
|
} as const;
|
||||||
|
|
|
@ -70,4 +70,5 @@ export const battle: SimpleTranslationEntries = {
|
||||||
"statHarshlyFell": "harshly fell",
|
"statHarshlyFell": "harshly fell",
|
||||||
"statSeverelyFell": "severely fell",
|
"statSeverelyFell": "severely fell",
|
||||||
"statWontGoAnyLower": "won't go any lower",
|
"statWontGoAnyLower": "won't go any lower",
|
||||||
|
"ppReduced": "It reduced the PP of {{targetName}}'s\n{{moveName}} by {{reduction}}!",
|
||||||
} as const;
|
} as const;
|
||||||
|
|
|
@ -70,4 +70,5 @@ export const battle: SimpleTranslationEntries = {
|
||||||
"statHarshlyFell": "harshly fell",
|
"statHarshlyFell": "harshly fell",
|
||||||
"statSeverelyFell": "severely fell",
|
"statSeverelyFell": "severely fell",
|
||||||
"statWontGoAnyLower": "won't go any lower",
|
"statWontGoAnyLower": "won't go any lower",
|
||||||
|
"ppReduced": "It reduced the PP of {{targetName}}'s\n{{moveName}} by {{reduction}}!",
|
||||||
} as const;
|
} as const;
|
||||||
|
|
|
@ -70,4 +70,5 @@ export const battle: SimpleTranslationEntries = {
|
||||||
"statHarshlyFell": "harshly fell",
|
"statHarshlyFell": "harshly fell",
|
||||||
"statSeverelyFell": "severely fell",
|
"statSeverelyFell": "severely fell",
|
||||||
"statWontGoAnyLower": "won't go any lower",
|
"statWontGoAnyLower": "won't go any lower",
|
||||||
|
"ppReduced": "It reduced the PP of {{targetName}}'s\n{{moveName}} by {{reduction}}!",
|
||||||
} as const;
|
} as const;
|
||||||
|
|
|
@ -70,4 +70,5 @@ export const battle: SimpleTranslationEntries = {
|
||||||
"statHarshlyFell": "[[가]] 크게 떨어졌다!",
|
"statHarshlyFell": "[[가]] 크게 떨어졌다!",
|
||||||
"statSeverelyFell": "[[가]] 매우 크게 떨어졌다!",
|
"statSeverelyFell": "[[가]] 매우 크게 떨어졌다!",
|
||||||
"statWontGoAnyLower": "[[는]] 더 떨어지지 않는다!",
|
"statWontGoAnyLower": "[[는]] 더 떨어지지 않는다!",
|
||||||
|
"ppReduced": "It reduced the PP of {{targetName}}'s\n{{moveName}} by {{reduction}}!",
|
||||||
} as const;
|
} as const;
|
||||||
|
|
|
@ -70,4 +70,5 @@ export const battle: SimpleTranslationEntries = {
|
||||||
"statHarshlyFell": "diminuiu duramente",
|
"statHarshlyFell": "diminuiu duramente",
|
||||||
"statSeverelyFell": "diminuiu severamente",
|
"statSeverelyFell": "diminuiu severamente",
|
||||||
"statWontGoAnyLower": "não vai mais diminuir",
|
"statWontGoAnyLower": "não vai mais diminuir",
|
||||||
|
"ppReduced": "It reduced the PP of {{targetName}}'s\n{{moveName}} by {{reduction}}!",
|
||||||
} as const;
|
} as const;
|
||||||
|
|
|
@ -70,4 +70,5 @@ export const battle: SimpleTranslationEntries = {
|
||||||
"statHarshlyFell": "大幅降低了!",
|
"statHarshlyFell": "大幅降低了!",
|
||||||
"statSeverelyFell": "极大幅降低了!",
|
"statSeverelyFell": "极大幅降低了!",
|
||||||
"statWontGoAnyLower": "已经无法再降低了!",
|
"statWontGoAnyLower": "已经无法再降低了!",
|
||||||
|
"ppReduced": "It reduced the PP of {{targetName}}'s\n{{moveName}} by {{reduction}}!",
|
||||||
} as const;
|
} as const;
|
||||||
|
|
|
@ -67,4 +67,5 @@ export const battle: SimpleTranslationEntries = {
|
||||||
"statHarshlyFell": "harshly fell",
|
"statHarshlyFell": "harshly fell",
|
||||||
"statSeverelyFell": "severely fell",
|
"statSeverelyFell": "severely fell",
|
||||||
"statWontGoAnyLower": "won't go any lower",
|
"statWontGoAnyLower": "won't go any lower",
|
||||||
|
"ppReduced": "It reduced the PP of {{targetName}}'s\n{{moveName}} by {{reduction}}!",
|
||||||
} as const;
|
} as const;
|
||||||
|
|
|
@ -2581,6 +2581,11 @@ export class MovePhase extends BattlePhase {
|
||||||
if (this.move.moveId && this.pokemon.summonData?.disabledMove === this.move.moveId) {
|
if (this.move.moveId && this.pokemon.summonData?.disabledMove === this.move.moveId) {
|
||||||
this.scene.queueMessage(`${this.move.getName()} is disabled!`);
|
this.scene.queueMessage(`${this.move.getName()} is disabled!`);
|
||||||
}
|
}
|
||||||
|
if (this.move.ppUsed >= this.move.getMovePp()) { // if the move PP was reduced from Spite or otherwise, the move fails
|
||||||
|
this.fail();
|
||||||
|
this.showMoveText();
|
||||||
|
this.showFailedText();
|
||||||
|
}
|
||||||
return this.end();
|
return this.end();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue