1
0
Fork 0

Inventory slot ids can be either strings or numbers.

This commit is contained in:
Pabloader 2026-04-27 13:55:18 +00:00
parent 8c7969771d
commit 6b6fd8970d
2 changed files with 12 additions and 10 deletions

View File

@ -1,20 +1,20 @@
import type { InventoryOptions, InventorySlotInput } from "./types"; import type { InventoryOptions, InventorySlotInput, SlotId } from "./types";
interface SlotEntry { interface SlotEntry {
readonly slotId: string; readonly slotId: SlotId;
readonly limit: number | undefined; readonly limit: number | undefined;
state: { itemId: string; amount: number } | null; state: { itemId: string; amount: number } | null;
} }
export class Inventory { export class Inventory {
private readonly slots: Map<string, SlotEntry>; private readonly slots: Map<SlotId, SlotEntry>;
private readonly maxAmountPerItem: Record<string, number>; private readonly maxAmountPerItem: Record<string, number>;
constructor(slotDefs: Array<InventorySlotInput>, options?: InventoryOptions) { constructor(slotDefs: Array<InventorySlotInput>, options?: InventoryOptions) {
this.slots = new Map( this.slots = new Map(
slotDefs.map(def => { slotDefs.map(def => {
const slotId = typeof def === 'string' ? def : def.slotId; const slotId = typeof def === 'object' ? def.slotId : def;
const limit = typeof def === 'string' ? undefined : def.limit; const limit = typeof def === 'object' ? def.limit : undefined;
return [slotId, { slotId, limit, state: null }]; return [slotId, { slotId, limit, state: null }];
}) })
); );
@ -34,7 +34,7 @@ export class Inventory {
return this.slotCapFor(slot, itemId) - (slot.state?.amount ?? 0); return this.slotCapFor(slot, itemId) - (slot.state?.amount ?? 0);
} }
addItem(itemId: string, amount: number, slotId?: string): boolean { addItem(itemId: string, amount: number, slotId?: SlotId): boolean {
if (amount < 0) return false; if (amount < 0) return false;
if (amount === 0) return true; if (amount === 0) return true;
@ -78,7 +78,7 @@ export class Inventory {
return remaining === 0; return remaining === 0;
} }
removeItem(itemId: string, amount: number, slotId?: string): boolean { removeItem(itemId: string, amount: number, slotId?: SlotId): boolean {
if (amount < 0) return false; if (amount < 0) return false;
if (amount === 0) return true; if (amount === 0) return true;
@ -107,7 +107,7 @@ export class Inventory {
return remaining === 0; return remaining === 0;
} }
getAmount(itemId: string, slotId?: string): number { getAmount(itemId: string, slotId?: SlotId): number {
if (slotId !== undefined) { if (slotId !== undefined) {
const slot = this.slots.get(slotId); const slot = this.slots.get(slotId);
return slot?.state?.itemId === itemId ? slot.state.amount : 0; return slot?.state?.itemId === itemId ? slot.state.amount : 0;

View File

@ -97,12 +97,14 @@ function isQuestStage(v: unknown): v is QuestStage {
&& Array.isArray(s.actions) && s.actions.every(isRPGAction); && Array.isArray(s.actions) && s.actions.every(isRPGAction);
} }
export type SlotId = string | number;
export interface InventorySlotDefinition { export interface InventorySlotDefinition {
slotId: string; slotId: SlotId;
limit?: number; limit?: number;
} }
export type InventorySlotInput = string | InventorySlotDefinition; export type InventorySlotInput = SlotId | InventorySlotDefinition;
export interface InventoryOptions { export interface InventoryOptions {
maxAmountPerItem?: Record<string, number>; maxAmountPerItem?: Record<string, number>;