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:
parent
2823089f06
commit
9b20f7ad6f
|
|
@ -2,22 +2,19 @@ import {
|
||||||
CombatState,
|
CombatState,
|
||||||
EffectTable,
|
EffectTable,
|
||||||
EnemyEntity,
|
EnemyEntity,
|
||||||
|
IPlayerDeck,
|
||||||
|
IPlayerState,
|
||||||
PlayerEntity,
|
PlayerEntity,
|
||||||
} from "../combat/types";
|
} from "./types";
|
||||||
import { generateDeckFromInventory } from "../deck";
|
|
||||||
import { GridInventory } from "../grid-inventory";
|
|
||||||
import { GameItemMeta } from "../grid-inventory/types";
|
|
||||||
import { EffectData, EncounterData, EnemyData, IntentData } from "../types";
|
import { EffectData, EncounterData, EnemyData, IntentData } from "../types";
|
||||||
import { CombatEncounterState, RunState } from "./types";
|
|
||||||
|
|
||||||
export function buildCombatState(
|
export function buildCombatState(
|
||||||
runState: RunState,
|
playerState: IPlayerState,
|
||||||
inventory: GridInventory<GameItemMeta>,
|
deck: IPlayerDeck,
|
||||||
encounter: CombatEncounterState,
|
encounter: EncounterData,
|
||||||
): CombatState {
|
): CombatState {
|
||||||
const deck = generateDeckFromInventory(inventory);
|
const player = createPlayerEntity(playerState, deck);
|
||||||
const player = createPlayerEntity(runState, deck);
|
const enemies = createEnemyEntities(encounter);
|
||||||
const enemies = createEnemyEntities(encounter.data);
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
enemies,
|
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[] {
|
function createEnemyEntities(encounter: EncounterData): EnemyEntity[] {
|
||||||
const enemies: EnemyEntity[] = [];
|
const enemies: EnemyEntity[] = [];
|
||||||
let instanceCounter = 0;
|
let instanceCounter = 0;
|
||||||
|
|
@ -96,18 +87,18 @@ function buildEffectTable(buffs: readonly [EffectData, number][]): EffectTable {
|
||||||
}
|
}
|
||||||
|
|
||||||
function createPlayerEntity(
|
function createPlayerEntity(
|
||||||
runState: RunState,
|
playerState: IPlayerState,
|
||||||
deck: ReturnType<typeof generateDeckFromInventory>,
|
deck: IPlayerDeck,
|
||||||
): PlayerEntity {
|
): PlayerEntity {
|
||||||
return {
|
return {
|
||||||
id: "player",
|
id: "player",
|
||||||
hp: runState.currentHp,
|
hp: playerState.hp,
|
||||||
maxHp: runState.maxHp,
|
maxHp: playerState.maxHp,
|
||||||
isAlive: runState.currentHp > 0,
|
isAlive: playerState.hp > 0,
|
||||||
energy: 3,
|
energy: 3,
|
||||||
maxEnergy: 3,
|
maxEnergy: 3,
|
||||||
deck,
|
deck,
|
||||||
itemEffects: {},
|
itemEffects: playerState.itemEffects,
|
||||||
effects: {},
|
effects: {},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
@ -18,6 +18,12 @@ export type CombatEntity = {
|
||||||
isAlive: boolean;
|
isAlive: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export interface IPlayerState {
|
||||||
|
hp: number;
|
||||||
|
maxHp: number;
|
||||||
|
itemEffects: Record<string, EffectTable>;
|
||||||
|
}
|
||||||
|
|
||||||
export interface IPlayerDeck {
|
export interface IPlayerDeck {
|
||||||
cards: Record<string, Part<{ cardData: CardData; itemId: string }>>;
|
cards: Record<string, Part<{ cardData: CardData; itemId: string }>>;
|
||||||
regions: {
|
regions: {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue