Phase 2: bases, quest board, and known-vs-new targets
Four allied bases, placed by greedy farthest-point so no choke point can strand the player, with the first at the spawn junction so the loop is available at once. Missions hand in at any base, not the issuing one. The board offers known and new targets side by side and describes each route in words. Crucially it never reads heat directly — it reads sim/intel.ts, a record of what the player has actually observed and when. Notes age while roads keep escalating unwatched, so a known route is knowable, stale, and never a promise. Recon missions survey everything within 130m, which is how a new target becomes a known one without driving every road there. New targets pay 1.8x. That multiplier is the phase's tuning dial: too low and nobody takes the unknown, too high and nobody takes the known. Payment is parts, which repair the car. To keep "decline, not reset" intact, each subsystem gains a ceiling that falls permanently with damage — repairs restore up to what the car is still capable of, never to what it was. Without an economy the board's rewards had no stakes; with one, the risky job is what keeps the car running a while longer. Adds Dijkstra over the road graph, taking a cost function so a "safest route" preview is a small change later. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -6,7 +6,13 @@ import type { DriverInput } from '../core/input';
|
||||
import { generateWorld } from '../sim/world';
|
||||
|
||||
const STEP = 1 / 60;
|
||||
const IDLE: DriverInput = { throttle: 0, steer: 0, handbrake: false, respawn: false };
|
||||
const IDLE: DriverInput = {
|
||||
throttle: 0,
|
||||
steer: 0,
|
||||
handbrake: false,
|
||||
respawn: false,
|
||||
select: null,
|
||||
};
|
||||
|
||||
/** Rapier runs headless, so vehicle tuning is checkable without a browser. */
|
||||
async function run(input: Partial<DriverInput>, seconds: number) {
|
||||
|
||||
Reference in New Issue
Block a user