feat: Cards writings and balancing (M8)

This commit is contained in:
gauvainboiche
2026-10-25 18:30:43 +01:00
parent 04193e2013
commit c2103c32e7
43 changed files with 25930 additions and 397 deletions
+5
View File
@@ -63,6 +63,9 @@ export function restoreState(s, { scenarios, balance, cards }) {
if (m.type === "shift" ? !(isNum(m.perDay) && isNum(m.remaining, 1)) : !(m.type === "bias" && isNum(m.value) && (m.remaining === null || isNum(m.remaining, 1)))) return fail();
}
// World cycle
if (!isObj(s.world) || !isNum(s.world.cycle, -50, 50)) return fail();
// Decisions and flags
if (!isObj(s.flags) || !Object.values(s.flags).every((v) => isNum(v))) return fail();
if (!Array.isArray(s.cardHistory)) return fail();
@@ -77,6 +80,8 @@ export function restoreState(s, { scenarios, balance, cards }) {
for (const k of PENDING_KINDS) s.pending[k] = s.pending[k] === true;
if (!Array.isArray(s.alerts) || !s.alerts.every((a) => isObj(a) && ALERT_KINDS.includes(a.kind) && isInt(a.day, 0, balance.time.termDays))) return fail();
if (!isObj(s.risk) || ![s.risk.revolution, s.risk.coup, s.risk.impeachment].every((v) => isNum(v, 0)) || typeof s.risk.defaultZone !== "boolean") return fail();
s.risk.emergency = s.risk.emergency === true;
if (!isNum(s.risk.lastEmergency)) s.risk.lastEmergency = -999;
if (s.over !== null && !(isObj(s.over) && OVER_TYPES.includes(s.over.type) && isInt(s.over.day, 0, balance.time.termDays))) return fail();
// History for the charts: one equal-length series per tracked value