deadhead-space-freight-tycoon/packages/sim/balance/run.ts

29 lines
1.3 KiB
TypeScript

/// <reference types="node" />
/**
* Prints a balance run for both first-purchase policies (plan Step 12.1):
* pnpm --filter @deadhead/sim balance [worldSeed] [hours]
*/
import { MS_PER_HOUR } from "../src/index";
import { simulate, type PurchasePolicy } from "./simulate";
const worldSeed = Number(process.argv[2] ?? 12345);
const hours = Number(process.argv[3] ?? 8);
for (const policy of ["lighter-first", "freighter-first"] as PurchasePolicy[]) {
const result = simulate({ worldSeed, policy, durationMs: hours * MS_PER_HOUR });
console.log(`\n=== ${policy} (seed ${worldSeed}) ===`);
console.log("milestones (real minutes):", result.milestones);
console.log(
`tutorial runs ${result.tutorialRuns}, contracts ${result.contractsDelivered}, ` +
`veteran contracts in first 2 h ${result.veteranContractsFirstSession}, purchases ${result.purchases.join(", ")}`,
);
console.log("violations:", result.violations.length);
for (const v of result.violations.slice(0, 10))
console.log(` ${v.minute} min ${v.rule} ${v.detail}`);
console.log("minute credits loan ships pilot levels");
for (const s of result.samples.filter((_, i) => i % 3 === 0)) {
console.log(
`${String(s.minute).padStart(6)} ${String(s.credits).padStart(7)} ${String(s.loanBalance).padStart(6)} ${s.ships} ${s.pilotLevels.join(" ")}`,
);
}
}