First commit, done on M6 from the PLAN.MD

This commit is contained in:
gauvainboiche
2026-10-25 17:34:44 +01:00
parent d5dc2a3901
commit 04193e2013
86 changed files with 8396 additions and 0 deletions
+44
View File
@@ -0,0 +1,44 @@
// Budget preview for the quarterly ledger: applies a draft budget to a copy of
// the game and runs the real daily tick forward, without noise, so the player
// sees where debt, deficit and the main indicators are heading.
// It assumes no new policies (future cards are unknown).
import { advanceDay, summarize } from "./game.js";
import { computeFiscal, setBudget } from "./economy.js";
const quietCache = new WeakMap();
// Same balance with all daily noise switched off.
function quietBalance(bal) {
let q = quietCache.get(bal);
if (!q) {
q = structuredClone(bal);
q.noise.indicator = 0;
for (const def of Object.values(q.vars)) def.noise = 0;
for (const def of Object.values(q.indicators)) if ("noise" in def) def.noise = 0;
quietCache.set(bal, q);
}
return q;
}
// Returns { ok, errors, fiscal, points }. points[0] is "now with the draft applied";
// points[i] is the state i quarters later (fewer if the term ends first).
export function previewBudget(state, bal, draft, { quarters = 4 } = {}) {
const sim = structuredClone(state);
sim.pending.review = true; // the preview may edit the budget even outside a review
const res = setBudget(sim, bal, draft);
if (!res.ok) return { ok: false, errors: res.errors, fiscal: null, points: [] };
const quiet = quietBalance(bal);
const fiscal = computeFiscal(sim, quiet);
const points = [summarize(sim, quiet)];
for (let q = 0; q < quarters && !sim.over; q++) {
for (let d = 0; d < bal.time.daysPerQuarter && !sim.over; d++) {
for (const k of Object.keys(sim.pending)) sim.pending[k] = false;
advanceDay(sim, quiet);
}
points.push(summarize(sim, quiet));
}
return { ok: true, errors: [], fiscal, points };
}