@dreadwood-types/types 0.1.47 → 0.1.51

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/dist/adventure.d.ts +6 -6
  2. package/dist/adventure.d.ts.map +1 -1
  3. package/dist/appearance.d.ts +16 -6
  4. package/dist/appearance.d.ts.map +1 -1
  5. package/dist/appearance.js +43 -31
  6. package/dist/appearance.js.map +1 -1
  7. package/dist/areaTransitions.d.ts +1 -1
  8. package/dist/areaTransitions.d.ts.map +1 -1
  9. package/dist/areaTransitions.js +13 -0
  10. package/dist/areaTransitions.js.map +1 -1
  11. package/dist/bank.d.ts.map +1 -1
  12. package/dist/bearFloes.d.ts +83 -0
  13. package/dist/bearFloes.d.ts.map +1 -0
  14. package/dist/bearFloes.js +126 -0
  15. package/dist/bearFloes.js.map +1 -0
  16. package/dist/blacksmithing.d.ts +3 -0
  17. package/dist/blacksmithing.d.ts.map +1 -1
  18. package/dist/blacksmithing.js +81 -1
  19. package/dist/blacksmithing.js.map +1 -1
  20. package/dist/bloodRiver.d.ts +9 -6
  21. package/dist/bloodRiver.d.ts.map +1 -1
  22. package/dist/bloodRiver.js +19 -17
  23. package/dist/bloodRiver.js.map +1 -1
  24. package/dist/brokenRoad.d.ts.map +1 -1
  25. package/dist/capital.d.ts +541 -165
  26. package/dist/capital.d.ts.map +1 -1
  27. package/dist/capital.js +934 -163
  28. package/dist/capital.js.map +1 -1
  29. package/dist/charcoal.d.ts +43 -0
  30. package/dist/charcoal.d.ts.map +1 -0
  31. package/dist/charcoal.js +78 -0
  32. package/dist/charcoal.js.map +1 -0
  33. package/dist/clientConfig.d.ts +7 -2
  34. package/dist/clientConfig.d.ts.map +1 -1
  35. package/dist/clientConfig.js +14 -5
  36. package/dist/clientConfig.js.map +1 -1
  37. package/dist/constants.d.ts +196 -11
  38. package/dist/constants.d.ts.map +1 -1
  39. package/dist/constants.js +372 -21
  40. package/dist/constants.js.map +1 -1
  41. package/dist/cooking.d.ts.map +1 -1
  42. package/dist/cooking.js +2 -0
  43. package/dist/cooking.js.map +1 -1
  44. package/dist/dragonfire.d.ts +75 -0
  45. package/dist/dragonfire.d.ts.map +1 -0
  46. package/dist/dragonfire.js +73 -0
  47. package/dist/dragonfire.js.map +1 -0
  48. package/dist/dungeonCharts.d.ts +18 -0
  49. package/dist/dungeonCharts.d.ts.map +1 -0
  50. package/dist/dungeonCharts.js +67 -0
  51. package/dist/dungeonCharts.js.map +1 -0
  52. package/dist/equipment.d.ts +2 -0
  53. package/dist/equipment.d.ts.map +1 -1
  54. package/dist/equipment.js +37 -1
  55. package/dist/equipment.js.map +1 -1
  56. package/dist/frozenSet.d.ts +36 -0
  57. package/dist/frozenSet.d.ts.map +1 -0
  58. package/dist/frozenSet.js +58 -0
  59. package/dist/frozenSet.js.map +1 -0
  60. package/dist/goblinCave.d.ts +4 -4
  61. package/dist/goblinCave.d.ts.map +1 -1
  62. package/dist/goblinCave.js +1 -1
  63. package/dist/groundItems.d.ts.map +1 -1
  64. package/dist/groundItems.js +27 -0
  65. package/dist/groundItems.js.map +1 -1
  66. package/dist/harbour.d.ts +223 -0
  67. package/dist/harbour.d.ts.map +1 -0
  68. package/dist/harbour.js +264 -0
  69. package/dist/harbour.js.map +1 -0
  70. package/dist/iceDepths.d.ts +150 -0
  71. package/dist/iceDepths.d.ts.map +1 -0
  72. package/dist/iceDepths.js +132 -0
  73. package/dist/iceDepths.js.map +1 -0
  74. package/dist/index.d.ts +9 -0
  75. package/dist/index.d.ts.map +1 -1
  76. package/dist/index.js +9 -0
  77. package/dist/index.js.map +1 -1
  78. package/dist/interiorFurniture.d.ts +57 -0
  79. package/dist/interiorFurniture.d.ts.map +1 -0
  80. package/dist/interiorFurniture.js +159 -0
  81. package/dist/interiorFurniture.js.map +1 -0
  82. package/dist/landmarks.d.ts +83 -59
  83. package/dist/landmarks.d.ts.map +1 -1
  84. package/dist/landmarks.js +194 -134
  85. package/dist/landmarks.js.map +1 -1
  86. package/dist/messages.d.ts +77 -5
  87. package/dist/messages.d.ts.map +1 -1
  88. package/dist/messages.js.map +1 -1
  89. package/dist/mineCave.d.ts +7 -7
  90. package/dist/mineCave.d.ts.map +1 -1
  91. package/dist/mining.d.ts +8 -0
  92. package/dist/mining.d.ts.map +1 -1
  93. package/dist/mining.js +8 -0
  94. package/dist/mining.js.map +1 -1
  95. package/dist/questGuide.d.ts +30 -0
  96. package/dist/questGuide.d.ts.map +1 -0
  97. package/dist/questGuide.js +3 -0
  98. package/dist/questGuide.js.map +1 -0
  99. package/dist/quests.d.ts +29 -0
  100. package/dist/quests.d.ts.map +1 -1
  101. package/dist/quests.js +70 -0
  102. package/dist/quests.js.map +1 -1
  103. package/dist/snow.d.ts +2 -2
  104. package/dist/snow.d.ts.map +1 -1
  105. package/dist/snow.js +8 -5
  106. package/dist/snow.js.map +1 -1
  107. package/dist/spiderCave.d.ts.map +1 -1
  108. package/dist/travel.d.ts +7 -4
  109. package/dist/travel.d.ts.map +1 -1
  110. package/dist/travel.js +20 -4
  111. package/dist/travel.js.map +1 -1
  112. package/dist/woodwork.d.ts +8 -2
  113. package/dist/woodwork.d.ts.map +1 -1
  114. package/dist/woodwork.js +13 -3
  115. package/dist/woodwork.js.map +1 -1
  116. package/dist/xp.d.ts +18 -7
  117. package/dist/xp.d.ts.map +1 -1
  118. package/dist/xp.js +20 -9
  119. package/dist/xp.js.map +1 -1
  120. package/dist/zones.d.ts +5 -0
  121. package/dist/zones.d.ts.map +1 -1
  122. package/dist/zones.js +8 -3
  123. package/dist/zones.js.map +1 -1
  124. package/package.json +1 -1
