From bbab3cc43b0b3ab73f23843c82b68c5e560700b9 Mon Sep 17 00:00:00 2001 From: hypercross Date: Thu, 23 Apr 2026 09:45:56 +0800 Subject: [PATCH] feat(slay-the-spire-like): implement CombatGameHost Introduce CombatGameHost to manage the combat lifecycle and integrate ContentModule triggers with the combat run context. --- src/samples/slay-the-spire-like/data/types.ts | 3 ++- .../system/combat/index.ts | 24 +++++++++++++++++++ .../system/combat/triggers.ts | 7 +----- .../slay-the-spire-like/system/types.ts | 2 ++ 4 files changed, 29 insertions(+), 7 deletions(-) diff --git a/src/samples/slay-the-spire-like/data/types.ts b/src/samples/slay-the-spire-like/data/types.ts index 1972263..8c6937a 100644 --- a/src/samples/slay-the-spire-like/data/types.ts +++ b/src/samples/slay-the-spire-like/data/types.ts @@ -2,6 +2,7 @@ import { LoadResult as YarnDialogues } from "yarn-spinner-loader"; import { Triggers } from "../system/combat/triggers"; import type * as desert from "./desert"; +import { IRunContext } from "../system/combat"; export type ContentModule = { getCards: () => desert.Card[]; @@ -13,5 +14,5 @@ export type ContentModule = { getStartingItems: () => desert.Item[]; dialogues: YarnDialogues; - addTriggers: (triggers: Triggers) => void; + addTriggers: (triggers: Triggers, run: IRunContext) => void; }; diff --git a/src/samples/slay-the-spire-like/system/combat/index.ts b/src/samples/slay-the-spire-like/system/combat/index.ts index 9a0799e..83d2ba9 100644 --- a/src/samples/slay-the-spire-like/system/combat/index.ts +++ b/src/samples/slay-the-spire-like/system/combat/index.ts @@ -3,3 +3,27 @@ export * from "./factory"; export * from "./prompts"; export * from "./triggers"; export * from "./types"; + +import { GameHost } from "@/core/game-host"; +import { ContentModule } from "../types"; +import { createCommandRegistry } from "@/utils/command"; +import { createStart, createTriggers, Triggers } from "./triggers"; +import { CombatState, IRunContext } from "./types"; + +export class CombatGameHost extends GameHost { + public readonly triggers: Triggers; + constructor( + private module: ContentModule, + private runContext: IRunContext, + private initialState: CombatState, + ) { + let triggers: Triggers; + super( + createCommandRegistry(), + () => initialState, + createStart((triggers = createTriggers(runContext)), runContext), + ); + module.addTriggers(triggers, runContext); + this.triggers = triggers; + } +} diff --git a/src/samples/slay-the-spire-like/system/combat/triggers.ts b/src/samples/slay-the-spire-like/system/combat/triggers.ts index d0ec33c..326bb25 100644 --- a/src/samples/slay-the-spire-like/system/combat/triggers.ts +++ b/src/samples/slay-the-spire-like/system/combat/triggers.ts @@ -287,12 +287,7 @@ export function createTriggers(run: IRunContext) { return triggers; } export type Triggers = ReturnType; -export function createStartWith( - build: (triggers: Triggers, run: IRunContext) => void, - run: IRunContext, -) { - const triggers = createTriggers(run); - build(triggers, run); +export function createStart(triggers: Triggers, run: IRunContext) { return async function (game: CombatGameContext) { await triggers.onCombatStart.execute(game, {}); diff --git a/src/samples/slay-the-spire-like/system/types.ts b/src/samples/slay-the-spire-like/system/types.ts index 3e87a0a..dac3662 100644 --- a/src/samples/slay-the-spire-like/system/types.ts +++ b/src/samples/slay-the-spire-like/system/types.ts @@ -21,3 +21,5 @@ export { CardEffectTarget, IntentEffectTarget, } from "../data/desert"; + +export { ContentModule } from "../data";