62 lines
1.4 KiB
TypeScript
62 lines
1.4 KiB
TypeScript
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<typeof createInventorySignal>;
|
|
|
|
export function createInventorySignal() {
|
|
const inventory = createGridInventory<GameItemMeta>(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;
|
|
}
|