/** * THE OUTER WOODS AND THE DEEP WOODS: Rings 2 and 3 of the Dreadwoods PvP square (PvP woods by level, NEXT_STEPS item 6; design sheets pvp-woods-b02 "Ring 3, the Deep * Woods" and b06 "gathering and crafting by ring"; the filed b01 is the Border's sheet, so Ring 2 is designed from the brief; 2026-10-17). * * The audit (the built world, 2026-10-17) found the two rings thin exactly where the sheets say they should pay: no herb patch, no tree a player could fell and * no seam outside the Mine yard (3 copper, 1 tin, 2 iron) and Gallowmere's Old Mine anywhere in Rings 2 or 3, and nothing at all for levels 10-20 in Ring 2. This * file is the data for the gaps, in the rings by the SQUARE rule (types zones.ts combatZoneAt: Ring 2 is inset 45-89 from the woods' edge, Ring 3 inset 90-134): * * RING 2, THE OUTER WOODS (levels about 10-20; players fight within 10 levels) * - the SPOIL HEAPS north of the Mine yard: four iron seams (Mining 15) and two tin (Mining 5), on the Heaps Track from the yard's south-west way in; * - the BANK BEDS on the Blood River's south bank: hawkweed (Foraging 14) and bloodroot (Foraging 18); * - the HARDY STAND north of the yard's knoll: the last living trees on the east side, pine (Woodwork 10), spruce (15) and hazel (20) to fell; * - the GRAVE-CUT in the south-west, north of the Crypt Grounds: iron, tin, hawkweed, pine and spruce; * - three WOLF PACKS (the game's own `wolf`, level 12-14, which drops wolf pelts and fangs): two on the east strip, one in the south-west. * RING 3, THE DEEP WOODS (levels about 18-28; players fight within 15 levels) * - the DEEPWOOD STAND south of the Rotwood Grove and the Forester's camp: alder (Woodwork 25), ironwort (Foraging 22) and nightshade (Foraging 25); * - the DEEPWOOD CUT south of it: coal (Mining 22) and iron (Mining 15); * - the MIRE RIM: marsh marigold (Foraging 29) on the Blood Mire's north rim. * * Two people give work at the two ends: Foreman Hobb Garrow at the Mine yard (six jobs, Combat 10-16) and Reeve Maud Ellery at the Deepwood Stand (five jobs, Combat * 18-24), each beside a Bounty Board (the generic one: every contract on every board). Every job is an existing mechanic: the story runner's reach, deliver, kill and * talk steps. The pay is small placeholders for the balance pass. * * HARD CONSTRAINTS (James, 2026-10-17): NO safe post or pocket (these are open ground: any player may strike you there, nobody may eat in a fight), NO bank or * strongbox (banks are in the towns), NO stall that sells food, no signs but place names, no litter, no runes or magic items. The goods are mined, picked, felled * or hunted by the player. Nothing here is a new item (new gear and its drops are the gear ladder's). * * Abuse-first: a job is one-time per character (the story runner never offers a finished one and never pays twice); a hand-in without the goods moves nothing; * kills count only the player's own, and the wolf and moss-wolf jobs count only kills inside their box; a seam, herb patch or tree is the game's own shared node (it * empties and refills on its own clock, so camping a belt farms nothing the refill clock does not allow). The pay never comes from killing a player. * * Every position is a WORLD tile in the final frame. The levels written here are checked equal to the game's own tables in scripts/woods-belts-test.mjs (this file * takes no runtime import from potionMaking, mining or woodwork: storyQuests reads it while they load). * Types only from storyQuests.ts and campStations.ts (erased imports), so storyQuests.ts can spread WOODS_JOB_QUESTS without a cycle. */ import type { StoryQuestDef } from './storyQuests.js'; import type { CampStation } from './campStations.js'; export declare const WOODS_RINGS_NAME = "The Outer and Deep Woods"; export type WoodsBeltId = 'spoil-heaps' | 'bank-beds' | 'hardy-stand' | 'grave-cut' | 'deepwood-stand' | 'deepwood-cut' | 'mire-rim'; export type WoodsPieceKind = 'orerock' | 'herbpatch' | 'tree'; export type WoodsBelt = { id: WoodsBeltId; /** The ring it sits in (types zones.ts combatZoneAt) and the level band it is for. */ ring: 2 | 3; name: string; /** The belt's centre: its pieces are offsets from it. */ x: number; z: number; /** The Combat band the belt is for (Rings 2 and 3 read 10-20 and 18-28; the work's own gates are the skills below). */ band: string; /** What is there, for the guide and the helper. */ what: string; }; export declare const WOODS_BELTS: readonly WoodsBelt[]; export type WoodsPiece = { id: string; belt: WoodsBeltId; kind: WoodsPieceKind; style: string; dx: number; dz: number; }; export declare const WOODS_PIECES: readonly (WoodsPiece & { x: number; z: number; ring: 2 | 3; })[]; /** The Mining, Foraging and Woodwork level each style asks (equal to the game's own tables: woods-belts-test.mjs). */ export declare const WOODS_PIECE_LEVEL: Readonly>; /** How far a seam, patch or tree may move to find a free tile (the backend's placer; checked in the smoke). */ export declare const WOODS_PIECE_SEARCH = 3; /** * Three wolf packs in Ring 2, the game's own `wolf` (level 12-14, wolf pelt 40% and fang 5%, the snow's first trade good: Fenwick at the Northern Gate buys the pelts). * They lunge at anyone within four tiles and give up at seven (the overworld wolves' own rule) and wander three from their spot, so a pack's danger reaches about seven tiles: every pack stands at least eight tiles from every seam, patch and tree, so a hunter can work a belt and meets a pack only on the way between belts or by going to it. */ export type WoodsWolfPack = { id: string; ring: 2; name: string; spots: ReadonlyArray<{ x: number; z: number; }>; }; export declare const WOODS_WOLF_PACKS: readonly WoodsWolfPack[]; export declare const WOODS_WOLF_ID_PREFIX = "woods-wolf-"; /** How far a pack wolf wanders from its spot. */ export declare const WOODS_WOLF_LEASH: { readonly radius: 3; readonly speed: 0.9; }; /** The east strip's box: only wolves put down here count for Wolves at the Heaps (the Spoil Heaps' packs and the Bank Beds'). */ export declare const WOODS_EAST_STRIP_BOX: { readonly minX: 598; readonly maxX: 642; readonly minZ: 548; readonly maxZ: 616; }; /** Dirt tracks (surface only, two wide): the Heaps Track from the yard's south-west way in, and the Deepwood Track from the Forester's camp. */ export declare const WOODS_TRACKS: ReadonlyArray<{ id: string; name: string; w: number; pts: ReadonlyArray<[number, number]>; }>; /** Signs only name places (the placard signpost). */ export declare const WOODS_SIGNS: ReadonlyArray<{ id: string; x: number; z: number; text: string; }>; export declare const WOODS_BOARD_IDS: { readonly yard: "camp-board-yard"; readonly deepwood: "camp-board-deepwood"; }; /** Two generic Bounty Boards in the open (NOT a safe post: no bank, no stall, no pocket), laid by the backend's campStations.ts with the others. */ export declare const WOODS_BOUNTY_BOARDS: readonly CampStation[]; export declare const WOODS_FOREMAN: { readonly name: "Foreman Hobb Garrow"; readonly x: 610; readonly z: 651; readonly faceX: 608; readonly faceZ: 650; }; export declare const WOODS_REEVE: { readonly name: "Reeve Maud Ellery"; readonly x: 348; readonly z: 448; readonly faceX: 346; readonly faceZ: 447; }; export declare const YARD_JOB_IDS: readonly ["yardHeaps", "yardTin", "yardIron", "yardHerbs", "yardWolves", "yardProps"]; export type YardJobId = (typeof YARD_JOB_IDS)[number]; export declare const DEEP_JOB_IDS: readonly ["deepAlder", "deepIronwort", "deepNightshade", "deepCoal", "deepMossWolves"]; export type DeepJobId = (typeof DEEP_JOB_IDS)[number]; export declare const WOODS_JOB_IDS: readonly ["yardHeaps", "yardTin", "yardIron", "yardHerbs", "yardWolves", "yardProps", "deepAlder", "deepIronwort", "deepNightshade", "deepCoal", "deepMossWolves"]; export type WoodsJobId = YardJobId | DeepJobId; /** Combat levels (placeholders). The skills the goods ask (Mining, Foraging, Woodwork) are in WOODS_PIECE_LEVEL and said on each step. */ export declare const WOODS_JOB_COMBAT: Readonly>; /** What each hand-in asks (placeholders). */ export declare const WOODS_JOB_GOODS: { readonly yardTin: { readonly kind: "tin"; readonly qty: 8; }; readonly yardIron: { readonly kind: "iron"; readonly qty: 6; }; readonly yardHawkweed: { readonly kind: "hawkweed"; readonly qty: 4; }; readonly yardBloodroot: { readonly kind: "bloodroot"; readonly qty: 3; }; readonly yardPine: { readonly kind: "pinewood"; readonly qty: 8; }; readonly yardSpruce: { readonly kind: "sprucewood"; readonly qty: 6; }; readonly deepAlder: { readonly kind: "alderwood"; readonly qty: 10; }; readonly deepIronwort: { readonly kind: "ironwort"; readonly qty: 4; }; readonly deepNightshade: { readonly kind: "nightshade"; readonly qty: 4; }; readonly deepCoal: { readonly kind: "coal"; readonly qty: 8; }; }; /** Kill counts (placeholders), sized under the packs (ten wolves in three packs) and the Grove's moss wolves (four, plus the Hunt's brood). */ export declare const WOODS_JOB_KILLS: { readonly yardWolves: 6; readonly deepMossWolves: 8; }; /** The Rotwood Grove's box (types rotwoodGrove.ts: centre 330,380, half-extents 22 x 17): only moss wolves put down inside it count. */ export declare const WOODS_GROVE_BOX: { readonly minX: 308; readonly maxX: 352; readonly minZ: 363; readonly maxZ: 397; }; export declare const WOODS_JOB_QUESTS: Readonly>; export declare const WOODS_JOB_META: Readonly>; export declare const WOODS_JOB_GIVER_PLACES: Readonly>; //# sourceMappingURL=woodsBelts.d.ts.map