Add createCombatFromRun to create combat state from run
This commit is contained in:
parent
46bd6e6d2b
commit
4e457b80af
2 changed files with 81 additions and 1 deletions
42
src/state.js
42
src/state.js
|
|
@ -73,6 +73,48 @@ export function createCombatState(characterOrChars, enemyIdOrIds) {
|
|||
return state;
|
||||
}
|
||||
|
||||
export function createCombatFromRun(run, enemyIdOrIds) {
|
||||
const enemyIds = Array.isArray(enemyIdOrIds) ? enemyIdOrIds : [enemyIdOrIds];
|
||||
const enemies = enemyIds.map((id, i) => makeEnemy(id, i));
|
||||
|
||||
const player = {
|
||||
id: "player_0",
|
||||
character: run.character,
|
||||
hp: run.hp,
|
||||
maxHp: run.maxHp,
|
||||
energy: 3,
|
||||
maxEnergy: 3,
|
||||
block: 0,
|
||||
strength: 0,
|
||||
vulnerable: 0,
|
||||
weak: 0,
|
||||
drawPile: shuffle([...run.deck]),
|
||||
hand: [],
|
||||
discardPile: [],
|
||||
exhaustPile: [],
|
||||
powers: [],
|
||||
};
|
||||
|
||||
const state = {
|
||||
players: [player],
|
||||
enemies,
|
||||
combat: {
|
||||
turn: 1,
|
||||
phase: "player_turn",
|
||||
dieResult: null,
|
||||
selectedCard: null,
|
||||
log: [],
|
||||
playerCount: 1,
|
||||
activePlayerIndex: null,
|
||||
playersReady: [],
|
||||
},
|
||||
};
|
||||
|
||||
state.player = player;
|
||||
state.enemy = enemies[0];
|
||||
return state;
|
||||
}
|
||||
|
||||
export function drawCards(state, playerIndexOrCount, count) {
|
||||
// drawCards(state, count) — old single-player form
|
||||
// drawCards(state, playerIndex, count) — new indexed form
|
||||
|
|
|
|||
|
|
@ -1,7 +1,14 @@
|
|||
import { beforeAll, describe, expect, test } from "bun:test";
|
||||
import { initCards } from "./cards.js";
|
||||
import { initEnemies } from "./enemies.js";
|
||||
import { createCombatState, drawCards, endTurn, playCard } from "./state.js";
|
||||
import { createRunState } from "./run.js";
|
||||
import {
|
||||
createCombatFromRun,
|
||||
createCombatState,
|
||||
drawCards,
|
||||
endTurn,
|
||||
playCard,
|
||||
} from "./state.js";
|
||||
|
||||
beforeAll(async () => {
|
||||
await Promise.all([initCards(), initEnemies()]);
|
||||
|
|
@ -278,3 +285,34 @@ describe("backward compat - single string args", () => {
|
|||
expect(next.player.hand).toHaveLength(0);
|
||||
});
|
||||
});
|
||||
|
||||
describe("createCombatFromRun", () => {
|
||||
test("uses run deck for draw pile", () => {
|
||||
const run = createRunState("ironclad");
|
||||
// simulate picking a reward card
|
||||
const modified = { ...run, deck: [...run.deck, "pommel_strike"] };
|
||||
const state = createCombatFromRun(modified, "jaw_worm");
|
||||
const allCards = [
|
||||
...state.players[0].drawPile,
|
||||
...state.players[0].hand,
|
||||
...state.players[0].discardPile,
|
||||
];
|
||||
expect(allCards).toHaveLength(11);
|
||||
expect(allCards.filter((id) => id === "pommel_strike")).toHaveLength(1);
|
||||
});
|
||||
|
||||
test("uses run HP instead of max", () => {
|
||||
const run = createRunState("ironclad");
|
||||
run.hp = 7;
|
||||
const state = createCombatFromRun(run, "jaw_worm");
|
||||
expect(state.players[0].hp).toBe(7);
|
||||
expect(state.players[0].maxHp).toBe(11);
|
||||
});
|
||||
|
||||
test("backward-compat aliases work", () => {
|
||||
const run = createRunState("ironclad");
|
||||
const state = createCombatFromRun(run, "jaw_worm");
|
||||
expect(state.player).toBe(state.players[0]);
|
||||
expect(state.enemy).toBe(state.enemies[0]);
|
||||
});
|
||||
});
|
||||
|
|
|
|||
Loading…
Reference in a new issue