package/dist/landmarks.js CHANGED
@@ -1,8 +1,12 @@
1
- import { BEACH_GATE_X, BEACH_SAND_START_Z, BEACH_START_Z, CHUNK_SIZE, OCEAN_START_Z, STONE_HOUSE_LODGE_RADIUS_ACROSS, STONE_HOUSE_RADIUS, UNDERGROUND_ORIGIN_X, WORLD_NORTH_PAD, WORLD_WIDTH, toLocalZ, toWorldZ, } from './constants.js';
1
+ import { BEACH_GATE_X, BEACH_SAND_START_Z, BEACH_START_Z, CHUNK_SIZE, NORTH_SHIFT, OCEAN_START_Z, STONE_HOUSE_LODGE_RADIUS_ACROSS, STONE_HOUSE_RADIUS, UNDERGROUND_ORIGIN_X, WORLD_NORTH_PAD, WORLD_WIDTH, toLocalZ, toWorldZ, } from './constants.js';
2
2
  import { DEADLANDS_DEFENSE_DEPTH, DEADLANDS_GATE_X, DEADLANDS_MAX_X, DEADLANDS_MAX_Z, DEADLANDS_MIN_X, DEADLANDS_MIN_Z, } from './zones.js';
3
3
  import { SNOW_DEEP_Z, SNOW_EDGE_Z } from './snow.js';
4
+ import { BEAR_FLOES_CAMP, BEAR_FLOES_ZONE } from './bearFloes.js';
5
+ import { inIceDepths } from './iceDepths.js';
4
6
  import { dreadwoodsNpcZone } from './dreadwoodsZones.js';
5
- import { CAPITAL_DISTRICTS, CAPITAL_KEEP, CAPITAL_WORKS } from './capital.js';
7
+ import { CAPITAL_AVENUE_Z, CAPITAL_DISTRICTS, CAPITAL_ROYAL_WAY_X, CAPITAL_WORKS } from './capital.js';
8
+ import { GOBLIN_CAVE_OUTSIDE } from './goblinCave.js';
9
+ import { HARBOUR_LIGHTHOUSE, HARBOUR_MIN_X, HARBOUR_MOLE_HEAD, HARBOUR_NAME, HARBOUR_ROAD_Z, HARBOUR_ROYAL_PIER, HARBOUR_SOUTH_Z, } from './harbour.js';
6
10
  import { BLOOD_LAKE_CX, BLOOD_LAKE_CZ, DREADWOODS_WEST_GATE_HALF_W, DREADWOODS_WEST_GATE_Z, } from './bloodRiver.js';
7
11
  export const CROSSROADS_WORLD_X = BEACH_GATE_X;
8
12
  export const CROSSROADS_LOCAL_Z = 17;
@@ -23,6 +27,11 @@ export const BOUNTY_BRUCE_LOCAL_Z = CROSSROADS_LOCAL_Z + 3;
23
27
  * tiled deck like the battlefield bridge, running the full depth of the ocean
24
28
  * strip, with two smashed spans in it that a player planks over one at a time.
25
29
  *
