diff --git a/packages/sts-like-viewer/src/state/combatState.ts b/packages/sts-like-viewer/src/state/combatState.ts index e69de29..f0eb96e 100644 --- a/packages/sts-like-viewer/src/state/combatState.ts +++ b/packages/sts-like-viewer/src/state/combatState.ts @@ -0,0 +1,62 @@ +import { + buildCombatState, + CombatState, + createRunState, + createStartWith, + data, + generateDeckFromInventory, + getAdjacentItems, + getItemEffects, + IRunContext, +} from "boardgame-core/samples/slay-the-spire-like"; +import { createInventorySignal } from "./inventory"; +import { GameModule } from "boardgame-core"; + +export function createCombatState() { + const inventory = createInventorySignal(true); + + const deck = generateDeckFromInventory(inventory.value); + + const run = createRunState(); + + const encounter = data.desert.getEncounters()[0]; + + const effects = getItemEffects(inventory.value); + const combat = buildCombatState( + { + hp: run.currentHp, + maxHp: run.maxHp, + itemEffects: effects, + }, + deck, + encounter, + ); + + const runContext: IRunContext = { + getItemData(id: string) { + return inventory.value.items.get(id)?.meta?.itemData || null; + }, + getAdjacentItems(id: string) { + return getAdjacentItems(inventory.value, id).keys(); + }, + getConsumedUses(id: string) { + return inventory.value.items.get(id)?.meta?.consumedUses || 0; + }, + async setConsumedUsesAsync(id: string, uses: number) { + await inventory.produceAsync((draft) => { + const item = draft.items.get(id); + if (!item?.meta) return; + item.meta.consumedUses = uses; + }); + }, + }; + + const start = createStartWith((triggers, ctx) => { + data.desert.addTriggers(triggers, runContext); + }, runContext); + + return { + start, + createInitialState: () => combat, + } as GameModule; +} diff --git a/packages/sts-like-viewer/src/state/inventory.ts b/packages/sts-like-viewer/src/state/inventory.ts index 393b6ec..6e84c11 100644 --- a/packages/sts-like-viewer/src/state/inventory.ts +++ b/packages/sts-like-viewer/src/state/inventory.ts @@ -6,7 +6,7 @@ import { data, GameItemMeta, placeItem, - removeItemFromGrid, + removeItem, Transform2D, validatePlacement, } from "boardgame-core/samples/slay-the-spire-like"; @@ -58,14 +58,14 @@ export function moveItem( }; const removed = create(to.value, (inv) => { - removeItemFromGrid(inv, itemId); + removeItem(inv, itemId); }); const validation = validatePlacement(removed, item.shape, newTransform); if (!validation.valid) return false; batch(() => { from.produce((inv) => { - removeItemFromGrid(inv, itemId); + removeItem(inv, itemId); }); to.produce((inv) => { placeItem(inv, {