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,
// 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<HeldItemValue, HeldItemName> = Object.entries(HeldItems).reduce(
export const HeldItemNames: Record<HeldItemValue, HeldItemName> = Object.entries(HeldItemId).reduce(
(acc, [key, value]) => {
acc[value as HeldItemValue] = key as HeldItemName;
return acc;

View File

@ -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) {

View File

@ -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;

View File

@ -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;

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 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;

View File

@ -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<PermanentStat, string> = {
@ -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;
}

View File

@ -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 {

View File

@ -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

View File

@ -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;
}