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,
|
||||
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: {},
|
||||
};
|
||||
}
|
||||
|
|
@ -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: {
|
||||
|
|
|
|||
Loading…
Reference in New Issue