export declare function iceDepthsPropBlocks(style: string | undefined): boolean; export declare const TILE_SIZE = 1; export declare const CHAT_MAX_CHARS = 120; export declare const CHAT_MAX_WORDS = 24; export declare function clampChatText(text: string): string; export declare const PLAYER_NAME_MIN = 2; export declare const PLAYER_NAME_MAX = 24; export declare function sanitizePlayerName(raw: string): string; /** * Pet names go through the same rules as player names - the claim dialog * already validates with `playerNameError`, so the server must apply the same * pair or a hand-crafted packet could park arbitrary text over someone's head. * Returns null for anything unusable rather than throwing, since this also runs * over whatever the database happens to hold. */ export declare function normalizeBeagleName(raw: unknown): string | null; export declare function playerNameError(name: string): string | null; export declare const CHUNK_SIZE = 32; export declare const FARMLAND_CHUNKS_X = 8; export declare const VILLAGE_CHUNKS_X = 2; export declare const EASTLAND_CHUNKS_X = 17; export declare const PLAYABLE_CHUNKS_X: number; export declare const PLAYABLE_CHUNKS_Z = 3; export declare const FARMLAND_WIDTH: number; export declare const WORLD_EAST_CHUNKS = 2; /** * The northern extension (James, 2026-09-25: "extend the map north a bit" * for the Frozen Shore and its polar bears): two chunks of new rows above the * old north edge. Every surface place moved south by NORTH_SHIFT rows with * it, pad-relative ones through WORLD_NORTH_PAD and the hand-written world z * values by +NORTH_SHIFT in place; the underground strip (x >= * UNDERGROUND_ORIGIN_X) did not move. Coordinate hashes read `legacyZ` so the * scatter stayed where it was, and saved characters are moved once, at the * backend's boot (db/characters.ts, WORLD_REVISION). Proved with the * backend's scripts/world-fingerprint.ts and world-shift-diff.ts. */ export declare const WORLD_NORTH_EXTENSION_CHUNKS = 2; export declare const NORTH_SHIFT: number; export declare const WORLD_NORTH_CHUNKS: number; /** * The world's layout revision, saved on each character: 1 is the 64-row * northern extension. A character saved before it (no revision) is moved * NORTH_SHIFT rows south once, when the backend boots, if it was on the * surface. */ export declare const WORLD_REVISION = 1; /** * Open sea south of the playable strip. Padding the far side of the beach, * not the near side, so every existing world coordinate is untouched - only * WORLD_HEIGHT grows. It exists so the Long Pier has somewhere to go: the * playable ocean is fourteen rows deep, which is a jetty, not a pier. * Five since 2026-09-24, when the pier stretched to 130 rows: the ship loop * (SeaTraffic) needs its offshore leg past the pier head's clearance. * Seven since 2026-10-05 (the south expansion, southExpansion.ts): the * Sundered Coast reaches z 1056, today's old last row, so two more chunks of * open sea lie past Fort Rook's cliff for the ship loop and the paper map's * fade. Nothing north of the old edge moved: no WORLD_REVISION bump. * Eleven since 2026-10-09 (the Western Entrance, westernEntrance.ts): four * more chunks of open sea for the south-western expansion to grow into, its * first zone laid in the sea rows south of the South Fields. Again nothing * north of the old edge moved. The 128-row inland insert (starterExpansion.ts) * is added on top: the final world is LEGACY_WORLD_HEIGHT + 128 rows. */ export declare const WORLD_SOUTH_CHUNKS = 11; export declare const DEMO_CHUNKS_X: number; export declare const DEMO_CHUNKS_Z: number; export declare const PLAYABLE_WIDTH: number; export declare const PLAYABLE_HEIGHT: number; export declare const WORLD_NORTH_PAD: number; export declare const PLAYABLE_ORIGIN_X = 0; export declare const PLAYABLE_ORIGIN_Z: number; export declare const WORLD_WIDTH: number; export declare const WORLD_HEIGHT: number; export declare const MAP_WIDTH: number; export declare const MAP_HEIGHT: number; /** * Extra columns east of the overworld for underground interiors (Rat Tunnel * rooms, forest-den caverns). Generated and playable, but not on the paper * map - the chart is WORLD_WIDTH × WORLD_HEIGHT. */ export declare const UNDERGROUND_CHUNKS_X = 8; export declare const UNDERGROUND_ORIGIN_X: number; /** * The Arcane Realms' strip (2026-10-08, arcaneLands.ts): eleven chunk columns east of the underground strip, open sea * with the land in the middle of it. A region of its own, off the paper map, reached by teleport (the Capital's magic * door later). Nothing west of it moved: the overworld and the underground keep every coordinate. */ /** One past the underground strip's last column. The caves are laid against it (goblinCave.ts, iceDepths.ts). */ export declare const UNDERGROUND_END_X: number; export declare const ARCANE_ORIGIN_X: number; export declare const ARCANE_CHUNKS_X = 11; export declare const ARCANE_STRIP_WIDTH: number; /** One past the Arcane strip's last column. */ export declare const ARCANE_END_X: number; /** * The Western Kingdoms' strip (2026-10-10, westernKingdoms.ts; plan .cursor/task-plans/2026-10-10-west-land-build-plan.md, * option C2): 22 chunk columns appended east of the Arcane strip, the grid's last region, open sea until its land goes * in. On the paper map the land is drawn WEST of the overworld; in the grid it is a strip of its own, reached only by * the dwarven train. Nothing west of it moved, and it can grow (more columns) without moving anything. */ export declare const WESTERN_ORIGIN_X: number; export declare const WESTERN_CHUNKS_X = 38; /** * The strip's first 22 columns are the Western Kingdoms' land and its sea (x 1536-2239); the last 8 (x 2240-2495, added 2026-10-14 by * T68, plan .cursor/task-plans/2026-10-14-t68-west-coast.md) hold the West Coast (westCoast.ts: Saltmere Crescent, later the Redclay Hook * and the Last Signal). Nothing west of x 2240 moved. Reached by the South Fields' ferry (a teleport across regions with its own cover). */ export declare const WESTERN_LAND_STRIP_CHUNKS_X = 22; export declare const WESTERN_LAND_STRIP_END_X: number; export declare const WEST_COAST_ORIGIN_X: number; export declare const WESTERN_STRIP_WIDTH: number; /** One past the Western strip's last column (the grid's east edge while it is the last region). */ export declare const WESTERN_END_X: number; /** * The four regions of the grid: the overworld (the paper map), the underground strip, the Arcane Realms' strip and * the Western Kingdoms' strip. */ export type WorldRegion = 'overworld' | 'underground' | 'arcane' | 'western'; export declare function worldRegionAt(x: number): WorldRegion; /** * Are two x positions in the same region of the grid? The client draws only the region the player is in: from the * King's Harbour's far side (the Capital Aquarium) the underground strip's caves are inside the loaded chunk ring, and * from a cave the Sound is; the Arcane Realms' west shore is a chunk ring from the underground strip's east caves. */ export declare function sameWorldRegion(x: number, viewerX: number): boolean; /** The old name, from when there were two regions. Same answer as sameWorldRegion. */ export declare function sameSideOfUndergroundEdge(x: number, viewerX: number): boolean; /** * Every region's columns, west to east (phase 1a, 2026-10-10; audit `.cursor/task-plans/2026-10-10-west-region-audit-checklist.md`). * The grid is exactly their union: contiguous from x 0, no gap, no overlap, the last one ending at GRID_WIDTH * (types scripts/world-regions-test.mjs). `surface`: open-air land a player walks under the sky (campfires, the warthog's * digs, a quest arrow to a cave mouth); `paper`: drawn on the paper map and sent by /map-summary. */ export type WorldRegionSpan = { id: WorldRegion; minX: number; endX: number; surface: boolean; paper: boolean; }; export declare const WORLD_REGIONS: readonly WorldRegionSpan[]; /** * Is x in a surface region (the overworld, the Arcane Realms or the Western Kingdoms): everywhere but the underground * strip. Write this, never a raw `x < UNDERGROUND_ORIGIN_X`, wherever "out in the open" is meant: that test silently * refuses every strip east of the underground (it is how the Arcane Realms lost their campfires). */ export declare function isSurfaceRegion(x: number): boolean; /** Is x in the overworld, the paper map's columns (x 0 to UNDERGROUND_ORIGIN_X)? */ export declare function isOverworldX(x: number): boolean; export declare const GRID_CHUNKS_X: number; export declare const GRID_CHUNKS_Z: number; export declare const GRID_WIDTH: number; export declare const GRID_HEIGHT: number; /** * The z a coordinate hash should read: the tile's z from before the northern * extension, so scatter, noise and per-tile variety landed where they always * had. The underground strip never moved, so its z is its own. */ export declare function legacyZ(x: number, z: number): number; /** * Kinds that never carry an Identify marker, because nothing happens when you * click them. * * The rule: Identify is for creatures, items, and things with an interaction * behind them. Scenery is scenery. A marker over a prop with no handler is an * advertised action that does nothing - which is exactly what a fallen log at * the frog pond did, and what buried the shoreline in icons before shells and * seaweed were listed here. * * One list, shared: the client reads it to decide whether to draw the marker * and the server reads it to refuse the identify, so the two cannot drift. * Adding a decorative EntityKind here is the whole fix; there is nothing to * register on either side. */ export declare const NON_IDENTIFIABLE_KINDS: ReadonlySet; export declare function isPaperMapChunk(cx: number, cz: number): boolean; export declare const HEIGHT_STEP = 0.45; /** Authored structural kit metres converted to authoritative terrain units. */ export declare function terrainForPhysicalMetres(metres: number): number; export declare const MAX_STEP_HEIGHT = 2; export declare const PLAYABLE_BEACH_START_Z = 56; export declare const PLAYABLE_BEACH_SAND_START_Z = 60; export declare const PLAYABLE_OCEAN_START_Z = 82; export declare const BEACH_START_Z: number; export declare const BEACH_SAND_START_Z: number; export declare const OCEAN_START_Z: number; export declare const BEACH_GATE_X: number; export declare const BEACH_GATE_HALF = 4; export declare const CHUNK_VIEW_RADIUS = 2; export declare const CART_DISTURB_COOLDOWN_MS = 45000; export declare enum SurfaceType { Grass = 0, Path = 1, Water = 2, Sand = 3, Ash = 4, Dirt = 5, Soil = 6, Stone = 7, Mud = 8, /** Northern snow. Walkable exactly like grass; snow.ts decides where it lies. */ Snow = 9, /** * A frozen lake. Walkable like snow; the client draws it as cracked plates * of pale blue ice. Laid by the frozen lake builder, never by the snow pass. */ Ice = 10, /** * Indoor floors, laid by the builders under every walk-in building * (2026-09-20): Boards for houses, shops, inns and warehouses; Flagstones * for halls, banks, temples and forges. Both walk like Path. They exist so * the client can draw an inside as an inside instead of running the street * through the door. */ Boards = 11, Flagstones = 12 } export declare enum TileType { Grass = 0, Path = 1, Water = 2, Tree = 3, Sand = 4, Ash = 5 } export type EntityKind = 'tree' | 'rock' | 'shell' | 'seaweed' | 'wormcast' | 'beachhut' | 'farmhut' | 'table' | 'gardenfork' | 'woodennet' | 'bucket' | 'egg' | 'milkbucket' | 'fence' | 'tradingcart' | 'signpost' | 'feather' | 'crabmeat' | 'burrow' | 'rawrabbit' | 'brokenpier' /** One tile of the Hope Beach pier deck. See HOPE_PIER_X in landmarks.ts. */ | 'pier' | 'abandonedboat' | 'ship' | 'campfire' /** Cast-iron range: the cooking spot indoors, where an open fire has no business being. */ | 'stove' | 'cookedcrab' | 'cookedrabbit' | 'cookedchicken' | 'lugworm' | 'maggot' | 'earthworm' | 'earthwormcast' | 'rottenmeat' | 'fishingline' | 'fishinghook' | 'fishingfloat' | 'coins' | 'lilypad' | 'reeds' | 'jetty' | 'rawbass' | 'cookedbass' | 'rawperch' | 'cookedperch' | 'rawtench' | 'cookedtench' | 'frog' | 'cookedfroglegs' | 'rawroach' | 'rawrudd' | 'rawtidesnapper' | 'cookedtidesnapper' | 'tadpole' | 'pondweed' | 'snail' | 'grilledfish' | 'simplelure' | 'livecrab' | 'rottenturnip' | 'grub' | 'fieldmushroom' | 'oldbone' | 'muddyboot' | 'truffle' | 'crops' | 'smallfishingrod' | 'mudhut' | 'fortwall' | 'archertower' | 'barbedwire' | 'barricade' | 'haybale' | 'horse' | 'trough' | 'barrel' | 'well' | 'farmcart' | 'scarecrow' | 'logpile' | 'flowers' | 'lantern' | 'bench' | 'compost' | 'farmtool' | 'ranchgate' | 'milestone' | 'tent' | 'cargo' | 'bush' | 'workbench' | 'workshop' | 'nettles' | 'sharprock' | 'storagehut' | 'bankchest' | 'birchwood' | 'woodenclub' | 'livoniapineclub' | 'leatherboots' | 'poplarhelmet' | 'poplarbody' | 'poplarlegs' | 'poplarspear' | 'pineshield' | 'hay' | 'caveentrance' | 'rattail' | 'ratteeth' | 'brokensaw' | 'bronzechest' | 'bronzechestkey' | 'goblincavekey' | 'goblinprisonkey' | 'blacksmithinghammer' | 'blacksmithingtongs' | 'anvil' | 'furnace' | 'bronzebar' | 'ironbar' | 'bronzedagger' | 'bronzesword' | 'bronzeshield' | 'bronzehelmet' | 'bronzebody' | 'bronzelegs' | 'bronzegauntlets' | 'bronzeboots' | 'irondagger' | 'ironpickaxe' | 'ironsword' | 'ironshield' | 'ironhelmet' | 'ironbody' | 'ironlegs' | 'irongauntlets' | 'ironboots' | 'steelsword' | 'steelshield' | 'steelhelmet' | 'steelbody' | 'steellegs' | 'steelgauntlets' | 'steelboots' | 'copper' | 'tin' | 'iron' | 'bridge' | 'hatchet' | 'ironhatchet' | 'steelhatchet' | 'foldingsaw' | 'woolygloves' | 'woolyboots' | 'peasantclothes' | 'rangerclothes' | 'carvingknife' | 'birchshortbow' | 'pinebow' | 'sprucebow' | 'ashbow' | 'oakbow' | 'apple' | 'wheat' | 'poplarwood' | 'pinewood' | 'sprucewood' | 'bircharrow' | 'sprucearrow' | 'stone' | 'grapes' | 'orange' | 'dungeondoor' | 'bones' | 'unlitbirchtorch' | 'litbirchtorch' | 'ratnest' | 'glowfungus' | 'silo' | 'grainmill' | 'pumpwindmill' | 'watertower' | 'packbarn' | 'packcoop' | 'packstable' | 'foxtracks' | 'foxtail' | 'rabbithutch' | 'bountyboard' | 'smallsatchel' /** Dropped by a twigling shaken out of a felled tree; opens to coins. */ | 'coinpurse' | 'beachfind' | 'treasuredig' | 'oddjobsboard' | 'haretracks' | 'rumourboard' | 'appletree' /** A rock pool on the Smugglers' Strand (smugglersStrand.ts), searched for sea glass and pearls. */ | 'rockpool' | 'ciderpress' | 'aquariumtank' | 'aquariumlectern' | 'evententrance' | 'eventexit' | 'eventchest' | 'eventswitch' | 'eventbarrier' | 'eventsign' | 'eventnode' | 'herbpatch' | 'foragepatch' | 'cauldron' | 'stonehouse' | 'townwall' | 'towngate' | 'marketstall' | 'fishingpeg' | 'waterfall' | 'ashwood' | 'hazelwood' | 'alderwood' | 'beechwood' | 'oakwood' | 'flyfishingrod' | 'spinningrod' | 'heavybeachcastingrod' /** Salt & Sand Tackle: sea line, pre-tied rig, and a spinner lure. */ | 'sealine' | 'searig' | 'seaspinner' | 'flyhook' | 'rawtrout' | 'cookedtrout' | 'rawgrayling' | 'cookedgrayling' | 'rawchar' | 'cookedchar' | 'rawsalmon' | 'cookedsalmon' | 'rawling' | 'cookedling' | 'rawhalibut' | 'cookedhalibut' | 'rawanglerfish' | 'cookedanglerfish' | 'cobweb' | 'webveil' | 'spideregg' | 'spidersilk' | 'wolffang' /** A snow wolf's winter coat. Fenwick at the Northern Gate buys them. */ | 'wolfpelt' /** A hole cut through the frozen lake, with a shadow moving under it. */ | 'icehole' /** The iced-in jetty on the frozen lake's east bank; walkable deck. */ | 'icejetty' /** A tall pole flying the stag banner, marking the fishers' ground. */ | 'stagbanner' /** Slabs of broken ice heaved up along the lake's edge. */ | 'iceshard' /** * A floe of sea ice drifting off the Bear Floes (bearFloes.ts): scenery on * the water, bobbing. Style small / large; the ones the bears ride in on * are the client's own, not entities. */ | 'icefloe' /** * The Dreadwoods' forgotten things, scattered sparsely through the woods: * the style picks the prop (cart, totem, signpost, cage, shrine, campfire, * barricade, lantern, grave, stump, crates, candles). */ | 'dreadprop' /** * The Dreadwoods' Blender props (dreadwoods-workshop, James's Dreadwoods pack, * 2026-09-26): style `-`, the model a key of * CAPITAL_BUILDING_MODELS (spideregg, cocoongallows, webcolumn...). Loaded * and collided like the Capital's Blender buildings, named and discovered as * the woods' own dressing. */ | 'dreadmodel' /** The frozen lake's catch, hauled up through an ice hole, and the same fish roasted. */ | 'rawfrostpike' | 'cookedfrostpike' /** * The frost set, reusable anywhere in the north: glowing crystal clusters * (`small`, `cluster`, `node`), rune-carved stone pillars, a portcullis in a * stone arch (`n`/`e`/`s`/`w` facing), a patch of ice spikes on the floor, * a rope bridge (`ns-` / `ew-`, centred on its tile) and a * rune-carved doorway with an open passage (`n`/`e`/`s`/`w`). */ | 'icecrystal' | 'runepillar' | 'irongate' | 'frosttrap' | 'ropebridge' | 'runearch' /** * Ice stalagmites (`spire`, `cluster`, `field`), a waterfall frozen down a * wall face (`-`, standing on the wall tile), and a * natural arch of rock and ice seven tiles across with a five-tile passage * (`n`/`e`/`s`/`w`). */ | 'stalagmite' | 'icefall' | 'icearch' /** * The Ice Prison set: a barred cell cut into an ice wall with its prisoner * still inside (`` of the bars), an iron cage hung from a chain, a * gate smashed off its posts (``, three tiles across), a flight of * stone steps, a hooded stone warder, and the ringed shrine with its seal. */ | 'icecell' | 'hangingcage' | 'brokengate' | 'stonestair' | 'hoodedstatue' | 'shrine' | 'orerock' | 'minehead' | 'copperpickaxe' /** * Ice fishing. Smelt are the bait fish taken off the Long Pier; the bait is * cut from them at the Frozen Lake's bait table; the short rod fishes a * hole in the ice and the auger is what cuts the hole. `baittable` is the * table itself, on the lake's east bank. */ | 'rawsmelt' | 'smeltbait' /** Set off the side of the Long Pier for crabs (CRAB_CAGE_FISHING_LEVEL). */ | 'crabcage' | 'icefishingrod' | 'iceauger' /** Ulf's tackle for the hole: heavy cold-water line and a jig rig. */ | 'iceline' | 'icerig' /** Comes up on the rig once in a thousand drops; it opens the Frozen Hallway's arch. */ | 'frozenkey' /** * The Frozen Depths (iceDepths.ts): the four relics the wing bosses drop * for the lift to the Final Core, the bosses' signature drops, and the * rooms' own dressing kind (depthsprop, styled by token). */ | 'gatesealkey' | 'prisonchainhook' | 'frostsigil' | 'crystalphial' | 'wardensfrostblade' | 'lichfroststaff' | 'bonechillpelt' | 'icebloodtonic' | 'glacialore' | 'frozencore' | 'behemothcrystalshard' | 'depthsprop' /** One swing in a thousand at a seam turns one up (mining.ts GEM_MINING_CHANCE); anyone may forage it. */ | 'gem' /** * The Frozen Dungeon equipment (frozenSet.ts): steel and ice, dropped one * piece at a time by the Depths' bosses or rolled from the Frozen Chest, * which the Frozen Chest Key opens. The chest itself stands in the shrine. */ | 'frozenhelmet' | 'frozenbody' | 'frozenlegs' | 'frozencape' | 'frozengauntlets' | 'frozenboots' | 'frozenshield' | 'frozennecklace' | 'frozenring' | 'frostfangsword' | 'frozenbow' | 'crystalfroststaff' | 'frozenchestkey' | 'frozenchest' /** The Dreadwoods Hoard Chest, the world event (hoardChest.ts). */ | 'hoardchest' /** Charcoal, and the mound that makes it (charcoal.ts). */ | 'charcoal' /** Story-quest items (storyQuests.ts): Fred's sealed letter and his boat ticket, Wilson's big trout, Livonia's torn pages. */ | 'fredsletter' | 'boatticket' | 'trophytrout' | 'livoniapage' /** Story-quest rewards: Hallvard's fur hat, Livonia's ring, Old Cole's burner's gloves, Haldren's bronze hammer, Roadwarden Gloves. */ | 'furhat' | 'livoniasring' | 'burnersgloves' | 'roadwardengloves' | 'bronzehammer' /** The Gull's Map part 1 (gullsMap.ts): the torn map, the wreck-chest key and the captain's tide table. */ | 'tornmap' | 'wornspade' | 'castawayshovel' | 'baydiggerspade' | 'spyglass' /** Pirate bay phase 2 (pirateTreasure.ts): chart scraps, the five charts, the two chest keys, the chests and the dig marker. */ | 'chartscrap' | 'tatteredchart' | 'piratechart' | 'seastainedchart' | 'captainschart' | 'goldenchart' | 'rustychestkey' | 'bosunskey' | 'piratechest' | 'piratedig' | 'wreckchestkey' | 'tidetable' /** The Gull's Map part 2 (gullsLowWater.ts): the Blackwakes' signal lantern, out of the Sea Grotto's cache. */ | 'signallantern' /** Lamplight Common's Round (lamplightCommon.ts, 2026-10-19): the Lamp Wick the Lamplighters pay out, and the Hand Lantern it swaps for. */ | 'lampwick' | 'handlantern' /** Tide of Blood (tideOfBlood.ts): the Bloodtide Elemental's shard. */ | 'bloodtideshard' /** The Gull's Map part 3 (gullsRook.ts): the Blackwake pirate set out of Captain Rowena's hoard. */ | 'blackwakecutlass' | 'blackwaketricorn' | 'blackwakecoat' | 'blackwakeseaboots' /** The Borderer's kit (bordererKit.ts): the Broken Road crooks' very rare cutlass, wieldable at level 1. */ | 'piratecutlass' /** The gear ladder by ring (woodsGearLadder.ts): the new weapons and trinkets Rings 2-5 of the Dreadwoods drop. */ | 'ironmace' | 'ironspear' | 'steelspear' | 'ironjawmaul' | 'dragonfangblade' | 'gravewatchbuckler' | 'rotwoodsignet' | 'corewardband' | 'dragonfangpendant' /** Pirate bay phase 6 (pirateCosmetics.ts, bayPets.ts): the bay's hats, face pieces and outfits, its pets, and Nell's bird treats. */ | 'reddeckbandana' | 'greenraiderbandana' | 'knittedsailorcap' | 'saltbicorne' | 'featheredcaptainhat' | 'drownedcaptainhat' | 'goldtrimmedhat' | 'plaineyepatch' | 'goldtooth' | 'studdedeyepatch' | 'sailorscar' | 'embroideredeyepatch' | 'hoopearring' | 'crescenteyepatch' | 'beardribbon' | 'deckhandshirt' | 'sailorslops' | 'bosunjerkin' | 'stripedworktrousers' | 'quartermastershirt' | 'seafarertrousers' | 'captainsmatecoat' | 'petparrot' | 'petgoldenparrot' | 'pethermitcrab' | 'petshipscat' | 'petsealpup' | 'parrotberries' | 'parrotsprats' | 'parrotnutmix' /** Trouble at the Crossing: marked supply bundle recovered for Alda Brindle. */ | 'markedbundle' /** Bramble Fair contests (fairContests.ts): the ribbon a placing earns. */ | 'fairribbon' /** The Missing Shipment (missingShipment.ts): Perrin's manifest and the Carter's Gloves reward. */ | 'manifestscroll' | 'cartersgloves' /** Raiders of the Red Waste (redWasteQuest.ts): a Chasm Prowler's crystal shard, a raider's token, the camp's torn banner. */ | 'chasmshard' | 'banditoken' | 'tornbanner' /** The Cracked Bell (gallowmereQuest.ts): ash off the Hollowed, Mother Hesk's Blessed Water, the chapel bell's clapper and a shard of the bell. */ | 'hollowedash' | 'blessedwater' | 'bellclapper' | 'crackedbellshard' | 'wardenskey' /** The Gravewatch (gravewatchQuest.ts, T72): the Tomb Warden's seal. */ | 'gravewardenseal' /** The Toll Road (tollRoad.ts, T79): the guard's missing payroll and the key to the Ridge cellar. */ | 'payrollsatchet' | 'cellarkey' /** The Marigold's Strongbox (smugglersStrand.ts): the box Pell wants, Brine's tricorn and cutlass. */ | 'marigoldstrongbox' | 'brinetricorn' | 'brinecutlass' /** Every Road Pays (highwaymansRidge.ts): Black Tom's ledger, and his hat (the reward). */ | 'stolenledger' | 'harrowshat' /** The Mammoth Hide Set (snowfields.ts MAMMOTH_HIDE_SET), sold by Old Hask. */ | 'mammothhood' | 'mammothcoat' | 'mammothlegs' | 'mammothmitts' | 'mammothboots' | 'mammothmantle' /** A story-quest prop a step counts clicks on; its style is `:` (spideregg:3, clue:cloth). */ | 'questprop' | 'charcoalmound' | 'baittable' /** * The Capital's own masonry (capital.ts): the keep, the statues on their * plinths (styles knight- and king), and the fountains. */ | 'castle' | 'statue' | 'fountain' /** * The Capital's city fabric (capital.ts). citywall: the 2-thick curtain * (styles n/s/e/w, corner-, bastion-, curtain- * for the keep's inner wall). gatehouse: main-w, side-, inner-w, * barbican-w; the passage is open, the towers solid. stonebridge: one per * deck tile, walk-on. rowhouse/manor/temple/forgehall/warehouse: walk-in * buildings styled -. gardenwall: low wall, gate styles * walk-through. banner and yardprop: solid dressing. */ | 'citywall' | 'gatehouse' | 'stonebridge' | 'rowhouse' | 'manor' | 'temple' | 'forgehall' | 'warehouse' | 'gardenwall' | 'banner' | 'yardprop' /** * The Capital's Blender buildings (2026-09-25; frontend buildingModels.ts, * backend capital-workshop): style `[-]-`, the model * id a key of CAPITAL_BUILDING_MODELS (tradehall, mainforge, smelter, * kingstatue, keeplion, victorystatue). A walk-in model is a hollow ring * with a door or a wider mouth on its facing side; a solid one blocks its * whole footprint. */ | 'capitalbuilding' /** * A dropped item with no floor model of its own: style is the item kind, * the client draws its bag icon on a card. Only ever a ground item. */ /** * A steered ride's course piece (steeredRide.ts, Bracken Heath 2026-10-19): a hazard in a lane (hay, gorse, barrel), a straw boost mat, a * checkpoint flag, a lane flag post or a parked racer. Drawn by the client from its style; never blocks a tile (the cart drives through). */ | 'rideprop' | 'loot'; export type NpcKind = 'seagull' | 'crab' /** The sheet's tougher red crab, at the foot of the Long Pier (2026-09-24). */ | 'redcrab' /** The sheet's larger rock crab, green, along the Blood River in the Dreadwoods. */ | 'greencrab' | 'seabass' | 'beagle' | 'trader' | 'woody' | 'rabbit' | 'petrabbit' | 'forbes' | 'jobless' | 'driver' | 'duck' | 'angler' /** Curator Elowen Vane, who keeps the Great Aquarium on Hope Beach (aquarium.ts). */ | 'curator' /** Head Curator Ambrose Kell, of the Capital Aquarium in the King's Harbour (capitalAquarium.ts). */ | 'headcurator' /** Skipper Gale Hollis, who takes members out on deep-sea trips from the King's Harbour's North Pier (deepSea.ts). */ | 'skipper' /** Deckhand Pip, aboard the Grey Gannet over Gannet Deep; takes anyone back to the harbour early (deepSea.ts). */ | 'deckhand' | 'wilson' | 'pig' | 'cow' | 'chicken' | 'sheep' /** * The farm's sheep gone feral, out in the woodland between the farm gate and * the beach path. A separate kind from `sheep` on purpose: the pen animals at * No Harm Farm must stay unattackable, and only this one carries combat * stats. Same model, same wander - the difference is entirely in the rules. */ | 'wildsheep' /** South Fields (southExpansion.ts): the pond's angry geese, level 2. A white duck, larger. */ | 'goose' /** The goat cliff. The sheep model until a goat of its own is built. Not a fight. */ | 'goat' /** Shepherd Nye's dog, the beagle model until a collie is built. Not a fight. */ | 'sheepdog' /** Sundered Coast (southExpansion.ts): black-backed gull, level 6. The seagull model. */ | 'gull' /** The shore's shellback crab, level 8. A larger rock crab. */ | 'shellback' /** Wreck rat, level 4. The rat model. */ | 'wreckrat' /** Blackwake Lookout, level 10, at the gate and along the north road. The crook model, not the smugglers' red. */ | 'lookout' /** Blackwake Deckhand, level 15, in the cove. The smuggler sailor. Not Deckhand Pip. */ | 'blackwakedeckhand' /** Blackwake Cutthroat, level 20. The same sailor, drawn a little larger. */ | 'cutthroat' /** Drowned Deckhand, level 22, on the Gull's Ransom deck. The smuggler sailor. */ | 'drowneddeckhand' /** Bosun Harrow, level 26, inside Fort Rook. A larger smuggler sailor. */ | 'bosunharrow' /** Captain Rowena Blackwake, level 32. The smuggler-captain model until she has her own. */ | 'captainrowena' /** * Grey seal, level 0, on the Sundered Coast (south.js). Not a fight. * No Blender seal exists: the client draws a grey loaf with flippers and says so. */ | 'greyseal' | 'clark' | 'clarksson' | 'stablemaster' | 'ranger' | 'debbie' | 'anne' | 'wallarcher' | 'hijacker' | 'pony' /** * Bramble Fair Green's pen pony (fairGreen.ts livestock): the forest pony's model and rules turned tame. A separate kind * from `pony` on purpose, like `wildsheep` the other way round: the wild pony is a level 4 fight, this one is a pet of the * fair, not in ATTACKABLE_NPC_KINDS and not a threat to anyone. */ | 'penpony' | 'rat' /** The Collapsed Copper Prospect's boss (worldEvents.ts): a big cave rat in a miner's helmet with a lamp, by the cache. */ | 'ratforeman' | 'soldier' | 'captain' /** The Capital's steel-clad guards: on the gates, in the keep, level 40 and they fight back. */ | 'guard' /** The Frozen Depths' five bosses (iceDepths.ts), one to a room. */ | 'frostwarden' | 'bonechillyeti' | 'icelich' | 'frostalchemist' | 'glacialbehemoth' | 'goblin' | 'grem' | 'spineless' | 'john' | 'nicholas' | 'robin' | 'kyle' | 'banker' | 'victoria' | 'bob' | 'spider' /** Level-5 Dreadwoods spider, the population of Spider Hollow. */ | 'spiderling' | 'arana' /** Level-9 highwayman, the population of The Broken Road in the Dreadwoods. */ | 'crook' /** The Smugglers' Strand's smugglers (members' place, smugglersStrand.ts). */ | 'smuggler' /** Captain Silas Brine, the smugglers' captain, boss of the sea cave's hold (smugglersStrand.ts). */ | 'smugglercaptain' /** Highwayman's Ridge (highwaymansRidge.ts): the Redcaps' footpads and archers, and their boss Black Tom Harrow. */ | 'redcap' | 'redcaparcher' | 'blacktom' | 'amazon' | 'liv' | 'fox' | 'rimdel' | 'bruce' | 'wolf' /** Takes the entry fee at the Trout Fishery gate. */ | 'fisheryguard' /** Sells fly rods, line and flies from the fishery lodge. */ | 'sam' /** Salt & Sand Tackle, at the shore end of the Long Pier on Hope Beach. */ | 'saul' /** The ship's master on the pier's east branch, who sails you between ports for coins. */ | 'branson' /** Branson's mate Oskar, on the shore at Branson's Landing; sells the same passage. */ | 'landingmate' | 'isleferryman' /** Marlow, the harbour master on the Capital's quay; the third end of Branson's run. */ | 'harbourmaster' /** Keeps the stores at the garrison behind the Northern Gate. */ | 'quartermaster' | 'rolo' | 'bram' | 'tova' /** The Western Entrance's station hub (westernEntrance.ts WESTERN_STATION_FOLK): two dwarves, drawn like the War Camp's. */ | 'stationmaster' | 'stationporter' /** * Lantern Wake's three with a kind of their own (lanternWakeTown.ts LANTERN_WAKE_FOLK): the halt master on the square (his * own kind, so he never answers for Hamrik's quests: a quest ref matches any NPC of its kind), the fletcher and bowyer, * and the quay trader (both with a counter). */ | 'haltmaster' /** * The Western Line's phase 2 halt masters (westernHalts.ts, pre-registered by slice 2-1; each placed by its own slice): * Halt Master Borrin Ashbeard at the Forge Halt (2-2) and Warden Thrida Deepstair at the Dwarf Hold (2-3). */ | 'forgehaltmaster' | 'holdhaltmaster' | 'wkbowyer' | 'wkquaytrader' /** * Lantern Wake's Beacon Keeper Hale on the Beacon Gallery (lanternWakeGallery.ts), his own kind: `beaconkeeper` is Old * Marrow's FairFolk id at the Marches Edge. */ | 'wkbeaconkeeper' /** * Brindlecross's five (brindlecrossFolk.ts, slice 3): the village reeve, the general trader (a counter), the roadwarden * trainer, the cart fool and the knife-for-hire. Each has a kind of its own, so no other place's quest ever answers to them. */ | 'bcreeve' | 'bctrader' | 'bcwarden' | 'bcfool' | 'bcblade' /** * Riversend Halt's five (riversendFolk.ts, T1 slice 3, 2026-10-14): the station master (A Stronger Bridge), the trader (a counter), the * fisher trainer, the odd-jobs man and the bandit scout. */ | 'rvmaster' | 'rvtrader' | 'rvfisher' | 'rvjeb' | 'rvscout' /** Sits over a hole on the frozen lake north-west of the War Camp. */ | 'icefisher' | 'resident' /** Story-quest people (storyQuests.ts): Fred beside Anne, the Capital's smith, scholar and charcoal burner, and more. */ | 'fred' | 'haldren' | 'worriedfarmer' | 'strandedexplorer' | 'capitalscholar' | 'charcoalburner' | 'harbourguard' | 'sergeantmabry' | 'nellthecarter' | 'beachcomber' | 'guide' /** Sells ice tackle and keeps the bait table at the Frozen Lake's camp. */ | 'baitmaster' | 'trapper' | 'miller' | 'shepherd' | 'innkeeper' /** Tansy Blackwood, Calverton's apothecary (potionMaking.ts, Tansy's Cauldron). */ | 'apothecary' /** * The twigling in the tree: one felled tree in a thousand shakes one loose, * at the tree's own level and size. It bolts; kill it for a Coin Purse. * See TREE_SPRITE_CHANCE in woodwork.ts. */ | 'twigling' /** * Forest monsters built ahead of their forest home. Kinds, stats and * models are all in place; nothing spawns them yet. */ | 'bristleboar' | 'mosswolf' /** Ice cavern monsters, built ahead of the cavern the same way. */ | 'crystalskitter' | 'frostrevenant' | 'glaciallurker' | 'icetroll' /** * The pack kept in the Frozen Cells, the first room of the Ice Prison * behind the Frozen Hallway's gate. The wolf model gone white with rime, * and the first thing in the prison that fights back. */ | 'frostwolf' /** * The red dragons of the Blood Lake, the enclosed ground at the centre of * the Dreadwoods. The deepest ring of the PvP square is theirs. */ | 'dragon' /** * Monster Concepts II, modelled in Blender to James's sheet * (dreadwoods-backend/creature-workshop/monsters2, design-references/), * standing either side of the road inside the Dreadwoods gate. */ | 'spidermatriarch' | 'gravehound' | 'rotwoodent' | 'cryptknight' | 'bloodmireelemental' /** * The Ironjaw ogres (Monster Concepts II, design-references/ironjawogre, * built in creature-workshop/monsters2): the grunts that keep the Ogre * Fortress's yard, and their chief, the same model drawn bigger. */ | 'ironjawogre' | 'ironjawchief' /** * The Bear Floes' polar bears (bearFloes.ts), modelled in Blender to James's * sheet (dreadwoods-backend/creature-workshop/polarbear): the Standard, the * Elder (older, weathered, more scars) and the Alpha (bigger, blood-stained, * rare). They ride the floes in from the sea and come ashore. */ | 'polarbear' | 'polarbearelder' | 'polarbearalpha' /** * Ringstone's world bosses (worldBossRing.ts RING_BOSSES, 2026-10-09): they exist only while a fight is on in the * ring, and they are the only NPCs in the game everyone may fight at once (the backend's sharedTarget). The brown * bear is the polar bear model painted brown; the giant crab the shore's shellback, drawn big. */ | 'brownbear' | 'giantcrab' /** * Highstone's world bosses (worldBossRing.ts HIGHSTONE, T25 2026-10-14, tier 2, levels 20-30): the same fight as Ringstone's * (a crowd, holds, a caged chest) with a telegraphed sweep on top. Stand-in models: the bristle boar and the moss wolf, drawn big * (sheet `world-boss-ring-more-bosses`; a Blender pass is a later job). */ | 'boarlord' | 'alphamosswolf' /** * Fenstone's world bosses (worldBossRing.ts FENSTONE, T40 2026-10-14, tier 3, levels 30-40): the same fight as the other rings' with a * telegraphed sweep on top. Stand-in models: the frog and the reed crane, drawn big (sheet * `world-boss-ring-more-bosses`; a Blender pass is a later job). */ | 'bogtoadking' | 'greatheron' /** * Brackenstone's world bosses (worldBossRing.ts BRACKENSTONE, T106 2026-10-14, levels 11-20): the same fight as the other rings' with * a telegraphed sweep on top. Stand-in models: the bristle boar and the Ironjaw ogre, drawn big (a Blender pass is a later job). */ | 'brackenboarking' | 'hedgeogre' /** * The woolly mammoths grazing the snowfields east of Hask's cabin * (snowfields.ts MAMMOTH_SPAWNS), a Blender creature * (dreadwoods-backend/creature-workshop/mammoth). Passive until struck. */ | 'mammoth' /** Greytusk, the Snowfields' mammoth bull (northWilds.ts MAMMOTH_BULL, T76 2026-10-14): the mammoth model drawn bigger, a mid-band boss. */ | 'mammothbull' /** The Back Bore Rockworm (dwarfHoldHub.ts ROCKWORM, T93 2026-10-14): the Dwarf Hold's mid-band gallery boss, drawn on the Stone Serpent's model. */ | 'rockworm' /** The herd's two calves (snowfields.ts MAMMOTH_CALF_SPAWNS): never fought, kept close by the adults. */ | 'mammothcalf' /** Stocked trout swimming the fishery reservoir. Click to fish. */ | 'trout' /** The Dreadwoods east-gate warden, giver of The Gatewarden's Rounds (gatewardenRounds.ts); wears the Castle Guard's look. */ | 'gatewarden' /** Hog Wild (hogWild.ts): Farmer Bramble, whose turnips the warthogs eat, and Old Hogger, who knows his hogs. */ | 'farmerbramble' | 'oldhogger' /** The Sundered Span's Bridgewarden Osmund, giver of Five Arches (storyQuests.ts BRIDGEWARDEN); wears the coast kit. */ | 'bridgewarden' /** The warthogs rooting in the scrub beside Bramble's farm: never fought, fed rotten turnips (a Blender creature). */ | 'warthog' /** * Hopewood Common's wildlife (hopewoodWildlife.ts): the meadow rabbit and fox are kinds of their own, apart from the New * Forest's baited `rabbit` and `fox`; the hedgehog is never fought; the Orchard Boar is Applepress Orchard's small boss. */ | 'commonrabbit' | 'pheasant' | 'commonfox' | 'crow' | 'badger' | 'hedgehog' | 'orchardboar' /** Lamplight Common (lamplightCommon.ts, 2026-10-19): the harmless lamp moths that snuff lit lamps, and Old Dimwing, the hollow tree's level-8 mini-boss. */ | 'lampmoth' | 'olddimwing' /** * Hollin Brook's wildlife (hollinWildlife.ts): the Fields' pond `duck` and the snow `hare` keep their own rules, so these are * kinds of their own; Old Gnasher is the millpond's small boss. */ | 'brookduck' | 'heron' | 'otter' | 'watervole' | 'brookhare' | 'stoat' | 'oldgnasher' /** * The Western Entrance's wildlife (westernWildlife.ts): the beach `seagull` and `crab`, the hares and the pen `goat` keep * their own rules, so these are kinds of their own. */ | 'headlandgull' | 'shorecrab' | 'meadowhare' | 'feralgoat' /** * Hopewood Copse's wildlife (copseWildlife.ts): the game's `rabbit` and the Common's `commonrabbit` keep their own rules, * so these are kinds of their own; Old Tusk is the copse's small boss. */ | 'copsedeer' | 'boarpiglet' | 'copserabbit' | 'redsquirrel' | 'grouse' | 'oldtusk' /** * The Marches Edge's wildlife (marchesWildlife.ts): the pen `sheep`, the `goat`, the Common's hares, the beach's `seagull` * and `crab` and the headland's kinds keep their own rules, so these are kinds of their own; Grandfather Gull is the * cove's small boss. */ | 'hillsheep' | 'mountaingoat' | 'brownhare' | 'curlew' | 'covegull' | 'covecrab' | 'grandfathergull' /** * Lantern Wake's wildlife (lanternWakeWildlife.ts), the Western Kingdoms' first stop: the rock lizard and the tide pools' * grey heron (Hollin Brook's `heron` keeps its own rules, so this is a kind of its own), the Beacon Gull and the Tidepool * Crab (not `seagull`/`crab`, which a quest counts, nor the Western Entrance's gull and crab). */ | 'rocklizard' | 'greyheron' | 'wakegull' | 'tidecrab' /** * The frozen random-spawn dungeons (frozenDungeons.ts, slice C4, 2026-10-12; design-references frostpine-trapper-hollow * and kings-road-ice-culvert): the Frost Rat (the white rat with red eyes all five frozen sheets share), the Snow Fox, * the Lost Trapper Remnant, the Drain Scavenger and the Culvert Lookout (who calls the rats). Event-only: they live in * a dungeon's streams, at levels scaled to whoever is inside. */ | 'frostrat' | 'snowfox' | 'trapperremnant' | 'drainscavenger' | 'culvertlookout' /** * Frostwatch Cellar (frozenDungeons.ts, slice C5a, 2026-10-12; design-references frostwatch-cellar): the Snow Deserter * (a walking watchman gone feral, melee) and the Watch Captain Remnant (a skeletal knight in kingdom plate who sounds * his horn for more deserters). Event-only, scaled like the others. */ | 'snowdeserter' | 'watchcaptain' /** * Brindlecross wildlife (brindlecrossWildlife.ts, slice 5, 2026-10-14): the wild boar rooting in the bean patches * and the hedge-thief working the stream bank and the North Road. */ | 'boar' | 'hedgethief' /** Riversend Halt wildlife (riversendWildlife.ts, T1 slice 5, 2026-10-14): the reed hound on the river banks and the bridge bandit. */ | 'reedhound' | 'bridgebandit' /** * The Red Waste's people and creatures (redWasteCreatures.ts, slice C13-2, 2026-10-14): the Chasm Prowler, the Waste Raider, * the raiders' chief and the Scavenger who gives Raiders of the Red Waste. */ | 'chasmprowler' | 'wasteraider' | 'raiderchief' | 'redwastescavenger' /** * Gallowmere's people and creatures (gallowmereFolk.ts, gallowmereCreatures.ts, slice C12, 2026-10-14): Warden Osric, Mother Hesk, * Brother Calloway; the night-only Hollowed Villager and Hollowed Miner, the Gallows Crow and the Bell-Ringer. */ | 'gwosric' | 'gwhesk' | 'gwcalloway' | 'hollowedvillager' | 'hollowedminer' | 'gallowscrow' | 'bellringer' /** The Gravewatch (gravewatch.ts, T72 2026-10-14): Sexton Dunmore at the post and the Tomb Warden, the Crypt Grounds' mausoleum keeper. */ | 'gvsexton' /** The Gravekeepers (respawnPoints.ts, 2026-10-18): one per city, they set where a defeated character wakes. */ | 'gravekeeper' | 'skeletonwarden' /** The Toll Road (tollRoad.ts, T79 2026-10-14): Toll-Warden Ansel Pike, the informer Whisper Pim and the Redcap Captain in the Ridge cellar. */ | 'tollwarden' | 'ridgeinformer' | 'redcapcaptain' | 'goblinwarchief' /** The Tidewater Run (tideTunnel.ts, T117 2026-10-15): the Tide-Reeve, the wreckers' mid-boss in the sea cave under the Redclay Hook. */ | 'tidereeve' /** The Saltmark Sea Cave's boss (bayReaches.ts, pirate bay phase 7): a smuggler on Bosun Harrow's build. */ | 'tidebroker' /** The bay's ship captains (pirateShips.ts, sheet B10): the Cormorant's, the Mire Jack's, the Iron Hush's and the Grey Wake's. */ | 'ragtorskeel' | 'sablevenn' | 'brannthehush' | 'drownedcaptain' /** Tide of Blood (tideOfBlood.ts): the Blood Mire's leeches and its tide mini-boss. */ | 'mireleech' | 'bloodtideelemental' /** Rook's Orchard's rooks (rooksOrchard.ts, T28 2026-10-14): the orchard rook and the Great Rook of the Dead Nest Tree. */ | 'rook' | 'greatrook' /** Windward Signal Field's gale crow and Chalkshell Scarp's chalk burrower and Chalk Matron (windwardSignalField.ts, chalkshellScarp.ts, T39 2026-10-14). */ | 'galecrow' | 'chalkburrower' | 'chalkmatron' /** Webfen Causeway's mud toad, reed spinner, fen heron and the Reedweb Matriarch (webfenCauseway.ts, T69 2026-10-14). */ | 'mudtoad' | 'reedspinner' | 'fenheron' | 'reedmatriarch' /** Gullhook Head's wrecker chief (gullhookHead.ts, T70 2026-10-14): Skerrow the Lamp-Snuffer, level 30, with the Gaff Haul. */ | 'skerrow' /** Thaw Crossing's wraith (thawCrossing.ts, T107 2026-10-14): the Thaw Wraith, level 36, with the Thaw Shear. */ | 'thawwraith' /** The Arcane Realms' creatures and mini-boss (arcaneRealmsContent.ts, T86 2026-10-14): wisp, sentinel, hawk and the Runebound Warden. */ | 'manawisp' | 'runesentinel' | 'zephyrhawk' | 'runewarden' /** Saltmere Crescent's salt crab, wreck rat and shore reaver (saltmereWildlife.ts, T68 2026-10-14). */ | 'saltcrab' | 'bayrat' | 'shorereaver' /** The Redclay Hook's clay crab, mud goat and kiln raider (redclayWildlife.ts, T68 2026-10-14). */ | 'claycrab' | 'mudgoat' | 'kilnraider' /** The Shale Teeth's shale hound, cliff gull and quarry crab (shaleTeethWildlife.ts, T88 2026-10-14). */ | 'shalehound' | 'cliffgull' | 'quarrycrab' /** The Reedwheel Fan's reed goat, marsh crab and Old Greyneck the heron (reedwheelFanWildlife.ts, T88 2026-10-14). */ | 'reedgoat' | 'marshcrab' | 'greyneckheron' /** The Knucklebone Isles' island raider, reef crab, skull raider and Captain Marrow (knuckleboneIslesWildlife.ts, T88 2026-10-14). */ | 'isleraider' | 'reefcrab' | 'skullraider' | 'wreckcaptain' /** The Last Signal's coast hound, battery raider, cleft crab and the Dark Keeper (lastSignalWildlife.ts, T81 2026-10-14). */ | 'coasthound' | 'batteryraider' | 'cleftcrab' | 'darkkeeper' /** The Dwarf Road's mid-band boss in the Gnawed Cut (dwarfRoadDens.ts, T102 2026-10-14): a great iron beetle that eats the rail. */ | 'raileater' /** Ashfall Camp's mini-boss in the Ashmaw's Hollow (ashfallDens.ts, T121 2026-10-15): a huge ash-grey brute that came up out of the vents. */ | 'ashmaw' /** Cairn Shelf's mini-boss on Thunderhorn's Crag (cairnShelfDens.ts, 2026-10-18): a huge weathered ram with one cracked horn. */ | 'thunderhorn' /** The Serpent Stones' mini-boss in the vault behind the Serpent's Mouth (serpentStones.ts, 2026-10-19): a huge stone serpent plated in black basalt. */ | 'basaltback' /** Gannet Point's mini-boss on Gannet Stack (gannetPointDens.ts, 2026-10-18): Old Skerrywing, a huge scarred gannet matriarch. */ | 'skerrywing' /** Highfold Watch's mini-boss in the Hollow Gallery (highfoldDens.ts, 2026-10-18): a colossal empty suit of dwarven plate with a lantern in its chest. */ | 'hollowwatchman' /** The Ironjaw Round's mini-boss (ironjawRound.ts, 2026-10-19): an ogre camp cook with an iron ladle, level 38. */ | 'cookpotgrumm' /** Ranger's Rest's mini-boss, the poachers' chief in the Snare Cut (rangersRestDens.ts, T120 2026-10-15). */ | 'snaremaster' /** Saltgrass Downs' mini-boss, the great grey wolf on the stony knoll (saltgrassDens.ts, 2026-10-18). */ | 'greyback' /** Bracken Heath's mini-boss, the scarred old boar in the thicket by the Heath Dash's south turn (brackenHeathDens.ts, 2026-10-19). */ | 'oldgorsetusk' /** * Greenwood Wilds' creatures and boss (greenwoodWildlife.ts, 2026-10-14): the Bristlehart Stag, Mossback Tortoise, Reedrunner Crane, * Burrow Mole, Amber Hare, Barkhide Lynx, Knuckleroot, the Thornwood Reiver and the Greenwarden Hart. */ | 'bristlehartstag' | 'mossbacktortoise' | 'reedrunnercrane' | 'burrowmole' | 'amberhare' | 'barkhidelynx' | 'knuckleroot' | 'thornreiver' | 'greenwardenhart' /** Greenwood Wilds' person (greenwoodQuest.ts, slice 3): Marta Fenn, the hunter at the Old Hunter Camp. Not a fight. */ | 'gwhunter' /** * The Dwarf Road's creatures, boss, people and carts (dwarfRoadWildlife.ts, 2026-10-14): the Rock Crawler, Mountain Goat, Iron Beetle, * Cliff Hawk, Stone Serpent, Track Hound and the Iron Warden; Foreman Durrik Slate (not a fight); the runaway mine cart (never a fight). */ | 'rockcrawler' | 'roadgoat' | 'ironbeetle' | 'cliffhawk' | 'stoneserpent' | 'trackhound' | 'ironwarden' | 'drforeman' | 'runawaycart' /** * Emberdeep Ruins (emberdeepRuins.ts, T18, 2026-10-14): six creatures, the boss and the Surveyor who gives Light the Ember Seals * and Cinder and Ash. */ | 'ashcrawler' | 'sootbeetle' | 'cindertoad' | 'emberbat' | 'ruinscavenger' | 'basalthound' | 'cinderwarden' | 'edsurveyor'; export type ChunkCoord = { cx: number; cz: number; }; export type WorldEntity = { id: string; kind: EntityKind; lx: number; lz: number; style?: string; scale?: number; qty?: number; ttlMs?: number; /** Visual fade window in ms. When equal to `ttlMs`, the item fades over its whole life. */ fadeMs?: number; /** * Milliseconds until a worked-out ore seam refills, as of the moment this * entity was sent. A REMAINING duration, never an absolute timestamp - the * same trick `ttlMs` uses, and for the same reason: the client has no clock * agreed with the server, so it counts down from whatever it was handed. * Absent on a seam with ore still in it, and on every other kind. */ respawnMs?: number; }; export type ChunkData = { cx: number; cz: number; height: number[]; surface: number[]; entities: WorldEntity[]; /** * Tiles room furniture blocks (counters, tables, a cauldron's hearth), as local * indexes lz * CHUNK_SIZE + lx: meshes in the client's rooms, so the client only * knows them from here. Absent when the chunk has none, and from older servers. */ furniture?: number[]; /** Authored flat structural floors/treads, as local indexes. Their heights are exact, not terrain-smoothed. */ structureFloors?: number[]; }; export declare const SURFACE_COLORS: Record; export declare const TILE_COLORS: Record; export declare function chunkKey(cx: number, cz: number): string; export declare function worldToChunk(x: number, z: number): ChunkCoord & { lx: number; lz: number; }; export declare function toWorldZ(localZ: number): number; /** Inverse of toWorldZ. Local z runs past PLAYABLE_HEIGHT out over the south sea. */ export declare function toLocalZ(worldZ: number): number; export declare function chunksAround(cx: number, cz: number, radius: number): ChunkCoord[]; export declare function localIndex(lx: number, lz: number): number; export declare function isWalkableSurface(surface: SurfaceType): boolean; /** * Props of their own kind (so they can be clicked) drawn from a Blender model * whose style is its CAPITAL_BUILDING_MODELS id and facing, e.g. * `ciderpress-w`: their footprint and collision are the model's. */ export declare function isModelPropKind(kind: string): boolean; export declare function entityBlocksWalk(kind: EntityKind): boolean; /** Dungeon room-gate visual states - mirrors ranch gate open/closed styling. */ export declare function isDungeonDoorOpen(style: string | undefined): boolean; /** * A dungeon gate the viewing player has earned the right to open, but which is * still physically DOWN. * * Unlocking used to swap the style straight to `-open`, so a gate you had * cleared was simply drawn permanently winched up - there was never a moment of * opening it, and nobody else saw anything happen. `-ready` keeps the * portcullis closed and lets the client mark it as openable (a glow), so the * open is an action with an animation and a sound rather than a state you * arrive to. */ export declare function isDungeonGateReady(style: string | undefined): boolean; /** Goblin cell gates share personal dungeon crossing, not shared fence toggles. */ export declare function isGoblinPrisonDoorStyle(style: string | undefined): boolean; /** Dungeon wall torch - lantern entity with a `torch-*` facing style. */ export declare function isWallTorchStyle(style: string | undefined): boolean; export type FenceGateInfo = { kind: 'gate' | 'gate-wide' | 'gate-prison'; ew: boolean; closed: boolean; }; /** Parse farm fence gate styles such as `gate-wide-closed-ew`. */ export declare function parseFenceGateStyle(style: string | undefined): FenceGateInfo | null; export declare function formatFenceGateStyle(info: FenceGateInfo): string; /** Walk-through wooden door set into a battlefield palisade (`wooden-door` / `wooden-door-ew`). */ export declare function isWoodenPalisadeDoorStyle(style: string | undefined): boolean; /** Open fence gate styles that leave a walkable gap in a fence ring. */ export declare function isOpenGateStyle(style: string | undefined): boolean; export declare function isFenceGateStyle(style: string | undefined): boolean; export declare function isRanchGateOpen(style: string | undefined): boolean; /** * Storage-hut (Base Camp bank) door. * * Plain `'repaired'` means open, and only the explicit closed style shuts it. * After repair the door starts closed; clicking the personal enter icon opens * it, teleports the player through, then closes it again. * * The door is deliberately **not** a passage blocker. Hut repair is per-player * (see World.entityForPlayer, which rewrites the style per viewer off * `player.storageHutRepaired`), so the door state is per-player too - and the * walkability grid is global, so a per-player door cannot gate it without one * player's door blocking another player's path. Unrepaired players still see * the abandoned wreck (no enter icon); repaired players use the door portal. */ export declare const STORAGE_HUT_DOOR_CLOSED_STYLE = "repaired-closed"; /** * The Long Pier hut's repaired family. The pier hut mends into an open-topped * bank room rather than Base Camp's roofed store, so it needs its own * repaired styles for the client to branch on; the door rule is the same * (plain = open, `-closed` = shut). */ export declare const HOPE_PIER_HUT_REPAIRED_STYLE = "repaired-pier"; export declare const HOPE_PIER_HUT_REPAIRED_CLOSED_STYLE = "repaired-pier-closed"; export declare function isStorageHutRepairedStyle(style?: string): boolean; export declare function isStorageHutDoorOpen(style?: string): boolean; /** Any of the pier hut's styles, wrecked or mended: the client draws the pier room for these. */ export declare function isStorageHutPierStyle(style?: string): boolean; /** * The open and closed repaired styles for a hut. The server rewrites the * abandoned world entity to one of these per viewer, so the pair must come * from the hut's key and never from the (unchanging) live style. */ export declare function storageHutRepairedStyles(key: StorageHutKey): { open: string; closed: string; }; /** * Which storage hut a `storagehut` entity is. There are two: Base Camp's * (`'abandoned'`) and the Long Pier's smelt-stage hut (`'abandoned-pier'`), * each repaired per player on its own. * * The style is the key because the live world entity keeps its abandoned * style forever: World.entityForPlayer rewrites only the copy sent to a * viewer. So the server can read the key off any storagehut entity it holds, * in the interact handler, the door timer, or a chunk send, without threading * chunk coordinates through to compare positions. Only the abandoned style is * read here, because that is the only style the live entity ever carries; * the repaired pier styles exist for the viewer copy alone. */ export type StorageHutKey = 'camp' | 'pier'; export declare const HOPE_PIER_HUT_STYLE = "abandoned-pier"; export declare function storageHutKey(style?: string): StorageHutKey; export declare function isGateInteractable(kind: EntityKind | string, style?: string): boolean; export declare function isGateOpen(kind: EntityKind | string, style?: string): boolean; export declare function toggleGateStyle(kind: EntityKind | string, style: string | undefined): string | undefined; /** Tile offsets a closed gate blocks relative to its entity tile. */ export declare function visitGatePassageOffsets(kind: EntityKind | string, style: string | undefined, visit: (dx: number, dz: number) => void): void; export type BuildingDoorFacing = 'posZ' | 'negZ' | 'posX' | 'negX'; /** Axis-aligned wall-ring extents in tiles from the building center. */ export type BuildingFootprint = { radiusX: number; radiusZ: number; }; /** * Tile wall-ring size for beach/farm/storage huts. * Most styles use a square from scale brackets. The farm `stable` is a long * barn whose mesh (×1.15 render scale) is wider than the scale bracket, so * radiusX follows the mesh half-width (walls align with the visual ends). * Z stays on the bracket so the south wall stays north of horse-pen gates. */ export type StoneHouseVariant = 'cottage' | 'house' | 'shop' | 'inn' | 'pub' | 'potion' | 'kitchen' | 'clothes' | 'bank' | 'hall' | 'lodge'; /** * Tile ring radius per variant, so a building covers (2r + 1) squared tiles. * * Every one of these went up a step: the town read as a model village at the * old sizes next to a 4.2-high wall. The pub and the hall are 11x11, which is * as large as the plan takes without the streets losing their shape. * * `lodge` is rectangular: this number is the longer half (along the door axis). * Across-the-door half is `STONE_HOUSE_LODGE_RADIUS_ACROSS`. */ export declare const STONE_HOUSE_RADIUS: Record; /** Shorter half of the fishery lodge, across the door axis. */ export declare const STONE_HOUSE_LODGE_RADIUS_ACROSS = 5; /** Style is `-`, e.g. `pub-n`. */ export declare function stoneHouseVariant(style: string | undefined): StoneHouseVariant; /** * What a walk-in building stands on (2026-09-20): flagstones under the * civic and trade halls (town and guild halls, banks, pubs, temples, * forges), boards under the houses, shops, inns, lodges and warehouses. * Read by every builder that floors a footprint so a bank in Calverton and * a bank in the Capital agree. */ export declare function buildingFloorSurface(kind: EntityKind, style: string | undefined): SurfaceType; /** * The walkable inside of the Great Keep, in tile offsets from its centre: * the gate passage (three wide on the keep's row, from the west face to * the hall) and the throne hall (the great hall's floor, between its walls * at local x -4.25 and 5.25 and z +-7). The asset and the server both * build to this; the door is the passage's mouth on the west face. */ export declare const CASTLE_PASSAGE_HALF_W = 1; export declare const CASTLE_HALL_MIN_DX = -3; export declare const CASTLE_HALL_MAX_DX = 4; export declare const CASTLE_HALL_HALF_DZ = 6; export declare function inCastleKeepRoom(dx: number, dz: number): boolean; /** * Which way the door looks, as a world-space facing. * * Local +Z is the door before the model is turned, and a yaw of t maps local * +Z to (sin t, cos t): 0 -> +Z, +90 -> +X, 180 -> -Z, -90 -> -X. The letters * are compass directions with +X east and +Z south, so this table and the * asset's yaw table have to agree or a building faces the wrong way and its * doorway is cut in the wrong wall. */ export declare function stoneHouseDoorFacing(style: string | undefined): BuildingDoorFacing; /** * A diagonal facing (the Great Aquarium's tanks on the hall's angled walls, sheet E, 2026-10-03): the style's last * token `ne`, `nw`, `se` or `sw` names where the front looks, as a world step (+X east, +Z south). Only a model whose * CAPITAL_BUILDING_MODELS entry is `diagonal` takes one (buildingModelDiagonalFront); for anything else that token reads * as stoneHouseDoorFacing always has. */ export declare function buildingDiagonalFront(style: string | undefined): readonly [number, number] | null; /** The yaw that turns local +Z (the front) to a diagonal front: the same (sin t, cos t) table as stoneHouseDoorFacing. */ export declare function diagonalFrontYaw(front: readonly [number, number]): number; /** The Capital keep's footprint half-extents: 25 by 19 tiles about its tile. */ export declare const CASTLE_KEEP_HALF_X = 12; export declare const CASTLE_KEEP_HALF_Z = 9; /** * The Capital's walk-in buildings: half-extents with the door on +Z before * the facing turns them, style `-` like the stonehouses. * across: half-width along the street face; deep: half-depth away from it. */ export declare const CAPITAL_BUILDING_HALVES: Record<'rowhouse' | 'manor' | 'temple' | 'forgehall' | 'warehouse', { across: number; deep: number; }>; export declare function capitalBuildingFootprint(kind: EntityKind, style: string | undefined): BuildingFootprint; /** The look tokens between a rowhouse style's roof and its facing. */ export declare function rowhouseTokens(style: string | undefined): Set; /** * The Capital's Blender buildings (kind `capitalbuilding`, 2026-09-25): the * footprint every side builds to, before the facing turn (door on local +Z, * `across` along the door face, `deep` away from it; odd numbers, the model's * origin on the centre tile). This mirrors the frontend's BUILDING_MODELS * table (buildingModels.ts), which loads the GLB; the two must agree. * * - `mouth`: tiles open on the door side's middle (1 = a door; 5 = the Main * Forge's open hearth front); 0 for a solid model, which blocks its whole * footprint and has no room. * - `frontProps`: tiles OUTSIDE the footprint where the model's own front * dressing stands (lamp posts, notice boards, planters, porch columns), in * the local frame (door +Z, so dz > the ring); solid. The steps stay * walk-on. Measured from the model's build script, not guessed. * - `open`: a hollow model with no roof over its middle (the hot spring's * boulder ring round the pool). Its ring blocks like a building's walls, * but standing inside is standing outdoors: no roof to hide, no indoor light. * * Only the Trade Hall is placed in phase 1 (tr-ge in capital.ts); the * others are listed so their plots, collision and rooms are settled early. */ export type CapitalBuildingModel = { readonly across: number; readonly deep: number; readonly mouth: number; readonly solid?: boolean; readonly open?: boolean; /** Floor you walk across: a deck. Nothing in its footprint blocks, whatever its size. */ readonly walkable?: boolean; /** * Stands on its own tile's height, not the smoothed height the client gives props (a deck out over the sea: smoothed, * its open-water neighbours drag it down into the water, the Long Pier's trap). */ readonly rawHeight?: boolean; /** * Exact occupied tile centers in the model's south-facing frame. An explicit * mask replaces the rectangular wall rule, including for a walkable deck * with solid masts or rails. Both server and client rotate this same mask. */ readonly blockedOffsets?: ReadonlyArray; /** * Named GLB groups that are actual walking surfaces. When present, floor * picking accepts only these groups, so a mast, hull or sail is never floor. * Group names are the workshop suffix, for example 'deck' or 'holdsteps'. */ readonly walkSurfaceParts?: ReadonlyArray; /** * Exact room tiles in the south-facing frame, for a walk-in whose room is not centred on its anchor (a shanty on its * deck). The roof lifts for anyone standing on one; the same list is rotated by the style's facing. */ readonly interiorOffsets?: ReadonlyArray; /** What blocks instead of blockedOffsets when the style carries the token `closed`. */ readonly closedBlockedOffsets?: ReadonlyArray; /** * A regular octagon on its square footprint (the Great Aquarium's hall, sheet E): the walls stand on the tiles whose * octagon radius (buildingOctagonRadius) is past the room's and within the wall's, r - 0.5 to r + 0.25 for a footprint * r tiles from its centre to its edge, and the cut corners beyond are open ground. The collision, the roof hide and the * click snap all read it (the `shape` argument of buildingWallBlocksOffset and isBuildingInteriorOffset). */ readonly octagon?: boolean; /** May stand at 45 degrees: a style ending `-ne`, `-nw`, `-se` or `-sw` lays it along that diagonal (buildingDiagonalFront). */ readonly diagonal?: boolean; /** * More openings as wide as the door's mouth, on the walk-in's other sides (local: 'back' opposite the door, 'left' on * local -X, 'right' on +X): the Capital Aquarium's hall opens into its three wings. The collision and the roof hide both * read them (buildingExtraDoorFacings, the `extraDoors` argument of buildingWallBlocksOffset and isBuildingInteriorOffset). */ readonly mouths?: ReadonlyArray<'back' | 'left' | 'right'>; readonly frontProps?: ReadonlyArray; }; export declare const CAPITAL_BUILDING_MODELS: Readonly>; /** The model id in a `capitalbuilding` style (its first dash token), when it names one. */ export declare function capitalBuildingModelId(style: string | undefined): string | null; export declare function capitalBuildingModel(style: string | undefined): CapitalBuildingModel | null; /** The room tiles of a walk-in whose room has its own list (interiorOffsets), turned to the style's facing; else null. */ export declare function buildingModelInteriorOffsets(style: string | undefined): Array<[number, number]> | null; /** A Blender model's diagonal front, when it is a `diagonal` model standing on a diagonal (else null: n/e/s/w as ever). */ export declare function buildingModelDiagonalFront(style: string | undefined): readonly [number, number] | null; /** The outline a walk-in's walls follow: a rectangle ring, or an `octagon` model's eight walls. */ export type BuildingShape = 'rect' | 'octagon'; export declare function buildingShapeOf(kind: EntityKind | string, style: string | undefined): BuildingShape; /** * The world facings of a walk-in's extra openings (CapitalBuildingModel.mouths), turned with the building: a hall whose * door faces west with mouths back, left and right opens on all four sides. Empty for everything else. */ export declare function buildingExtraDoorFacings(kind: EntityKind | string, style: string | undefined): BuildingDoorFacing[]; /** A tile's distance from a regular octagon's centre in the octagon's own measure: max(|dx|, |dz|, (|dx| + |dz|) / sqrt 2). */ export declare function buildingOctagonRadius(dx: number, dz: number): number; /** * A local-frame offset (door on +Z) turned to the building's facing: the * same turn the assets make (`facingYaw`) and visitFurnitureTiles applies. */ export declare function turnBuildingOffset(lx: number, lz: number, facing: BuildingDoorFacing): [number, number]; /** * THE MOUTH RULE (2026-09-25). How many tiles either side of the door's * middle tile are open on the door side: 2 for a `mouth5` style token, 1 for * `mouth3`, 3 for `mouth7` (any odd `mouthN`), else the Blender model's own * mouth, else 0 (a one-tile door). The collision (visitBlockedWalkOffsets, * so the server and the client's prediction) and the roof hiding * (isBuildingInteriorOffset) both take it, so the three always agree. */ export declare function buildingDoorHalfWidth(kind: EntityKind | string, style: string | undefined): number; /** * citywall: the piece stands on the wall's outer row and is two tiles thick * inward (n: +z is inward, s: -z, w: +x, e: -x). A bastion is a 3x3 drum on * its tile. The inner curtain (curtain-) is one tile thick. */ export declare function visitCityWallOffsets(style: string | undefined, visit: (dx: number, dz: number) => void): void; /** * The gatehouse's span across the passage (tiles either side of centre) and * its depth along it. The Great Gate (main-*) is the monumental one: towers * on tiles +-3..6 and a seven-tile tunnel; the side, inner and barbican * gates are two tiles smaller each way. */ export declare const GATEHOUSE_HALF_SPAN = 6; export declare const GATEHOUSE_SIDE_HALF_SPAN = 4; export declare const GATEHOUSE_HALF_DEPTH = 3; export declare const GATEHOUSE_SIDE_HALF_DEPTH = 2; export declare const GATEHOUSE_PASSAGE_HALF_W = 2; /** * A gatehouse's facing: the LAST n/s/e/w token of its style (`main-w`, * `side-e`, `main-shut-n`). The facing is always written last, because the * frontend turns the model by the style's last token. */ export declare function gatehouseFacing(style: string | undefined): 'n' | 's' | 'e' | 'w'; /** * A barred gatehouse (2026-09-25, the Capital's North and South Gates): * a `shut` token (`main-shut-n`) lets the portcullis down, and the passage * blocks like the towers, so the collision alone keeps it shut whatever the * builder does with the wall rows under it. */ export declare function isGatehouseShut(style: string | undefined): boolean; /** Which way the passage runs: -w/-e styles run along x, -n/-s along z. */ export declare function gatehousePassageAlongX(style: string | undefined): boolean; export declare function visitGatehouseOffsets(style: string | undefined, visit: (dx: number, dz: number) => void): void; export declare function buildingFootprintExtents(kind: EntityKind, scale: number | undefined, style?: string): BuildingFootprint; /** West tack-room lean-to tiles beyond the stable's main wall ring. */ export declare function visitStableLeanToBlockedOffsets(scale: number | undefined, visit: (dx: number, dz: number) => void): void; /** Max axis of {@link buildingFootprintExtents} (square buildings: the ring radius). */ export declare function buildingFootprintRadius(kind: EntityKind, scale: number | undefined, style?: string): number; /** * The door opening on a building's ring. `halfW` is the mouth rule's * half-width (buildingDoorHalfWidth): 0 is the one middle tile, 2 a * five-wide mouth. The corners always stay wall. */ export declare function isBuildingDoorOffset(dx: number, dz: number, footprint: number | BuildingFootprint, doorFacing?: BuildingDoorFacing, halfW?: number): boolean; export declare function buildingWallBlocksOffset(dx: number, dz: number, footprint: number | BuildingFootprint, doorFacing?: BuildingDoorFacing, halfW?: number, shape?: BuildingShape, extraDoors?: readonly BuildingDoorFacing[]): boolean; /** * Inside the building for the roof hide: any footprint tile that is not a * blocked ring tile (the door, or the whole mouth, counts as inside). Pass * the mouth rule's `halfW` (buildingDoorHalfWidth(kind, style)) so the roof * lifts across a wide mouth exactly where the collision opens it. */ export declare function isBuildingInteriorOffset(dx: number, dz: number, footprint: number | BuildingFootprint, doorFacing?: BuildingDoorFacing, halfW?: number, shape?: BuildingShape, extraDoors?: readonly BuildingDoorFacing[]): boolean; export declare function boulderFootprintRadius(style: string | undefined, scale: number | undefined): number; export declare function blockingFootprintRadius(kind: EntityKind, style: string | undefined, scale: number | undefined): number; export declare function isCaveTunnelExitStyle(style: string | undefined): boolean; export declare function isGoblinCaveStyle(style: string | undefined): boolean; export declare function isSpiderCaveStyle(style: string | undefined): boolean; /** * The den in Spider Hollow: the Dreadwoods' way down into the Spider Cave, and * where the cave's exit brings you back up. Its own style rather than a second * burrow because it is a different thing to look at - a hole under the roots * of a dead tree, silked over - and a compact footprint in a wood, not a * hillside. */ /** * How big a rat is drawn, from its level. One model serves every rat in the * world - the den vermin and tunnel rats at level 2, the pit's giants at * level 10 - and the size is the level: 5.4 at level 2, 7.6 at level 10, * growing on past that if a bigger rat is ever spawned. The client reads * this off NpcPublic.level, so a rat needs no `scale` sent for it. */ export declare function ratWorldScale(level: number): number; /** The level at which a rat is a giant: red-eyed, and named as one. */ export declare const GIANT_RAT_LEVEL = 10; export declare function isSpiderDenStyle(style: string | undefined): boolean; /** Wolf den mouth in the woods around Calverton. */ export declare function isWolfDenStyle(style: string | undefined): boolean; /** Crawl-out hole inside a wolf den cavern. */ export declare function isWolfDenExitStyle(style: string | undefined): boolean; /** Tiny animal-dug hole in the woods - not the Base Camp Suspicious hole. */ export declare function isAnimalDenStyle(style: string | undefined): boolean; /** Crawl-out hole inside a forest den cavern. */ export declare function isDenExitStyle(style: string | undefined): boolean; export declare function caveEntranceApproachOffset(style: string | undefined): { dx: number; dz: number; }; export declare function visitCaveEntranceBlockedOffsets(style: string | undefined, visit: (dx: number, dz: number) => void): void; /** Yaw in degrees from a `face` style suffix (`unbuilt-face180`), or null. */ export declare function faceStyleDegrees(style: string | undefined): number | null; export type GardenWallLook = 'stone' | 'hedge' | 'noble' | 'fence'; export type GardenWallRun = { len: number; alongX: boolean; look: GardenWallLook; }; export declare function parseGardenWallRun(style: string | undefined): GardenWallRun | null; export declare function gardenWallRunStyle(len: number, alongX: boolean, look?: GardenWallLook): string; /** The walk-through gate piece for a wall of `look`: noble walls take the iron gate. */ export declare function gardenWallGateStyle(alongX: boolean, look?: GardenWallLook): string; export declare function isGardenWallGateStyle(style: string | undefined): boolean; /** The tiles a gardenwall blocks: a whole run, one piece, or nothing for a gate. */ export declare function visitGardenWallOffsets(style: string | undefined, visit: (dx: number, dz: number) => void): void; export declare const TREE_GROVE_TRUNKS: Readonly>>; /** The grove size a tree style names (3 or 5), or null for a single tree. */ export declare function treeGroveSize(style: string | undefined): 3 | 5 | null; /** The trunk tiles of a grove style, about its entity tile, or null for a single tree. */ export declare function treeGroveTrunks(style: string | undefined): ReadonlyArray | null; export declare function statuePlinthSize(style: string | undefined): 0 | 3 | 5; /** A statue style with its plinth token, the facing (if any) kept last. */ export declare function statueStyleWithPlinth(style: string, size: 0 | 3 | 5): string; export declare function visitBlockedWalkOffsets(kind: EntityKind, style: string | undefined, scale: number | undefined, visit: (dx: number, dz: number) => void, doorFacing?: BuildingDoorFacing): void; export declare function isWalkable(tile: TileType): boolean; //# sourceMappingURL=constants.d.ts.map