/** * MILLSTREAM HAMLET (coverage slice 9, T122, 2026-10-15; plan `.cursor/task-plans/2026-10-15-t122-millstream-hamlet.md`; levels 10-18). The land * south of Brindlecross (final-frame x 1792-1919, z 1152-1343) was 19,000 empty tiles and Cooking 11-20 had two quests. This is a farm, mill and * stream hamlet that feeds Cooking and Potion Making, with no existing coordinate moved: * * - the MILL on the west bank of the Millstream, below the Mill Pond: Miller Hamish Burr grinds wheat into flour for nothing (the same `millwheat` * action as Millbrook's and the South Fields' mills) and sets THE STUCK WHEEL, the hamlet's set piece: four gates and a brake along the race, * touched IN ORDER while the water runs (a six-minute wall clock, like the Sea Grotto's tide and the Thaw's ice); * - the BAKERY: Baker Gilda Roe (a camp trader and a camp kitchen with a daily order), a clay oven and a stove; * - the HERBALIST: Wenna Thatch's cottage, a herb garden, watermint on the stream bank and a cauldron anyone may brew at; * - the FARM: Farmer Dunstan Fell and three wheat plots (the ripe wheat reaps by hand for the mill); * - the STREAM and its FORD: stepping stones across the lower reach, three tide snapper spots with pegs below it, and a lane east; * - THE LOST CART: Carter Piers Lowther's wagon in Stag Meadow, and three crates of flour the thieves left lying; * - three DENS of existing kinds, each hunting only inside its own box: the Bean Row Burrow (wild boars), the Hedgerow Thicket (hedge-thieves) * and Stag Meadow (bristlehart stags). * * The five quests are in millstreamQuestDef.ts. EVERY NUMBER HERE (levels, counts, pay, timings) IS A PLACEHOLDER for the balance pass (James, * 2026-10-12: balance last). Nothing is above level 18 and nothing opens a gate. Every position is a WORLD tile (x east, z south). Models are * stand-ins from the kit, logged in dreadwoods-backend/upgrades. */ import type { DiscoveryZone } from './landmarks.js'; export type MsBox = { readonly minX: number; readonly maxX: number; readonly minZ: number; readonly maxZ: number; }; export type MsPiece = { readonly id: string; readonly model: string; readonly facing: 's' | 'n' | 'e' | 'w'; readonly x: number; readonly z: number; }; export type MsStation = { readonly id: string; readonly kind: 'campfire' | 'stove' | 'cauldron' | 'bountyboard'; readonly style: string; readonly x: number; readonly z: number; }; export type MsQuestProp = { readonly id: string; readonly x: number; readonly z: number; readonly style: string; }; export declare const MILLSTREAM_ID = "millstream-hamlet"; export declare const MILLSTREAM_NAME = "Millstream Hamlet"; export declare const MILLSTREAM_MILL_NAME = "The Mill on the Millstream"; export declare const MILLSTREAM_FORD_NAME = "Millstream Ford"; /** The whole claim: south of Brindlecross (x 1800-1935, z 1030-1140), west of Lantern Wake (x 1936+); the sea starts at about z 1296. */ export declare const MILLSTREAM_CLAIM: MsBox; /** The hamlet itself (the discovery zone): the green, bakery, mill, herbalist, farm, pond and the stream down to the ford. */ export declare const MILLSTREAM_HAMLET_BOX: MsBox; /** The land is flat grass at height 3 here; the pond and stream are cut into it. */ export declare const MILLSTREAM_LAND_HEIGHT = 3; /** The pond and the stream lie this far under the banks (as the Brindle Stream's does), so the water reads as water but the banks need no easing. */ export declare const MILLSTREAM_WATER_DEPTH = 0.3; /** Millstream Road: dirt, two tiles wide, from the south edge of Brindlecross to the ford lane. */ export declare const MILLSTREAM_ROAD: { readonly x0: 1861; readonly x1: 1862; readonly zFrom: 1141; readonly zTo: 1253; }; /** The cross lanes: north of the pond (to the Hedgerow Thicket) and the ford lane (to Stag Meadow). */ export declare const MILLSTREAM_LANES: ReadonlyArray<{ readonly minX: number; readonly maxX: number; readonly minZ: number; readonly maxZ: number; }>; /** The Mill Pond: an ellipse. The stream leaves its south edge, three tiles wide, down to the sea. */ export declare const MILL_POND: { readonly cx: 1880.5; readonly cz: 1186.5; readonly rx: 6; readonly rz: 4.5; }; export declare const MILLSTREAM_STREAM: { readonly minX: 1880; readonly maxX: 1882; readonly zFrom: 1192; }; /** The ford: stepping stones across the stream (stone, height 2, walkable). */ export declare const MILLSTREAM_FORD: { readonly minX: 1879; readonly maxX: 1883; readonly minZ: 1252; readonly maxZ: 1254; }; export declare function msInBox(b: MsBox, x: number, z: number, pad?: number): boolean; /** Water in the Mill Pond or the stream (the backend carves it; it keeps carving past this until it meets the sea). */ export declare function millstreamIsPond(x: number, z: number): boolean; export declare function millstreamIsStream(x: number, z: number): boolean; export declare function millstreamIsFord(x: number, z: number): boolean; export declare const MILLSTREAM_STANDS: { /** Where Millstream Road leaves Brindlecross's south edge. */ readonly road: { readonly x: 1862; readonly z: 1154; }; readonly green: { readonly x: 1862; readonly z: 1180; }; readonly bakery: { readonly x: 1850; readonly z: 1183; }; readonly mill: { readonly x: 1876; readonly z: 1198; }; readonly herbalist: { readonly x: 1846; readonly z: 1211; }; readonly farm: { readonly x: 1846; readonly z: 1235; }; readonly ford: { readonly x: 1862; readonly z: 1251; }; readonly eastBank: { readonly x: 1886; readonly z: 1252; }; readonly pegs: { readonly x: 1878; readonly z: 1270; }; readonly cart: { readonly x: 1900; readonly z: 1266; }; }; /** Six minutes: the race runs 3.5, slackens for half a minute, stands dry 1.5 and fills again for half a minute. The wheel turns in the first four. */ export declare const MILL_FLOW_CYCLE_MS = 360000; export type MillFlowPhase = 'run' | 'slack' | 'dry' | 'rise'; export declare function millFlow(nowMs: number): { phase: MillFlowPhase; msUntilFlow: number; msLeftFlow: number; }; /** The wheel will turn while the race runs and slackens; it will not in the dry or the rise. */ export declare const isMillFlowing: (nowMs: number) => boolean; /** The race gauge's line (readable any time, quest or not). */ export declare function millRaceLine(nowMs: number): string; /** The hamlet's Blender kit (quest-workshop millstream.py, 2026-10-19): the mill with its turning wheel, the bakery, the herbalist's cottage, the farmhouse, the barn, the oven, sacks, crates, the well, lamps. */ export declare const MILLSTREAM_PIECES: readonly MsPiece[]; /** Working stations: the bakery's stove and fire, the herbalist's cauldron (any cauldron brews any recipe), and the hamlet's Bounty Board. */ export declare const MILLSTREAM_STATIONS: readonly MsStation[]; export declare const MILLSTREAM_CAULDRON_ID = "ms-cauldron"; /** The wheat plots (rows of ripe wheat, reaped by hand for the mill). */ export declare const MILLSTREAM_FIELDS: ReadonlyArray; export declare const MILLSTREAM_SIGNS: readonly { readonly id: string; readonly x: number; readonly z: number; readonly style: string; }[]; export declare const MILLSTREAM_FOLK_NAMES: { readonly miller: "Miller Hamish Burr"; readonly farmer: "Farmer Dunstan Fell"; readonly herbalist: "Herbalist Wenna Thatch"; readonly carter: "Carter Piers Lowther"; readonly baker: "Gilda Roe"; }; export type MillstreamFolk = { readonly id: string; readonly name: string; readonly place: string; readonly x: number; readonly z: number; readonly faceX: number; readonly faceZ: number; readonly leash: number; readonly speak: string; readonly extras?: ReadonlyArray<{ readonly id: string; readonly label: string; readonly say: string; }>; }; export declare const MILLSTREAM_FOLK: ReadonlyArray; export declare function millstreamFolkByName(name: string | null | undefined): MillstreamFolk | null; export declare function millstreamFolkById(id: string | null | undefined): MillstreamFolk | null; /** The baker: a CampTrader entry (campTraders.ts adds it to CAMP_TRADERS) and a camp kitchen (campKitchens.ts) with a daily order. */ export declare const MILLSTREAM_BAKER: { readonly id: "camp-millstream"; readonly name: "Gilda Roe"; readonly place: "the bakery, Millstream Hamlet"; readonly x: 1850; readonly z: 1182; readonly faceX: 1850; readonly faceZ: 1184; readonly leash: 1; readonly shopTitle: "Gilda's Bakery"; readonly stock: readonly []; readonly buys: { readonly flour: 3; readonly honeybread: 14; }; readonly speak: "Gilda Roe, and this is the oven that feeds the whole valley. Flour from the mill, a fire under it and an honest hand: that is bread. Ask me what I want baked today."; readonly trade: "I sell no loaves: the valley bakes its own, and my oven is free to anyone with flour. I buy flour and good bread, and I want them more than your coin: ask about the day's order."; }; export declare const MSH_PROP: { readonly wheel: "mswheel"; readonly gauge: "msgauge"; readonly beans: "msbeans"; readonly box: "msbox"; readonly cart: "mscart"; }; /** The Stuck Wheel: the pond sluice, the race gate, the wheel brake and the hopper chute, in the order the water goes. West bank, north to south. */ export declare const MSH_WHEEL: readonly MsQuestProp[]; export declare const MSH_WHEEL_ORDER: readonly string[]; export declare const MSH_GAUGE: MsQuestProp; /** Three trampled bean-pole stakes at the Burrow's edge (Boars in the Beans). */ export declare const MSH_BEANS: readonly MsQuestProp[]; /** The lost cart's wagon and the three spilled flour crates in Stag Meadow. */ export declare const MSH_CART: MsQuestProp; export declare const MSH_BOXES: readonly MsQuestProp[]; export declare const MILLSTREAM_QUEST_PROPS: readonly MsQuestProp[]; /** The four Stuck Wheel gates, in the order the water goes (style `mswheel:`): the pond sluice, the race gate, the wheel brake and the hopper chute. */ export declare const MSH_WHEEL_MODELS: readonly string[]; export declare function millstreamPropModel(prop: string, style?: string): string | null; export declare const MILLSTREAM_QUEST_PROP_NAMES: Readonly>; /** The idle line for a prop clicked when the quest does not want it (the gauge says the race any time). */ export declare function millstreamPropIdleLine(prop: string, nowMs: number): string | null; /** Story effect: the wrong gate, or the water running out, carries you back to the mill yard (backend world.ts applyStoryEffect). */ export declare const MILL_SPILL_EFFECT = "mill-spill"; export declare const MILL_SPILL_TEXT = "The water slops over the gate and sweeps you off your feet. You wash up in the mill yard, soaked, with the whole race to open again."; export type MillstreamDenKind = 'boar' | 'hedgethief' | 'bristlehartstag'; export type MillstreamDen = { readonly id: string; readonly label: string; readonly box: MsBox; /** A tile on open ground at the den's edge nearest the hamlet. */ readonly stand: { readonly x: number; readonly z: number; }; readonly blurb: string; readonly kind: MillstreamDenKind; readonly level: readonly [number, number]; readonly spots: ReadonlyArray<{ readonly x: number; readonly z: number; readonly leash: number; }>; }; export declare const MILLSTREAM_DENS: readonly MillstreamDen[]; export declare const MILLSTREAM_DEN_BOXES: Readonly>; export declare const MILLSTREAM_DEN_PACE: { speed: number; idleChance: number; pause: readonly [3, 8]; }; /** Patches placed by the backend on the nearest suitable tile: water mint on both banks (Foraging 10), hawkweed in the garden (Foraging 14). */ export declare const MILLSTREAM_HERBS: ReadonlyArray<{ readonly herb: 'watermint' | 'hawkweed'; readonly x: number; readonly z: number; }>; /** Rough water tiles of three tide snapper spots below the ford, found by the backend on the finished stream. */ export declare const MILLSTREAM_FISH_HINTS: ReadonlyArray<{ readonly x: number; readonly z: number; }>; /** Fishing pegs on the banks beside them (stand-ins): style is the side the peg faces. */ export declare const MILLSTREAM_PEGS: ReadonlyArray<{ readonly id: string; readonly x: number; readonly z: number; readonly style: 'e' | 'w'; }>; /** The discovery zones, smallest first (types expandedContracts.ts INSERTED_DISCOVERY_ZONES): the three dens, then the hamlet. */ export declare const MILLSTREAM_ZONES: ReadonlyArray<{ readonly id: string; readonly label: string; readonly box: MsBox; }>; export declare const MILLSTREAM_ZONE_IDS: readonly string[]; export declare const MILLSTREAM_DISCOVERY_ZONES: readonly DiscoveryZone[]; /** The paper-map labels (the dens take theirs from their zones). */ export declare const MILLSTREAM_MAP_LABELS: readonly { readonly x: number; readonly z: number; readonly label: string; }[]; export declare const MILLSTREAM_PLACE_TEXT = "Millstream Hamlet lies south of Brindlecross, down Millstream Road from the crossroads, for levels 10 to 18: the bakery on the green (Gilda Roe and the day's baking order), the mill on the Millstream below the Mill Pond (Miller Hamish Burr, who grinds wheat into flour for nothing), the herbalist's cottage with a free cauldron, and Farmer Dunstan Fell's three wheat plots. The stream runs on south past a ford of stepping stones to three fishing pegs. Over the ford and east, Stag Meadow holds a herd of bristlehart stags and Piers Lowther's lost wagon; the Hedgerow Thicket east of the pond hides hedge-thieves, and boars have taken the old Bean Row Burrow west of the farm."; //# sourceMappingURL=millstreamHamlet.d.ts.map