diff --git a/src/enums/held-items.ts b/src/enums/held-item-id.ts similarity index 89% rename from src/enums/held-items.ts rename to src/enums/held-item-id.ts index 727dc4f7f0e..1a27a73d9fe 100644 --- a/src/enums/held-items.ts +++ b/src/enums/held-item-id.ts @@ -1,4 +1,4 @@ -export const HeldItems = { +export const HeldItemId = { NONE: 0x0000, // Berries @@ -84,13 +84,13 @@ export const HeldItems = { CARBOS: 0x0906, }; -export type HeldItems = (typeof HeldItems)[keyof typeof HeldItems]; +export type HeldItemId = (typeof HeldItemId)[keyof typeof HeldItemId]; -type HeldItemName = keyof typeof HeldItems; -type HeldItemValue = typeof HeldItems[HeldItemName]; +type HeldItemName = keyof typeof HeldItemId; +type HeldItemValue = typeof HeldItemId[HeldItemName]; // Use a type-safe reducer to force number keys and values -export const HeldItemNames: Record = Object.entries(HeldItems).reduce( +export const HeldItemNames: Record = Object.entries(HeldItemId).reduce( (acc, [key, value]) => { acc[value as HeldItemValue] = key as HeldItemName; return acc; diff --git a/src/field/pokemon-held-item-manager.ts b/src/field/pokemon-held-item-manager.ts index 52eabc9b50a..9c6c02a92ee 100644 --- a/src/field/pokemon-held-item-manager.ts +++ b/src/field/pokemon-held-item-manager.ts @@ -1,5 +1,5 @@ import { allHeldItems } from "#app/items/all-held-items"; -import type { HeldItems } from "#app/enums/held-items"; +import type { HeldItemId } from "#app/enums/held-item-id"; interface HeldItemProperties { stack: number; @@ -8,7 +8,7 @@ interface HeldItemProperties { } type HeldItemPropertyMap = { - [key in HeldItems]: HeldItemProperties; + [key in HeldItemId]: HeldItemProperties; }; export class PokemonItemManager { @@ -22,20 +22,20 @@ export class PokemonItemManager { return Object.keys(this.heldItems).map(k => Number(k)); } - hasItem(itemType: HeldItems): boolean { + hasItem(itemType: HeldItemId): boolean { return itemType in this.heldItems; } - getItem(itemType: HeldItems): HeldItemProperties { + getItem(itemType: HeldItemId): HeldItemProperties { // TODO: Not very safe return this.heldItems[itemType]; } - getStack(itemType: HeldItems): number { + getStack(itemType: HeldItemId): number { return itemType in this.heldItems ? this.heldItems[itemType].stack : 0; } - add(itemType: HeldItems, addStack = 1) { + add(itemType: HeldItemId, addStack = 1) { const maxStack = allHeldItems[itemType].getMaxStackCount(); if (this.hasItem(itemType)) { @@ -46,7 +46,7 @@ export class PokemonItemManager { } } - remove(itemType: HeldItems, removeStack = 1) { + remove(itemType: HeldItemId, removeStack = 1) { this.heldItems[itemType].stack -= removeStack; if (this.heldItems[itemType].stack <= 0) { diff --git a/src/items/all-held-items.ts b/src/items/all-held-items.ts index 273cf8221b8..396e681a616 100644 --- a/src/items/all-held-items.ts +++ b/src/items/all-held-items.ts @@ -1,6 +1,6 @@ import { getEnumValues } from "#app/utils/common"; import { BerryType } from "#enums/berry-type"; -import { HeldItems } from "#enums/held-items"; +import { HeldItemId } from "#enums/held-item-id"; import type { PokemonType } from "#enums/pokemon-type"; import type { PermanentStat } from "#enums/stat"; import { ITEM_EFFECT } from "./held-item"; @@ -36,11 +36,11 @@ export function initHeldItems() { allHeldItems[heldItemType] = new BaseStatBoosterHeldItem(heldItemType, 10, stat); } - allHeldItems[HeldItems.LEFTOVERS] = new TurnEndHealHeldItem(HeldItems.LEFTOVERS, 4); - allHeldItems[HeldItems.SHELL_BELL] = new HitHealHeldItem(HeldItems.SHELL_BELL, 4); + allHeldItems[HeldItemId.LEFTOVERS] = new TurnEndHealHeldItem(HeldItemId.LEFTOVERS, 4); + allHeldItems[HeldItemId.SHELL_BELL] = new HitHealHeldItem(HeldItemId.SHELL_BELL, 4); - allHeldItems[HeldItems.LUCKY_EGG] = new ExpBoosterHeldItem(HeldItems.LUCKY_EGG, 99, 40); - allHeldItems[HeldItems.GOLDEN_EGG] = new ExpBoosterHeldItem(HeldItems.GOLDEN_EGG, 99, 100); + allHeldItems[HeldItemId.LUCKY_EGG] = new ExpBoosterHeldItem(HeldItemId.LUCKY_EGG, 99, 40); + allHeldItems[HeldItemId.GOLDEN_EGG] = new ExpBoosterHeldItem(HeldItemId.GOLDEN_EGG, 99, 100); for (const berry of getEnumValues(BerryType)) { let maxStackCount: number; diff --git a/src/items/held-item.ts b/src/items/held-item.ts index 8d1f5137637..31d734f686f 100644 --- a/src/items/held-item.ts +++ b/src/items/held-item.ts @@ -1,7 +1,7 @@ import { applyPostItemLostAbAttrs, PostItemLostAbAttr } from "#app/data/abilities/ability"; import type Pokemon from "#app/field/pokemon"; import { globalScene } from "#app/global-scene"; -import type { HeldItems } from "#enums/held-items"; +import type { HeldItemId } from "#enums/held-item-id"; export const ITEM_EFFECT = { ATTACK_TYPE_BOOST: 1, @@ -18,13 +18,13 @@ export type ITEM_EFFECT = (typeof ITEM_EFFECT)[keyof typeof ITEM_EFFECT]; export class HeldItem { // public pokemonId: number; - public type: HeldItems; + public type: HeldItemId; public maxStackCount: number; public isTransferable = true; public isStealable = true; public isSuppressable = true; - constructor(type: HeldItems, maxStackCount = 1) { + constructor(type: HeldItemId, maxStackCount = 1) { this.type = type; this.maxStackCount = maxStackCount; diff --git a/src/items/held-items/attack-type-booster.ts b/src/items/held-items/attack-type-booster.ts index f9048480e3f..69015a0412e 100644 --- a/src/items/held-items/attack-type-booster.ts +++ b/src/items/held-items/attack-type-booster.ts @@ -1,4 +1,4 @@ -import { HeldItemNames, HeldItems } from "#enums/held-items"; +import { HeldItemNames, HeldItemId } from "#enums/held-item-id"; import { PokemonType } from "#enums/pokemon-type"; import i18next from "i18next"; import type { NumberHolder } from "#app/utils/common"; @@ -15,28 +15,28 @@ export interface ATTACK_TYPE_BOOST_PARAMS { } interface AttackTypeToHeldItemMap { - [key: number]: HeldItems; + [key: number]: HeldItemId; } export const attackTypeToHeldItem: AttackTypeToHeldItemMap = { - [PokemonType.NORMAL]: HeldItems.SILK_SCARF, - [PokemonType.FIGHTING]: HeldItems.BLACK_BELT, - [PokemonType.FLYING]: HeldItems.SHARP_BEAK, - [PokemonType.POISON]: HeldItems.POISON_BARB, - [PokemonType.GROUND]: HeldItems.SOFT_SAND, - [PokemonType.ROCK]: HeldItems.HARD_STONE, - [PokemonType.BUG]: HeldItems.SILVER_POWDER, - [PokemonType.GHOST]: HeldItems.SPELL_TAG, - [PokemonType.STEEL]: HeldItems.METAL_COAT, - [PokemonType.FIRE]: HeldItems.CHARCOAL, - [PokemonType.WATER]: HeldItems.MYSTIC_WATER, - [PokemonType.GRASS]: HeldItems.MIRACLE_SEED, - [PokemonType.ELECTRIC]: HeldItems.MAGNET, - [PokemonType.PSYCHIC]: HeldItems.TWISTED_SPOON, - [PokemonType.ICE]: HeldItems.NEVER_MELT_ICE, - [PokemonType.DRAGON]: HeldItems.DRAGON_FANG, - [PokemonType.DARK]: HeldItems.BLACK_GLASSES, - [PokemonType.FAIRY]: HeldItems.FAIRY_FEATHER, + [PokemonType.NORMAL]: HeldItemId.SILK_SCARF, + [PokemonType.FIGHTING]: HeldItemId.BLACK_BELT, + [PokemonType.FLYING]: HeldItemId.SHARP_BEAK, + [PokemonType.POISON]: HeldItemId.POISON_BARB, + [PokemonType.GROUND]: HeldItemId.SOFT_SAND, + [PokemonType.ROCK]: HeldItemId.HARD_STONE, + [PokemonType.BUG]: HeldItemId.SILVER_POWDER, + [PokemonType.GHOST]: HeldItemId.SPELL_TAG, + [PokemonType.STEEL]: HeldItemId.METAL_COAT, + [PokemonType.FIRE]: HeldItemId.CHARCOAL, + [PokemonType.WATER]: HeldItemId.MYSTIC_WATER, + [PokemonType.GRASS]: HeldItemId.MIRACLE_SEED, + [PokemonType.ELECTRIC]: HeldItemId.MAGNET, + [PokemonType.PSYCHIC]: HeldItemId.TWISTED_SPOON, + [PokemonType.ICE]: HeldItemId.NEVER_MELT_ICE, + [PokemonType.DRAGON]: HeldItemId.DRAGON_FANG, + [PokemonType.DARK]: HeldItemId.BLACK_GLASSES, + [PokemonType.FAIRY]: HeldItemId.FAIRY_FEATHER, }; export class AttackTypeBoosterHeldItem extends HeldItem { @@ -45,7 +45,7 @@ export class AttackTypeBoosterHeldItem extends HeldItem { public powerBoost: number; // This constructor may need a revision - constructor(type: HeldItems, maxStackCount = 1, moveType: PokemonType, powerBoost: number) { + constructor(type: HeldItemId, maxStackCount = 1, moveType: PokemonType, powerBoost: number) { super(type, maxStackCount); this.moveType = moveType; this.powerBoost = powerBoost; diff --git a/src/items/held-items/base-stat-booster.ts b/src/items/held-items/base-stat-booster.ts index d65675a35c9..f71a1b6ef5b 100644 --- a/src/items/held-items/base-stat-booster.ts +++ b/src/items/held-items/base-stat-booster.ts @@ -1,5 +1,5 @@ import type Pokemon from "#app/field/pokemon"; -import { HeldItems } from "#enums/held-items"; +import { HeldItemId } from "#enums/held-item-id"; import { getStatKey, type PermanentStat, Stat } from "#enums/stat"; import i18next from "i18next"; import { HeldItem, ITEM_EFFECT } from "../held-item"; @@ -11,16 +11,16 @@ export interface BASE_STAT_BOOSTER_PARAMS { } interface PermanentStatToHeldItemMap { - [key: number]: HeldItems; + [key: number]: HeldItemId; } export const permanentStatToHeldItem: PermanentStatToHeldItemMap = { - [Stat.HP]: HeldItems.HP_UP, - [Stat.ATK]: HeldItems.PROTEIN, - [Stat.DEF]: HeldItems.IRON, - [Stat.SPATK]: HeldItems.CALCIUM, - [Stat.SPDEF]: HeldItems.ZINC, - [Stat.SPD]: HeldItems.CARBOS, + [Stat.HP]: HeldItemId.HP_UP, + [Stat.ATK]: HeldItemId.PROTEIN, + [Stat.DEF]: HeldItemId.IRON, + [Stat.SPATK]: HeldItemId.CALCIUM, + [Stat.SPDEF]: HeldItemId.ZINC, + [Stat.SPD]: HeldItemId.CARBOS, }; export const statBoostItems: Record = { @@ -36,7 +36,7 @@ export class BaseStatBoosterHeldItem extends HeldItem { public effects: ITEM_EFFECT[] = [ITEM_EFFECT.BASE_STAT_BOOSTER]; public stat: PermanentStat; - constructor(type: HeldItems, maxStackCount = 1, stat: PermanentStat) { + constructor(type: HeldItemId, maxStackCount = 1, stat: PermanentStat) { super(type, maxStackCount); this.stat = stat; } diff --git a/src/items/held-items/berry.ts b/src/items/held-items/berry.ts index 28f453d664c..eb6da1092bd 100644 --- a/src/items/held-items/berry.ts +++ b/src/items/held-items/berry.ts @@ -5,24 +5,24 @@ import { ConsumableHeldItem, ITEM_EFFECT } from "#app/items/held-item"; import { PreserveBerryModifier } from "#app/modifier/modifier"; import { BooleanHolder } from "#app/utils/common"; import { BerryType } from "#enums/berry-type"; -import { HeldItems } from "#enums/held-items"; +import { HeldItemId } from "#enums/held-item-id"; interface BerryTypeToHeldItemMap { - [key: number]: HeldItems; + [key: number]: HeldItemId; } export const berryTypeToHeldItem: BerryTypeToHeldItemMap = { - [BerryType.SITRUS]: HeldItems.SITRUS_BERRY, - [BerryType.LUM]: HeldItems.LUM_BERRY, - [BerryType.ENIGMA]: HeldItems.ENIGMA_BERRY, - [BerryType.LIECHI]: HeldItems.LIECHI_BERRY, - [BerryType.GANLON]: HeldItems.GANLON_BERRY, - [BerryType.PETAYA]: HeldItems.PETAYA_BERRY, - [BerryType.APICOT]: HeldItems.APICOT_BERRY, - [BerryType.SALAC]: HeldItems.SALAC_BERRY, - [BerryType.LANSAT]: HeldItems.LANSAT_BERRY, - [BerryType.STARF]: HeldItems.STARF_BERRY, - [BerryType.LEPPA]: HeldItems.LEPPA_BERRY, + [BerryType.SITRUS]: HeldItemId.SITRUS_BERRY, + [BerryType.LUM]: HeldItemId.LUM_BERRY, + [BerryType.ENIGMA]: HeldItemId.ENIGMA_BERRY, + [BerryType.LIECHI]: HeldItemId.LIECHI_BERRY, + [BerryType.GANLON]: HeldItemId.GANLON_BERRY, + [BerryType.PETAYA]: HeldItemId.PETAYA_BERRY, + [BerryType.APICOT]: HeldItemId.APICOT_BERRY, + [BerryType.SALAC]: HeldItemId.SALAC_BERRY, + [BerryType.LANSAT]: HeldItemId.LANSAT_BERRY, + [BerryType.STARF]: HeldItemId.STARF_BERRY, + [BerryType.LEPPA]: HeldItemId.LEPPA_BERRY, }; export interface BERRY_PARAMS { diff --git a/src/items/held-items/exp-booster.ts b/src/items/held-items/exp-booster.ts index e9b5090f972..79ffc4ba8bc 100644 --- a/src/items/held-items/exp-booster.ts +++ b/src/items/held-items/exp-booster.ts @@ -1,6 +1,6 @@ import type Pokemon from "#app/field/pokemon"; import type { NumberHolder } from "#app/utils/common"; -import { HeldItems } from "#enums/held-items"; +import { HeldItemId } from "#enums/held-item-id"; import i18next from "i18next"; import { HeldItem, ITEM_EFFECT } from "../held-item"; @@ -15,25 +15,25 @@ export class ExpBoosterHeldItem extends HeldItem { public effects: ITEM_EFFECT[] = [ITEM_EFFECT.EXP_BOOSTER]; private boostMultiplier: number; - constructor(type: HeldItems, maxStackCount = 1, boostPercent: number) { + constructor(type: HeldItemId, maxStackCount = 1, boostPercent: number) { super(type, maxStackCount); this.boostMultiplier = boostPercent * 0.01; } get name(): string { - return this.type === HeldItems.LUCKY_EGG + return this.type === HeldItemId.LUCKY_EGG ? i18next.t("modifierType:ModifierType.LUCKY_EGG.name") : i18next.t("modifierType:ModifierType.GOLDEN_EGG.name"); } get description(): string { - return this.type === HeldItems.LUCKY_EGG + return this.type === HeldItemId.LUCKY_EGG ? i18next.t("modifierType:ModifierType.LUCKY_EGG.description") : i18next.t("modifierType:ModifierType.GOLDEN_EGG.description"); } get icon(): string { - return this.type === HeldItems.LUCKY_EGG ? "lucky_egg" : "golden_egg"; + return this.type === HeldItemId.LUCKY_EGG ? "lucky_egg" : "golden_egg"; } // TODO: What do we do with this? Need to look up all the shouldApply diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index 35e2fb8a33e..2ffa9242852 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -129,7 +129,7 @@ import { getStatKey, Stat, TEMP_BATTLE_STATS } from "#enums/stat"; import { StatusEffect } from "#enums/status-effect"; import i18next from "i18next"; import { timedEventManager } from "#app/global-event-manager"; -import { HeldItems } from "#enums/held-items"; +import { HeldItemId } from "#enums/held-item-id"; import { allHeldItems } from "#app/items/all-held-items"; import { TYPE_BOOST_ITEM_BOOST_PERCENT } from "#app/constants"; import { attackTypeToHeldItem } from "#app/items/held-items/attack-type-booster"; @@ -429,8 +429,8 @@ export class PokemonHeldItemModifierType extends PokemonModifierType { } export class PokemonHeldItemReward extends PokemonModifierType { - public itemId: HeldItems; - constructor(itemId: HeldItems, newModifierFunc: NewModifierFunc, group?: string, soundName?: string) { + public itemId: HeldItemId; + constructor(itemId: HeldItemId, newModifierFunc: NewModifierFunc, group?: string, soundName?: string) { super( "", "", @@ -2153,7 +2153,7 @@ export const modifierTypes = { WHITE_HERB_REWARD: () => new PokemonHeldItemReward( - HeldItems.WHITE_HERB, + HeldItemId.WHITE_HERB, (type, args) => new ResetNegativeStatStageModifier(type, (args[0] as Pokemon).id), ), @@ -2316,12 +2316,12 @@ export const modifierTypes = { LUCKY_EGG_REWARD: () => new PokemonHeldItemReward( - HeldItems.LUCKY_EGG, + HeldItemId.LUCKY_EGG, (type, args) => new ExpBoosterModifier(type, (args[0] as Pokemon).id), ), GOLDEN_EGG_REWARD: () => new PokemonHeldItemReward( - HeldItems.GOLDEN_EGG, + HeldItemId.GOLDEN_EGG, (type, args) => new ExpBoosterModifier(type, (args[0] as Pokemon).id), ), @@ -2459,10 +2459,16 @@ export const modifierTypes = { ), LEFTOVERS_REWARD: () => - new PokemonHeldItemReward(HeldItems.LEFTOVERS, (type, args) => new TurnHealModifier(type, (args[0] as Pokemon).id)), + new PokemonHeldItemReward( + HeldItemId.LEFTOVERS, + (type, args) => new TurnHealModifier(type, (args[0] as Pokemon).id), + ), SHELL_BELL_REWARD: () => - new PokemonHeldItemReward(HeldItems.SHELL_BELL, (type, args) => new HitHealModifier(type, (args[0] as Pokemon).id)), + new PokemonHeldItemReward( + HeldItemId.SHELL_BELL, + (type, args) => new HitHealModifier(type, (args[0] as Pokemon).id), + ), LEFTOVERS: () => new PokemonHeldItemModifierType( @@ -3778,14 +3784,14 @@ export function getEnemyModifierTypesForWave( } // TODO: Add proper documentation to this function (once it fully works...) -// TODO: Convert trainer pool to HeldItems too +// TODO: Convert trainer pool to HeldItemId too export function getEnemyHeldItemsForWave( waveIndex: number, count: number, party: EnemyPokemon[], poolType: ModifierPoolType.WILD | ModifierPoolType.TRAINER, upgradeChance = 0, -): HeldItems[] { +): HeldItemId[] { const ret = new Array(count).fill(0).map(() => { const reward = getNewModifierTypeOption( party, @@ -3797,7 +3803,7 @@ export function getEnemyHeldItemsForWave( }); if (!(waveIndex % 1000)) { // TODO: Change this line with the actual held item when implemented - ret.push(HeldItems.MINI_BLACK_HOLE); + ret.push(HeldItemId.MINI_BLACK_HOLE); } return ret; }