Refactors other attributes to extend CallMoveAttr
This commit is contained in:
parent
70dcc75a7c
commit
fbb2a44c92
|
@ -5281,13 +5281,13 @@ export class FirstMoveTypeAttr extends MoveEffectAttr {
|
||||||
}
|
}
|
||||||
|
|
||||||
export class CallMoveAttr extends OverrideMoveEffectAttr {
|
export class CallMoveAttr extends OverrideMoveEffectAttr {
|
||||||
private moveId: number;
|
protected invalidMoves: Moves[];
|
||||||
constructor() {
|
constructor() {
|
||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
async apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise<boolean> {
|
async apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise<boolean> {
|
||||||
const replaceMoveTarget = allMoves[this.moveId].moveTarget === MoveTarget.NEAR_OTHER ? MoveTarget.NEAR_ENEMY : undefined;
|
const replaceMoveTarget = move.moveTarget === MoveTarget.NEAR_OTHER ? MoveTarget.NEAR_ENEMY : undefined;
|
||||||
const moveTargets = getMoveTargets(user, this.moveId, replaceMoveTarget);
|
const moveTargets = getMoveTargets(user, move.id, replaceMoveTarget);
|
||||||
if (moveTargets.targets.length === 0) {
|
if (moveTargets.targets.length === 0) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -5296,52 +5296,26 @@ export class CallMoveAttr extends OverrideMoveEffectAttr {
|
||||||
: moveTargets.targets.indexOf(target.getBattlerIndex()) > -1
|
: moveTargets.targets.indexOf(target.getBattlerIndex()) > -1
|
||||||
? [ target.getBattlerIndex() ]
|
? [ target.getBattlerIndex() ]
|
||||||
: [ moveTargets.targets[user.randSeedInt(moveTargets.targets.length)] ];
|
: [ moveTargets.targets[user.randSeedInt(moveTargets.targets.length)] ];
|
||||||
user.getMoveQueue().push({ move: this.moveId, targets: targets, ignorePP: true });
|
user.getMoveQueue().push({ move: move.id, targets: targets, ignorePP: true });
|
||||||
user.scene.unshiftPhase(new MovePhase(user.scene, user, targets, new PokemonMove(this.moveId, 0, 0, true), true));
|
user.scene.unshiftPhase(new MovePhase(user.scene, user, targets, new PokemonMove(move.id, 0, 0, true), true));
|
||||||
|
|
||||||
const promises: Promise<void>[] = [];
|
await Promise.resolve(initMoveAnim(user.scene, move.id).then(() => {
|
||||||
promises.push(initMoveAnim(user.scene, this.moveId));
|
loadMoveAnimAssets(user.scene, [ move.id ], true);
|
||||||
promises.push(loadMoveAnimAssets(user.scene, [ this.moveId ], true));
|
}));
|
||||||
|
|
||||||
await Promise.all(promises);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function callMove(user: Pokemon, target: Pokemon, moveId: number): Promise<boolean> {
|
|
||||||
return new Promise(resolve => {
|
|
||||||
// replaces MoveTarget.NEAR_OTHER with MoveTarget.NEAR_ENEMY to prevent ally being targetted
|
|
||||||
const replaceMoveTarget = allMoves[moveId].moveTarget === MoveTarget.NEAR_OTHER ? MoveTarget.NEAR_ENEMY : undefined;
|
|
||||||
const moveTargets = getMoveTargets(user, moveId, replaceMoveTarget);
|
|
||||||
if (moveTargets.targets.length === 0) {
|
|
||||||
resolve(false);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const targets = moveTargets.multiple || moveTargets.targets.length === 1
|
|
||||||
? moveTargets.targets
|
|
||||||
: moveTargets.targets.indexOf(target.getBattlerIndex()) > -1
|
|
||||||
? [ target.getBattlerIndex() ]
|
|
||||||
: [ moveTargets.targets[user.randSeedInt(moveTargets.targets.length)] ];
|
|
||||||
user.getMoveQueue().push({ move: moveId, targets: targets, ignorePP: true });
|
|
||||||
user.scene.unshiftPhase(new MovePhase(user.scene, user, targets, new PokemonMove(moveId, 0, 0, true), true));
|
|
||||||
initMoveAnim(user.scene, moveId).then(() => {
|
|
||||||
loadMoveAnimAssets(user.scene, [ moveId ], true)
|
|
||||||
.then(() => resolve(true));
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Attribute used to call a random move
|
* Attribute used to call a random move
|
||||||
* Used for {@linkcode Moves.METRONOME}
|
* Used for {@linkcode Moves.METRONOME}
|
||||||
* @see {@linkcode apply} for move selection and move call
|
* @see {@linkcode apply} for move selection and move call
|
||||||
* @extends OverrideMoveEffectAttr
|
* @extends OverrideMoveEffectAttr
|
||||||
*/
|
*/
|
||||||
export class RandomMoveAttr extends OverrideMoveEffectAttr {
|
export class RandomMoveAttr extends CallMoveAttr {
|
||||||
protected invalidMoves: Moves[];
|
|
||||||
constructor(invalidMoves: Moves[]) {
|
constructor(invalidMoves: Moves[]) {
|
||||||
super();
|
super();
|
||||||
this.invalidMoves = invalidMoves!;
|
this.invalidMoves = invalidMoves;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -5356,7 +5330,7 @@ export class RandomMoveAttr extends OverrideMoveEffectAttr {
|
||||||
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise<boolean> {
|
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise<boolean> {
|
||||||
const moveIds = Utils.getEnumValues(Moves).filter(m => !this.invalidMoves.includes(m) && !allMoves[m].name.endsWith(" (N)"));
|
const moveIds = Utils.getEnumValues(Moves).filter(m => !this.invalidMoves.includes(m) && !allMoves[m].name.endsWith(" (N)"));
|
||||||
const moveId = moveIds[user.randSeedInt(moveIds.length)];
|
const moveId = moveIds[user.randSeedInt(moveIds.length)];
|
||||||
return callMove(user, target, moveId);
|
return super.apply(user, target, allMoves[moveId], args);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5368,12 +5342,13 @@ export class RandomMoveAttr extends OverrideMoveEffectAttr {
|
||||||
* Fails if the user has no callable moves
|
* Fails if the user has no callable moves
|
||||||
* Invalid moves are indicated by what is passed in to invalidMoves: {@constant invalidAssistMoves} or {@constant invalidSleepTalkMoves}
|
* Invalid moves are indicated by what is passed in to invalidMoves: {@constant invalidAssistMoves} or {@constant invalidSleepTalkMoves}
|
||||||
*/
|
*/
|
||||||
export class RandomMovesetMoveAttr extends RandomMoveAttr {
|
export class RandomMovesetMoveAttr extends CallMoveAttr {
|
||||||
private includeParty: boolean;
|
private includeParty: boolean;
|
||||||
private moveId: number;
|
private moveId: number;
|
||||||
constructor(invalidMoves: Moves[], includeParty: boolean = false) {
|
constructor(invalidMoves: Moves[], includeParty: boolean = false) {
|
||||||
super(invalidMoves);
|
super();
|
||||||
this.includeParty = includeParty;
|
this.includeParty = includeParty;
|
||||||
|
this.invalidMoves = invalidMoves;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -5385,7 +5360,7 @@ export class RandomMovesetMoveAttr extends RandomMoveAttr {
|
||||||
* @returns {Promise<boolean>}
|
* @returns {Promise<boolean>}
|
||||||
*/
|
*/
|
||||||
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise<boolean> {
|
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise<boolean> {
|
||||||
return callMove(user, target, this.moveId);
|
return super.apply(user, target, allMoves[this.moveId], args);
|
||||||
}
|
}
|
||||||
|
|
||||||
getCondition(): MoveConditionFunc {
|
getCondition(): MoveConditionFunc {
|
||||||
|
@ -5798,10 +5773,10 @@ const lastMoveCopiableCondition: MoveConditionFunc = (user, target, move) => {
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
export class CopyMoveAttr extends OverrideMoveEffectAttr {
|
export class CopyMoveAttr extends CallMoveAttr {
|
||||||
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise<boolean> {
|
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise<boolean> {
|
||||||
const lastMove = user.scene.currentBattle.lastMove;
|
const lastMove = user.scene.currentBattle.lastMove;
|
||||||
return callMove(user, target, lastMove);
|
return super.apply(user, target, allMoves[lastMove], args);
|
||||||
}
|
}
|
||||||
|
|
||||||
getCondition(): MoveConditionFunc {
|
getCondition(): MoveConditionFunc {
|
||||||
|
|
Loading…
Reference in New Issue