Changed held-items.ts to held-item-id.ts and renamed id object accoridngly

This commit is contained in:
Wlowscha 2025-06-07 10:48:30 +02:00
parent e98004cefa
commit d109bc202f
No known key found for this signature in database
GPG Key ID: 3C8F1AD330565D04
9 changed files with 85 additions and 79 deletions

View File

@ -1,4 +1,4 @@
export const HeldItems = { export const HeldItemId = {
NONE: 0x0000, NONE: 0x0000,
// Berries // Berries
@ -84,13 +84,13 @@ export const HeldItems = {
CARBOS: 0x0906, CARBOS: 0x0906,
}; };
export type HeldItems = (typeof HeldItems)[keyof typeof HeldItems]; export type HeldItemId = (typeof HeldItemId)[keyof typeof HeldItemId];
type HeldItemName = keyof typeof HeldItems; type HeldItemName = keyof typeof HeldItemId;
type HeldItemValue = typeof HeldItems[HeldItemName]; type HeldItemValue = typeof HeldItemId[HeldItemName];
// Use a type-safe reducer to force number keys and values // Use a type-safe reducer to force number keys and values
export const HeldItemNames: Record<HeldItemValue, HeldItemName> = Object.entries(HeldItems).reduce( export const HeldItemNames: Record<HeldItemValue, HeldItemName> = Object.entries(HeldItemId).reduce(
(acc, [key, value]) => { (acc, [key, value]) => {
acc[value as HeldItemValue] = key as HeldItemName; acc[value as HeldItemValue] = key as HeldItemName;
return acc; return acc;

View File

@ -1,5 +1,5 @@
import { allHeldItems } from "#app/items/all-held-items"; 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 { interface HeldItemProperties {
stack: number; stack: number;
@ -8,7 +8,7 @@ interface HeldItemProperties {
} }
type HeldItemPropertyMap = { type HeldItemPropertyMap = {
[key in HeldItems]: HeldItemProperties; [key in HeldItemId]: HeldItemProperties;
}; };
export class PokemonItemManager { export class PokemonItemManager {
@ -22,20 +22,20 @@ export class PokemonItemManager {
return Object.keys(this.heldItems).map(k => Number(k)); return Object.keys(this.heldItems).map(k => Number(k));
} }
hasItem(itemType: HeldItems): boolean { hasItem(itemType: HeldItemId): boolean {
return itemType in this.heldItems; return itemType in this.heldItems;
} }
getItem(itemType: HeldItems): HeldItemProperties { getItem(itemType: HeldItemId): HeldItemProperties {
// TODO: Not very safe // TODO: Not very safe
return this.heldItems[itemType]; return this.heldItems[itemType];
} }
getStack(itemType: HeldItems): number { getStack(itemType: HeldItemId): number {
return itemType in this.heldItems ? this.heldItems[itemType].stack : 0; 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(); const maxStack = allHeldItems[itemType].getMaxStackCount();
if (this.hasItem(itemType)) { 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; this.heldItems[itemType].stack -= removeStack;
if (this.heldItems[itemType].stack <= 0) { if (this.heldItems[itemType].stack <= 0) {

View File

@ -1,6 +1,6 @@
import { getEnumValues } from "#app/utils/common"; import { getEnumValues } from "#app/utils/common";
import { BerryType } from "#enums/berry-type"; 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 { PokemonType } from "#enums/pokemon-type";
import type { PermanentStat } from "#enums/stat"; import type { PermanentStat } from "#enums/stat";
import { ITEM_EFFECT } from "./held-item"; import { ITEM_EFFECT } from "./held-item";
@ -36,11 +36,11 @@ export function initHeldItems() {
allHeldItems[heldItemType] = new BaseStatBoosterHeldItem(heldItemType, 10, stat); allHeldItems[heldItemType] = new BaseStatBoosterHeldItem(heldItemType, 10, stat);
} }
allHeldItems[HeldItems.LEFTOVERS] = new TurnEndHealHeldItem(HeldItems.LEFTOVERS, 4); allHeldItems[HeldItemId.LEFTOVERS] = new TurnEndHealHeldItem(HeldItemId.LEFTOVERS, 4);
allHeldItems[HeldItems.SHELL_BELL] = new HitHealHeldItem(HeldItems.SHELL_BELL, 4); allHeldItems[HeldItemId.SHELL_BELL] = new HitHealHeldItem(HeldItemId.SHELL_BELL, 4);
allHeldItems[HeldItems.LUCKY_EGG] = new ExpBoosterHeldItem(HeldItems.LUCKY_EGG, 99, 40); allHeldItems[HeldItemId.LUCKY_EGG] = new ExpBoosterHeldItem(HeldItemId.LUCKY_EGG, 99, 40);
allHeldItems[HeldItems.GOLDEN_EGG] = new ExpBoosterHeldItem(HeldItems.GOLDEN_EGG, 99, 100); allHeldItems[HeldItemId.GOLDEN_EGG] = new ExpBoosterHeldItem(HeldItemId.GOLDEN_EGG, 99, 100);
for (const berry of getEnumValues(BerryType)) { for (const berry of getEnumValues(BerryType)) {
let maxStackCount: number; let maxStackCount: number;

View File

@ -1,7 +1,7 @@
import { applyPostItemLostAbAttrs, PostItemLostAbAttr } from "#app/data/abilities/ability"; import { applyPostItemLostAbAttrs, PostItemLostAbAttr } from "#app/data/abilities/ability";
import type Pokemon from "#app/field/pokemon"; import type Pokemon from "#app/field/pokemon";
import { globalScene } from "#app/global-scene"; 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 = { export const ITEM_EFFECT = {
ATTACK_TYPE_BOOST: 1, ATTACK_TYPE_BOOST: 1,
@ -18,13 +18,13 @@ export type ITEM_EFFECT = (typeof ITEM_EFFECT)[keyof typeof ITEM_EFFECT];
export class HeldItem { export class HeldItem {
// public pokemonId: number; // public pokemonId: number;
public type: HeldItems; public type: HeldItemId;
public maxStackCount: number; public maxStackCount: number;
public isTransferable = true; public isTransferable = true;
public isStealable = true; public isStealable = true;
public isSuppressable = true; public isSuppressable = true;
constructor(type: HeldItems, maxStackCount = 1) { constructor(type: HeldItemId, maxStackCount = 1) {
this.type = type; this.type = type;
this.maxStackCount = maxStackCount; this.maxStackCount = maxStackCount;

View File

@ -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 { PokemonType } from "#enums/pokemon-type";
import i18next from "i18next"; import i18next from "i18next";
import type { NumberHolder } from "#app/utils/common"; import type { NumberHolder } from "#app/utils/common";
@ -15,28 +15,28 @@ export interface ATTACK_TYPE_BOOST_PARAMS {
} }
interface AttackTypeToHeldItemMap { interface AttackTypeToHeldItemMap {
[key: number]: HeldItems; [key: number]: HeldItemId;
} }
export const attackTypeToHeldItem: AttackTypeToHeldItemMap = { export const attackTypeToHeldItem: AttackTypeToHeldItemMap = {
[PokemonType.NORMAL]: HeldItems.SILK_SCARF, [PokemonType.NORMAL]: HeldItemId.SILK_SCARF,
[PokemonType.FIGHTING]: HeldItems.BLACK_BELT, [PokemonType.FIGHTING]: HeldItemId.BLACK_BELT,
[PokemonType.FLYING]: HeldItems.SHARP_BEAK, [PokemonType.FLYING]: HeldItemId.SHARP_BEAK,
[PokemonType.POISON]: HeldItems.POISON_BARB, [PokemonType.POISON]: HeldItemId.POISON_BARB,
[PokemonType.GROUND]: HeldItems.SOFT_SAND, [PokemonType.GROUND]: HeldItemId.SOFT_SAND,
[PokemonType.ROCK]: HeldItems.HARD_STONE, [PokemonType.ROCK]: HeldItemId.HARD_STONE,
[PokemonType.BUG]: HeldItems.SILVER_POWDER, [PokemonType.BUG]: HeldItemId.SILVER_POWDER,
[PokemonType.GHOST]: HeldItems.SPELL_TAG, [PokemonType.GHOST]: HeldItemId.SPELL_TAG,
[PokemonType.STEEL]: HeldItems.METAL_COAT, [PokemonType.STEEL]: HeldItemId.METAL_COAT,
[PokemonType.FIRE]: HeldItems.CHARCOAL, [PokemonType.FIRE]: HeldItemId.CHARCOAL,
[PokemonType.WATER]: HeldItems.MYSTIC_WATER, [PokemonType.WATER]: HeldItemId.MYSTIC_WATER,
[PokemonType.GRASS]: HeldItems.MIRACLE_SEED, [PokemonType.GRASS]: HeldItemId.MIRACLE_SEED,
[PokemonType.ELECTRIC]: HeldItems.MAGNET, [PokemonType.ELECTRIC]: HeldItemId.MAGNET,
[PokemonType.PSYCHIC]: HeldItems.TWISTED_SPOON, [PokemonType.PSYCHIC]: HeldItemId.TWISTED_SPOON,
[PokemonType.ICE]: HeldItems.NEVER_MELT_ICE, [PokemonType.ICE]: HeldItemId.NEVER_MELT_ICE,
[PokemonType.DRAGON]: HeldItems.DRAGON_FANG, [PokemonType.DRAGON]: HeldItemId.DRAGON_FANG,
[PokemonType.DARK]: HeldItems.BLACK_GLASSES, [PokemonType.DARK]: HeldItemId.BLACK_GLASSES,
[PokemonType.FAIRY]: HeldItems.FAIRY_FEATHER, [PokemonType.FAIRY]: HeldItemId.FAIRY_FEATHER,
}; };
export class AttackTypeBoosterHeldItem extends HeldItem { export class AttackTypeBoosterHeldItem extends HeldItem {
@ -45,7 +45,7 @@ export class AttackTypeBoosterHeldItem extends HeldItem {
public powerBoost: number; public powerBoost: number;
// This constructor may need a revision // 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); super(type, maxStackCount);
this.moveType = moveType; this.moveType = moveType;
this.powerBoost = powerBoost; this.powerBoost = powerBoost;

View File

@ -1,5 +1,5 @@
import type Pokemon from "#app/field/pokemon"; 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 { getStatKey, type PermanentStat, Stat } from "#enums/stat";
import i18next from "i18next"; import i18next from "i18next";
import { HeldItem, ITEM_EFFECT } from "../held-item"; import { HeldItem, ITEM_EFFECT } from "../held-item";
@ -11,16 +11,16 @@ export interface BASE_STAT_BOOSTER_PARAMS {
} }
interface PermanentStatToHeldItemMap { interface PermanentStatToHeldItemMap {
[key: number]: HeldItems; [key: number]: HeldItemId;
} }
export const permanentStatToHeldItem: PermanentStatToHeldItemMap = { export const permanentStatToHeldItem: PermanentStatToHeldItemMap = {
[Stat.HP]: HeldItems.HP_UP, [Stat.HP]: HeldItemId.HP_UP,
[Stat.ATK]: HeldItems.PROTEIN, [Stat.ATK]: HeldItemId.PROTEIN,
[Stat.DEF]: HeldItems.IRON, [Stat.DEF]: HeldItemId.IRON,
[Stat.SPATK]: HeldItems.CALCIUM, [Stat.SPATK]: HeldItemId.CALCIUM,
[Stat.SPDEF]: HeldItems.ZINC, [Stat.SPDEF]: HeldItemId.ZINC,
[Stat.SPD]: HeldItems.CARBOS, [Stat.SPD]: HeldItemId.CARBOS,
}; };
export const statBoostItems: Record<PermanentStat, string> = { export const statBoostItems: Record<PermanentStat, string> = {
@ -36,7 +36,7 @@ export class BaseStatBoosterHeldItem extends HeldItem {
public effects: ITEM_EFFECT[] = [ITEM_EFFECT.BASE_STAT_BOOSTER]; public effects: ITEM_EFFECT[] = [ITEM_EFFECT.BASE_STAT_BOOSTER];
public stat: PermanentStat; public stat: PermanentStat;
constructor(type: HeldItems, maxStackCount = 1, stat: PermanentStat) { constructor(type: HeldItemId, maxStackCount = 1, stat: PermanentStat) {
super(type, maxStackCount); super(type, maxStackCount);
this.stat = stat; this.stat = stat;
} }

View File

@ -5,24 +5,24 @@ import { ConsumableHeldItem, ITEM_EFFECT } from "#app/items/held-item";
import { PreserveBerryModifier } from "#app/modifier/modifier"; import { PreserveBerryModifier } from "#app/modifier/modifier";
import { BooleanHolder } from "#app/utils/common"; import { BooleanHolder } from "#app/utils/common";
import { BerryType } from "#enums/berry-type"; import { BerryType } from "#enums/berry-type";
import { HeldItems } from "#enums/held-items"; import { HeldItemId } from "#enums/held-item-id";
interface BerryTypeToHeldItemMap { interface BerryTypeToHeldItemMap {
[key: number]: HeldItems; [key: number]: HeldItemId;
} }
export const berryTypeToHeldItem: BerryTypeToHeldItemMap = { export const berryTypeToHeldItem: BerryTypeToHeldItemMap = {
[BerryType.SITRUS]: HeldItems.SITRUS_BERRY, [BerryType.SITRUS]: HeldItemId.SITRUS_BERRY,
[BerryType.LUM]: HeldItems.LUM_BERRY, [BerryType.LUM]: HeldItemId.LUM_BERRY,
[BerryType.ENIGMA]: HeldItems.ENIGMA_BERRY, [BerryType.ENIGMA]: HeldItemId.ENIGMA_BERRY,
[BerryType.LIECHI]: HeldItems.LIECHI_BERRY, [BerryType.LIECHI]: HeldItemId.LIECHI_BERRY,
[BerryType.GANLON]: HeldItems.GANLON_BERRY, [BerryType.GANLON]: HeldItemId.GANLON_BERRY,
[BerryType.PETAYA]: HeldItems.PETAYA_BERRY, [BerryType.PETAYA]: HeldItemId.PETAYA_BERRY,
[BerryType.APICOT]: HeldItems.APICOT_BERRY, [BerryType.APICOT]: HeldItemId.APICOT_BERRY,
[BerryType.SALAC]: HeldItems.SALAC_BERRY, [BerryType.SALAC]: HeldItemId.SALAC_BERRY,
[BerryType.LANSAT]: HeldItems.LANSAT_BERRY, [BerryType.LANSAT]: HeldItemId.LANSAT_BERRY,
[BerryType.STARF]: HeldItems.STARF_BERRY, [BerryType.STARF]: HeldItemId.STARF_BERRY,
[BerryType.LEPPA]: HeldItems.LEPPA_BERRY, [BerryType.LEPPA]: HeldItemId.LEPPA_BERRY,
}; };
export interface BERRY_PARAMS { export interface BERRY_PARAMS {

View File

@ -1,6 +1,6 @@
import type Pokemon from "#app/field/pokemon"; import type Pokemon from "#app/field/pokemon";
import type { NumberHolder } from "#app/utils/common"; 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 i18next from "i18next";
import { HeldItem, ITEM_EFFECT } from "../held-item"; import { HeldItem, ITEM_EFFECT } from "../held-item";
@ -15,25 +15,25 @@ export class ExpBoosterHeldItem extends HeldItem {
public effects: ITEM_EFFECT[] = [ITEM_EFFECT.EXP_BOOSTER]; public effects: ITEM_EFFECT[] = [ITEM_EFFECT.EXP_BOOSTER];
private boostMultiplier: number; private boostMultiplier: number;
constructor(type: HeldItems, maxStackCount = 1, boostPercent: number) { constructor(type: HeldItemId, maxStackCount = 1, boostPercent: number) {
super(type, maxStackCount); super(type, maxStackCount);
this.boostMultiplier = boostPercent * 0.01; this.boostMultiplier = boostPercent * 0.01;
} }
get name(): string { 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.LUCKY_EGG.name")
: i18next.t("modifierType:ModifierType.GOLDEN_EGG.name"); : i18next.t("modifierType:ModifierType.GOLDEN_EGG.name");
} }
get description(): string { 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.LUCKY_EGG.description")
: i18next.t("modifierType:ModifierType.GOLDEN_EGG.description"); : i18next.t("modifierType:ModifierType.GOLDEN_EGG.description");
} }
get icon(): string { 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 // TODO: What do we do with this? Need to look up all the shouldApply

View File

@ -129,7 +129,7 @@ import { getStatKey, Stat, TEMP_BATTLE_STATS } from "#enums/stat";
import { StatusEffect } from "#enums/status-effect"; import { StatusEffect } from "#enums/status-effect";
import i18next from "i18next"; import i18next from "i18next";
import { timedEventManager } from "#app/global-event-manager"; 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 { allHeldItems } from "#app/items/all-held-items";
import { TYPE_BOOST_ITEM_BOOST_PERCENT } from "#app/constants"; import { TYPE_BOOST_ITEM_BOOST_PERCENT } from "#app/constants";
import { attackTypeToHeldItem } from "#app/items/held-items/attack-type-booster"; import { attackTypeToHeldItem } from "#app/items/held-items/attack-type-booster";
@ -429,8 +429,8 @@ export class PokemonHeldItemModifierType extends PokemonModifierType {
} }
export class PokemonHeldItemReward extends PokemonModifierType { export class PokemonHeldItemReward extends PokemonModifierType {
public itemId: HeldItems; public itemId: HeldItemId;
constructor(itemId: HeldItems, newModifierFunc: NewModifierFunc, group?: string, soundName?: string) { constructor(itemId: HeldItemId, newModifierFunc: NewModifierFunc, group?: string, soundName?: string) {
super( super(
"", "",
"", "",
@ -2153,7 +2153,7 @@ export const modifierTypes = {
WHITE_HERB_REWARD: () => WHITE_HERB_REWARD: () =>
new PokemonHeldItemReward( new PokemonHeldItemReward(
HeldItems.WHITE_HERB, HeldItemId.WHITE_HERB,
(type, args) => new ResetNegativeStatStageModifier(type, (args[0] as Pokemon).id), (type, args) => new ResetNegativeStatStageModifier(type, (args[0] as Pokemon).id),
), ),
@ -2316,12 +2316,12 @@ export const modifierTypes = {
LUCKY_EGG_REWARD: () => LUCKY_EGG_REWARD: () =>
new PokemonHeldItemReward( new PokemonHeldItemReward(
HeldItems.LUCKY_EGG, HeldItemId.LUCKY_EGG,
(type, args) => new ExpBoosterModifier(type, (args[0] as Pokemon).id), (type, args) => new ExpBoosterModifier(type, (args[0] as Pokemon).id),
), ),
GOLDEN_EGG_REWARD: () => GOLDEN_EGG_REWARD: () =>
new PokemonHeldItemReward( new PokemonHeldItemReward(
HeldItems.GOLDEN_EGG, HeldItemId.GOLDEN_EGG,
(type, args) => new ExpBoosterModifier(type, (args[0] as Pokemon).id), (type, args) => new ExpBoosterModifier(type, (args[0] as Pokemon).id),
), ),
@ -2459,10 +2459,16 @@ export const modifierTypes = {
), ),
LEFTOVERS_REWARD: () => 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: () => 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: () => LEFTOVERS: () =>
new PokemonHeldItemModifierType( new PokemonHeldItemModifierType(
@ -3778,14 +3784,14 @@ export function getEnemyModifierTypesForWave(
} }
// TODO: Add proper documentation to this function (once it fully works...) // 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( export function getEnemyHeldItemsForWave(
waveIndex: number, waveIndex: number,
count: number, count: number,
party: EnemyPokemon[], party: EnemyPokemon[],
poolType: ModifierPoolType.WILD | ModifierPoolType.TRAINER, poolType: ModifierPoolType.WILD | ModifierPoolType.TRAINER,
upgradeChance = 0, upgradeChance = 0,
): HeldItems[] { ): HeldItemId[] {
const ret = new Array(count).fill(0).map(() => { const ret = new Array(count).fill(0).map(() => {
const reward = getNewModifierTypeOption( const reward = getNewModifierTypeOption(
party, party,
@ -3797,7 +3803,7 @@ export function getEnemyHeldItemsForWave(
}); });
if (!(waveIndex % 1000)) { if (!(waveIndex % 1000)) {
// TODO: Change this line with the actual held item when implemented // 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; return ret;
} }