import type { HerbKind } from './potionMaking.js'; /** * RINGS 4 AND 5, THE DARK HEART AND THE CORE (PvP woods by level, item 6; design sheets pvp-woods-b03, b04 and b06; James, 2026-10-17; * plan `.cursor/task-plans/2026-10-17-rings-4-5.md`). Pure data with type-only side effects, so the dresser, the aggro rules, the warnings, the * guide and the tests all read the same tiles. Every number is a WORLD tile or a PLACEHOLDER for the balance pass. * * What the audit found (2026-10-17): the rings are SQUARES by inset from the woods' edge (zones.ts combatZoneAt): Ring 4 is inset 135-179, Ring 5 from 180 * (x 420-507, z 437-524), and Ring 5 lies wholly inside the Blood Lake's crag ring, which is already a walk gate (areaGates.ts 'blood-lake', Combat 50) with * every dragon a boss (level 50-54, fight gate 'boss-dragons'). So the Core's gate is not rebuilt: it stays the boss placeholder, and this file builds the * APPROACH to it. What is new, all in Ring 4: * * - the Ironjaw track and the six Ironjaw hunters (levels 32-35) between the Ironjaw Watch and the fortress's outposts: the step on the ogre ladder * below the outposts (38), the fortress yard (41+ gate) and the chief (boss 50); * - the two single-file planks over the Blood River, beside the main bridge: the crossing set piece (one at a time, so a stand-off is a duel line); * - silver seams (Mining 33) on the dragon approach and bloodroot and marsh marigold on the river's banks: better ores and herbs by depth; * - the Blood Lake approach: a placard that names the place and one line in the standard gate sentence. * * Not built, on James's rules: no safe post or pocket, no bank or strongbox, no shop of any kind, no food, no runes or magic, nothing 41+ opened. */ export declare const DARK_HEART_RING = 4; export declare const CORE_RING = 5; type Box = { minX: number; maxX: number; minZ: number; maxZ: number; }; /** The row the track forks on (the arms are the three rows round it). */ export declare const IRONJAW_FORK_Z = 397; /** * A three-wide dirt track from the row north of the Ironjaw Watch up to a fork, an arm to each outpost's line and a stub pointing the arm at the fire. * The east arm and stub run on past Ring 4's east edge (x 552) because the east outpost lies in Ring 3; the hunters and everything that pays stay in Ring 4. */ export declare const IRONJAW_TRACK: readonly Box[]; export declare function onIronjawTrack(x: number, z: number): boolean; /** Every track tile once. */ export declare function ironjawTrackTiles(): { x: number; z: number; }[]; export declare const IRONJAW_HUNT_NAME = "The Ironjaw Hunting Ground"; /** Where the hunters lock on to a player: all Ring 4, its far edge short of the outposts' zone and its near edge a long way from the Watch. */ export declare const IRONJAW_HUNT_GROUND: Box; /** Their level: a step below the outposts' level 38 ogres. */ export declare const IRONJAW_HUNTER_LEVEL: { readonly min: 32; readonly max: 35; }; /** Their hardest hit: the outposts' 22 less four. */ export declare const IRONJAW_HUNTER_MAX_HIT = 18; /** A little smaller than the ogres at the outposts and in the yard (the visual size sent to clients). */ export declare const IRONJAW_HUNTER_SCALE = 0.92; /** The id prefix that tells a hunter from the fortress's ogres (the fortress's aggro rule skips it). */ export declare const IRONJAW_HUNTER_ID_PREFIX = "ijh-"; /** Three parties of two: one on the west ground, one on the middle, one at the fork where the stem divides. */ export declare const IRONJAW_HUNTERS: readonly { party: 'west' | 'middle' | 'fork'; x: number; z: number; }[]; /** A character below this Combat level is warned once. */ export declare const IRONJAW_HUNT_WARN_BELOW_COMBAT = 28; /** How close to a party (tiles, Chebyshev) the line is said: well outside the ogres' 6-tile notice. */ export declare const IRONJAW_HUNT_WARN_RANGE = 14; /** The `discoveredZones` key, said once per character. */ export declare const IRONJAW_HUNT_WARNED_KEY = "warned-ironjaw-hunt"; export declare const IRONJAW_HUNT_WARNING_LINE = "Ironjaw hunting parties walk the ground ahead: level 32 to 35 ogres, two to a party, and they will chase you across it. The Watch behind you is safe; out here anyone can attack you. Keep clear, or come back at Combat 30 or more."; /** True when a hunter's post is within the warning range of this tile. */ export declare function ironjawHuntNear(x: number, z: number): boolean; /** True when this character should hear the line now. */ export declare function shouldWarnIronjawHunt(x: number, z: number, combat: number, alreadyWarned: boolean): boolean; /** * The crossing set piece: the Blood River has one main bridge (three planks wide, on the gate path at x 452), so everyone who goes deeper funnels through it. * Two single-file planks, one each side, give the river three crossings of three characters: the open bridge, and two narrow planks where one person * crosses at a time. The deck is the river's own water tiles in that column, laid as the game's `bridge` entity; each end has a short landing. */ export declare const BLOOD_PLANKS: readonly { id: 'west-plank' | 'east-plank'; name: string; x: number; }[]; /** How far past the river's own edge the deck's column is searched for water (the banks are jittered by a tile or two). */ export declare const BLOOD_PLANK_REACH = 3; /** The plank whose column and river rows this tile is, or null. */ export declare function bloodPlankAt(x: number, z: number): (typeof BLOOD_PLANKS)[number] | null; /** Five silver seams (Mining 33, an iron pickaxe) on the dragon approach, between the river and the crag ring, off the gate path. */ export declare const DARK_HEART_SILVER_SEAMS: readonly { x: number; z: number; }[]; /** Bloodroot (Foraging 18) and marsh marigold (29) on the river's banks by the planks; the dresser takes the nearest tile that suits. */ export declare const DARK_HEART_HERBS: readonly { herb: Extract; x: number; z: number; }[]; /** * The way up from the main bridge to the pillared gap is the Core's approach. The gate itself is the existing walk gate 'blood-lake' (Combat 50: every dragon * is a boss); this adds a placard that only names the place, beside the path, and one chat line for a character the gate would turn back, worded by * gateRefusalText so it is the standard sentence. */ export declare const BLOOD_LAKE_APPROACH: { readonly sign: { readonly x: 456; readonly z: 527; readonly text: "The Blood Lake"; }; }; export declare const BLOOD_LAKE_APPROACH_RANGE = 16; export declare const BLOOD_LAKE_APPROACH_KEY = "warned-blood-lake-approach"; export declare function bloodLakeApproachNear(x: number, z: number): boolean; /** The gate's own refusal sentence for a character the gate would turn back, or null for one it would let in. */ export declare function bloodLakeApproachLine(combat: number): string | null; export {}; //# sourceMappingURL=darkHeart.d.ts.map