export declare const WOODWORK_TREE_LEVELS: { readonly birch: 1; readonly poplar: 5; readonly pine: 10; readonly spruce: 15; readonly hazel: 20; readonly alder: 25; readonly ash: 30; readonly beech: 35; readonly oak: 40; }; export type WoodworkTreeId = keyof typeof WOODWORK_TREE_LEVELS; export declare const BIRCH_WOOD_KIND = "birchwood"; export declare const POPLAR_WOOD_KIND = "poplarwood"; export declare const PINE_WOOD_KIND = "pinewood"; export declare const SPRUCE_WOOD_KIND = "sprucewood"; /** * Ash. The level-30 rung of WOODWORK_TREE_LEVELS existed with nothing behind * it; this is what fills it. Ash grows only in the East, only a handful of * trees at a time (see ASH_TREE_MAX_ALIVE), so ash logs are the scarce * ingredient the fly rod is gated on. */ export declare const ASH_WOOD_KIND = "ashwood"; /** How many ash trees stand in the whole East at once - felling one reseeds it elsewhere. */ export declare const ASH_TREE_MAX_ALIVE = 5; export declare const HAZEL_WOOD_KIND = "hazelwood"; export declare const ALDER_WOOD_KIND = "alderwood"; export declare const BEECH_WOOD_KIND = "beechwood"; export declare const OAK_WOOD_KIND = "oakwood"; export declare const FLY_FISHING_ROD_KIND = "flyfishingrod"; export declare const HEAVY_BEACH_CASTING_ROD_KIND = "heavybeachcastingrod"; /** * The pinnacle rod. Priced off the Salt & Sand Tackle board on the Long Pier, * which is where it is properly sold - Wilson and Sam keep it in stock at the * same price rather than undercutting the pier. */ export declare const HEAVY_BEACH_CASTING_ROD_PRICE = 100000; export declare const FLY_HOOK_KIND = "flyhook"; export declare const RAW_TROUT_KIND = "rawtrout"; export declare const COOKED_TROUT_KIND = "cookedtrout"; /** Buy the rod outright, or make one if you can find the ash. */ export declare const FLY_FISHING_ROD_PRICE = 15000; export declare const FLY_FISHING_ROD_WOODWORK_LEVEL: 30; export declare const FLY_FISHING_ROD_COST: Array<{ kind: string; qty: number; }>; export declare const FLY_FISHING_ROD_WOODWORK_XP = 900; export declare const HATCHET_KIND = "hatchet"; export declare const IRON_HATCHET_KIND = "ironhatchet"; export declare const STEEL_HATCHET_KIND = "steelhatchet"; export declare const FOLDING_SAW_KIND = "foldingsaw"; export declare const BROKEN_SAW_KIND = "brokensaw"; /** Forest Ranger sells a working saw for this many coins. */ export declare const FOLDING_SAW_PRICE = 30; /** Chance a working saw breaks on each woodwork action that uses one (from Woodwork SAW_SAFE_BELOW_WOODWORK up). */ export declare const SAW_BREAK_CHANCE = 0.01; /** * A beginner's saw never breaks (2026-10-01): at 1% an action the simulator's fresh character bought three * saws in its first eleven minutes of woodcutting, 30 coins each, when it had almost nothing. */ export declare const SAW_SAFE_BELOW_WOODWORK = 10; /** The chance a saw breaks on one woodwork action at this Woodwork level. */ export declare function sawBreakChance(woodworkLevel: number): number; /** * Birch only. Poplar and pine additionally gated the cart behind woodcut levels * 5 and 10, which put the first fast-travel far past the point it is useful. */ export declare const CARRIAGE_REPAIR_COST: Array<{ kind: string; qty: number; }>; /** Just above beginner birch work. The repair itself only spends birch. */ export declare const CARRIAGE_REPAIR_WOODWORK_LEVEL = 2; export declare const CARRIAGE_STYLE_BROKEN = "broken"; export declare const CARRIAGE_STYLE_FIXED = "carriage"; export declare const CARRIAGE_STYLE_DRIVEN = "driven"; /** Hired driver plus owned draft horse hitched to the shafts. */ export declare const CARRIAGE_STYLE_HITCHED = "hitched"; /** * True for the four-wheeled wagon styles of `farmcart` - the broken carriage * and every repaired state of it. The kind's other styles (barrow, plough, * harrow, hand cart, wreck) are small implements that share nothing with it * but the entity kind, which matters for footprints: see * blockingFootprintRadius. */ export declare function isCarriageStyle(style: string | undefined): boolean; /** Northwest battlefield lake bridge - a modest early Woodwork project. */ export declare const BATTLEFIELD_BRIDGE_REPAIR_COST: Array<{ kind: string; qty: number; }>; export declare const BATTLEFIELD_BRIDGE_REPAIR_WOODWORK_LEVEL = 15; /** Roughly a full spruce-tier craft plus the gather effort across four woods. */ export declare const BATTLEFIELD_BRIDGE_REPAIR_WOODWORK_XP = 1500; /** Building a new route across the battlefield is a major discovery. */ export declare const BATTLEFIELD_BRIDGE_REPAIR_EXPLORER_XP = 3330; export declare const RUPERT_ROW_BRIDGE_CROSSING_COST = 200; /** * Rowing north lands beside the goblin line (goblins are level 10-12; 12 is the Battlefield chain's own gate, T96: it was 10). Below this combat level Rupert warns * first and only rows on a second ask (2026-10-01: the simulator's newcomer paid its 200 coins and died there * three times at combat 4-9). */ export declare const RUPERT_ROW_ADVISED_COMBAT = 12; /** How long Rupert's warning stands: asking again within this rows you across. */ export declare const RUPERT_ROW_WARNING_MS = 60000; export declare const JOHN_SAFE_PASSAGE_COST = 250; export declare const BATTLEFIELD_BRIDGE_STYLE_BROKEN = "broken"; export declare const BATTLEFIELD_BRIDGE_STYLE_FIXED = "repaired"; /** * Personal gap span for a player who finished the quest. Shared world tiles * stay `broken`; only this viewer's chunk is rewritten, so the smashed * mid-span can look like a magical crossing without turning the whole deck * into a travel target. */ export declare const BATTLEFIELD_BRIDGE_STYLE_CROSSING = "crossing"; export declare function isBattlefieldBridgeBrokenStyle(style?: string): boolean; export declare function isBattlefieldBridgeCrossingStyle(style?: string): boolean; /** Rewrite a smashed-gap style (`broken`, `broken-west`, …) to the personal span. */ export declare function personalBridgeCrossingStyle(brokenStyle: string | undefined): string; export declare const HOPE_PIER_GAP1_REPAIR_COST: Array<{ kind: string; qty: number; }>; /** Pine is the level-10 tree, so cutting the smaller half of the cost unlocks it. */ export declare const HOPE_PIER_GAP1_WOODWORK_LEVEL: 10; /** Below the bridge's 1500: thirty logs of common wood at two thirds its level. */ export declare const HOPE_PIER_GAP1_WOODWORK_XP = 900; export declare const HOPE_PIER_GAP1_EXPLORER_XP = 1500; export declare const HOPE_PIER_GAP2_REPAIR_COST: Array<{ kind: string; qty: number; }>; /** Ash is the gate: five trees stand in the whole East (ASH_TREE_MAX_ALIVE). */ export declare const HOPE_PIER_GAP2_WOODWORK_LEVEL: 30; /** Half again as much wood as the bridge, at twice its level. */ export declare const HOPE_PIER_GAP2_WOODWORK_XP = 3000; /** Reaching the pier head opens the far end of the starting shore. */ export declare const HOPE_PIER_GAP2_EXPLORER_XP = 3330; /** Sound decking - walkable, and what a repaired span becomes for its owner. */ export declare const HOPE_PIER_STYLE_DECK = "deck"; /** Smashed span over open water. */ export declare const HOPE_PIER_STYLE_BROKEN = "broken"; /** Sound decking on the widened head. */ export declare const HOPE_PIER_STYLE_HEAD = "head"; /** * A span this player has planked. Same trick as the battlefield bridge's * `crossing`: the shared world tiles stay water, only this viewer's chunk is * rewritten, and passage is an explicit click on the icon rather than a * private walkable tile. Without it a repaired player appears, to everybody * else, to be strolling across open sea where the break still is. */ export declare const HOPE_PIER_STYLE_CROSSING = "crossing"; /** * The one tile of a smashed span a player actually works on: the middle of its * landward row. Still a broken style in every other respect - this only keeps * the client from hanging a repair hammer over all six tiles of the break. */ export declare const HOPE_PIER_STYLE_BROKEN_WORK = "broken-work"; /** The same tile once planked: it carries the crossing icon instead of the hammer. */ export declare const HOPE_PIER_STYLE_CROSSING_WORK = "crossing-work"; export declare function isHopePierWorkStyle(style?: string): boolean; /** True for a span this viewer has planked - see HOPE_PIER_STYLE_CROSSING. */ export declare function isHopePierCrossingStyle(style?: string): boolean; /** Rewrite a smashed style to this player's private span. */ export declare function personalHopePierCrossingStyle(brokenStyle: string | undefined): string; export declare function isHopePierBrokenStyle(style?: string): boolean; export declare const THAW_EAST_BRIDGE_REPAIR_COST: Array<{ kind: string; qty: number; }>; export declare const THAW_EAST_BRIDGE_WOODWORK_LEVEL: 30; export declare const THAW_EAST_BRIDGE_WOODWORK_XP = 1800; export declare const THAW_EAST_BRIDGE_EXPLORER_XP = 2000; /** Cost, level and payout for one of the pier's two spans. */ export declare function hopePierGapSpec(gap: 1 | 2): { cost: Array<{ kind: string; qty: number; }>; level: number; woodworkXp: number; explorerXp: number; }; /** * Log dropped by each tree of the Woodwork ladder. Typed against * WOODWORK_TREE_LEVELS, so a new rung cannot be added without its own wood. * The XP for felling a tree is deliberately tied to its unlock level so new * trees are always worth a predictable amount. */ export declare const WOOD_KIND_BY_TREE: Readonly>; /** Every log a tree gives, lowest tree first (the order of WOODWORK_TREE_LEVELS). */ export declare const LOG_KINDS: readonly string[]; export declare function isLogKind(kind: string | null | undefined): boolean; /** The tree a log is felled from, or null for anything that is not a log. */ export declare function treeForWoodKind(kind: string): WoodworkTreeId | null; /** * The log a felled tree of this style gives. Styles off the ladder (none, * 'default', and any decorative species) are birch, as they are for the * Woodwork level (woodworkLevelForStyle), so a level-1 tree always gives the * level-1 wood. Saved birch logs are never rewritten. */ export declare function woodKindForStyle(style: string | undefined): string; /** * Placeholders for the balance pass (PLAN_1_TO_40: no final numbers in a content slice). One place, so the balance * pass finds them all. `unitValue` is the death-drop ranking value of a log of the new woods (the backend's * ITEM_UNIT_VALUE_FALLBACKS): set to the charcoal a log burns to (charcoal.ts CHARCOAL_YIELD), the game's one existing * measure of how good a wood is. No shop buys them back yet. */ export declare const WOODWORK_B2_PLACEHOLDERS: { readonly unitValue: Readonly>; }; export declare function woodXpForStyle(style: string | undefined): number; /** * Each felled tree pays one and a half times the level required to cut it * (rounded). Three until * 2026-09-27: woodcutting earned about 13,500 XP an hour against combat's * 1,500-4,500 in the simulator, level 1 to 50 in six hours (James: "slow * woodwork down"). Measured: x2 with 0.35 base odds made 6,200 an hour, and * lower odds barely help (a player chops trees below their level, where the * per-level bonus makes a fell near certain); x1.5 aims at combat's top rate. */ export declare const WOODCUT_XP_PER_REQUIRED_LEVEL = 1.5; /** Chance per felled tree that a twigling tumbles out. 0.1%. */ export declare const TREE_SPRITE_CHANCE = 0.001; export declare const COIN_PURSE_KIND = "coinpurse"; export declare const COIN_PURSE_MIN_MULT = 250; export declare const COIN_PURSE_MAX_MULT = 500; /** Coin band a purse from a tree of this level can hold. */ export declare function coinPurseCoinRange(treeLevel: number): { min: number; max: number; }; /** * World scale for a twigling of the given tree level. A birch twigling is * knee-high; an oak one stands over the player. Linear between the two, so * the size on the label and the size on the ground agree at every rung of * WOODWORK_TREE_LEVELS. */ export declare const TREE_SPRITE_SCALE_MIN = 0.8; export declare const TREE_SPRITE_SCALE_MAX = 2.6; export declare function treeSpriteScaleForLevel(treeLevel: number): number; export declare const BIRCH_WOOD_XP: number; export declare const BIRCH_WOOD_YIELD_MIN = 1; export declare const BIRCH_WOOD_YIELD_MAX = 3; /** * One swing. Was 3200 with every swing landing; now that a swing is a roll * (see the felling odds below) it is shorter, so a saw at the tree's own * level averages about what it did, a bronze hatchet matches the old pace * exactly, and iron and steel are the improvement they claim to be. */ export declare const WOODCUT_DURATION_MS = 2400; export declare const WOODCUT_RANGE = 1; /** Odds of a swing landing with a saw at the tree's own level. */ export declare const WOODCUT_BASE_CHANCE = 0.35; /** Added for every Woodwork level above the tree's. */ export declare const WOODCUT_CHANCE_PER_LEVEL = 0.02; export declare const WOODCUT_CHANCE_MIN = 0.35; /** A swing can always miss, even at level 40 with a steel head. */ export declare const WOODCUT_CHANCE_MAX = 0.95; /** * Points each hatchet adds to the felling roll. The best one carried counts, * equipped or in the bag, the same test that admits it as a woodwork tool. */ export declare const HATCHET_WOODCUT_BONUS: { readonly hatchet: 0.1; readonly ironhatchet: 0.2; readonly steelhatchet: 0.3; }; export type HatchetKind = keyof typeof HATCHET_WOODCUT_BONUS; /** Bronze, iron, steel: the order the guide lists them in. */ export declare const HATCHET_KINDS: readonly HatchetKind[]; export declare function isHatchet(kind: string | null | undefined): kind is HatchetKind; /** The felling bonus of one item kind: a hatchet's points, or nothing. */ export declare function hatchetWoodcutBonus(kind: string | null | undefined): number; /** The best hatchet bonus among everything carried. */ export declare function bestHatchetBonus(kinds: Iterable): number; /** * Odds that one swing fells the tree, as a fraction. The advantage is the * player's Woodwork level over the tree's; a tree above your level cannot be * started at all, so it never goes negative in play. */ export declare function woodcutSuccessChance(woodworkLevel: number, treeLevel: number, hatchetBonus?: number): number; /** Whole percentage points, for notices and the guide: 0.65 reads as 65. */ export declare function chancePercent(chance: number): number; /** Local mesh size before the storage hut's entity scale (5 → 9-tile wall ring). */ export declare const STORAGE_HUT_MESH_WIDTH = 1.76; export declare const STORAGE_HUT_MESH_DEPTH = 1.76; export declare const STORAGE_HUT_REPAIR_WOODWORK_LEVEL = 5; export declare const STORAGE_HUT_REPAIR_COST: Array<{ kind: string; qty: number; }>; /** Buildable from the start - birch arrows are a level 1 recipe and need it. */ export declare const WORKBENCH_BUILD_WOODWORK_LEVEL = 1; export declare const WORKBENCH_BUILD_COST: Array<{ kind: string; qty: number; }>; /** * The town work benches (James, 2026-09-27: "ways to build woodworking access * points"): a broken bench in each of four places, mended once per player * with that place's timber and a Woodwork level, after which it works for * them like the Base Camp bench. Placed by the backend's map.ts; drawn from * the Blender town bench (broken until mended, per player). */ export type TownBenchKey = 'hopebeach' | 'crossroads' | 'calverton' | 'frozenshore'; export type TownBench = { key: TownBenchKey; label: string; level: number; wood: string; qty: number; xp: number; }; export declare const TOWN_BENCHES: readonly TownBench[]; /** A town bench's style: `townbench-broken-` for everyone, `townbench-` for a player who has mended it. */ export declare const TOWN_BENCH_STYLE_PREFIX = "townbench-"; export declare function townBenchKeyForStyle(style: string | undefined): TownBenchKey | null; export declare function townBench(key: TownBenchKey): TownBench; export declare const FOLDING_BENCH_KIND = "foldingbench"; /** A set-up folding bench: kind workbench, style foldingbench-. */ export declare const FOLDING_BENCH_STYLE_PREFIX = "foldingbench-"; export declare const FOLDING_BENCH_MS: number; export declare const FOLDING_BENCH_WOODWORK_LEVEL = 30; /** A lit campfire from logs: kind campfire, style campkit-. */ export declare const CAMP_FIRE_STYLE_PREFIX = "campkit-"; export declare const CAMP_FIRE_LOGS = 3; export declare const CAMP_FIRE_MS: number; /** Every log burns, and driftwood off the beach (beachcombing.ts): the bag offers "Light campfire" on any of these stacks. */ export declare const CAMP_FIRE_WOOD_KINDS: readonly string[]; /** The player id that owns a set-up folding bench or a lit camp fire, from its style. */ export declare function campKitOwner(style: string | undefined): string | null; export declare const NETTLES_KIND = "nettles"; /** Legacy item id retained so existing inventories remain valid; shown as Sharp Stone. */ export declare const SHARP_ROCK_KIND = "sharprock"; /** Common cobble chipped from ordinary scenery rocks - not the rare knapped sharp stone. */ export declare const STONE_KIND = "stone"; export declare const SPRUCE_ARROW_KIND = "sprucearrow"; export declare const CARVING_KNIFE_KIND = "carvingknife"; /** One craft batch per tick. Fast enough that a knife-stroke loop can fill it. */ export declare const WOODCRAFT_INTERVAL_MS = 900; export type WoodworkRecipe = { id: string; /** Item produced, and how many per craft. */ output: string; outputQty: number; level: number; xp: number; materials: Array<{ kind: string; qty: number; }>; }; /** * Everything craftable at a work bench. Ordered by level so the bench menu can * render the table straight through. Crafting also requires a carving knife. */ export declare const WOODWORK_RECIPES: WoodworkRecipe[]; export declare function woodworkRecipe(id: string): WoodworkRecipe | null; export declare const NETTLES_FORAGING_LEVEL = 1; /** Ordinary scenery rocks - pebbles, default stones, boulders. Crags are cliff faces. */ export declare const STONE_FORAGING_LEVEL = 1; export declare const SHARP_ROCK_FORAGING_LEVEL = 5; /** Inspect rotten farm food or battlefield rotten meat for maggots. */ export declare const MAGGOT_FORAGING_LEVEL = 8; /** Dig earthworm casts on grass with a garden fork. */ export declare const EARTHWORM_FORAGING_LEVEL = 15; /** Dig beach worm casts on sand for lugworms with a garden fork. */ export declare const WORMCAST_FORAGING_LEVEL = 40; /** Tench on the goblin side of the battlefield lake. */ export declare const TENCH_FISHING_LEVEL = 20; /** Perch need a rod, tackle, bait and a little lake-fishing experience. */ export declare const PERCH_FISHING_LEVEL = 7; export declare const POND_FISHING_LEVEL = 1; /** * Trout, in the stocked reservoir at the Trout Fishery. The top of the ladder, * and the only fish behind a paid door and a rod you have to buy or craft. */ export declare const TROUT_FISHING_LEVEL = 30; /** Sea Bass, the level-40 pinnacle saltwater catch. */ export declare const SEA_BASS_FISHING_LEVEL = 40; /** * Odds a cast lands its fish. Used to be a flat 0.5 regardless of skill, so * Fishing level bought you nothing at the rod - the only thing it gated was * whether tench were castable at all. * * Now a cast starts unreliable at the level that unlocks the fish and improves * toward SKILL_CURVE_FULL_LEVEL, so training the skill is visible in the catch rate. The * floor is per-fish rather than global: arriving at tench (level 20) is as * scrappy as arriving at perch (level 1) was, instead of veterans landing * their first tench four casts in five. */ export declare const FISHING_CATCH_CHANCE_MIN = 0.45; export declare const FISHING_CATCH_CHANCE_MAX = 0.9; export declare function fishingCatchChance(fishingLevel: number, requiredLevel: number): number; export declare const NETTLES_XP = 20; export declare const STONE_FORAGE_XP = 3; export declare const SHARP_ROCK_XP = 60; /** * Rocks are permanent cosmetic scenery and are not gatherable. * Gatherable stones are distinct small "stone" entities. */ export declare function isForageableRockStyle(_style?: string): boolean; export declare const MAGGOT_FORAGE_XP = 28; export declare const EARTHWORM_FORAGE_XP = 38; export declare const CHICKEN_FEATHER_FORAGE_LEVEL = 1; export declare const CHICKEN_FEATHER_FORAGE_XP = 23; /** Identify forest "Suspicious tracks" as Fox Tracks. */ export declare const FOX_TRACKS_FORAGING_LEVEL = 3; export declare const FOX_TRACKS_IDENTIFY_XP = 22; export declare const FOX_TRACKS_KIND = "foxtracks"; export declare const FOXTAIL_KIND = "foxtail"; export declare const FOX_BAIT_RAW_RABBITS = 3; export declare const FOX_BAIT_DELAY_MIN_MS = 5000; export declare const FOX_BAIT_DELAY_MAX_MS = 10000; export declare const FOX_BAIT_SPAWN_MIN = 3; export declare const FOX_BAIT_SPAWN_MAX = 4; /** Base Camp Suspicious hole (and other caveentrance tunnels that use the same gate). */ export declare const CAVE_ENTRANCE_EXPLORER_LEVEL = 5; /** * The same hole asks for a combat level too: Explorer 5 comes from walking about, and a combat-1 character let in on * it alone was killed by the first room's rats (simulator, 2026-09-29). Room 2's Giant rats are level 10. */ export declare const CAVE_ENTRANCE_COMBAT_LEVEL = 15; /** Spider Cave mouth east of Calverton. */ export declare const SPIDER_CAVE_EXPLORER_LEVEL = 15; /** Wolf dens scattered through the woods around Calverton. */ export declare const WOLF_DEN_FORAGING_LEVEL = 15; /** Bait-end tile of a fox-track trail (`end` or `end-n` / `end-e` / …). */ export declare function isFoxTrackEndStyle(style: string | undefined): boolean; export declare const CHICKEN_FEATHER_YIELD_MIN = 1; export declare const CHICKEN_FEATHER_YIELD_MAX = 3; /** Same odds as picking a fight with a seagull worth its feathers - sometimes it isn't peaceful. */ export declare const CHICKEN_ATTACK_CHANCE = 0.1; export declare const CHICKEN_PECK_DAMAGE_MIN = 1; export declare const CHICKEN_PECK_DAMAGE_MAX = 3; /** * Wilson's rod comes two ways: bought off his counter for coins, or earned by * bringing him the maggots for his own bait tin (the wilsonRod quest). */ export declare const WILSON_ROD_MAGGOTS_NEEDED = 50; export declare const SMALL_FISHING_ROD_KIND = "smallfishingrod"; /** 200 since 2026-10-04 (James, W-088): the First Steps beginner rack hands a new player one free. */ export declare const SMALL_FISHING_ROD_PRICE = 200; export declare const MAGGOT_KIND = "maggot"; export declare const EARTHWORM_KIND = "earthworm"; export declare const FISHING_LINE_KIND = "fishingline"; export declare const FISHING_HOOK_KIND = "fishinghook"; export declare const FISHING_FLOAT_KIND = "fishingfloat"; /** Chance a fishing attempt snaps the line (consumes line, hook, and float). */ export declare const FISHING_LINE_SNAP_CHANCE = 0.05; /** Chance a trout cast snaps the fly off the rod (consumes one fly). */ export declare const FLY_SNAP_CHANCE = 0.01; export declare const WILSON_SHOP_STOCK: readonly { kind: string; price: number; qty: number; }[]; export declare const CARVING_KNIFE_PRICE = 50; export declare const SPINNING_ROD_KIND = "spinningrod"; export declare const SPINNING_ROD_PRICE = 2500; export declare const SEA_FISHING_LINE_KIND = "sealine"; export declare const SEA_FISHING_LINE_PRICE = 500; export declare const SEA_FISHING_RIG_KIND = "searig"; export declare const SEA_FISHING_RIG_PRICE = 1000; export declare const SEA_FISHING_SPINNER_KIND = "seaspinner"; export declare const SEA_FISHING_SPINNER_PRICE = 200; /** Line plus a pre-tied rig: two items where fresh water wants three. */ export declare const SEA_TACKLE_KINDS: readonly ["sealine", "searig"]; export declare const SALT_AND_SAND_SHOP_TITLE = "Salt & Sand Tackle"; export declare const RAW_SMELT_KIND = "rawsmelt"; export declare const SMELT_BAIT_KIND = "smeltbait"; export declare const SMELT_BAIT_PER_FISH = 3; export declare const ICE_FISHING_ROD_KIND = "icefishingrod"; export declare const ICE_FISHING_ROD_PRICE = 150000; export declare const ICE_AUGER_KIND = "iceauger"; export declare const ICE_AUGER_PRICE = 20000; /** * The hole wants its own tackle, as the sea does: stiff cold-water line and * a pre-tied jig rig, both from Ulf. A snapped line takes the pair. */ export declare const ICE_FISHING_LINE_KIND = "iceline"; export declare const ICE_FISHING_LINE_PRICE = 1000; export declare const ICE_FISHING_RIG_KIND = "icerig"; export declare const ICE_FISHING_RIG_PRICE = 2500; export declare const ICE_TACKLE_KINDS: readonly ["iceline", "icerig"]; export declare const ICE_BAIT_SHOP_TITLE = "Ice Bait Workshop"; /** * Smelt sit between perch and tench: pier fishing you can do early, once the * first span is planked (Woodwork 10 buys the crossing). */ export declare const SMELT_FISHING_LEVEL = 10; /** * Crab cages off the side of the Long Pier: the second thing a new angler can do * after netting frogs, and the catch is food (crab meat cooks at level 1). */ export declare const CRAB_CAGE_FISHING_LEVEL = 3; export declare const CRAB_CAGE_KIND: "crabcage"; /** Frost pike, through the ice at the Frozen Lake. */ export declare const FROST_PIKE_FISHING_LEVEL = 35; /** Chance a smelt cast snaps the spinner off the line (loses one spinner). */ export declare const SPINNER_SNAP_CHANCE = 0.01; /** Chance an ice cast snaps the line, taking the rig down the hole with it. */ export declare const ICE_LINE_SNAP_CHANCE = 0.01; /** * The pike take either bait: lugworms dug on Hope Beach are the basic bait, * smelt cut at Ulf's table are what the lake fishers use, and the pike come * to smelt more readily. One bait per drop either way. */ export declare const ICE_BAIT_KINDS: readonly ["smeltbait", "lugworm"]; export declare const SMELT_BAIT_CATCH_MULTIPLIER = 1.5; /** * Once in a thousand drops the rig comes up with something that is not a * fish: a key of clear ice, lost through some other hole long ago. */ export declare const FROZEN_KEY_KIND = "frozenkey"; export declare const FROZEN_KEY_CHANCE = 0.001; /** * The lake's spots are a rota, not fixtures. An augered hole stays open for * ICE_HOLE_OPEN_MIN_MS-ICE_HOLE_OPEN_MAX_MS (three to five minutes: long * enough to get a few pike out of it) before the ice closes over it and * the hole is gone; when it seals, ICE_SPOT_RESPAWN_MIN-ICE_SPOT_RESPAWN_MAX * fresh spots of thin ice show somewhere else on the lake, ready for the * auger, up to ICE_SPOT_MAX uncut spots at once. The fishers' own holes are * fixed and never seal. */ export declare const ICE_HOLE_OPEN_MIN_MS = 180000; export declare const ICE_HOLE_OPEN_MAX_MS = 300000; export declare const ICE_SPOT_RESPAWN_MIN = 2; export declare const ICE_SPOT_RESPAWN_MAX = 3; export declare const ICE_SPOT_MAX = 8; /** How many spots the lake offers when the server comes up. */ export declare const ICE_SPOT_INITIAL = 3; /** Time on the auger to cut a spot through, rolled per cut. */ export declare const ICE_AUGER_CUT_MIN_MS = 2000; export declare const ICE_AUGER_CUT_MAX_MS = 10000; /** Cutting bait: one smelt per beat at the board, so the knife work can be watched. */ export declare const BAIT_CUT_PER_SMELT_MS = 1400; /** * Digging a worm cast: two fork stabs, then the worm. Short on purpose - it * is a beat the player can see, not a wait. The client's stab cycle is * derived from this so the second stab lands as the cast disappears. */ export declare const WORMCAST_DIG_MS = 1500; /** * Ice hole styles. The generator marks the two fishers' holes `fished` and * those are theirs for good; every other hole is the server's: `thin` is a * spot the lake has offered (thin, clear ice that wants the auger) and `open` * a cut hole with water in it, until the ice closes and the hole is removed. */ export declare const ICE_HOLE_STYLE_THIN = "thin"; export declare const ICE_HOLE_STYLE_OPEN = "open"; export declare const ICE_HOLE_STYLE_WORKED = "fished"; /** * Minimum spacing between nettle patches, in tiles. The brief was "30-40 * seconds of walking apart"; at MOVE_SPEED_TILES_PER_SEC that is 105-140 tiles, * so patches are genuinely hunted rather than stumbled over. */ export declare const NETTLES_MIN_SPACING = 105; /** Sharp rock is the long hunt - roughly ten minutes of searching. */ export declare const SHARP_ROCK_MIN_SPACING = 260; /** * Earthworm casts are a rare, world-scale forage node (like the beach worm * poo casts), not a per-tile density roll - only this many exist at once, * anywhere in the world. */ export declare const EARTHWORM_CAST_COUNT = 3; /** Keep the handful of casts spread across the map rather than clustered. */ export declare const EARTHWORM_CAST_MIN_SPACING = 150; export declare function isBrokenSaw(kind: string): boolean; /** Working saw suitable for chopping / woodwork (not a broken remnant). */ export declare function isWorkingSaw(kind: string): boolean; export declare function isWoodworkTool(kind: string): boolean; /** * Scenery-only trees. * * A `-scenic` suffix on ANY tree style makes that tree pure decoration: it * renders exactly as its base species but cannot be chopped. Planted screens * and avenues need this - a tree wall that players can fell turns into a gap * -toothed mess, and the wall is there to shape the space, not to be a * resource. Deliberately a suffix rather than a parallel style per species, so * any tree (now or later) can be planted as scenery with no new registration. */ export declare const SCENIC_TREE_SUFFIX = "-scenic"; export declare function isScenicTreeStyle(style: string | undefined): boolean; /** Mark a species as scenery-only. Idempotent. */ export declare function scenicTreeStyle(style: string): string; /** * The species a style should RENDER as, with any scenic suffix stripped. * Anything that looks up a style in a visual table must go through this, or a * scenic tree falls back to the default species and the screen changes shape. */ export declare function baseTreeStyle(style: string | undefined): string | undefined; export declare function isCuttableTreeStyle(style: string | undefined): boolean; export declare function woodworkLevelForStyle(style: string | undefined): number; export declare function rollBirchWoodQty(): number; /** * True for anything you fish with that has a line on it. * * The net is deliberately excluded: it is a scoop, and stringing it would be * nonsense. Used to decide whether a held rod renders with its line (see * PlayerPublic.rodLine). */ export declare function isFishingRodKind(kind: string | null | undefined): boolean; //# sourceMappingURL=woodwork.d.ts.map