From 9b20f7ad6f4345fb0479d1a076c18acfb9cea76c Mon Sep 17 00:00:00 2001 From: hypercross Date: Tue, 21 Apr 2026 22:35:14 +0800 Subject: [PATCH] refactor(slay-the-spire-like): reorganize combat system files Move combat factory to a dedicated combat directory and update `buildCombatState` to use `IPlayerState` and `IPlayerDeck` instead of deriving them from `RunState` and `GridInventory`. --- .../combat.ts => combat/factory.ts} | 37 +++++++------------ .../system/combat/types.ts | 6 +++ 2 files changed, 20 insertions(+), 23 deletions(-) rename src/samples/slay-the-spire-like/system/{encounter/combat.ts => combat/factory.ts} (70%) diff --git a/src/samples/slay-the-spire-like/system/encounter/combat.ts b/src/samples/slay-the-spire-like/system/combat/factory.ts similarity index 70% rename from src/samples/slay-the-spire-like/system/encounter/combat.ts rename to src/samples/slay-the-spire-like/system/combat/factory.ts index a771158..f389aaa 100644 --- a/src/samples/slay-the-spire-like/system/encounter/combat.ts +++ b/src/samples/slay-the-spire-like/system/combat/factory.ts @@ -2,22 +2,19 @@ import { CombatState, EffectTable, EnemyEntity, + IPlayerDeck, + IPlayerState, PlayerEntity, -} from "../combat/types"; -import { generateDeckFromInventory } from "../deck"; -import { GridInventory } from "../grid-inventory"; -import { GameItemMeta } from "../grid-inventory/types"; +} from "./types"; import { EffectData, EncounterData, EnemyData, IntentData } from "../types"; -import { CombatEncounterState, RunState } from "./types"; export function buildCombatState( - runState: RunState, - inventory: GridInventory, - encounter: CombatEncounterState, + playerState: IPlayerState, + deck: IPlayerDeck, + encounter: EncounterData, ): CombatState { - const deck = generateDeckFromInventory(inventory); - const player = createPlayerEntity(runState, deck); - const enemies = createEnemyEntities(encounter.data); + const player = createPlayerEntity(playerState, deck); + const enemies = createEnemyEntities(encounter); return { enemies, @@ -29,12 +26,6 @@ export function buildCombatState( }; } -export function buildCombatEncounterState( - data: EncounterData<"minion" | "elite">, -): CombatEncounterState { - return { data, blocked: false }; -} - function createEnemyEntities(encounter: EncounterData): EnemyEntity[] { const enemies: EnemyEntity[] = []; let instanceCounter = 0; @@ -96,18 +87,18 @@ function buildEffectTable(buffs: readonly [EffectData, number][]): EffectTable { } function createPlayerEntity( - runState: RunState, - deck: ReturnType, + playerState: IPlayerState, + deck: IPlayerDeck, ): PlayerEntity { return { id: "player", - hp: runState.currentHp, - maxHp: runState.maxHp, - isAlive: runState.currentHp > 0, + hp: playerState.hp, + maxHp: playerState.maxHp, + isAlive: playerState.hp > 0, energy: 3, maxEnergy: 3, deck, - itemEffects: {}, + itemEffects: playerState.itemEffects, effects: {}, }; } diff --git a/src/samples/slay-the-spire-like/system/combat/types.ts b/src/samples/slay-the-spire-like/system/combat/types.ts index 32b0e0e..22b8f0b 100644 --- a/src/samples/slay-the-spire-like/system/combat/types.ts +++ b/src/samples/slay-the-spire-like/system/combat/types.ts @@ -18,6 +18,12 @@ export type CombatEntity = { isAlive: boolean; }; +export interface IPlayerState { + hp: number; + maxHp: number; + itemEffects: Record; +} + export interface IPlayerDeck { cards: Record>; regions: {