30
+ * Every section was stretched to about 1.5x on 2026-09-24 (James: "extend
31
+ * every section"): shore walk 31 rows to 46, middle stretch 28 to 42, far
32
+ * stretch 28 to 42, the east branch 11 tiles to 17 and the west spur 10 to 15.
33
+ * The breaks stay two rows. WORLD_SOUTH_CHUNKS grew to keep open sea past the head.
34
+ *
26
35
  * All world coordinates. The deck is Path at height 1 over Water, so it stands
27
36
  * proud of the sea the same way the bridge stands proud of the lake.
28
37
  */
@@ -37,16 +46,16 @@ export const HOPE_PIER_SHORE_Z = OCEAN_START_Z - 3;
37
46
  * and tying the end to WORLD_HEIGHT would spend that padding on more decking
38
47
  * and leave the boundary visible from the last plank.
39
48
  */
40
- export const HOPE_PIER_END_Z = OCEAN_START_Z + 87;
49
+ export const HOPE_PIER_END_Z = OCEAN_START_Z + 130;
41
50
  /**
42
51
  * The east branch: a spur off the main walk to the moored ship, deliberately
43
52
  * SHORE-SIDE of both smashed spans so the ship is open to everybody, repaired
44
53
  * pier or not.
45
54
  */
46
- export const HOPE_PIER_BRANCH_Z = OCEAN_START_Z + 14;
55
+ export const HOPE_PIER_BRANCH_Z = OCEAN_START_Z + 22;
47
56
  export const HOPE_PIER_BRANCH_HALF_W = 1;
48
57
  export const HOPE_PIER_BRANCH_MIN_X = HOPE_PIER_X + HOPE_PIER_HALF_W + 1;
49
- export const HOPE_PIER_BRANCH_MAX_X = HOPE_PIER_X + 12;
58
+ export const HOPE_PIER_BRANCH_MAX_X = HOPE_PIER_X + 18;
50
59
  /**
51
60
  * The last four columns of the branch open out into a five-wide landing
52
61
  * stage against the ship: somewhere for cargo, nets and the ship's master to
@@ -81,15 +90,15 @@ export const HOPE_BEACH_LANDING = { x: HOPE_PIER_BRANCH_MAX_X - 2, z: HOPE_PIER_
81
90
  * FROZEN_LAKE_CENTER is declared further down; its z is 236.
82
91
  */
83
92
  /** The two rows of the pier walk, and the columns it runs over. */
84
- export const BRANSONS_LANDING_PIER_MIN_Z = 236;
85
- export const BRANSONS_LANDING_PIER_MAX_Z = 237;
93
+ export const BRANSONS_LANDING_PIER_MIN_Z = 300;
94
+ export const BRANSONS_LANDING_PIER_MAX_Z = 301;
86
95
  /** The seaward end of the walk (the head's west column) and its foot on the shore. */
87
96
  export const BRANSONS_LANDING_PIER_MIN_X = 3;
88
97
  export const BRANSONS_LANDING_PIER_FOOT_X = 21;
89
98
  /** The 4x4 landing head at the seaward end, a row wider than the walk each side. */
90
99
  export const BRANSONS_LANDING_HEAD_MAX_X = 6;
91
- export const BRANSONS_LANDING_HEAD_MIN_Z = 235;
92
- export const BRANSONS_LANDING_HEAD_MAX_Z = 238;
100
+ export const BRANSONS_LANDING_HEAD_MIN_Z = 299;
101
+ export const BRANSONS_LANDING_HEAD_MAX_Z = 302;
93
102
  /** Where the gangplank leaves the head for the ship: the head's south row. */
94
103
  export const BRANSONS_LANDING_GANGPLANK = { x: 4, z: BRANSONS_LANDING_HEAD_MAX_Z };
95
104
  /**
@@ -97,82 +106,88 @@ export const BRANSONS_LANDING_GANGPLANK = { x: 4, z: BRANSONS_LANDING_HEAD_MAX_Z
97
106
  * open sea. `face270` turns the SailShip's +z bow onto -x; the `landingship`
98
107
  * token picks the shorter hull.
99
108
  */
100
- export const BRANSONS_LANDING_SHIP = { x: 6, z: 241 };
109
+ export const BRANSONS_LANDING_SHIP = { x: 6, z: 305 };
101
110
  export const BRANSONS_LANDING_SHIP_STYLE = 'landingship-face270';
102
111
  /**
103
112
  * The hull's tile footprint (all bay water), blocked so nothing paths under
104
113
  * it. Eleven long and four wide about the anchor: the bow a tile in from the
105
114
  * world's edge, the stern under the walk.
106
115
  */
107
- export const BRANSONS_LANDING_SHIP_HULL = { minX: 1, maxX: 11, minZ: 239, maxZ: 243 };
116
+ export const BRANSONS_LANDING_SHIP_HULL = { minX: 1, maxX: 11, minZ: 303, maxZ: 307 };
108
117
  /**
109
118
  * Bay water by row: the columns from the rim water (x 0-1) east that the
110
119
  * bay opens up. Rounded at both ends, twenty wide along the pier.
111
120
  */
112
121
  export const BRANSONS_LANDING_COVE_ROWS = [
113
- { z: 224, maxX: 3 },
114
- { z: 225, maxX: 6 },
115
- { z: 226, maxX: 9 },
116
- { z: 227, maxX: 12 },
117
- { z: 228, maxX: 14 },
118
- { z: 229, maxX: 16 },
119
- { z: 230, maxX: 18 },
120
- { z: 231, maxX: 19 },
121
- { z: 232, maxX: 20 },
122
- { z: 233, maxX: 20 },
123
- { z: 234, maxX: 20 },
124
- { z: 235, maxX: 20 },
125
- { z: 236, maxX: 20 },
126
- { z: 237, maxX: 20 },
127
- { z: 238, maxX: 20 },
128
- { z: 239, maxX: 20 },
129
- { z: 240, maxX: 20 },
130
- { z: 241, maxX: 20 },
131
- { z: 242, maxX: 20 },
132
- { z: 243, maxX: 20 },
133
- { z: 244, maxX: 19 },
134
- { z: 245, maxX: 18 },
135
- { z: 246, maxX: 16 },
136
- { z: 247, maxX: 14 },
137
- { z: 248, maxX: 12 },
138
- { z: 249, maxX: 9 },
139
- { z: 250, maxX: 6 },
140
- { z: 251, maxX: 3 },
122
+ { z: 288, maxX: 3 },
123
+ { z: 289, maxX: 6 },
124
+ { z: 290, maxX: 9 },
125
+ { z: 291, maxX: 12 },
126
+ { z: 292, maxX: 14 },
127
+ { z: 293, maxX: 16 },
128
+ { z: 294, maxX: 18 },
129
+ { z: 295, maxX: 19 },
130
+ { z: 296, maxX: 20 },
131
+ { z: 297, maxX: 20 },
132
+ { z: 298, maxX: 20 },
133
+ { z: 299, maxX: 20 },
134
+ { z: 300, maxX: 20 },
135
+ { z: 301, maxX: 20 },
136
+ { z: 302, maxX: 20 },
137
+ { z: 303, maxX: 20 },
138
+ { z: 304, maxX: 20 },
139
+ { z: 305, maxX: 20 },
140
+ { z: 306, maxX: 20 },
141
+ { z: 307, maxX: 20 },
142
+ { z: 308, maxX: 19 },
143
+ { z: 309, maxX: 18 },
144
+ { z: 310, maxX: 16 },
145
+ { z: 311, maxX: 14 },
146
+ { z: 312, maxX: 12 },
147
+ { z: 313, maxX: 9 },
148
+ { z: 314, maxX: 6 },
149
+ { z: 315, maxX: 3 },
141
150
  ];
142
151
  /** The rim rows the bay replaces: the west rim loop places no crag on these. */
143
- export const BRANSONS_LANDING_COVE_MIN_Z = 224;
144
- export const BRANSONS_LANDING_COVE_MAX_Z = 251;
152
+ export const BRANSONS_LANDING_COVE_MIN_Z = 288;
153
+ export const BRANSONS_LANDING_COVE_MAX_Z = 315;
145
154
  /** Everything the landing owns, for the scenery sweep and the discovery zone. */
146
- export const BRANSONS_LANDING_WORKS = { minX: 0, maxX: 34, minZ: 220, maxZ: 255 };
155
+ export const BRANSONS_LANDING_WORKS = { minX: 0, maxX: 34, minZ: 284, maxZ: 319 };
147
156
  /** Oskar, Branson's mate, on the shore a step off the pier foot, facing the boards. */
148
- export const BRANSONS_LANDING_OSKAR = { x: 22, z: 235, faceX: 21, faceZ: 235 };
157
+ /**
158
+ * Oskar stands on the landing head, on the ship's side of it, where the
159
+ * gangway comes ashore: a boat man belongs beside his boat (James,
160
+ * 2026-09-22), not sixteen tiles up the pier on the sand. Passengers land
161
+ * on the head beside him and walk the planks in past the board.
162
+ */
163
+ export const BRANSONS_LANDING_OSKAR = { x: 5, z: 302, faceX: 9, faceZ: 301 };
149
164
  /** The sailings board, up the apron from Oskar with room to walk round it. */
150
- export const BRANSONS_LANDING_BOARD = { x: 26, z: 233 };
165
+ export const BRANSONS_LANDING_BOARD = { x: 26, z: 297 };
151
166
  /** The hut on the shelf north of the pier foot, its door to the south, and the steps down. */
152
- export const BRANSONS_LANDING_HUT = { x: 27, z: 228 };
153
- export const BRANSONS_LANDING_HUT_LANTERN = { x: 28, z: 230 };
167
+ export const BRANSONS_LANDING_HUT = { x: 27, z: 292 };
168
+ export const BRANSONS_LANDING_HUT_LANTERN = { x: 28, z: 294 };
154
169
  export const BRANSONS_LANDING_STEPS = [
155
- { x: 27, z: 230 },
156
- { x: 27, z: 231 },
170
+ { x: 27, z: 294 },
171
+ { x: 27, z: 295 },
157
172
  ];
158
173
  /** The shelf the hut stands on, its ledge row, and the apron the pier leaves from. */
159
174
  export const BRANSONS_LANDING_SHELF_HEIGHT = 3;
160
- export const BRANSONS_LANDING_LEDGE_Z = 230;
161
- export const BRANSONS_LANDING_APRON = { minX: 21, maxX: 33, minZ: 231, maxZ: 243 };
175
+ export const BRANSONS_LANDING_LEDGE_Z = 294;
176
+ export const BRANSONS_LANDING_APRON = { minX: 21, maxX: 33, minZ: 295, maxZ: 307 };
162
177
  export const BRANSONS_LANDING_APRON_HEIGHT = 1;
163
178
  /** A lantern post on the apron, south of the walk, and the stores stacked by the board. */
164
- export const BRANSONS_LANDING_APRON_LANTERN = { x: 24, z: 240 };
179
+ export const BRANSONS_LANDING_APRON_LANTERN = { x: 24, z: 304 };
165
180
  /** Ice floes on the bay water, clear of the ship and the pier. */
166
181
  export const BRANSONS_LANDING_FLOES = [
167
- { x: 2, z: 227, scale: 0.9 },
168
- { x: 10, z: 229, scale: 0.8 },
169
- { x: 16, z: 231, scale: 1.1 },
170
- { x: 2, z: 233, scale: 1.0 },
171
- { x: 19, z: 234, scale: 0.8 },
172
- { x: 15, z: 240, scale: 0.9 },
173
- { x: 18, z: 245, scale: 1.0 },
174
- { x: 10, z: 248, scale: 0.9 },
175
- { x: 4, z: 249, scale: 1.1 },
182
+ { x: 2, z: 291, scale: 0.9 },
183
+ { x: 10, z: 293, scale: 0.8 },
184
+ { x: 16, z: 295, scale: 1.1 },
185
+ { x: 2, z: 297, scale: 1.0 },
186
+ { x: 19, z: 298, scale: 0.8 },
187
+ { x: 15, z: 304, scale: 0.9 },
188
+ { x: 18, z: 309, scale: 1.0 },
189
+ { x: 10, z: 312, scale: 0.9 },
190
+ { x: 4, z: 313, scale: 1.1 },
176
191
  ];
177
192
  /** True for a cove water tile (the rim water at x 0-1 is water on every row anyway). */
178
193
  export function isBransonsLandingCoveTile(x, z) {
@@ -195,26 +210,26 @@ export function isBransonsLandingDeckTile(x, z) {
195
210
  z <= BRANSONS_LANDING_PIER_MAX_Z);
196
211
  }
197
212
  /** Kept for the rim loop and older callers: the crag line the bay now cuts through. */
198
- export const FROZEN_SHORE_JETTY = { x: 2, z: 237 };
199
- /** Where a voyage puts you ashore: the pier's foot plank, on the landing side. */
200
- export const FROZEN_SHORE_LANDING = { x: BRANSONS_LANDING_PIER_FOOT_X, z: BRANSONS_LANDING_PIER_MAX_Z };
213
+ export const FROZEN_SHORE_JETTY = { x: 2, z: 301 };
214
+ /** Where a voyage puts you ashore: the landing head, off the ship's gangway. */
215
+ export const FROZEN_SHORE_LANDING = { x: 4, z: BRANSONS_LANDING_PIER_MAX_Z };
201
216
  /**
202
217
  * First smashed span, about a third of the way out - far enough that the walk
203
218
  * to it is a walk, close enough to see the break from the sand.
204
219
  */
205
- export const HOPE_PIER_GAP1_MIN_Z = OCEAN_START_Z + 28;
206
- export const HOPE_PIER_GAP1_MAX_Z = OCEAN_START_Z + 29;
220
+ export const HOPE_PIER_GAP1_MIN_Z = OCEAN_START_Z + 43;
221
+ export const HOPE_PIER_GAP1_MAX_Z = OCEAN_START_Z + 44;
207
222
  /** Second smashed span, out past the middle deck at about two thirds. */
208
- export const HOPE_PIER_GAP2_MIN_Z = OCEAN_START_Z + 58;
209
- export const HOPE_PIER_GAP2_MAX_Z = OCEAN_START_Z + 59;
223
+ export const HOPE_PIER_GAP2_MIN_Z = OCEAN_START_Z + 87;
224
+ export const HOPE_PIER_GAP2_MAX_Z = OCEAN_START_Z + 88;
210
225
  /**
211
226
  * The pier head: the last four rows widen into a platform, so the end of a long
212
227
  * walk is somewhere to stand rather than the last plank of a corridor.
213
228
  */
214
229
  export const HOPE_PIER_HEAD_MIN_Z = HOPE_PIER_END_Z - 3;
215
230
  /** The middle deck, a passing place between the two smashed spans. */
216
- export const HOPE_PIER_MID_MIN_Z = OCEAN_START_Z + 42;
217
- export const HOPE_PIER_MID_MAX_Z = OCEAN_START_Z + 44;
231
+ export const HOPE_PIER_MID_MIN_Z = OCEAN_START_Z + 63;
232
+ export const HOPE_PIER_MID_MAX_Z = OCEAN_START_Z + 65;
218
233
  /** Both widenings are five tiles across against the walk's three. */
219
234
  export const HOPE_PIER_WIDE_HALF_W = 2;
220
235
  /** The moored ship, off the seaward corner of the branch. */
@@ -238,7 +253,7 @@ export const HOPE_PIER_SHIP_Z = HOPE_PIER_BRANCH_Z;
238
253
  export const HOPE_PIER_SPUR_Z = HOPE_PIER_MID_MIN_Z + 1;
239
254
  export const HOPE_PIER_SPUR_HALF_W = 1;
240
255
  export const HOPE_PIER_SPUR_MAX_X = HOPE_PIER_X - HOPE_PIER_WIDE_HALF_W - 1;
241
- export const HOPE_PIER_SPUR_MIN_X = HOPE_PIER_X - 12;
256
+ export const HOPE_PIER_SPUR_MIN_X = HOPE_PIER_X - 17;
242
257
  export const HOPE_PIER_HUT_X = HOPE_PIER_SPUR_MIN_X + 3;
243
258
  export const HOPE_PIER_HUT_Z = HOPE_PIER_SPUR_Z + HOPE_PIER_SPUR_HALF_W + 4;
244
259
  /**
@@ -291,6 +306,8 @@ export const PIER_CAST_MAX_TILES = 10;
291
306
  * timer and after every catch.
292
307
  */
293
308
  export const HOPE_PIER_SMELT_SPOT_COUNT = 5;
309
+ /** Crab cage spots along the side of the Long Pier at once, redrawn like the smelt. */
310
+ export const HOPE_BEACH_CRAB_SPOT_COUNT = 4;
294
311
  /**
295
312
  * Chebyshev tiles around HOPE_PIER_SHIP_X/Z no pier fish may sit in. The
296
313
  * moored ship has a one-tile footprint but its hull mesh covers a few tiles
@@ -451,8 +468,8 @@ export const BASECAMP_FAR_SIDE_LOCAL_Z = BASECAMP_CAVE_LOCAL_Z;
451
468
  * the south shore and the town stands back from the north shore.
452
469
  */
453
470
  export const BATTLEFIELD_NORTH_SHIFT = 18;
454
- /** An original survey Z, moved north by BATTLEFIELD_NORTH_SHIFT. */
455
- const bfZ = (surveyZ) => surveyZ - BATTLEFIELD_NORTH_SHIFT;
471
+ /** An original survey Z, moved north by BATTLEFIELD_NORTH_SHIFT (and south by the northern extension, NORTH_SHIFT). */
472
+ const bfZ = (surveyZ) => surveyZ - BATTLEFIELD_NORTH_SHIFT + NORTH_SHIFT;
456
473
  /**
457
474
  * Lake between soldier (south / farmward) and goblin (north) camps.
458
475
  * Water blocks walking; the battlefield crossing is the long bridge once repaired.
@@ -1171,47 +1188,38 @@ function roomSpawnSpots(minZ, maxZ, count) {
1171
1188
  }
1172
1189
  return spots;
1173
1190
  }
1174
- /** A small, close-quarters pit for the oversized level-10 rats. */
1191
+ /** A small, close-quarters pit for the oversized level-10 rats: a pair since 2026-09-22. */
1175
1192
  function giantRatPitSpawnSpots() {
1176
1193
  const cx = DUNGEON_CENTER_X;
1177
1194
  const pz = DUNGEON_ROOM2_PIT_Z;
1178
1195
  const offsets = [
1179
1196
  [-7, -7],
1180
1197
  [7, -7],
1181
- [0, -4],
1182
- [-8, 1],
1183
- [8, 1],
1184
- [-5, 7],
1185
- [5, 7],
1186
1198
  ];
1187
1199
  return offsets.map(([dx, dz]) => ({ x: cx + dx, z: pz + dz }));
1188
1200
  }
1189
- /** Swarming horde of tunnel vermin across the sunken rat pit (room 1). */
1201
+ /**
1202
+ * Tunnel vermin across the sunken rat pit (room 1).
1203
+ * Halved again on 2026-09-22 (James: the cave had too many rats): 15 spots,
1204
+ * one to a nook, alcove or pit ring so every part of the room still has one.
1205
+ */
1190
1206
  function room1RatSpawnSpots() {
1191
1207
  const cx = DUNGEON_CENTER_X;
1192
- // [dx, z] - well distributed across north nooks, 4 corner alcoves,
1193
- // mud puddles, center feeding mound, and perimeter walkways.
1208
+ // [dx, z] - thinned from 29 (and 58 before that), still covering the room.
1194
1209
  const offsets = [
1195
- // North nooks and throat (z=63-64)
1196
- [-10, 64], [-8, 63], [-6, 64], [-4, 63], [4, 63], [6, 64], [8, 63], [10, 64],
1197
- // NW Alcove and rat nest (z=65-67)
1198
- [-14, 65], [-14, 67], [-12, 66], [-11, 65],
1199
- // NE Alcove and rat nest (z=65-67)
1200
- [14, 65], [14, 67], [12, 66], [11, 65],
1201
- // Upper mid and arrival flank (z=65-68)
1202
- [-9, 66], [-5, 65], [5, 65], [9, 66],
1203
- [-7, 68], [-3, 67], [3, 67], [7, 68],
1204
- // Center feast and sunken pit ring (z=69-73)
1205
- [-10, 70], [-6, 69], [-2, 69], [2, 69], [6, 69], [10, 70],
1206
- [-9, 72], [-5, 71], [-1, 72], [1, 71], [5, 72], [9, 71],
1207
- [-7, 73], [-3, 73], [3, 73], [7, 73],
1208
- // SW Alcove and mud puddle skeleton (z=75-77)
1209
- [-14, 75], [-14, 77], [-12, 75], [-11, 77],
1210
- // SE Alcove and trophy caches (z=75-77)
1211
- [14, 75], [14, 77], [12, 75], [11, 77],
1212
- // Lower pit and south mud puddle (z=75-78)
1213
- [-8, 75], [-4, 75], [-2, 77], [2, 76], [6, 76], [8, 75],
1214
- [-9, 78], [-5, 78], [5, 78], [9, 78],
1210
+ // North nooks and throat (z=64)
1211
+ [-10, 64], [6, 64],
1212
+ // NW and NE alcoves (z=65-67)
1213
+ [-14, 65], [14, 67],
1214
+ // Upper mid and arrival flank (z=66)
1215
+ [-9, 66], [9, 66],
1216
+ // Center feast and sunken pit ring (z=69-71)
1217
+ [-10, 70], [-2, 69], [6, 69],
1218
+ [1, 71], [9, 71],
1219
+ // SW and SE alcoves (z=75-77)
1220
+ [-14, 75], [14, 77],
1221
+ // Lower pit and south mud (z=76-77)
1222
+ [-2, 77], [6, 76],
1215
1223
  ];
1216
1224
  return offsets.map(([dx, z]) => ({ x: cx + dx, z }));
1217
1225
  }
@@ -1361,7 +1369,7 @@ export function inNorthernGarrison(x, z) {
1361
1369
  * open up. Everything on it is placed from the centre; the fixed points
1362
1370
  * below moved with it.
1363
1371
  */
1364
- export const FROZEN_LAKE_CENTER = { x: 56, z: 236 };
1372
+ export const FROZEN_LAKE_CENTER = { x: 56, z: 300 };
1365
1373
  export const FROZEN_LAKE_RX = 14;
1366
1374
  export const FROZEN_LAKE_RZ = 12;
1367
1375
  /** The level the ice is frozen at; the lowland around it already lies near it. */
@@ -1411,12 +1419,12 @@ export function onFrozenLakeIce(x, z) {
1411
1419
  */
1412
1420
  export const FROZEN_PLATEAU_H = 5;
1413
1421
  /** Where the lowland starts climbing to the plateau, and where it is level. */
1414
- export const FROZEN_PLATEAU_RISE_Z = 214;
1415
- export const FROZEN_PLATEAU_TOP_Z = 198;
1422
+ export const FROZEN_PLATEAU_RISE_Z = 278;
1423
+ export const FROZEN_PLATEAU_TOP_Z = 262;
1416
1424
  /** The hills east of here are left as they are. */
1417
1425
  export const FROZEN_PLATEAU_MAX_X = 46;
1418
- export const CRYSTAL_GORGE_MIN_Z = 158;
1419
- export const CRYSTAL_GORGE_MAX_Z = 166;
1426
+ export const CRYSTAL_GORGE_MIN_Z = 222;
1427
+ export const CRYSTAL_GORGE_MAX_Z = 230;
1420
1428
  export const CRYSTAL_GORGE_MAX_X = 44;
1421
1429
  /** The bridge column and the deck's half-width in tiles. */
1422
1430
  export const CRYSTAL_BRIDGE_X = 21;
@@ -1426,9 +1434,9 @@ export const FROZEN_HALLWAY_HALF_W = 4;
1426
1434
  export const FROZEN_HALLWAY_WALL_T = 5;
1427
1435
  export const FROZEN_HALLWAY_WALL_H = 10;
1428
1436
  /** The rune arch at the mouth and the iron gate at the far end. */
1429
- export const FROZEN_HALLWAY_MOUTH_Z = 105;
1430
- export const FROZEN_HALLWAY_GATE_Z = 26;
1431
- export const FROZEN_HALLWAY_SEAL_Z = 6;
1437
+ export const FROZEN_HALLWAY_MOUTH_Z = 169;
1438
+ export const FROZEN_HALLWAY_GATE_Z = 90;
1439
+ export const FROZEN_HALLWAY_SEAL_Z = 70;
1432
1440
  /**
1433
1441
  * The Ice Prison: the rooms behind the hallway's iron gate, carved in the
1434
1442
  * off-map strip like the other interiors. You arrive in the Frozen Cells,
@@ -1483,9 +1491,15 @@ export const ICE_PRISON_BOUNDS = {
1483
1491
  minZ: ICE_PRISON_SHRINE.minZ - 8,
1484
1492
  maxZ: ICE_PRISON_CELLS.maxZ + 8,
1485
1493
  };
1494
+ /**
1495
+ * The prison proper and the Frozen Depths north of it (iceDepths.ts): one
1496
+ * predicate for the frost lighting, the rock palette and the cavern aggro,
1497
+ * so the boss rooms are the same cold as the shrine they open off.
1498
+ */
1486
1499
  export function inIcePrison(x, z) {
1487
- return (x >= ICE_PRISON_BOUNDS.minX && x <= ICE_PRISON_BOUNDS.maxX &&
1488
- z >= ICE_PRISON_BOUNDS.minZ && z <= ICE_PRISON_BOUNDS.maxZ);
1500
+ return ((x >= ICE_PRISON_BOUNDS.minX && x <= ICE_PRISON_BOUNDS.maxX &&
1501
+ z >= ICE_PRISON_BOUNDS.minZ && z <= ICE_PRISON_BOUNDS.maxZ) ||
1502
+ inIceDepths(x, z));
1489
1503
  }
1490
1504
  /** How far the hallway's centre line swings either side of FROZEN_HALLWAY_X. */
1491
1505
  export const FROZEN_HALLWAY_SWING = 7;
@@ -1548,11 +1562,11 @@ export const ICE_CAVERN_SPAWNS = [
1548
1562
  export const THAW_GORGE_CX = DEADLANDS_MIN_X;
1549
1563
  export const THAW_GORGE_MIN_X = THAW_GORGE_CX - 4;
1550
1564
  export const THAW_GORGE_MAX_X = THAW_GORGE_CX + 4;
1551
- export const THAW_GORGE_MIN_Z = 0;
1565
+ export const THAW_GORGE_MIN_Z = 64;
1552
1566
  /** Low river meets the battlefield lake's north bank. */
1553
1567
  export const THAW_GORGE_MAX_Z = BATTLEFIELD_LAKE_MIN_Z;
1554
- export const THAW_BRIDGE_Z = 49;
1555
- export const THAW_MID_BRIDGE_Z = 110;
1568
+ export const THAW_BRIDGE_Z = 113;
1569
+ export const THAW_MID_BRIDGE_Z = 174;
1556
1570
  export const THAW_WOODS_BRIDGE_Z = DEADLANDS_MIN_Z - 14;
1557
1571
  export const THAW_BRIDGE_ZS = [THAW_BRIDGE_Z, THAW_MID_BRIDGE_Z, THAW_WOODS_BRIDGE_Z];
1558
1572
  export const THAW_BRIDGE_HALF_W = 1;
@@ -1576,13 +1590,13 @@ export const THAW_FLOOD_EAST_X = THAW_GORGE_CX + 18;
1576
1590
  * then this fall, then the bridges over the low water. Not at Rains' span
1577
1591
  * and not south of it.
1578
1592
  */
1579
- export const THAW_FALLS_Z = 26;
1593
+ export const THAW_FALLS_Z = 90;
1580
1594
  /** @deprecated Same tile as THAW_FALLS_Z; kept for older imports. */
1581
1595
  export const THAW_SIDE_FALLS_Z = THAW_FALLS_Z;
1582
1596
  export const THAW_ARCH_X = THAW_FLOOD_EAST_X + 7;
1583
1597
  export const THAW_ARCH_PILLAR_DZ = 2;
1584
1598
  export const THAW_MOUTH_STAND_X = THAW_FLOOD_WEST_X - 2;
1585
- export const THAW_MOUTH_STAND_Z = 6;
1599
+ export const THAW_MOUTH_STAND_Z = 70;
1586
1600
  export const THAW_FALLS_STAND_X = THAW_FLOOD_WEST_X - 2;
1587
1601
  export const THAW_FALLS_STAND_Z = THAW_FALLS_Z;
1588
1602
  export function thawEastBridgeIdAtZ(z) {
@@ -1865,8 +1879,8 @@ export const GOBLIN_FRONTIER_ROAD = [
1865
1879
  ];
1866
1880
  /** The two occupied camp loops off the frontier road (built in goblinFrontier.ts). */
1867
1881
  export const GOBLIN_FRONTIER_CAMPS = [
1868
- { x: 113, z: 613 },
1869
- { x: 68, z: 571 },
1882
+ { x: 113, z: 677 },
1883
+ { x: 68, z: 635 },
1870
1884
  ];
1871
1885
  /**
1872
1886
  * Where the frontier is held. Goblins spawn here the way they do at the
@@ -2068,8 +2082,8 @@ export const DISCOVERY_ZONES = [
2068
2082
  label: 'The Frozen Shore',
2069
2083
  minX: 0,
2070
2084
  maxX: 12,
2071
- minZ: 0 - WORLD_NORTH_PAD,
2072
- maxZ: 345 - WORLD_NORTH_PAD,
2085
+ minZ: NORTH_SHIFT - WORLD_NORTH_PAD,
2086
+ maxZ: 409 - WORLD_NORTH_PAD,
2073
2087
  },
2074
2088
  {
2075
2089
  // The frozen lake and the fishers' ground on its banks. Listed before the
@@ -2099,9 +2113,21 @@ export const DISCOVERY_ZONES = [
2099
2113
  minZ: FROZEN_HALLWAY_SEAL_Z - 2 - WORLD_NORTH_PAD,
2100
2114
  maxZ: FROZEN_HALLWAY_MOUTH_Z + 7 - WORLD_NORTH_PAD,
2101
2115
  },
2102
- // The Capital's eight wards, each its own discovery; the castle ward is
2103
- // listed first because its bounds overlap the temple and noble wards.
2104
- ...[...CAPITAL_DISTRICTS].sort((a, b) => (a.id === 'capital-castle' ? -1 : b.id === 'capital-castle' ? 1 : 0)).map((d) => ({
2116
+ {
2117
+ // The walled port east of the East Gate: the ward, the piers and the
2118
+ // breakwater out to the lighthouse. Listed before the capital, whose
2119
+ // works reach over the moat's east bank.
2120
+ id: 'capital-harbour',
2121
+ label: HARBOUR_NAME,
2122
+ minX: HARBOUR_MIN_X,
2123
+ maxX: HARBOUR_MOLE_HEAD.maxX + 1,
2124
+ minZ: HARBOUR_MOLE_HEAD.minZ - WORLD_NORTH_PAD,
2125
+ maxZ: HARBOUR_SOUTH_Z - WORLD_NORTH_PAD,
2126
+ },
2127
+ // The Capital's eight districts (the 2026-09-25 plan), each its own
2128
+ // discovery. The ids are the old wards', so nobody is paid twice; the
2129
+ // rects tile the interior without overlapping, so their order is free.
2130
+ ...CAPITAL_DISTRICTS.map((d) => ({
2105
2131
  id: d.id,
2106
2132
  label: d.label,
2107
2133
  minX: d.minX,
@@ -2128,12 +2154,22 @@ export const DISCOVERY_ZONES = [
2128
2154
  minZ: THAW_GORGE_MIN_Z - WORLD_NORTH_PAD,
2129
2155
  maxZ: DEADLANDS_MIN_Z - 1 - WORLD_NORTH_PAD,
2130
2156
  },
2157
+ {
2158
+ // The headland the polar bears come ashore on (bearFloes.ts), and the
2159
+ // sea they ride in over. Listed before the snowfields, which reach it.
2160
+ id: 'bear-floes',
2161
+ label: 'The Bear Floes',
2162
+ minX: BEAR_FLOES_ZONE.minX,
2163
+ maxX: BEAR_FLOES_ZONE.maxX,
2164
+ minZ: BEAR_FLOES_ZONE.minZ - WORLD_NORTH_PAD,
2165
+ maxZ: BEAR_FLOES_ZONE.maxZ - WORLD_NORTH_PAD,
2166
+ },
2131
2167
  {
2132
2168
  id: 'northern-snowfields',
2133
2169
  label: 'The Snowfields',
2134
2170
  minX: 0,
2135
2171
  maxX: NORTHERN_WALL_MAX_X,
2136
- minZ: 0 - WORLD_NORTH_PAD,
2172
+ minZ: NORTH_SHIFT - WORLD_NORTH_PAD,
2137
2173
  maxZ: NORTHERN_WALL_Z - 25 - WORLD_NORTH_PAD,
2138
2174
  },
2139
2175
  ];
@@ -2182,17 +2218,21 @@ export function inMineYard(x, z, margin = 0) {
2182
2218
  */
2183
2219
  export const WORLD_MAP_LANDMARKS = [
2184
2220
  { x: NORTHERN_GATE_X, z: NORTHERN_WALL_Z, label: 'Northern Gate' },
2185
- { x: NORTHERN_CAMP_CENTER.x, z: NORTHERN_CAMP_CENTER.z, label: 'War Camp', labelSide: 'right' },
2186
- { x: 8, z: 200, label: 'Frozen Shore', labelSide: 'right' },
2187
- { x: BRANSONS_LANDING_SHIP.x, z: BRANSONS_LANDING_PIER_MAX_Z, label: "Branson's Landing", labelSide: 'below' },
2221
+ { x: NORTHERN_CAMP_CENTER.x, z: NORTHERN_CAMP_CENTER.z, label: 'War Camp', labelSide: 'right', kind: 'shop' },
2222
+ { x: 8, z: 264, label: 'Frozen Shore', labelSide: 'right' },
2223
+ { x: BEAR_FLOES_CAMP.x, z: BEAR_FLOES_CAMP.z - 8, label: 'The Bear Floes', labelSide: 'right' },
2224
+ { x: BRANSONS_LANDING_SHIP.x, z: BRANSONS_LANDING_PIER_MAX_Z, label: "Branson's Landing", labelSide: 'below', kind: 'shop' },
2188
2225
  { x: FROZEN_LAKE_CENTER.x, z: FROZEN_LAKE_CENTER.z, label: 'Frozen Lake', labelSide: 'right' },
2189
2226
  { x: CRYSTAL_BRIDGE_X, z: (CRYSTAL_GORGE_MIN_Z + CRYSTAL_GORGE_MAX_Z) / 2, label: 'Crystal Bridge', labelSide: 'right' },
2190
2227
  { x: FROZEN_HALLWAY_X, z: (FROZEN_HALLWAY_GATE_Z + FROZEN_HALLWAY_MOUTH_Z) / 2, label: 'Frozen Hallway', labelSide: 'right' },
2191
2228
  { x: THAW_GORGE_CX, z: THAW_BRIDGE_Z, label: 'Thaw Bridge', labelSide: 'right' },
2192
2229
  { x: THAW_GORGE_CX, z: THAW_FALLS_Z, label: 'Thaw Fall', labelSide: 'right' },
2193
2230
  { x: THAW_GORGE_CX, z: THAW_MOUTH_STAND_Z, label: 'Thaw Mouth', labelSide: 'right' },
2194
- { x: CAPITAL_KEEP.x - 110, z: CAPITAL_KEEP.z, label: 'The Capital', labelSide: 'above' },
2195
- { ...discoveryZoneCenter('no-harm-farm'), label: 'Farm' },
2231
+ // The city's name over the Crown Cross, where the Royal Way meets the King's Road.
2232
+ { x: CAPITAL_ROYAL_WAY_X, z: CAPITAL_AVENUE_Z, label: 'The Capital', labelSide: 'above', kind: 'shop' },
2233
+ { x: HARBOUR_ROYAL_PIER.maxX - 6, z: HARBOUR_ROAD_Z, label: "King's Harbour", labelSide: 'below', kind: 'shop' },
2234
+ { x: HARBOUR_LIGHTHOUSE.x, z: HARBOUR_LIGHTHOUSE.z, label: 'Lighthouse', labelSide: 'right' },
2235
+ { ...discoveryZoneCenter('no-harm-farm'), label: 'Farm', kind: 'shop' },
2196
2236
  { x: CROSSROADS_WORLD_X, z: toWorldZ(CROSSROADS_LOCAL_Z), label: 'Crossroads' },
2197
2237
  { ...discoveryZoneCenter('henson-pond'), label: 'Pond' },
2198
2238
  {
@@ -2208,22 +2248,42 @@ export const WORLD_MAP_LANDMARKS = [
2208
2248
  label: 'Trout Fishery',
2209
2249
  labelSide: 'on',
2210
2250
  },
2211
- { ...discoveryZoneCenter('basecamp'), label: 'Base Camp', labelSide: 'left' },
2251
+ { ...discoveryZoneCenter('basecamp'), label: 'Base Camp', labelSide: 'left', kind: 'shop' },
2212
2252
  {
2213
2253
  x: BATTLEFIELD_BRIDGE_X,
2214
2254
  z: Math.round((GOBLIN_FRONTIER_MIN_Z + GOBLIN_FRONTIER_MAX_Z) / 2),
2215
2255
  label: 'Battlefield',
2216
2256
  labelSide: 'above',
2217
2257
  },
2218
- { x: TOWN_GATE_X, z: TOWN_CROSS_STREET_Z, label: 'Calverton' },
2258
+ { x: TOWN_GATE_X, z: TOWN_CROSS_STREET_Z, label: 'Calverton', kind: 'shop' },
2219
2259
  { x: BLOOD_LAKE_CX, z: BLOOD_LAKE_CZ, label: 'Blood Lake', labelSide: 'on' },
2220
- { x: SPIDER_CAVE_MOUTH_X, z: SPIDER_CAVE_MOUTH_Z, label: 'Dungeon', labelSide: 'left' },
2260
+ {
2261
+ x: SPIDER_CAVE_MOUTH_X,
2262
+ z: SPIDER_CAVE_MOUTH_Z,
2263
+ label: 'Spider Cave',
2264
+ kind: 'dungeon',
2265
+ dungeonId: 'spider-cave',
2266
+ },
2221
2267
  {
2222
2268
  x: BASECAMP_CAVE_X,
2223
2269
  z: toWorldZ(BASECAMP_CAVE_LOCAL_Z),
2224
- label: 'Dungeon',
2270
+ label: 'Rat Tunnel',
2271
+ kind: 'dungeon',
2272
+ dungeonId: 'rat-tunnel',
2273
+ },
2274
+ {
2275
+ x: ICE_PRISON_OUTSIDE.x,
2276
+ z: ICE_PRISON_OUTSIDE.z,
2277
+ label: 'Ice Prison',
2278
+ kind: 'dungeon',
2279
+ dungeonId: 'ice-prison',
2280
+ },
2281
+ {
2282
+ x: GOBLIN_CAVE_OUTSIDE.x,
2283
+ z: GOBLIN_CAVE_OUTSIDE.z,
2284
+ label: 'Goblin Cave',
2225
2285
  kind: 'dungeon',
2226
- labelSide: 'right',
2286
+ dungeonId: 'goblin-cave',
2227
2287
  },
2228
2288
  ];
2229
2289
  /**