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`.
This commit is contained in:
hypercross 2026-04-21 22:35:14 +08:00
parent 2823089f06
commit 9b20f7ad6f
2 changed files with 20 additions and 23 deletions

View File

@ -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<GameItemMeta>,
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<typeof generateDeckFromInventory>,
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: {},
};
}

View File

@ -18,6 +18,12 @@ export type CombatEntity = {
isAlive: boolean;
};
export interface IPlayerState {
hp: number;
maxHp: number;
itemEffects: Record<string, EffectTable>;
}
export interface IPlayerDeck {
cards: Record<string, Part<{ cardData: CardData; itemId: string }>>;
regions: {