64 lines
1.5 KiB
TypeScript
64 lines
1.5 KiB
TypeScript
import {
|
|
buildCombatState,
|
|
createRunState,
|
|
createStart,
|
|
createTriggers,
|
|
data,
|
|
generateDeckFromInventory,
|
|
getAdjacentItems,
|
|
getItemEffects,
|
|
IRunContext,
|
|
} from "boardgame-core/samples/slay-the-spire-like";
|
|
import { createInventorySignal } from "./inventory";
|
|
|
|
export type CombatModule = ReturnType<typeof createCombatModule>;
|
|
export function createCombatModule() {
|
|
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 triggers = createTriggers(runContext);
|
|
const start = createStart(triggers, runContext);
|
|
|
|
return {
|
|
start,
|
|
createInitialState: () => combat,
|
|
triggers,
|
|
runContext,
|
|
};
|
|
}
|