/** * HASK'S SLED RUN (PLAN_1_TO_40.md E9/C14, 2026-10-14): a downhill course on the snowfields, ridden on a sled the server drives * tile by tile. Old Hask's granddaughter Tove minds the sled at the top of the dune hill north-east of his cabin; once The Mammoth * Road is done (any level) she will count a rider in. * * The course is a corkscrew: the rider spirals out from the summit round the hill and runs out east across the basin, ~103 * authored tiles at 2.75 times the walking pace (about ten seconds). The route is data (SLED_RUN_ROUTE), checked against the * real map by the backend smoke, so the server owns where the sled goes and the client only draws it. * * It is not a ride you can only watch: four bends (SLED_CUES) open a short LEAN window as the sled comes to them. A lean * pressed inside the window gives a burst of speed for the next SLED_BOOST_TILES tiles, so two clean runs can differ by * a second and a half, and the best-times board means something. A lean outside a window, or a second one in the same window, * does nothing. Nothing here touches health, bag or position beyond the ride itself. * * Amounts (Ledger XP, the new-best coins) are PLACEHOLDERS for the balance pass. */ /** The corkscrew, as [x, z] world tiles from the summit down to the basin. Each step is to a neighbouring tile (8 directions). */ export declare const SLED_RUN_ROUTE: ReadonlyArray; export declare const SLED_RUN_START: readonly [number, number]; export declare const SLED_RUN_FINISH: readonly [number, number]; /** * The two Blender pieces over the course (quest-workshop ironjaw.py, design-references sled-run-2): the start gate over the first * tiles (its front, the side with the banner, the start platform and the ramp lip, faces east: where Tove and the riders wait, the course leaving west through the posts) and the finish arch over the last (its front faces west, where the * riders come from). dreadmodels placed by the backend map builder; neither blocks a tile (constants.ts, CAPITAL_BUILDING_MODELS). */ export declare const SLED_START_GATE: { readonly x: 113; readonly z: 353; readonly style: "sledstart-e"; }; export declare const SLED_FINISH_ARCH: { readonly x: 136; readonly z: 352; readonly style: "sledfinish-w"; }; /** Tove Hask, who minds the sled in the first loop of the course, facing the start. A resident by name, like the Fair's people. */ export declare const SLED_KEEPER: { readonly name: "Tove Hask"; readonly x: 114; readonly z: 350; readonly faceX: 114; readonly faceZ: 353; }; /** How near the keeper (Chebyshev tiles) a rider must stand to be counted in. */ export declare const SLED_KEEPER_REACH = 3; /** The quest that opens the run (Old Hask's third job). Any level once it is done. */ export declare const SLED_RUN_QUEST = "mammothRoad"; /** Walking pace multiplier for the whole ride. */ export declare const SLED_SPEED_MUL = 2.75; /** The burst a good lean gives, and how many route tiles it lasts. */ export declare const SLED_BOOST_MUL = 1.5; export declare const SLED_BOOST_TILES = 14; /** The wait between being counted in and the sled going: the rider is moved to the start and held (locked) this long. */ export declare const SLED_READY_MS = 2000; /** A run that has not finished by now is called off (a stuck path must never hold a rider). */ export declare const SLED_MAX_RUN_MS = 45000; /** After a run (any ending) the next one waits this long, so a keeper's menu cannot be hammered. */ export declare const SLED_RETRY_MS = 4000; /** The route index of each bend, and how many route tiles either side of it a lean counts. */ export declare const SLED_CUES: readonly number[]; export declare const SLED_CUE_HALF_WINDOW = 4; /** A run under this is a "fast" run (Ledger line sled:fast): three clean leans or better. */ export declare const SLED_FAST_MS = 8800; /** PLACEHOLDER coins for a new personal best, once per improvement of at least SLED_BEST_MIN_GAIN_MS. */ export declare const SLED_BEST_COINS = 20; export declare const SLED_BEST_MIN_GAIN_MS = 100; /** The board shows this many riders. */ export declare const SLED_BOARD_SIZE = 10; /** A saved best outside this range is not a time we could have measured. */ export declare const SLED_MIN_PLAUSIBLE_MS = 5000; export declare const SLED_MAX_PLAUSIBLE_MS = 45000; /** The keeper's menu actions (npc_action ids). */ export declare const SLED_RIDE_ACTION = "sled-ride"; export declare const SLED_BOARD_ACTION = "sled-board"; export declare const SLED_MINE_ACTION = "sled-mine"; export declare const SLED_ACTIONS: readonly string[]; /** Ledger marks the server writes (explorerLedger.ts LEDGER_SLED_LINES). */ export declare const SLED_MARK_FINISH = "sled:finish"; export declare const SLED_MARK_CLEAN = "sled:clean"; export declare const SLED_MARK_FAST = "sled:fast"; /** What the client is told as a run goes (ServerMessage 'sled'). */ export type SledPhase = 'ready' | 'go' | 'cue' | 'lean' | 'done' | 'fail'; export declare function isSledAction(action: string): boolean; /** A tile on the course? */ export declare function sledRouteIndex(x: number, z: number): number; /** First and last route index at which a lean counts for bend `n` (0-based). */ export declare function sledCueWindow(n: number): { from: number; to: number; } | null; /** The bend whose window holds this route index, or -1. */ export declare function sledCueAt(index: number): number; /** * The speed multiplier at a route index: the ride's pace, boosted while the index is before `boostUntil` (a lean sets it to the * index it was made at plus SLED_BOOST_TILES). */ export declare function sledSpeedAt(index: number, boostUntil: number): number; /** Seconds with two decimals: 9380 -> "9.38 s". */ export declare function formatSledTime(ms: number): string; /** Is `ms` a time worth keeping as a personal best, given the old one (0 = none)? */ export declare function isSledNewBest(previous: number, ms: number): boolean; /** Whether a new best pays the coin: it must beat the old time by a real margin (or be the first). */ export declare function sledBestPays(previous: number, ms: number): boolean; /** Whatever the database held, made safe: a whole number of milliseconds in the measurable range, else 0 (no time). */ export declare function normalizeSledBest(raw: unknown): number; export type SledBoardEntry = { name: string; ms: number; }; /** The board as chat lines: a title and up to SLED_BOARD_SIZE ranked riders, quickest first (ties keep the order given). */ export declare function sledBoardLines(entries: readonly SledBoardEntry[]): string[]; /** What a rider hears when the run opens to them, and when it does not. */ export declare const SLED_GATE_TEXT = "Grandad's sled is for riders he trusts. Finish his Mammoth Road job first and I'll count you in."; export declare const SLED_TOO_FAR_TEXT = "Step up to Tove first."; export declare const SLED_BUSY_TEXT = "You can't ride the sled while you are fighting, hurt or busy."; export declare const SLED_WAIT_TEXT = "Give the sled a moment to be dragged back up the hill."; export declare const SLED_GREET_TEXT = "That's Grandad's sled. Down the hill and out across the basin, ten seconds if you hold on. Press Space at each bend as the sled comes to it for a burst of speed. Stand by me and ask for a ride."; //# sourceMappingURL=sledRun.d.ts.map