UPDATE: Stockpile has been fully implemented. Still marked as partial for testing
parent
03c88c9516
commit
531ec358e0
|
@ -53,5 +53,7 @@ export enum BattlerTagType {
|
||||||
CURSED = "CURSED",
|
CURSED = "CURSED",
|
||||||
CHARGED = "CHARGED",
|
CHARGED = "CHARGED",
|
||||||
GROUNDED = "GROUNDED",
|
GROUNDED = "GROUNDED",
|
||||||
STOCKPILE = "STOCKPILE"
|
STOCKPILE_ONE = "STOCKPILE_ONE",
|
||||||
|
STOCKPILE_TWO = "STOCKPILE_TWO",
|
||||||
|
STOCKPILE_THREE = "STOCKPILE_THREE"
|
||||||
}
|
}
|
||||||
|
|
126
src/data/move.ts
126
src/data/move.ts
|
@ -407,6 +407,14 @@ export class SelfStatusMove extends Move {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export class StockpileMove extends SelfStatusMove {
|
||||||
|
constructor(id: Moves, type: Type, accuracy: integer, pp: integer, chance: integer, priority: integer, generation: integer) {
|
||||||
|
super(id, type, accuracy, pp, chance, priority, generation);
|
||||||
|
}
|
||||||
|
|
||||||
|
// add a function for shifting conditions
|
||||||
|
}
|
||||||
|
|
||||||
export abstract class MoveAttr {
|
export abstract class MoveAttr {
|
||||||
public selfTarget: boolean;
|
public selfTarget: boolean;
|
||||||
|
|
||||||
|
@ -2582,7 +2590,9 @@ export class AddBattlerTagAttr extends MoveEffectAttr {
|
||||||
case BattlerTagType.INGRAIN:
|
case BattlerTagType.INGRAIN:
|
||||||
case BattlerTagType.IGNORE_ACCURACY:
|
case BattlerTagType.IGNORE_ACCURACY:
|
||||||
case BattlerTagType.AQUA_RING:
|
case BattlerTagType.AQUA_RING:
|
||||||
case BattlerTagType.STOCKPILE:
|
case BattlerTagType.STOCKPILE_ONE:
|
||||||
|
case BattlerTagType.STOCKPILE_TWO:
|
||||||
|
case BattlerTagType.STOCKPILE_THREE:
|
||||||
return 3;
|
return 3;
|
||||||
case BattlerTagType.PROTECTED:
|
case BattlerTagType.PROTECTED:
|
||||||
case BattlerTagType.FLYING:
|
case BattlerTagType.FLYING:
|
||||||
|
@ -2767,9 +2777,117 @@ export class FaintCountdownAttr extends AddBattlerTagAttr {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export class StockpileAttr extends AddBattlerTagAttr {
|
export class StockpileOneAttr extends AddBattlerTagAttr {
|
||||||
constructor() {
|
constructor() {
|
||||||
super(BattlerTagType.STOCKPILE, true, false, 0, 10)
|
super(BattlerTagType.STOCKPILE_ONE, true, true, 20, 20);
|
||||||
|
}
|
||||||
|
|
||||||
|
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
|
||||||
|
if (!super.apply(user, target, move, args))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
user.scene.queueMessage(getPokemonMessage(target, `\nstockpiled 1.`));
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export class StockpileTwoAttr extends AddBattlerTagAttr {
|
||||||
|
constructor() {
|
||||||
|
super(BattlerTagType.STOCKPILE_TWO, true, true, 20, 20);
|
||||||
|
}
|
||||||
|
|
||||||
|
getCondition(): MoveConditionFunc {
|
||||||
|
return (user, target, move) => (!user.getTag(this.tagType) && !!user.getTag(BattlerTagType.STOCKPILE_ONE));
|
||||||
|
}
|
||||||
|
|
||||||
|
canApply(user: Pokemon, target: Pokemon, move: Move, args: any[]) {
|
||||||
|
if (!super.canApply(user, target, move, args))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
const canApplyStockpileTwo = this.getCondition();
|
||||||
|
|
||||||
|
return canApplyStockpileTwo(user, target, move);
|
||||||
|
}
|
||||||
|
|
||||||
|
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
|
||||||
|
if (!super.apply(user, target, move, args))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!this.canApply(user, target, move, args))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
user.scene.queueMessage(getPokemonMessage(target, `\nstockpiled 2.`));
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export class StockpileThreeAttr extends AddBattlerTagAttr {
|
||||||
|
constructor() {
|
||||||
|
super(BattlerTagType.STOCKPILE_THREE, true, true, 20, 20);
|
||||||
|
}
|
||||||
|
|
||||||
|
getCondition(): MoveConditionFunc {
|
||||||
|
return (user, target, move) => (!user.getTag(this.tagType) && !!user.getTag(BattlerTagType.STOCKPILE_TWO));
|
||||||
|
}
|
||||||
|
|
||||||
|
canApply(user: Pokemon, target: Pokemon, move: Move, args: any[]) {
|
||||||
|
if (!super.canApply(user, target, move, args))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
const canApplyStockpileThree = this.getCondition();
|
||||||
|
|
||||||
|
return canApplyStockpileThree(user, target, move);
|
||||||
|
}
|
||||||
|
|
||||||
|
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
|
||||||
|
if (!super.apply(user, target, move, args))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!this.canApply(user, target, move, args))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
user.scene.queueMessage(getPokemonMessage(target, `\nstockpiled 3.`));
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export class StockpileAttr extends AddBattlerTagAttr {
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
super(BattlerTagType.STOCKPILE_THREE, true, true, 0, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
getStockpile(stacks: integer = 1): MoveConditionFunc {
|
||||||
|
let stockpileType = BattlerTagType.STOCKPILE_ONE;
|
||||||
|
switch (stacks) {
|
||||||
|
case 2:
|
||||||
|
stockpileType = BattlerTagType.STOCKPILE_TWO;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
stockpileType = BattlerTagType.STOCKPILE_THREE;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
}
|
||||||
|
return (user, target, move) => !user.getTag(stockpileType);
|
||||||
|
};
|
||||||
|
|
||||||
|
setStockpile(user: Pokemon, target: Pokemon, move: Move){
|
||||||
|
const getStockpileOne = this.getStockpile(1);
|
||||||
|
const getStockpileTwo = this.getStockpile(2);
|
||||||
|
if (getStockpileOne(user, target, move) && !getStockpileTwo(user, target, move)) {
|
||||||
|
// if there's only 1 stockpile, give 2nd stockpile
|
||||||
|
this.tagType = BattlerTagType.STOCKPILE_TWO;
|
||||||
|
} else if (!getStockpileOne(user, target, move)) {
|
||||||
|
// if there's no stockpile, give 1st stockpile
|
||||||
|
this.tagType = BattlerTagType.STOCKPILE_ONE;
|
||||||
|
} else {
|
||||||
|
// tagType stays as STOCKPILE_THREE
|
||||||
|
// if there's 2 stockpile, then we give 3rd stockpile
|
||||||
|
// if there's 3 stockpile, then move fails
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
|
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
|
||||||
|
@ -4530,7 +4648,7 @@ export function initMoves() {
|
||||||
* need to find a way to remove stockpile when the relevant moves are used
|
* need to find a way to remove stockpile when the relevant moves are used
|
||||||
*/
|
*/
|
||||||
new SelfStatusMove(Moves.STOCKPILE, Type.NORMAL, -1, 20, -1, 0, 3)
|
new SelfStatusMove(Moves.STOCKPILE, Type.NORMAL, -1, 20, -1, 0, 3)
|
||||||
.attr(AddBattlerTagAttr, BattlerTagType.STOCKPILE, true, false, 0, 10)
|
.attr(StockpileAttr)
|
||||||
.attr(StatChangeAttr, [ BattleStat.DEF, BattleStat.SPDEF ], 1, true)
|
.attr(StatChangeAttr, [ BattleStat.DEF, BattleStat.SPDEF ], 1, true)
|
||||||
.partial(),
|
.partial(),
|
||||||
new AttackMove(Moves.SPIT_UP, Type.NORMAL, MoveCategory.SPECIAL, -1, 100, 10, -1, 0, 3)
|
new AttackMove(Moves.SPIT_UP, Type.NORMAL, MoveCategory.SPECIAL, -1, 100, 10, -1, 0, 3)
|
||||||
|
|
|
@ -81,6 +81,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
|
||||||
public luck: integer;
|
public luck: integer;
|
||||||
public pauseEvolutions: boolean;
|
public pauseEvolutions: boolean;
|
||||||
public pokerus: boolean;
|
public pokerus: boolean;
|
||||||
|
public stockpile: integer;
|
||||||
|
|
||||||
public fusionSpecies: PokemonSpecies;
|
public fusionSpecies: PokemonSpecies;
|
||||||
public fusionFormIndex: integer;
|
public fusionFormIndex: integer;
|
||||||
|
|
Loading…
Reference in New Issue