export declare const HERB_PATCH_KIND = "herbpatch"; export declare const CAULDRON_KIND = "cauldron"; export declare const VIAL_OF_WATER_KIND = "vialofwater"; export declare const EMPTY_VIAL_KIND = "emptyvial"; export declare const PESTLE_AND_MORTAR_KIND = "pestleandmortar"; /** Corvin Hale's torn recipe notes, from his satchel in the Rat Tunnel (Tansy's Cauldron). */ export declare const CORVINS_NOTES_KIND = "corvinsnotes"; export type HerbKind = 'wildthyme' | 'beardlichen' | 'glowcap' | 'pineresin' | 'watermint' | 'hawkweed' | 'bloodroot' | 'ironwort' | 'nightshade' | 'stormbloom' | 'samphire' | 'marshmarigold' | 'frostlichen'; export type HerbInfo = { name: string; /** Foraging level to pick it. */ level: number; /** Foraging XP per pick. */ xp: number; /** How long a picked patch stands bare. */ regrowMs: number; /** Where it grows, for the guide and the examine line. */ where: string; /** What the patch says when it is picked bare. */ bare: string; /** What the player says as they pick it. */ pick: string; /** * Not from a patch: Pine Resin comes off a pine or spruce as it is felled (PINE_RESIN_CHANCE, Woodwork * PINE_RESIN_WOODWORK_LEVEL), so its level is a Woodwork level and it pays no Foraging XP. */ fromFelling?: boolean; }; /** * Glowcap is Foraging 5, not the plan's 8: Tansy's Cauldron sends you for three * before you could have trained it, and the Rat Tunnel already asks Explorer 5 * and combat 5 at its mouth. */ export declare const HERBS: Record; /** Pine Resin off a felled pine or spruce: the chance a fell yields a lump, and the Woodwork it wants. */ export declare const PINE_RESIN_CHANCE = 0.1; export declare const PINE_RESIN_WOODWORK_LEVEL = 10; export declare const HERB_KINDS: HerbKind[]; export declare function isHerbKind(value: unknown): value is HerbKind; /** A patch's style: the herb when grown, `-picked` while it grows back. */ export declare function herbPatchStyle(herb: HerbKind, grown: boolean): string; export declare function parseHerbPatchStyle(style: string | undefined): { herb: HerbKind; grown: boolean; } | null; /** * Stormbloom's spots in the Arcane Realms' zone-local frame (arcaneLands.ts: x east 0..299, z south 0..199): three on * the banks of Runed Lake, three on the Arcanum's terrace, four on top of the Zephyr Cliffs. */ export declare const STORMBLOOM_LOCAL_SPOTS: ReadonlyArray; /** * The Foraging 20-40 herbs (2026-10-14): their patches are placed by the backend's laterHerbs.ts in the FINAL world * (after the south expansion, the starter zones and the Western Kingdoms are laid), not by map.ts placePotionMaking, * which runs in the generator's frame. Their HERB_PATCH_SPOTS are final-frame world tiles. */ export declare const LATER_HERB_KINDS: readonly HerbKind[]; /** Rock Samphire's spots at Lantern Wake's tide pools (world tiles, sand between the pools; lanternWakeShore.ts). */ export declare const WAKE_SAMPHIRE_SPOTS: ReadonlyArray; /** * Where the patches grow, world tiles. The builder (map.ts placeHerbPatches) puts * each on the nearest free standable tile to its spot, so a spot is a place, not a * promise. The Rat Tunnel's glowcaps are in its first two rooms, among the rats and * short of Livonia, so the quest never asks you to beat her. */ export declare const HERB_PATCH_SPOTS: ReadonlyArray<{ herb: HerbKind; x: number; z: number; }>; /** * The two banks phase 1b adds where the herbs were far from one (the plan: 250-470 tiles): a strongbox at the * Northern Gate garrison's camp (ironwort, the Snowfields' woodcutters), and a field chest in the soldiers' camp * at the south end of the battlefield bridge (bloodroot). Kind bankchest, placed on the nearest free tile. */ export declare const POTION_BANK_SPOTS: ReadonlyArray<{ id: string; x: number; z: number; }>; /** The Rat Tunnel's glowcaps and Corvin's satchel, as offsets from the tunnel's centre line (DUNGEON_CENTER_X). */ export declare const GLOWCAP_TUNNEL_SPOTS: ReadonlyArray<{ dx: number; z: number; }>; /** Corvin's satchel lies by the glowcaps in the rat pit's north-west corner (questprop `satchel:corvin`). */ export declare const CORVIN_SATCHEL_SPOT: { readonly dx: -8; readonly z: 61; }; export declare const CORVIN_SATCHEL_PROP = "satchel"; /** * Calverton's potion shop, Tansy's shop (the stone house `potion`, facing east * on the square). Its cauldron is a `cauldron` entity in the back corner where * the room's old drawn one stood; Tansy stands beside it on the shop floor. */ export declare const TANSY_NPC_KIND = "apothecary"; export declare const TANSY_NAME = "Tansy Blackwood"; export type PotionTier = 'mini' | 'full'; export type PotionRecipe = { /** The potion made, also the recipe's id. */ output: string; tier: PotionTier; /** Potion Making level. */ level: number; /** Potion Making XP per brew. */ xp: number; herb: HerbKind; /** A full potion's second ingredient, one of an item the game already drops. */ second?: string; }; /** A mini and a full potion for each herb: phase 1a's six, then phase 1b's twelve (all eighteen). */ export declare const POTION_RECIPES: readonly PotionRecipe[]; export declare function potionRecipe(output: unknown): PotionRecipe | null; /** Every ingredient a recipe takes, one of each. */ export declare function potionIngredients(r: PotionRecipe): string[]; /** One brew every BREW_INTERVAL_MS while the player stands at the cauldron. */ export declare const BREW_INTERVAL_MS = 2400; /** How far from the cauldron a player may brew (Chebyshev tiles), as the blacksmith's stations. */ export declare const BREW_RANGE = 2; /** * The chance a brew spoils: the herb (and a full potion's second ingredient) is * lost, the vial kept. A third at the recipe's own level, falling evenly to none * SPOIL_CLEAR_LEVELS above it, as burning does in cooking. */ export declare const SPOIL_CLEAR_LEVELS = 15; export declare function brewSpoilChance(playerLevel: number, recipeLevel: number): number; /** Tansy's prices: a Vial of Water, a spare Pestle and Mortar, and what she pays for an empty vial. */ export declare const VIAL_OF_WATER_PRICE = 3; export declare const PESTLE_AND_MORTAR_PRICE = 150; export declare const EMPTY_VIAL_BUY_PRICE = 1; /** * What drinking does. A mini potion is +1 or +2 for 15 minutes, as it always was; * a full one +3 or +4 for 20 minutes (James agreed, 2026-09-30). One boost per * stat at a time: a new potion replaces the old boost. The stats are as the * boost panel keys them (`precision` is Weapon Mastery). */ export type PotionEffect = { stat: string; min: number; max: number; minutes: number; }; export declare const POTION_EFFECTS: Record; /** * The energy potions (2026-10-09): what each gives back of the energy bar (energy.ts ENERGY_MAX), and nothing else. * They are not stat boosts, so they are not in POTION_EFFECTS and never show in the boost panel. */ export declare const POTION_ENERGY: Record; export declare function isEnergyPotion(kind: unknown): kind is string; /** Energy after drinking `kind`, clamped to ENERGY_MAX; unchanged for anything that is not an energy potion. */ export declare function energyAfterPotion(energy: number, kind: string): number; /** Why an energy potion is not drunk now (already full: the bottle is kept), or null when it may be. */ export declare function energyPotionRefusal(energy: number, potionName: string): string | null; /** * The potions a player can come by: every one with a recipe (all eighteen since phase 1b, twenty with the energy pair). The guide's Items * page lists only these, so a potion without a recipe would stay hidden. */ export declare const BREWABLE_POTIONS: readonly string[]; /** Items that belong to the skill and are shown now it is back. */ export declare const POTION_MAKING_ITEM_KINDS: readonly string[]; /** * Spots inside a potion shop (the stone house `potion`, interiorFurniture.ts's local * space: door at +z, back wall at -z, one unit to the tile). The cauldron stands in * the back left corner past the counter's end, where the room's drawn one was; the * keeper stands beside it on the shop floor. potionRoomTile turns one by the house's * facing exactly as visitFurnitureTiles does, so it lands on the same tiles. */ export declare const POTION_ROOM_CAULDRON: { readonly x: -3.1; readonly z: -2.5; }; /** * Tansy stands on the shop floor at the counter's front, a step from her cauldron, not behind the counter: * the floor behind it is walled in by the counter and the cauldron, and a walk-up to her there aimed at * the counter ("You can't get there from here"). Not beside the cauldron either: from the game's camera * she stood in front of it and took every click meant for it (2026-09-30, the live check). */ export declare const POTION_ROOM_KEEPER: { readonly x: -1; readonly z: -1; }; export declare function potionRoomTile(cx: number, cz: number, facing: 'n' | 's' | 'e' | 'w', local: { x: number; z: number; }): { x: number; z: number; }; //# sourceMappingURL=potionMaking.d.ts.map