diff --git a/src/items/all-held-items.ts b/src/items/all-held-items.ts index 5d8a234213c..0efe7a7b0a3 100644 --- a/src/items/all-held-items.ts +++ b/src/items/all-held-items.ts @@ -17,9 +17,11 @@ import { BaseStatBoosterHeldItem, permanentStatToHeldItem, } from "./held-items/base-stat-booster"; +import { type BATON_PARAMS, BatonHeldItem } from "./held-items/baton"; import { type BERRY_PARAMS, BerryHeldItem, berryTypeToHeldItem } from "./held-items/berry"; import { type BYPASS_SPEED_CHANCE_PARAMS, BypassSpeedChanceHeldItem } from "./held-items/bypass-speed-chance"; import { type CRIT_BOOST_PARAMS, CritBoostHeldItem, SpeciesCritBoostHeldItem } from "./held-items/crit-booster"; +import { type DAMAGE_MONEY_REWARD_PARAMS, DamageMoneyRewardHeldItem } from "./held-items/damage-money-reward"; import { type EXP_BOOST_PARAMS, ExpBoosterHeldItem } from "./held-items/exp-booster"; import { type FIELD_EFFECT_PARAMS, FieldEffectHeldItem } from "./held-items/field-effect"; import { type FLINCH_CHANCE_PARAMS, FlinchChanceHeldItem } from "./held-items/flinch-chance"; @@ -119,6 +121,8 @@ export function initHeldItems() { allHeldItems[HeldItemId.SOUL_DEW] = new NatureWeightBoosterHeldItem(HeldItemId.SOUL_DEW, 10); allHeldItems[HeldItemId.WIDE_LENS] = new AccuracyBoosterHeldItem(HeldItemId.WIDE_LENS, 3, 5); allHeldItems[HeldItemId.MULTI_LENS] = new MultiHitHeldItem(HeldItemId.MULTI_LENS, 2); + allHeldItems[HeldItemId.GOLDEN_PUNCH] = new DamageMoneyRewardHeldItem(HeldItemId.GOLDEN_PUNCH, 5); + allHeldItems[HeldItemId.BATON] = new BatonHeldItem(HeldItemId.BATON, 1); allHeldItems[HeldItemId.FLAME_ORB] = new TurnEndStatusHeldItem(HeldItemId.FLAME_ORB, 1, StatusEffect.BURN); allHeldItems[HeldItemId.TOXIC_ORB] = new TurnEndStatusHeldItem(HeldItemId.TOXIC_ORB, 1, StatusEffect.TOXIC); @@ -150,6 +154,8 @@ type APPLY_HELD_ITEMS_PARAMS = { [ITEM_EFFECT.NATURE_WEIGHT_BOOSTER]: NATURE_WEIGHT_BOOST_PARAMS; [ITEM_EFFECT.ACCURACY_BOOSTER]: ACCURACY_BOOST_PARAMS; [ITEM_EFFECT.MULTI_HIT]: MULTI_HIT_PARAMS; + [ITEM_EFFECT.DAMAGE_MONEY_REWARD]: DAMAGE_MONEY_REWARD_PARAMS; + [ITEM_EFFECT.BATON]: BATON_PARAMS; }; export function applyHeldItems(effect: T, params: APPLY_HELD_ITEMS_PARAMS[T]) { diff --git a/src/items/held-item.ts b/src/items/held-item.ts index 5c4b39a6b67..01c1210de47 100644 --- a/src/items/held-item.ts +++ b/src/items/held-item.ts @@ -25,6 +25,8 @@ export const ITEM_EFFECT = { NATURE_WEIGHT_BOOSTER: 17, ACCURACY_BOOSTER: 18, MULTI_HIT: 19, + DAMAGE_MONEY_REWARD: 20, + BATON: 21, } as const; export type ITEM_EFFECT = (typeof ITEM_EFFECT)[keyof typeof ITEM_EFFECT]; diff --git a/src/items/held-items/baton.ts b/src/items/held-items/baton.ts new file mode 100644 index 00000000000..f8d5a8106ce --- /dev/null +++ b/src/items/held-items/baton.ts @@ -0,0 +1,22 @@ +import type Pokemon from "#app/field/pokemon"; +import type { NumberHolder } from "#app/utils/common"; +import { HeldItem, ITEM_EFFECT } from "../held-item"; + +export interface BATON_PARAMS { + /** The pokemon with the item */ + pokemon: Pokemon; + /** The amount of exp to gain */ + expAmount: NumberHolder; +} + +export class BatonHeldItem extends HeldItem { + public effects: ITEM_EFFECT[] = [ITEM_EFFECT.BATON]; + + /** + * Applies {@linkcode SwitchEffectTransferModifier} + * @returns always `true` + */ + apply(): boolean { + return true; + } +} diff --git a/src/items/held-items/damage-money-reward.ts b/src/items/held-items/damage-money-reward.ts new file mode 100644 index 00000000000..46b9489f152 --- /dev/null +++ b/src/items/held-items/damage-money-reward.ts @@ -0,0 +1,33 @@ +import type Pokemon from "#app/field/pokemon"; +import { globalScene } from "#app/global-scene"; +import { MoneyMultiplierModifier } from "#app/modifier/modifier"; +import { NumberHolder } from "#app/utils/common"; +import { HeldItem, ITEM_EFFECT } from "../held-item"; + +export interface DAMAGE_MONEY_REWARD_PARAMS { + /** The pokemon with the item */ + pokemon: Pokemon; + /** The amount of exp to gain */ + damage: number; +} + +export class DamageMoneyRewardHeldItem extends HeldItem { + public effects: ITEM_EFFECT[] = [ITEM_EFFECT.DAMAGE_MONEY_REWARD]; + + /** + * Applies {@linkcode DamageMoneyRewardModifier} + * @param pokemon The {@linkcode Pokemon} attacking + * @param multiplier {@linkcode NumberHolder} holding the multiplier value + * @returns always `true` + */ + apply(params: DAMAGE_MONEY_REWARD_PARAMS): boolean { + const pokemon = params.pokemon; + const damage = params.damage; + const stackCount = pokemon.heldItemManager.getStack(this.type); + const moneyAmount = new NumberHolder(Math.floor(damage * (0.5 * stackCount))); + globalScene.applyModifiers(MoneyMultiplierModifier, true, moneyAmount); + globalScene.addMoney(moneyAmount.value); + + return true; + } +} diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts index c51d6a99e2c..ef43d573a22 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -1812,34 +1812,6 @@ export class MoneyMultiplierModifier extends PersistentModifier { } } -export class DamageMoneyRewardModifier extends PokemonHeldItemModifier { - matchType(modifier: Modifier): boolean { - return modifier instanceof DamageMoneyRewardModifier; - } - - clone(): DamageMoneyRewardModifier { - return new DamageMoneyRewardModifier(this.type, this.pokemonId, this.stackCount); - } - - /** - * Applies {@linkcode DamageMoneyRewardModifier} - * @param pokemon The {@linkcode Pokemon} attacking - * @param multiplier {@linkcode NumberHolder} holding the multiplier value - * @returns always `true` - */ - override apply(_pokemon: Pokemon, multiplier: NumberHolder): boolean { - const moneyAmount = new NumberHolder(Math.floor(multiplier.value * (0.5 * this.getStackCount()))); - globalScene.applyModifiers(MoneyMultiplierModifier, true, moneyAmount); - globalScene.addMoney(moneyAmount.value); - - return true; - } - - getMaxHeldItemCount(_pokemon: Pokemon): number { - return 5; - } -} - export class MoneyInterestModifier extends PersistentModifier { match(modifier: Modifier): boolean { return modifier instanceof MoneyInterestModifier; @@ -2035,28 +2007,6 @@ export class BoostBugSpawnModifier extends PersistentModifier { } } -export class SwitchEffectTransferModifier extends PokemonHeldItemModifier { - matchType(modifier: Modifier): boolean { - return modifier instanceof SwitchEffectTransferModifier; - } - - clone(): SwitchEffectTransferModifier { - return new SwitchEffectTransferModifier(this.type, this.pokemonId, this.stackCount); - } - - /** - * Applies {@linkcode SwitchEffectTransferModifier} - * @returns always `true` - */ - override apply(): boolean { - return true; - } - - getMaxHeldItemCount(_pokemon: Pokemon): number { - return 1; - } -} - /** * Abstract class for held items that steal other Pokemon's items. * @see {@linkcode TurnHeldItemTransferModifier} diff --git a/src/phases/move-effect-phase.ts b/src/phases/move-effect-phase.ts index 2563b8d85ee..b5fec79ffee 100644 --- a/src/phases/move-effect-phase.ts +++ b/src/phases/move-effect-phase.ts @@ -54,7 +54,6 @@ import { HitResult, MoveResult } from "#app/field/pokemon"; import { getPokemonNameWithAffix } from "#app/messages"; import { ContactHeldItemTransferChanceModifier, - DamageMoneyRewardModifier, EnemyAttackStatusEffectChanceModifier, EnemyEndureChanceModifier, } from "#app/modifier/modifier"; @@ -887,7 +886,7 @@ export class MoveEffectPhase extends PokemonPhase { }); if (user.isPlayer() && !target.isPlayer()) { - globalScene.applyModifiers(DamageMoneyRewardModifier, true, user, new NumberHolder(damage)); + applyHeldItems(ITEM_EFFECT.DAMAGE_MONEY_REWARD, { pokemon: user, damage: damage }); } return result;