import { mutableSignal } from "boardgame-core"; import { createGridInventory, createItemIn, data, GameItemMeta, placeItem, removeItemFromGrid, validatePlacement, } from "boardgame-core/samples/slay-the-spire-like"; function genId() { return Math.random().toString(16).slice(-8); } export type InventorySignal = ReturnType; export function createInventorySignal() { const inventory = createGridInventory(4, 6); const startingItems = data.desert.getStartingItems(); for (const d of startingItems) { createItemIn(inventory, `${d.id}-${genId()}`, d); } return mutableSignal(inventory); } /** * Move an item to a new position in the inventory. * Returns true if the move was successful, false if the new position is invalid. */ export function moveItem( inventorySignal: InventorySignal, itemId: string, newX: number, newY: number, ): boolean { const inventory = inventorySignal.value; const item = inventory.items.get(itemId); if (!item) { return false; } const newTransform = { ...item.transform, offset: { x: newX, y: newY }, }; const validation = validatePlacement(inventory, item.shape, newTransform); if (!validation.valid) return false; inventorySignal.produce((inv) => { const item = inv.items.get(itemId)!; removeItemFromGrid(inv, itemId); item.transform = newTransform; placeItem(inv, item); }); return true; }