import type { OreStyleId } from './mining.js'; export declare const CROSSROADS_WORLD_X: number; export declare const CROSSROADS_LOCAL_Z = 17; /** * Bounty Board and Bruce - on the south side of the Crossroads, the first thing a * player meets coming up the road from Hope Beach. Inside the existing `crossroads` * discovery zone; no new zone. */ export declare const BOUNTY_BOARD_X: number; export declare const BOUNTY_BOARD_LOCAL_Z: number; /** Bruce stands two tiles west of the board, clear of its posts rather than tucked against them. */ export declare const BOUNTY_BRUCE_X: number; export declare const BOUNTY_BRUCE_LOCAL_Z: number; export declare const HOPE_PIER_X: number; /** Tiles either side of HOPE_PIER_X. Three wide, one wider than the bridge. */ export declare const HOPE_PIER_HALF_W = 1; /** Sand ramp where the deck leaves the beach. */ export declare const HOPE_PIER_SHORE_Z: number; /** * Seaward end. Pinned to the shore rather than to the map edge: the south sea * pad exists to put open water BEYOND the pier head (see WORLD_SOUTH_CHUNKS), * and tying the end to WORLD_HEIGHT would spend that padding on more decking * and leave the boundary visible from the last plank. */ export declare const HOPE_PIER_END_Z: number; /** * The east branch: a spur off the main walk to the moored ship, deliberately * SHORE-SIDE of both smashed spans so the ship is open to everybody, repaired * pier or not. */ export declare const HOPE_PIER_BRANCH_Z: number; export declare const HOPE_PIER_BRANCH_HALF_W = 1; export declare const HOPE_PIER_BRANCH_MIN_X: number; export declare const HOPE_PIER_BRANCH_MAX_X: number; /** * The last four columns of the branch open out into a five-wide landing * stage against the ship: somewhere for cargo, nets and the ship's master to * stand without blocking the walk out. */ export declare const HOPE_PIER_BRANCH_WIDE_MIN_X: number; export declare const HOPE_PIER_BRANCH_WIDE_HALF_W = 2; /** * Branson, master of the moored ship, stands on the landing stage facing back * down the branch so he is the first thing a player walking out to the ship * meets. His landing tile (where a voyage puts you ashore here) is beside him. */ export declare const BRANSON_SPAWN_X: number; export declare const BRANSON_SPAWN_Z: number; export declare const HOPE_BEACH_LANDING: { readonly x: number; readonly z: number; }; /** * BRANSON'S LANDING * * Branson's port on the Frozen Shore: a bay cut into the west crags level * with the Frozen Lake, a snow-dusted plank pier running nineteen tiles out * over the water to a landing head, his mate Oskar on the shore beside the * sailings board, the ship moored along the head's south side, and a hut up * on the rocky shelf north of the pier foot. It used to be a placeholder * jetty on the crag line; a nine-tile cove and a seven-tile pier replaced it * on 2026-09-17, and the same evening James found that cramped (the board * readable from one side, everything on top of everything else), so the * bay was opened up to twenty tiles, the pier lengthened out into it and * the shore spread out, with the Frozen Lake moved east to make the room * (see backend bransonsLanding.ts). * * World tiles (the north pad is part of the world grid, so no toWorldZ). * FROZEN_LAKE_CENTER is declared further down; its z is 236. */ /** The two rows of the pier walk, and the columns it runs over. */ export declare const BRANSONS_LANDING_PIER_MIN_Z = 300; export declare const BRANSONS_LANDING_PIER_MAX_Z = 301; /** The seaward end of the walk (the head's west column) and its foot on the shore. */ export declare const BRANSONS_LANDING_PIER_MIN_X = 3; export declare const BRANSONS_LANDING_PIER_FOOT_X = 21; /** The 4x4 landing head at the seaward end, a row wider than the walk each side. */ export declare const BRANSONS_LANDING_HEAD_MAX_X = 6; export declare const BRANSONS_LANDING_HEAD_MIN_Z = 299; export declare const BRANSONS_LANDING_HEAD_MAX_Z = 302; /** Where the gangplank leaves the head for the ship: the head's south row. */ export declare const BRANSONS_LANDING_GANGPLANK: { readonly x: 4; readonly z: 302; }; /** * The ship, lying east-west along the head's south side with its bow to the * open sea. `face270` turns the SailShip's +z bow onto -x; the `landingship` * token picks the shorter hull. */ export declare const BRANSONS_LANDING_SHIP: { readonly x: 6; readonly z: 305; }; export declare const BRANSONS_LANDING_SHIP_STYLE = "landingship-face270"; /** * The hull's tile footprint (all bay water), blocked so nothing paths under * it. Eleven long and four wide about the anchor: the bow a tile in from the * world's edge, the stern under the walk. */ export declare const BRANSONS_LANDING_SHIP_HULL: { readonly minX: 1; readonly maxX: 11; readonly minZ: 303; readonly maxZ: 307; }; /** * Bay water by row: the columns from the rim water (x 0-1) east that the * bay opens up. Rounded at both ends, twenty wide along the pier. */ export declare const BRANSONS_LANDING_COVE_ROWS: ReadonlyArray<{ z: number; maxX: number; }>; /** The rim rows the bay replaces: the west rim loop places no crag on these. */ export declare const BRANSONS_LANDING_COVE_MIN_Z = 288; export declare const BRANSONS_LANDING_COVE_MAX_Z = 315; /** Everything the landing owns, for the scenery sweep and the discovery zone. */ export declare const BRANSONS_LANDING_WORKS: { readonly minX: 0; readonly maxX: 34; readonly minZ: 284; readonly maxZ: 319; }; /** Oskar, Branson's mate, on the shore a step off the pier foot, facing the boards. */ /** * Oskar stands on the landing head, on the ship's side of it, where the * gangway comes ashore: a boat man belongs beside his boat (James, * 2026-09-22), not sixteen tiles up the pier on the sand. Passengers land * on the head beside him and walk the planks in past the board. */ export declare const BRANSONS_LANDING_OSKAR: { readonly x: 5; readonly z: 302; readonly faceX: 9; readonly faceZ: 301; }; /** The sailings board, up the apron from Oskar with room to walk round it. */ export declare const BRANSONS_LANDING_BOARD: { readonly x: 26; readonly z: 297; }; /** The hut on the shelf north of the pier foot, its door to the south, and the steps down. */ export declare const BRANSONS_LANDING_HUT: { readonly x: 27; readonly z: 292; }; export declare const BRANSONS_LANDING_HUT_LANTERN: { readonly x: 28; readonly z: 294; }; export declare const BRANSONS_LANDING_STEPS: readonly [{ readonly x: 27; readonly z: 294; }, { readonly x: 27; readonly z: 295; }]; /** The shelf the hut stands on, its ledge row, and the apron the pier leaves from. */ export declare const BRANSONS_LANDING_SHELF_HEIGHT = 3; export declare const BRANSONS_LANDING_LEDGE_Z = 294; export declare const BRANSONS_LANDING_APRON: { readonly minX: 21; readonly maxX: 33; readonly minZ: 295; readonly maxZ: 307; }; export declare const BRANSONS_LANDING_APRON_HEIGHT = 1; /** A lantern post on the apron, south of the walk, and the stores stacked by the board. */ export declare const BRANSONS_LANDING_APRON_LANTERN: { readonly x: 24; readonly z: 304; }; /** Ice floes on the bay water, clear of the ship and the pier. */ export declare const BRANSONS_LANDING_FLOES: ReadonlyArray<{ x: number; z: number; scale: number; }>; /** True for a cove water tile (the rim water at x 0-1 is water on every row anyway). */ export declare function isBransonsLandingCoveTile(x: number, z: number): boolean; /** True for a plank of the pier: the two-row walk out from the foot, and the head. */ export declare function isBransonsLandingDeckTile(x: number, z: number): boolean; /** Kept for the rim loop and older callers: the crag line the bay now cuts through. */ export declare const FROZEN_SHORE_JETTY: { readonly x: 2; readonly z: 301; }; /** Where a voyage puts you ashore: the landing head, off the ship's gangway. */ export declare const FROZEN_SHORE_LANDING: { readonly x: 4; readonly z: 301; }; /** * First smashed span, about a third of the way out - far enough that the walk * to it is a walk, close enough to see the break from the sand. */ export declare const HOPE_PIER_GAP1_MIN_Z: number; export declare const HOPE_PIER_GAP1_MAX_Z: number; /** Second smashed span, out past the middle deck at about two thirds. */ export declare const HOPE_PIER_GAP2_MIN_Z: number; export declare const HOPE_PIER_GAP2_MAX_Z: number; /** * The pier head: the last four rows widen into a platform, so the end of a long * walk is somewhere to stand rather than the last plank of a corridor. */ export declare const HOPE_PIER_HEAD_MIN_Z: number; /** The middle deck, a passing place between the two smashed spans. */ export declare const HOPE_PIER_MID_MIN_Z: number; export declare const HOPE_PIER_MID_MAX_Z: number; /** Both widenings are five tiles across against the walk's three. */ export declare const HOPE_PIER_WIDE_HALF_W = 2; /** The moored ship, off the seaward corner of the branch. */ export declare const HOPE_PIER_SHIP_X: number; export declare const HOPE_PIER_SHIP_Z: number; /** * The west spur: the smelt stage and its storage hut. * * It leaves the MIDDLE deck, not the shore-side walk, because the smelt water * is here, past the first smashed span, and the bank the hut opens is meant to * share that gate: plank gap 1 and both the fishing and the strongbox are * yours. It runs WEST because the ship already has the east, and two spurs off * one side would read as a second landing stage rather than a fishing stage. * * The spur is exactly the middle deck's three rows, so it reads as the deck * continuing sideways rather than a corridor bolted onto it. The hut block * hangs off the spur's south side and its door opens north onto the spur's * south row; the hut's own 7x7 stands on decking laid the same way, so nothing * inside it is ever open sea. */ export declare const HOPE_PIER_SPUR_Z: number; export declare const HOPE_PIER_SPUR_HALF_W = 1; export declare const HOPE_PIER_SPUR_MAX_X: number; export declare const HOPE_PIER_SPUR_MIN_X: number; export declare const HOPE_PIER_HUT_X: number; export declare const HOPE_PIER_HUT_Z: number; /** * 3.5 lands in the radius-3 footprint bracket (see buildingScaleBracketRadius): * a 7x7 wall ring, two tiles smaller each way than Base Camp's, because a * 9x9 hut would be wider than the stage it stands on. */ export declare const HOPE_PIER_HUT_SCALE = 3.5; export declare const HOPE_PIER_HUT_RADIUS = 3; /** The strongbox stands two rows behind the hut centre, as at Base Camp. */ export declare const HOPE_PIER_HUT_CHEST_DZ = 2; /** * The pier banker stands one row behind the centre: behind the counter (which * straddles the seam between the centre row and his), in front of the chest. * The centre row itself is where the door portal drops a player, so nothing * may stand on it. */ export declare const HOPE_PIER_BANKER_DZ = 1; export declare const HOPE_PIER_BANKER_NAME = "Bursar Finch"; /** * Saul's tackle pitch: on the sand beside the pier ramp, west of the lane so * he never stands in the way of the walk out. He faces the pier. */ export declare const SAUL_SPAWN_X: number; /** * Well up the dry sand, not on the last row before the ocean. The tile one row * off the ramp is beach by the grid but the rendered shoreline laps across it, * so he read as standing in the sea. */ export declare const SAUL_SPAWN_Z: number; /** * The pier's fish, smelt markers and sea bass alike, hold PIER_FISH_MIN_OFF_DECK * to PIER_CAST_MAX_TILES off the nearest plank (pierDeckDistance: the walk, * the head, the decks, the branch, the spur and the hut block all count), and * a cast goes straight to the fish. The old model anchored the smelt markers * two tiles off the planks and sent the line to a random tile out from the * angler, so a click on one marker cast somewhere else entirely (James: "it * casted to a completely different location"). Now the marker IS the fish * and the line lands on it. * * Four, not three: three left two tiles of water between the rail and the * fish, which from the game camera still read as a fish beside the pier. * PIER_CAST_MAX_TILES is also how far an angler may stand from the fish. */ export declare const PIER_FISH_MIN_OFF_DECK = 4; export declare const PIER_CAST_MAX_TILES = 10; /** * Smelt markers out in the pier's smelt band at once, each on a tile the * backend draws at random (collectPierSmeltTiles) and redraws on the lake * timer and after every catch. */ export declare const HOPE_PIER_SMELT_SPOT_COUNT = 5; /** Crab cage spots along the side of the Long Pier at once, redrawn like the smelt. */ export declare const HOPE_BEACH_CRAB_SPOT_COUNT = 4; /** * Chebyshev tiles around HOPE_PIER_SHIP_X/Z no pier fish may sit in. The * moored ship has a one-tile footprint but its hull mesh covers a few tiles * each way, so a smelt marker or a bass inside this square would be on deck. */ export declare const HOPE_PIER_SHIP_KEEP_OUT = 4; /** * Chebyshev distance from (x, z) to the nearest lane tile: the walk, the head, * the middle deck, the east branch and the west spur with its hut block. A * bounded ring scan over onHopePierLane rather than a closed form, so it stays * right when the next spur is added. Returns 0 on the lane; capped at `limit` * (returned as limit + 1 when nothing is nearer), which keeps the scan cheap * for the callers that only care about the fish band of a dozen tiles. */ export declare function pierDeckDistance(x: number, z: number, limit?: number): number; export type HopePierGap = 1 | 2; /** Tiles either side of the centre line at this row. Wider over the two decks. */ export declare function hopePierHalfWidthAt(z: number): number; /** Tiles either side of the branch's centre row at this column. Wider over the landing stage. */ export declare function hopePierBranchHalfWidthAt(x: number): number; /** The east spur out to the moored ship. */ export declare function onHopePierBranch(x: number, z: number): boolean; /** * The west spur off the middle deck, and the hut block hanging off its south * side. The hut's 7x7 counts as lane because it is decking too: the deck * builder rails every lane tile whose neighbour is not lane, and a rail line * running under the hut walls would poke out through them. */ export declare function onHopePierSpur(x: number, z: number): boolean; export declare function onHopePierLane(x: number, z: number): boolean; /** * The one tile of a smashed span that carries the work, and once planked the * crossing icon. Centre of the break's landward row - the same discipline as * isBattlefieldBridgeTravelIconTile, so the hammer and the portal share a tile. */ export declare function isHopePierTravelIconTile(x: number, z: number): boolean; /** Where a player lands after using a planked span's crossing icon. */ export declare function hopePierCrossingExitZ(gap: HopePierGap, fromZ: number): number; /** Which smashed span a tile belongs to, or null for sound deck / open sea. */ export declare function hopePierGapAt(x: number, z: number): HopePierGap | null; export declare const EAST_ROAD_START_X: number; export declare const HIJACK_SITE_X = 402; export declare const HIJACK_SITE_LOCAL_Z = 22; export declare const BASECAMP_CENTER_X = 676; export declare const BASECAMP_CENTER_LOCAL_Z = 26; export declare const BASECAMP_RX = 54; export declare const BASECAMP_RZ = 19; export declare const BASECAMP_RIM_SCALE = 1.3; export declare const BASECAMP_FLOOR_H = 0; export declare const BASECAMP_PLATEAU_H = 6; export declare const BASECAMP_RIM_H = 10; export declare const BASECAMP_GATE_LOCAL_Z = 26; export declare const BASECAMP_GATE_HALF = 5; export declare const BASECAMP_WALL_X = 604; /** * Single-column rocky enclave on Base Camp's west face - the thin cliff/shore * where the battlefield lake meets camp. Not a filled gray slab. */ export declare const BASECAMP_ENCLAVE_X = 604; export declare const BASECAMP_SLOPE_MIN_X = 605; export declare const BASECAMP_SLOPE_MAX_X = 626; export declare const BASECAMP_CAVE_X: number; export declare const BASECAMP_CAVE_LOCAL_Z = 26; /** * The Suspicious hole gets its own style so it can keep its own entrance - the * carved stone gate in the camp's rock face. It used to render whatever the * shared default was, so when that default became the rat-pit mound on * 2026-09-06 the gate went with it. Any mouth left on a bare compass style * (the far-side door) keeps the mound; this one does not. * * The compass suffix still carries the facing: `caveEntranceFacing` and the * client's FACING_YAW both read the direction out of the style string. */ export declare const BASECAMP_CAVE_MOUTH_STYLE = "basecamp-west"; export declare function isBaseCampCaveMouthStyle(style: string | undefined): boolean; /** Small lookout beyond the Base Camp tunnel, reached only after clearing Livonia. */ export declare const BASECAMP_FAR_SIDE_X: number; export declare const BASECAMP_FAR_SIDE_LOCAL_Z = 26; /** * How far north the whole battlefield front line sits from the farm. * * The south palisade used to stand one tile off No Harm Farm's own north * fence, so a player walked out of the farm gate straight into a war. Every * absolute Z on the pad is written as its original survey number put through * `bfZ`, which keeps the internal layout - lake, camps, cabbage rows, the * bridge span, the Captain's parade ground - exactly as it was designed and * moves the whole thing as one piece. * * The ceiling on this number is the lake, not the farm. The water sheet runs * on east through the corridor south of the Dreadwoods, whose own south edge * is DEADLANDS_MAX_Z (639); the wall returns need a band between the two. At * 18 the lake's north bank lands at 648, leaving that corridor 9 tiles deep * with the returns still reaching it. Push much past this and the lake starts * eating the Dreadwoods' south wall. * * Declared up here, ahead of the Amazon Trail and Calverton, because the two * lake rows are the datum both of them are measured from: the trail ends on * the south shore and the town stands back from the north shore. */ export declare const BATTLEFIELD_NORTH_SHIFT = 18; /** * Lake between soldier (south / farmward) and goblin (north) camps. * Water blocks walking; the battlefield crossing is the long bridge once repaired. * Thick N-S band on the pad, then the same Z band continues east through the * corridor south of the Deadlands, past the west-face enclave, until it meets * the SE high-rock row. */ export declare const BATTLEFIELD_LAKE_MIN_Z: number; export declare const BATTLEFIELD_LAKE_MAX_Z: number; /** * The Amazon Trail - the long, tree-lined path leading north out of the Rat * Tunnel far-side exit (the Rat Tunnel is "the Amazonian cave": rats, then the * amazons of Room 3, then Livonia). It runs straight north up the eastern * margin of the world, east of the Dreadwoods, to the Battlefield lake's * south shore. There the road bends east along the shore to the Calverton * bridge, which crosses on the town gate's own axis (CALVERTON_BRIDGE_X). * * The lane used to cross the lake itself, on a causeway and then a bridge, * and land 45 tiles west of the gate with a road along the north bank to * finish the job. James, standing on the gate approach: "we should come off * the bridge here instead, it's a better location entering calverton". * * End to end the lane is AMAZON_TRAIL_LENGTH tiles, which at * MOVE_SPEED_TILES_PER_SEC (3.9) is about a 20 second walk; the shore road, * the bridge and the gate road add about 100 more. */ export declare const AMAZON_TRAIL_X: number; export declare const AMAZON_TRAIL_HALF_W = 5; /** Tiles either side of the lane that ease from path height back to wild ground. */ export declare const AMAZON_TRAIL_SHOULDER = 7; /** Just past the exit landing, so the path is already under your feet when you arrive. */ export declare const AMAZON_TRAIL_SOUTH_WORLD_Z: number; /** * The lane's last row: the north row of the shore road, one row up the bank * from the lake's south shore strip. The two overlap there, which is what * makes the join read as one road bending rather than two roads meeting. */ export declare const AMAZON_TRAIL_NORTH_WORLD_Z: number; export declare const AMAZON_TRAIL_LENGTH: number; /** True for the walkable lane itself (not the flanking tree bands). */ export declare function inAmazonTrail(x: number, z: number): boolean; /** * How far east of the trail head the town stands. * * Calverton used to be centred on the trail, which left its west wall 27 tiles * off the Dreadwoods east wall. Once that wall has a gate in it, 27 tiles is a * doorstep, not a journey: you would step out of the woods and be at the town. * Pushing the walls east puts open ground between the two, so the gate road is * a walk of about seventeen seconds. * * The trail cannot follow it - the south end is pinned to the Rat Tunnel * far-side exit and its north end is pinned to the lake's south shore - so the * road turns east off the trail head along that shore and crosses on the gate * axis instead. See CALVERTON_BRIDGE_X and CALVERTON_SHORE_ROAD_Z. * * Raised from 40 to 45 when the walls widened. The west wall is pinned by the * trail's tree screen, which reaches to x = AMAZON_TRAIL_X + 12: pushing the * centre east by the same amount the half-width grew keeps that wall exactly * where it was and spends all the new width on the east side, where there is * nothing but open grass out to the spider cave track. */ export declare const TOWN_EAST_OFFSET = 45; export declare const TOWN_CENTER_X: number; /** * Wall footprint, inclusive. The wall itself stands ON these rows/columns. * * Grown 57x43 -> 65x49 -> 75x63. The second growth was for the buildings * themselves; this one is for the ground between them. At 65x49 the plan was * packed tight enough that two of its sixteen buildings could not be placed at * all and the rest stood a tile apart, so the town read as one continuous block * of masonry with slots cut in it rather than houses with yards. */ export declare const TOWN_MIN_X: number; /** * Grown again on 2026-09-16, 75x63 -> 95x75, east and north only: the west * wall is pinned by the trail's tree screen and the south by the trail head. * At 75x63 the closest buildings still stood four tiles apart and a shop * door opened onto the market stalls; the extra ground goes between them. * The main street stays on the trail-head axis, so the town is deeper on * its east side. */ export declare const TOWN_MAX_X: number; /** * The south wall used to stand two rows off the lake shore, which put the * gatehouse beside the water: you stepped off the bridge and were in the * town. Pulled north (2 -> 22) so the approach road has a proper leg up from * the shore, and the town reads as standing back from the water rather than * on it. The fishery keeps its ground (FISHERY_TOWN_GAP). * * Measured from the bank row the bridge lands on (TOWN_APPROACH_Z), not from * the trail: the trail's north end moved to the south shore when the bridge * moved onto the gate axis, and the town must not move with it. */ export declare const TOWN_SOUTH_Z: number; export declare const TOWN_NORTH_Z: number; /** Walkable interior, one tile inside the wall on every side. */ export declare const TOWN_INNER_MIN_X: number; export declare const TOWN_INNER_MAX_X: number; export declare const TOWN_INNER_NORTH_Z: number; export declare const TOWN_INNER_SOUTH_Z: number; /** The whole town sits on one level so streets and buildings do not stair-step. */ export declare const TOWN_GROUND_HEIGHT = 3; /** Gates. The south gate takes the trail approach; the north gate the fishery road. */ export declare const TOWN_GATE_X: number; /** * Half-width of a gate opening, so a gate is (2 * this + 1) tiles wide. Five * tiles, matching the main street, so the road runs into town at full width * instead of pinching. The gatehouse carries it on a pair of deep piers with a * proper arch, which is what stops a span this wide reading as a gap in the * wall rather than a gate. */ export declare const TOWN_GATE_HALF_W = 2; /** * The bank row the Calverton bridge lands on: the gate road's last row at * town height, one row north of the shore row that carries the ramp down to * the deck. The gate road runs from here north into the gate throat. */ export declare const TOWN_APPROACH_Z: number; /** * The Calverton bridge and the shore road that feeds it. * * The bridge crosses the lake on the gate axis, five planks wide like the * gate road, so a player walks off the deck straight up to the gate. The * shore road runs east along the lake's south bank from the trail head to * the bridge foot, three tiles wide, its north row being the trail's last * row. Both sit inside the sealed trail corridor: the ground south of the * lake is walkable from the South area, so the road's south verge and its * east end carry the same tree screen as the trail (see the map's trail * tree block) or the Rat Tunnel stops being the only way into the East. */ export declare const CALVERTON_BRIDGE_X: number; export declare const CALVERTON_BRIDGE_HALF_W = 2; export declare const CALVERTON_SHORE_ROAD_Z: number; export declare const CALVERTON_SHORE_ROAD_HALF_W = 1; /** The deck plus both ramp rows: everything a player stands on between the two banks. */ export declare function inCalvertonBridge(x: number, z: number): boolean; /** The three rows of the shore road, from the trail lane's west edge to the bridge's east edge. */ export declare function inCalvertonShoreRoad(x: number, z: number): boolean; /** * Main street runs north-south on the town axis; the cross street runs * east-west. * * The offset from the north wall went 26 -> 40 -> 52 with the walls, which * keeps the cross street on the same world row it has always been on. That matters: the * Dreadwoods east gate, its road, and the spider cave track are all cut on this * line, and none of them wanted to move because the town grew a wider north * quarter. */ export declare const TOWN_MAIN_STREET_HALF_W = 2; export declare const TOWN_CROSS_STREET_Z: number; export declare const TOWN_CROSS_STREET_HALF_W = 1; /** Market square, centred where the two streets meet. */ export declare const TOWN_SQUARE_HALF_W = 9; export declare const TOWN_SQUARE_HALF_D = 6; export declare const DREADWOODS_EAST_GATE_X: number; export declare const DREADWOODS_EAST_GATE_Z: number; export declare const DREADWOODS_EAST_GATE_HALF_W = 2; /** How far inside the wall the gate road runs before it gives out in the ash. */ export declare const DREADWOODS_EAST_ROAD_INNER_TILES = 10; export declare const DREADWOODS_EAST_ROAD_MIN_X: number; /** * Stops one tile short of the town wall. The last tile IS Calverton's west gate * throat, which the town builder owns - paving over it would take the gatehouse * with it. */ export declare const DREADWOODS_EAST_ROAD_MAX_X: number; /** The gate opening itself - the tiles cut out of the wall column. */ export declare function inDreadwoodsEastGate(x: number, z: number): boolean; export declare const DREADWOODS_SOUTH_GATE_HALF_W = 2; /** The south gate opening itself - the tiles cut out of the south wall column. */ export declare function inDreadwoodsSouthGate(x: number, z: number): boolean; /** The gate road plus a margin, for keeping den mouths and wild scatter off it. */ export declare function nearDreadwoodsEastRoad(x: number, z: number, margin?: number): boolean; /** The whole road, gate throat included, from inside the woods to the town wall. */ export declare function inDreadwoodsEastRoad(x: number, z: number): boolean; export declare function inTownWalls(x: number, z: number): boolean; /** Town plus a margin, for keeping wild scatter and NPC spawns out of the streets. */ export declare function nearTown(x: number, z: number, margin?: number): boolean; /** Compound footprint, inclusive - the perimeter fence stands on these rows. */ export declare const FISHERY_MIN_X: number; export declare const FISHERY_MAX_X: number; /** * How far north of the town wall the fence line stands. * * Was 10, which is not a distance - the town's north apron ended at * TOWN_NORTH_Z - 3 and the fishery's yard began at FISHERY_SOUTH_Z + 5, so the * two aprons very nearly touched and the compound read as the town's back yard * rather than somewhere you travel to. At 70 there is a real stretch of open * country between them, walked on its own road (see the fishery road in * map.ts). There is nothing but empty grass up here: the East runs north to the * sea cliff, and the fishery is still a long way short of it. * * Reduced 70 -> 50 when the town moved twenty rows north off the lake shore, * and 50 -> 38 when the north wall grew twelve rows, on the mistaken note * that the fishery's north edge was up against the northern wall's approach. * That wall is x 4-239; east of the Dreadwoods there is nothing north of * here but open grass for 460 rows to the sea-cliff rim. At 38 the compound * started five rows past the town's apron and read as its back yard again. * * 190 now (James, 2026-09-16: "at least 4-5x further, we need to create * space so the game feels natural"). The north fence lands at the foot of * the ridge on rows 303-312, so the falls pour off high ground, and the walk * from the town gate is about 47 seconds of country road. Anything up to * about 490 still fits before the skirt reaches the rim. */ export declare const FISHERY_TOWN_GAP = 190; export declare const FISHERY_SOUTH_Z: number; export declare const FISHERY_NORTH_Z: number; export declare const FISHERY_INNER_MIN_X: number; export declare const FISHERY_INNER_MAX_X: number; export declare const FISHERY_INNER_NORTH_Z: number; export declare const FISHERY_INNER_SOUTH_Z: number; /** The whole compound sits level, so pegs and water meet cleanly. */ export declare const FISHERY_GROUND_HEIGHT = 3; /** Gate in the south fence, on the road up from the town's north gate. */ export declare const FISHERY_GATE_X: number; export declare const FISHERY_GATE_HALF_W = 1; /** * Where a player is put when their paid time runs out: on the road, outside the * gate, facing the fishery. Deliberately outside the fence, so an expired timer * cannot leave anyone standing on the paid side of the door. */ export declare const FISHERY_EXIT_X: number; export declare const FISHERY_EXIT_Z: number; /** The guard stands beside the gate, inside the throat of it. */ export declare const FISHERY_GUARD_X: number; export declare const FISHERY_GUARD_Z: number; /** * Lodge plan: door east onto the road, long axis east-west. East wall sits at * GATE_X - 9 so the porch still meets the gate road. Sam stands at the back * counter, facing that door. Spawn is exact (not nearestStandable) so a * collision stamp cannot walk him out through the doorway onto the porch. */ export declare const FISHERY_LODGE_EAST: number; export declare const FISHERY_LODGE_CX: number; export declare const FISHERY_LODGE_CZ: number; export declare const FISHERY_SAM_X: number; export declare const FISHERY_SAM_Z: number; /** Reservoir - an inset basin, leaving a bank all the way round for the pegs. */ export declare const FISHERY_WATER_MIN_X: number; export declare const FISHERY_WATER_MAX_X: number; export declare const FISHERY_WATER_NORTH_Z: number; export declare const FISHERY_WATER_SOUTH_Z: number; /** * The waterfall outcrop on the north bank, west of centre: a shelf of raised * stone the fence line steps behind, with the cascade spilling into a carved * plunge pool. Shared here because the backend carves it and the client hangs * the waterfall asset and keeps ambient fish out of the plunge. */ export declare const FISHERY_FALLS_CX: number; export declare const FISHERY_FALLS_HALF_W = 2; /** * The island, bridged from the north bank. An explicit centre rather than the * water rectangle's midpoint: the island sits in the pond's north half so the * south lobe stays open casting water, the way the reference grounds read. */ export declare const FISHERY_ISLAND_CX: number; export declare const FISHERY_ISLAND_CZ: number; export declare const FISHERY_ISLAND_RX = 2.8; export declare const FISHERY_ISLAND_RZ = 2; /** Two-plank-column bridge from the north bank onto the island. */ export declare const FISHERY_BRIDGE_WEST_X: number; export declare const FISHERY_BRIDGE_EAST_X: number; /** True inside the paid area: past the fence line, which is what the timer guards. */ export declare function inFishery(x: number, z: number): boolean; /** * Fishery plus a margin. Wandering spawns are kept out of this: a wolf den mouth * opening inside the compound would be a free way in past a door people pay for, * and one against the fence reads as untamed woods pushed up against a built place. */ export declare function nearFishery(x: number, z: number, margin?: number): boolean; /** Cave mouth east of Calverton's east gate, on the new eastern pad. */ /** * Spider Cave - out on the eastern rim of the map rather than tucked against * Calverton. It used to sit 18 tiles off the town wall, which made a cave full * of spiders feel like a suburb; bedding it on the edge gives the walk east * some point to it. */ export declare const SPIDER_CAVE_MOUTH_X: number; export declare const SPIDER_CAVE_MOUTH_Z: number; /** Stand just west of the mouth after climbing out. */ export declare const SPIDER_CAVE_OUTSIDE: { readonly x: number; readonly z: number; }; /** * Bob's Bounties - on the hall's south wall, east of the door, facing the * square. Z is the first walkable tile south of the hall footprint * (`TOWN_CROSS_STREET_Z - 7` = hallCz + hallRadius + 1). */ export declare const CALVERTON_BOUNTY_BOARD_X: number; export declare const CALVERTON_BOUNTY_BOARD_Z: number; export declare const BOB_SPAWN_X: number; export declare const BOB_SPAWN_Z: number; /** * Anne's cottage - a longer walk north of the east road, halfway between * Crossroads and Base Camp. Lower local Z is north (toward WORLD_NORTH_PAD). * Stays west of BASECAMP_WALL_X so it never touches the mountain wall. */ export declare const ANNES_SPUR_TILES = 12; export declare const ANNES_X: number; export declare const ANNES_HOUSE_LOCAL_Z: number; export declare const ANNES_ZONE_RX = 32; export declare const ANNES_ZONE_NORTH = 16; export declare const ANNES_ZONE_SOUTH = 40; /** Neighbours around Anne's green. Z stays local until world expansion. */ export declare const ANNES_NEIGHBOUR_HOMES: readonly [{ readonly name: "Eldric"; readonly x: number; readonly z: number; readonly style: "cottage-slate"; }, { readonly name: "Alder"; readonly x: number; readonly z: number; readonly style: "cottage-moss"; }, { readonly name: "Mara"; readonly x: number; readonly z: number; readonly style: "cottage-russet"; }]; export declare const ANNES_GREEN: { readonly x: number; readonly z: number; }; /** * Small vestigial mud alcove right behind the Suspicious hole mouth at Base * Camp - kept only as set dressing for the doorway. The real Rat Tunnel * dungeon lives far away in its own dedicated underground zone (see below); * the Base Camp Suspicious hole teleports players there. Forest animal dens * are separate tiny caverns, not extra doors into this dungeon. */ export declare const RAT_TUNNEL_CENTER_X: number; export declare const RAT_TUNNEL_CENTER_LOCAL_Z = 26; export declare const RAT_TUNNEL_RX = 6; export declare const RAT_TUNNEL_RZ = 5; export declare const SUSPICIOUS_HOLE_RETURN_X: number; export declare const SUSPICIOUS_HOLE_RETURN_LOCAL_Z = 26; /** * Rat Tunnel dungeon - a genuinely separate underground zone carved into an * off-map strip east of the overworld (x >= UNDERGROUND_ORIGIN_X), so the * rooms are never painted as surface geography on the paper map. The * Suspicious hole doesn't lead into a pocket behind itself - it teleports * players into this dedicated 5-room dungeon (forest animal dens do not). * Room 1 has a crawl-out back to Base Camp so players are not trapped in the * pit; the portal at the far end of Room 5 is the dungeon-clear exit. * * Layout (world space, north → south): entry Room 1 (sunken rat pit / nest * ledges, crawl-out on the north wall) → corridor + gate → Room 2 (giant rats) * → corridor + gate → Room 3 (amazons) → corridor + gate → Room 4 (Liv, * boss) → corridor + gate (opens on her death) → Room 5, the exit vestibule * with the far-end portal back to Base Camp. */ export declare const DUNGEON_CENTER_X: number; /** * ROOM SCALE - deliberately tight. * * The first build made every room a field: Room 4 was 53x44 tiles and Room 1 * and 3 were 41 wide, on a map where a character occupies one tile. Crossing * the boss room took ~45 steps, and no amount of scenery could fill that - every * dressing pass read as litter scattered on an empty plain. These are roughly * half the old linear dimensions (about a quarter of the floor area), which is * the range a dungeon crawl actually wants: you can see both walls, scenery * reaches you, and a fight fills the space instead of rattling around in it. * * Encounter room sizes still scale with what happens in them - the boss cavern * is the largest, the exit vestibule barely more than a landing. */ export declare const DUNGEON_ROOM_HALF_W = 14; /** The giant-rat warren is deliberately tighter than the human encounter rooms. */ export declare const DUNGEON_GIANT_RAT_ROOM_HALF_W = 11; export declare const DUNGEON_BOSS_HALF_W = 17; /** Exit vestibule - a landing, not a hall. */ export declare const DUNGEON_VESTIBULE_HALF_W = 9; /** Entry guardroom, tighter than the mid-dungeon encounter rooms. */ export declare const DUNGEON_GUARDROOM_HALF_W = 12; export declare const DUNGEON_CORRIDOR_HALF_W = 3; /** * Corridors are longer than the rooms are deep in places, on purpose: the old * layout butted five halls almost directly together, so the dungeon read as one * continuous space rather than a sequence of places. A real walk between * encounters is what makes each room feel like arriving somewhere. */ export declare const DUNGEON_ROOM1_MIN_Z = 60; export declare const DUNGEON_ROOM1_MAX_Z = 82; /** Rat-pit centre in Room 1 - mirrors DUNGEON_ROOM2_PIT_Z for the arena below. */ export declare const DUNGEON_ROOM1_PIT_Z: number; export declare const DUNGEON_ROOM2_MIN_Z = 99; export declare const DUNGEON_ROOM2_MAX_Z = 125; /** Sunken giant-rat-arena centre in Room 2. */ export declare const DUNGEON_ROOM2_PIT_Z: number; export declare const DUNGEON_ROOM3_MIN_Z = 142; export declare const DUNGEON_ROOM3_MAX_Z = 168; export declare const DUNGEON_ROOM4_MIN_Z = 185; export declare const DUNGEON_ROOM4_MAX_Z = 217; export declare const DUNGEON_ROOM5_MIN_Z = 232; export declare const DUNGEON_ROOM5_MAX_Z = 246; export declare const DUNGEON_MIN_X: number; export declare const DUNGEON_MAX_X: number; export declare const DUNGEON_MIN_Z = 60; export declare const DUNGEON_MAX_Z = 246; /** Room-gate doorway rows - the door sits on the entrance wall of the room being unlocked. */ export declare const DUNGEON_GATE1_Z = 99; export declare const DUNGEON_GATE2_Z = 142; export declare const DUNGEON_GATE3_Z = 185; export declare const DUNGEON_GATE4_Z = 232; export declare const DUNGEON_ENTRY_X: number; export declare const DUNGEON_ENTRY_Z: number; export declare const DUNGEON_EXIT_PORTAL_X: number; /** * Flush with the far (high-Z) wall of the vestibule and facing back down the * room, so it reads as the way out at the end of the tunnel rather than a * free-standing arch dropped in the middle of the floor. */ export declare const DUNGEON_EXIT_PORTAL_Z = 246; /** Style for the Room 5 dungeon-clear portal (returns to the Base Camp far side). */ export declare const RAT_TUNNEL_FAR_EXIT_STYLE = "exit-north"; /** * Where the far-side door puts you back INSIDE the dungeon. * * Every mouth returns you to the area it belongs to: the Base Camp Suspicious * hole drops into the Room 1 rat pit, and the far-side door - which only exists * on the far side, and which you can only be standing at because you already * beat Livonia - lets you back in at the Room 5 vestibule, on this side of her. * Sending it to the rat pit would have made the shortcut a punishment. */ export declare const RAT_TUNNEL_FAR_ENTRY_X: number; export declare const RAT_TUNNEL_FAR_ENTRY_Z: number; /** True for the Room 5 portal, tolerating the old 'exit-east' style id. */ export declare function isRatTunnelFarExitStyle(style: string | undefined): boolean; /** * Crawl-out in Room 1 (rat pit), flush with the north wall and facing south * into the pit. Same `exit-*` interact/teleport as Room 5 - returns to the * Suspicious hole approach at Base Camp. Compact footprint; keep the two * tiles in front standable so logout restore can slide off the blocked door. */ export declare const DUNGEON_PIT_EXIT_X: number; export declare const DUNGEON_PIT_EXIT_Z = 60; export declare const DUNGEON_PIT_EXIT_STYLE = "exit-south"; /** The Base Camp Suspicious hole funnels here (see world.ts caveentrance handling). Forest animal dens do not. */ export declare const RAT_TUNNEL_SPAWN_X: number; export declare const RAT_TUNNEL_SPAWN_LOCAL_Z: number; /** The portal prop inside Room 5 that teleports players back to Base Camp. */ export declare const RAT_TUNNEL_EXIT_X: number; export declare const RAT_TUNNEL_EXIT_LOCAL_Z: number; export declare const DUNGEON_GATE_MIN_X: number; export declare const DUNGEON_GATE_MAX_X: number; /** * Solid rock carved around the whole footprint. Must exceed the deepest wall * alcove (currently 4) with room to spare, or an alcove punches straight * through the envelope and opens the dungeon onto the outside world. */ export declare const DUNGEON_WALL_MARGIN = 8; /** * How far the solid rock is actually PAINTED, as opposed to how far the dungeon * zone reaches. The camera looks down at ~53 degrees, so a 5-unit wall only * hides about four tiles of whatever is behind it - with the old 8-tile margin * the overworld's grass and sky were plainly visible over the dungeon walls. * The apron is a cheap fix: keep painting rock until the far fog (62 units) * swallows it. It deliberately does NOT widen `inDungeonZone`, which gates * gameplay and lighting and should stay tight to the rooms. */ export declare const DUNGEON_ROCK_APRON = 62; export declare function inDungeonZone(x: number, z: number): boolean; export type ForestDenFacing = 'north' | 'south' | 'east' | 'west'; export type ForestDenSite = { id: string; /** Entrance tile on the playable (local) map, same space as other overworld props. */ entranceX: number; entranceLocalZ: number; facing: ForestDenFacing; /** Hollowed cavern centre in the off-map underground strip (east of the overworld). */ cavernX: number; cavernZ: number; }; /** * Explorer XP awards. Shared so the backend and the player guide never drift. * Retuned down 2026-08-29 (identify 5 -> 3, zone discovery 50 -> 33) so a fresh * character does not jump straight to Explorer 2 from the spawn-zone find. */ export declare const EXPLORER_IDENTIFY_XP = 3; export declare const EXPLORER_DISCOVERY_XP = 33; /** Hope Beach is "discovered" the instant you log in, so it pays a token amount. */ export declare const SPAWN_ZONE_DISCOVERY_XP = 3; /** Rat warren with a central nest and two smaller feeding alcoves. */ export declare const FOREST_DEN_RX = 8; export declare const FOREST_DEN_RZ = 7; export declare const FOREST_DEN_WALL = 2; export declare const FOREST_DEN_EXPLORER_XP = 33; /** * Rat caves scattered through the woods. Same idea as the old extra Suspicious * holes - they look like small rocky cave mouths, each with its own cramped * cavern, not extra doors into the Rat Tunnel. */ /** * Every site here is fully built by world generation - cleared entrance * hollow, its own cavern, and a return exit - but only FOREST_DEN_ACTIVE_COUNT * of them show a cave mouth at any one time (see World.denEntranceActive). * Crawling out of a den retires that mouth and opens a different site, so the * dens move around the woods instead of being permanent scenery. * * There used to be 13 permanently-open mouths, which is why they read as * "everywhere" - you could not cross the forest without tripping over one. * Keeping the full list (rather than deleting sites) is what gives the * relocation somewhere to move *to*; the count below is the dial for how * often you actually meet one. */ export declare const FOREST_DEN_SITES: readonly ForestDenSite[]; /** How many den mouths are open across the whole map at once. */ export declare const FOREST_DEN_ACTIVE_COUNT = 3; export declare function forestDenEntranceStyle(facing: ForestDenFacing): string; export declare function forestDenExitStyle(facing: ForestDenFacing): string; export declare function forestDenByEntrance(worldX: number, worldZ: number): ForestDenSite | null; export declare function forestDenByCavern(worldX: number, worldZ: number): ForestDenSite | null; export declare function inForestDenCavern(x: number, z: number): boolean; /** Wolf dens reuse the forest-den site shape; caverns sit in a separate underground strip. */ export type WolfDenSite = ForestDenSite; /** Wolf hollows retain their original compact footprint. */ export declare const WOLF_DEN_RX = 4; export declare const WOLF_DEN_RZ = 3; /** * Wolf dens in the woods around Calverton. Same rotating-mouth idea as the * forest rat caves: every site is built, only WOLF_DEN_ACTIVE_COUNT show a * mouth at once, and crawling out relocates that mouth. */ export declare const WOLF_DEN_SITES: readonly WolfDenSite[]; /** * A den site is only usable if its mouth is clear of the authored places around * it. Applied where dens are built rather than trusted to the table above, so a * site nudged in later cannot quietly reopen the hole in the fishery fence. */ export declare function wolfDenSiteAllowed(site: WolfDenSite): boolean; export declare const WOLF_DEN_ACTIVE_COUNT = 2; export declare const WOLF_DEN_EXPLORER_XP = 33; export declare function wolfDenEntranceStyle(facing: ForestDenFacing): string; export declare function wolfDenExitStyle(facing: ForestDenFacing): string; export declare function wolfDenByEntrance(worldX: number, worldZ: number): WolfDenSite | null; export declare function wolfDenByCavern(worldX: number, worldZ: number): WolfDenSite | null; export declare function inWolfDenCavern(x: number, z: number): boolean; export type DungeonRoomId = 1 | 2 | 3 | 4; /** Fixed, deterministic spawn spots for each dungeon room's enemy group. */ export declare const DUNGEON_ROOM_SPAWNS: Record; /** * Northwest battlefield - north pad west of the Deadlands, inland of west cliffs. * World Z decreases toward the north woods; farm approaches from the south. * East edge meets the Deadlands west border. The lake continues east of this pad * (see BATTLEFIELD_LAKE_EAST_X). */ export declare const BATTLEFIELD_MIN_X = 10; export declare const BATTLEFIELD_MAX_X: number; export declare const BATTLEFIELD_MIN_WORLD_Z: number; export declare const BATTLEFIELD_MAX_WORLD_Z: number; export declare const BATTLEFIELD_MIN_LOCAL_Z: number; export declare const BATTLEFIELD_MAX_LOCAL_Z: number; /** Solid southward wall returns join both Dreadwoods corners to the lake bank. */ export declare const DEADLANDS_SOUTH_WALL_XS: readonly [number, number]; export declare const DEADLANDS_SOUTH_WALL_END_Z: number; /** Reserve the wall returns and their wire for fortifications, not wild scenery. */ export declare function isDeadlandsSouthWallClearance(x: number, z: number): boolean; /** * One-tile high-rock / crag row on the SW corner of remaining Base Camp land * (south of the lake). Same X as the thin west-face enclave; the lake band at * this X is water so the east-west sheet can continue. */ export declare const BATTLEFIELD_LAKE_SW_ROCK_X = 604; export declare const BATTLEFIELD_LAKE_SW_ROCK_MIN_Z: number; export declare const BATTLEFIELD_LAKE_SW_ROCK_MAX_Z: number; /** * One-tile high-rock / crag row on the SE corner of remaining east land. * Inland of the east sea-cliff water+rim (map.ts SEA_CLIFF_WATER + SEA_CLIFF_RIM). * The lake meets this column; dungeon interiors stay at x >= WORLD_WIDTH. */ export declare const BATTLEFIELD_LAKE_SE_ROCK_X: number; export declare const BATTLEFIELD_LAKE_SE_ROCK_MIN_Z: number; export declare const BATTLEFIELD_LAKE_SE_ROCK_MAX_Z: number; /** * Inclusive east water column of the lake, flush against the SE rock row. */ export declare const BATTLEFIELD_LAKE_EAST_X: number; export declare const BATTLEFIELD_LAKE_MID_Z: number; /** @deprecated Use BATTLEFIELD_LAKE_* - kept for older imports. */ export declare const BATTLEFIELD_CONTESTED_MIN_Z: number; /** @deprecated Use BATTLEFIELD_LAKE_* */ export declare const BATTLEFIELD_CONTESTED_MAX_Z: number; /** @deprecated Use BATTLEFIELD_LAKE_* */ export declare const BATTLEFIELD_CONTESTED_MID_Z: number; /** * N-S bridge across the lake (world X). * Anchored on the original battlefield mid-X so expanding east to the Deadlands * lengthens the water sheet without sliding the crossing. */ export declare const BATTLEFIELD_BRIDGE_X = 91; /** * Snowy frontier above the goblin camps, sealed west to the coastal cliff. * Sits north of SNOW_DEEP_Z so the gate and approach stay in solid snow rather * than the green fleck band at the climate edge. */ export declare const NORTHERN_WALL_Z: number; export declare const NORTHERN_WALL_MIN_X = 4; export declare const NORTHERN_WALL_MAX_X: number; export declare const NORTHERN_GATE_X = 91; export declare const NORTHERN_GATE_HALF_WIDTH = 2; /** * The garrison camp on the north side of the gate: tents, a fire, stores, and * the quartermaster. It is the only settled ground in the snow and the reason * to walk through the gate at all. A shared clearing east of the road holds * the tents and hearth; NORTHERN_GARRISON_X/Z is the quartermaster's counter. */ export declare const NORTHERN_CAMP_CENTER: { readonly x: number; readonly z: number; }; export declare const NORTHERN_GARRISON_X: number; export declare const NORTHERN_GARRISON_Z: number; /** Open approaches to the services around one communal camp. */ export declare const NORTHERN_CAMP_STATIONS: { readonly trading: { readonly x: number; readonly z: number; readonly radius: 5; }; readonly hearth: { readonly x: number; readonly z: number; readonly radius: 5; }; readonly hunting: { readonly x: number; readonly z: number; readonly radius: 5; }; readonly guards: { readonly x: number; readonly z: number; readonly radius: 5; }; readonly travellers: { readonly x: number; readonly z: number; readonly radius: 5; }; }; export declare const NORTHERN_CAMP_BOARD: { readonly x: number; readonly z: number; }; export declare const NORTHERN_CAMP_DWARVES: { readonly rolo: { readonly x: number; readonly z: number; }; readonly bram: { readonly x: number; readonly z: number; }; readonly tova: { readonly x: number; readonly z: number; }; }; export declare const NORTHERN_CAMP_ROAD_MIN_Z: number; /** Camp bounds include its entrance lane; the public north road stays open. */ export declare const NORTHERN_GARRISON_MIN_X: number; export declare const NORTHERN_GARRISON_MAX_X: number; export declare const NORTHERN_GARRISON_MIN_Z: number; export declare const NORTHERN_GARRISON_MAX_Z: number; /** Distance outside the central clearing and its five-tile entrance lane. */ export declare function northernCampEdgeDistance(x: number, z: number): number; export declare function inNorthernGarrison(x: number, z: number): boolean; /** * The frozen lake north-west of the War Camp, out on the flat lowland short of * the Frozen Shore: holes cut through the ice, two fishers on their stools, a * jetty iced in at the east bank and a small shelter where the snowfields * approach meets the shore. Nothing is fished here yet; it is the place first. * World coordinates - z already includes WORLD_NORTH_PAD. * * The lake sat at x=32 until 2026-09-17, its west bank six tiles from the * landing's works; it moved twenty-four tiles east so Branson's bay could * open up. Everything on it is placed from the centre; the fixed points * below moved with it. */ export declare const FROZEN_LAKE_CENTER: { readonly x: 56; readonly z: 300; }; export declare const FROZEN_LAKE_RX = 14; export declare const FROZEN_LAKE_RZ = 12; /** The level the ice is frozen at; the lowland around it already lies near it. */ export declare const FROZEN_LAKE_ICE_HEIGHT = 0; /** * The fishers' holes, one each, cut for good. Every other hole on the lake is * the server's rota of thin-ice spots (see ICE_SPOT_MAX in woodwork.ts), so * nothing else is placed by the generator. */ export declare const FROZEN_LAKE_HOLES: readonly [{ readonly x: number; readonly z: number; }, { readonly x: number; readonly z: number; }]; /** Where each fisher sits, and the hole they face. */ export declare const FROZEN_LAKE_FISHERS: readonly [{ readonly name: "Halvard"; readonly x: number; readonly z: number; readonly faceX: number; readonly faceZ: number; }, { readonly name: "Ingrid"; readonly x: number; readonly z: number; readonly faceX: number; readonly faceZ: number; }]; /** Where the jetty leaves the east bank, and how many tiles it reaches west. */ export declare const FROZEN_LAKE_JETTY: { readonly x: number; readonly z: 300; readonly length: 4; }; /** * The bait table on the east bank, between the supply sled and the cooking * fire, and the bait master who works it: he stands at its east end, facing * the table and the ice beyond it. */ export declare const FROZEN_LAKE_BAIT_TABLE: { readonly x: number; readonly z: number; }; export declare const FROZEN_LAKE_BAIT_MASTER: { readonly x: number; readonly z: number; readonly faceX: number; readonly faceZ: number; }; /** Signed distance to the ice edge in tiles: at or below zero is on the ice. */ export declare function frozenLakeEdgeDistance(x: number, z: number): number; export declare function onFrozenLakeIce(x: number, z: number): boolean; /** * The far north-west corner, beyond the lake: the lowland rises to a snow * plateau, the Crystal Gorge cuts across it with a rope bridge over the drop, * and the Frozen Hallway runs north from a rune arch between walls of dark * rock and ice to an iron gate that leads deeper inside (nowhere, yet). * World coordinates - z already includes WORLD_NORTH_PAD. */ export declare const FROZEN_PLATEAU_H = 5; /** Where the lowland starts climbing to the plateau, and where it is level. */ export declare const FROZEN_PLATEAU_RISE_Z = 278; export declare const FROZEN_PLATEAU_TOP_Z = 262; /** The hills east of here are left as they are. */ export declare const FROZEN_PLATEAU_MAX_X = 46; export declare const CRYSTAL_GORGE_MIN_Z = 222; export declare const CRYSTAL_GORGE_MAX_Z = 230; export declare const CRYSTAL_GORGE_MAX_X = 44; /** The bridge column and the deck's half-width in tiles. */ export declare const CRYSTAL_BRIDGE_X = 21; export declare const CRYSTAL_BRIDGE_HALF_W = 1; export declare const FROZEN_HALLWAY_X = 21; export declare const FROZEN_HALLWAY_HALF_W = 4; export declare const FROZEN_HALLWAY_WALL_T = 5; export declare const FROZEN_HALLWAY_WALL_H = 10; /** The rune arch at the mouth and the iron gate at the far end. */ export declare const FROZEN_HALLWAY_MOUTH_Z = 169; export declare const FROZEN_HALLWAY_GATE_Z = 90; export declare const FROZEN_HALLWAY_SEAL_Z = 70; /** * The Ice Prison: the rooms behind the hallway's iron gate, carved in the * off-map strip like the other interiors. You arrive in the Frozen Cells, * the prison's gatehouse; a flight of steps at its north end leads down a * short corridor to the Frozen Shrine, where the Warden's door is sealed and * the west and east passages are still choked. World coordinates. */ export declare const ICE_PRISON_CX: number; export declare const ICE_PRISON_CELLS: { readonly cx: number; readonly minZ: 150; readonly maxZ: 172; readonly halfW: 12; }; export declare const ICE_PRISON_CORRIDOR: { readonly cx: number; readonly minZ: 141; readonly maxZ: 149; readonly halfW: 1; }; export declare const ICE_PRISON_SHRINE: { readonly cx: number; readonly minZ: 110; readonly maxZ: 140; readonly halfW: 16; }; /** Where the gate back out stands (the south wall) and where you arrive. */ export declare const ICE_PRISON_GATE: { readonly x: number; readonly z: number; }; export declare const ICE_PRISON_ENTRY: { readonly x: number; readonly z: number; }; /** Gate styles carry the facing letter first; this tag picks the destination. */ export declare const ICE_PRISON_GATE_IN_STYLE = "n-iceprison"; export declare const ICE_PRISON_GATE_OUT_STYLE = "s-iceprison-out"; /** * The rune arch at the hallway's mouth is sealed, and only a Frozen Key opens * it (James, 2026-09-18: the Frozen Hallway needs the Frozen Key to enter). * The style keeps 'sealed' so the asset draws the slab and the footprint * blocks all five tiles; the server passes a keyholder through by teleport, * the way the dungeon gates work, and lets anyone back out. */ export declare const FROZEN_HALLWAY_SEAL_STYLE = "n-sealed-hallway"; export declare function isFrozenHallwaySealStyle(style: string | undefined): boolean; /** Where the arch puts you: inside the corridor, or back out on the approach. */ export declare const FROZEN_HALLWAY_SEAL_INSIDE_DZ = -3; export declare const FROZEN_HALLWAY_SEAL_OUTSIDE_DZ = 3; /** Where the way out drops you: just south of the hallway's gate. */ export declare const ICE_PRISON_OUTSIDE: { readonly x: 21; readonly z: number; }; /** The seal on the shrine's platform; rings step up around it. */ export declare const ICE_PRISON_SEAL: { readonly x: number; readonly z: number; }; /** * The frost wolf pack in the Frozen Cells: four tiles across the north and * west of the room, clear of the arrival tile and the way up to the gate, so * a player gets a few steps in before the pack notices. All four stand on * the open floor at height 0 (the drop and its walkway are further east). */ export declare const ICE_PRISON_WOLF_SPAWNS: ReadonlyArray<{ x: number; z: number; }>; /** Wall margin included, so lighting and colouring cover the rock around the rooms. */ export declare const ICE_PRISON_BOUNDS: { readonly minX: number; readonly maxX: number; readonly minZ: number; readonly maxZ: number; }; /** * The prison proper and the Frozen Depths north of it (iceDepths.ts): one * predicate for the frost lighting, the rock palette and the cavern aggro, * so the boss rooms are the same cold as the shrine they open off. */ export declare function inIcePrison(x: number, z: number): boolean; /** How far the hallway's centre line swings either side of FROZEN_HALLWAY_X. */ export declare const FROZEN_HALLWAY_SWING = 7; /** * The hallway is not a straight cut: its centre line swings one full S from * the mouth to the gate, so neither end is in sight of the other, and it * breathes as it goes - two chambers where it widens to thirteen tiles and a * throat between them where it closes to five. Both are functions of z so * the builder, the corridor test and anything dressing the walls agree. */ export declare function frozenHallwayCenterAt(z: number): number; export declare function frozenHallwayHalfWidthAt(z: number): number; export declare function inFrozenHallwayCorridor(x: number, z: number): boolean; export type IceCavernMonsterKind = 'crystalskitter' | 'frostrevenant' | 'glaciallurker' | 'icetroll' | 'frostwarden' | 'bonechillyeti' | 'icelich' | 'frostalchemist' | 'glacialbehemoth'; /** * The ice cavern roster, INSIDE the Ice Prison behind the iron gate (moved * off the open Frozen Hallway on 2026-09-21: James wants the monsters in * the cave, not outside its entrance). In the order a player meets them: * skitters in the corridor down from the Frozen Cells (the frost wolf * pack holds the cells themselves), revenants at the shrine's entrance, * lurkers in the two side passages off the seal. The Ice Troll (45) stood * before the Warden's sealed door at the far end until 2026-10-12; when the * Frozen Hallway opened at Combat 20 (decision D1) it moved into the * Shattered Hollow behind the Frozen Depths gate (ICE_TROLL_SPAWN in * iceDepths.ts), so the prison itself is a 21-38 run. Tiles are relative to * the prison's constants above; a tile a prop took is skipped by canStand. */ export declare const ICE_CAVERN_SPAWNS: ReadonlyArray<{ kind: IceCavernMonsterKind; x: number; z: number; }>; /** * The thaw crossing: Frozen east rim into the untouched north-eastern * kingdom along DEADLANDS_MIN_X. The north sea comes in through the sea * cliff as a rock-walled inlet AT SEA LEVEL; one waterfall drops it into a * gorge cut below the land, and the low river runs south under the spans to * the battlefield lake. Three east spans are personal woodwork repairs. * World coordinates. Rains' first crossing is (230, 49). * * Heights: the sea and the inlet are 0, the river floor is THAW_GORGE_FLOOR_H * at the fall's foot, and the rims are the natural land (THAW_RIM_H easing to * 3 at the Dreadwoods). Nothing here is built up above the ground: the * 2026-09-17 pass had the inlet at 8 and the rims at 10 on a snowfield of 3-4, * so the fall hung in the sky above the water feeding it and the bank paths * were a levee nobody could climb onto. */ export declare const THAW_GORGE_CX: number; export declare const THAW_GORGE_MIN_X: number; export declare const THAW_GORGE_MAX_X: number; export declare const THAW_GORGE_MIN_Z = 64; /** Low river meets the battlefield lake's north bank. */ export declare const THAW_GORGE_MAX_Z: number; export declare const THAW_BRIDGE_Z = 113; export declare const THAW_MID_BRIDGE_Z = 174; export declare const THAW_WOODS_BRIDGE_Z: number; export declare const THAW_BRIDGE_ZS: readonly [113, 174, number]; export declare const THAW_BRIDGE_HALF_W = 1; /** * The river floor at the foot of the fall: eight below the sea, the height * the waterfall asset's sheet drops (FISHERY_FALL_HEIGHT). The only negative * terrain in the world; the renderer and the walk rules only ever compare * heights, so a cut below zero is just a deeper cut. */ export declare const THAW_GORGE_FLOOR_H = -8; /** The inlet is the sea: same height as the north sea it comes in from. */ export declare const THAW_FLOOD_H = 0; /** Rock rim and bank beside the inlet, above the water like any shore. */ export declare const THAW_RIM_H = 4; /** Tiles beyond the rim over which the bank grades back to the natural land. */ export declare const THAW_BANK_APRON = 12; export declare const THAW_FLOOD_WEST_X: number; export declare const THAW_FLOOD_EAST_X: number; /** * The one drop, north of the first east span. Sea to Dreadwoods: flood, * then this fall, then the bridges over the low water. Not at Rains' span * and not south of it. */ export declare const THAW_FALLS_Z = 90; /** @deprecated Same tile as THAW_FALLS_Z; kept for older imports. */ export declare const THAW_SIDE_FALLS_Z = 90; export declare const THAW_ARCH_X: number; export declare const THAW_ARCH_PILLAR_DZ = 2; export declare const THAW_MOUTH_STAND_X: number; export declare const THAW_MOUTH_STAND_Z = 70; export declare const THAW_FALLS_STAND_X: number; export declare const THAW_FALLS_STAND_Z = 90; export type ThawEastBridgeId = 1 | 2 | 3; export declare function thawEastBridgeIdAtZ(z: number): ThawEastBridgeId | null; export declare function inThawFlood(x: number, z: number): boolean; export declare function thawGorgeWestX(z: number): number; export declare function thawGorgeEastX(z: number): number; /** Walkable timber through the west gate, over the low lake-feed. */ export declare function onThawWestGateDeck(x: number, z: number): boolean; export declare function onThawBridgeDeck(x: number, z: number): boolean; export declare function inThawGorgeCut(x: number, z: number): boolean; export declare function inThawEastBridgeGap(x: number, z: number): boolean; export declare function thawEastBridgeAt(x: number, z: number): ThawEastBridgeId | null; export declare function isThawEastBridgeStyle(style?: string): boolean; export declare function thawEastBridgeIdFromStyle(style?: string): ThawEastBridgeId | null; export declare function thawEastBridgeStyle(id: ThawEastBridgeId, kind: 'broken' | 'crossing', edge?: 'north' | 'south' | null): string; export declare function personalThawEastCrossingStyle(brokenStyle: string | undefined): string; export declare function thawEastCrossingExitX(id: ThawEastBridgeId, fromX: number): number; /** * Rim height beside the cut at row z: the inlet's rock rim north of the * fall, easing to the wall's height at the Dreadwoods. The bank paths, the * personal spans and the wreckage lift all read it, so a deck is level with * the ground either side of it. It tracks the natural land (1-6 here), and * the builder grades the bank out to it over THAW_BANK_APRON tiles. */ export declare function thawRimHeightAt(z: number): number; /** * Water height in the cut at row z: the inlet at sea level down to the * fall, then THAW_GORGE_FLOOR_H at the fall's foot rising by one step every * eighty-odd rows to meet the lake at 0. A step that size between two water * tiles averages into a slope the eye cannot find; the river reads as one * level run under the spans. */ export declare function thawRiverHeightAt(z: number): number; /** * The repaired span is a deck at rim height, high over the low water (the * 2026-09-17 first pass laid it at 1, on the river, so the crossing was a * plank raft at the bottom of an eight-deep cut). */ export declare function thawEastPersonalDeckH(id: ThawEastBridgeId): number; /** How far a span's deck hangs above the water it crosses, in height units. */ export declare function thawEastSpanClearance(id: ThawEastBridgeId): number; /** The fall pours over the whole width of the cut below the basin. */ export declare const THAW_FALLS_HALF_W: number; export declare function inThawGorgeStone(x: number, z: number): boolean; export declare function inThawSnowApproach(x: number, z: number): boolean; /** Half-width of the walkable bridge deck (tiles either side of bridge X). */ export declare const BATTLEFIELD_BRIDGE_HALF_W = 1; /** * How far along the shore a lake fishing spot may drift from the bridge. * * The lake now runs from the west cliffs to the SE rock row, while the * bridge sits at x 91, so an unconstrained spot could land far down the new * east shore - a long walk, and on the wrong side of the map from the crossing. */ export declare const BATTLEFIELD_FISHING_MAX_BRIDGE_DX = 16; /** * Broken gap in the middle of the bridge (inclusive world Z). * Stays water / uncrossable until woodwork repair. */ export declare const BATTLEFIELD_BRIDGE_GAP_MIN_Z: number; export declare const BATTLEFIELD_BRIDGE_GAP_MAX_Z: number; /** Inclusive smashed mid-span the unrepaired player still sees as wreckage. */ export declare function isBattlefieldBridgeGapTile(x: number, z: number): boolean; /** * Single clickable crossing icon - centre of the gap (x 91, z 682), not every * plank and not the intact approaches. */ export declare function isBattlefieldBridgeTravelIconTile(x: number, z: number): boolean; /** * Chebyshev tiles from a travel-through target (bridge crossing icon, dungeon * pit gate). Those tiles are water or blocked, and the last intact plank is two * steps from the icon - range 1 would demand standing on the gap itself. */ export declare const TRAVEL_THROUGH_RANGE = 4; /** * Rupert Row's dock - a short wooden pier on the south shore west of the bridge, * with his rowboat tied at the water end. */ export declare const RUPERT_ROW_PIER_X: number; export declare const RUPERT_ROW_PIER_Z: number; export declare const RUPERT_ROW_BOAT_X: number; export declare const RUPERT_ROW_BOAT_Z: number; /** Beach beside the pier, just south of the water. */ export declare const RUPERT_ROW_SPAWN_X: number; export declare const RUPERT_ROW_SPAWN_Z: number; export declare const BATTLEFIELD_CAMP_CLEAR_RADIUS = 6; export declare const BATTLEFIELD_NPCS_PER_CAMP = 4; /** * Goblin camps run denser than soldier camps. Goblins are the grind target - * at 2 per camp a player working a camp spent most of the trip walking between * camps waiting on respawns, which is what made the battlefield feel empty. * Soldiers now hold their camps in force too, so both sides read as active * battle lines rather than isolated pairs. */ export declare const BATTLEFIELD_GOBLINS_PER_CAMP = 6; /** How long a faction camp chest stays before fading out and relocating. */ export declare const BATTLEFIELD_CAMP_CHEST_LIFETIME_MS = 60000; /** Soldier camps - closer to the farm (higher world Z), south of the lake. */ export declare const BATTLEFIELD_SOLDIER_CAMPS: readonly { x: number; z: number; }[]; /** The large central soldier camp is commanded by the Battlefield Captain. */ export declare const BATTLEFIELD_CAPTAIN_CAMP: { readonly x: 119; readonly z: number; }; /** * Wooden palisade that seals the soldier shore. The south run used to sit one * tile off the farm's own north fence (farm min local Z 12 = world 748); * BATTLEFIELD_NORTH_SHIFT now leaves open country between the two. Side * returns run from that line to the muddy lake shore so nobody walks around * the ends. */ export declare const BATTLEFIELD_FENCE_SOUTH_Z: number; export declare const BATTLEFIELD_FENCE_WEST_X = 10; export declare const BATTLEFIELD_FENCE_EAST_X: number; export declare const BATTLEFIELD_FENCE_LAKE_END_Z: number; export declare const BATTLEFIELD_CAPTAIN_GROUND_HALF_W = 15; export declare const BATTLEFIELD_CAPTAIN_GROUND_HALF_D = 12; export declare const BATTLEFIELD_CAPTAIN_WALL_HALF_W: number; export declare const BATTLEFIELD_CAPTAIN_WALL_HALF_D: number; export declare const BATTLEFIELD_CAPTAIN_GATE_HALF_W = 3; export declare const BATTLEFIELD_CAPTAIN_DOOR_HALF_W = 1; export declare const BATTLEFIELD_CAPTAIN_NORTH_WALL_Z: number; /** Farm-side opening in the south palisade, in front of the Captain. */ export declare function isBattlefieldCaptainGateTile(x: number, z: number): boolean; /** Rear door in the Captain's north wall - the only walk onto the soldier shore. */ export declare function isBattlefieldCaptainDoorTile(x: number, z: number): boolean; /** Goblin camps - farther woods (lower world Z), north of the lake. */ export declare const BATTLEFIELD_GOBLIN_CAMPS: readonly { x: number; z: number; }[]; /** The goblins' ruined hinterland between their battle line and the first snow. */ export declare const GOBLIN_FRONTIER_MIN_X = 28; export declare const GOBLIN_FRONTIER_MAX_X = 157; export declare const GOBLIN_FRONTIER_MIN_Z = 607; export declare const GOBLIN_FRONTIER_MAX_Z: number; export declare const GOBLIN_FRONTIER_TOWERS: readonly [{ readonly x: number; readonly z: number; }, { readonly x: number; readonly z: number; }]; /** Five-wide approach; the bends leave the existing camp huts and spawns alone. */ export declare const GOBLIN_FRONTIER_ROAD: readonly [{ readonly x: 91; readonly z: number; }, { readonly x: number; readonly z: number; }, { readonly x: number; readonly z: number; }, { readonly x: number; readonly z: number; }, { readonly x: 91; readonly z: number; }, { readonly x: number; readonly z: number; }, { readonly x: number; readonly z: number; }, { readonly x: 91; readonly z: number; }]; /** The two occupied camp loops off the frontier road (built in goblinFrontier.ts). */ export declare const GOBLIN_FRONTIER_CAMPS: readonly [{ readonly x: 113; readonly z: 677; }, { readonly x: 68; readonly z: 635; }]; /** * Where the frontier is held. Goblins spawn here the way they do at the * battle-line camps, and the goblin camp chest rotates through these sites * as well as those. A tower or a camp keeps a full band; a road gate has a * picket, so the road north is watched without becoming a wall. */ export declare const GOBLIN_FRONTIER_SPAWNS: readonly { x: number; z: number; count: number; }[]; /** * Cultivated cabbage plots on the soldier shore - between lake and camps. * Filled as neat soil rows (not sparse scatter). */ export declare const BATTLEFIELD_CABBAGE_PLOTS: readonly { minX: number; maxX: number; minZ: number; maxZ: number; }[]; export type DiscoveryZone = { id: string; label: string; /** Omitted for historical surface-local contracts; new inserted land uses final world coordinates. */ coordinateFrame?: 'world'; minX: number; maxX: number; minZ: number; maxZ: number; }; export declare const DISCOVERY_ZONES: readonly DiscoveryZone[]; export declare function discoveryZoneAt(worldX: number, worldZ: number): DiscoveryZone | null; /** * 'dungeon' and 'shop' get an icon on the world map instead of a plain * diamond, and both are hoverable and clickable there (James, 2026-09-22: * icons over the actual mouth, and a way to see which places trade). */ export type WorldMapLandmarkKind = 'place' | 'dungeon' | 'shop'; /** Caption seat relative to the marker. Default is above. `on` sits on the mark. */ export type WorldMapLabelSide = 'above' | 'below' | 'right' | 'left' | 'on'; export type WorldMapLandmark = { x: number; z: number; label: string; kind?: WorldMapLandmarkKind; labelSide?: WorldMapLabelSide; /** * A town or city: named on the map at every zoom. Every other place is an icon that names itself on a tap or * hover, and is captioned only once the map is zoomed in far enough to fit it, or with the map's Names toggle * (James, 2026-10-01: "the map is extremely bloated with labels ... only capitals showing as default"). */ town?: boolean; /** * For `kind: 'dungeon'`: the matching id in DUNGEON_CHARTS * (dungeonCharts.ts), so a click on the icon can drill down into that * dungeon's own chart instead of just zooming to the mouth. */ dungeonId?: string; }; /** * The mine's eastern Zone 2 location, shared by scenery, lighting, and the map. * The yard's half-extents live here too, so map.ts, the terrain tint and the * lighting rig all agree on where the yard ends: it used to be 11x8 with three * separate copies of the number, and is 19x14 since 2026-09-16 (the same six * seams, spread out, with room to walk between them). The centre moved seven * columns west with the width so the east rim still sits inside Zone 2. */ export declare const MINE_YARD_RX = 19; export declare const MINE_YARD_RZ = 14; export declare const MINE_CENTER_X: number; export declare const MINE_CENTER_Z: number; /** The head frame stands two tiles inside the north rim, backed by the rock. */ export declare const MINE_HEAD_Z: number; export declare function inMineYard(x: number, z: number, margin?: number): boolean; /** * Paper-map labels. Keep this list in lockstep with named places in this file * and `DISCOVERY_ZONES` - the in-game map and the public website chart both * paint from here. Village, Anne's, Snow, the Dreadwoods, and the mine are * not labelled stops. */ export declare const WORLD_MAP_LANDMARKS: readonly WorldMapLandmark[]; /** * MAP AREAS * * The world is four areas, each with its own monster roster. A monster from one * area must never spawn in another - a spawn picks tiles, then drops any tile * whose `mapAreaAt` is not its own area. * * - `south`: the entire overworld built so far. Farm, village, Base Camp, * Hope Beach, the Battlefield, the Dreadwoods, and the Rat Tunnel. Bounded on * the north-east by the Battlefield lake and the Base Camp tunnel rock. * - `east`: opens off the Amazon Trail, north of the lake and east of the * Dreadwoods. Two ways in now: the trail from the south, and the Dreadwoods * east gate on Calverton's cross-street line. The lake seals the rest. * Currently holds no monsters of its own. * - `north`, `west`: not built yet. * * When adding the north or west area, extend `isEastArea` siblings and the * union below the same way; nothing else needs to change. */ export type MapArea = 'south' | 'east' | 'north' | 'west'; /** * The Amazon Trail corridor and the open ground it leads into. * * The corridor test is generous (lane + tree screens + arrival clearing + a * margin), so wildlife cannot spawn on the path a player walks up. The second * test claims everything north of the lake and east of the Dreadwoods, which is * reachable only by the trail and its bridge or the Dreadwoods east gate. */ export declare function isEastArea(x: number, z: number): boolean; export declare function mapAreaAt(x: number, z: number): MapArea; /** * Yard height. Kept level with the forest floor around it (0-1 here) rather * than raised: a raised pad rendered as a pale plateau standing above the woods * like a car park, and the rim of rock is what should mark the cut, not a step. */ export declare const MINE_YARD_HEIGHT = 1; /** * Where each seam stands, as an offset from the mine centre. * * Three copper, one tin, two iron: the same six as before the yard grew, now * spread around the worked faces on the west, north and east rims with five * or more tiles between any two, so the yard is walked rather than stood in * and a pair of players never share a rock's tile. */ export declare const MINE_SEAMS: ReadonlyArray<{ dx: number; dz: number; style: OreStyleId; }>; //# sourceMappingURL=landmarks.d.ts.map