diff --git a/src/data/enums/battler-tag-type.ts b/src/data/enums/battler-tag-type.ts index 2e94e5b77..b20febe57 100644 --- a/src/data/enums/battler-tag-type.ts +++ b/src/data/enums/battler-tag-type.ts @@ -53,5 +53,7 @@ export enum BattlerTagType { CURSED = "CURSED", CHARGED = "CHARGED", GROUNDED = "GROUNDED", - STOCKPILE = "STOCKPILE" + STOCKPILE_ONE = "STOCKPILE_ONE", + STOCKPILE_TWO = "STOCKPILE_TWO", + STOCKPILE_THREE = "STOCKPILE_THREE" } diff --git a/src/data/move.ts b/src/data/move.ts index ee14a0df8..977e7540f 100644 --- a/src/data/move.ts +++ b/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 { public selfTarget: boolean; @@ -2582,7 +2590,9 @@ export class AddBattlerTagAttr extends MoveEffectAttr { case BattlerTagType.INGRAIN: case BattlerTagType.IGNORE_ACCURACY: case BattlerTagType.AQUA_RING: - case BattlerTagType.STOCKPILE: + case BattlerTagType.STOCKPILE_ONE: + case BattlerTagType.STOCKPILE_TWO: + case BattlerTagType.STOCKPILE_THREE: return 3; case BattlerTagType.PROTECTED: case BattlerTagType.FLYING: @@ -2767,9 +2777,117 @@ export class FaintCountdownAttr extends AddBattlerTagAttr { } } -export class StockpileAttr extends AddBattlerTagAttr { +export class StockpileOneAttr extends AddBattlerTagAttr { 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 { @@ -4530,7 +4648,7 @@ export function initMoves() { * 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) - .attr(AddBattlerTagAttr, BattlerTagType.STOCKPILE, true, false, 0, 10) + .attr(StockpileAttr) .attr(StatChangeAttr, [ BattleStat.DEF, BattleStat.SPDEF ], 1, true) .partial(), new AttackMove(Moves.SPIT_UP, Type.NORMAL, MoveCategory.SPECIAL, -1, 100, 10, -1, 0, 3) diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index a966a2430..fa7334f88 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -81,6 +81,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { public luck: integer; public pauseEvolutions: boolean; public pokerus: boolean; + public stockpile: integer; public fusionSpecies: PokemonSpecies; public fusionFormIndex: integer;