/** * The people of Bramble Fair Green (James, 2026-10-08, from ChatGPT's design sheets bramble-fair-npc-marshal, * -merchant, -drover and -stallholder; the sheets name only the roles, the names are ours). Four named villagers (the * `resident` kind, dressed by name like Farmhand Joss) stand where the sheets put them, and each takes three * repeatable requests: bring what it asks for, get coins and that request's skill XP, once per request per hour per * player. Two requests (the Stallholder's Demand of the Day and the Merchant's Best Price Today) name a different fair * good each hour, the same for everyone. * * The backend's fairFolk.ts runs the hand-ins; the frontend lists the same requests in the person's menu from here. */ import type { StorySkill } from './storyQuests.js'; export type FairFolkId = 'marshal' | 'merchant' | 'drover' | 'stallholder' | 'orchardist' | 'fisher' | 'shepherd' | 'scarecrower' | 'lia' | 'hedger' | 'innkeeper' | 'ostler' | 'miller' | 'pikefisher' | 'tinker' | 'tollkeeper' | 'feller' | 'coalburner' | 'trapper' | 'huntswoman' | 'copsedrover' | 'watchman' | 'warden' | 'tollclerk' | 'hopfarmer' | 'beaconkeeper' | 'covefisher' | 'landlady' | 'wakeinnkeeper' | 'wakeclerk' | 'wakelookout' | 'wakewarden' | 'orchardkeeper' | 'orchardcarter' | 'weighmaster' | 'weighcarter' | 'mastkeeper' | 'flagman' | 'digmaster' | 'shellwright' | 'fenwarden' | 'fenbellman' | 'pilewright' | 'reedcutter' | 'lamplighter' | 'salvagemaster' | 'boatwright' | 'netmender' | 'forester' | 'ironjawcaptain' | 'saltworker' | 'shellfisher' | 'shoreforager' | 'beaconwatch' | 'quaymaid' | 'potter' | 'kilnmaster' | 'bargewright' | 'hookscout' | 'quarrymaster' | 'hauler' | 'markerman' | 'quarrylookout' | 'sluicekeeper' | 'reeder' | 'marshfisher' | 'wheelwright' | 'ferryman' | 'isleangler' | 'islekeeper' | 'islesalvager' | 'signalwarden' | 'signalscout' | 'signalsalvager' | 'winchkeeper' | 'afmapper' | 'afsmith' | 'afsurvivor' | 'afscout' | 'afwarden' | 'afcook' | 'prsurveyor' | 'prcarter' | 'prsmith' | 'prscout' | 'prsentry' | 'prcook' | 'mlmiller' | 'mlfarmer' | 'mlherbalist' | 'mlcarter' | 'mlbaker' | 'rrcaptain' | 'rrtracker' | 'rrfletcher' | 'rrcook' | 'rrkennelman' | 'rrwarden'; export type FairPerson = { id: FairFolkId; name: string; /** Where they stand (world tiles) and the tile they look at. */ x: number; z: number; faceX: number; faceZ: number; /** What the menu calls the list of requests. */ requestsLabel: string; }; export declare const FAIR_FOLK_NAMES: { readonly marshal: "Fair Marshal Hobb"; readonly merchant: "Merchant Perrin"; readonly drover: "Drover Alwyn"; readonly stallholder: "Stallholder Maud"; readonly orchardist: "Orchardist Mairin"; readonly fisher: "Nell the Fisher"; readonly shepherd: "Bren the Shepherd"; readonly scarecrower: "Tams the Scarecrow-Maker"; readonly lia: "Lia"; readonly hedger: "Old Heth the Hedger"; readonly innkeeper: "Ma Tern"; readonly ostler: "Ned the Ostler"; readonly miller: "Miller Hobb"; readonly pikefisher: "Old Pike Tamsin"; readonly tinker: "Jory the Tinker"; readonly tollkeeper: "Toiler Wren"; readonly feller: "Tarn the Feller"; readonly coalburner: "Bram Coalhand"; readonly trapper: "Nell Quickfoot"; readonly huntswoman: "Hestia Roe"; readonly copsedrover: "Mallin the Drover"; readonly watchman: "Garrick the Watchman"; readonly warden: "Warden Osric"; readonly tollclerk: "Dunstan Pell"; readonly hopfarmer: "Hettie Hopwood"; readonly beaconkeeper: "Old Marrow"; readonly covefisher: "Pilchard Pru"; readonly landlady: "Moll Marchfoot"; readonly wakeinnkeeper: "Mara Quill"; readonly wakeclerk: "Clerk Anselm Vale"; readonly wakelookout: "Gil the Lookout"; readonly wakewarden: "Warden Lysa Thorn"; readonly orchardkeeper: "Keeper Wynn Ashby"; readonly orchardcarter: "Carter Hob Ledbetter"; readonly weighmaster: "Weighmaster Orsel Tamm"; readonly weighcarter: "Carter Dane Hallow"; readonly mastkeeper: "Mastkeeper Edda Rime"; readonly flagman: "Flagman Tobin Sark"; readonly digmaster: "Digmaster Hale Brant"; readonly shellwright: "Shellwright Nan Orrick"; readonly fenwarden: "Marsh Warden Rufus Fenn"; readonly fenbellman: "Bellman Ned Tallow"; readonly pilewright: "Pilewright Orla Dunn"; readonly reedcutter: "Reedcutter Pim Harrow"; readonly lamplighter: "Lamplighter Odo Thrale"; readonly salvagemaster: "Salvage-Master Ketty Brine"; readonly boatwright: "Boatwright Corran Sund"; readonly netmender: "Net-Mender Wenna Pike"; readonly forester: "Forester Imre Thorne"; readonly ironjawcaptain: "Scout-Captain Maren Voss"; readonly saltworker: "Tamsin Vale"; readonly shellfisher: "Old Bren"; readonly shoreforager: "Lysa Reed"; readonly beaconwatch: "Corin Hale"; readonly quaymaid: "Nell Marsh"; readonly potter: "Potter Mara"; readonly kilnmaster: "Kilnmaster Hobb"; readonly bargewright: "Bargewright Pell"; readonly hookscout: "Scout Teren"; readonly quarrymaster: "Quarrymaster Jorr"; readonly hauler: "Hauler Bess"; readonly markerman: "Marker Penn"; readonly quarrylookout: "Lookout Sive"; readonly sluicekeeper: "Sluicekeeper Hett"; readonly reeder: "Reeder Marn"; readonly marshfisher: "Fisher Pol"; readonly wheelwright: "Wheelwright Sena"; readonly ferryman: "Ferryman Joryn Tide"; readonly isleangler: "Nessa Cleat"; readonly islekeeper: "Keeper Bram Hillock"; readonly islesalvager: "Salvager Tess Drift"; readonly signalwarden: "Warden Elric Vane"; readonly signalscout: "Scout Ysra Kell"; readonly signalsalvager: "Salvager Brann Oake"; readonly winchkeeper: "Winch Keeper Dorran Hale"; readonly afmapper: "Ventmapper Isolde Pryce"; readonly afsmith: "Smith Garrick Tindall"; readonly afsurvivor: "Marta Linn"; readonly afscout: "Scout Wren Aldous"; readonly afwarden: "Hold-Warden Beric Hollin"; readonly afcook: "Odile Marsh"; readonly prsurveyor: "Surveyor Ilse Marren"; readonly prcarter: "Carter Jory Ashby"; readonly prsmith: "Smith Brannoch Veld"; readonly prscout: "Scout Hesper Quill"; readonly prsentry: "Sentry Dane Orrin"; readonly prcook: "Nora Pike"; readonly mlmiller: "Miller Hamish Burr"; readonly mlfarmer: "Farmer Dunstan Fell"; readonly mlherbalist: "Herbalist Wenna Thatch"; readonly mlcarter: "Carter Piers Lowther"; readonly mlbaker: "Gilda Roe"; readonly rrcaptain: "Ranger-Captain Sabine Thorley"; readonly rrtracker: "Tracker Idris Mallow"; readonly rrfletcher: "Fletcher Lorcan Teague"; readonly rrcook: "Mags Fernley"; readonly rrkennelman: "Kennelman Dob Harrow"; readonly rrwarden: "Warden Corra Haldane"; }; /** At the ring's gate, at the wagon's open back, between the two pens, and in front of the striped stalls. */ export declare const FAIR_FOLK: readonly FairPerson[]; export declare function fairPersonByName(name: string | undefined): FairPerson | undefined; export type FairRequest = { id: string; npc: FairFolkId; /** The request's name on the sheet, e.g. "Fence Mending". */ title: string; /** What is asked for, e.g. "10 birch wood". For a demand request the item is picked by the hour. */ label: string; kind: string; qty: number; coins: number; skill: StorySkill; xp: number; /** 'demand' or 'bestprice': the item, quantity, skill and XP come from fairDemandForHour. */ demand?: 'demand' | 'bestprice'; }; /** Three each, from the sheets' "Repeatable fair requests"; the livestock-handling ones wait for the animals to be built. */ export declare const FAIR_REQUESTS: readonly FairRequest[]; /** The goods the fair wants by the hour (the demand board). XP is paid in the skill that gathers it. */ export declare const FAIR_DEMAND_POOL: readonly { kind: string; label: string; qty: number; skill: StorySkill; xp: number; }[]; export declare const FAIR_REQUEST_HOUR_MS: number; export declare const FAIR_REQUESTS_ACTION = "fairreqs"; export declare const FAIR_REQUEST_ACTION_PREFIX = "fairreq:"; /** The hour a moment falls in (UTC); the demand board and every request's cool-down turn over with it. */ export declare function fairHour(nowMs: number): number; type DemandGood = (typeof FAIR_DEMAND_POOL)[number]; /** * The two goods in demand this hour: the demand board's (the Stallholder's) and the day's best price (the Merchant's). * They are never the same good, and neither is a good its own person already asks for in a fixed request (so the * Stallholder's demand is never honey or cider, the Merchant's never flour or bread). */ export declare function fairDemandForHour(hour: number): { demand: DemandGood; bestprice: DemandGood; }; /** A request as it reads this hour: a demand request takes the hour's good, quantity, skill and XP. */ export declare function fairRequestForHour(request: FairRequest, hour: number): FairRequest; export declare function fairRequestsFor(npc: FairFolkId, hour: number): FairRequest[]; /** What a player has done this hour (saved with the character). */ export type FairFolkState = { hour: number; done: string[]; }; export declare function emptyFairFolkState(): FairFolkState; /** A saved record read back: only real request ids and contest marks, no repeats, and a whole hour. */ export declare function normalizeFairFolkState(raw: unknown): FairFolkState; export {}; //# sourceMappingURL=fairFolk.d.ts.map