import Phaser from "phaser"; import type { Spawner } from "boardgame-phaser"; import type { GameItemMeta, InventoryItem, } from "boardgame-core/samples/slay-the-spire-like"; import type { InventorySignal } from "@/state/inventory"; import { spawnEffect } from "boardgame-phaser"; import { InventoryItemContainer } from "./InventoryItemContainer"; import type { InventoryItemContainerCallbacks } from "./InventoryItemContainer"; export interface InventoryItemSpawnerCallbacks extends InventoryItemContainerCallbacks {} export class InventoryItemSpawner implements Spawner< [string, InventoryItem], InventoryItemContainer > { constructor( private scene: Phaser.Scene, private inventorySignal: InventorySignal, private gridOffsetX: number, private gridOffsetY: number, private callbacks: InventoryItemSpawnerCallbacks, ) {} *getData(): Iterable<[string, InventoryItem]> { const inventory = this.inventorySignal.value; yield* inventory.items.entries(); } getKey(entry: [string, InventoryItem]): string { return entry[0]; } onSpawn( entry: [string, InventoryItem], ): InventoryItemContainer | null { const [itemId, item] = entry; const container = new InventoryItemContainer( this.scene, this.gridOffsetX, this.gridOffsetY, { onMoveItem: (id, newX, newY) => { return this.callbacks.onMoveItem(id, newX, newY); }, }, ); container.setItem(item); return container; } onUpdate( entry: [string, InventoryItem], container: InventoryItemContainer, ): void { const [itemId, item] = entry; container.setItem(item); } onDespawn(container: InventoryItemContainer): void { // TODO: add tween container.destroy(); } } export function createInventoryItemSpawner( scene: Phaser.Scene, inventorySignal: InventorySignal, gridOffsetX: number, gridOffsetY: number, callbacks: InventoryItemSpawnerCallbacks, ) { return spawnEffect( new InventoryItemSpawner( scene, inventorySignal, gridOffsetX, gridOffsetY, callbacks, ), ); }