// The pace of a run, read the same way from bot games (the survey) and real ones (the reader script): when each // first thing happens, in game seconds, and the ranges we want for a careful run that reaches the goal. The survey's // other ranges stay in survey.ts. import { siteOf, type State } from '../src/sim.ts'; /** Mark the first time each of these is true: a second machine, a tree node, the line out, a site past the office, * a front, a rogue. */ export function paceMarks(S: State, mark: (key: string) => void) { const mine = S.machines.filter(m => m.owned); if (mine.length >= 2) mark('take1'); if (S.upgrades.size >= 1) mark('node1'); if (S.byId.egress?.owned) mark('line'); if (mine.some(m => siteOf(S, m) !== 'office' && !m.rented)) mark('site2'); if (S.fronts.length) mark('front'); if (S.rogues.length) mark('rogue'); } /** The ranges, for a careful run that reaches the goal: how long it takes, when the first node comes (game seconds), * and when it leaves the office and founds a front (shares of the run). */ export const PACE = { run: { name: 'careful run, game seconds', lo: 900, hi: 2200 }, // a few minutes at 4x, for a bot that heads for the line out as a player does. To 2200: since stealth is people, careful play waits for a room to empty and sits out lockdowns node1: { name: 'first node built', lo: 40, hi: 200 }, site2: { name: 'leaves the office (share of the run)', lo: 0.1, hi: 0.75 }, // the opening is quick: the line out and a first other site in a few minutes at 1x, so as little as a tenth of the run front: { name: 'founds a front (share of the run)', lo: 0.2, hi: 0.7 }, } as const;