87 lines
2.2 KiB
TypeScript
87 lines
2.2 KiB
TypeScript
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<GameItemMeta>],
|
|
InventoryItemContainer
|
|
> {
|
|
constructor(
|
|
private scene: Phaser.Scene,
|
|
private inventorySignal: InventorySignal,
|
|
private gridOffsetX: number,
|
|
private gridOffsetY: number,
|
|
private callbacks: InventoryItemSpawnerCallbacks,
|
|
) {}
|
|
|
|
*getData(): Iterable<[string, InventoryItem<GameItemMeta>]> {
|
|
const inventory = this.inventorySignal.value;
|
|
yield* inventory.items.entries();
|
|
}
|
|
|
|
getKey(entry: [string, InventoryItem<GameItemMeta>]): string {
|
|
return entry[0];
|
|
}
|
|
|
|
onSpawn(
|
|
entry: [string, InventoryItem<GameItemMeta>],
|
|
): 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<GameItemMeta>],
|
|
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,
|
|
),
|
|
);
|
|
}
|