@dreadwood-types/types 0.1.303 → 0.1.304
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.
- package/dist/attackableNpcs.d.ts.map +1 -1
- package/dist/attackableNpcs.js +2 -0
- package/dist/attackableNpcs.js.map +1 -1
- package/dist/battlefieldMuster.d.ts +307 -0
- package/dist/battlefieldMuster.d.ts.map +1 -0
- package/dist/battlefieldMuster.js +301 -0
- package/dist/battlefieldMuster.js.map +1 -0
- package/dist/battlefieldQuests.d.ts +65 -0
- package/dist/battlefieldQuests.d.ts.map +1 -0
- package/dist/battlefieldQuests.js +267 -0
- package/dist/battlefieldQuests.js.map +1 -0
- package/dist/bossSignatures.d.ts +1 -1
- package/dist/bossSignatures.d.ts.map +1 -1
- package/dist/bossSignatures.js +6 -0
- package/dist/bossSignatures.js.map +1 -1
- package/dist/campTraders.d.ts.map +1 -1
- package/dist/campTraders.js +12 -0
- package/dist/campTraders.js.map +1 -1
- package/dist/constants.d.ts +1 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js.map +1 -1
- package/dist/expandedContracts.d.ts.map +1 -1
- package/dist/expandedContracts.js +2 -1
- package/dist/expandedContracts.js.map +1 -1
- package/dist/explorerLedger.d.ts +2 -1
- package/dist/explorerLedger.d.ts.map +1 -1
- package/dist/explorerLedger.js +7 -0
- package/dist/explorerLedger.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/quests.d.ts.map +1 -1
- package/dist/quests.js +32 -1
- package/dist/quests.js.map +1 -1
- package/dist/recommendedCombat.d.ts +1 -1
- package/dist/recommendedCombat.d.ts.map +1 -1
- package/dist/recommendedCombat.js +4 -0
- package/dist/recommendedCombat.js.map +1 -1
- package/dist/storyQuests.d.ts +1 -1
- package/dist/storyQuests.d.ts.map +1 -1
- package/dist/storyQuests.js +18 -0
- package/dist/storyQuests.js.map +1 -1
- package/dist/woodwork.d.ts +2 -2
- package/dist/woodwork.js +2 -2
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attackableNpcs.d.ts","sourceRoot":"","sources":["../src/attackableNpcs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAE9C;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,EAAE,WAAW,CAAC,OAAO,
|
|
1
|
+
{"version":3,"file":"attackableNpcs.d.ts","sourceRoot":"","sources":["../src/attackableNpcs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAE9C;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,EAAE,WAAW,CAAC,OAAO,CAoOpD,CAAC;AAEH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEzD"}
|
package/dist/attackableNpcs.js
CHANGED
|
@@ -203,6 +203,8 @@ export const ATTACKABLE_NPC_KINDS = new Set([
|
|
|
203
203
|
'skeletonwarden',
|
|
204
204
|
// The Toll Road (tollRoad.ts, T79): the Redcap Captain in the Ridge cellar.
|
|
205
205
|
'redcapcaptain',
|
|
206
|
+
// The Battlefield (battlefieldMuster.ts, T96): Warchief Skragg on the goblin hill fort.
|
|
207
|
+
'goblinwarchief',
|
|
206
208
|
// Tide of Blood (tideOfBlood.ts): the Blood Mire's leeches and the Bloodtide Elemental.
|
|
207
209
|
'mireleech',
|
|
208
210
|
'bloodtideelemental',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attackableNpcs.js","sourceRoot":"","sources":["../src/attackableNpcs.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"attackableNpcs.js","sourceRoot":"","sources":["../src/attackableNpcs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THE BATTLEFIELD, levels 6-14 (T96 2026-10-14; plan `.cursor/task-plans/2026-10-14-t96-battlefield.md`; audit `dreadwoods-backend/BATTLEFIELD_AUDIT.md`).
|
|
3
|
+
* The first place a newcomer meets goblins is a sealed soldiers' shore: the only way in is the Battlefield Captain's compound, and until now the
|
|
4
|
+
* compound had a Captain, a table and a fire. This turns it into a camp worth stopping at, and gives the goblin bank across the lake a reason to be
|
|
5
|
+
* crossed. NO new land: every position is a WORLD tile on ground that was already there.
|
|
6
|
+
*
|
|
7
|
+
* - THE CAPTAIN'S MUSTER (the compound, x 106-132, z 771-791): a cook (Hob Tasker, a camp trader), a Bounty Board, three training dummies, a supply
|
|
8
|
+
* wagon, three named residents (Lieutenant Corin Vale, Scout Merrin Quill, Sapper Joss Thorne) and a banner pair at the rear door. The walk
|
|
9
|
+
* from the south gate to the rear door (x 117-121) is kept clear.
|
|
10
|
+
* - THE LAKE BANK: three lookout posts for the scout, two bridge piers for the sapper, and danger signs (the far bank is goblin country).
|
|
11
|
+
* - THE NORTH LANDING: a second Rupert Row (the same name, so the client needs nothing new) on the goblin bank by the bridge's north foot, because
|
|
12
|
+
* until now a newcomer rowed across for 200 coins had no boat home.
|
|
13
|
+
* - THE GOBLIN RAID: a clock-read event on the shore north of the compound (like the Redcap patrol and the Passing Bay): windows every two hours
|
|
14
|
+
* read off the wall clock, lighter than a lone creature of the level, scaled to the players there. Lieutenant Vale can also sound a drill.
|
|
15
|
+
* - THE WARCHIEF'S HOLD: a hill fort on the goblin side (x 142-158, z 658-672) where Warchief Skragg (level 15) keeps a telegraphed slam and four guards.
|
|
16
|
+
*
|
|
17
|
+
* The chain is battlefieldQuests.ts ("The Muster", five quests, Combat 7-14). EVERY NUMBER HERE IS A PLACEHOLDER for the balance pass. Models are kit
|
|
18
|
+
* stand-ins (logged in dreadwoods-backend/upgrades).
|
|
19
|
+
*/
|
|
20
|
+
import type { LanternWakeBox } from './lanternWake.js';
|
|
21
|
+
import type { CalvertonFolk } from './calvertonExtension.js';
|
|
22
|
+
import type { DiscoveryZone } from './landmarks.js';
|
|
23
|
+
export declare const BATTLEFIELD_MUSTER_NAME = "The Captain's Muster";
|
|
24
|
+
export declare const WARCHIEF_HOLD_NAME = "The Warchief's Hold";
|
|
25
|
+
export declare const SAPPERS_SPAN_NAME = "The Sappers' Span";
|
|
26
|
+
/** The Captain's compound, final-world tiles: its centre (types landmarks.ts BATTLEFIELD_CAPTAIN_CAMP in the final frame), walls at x 105 and 133. */
|
|
27
|
+
export declare const MUSTER_CENTRE: {
|
|
28
|
+
readonly x: 119;
|
|
29
|
+
readonly z: 780;
|
|
30
|
+
};
|
|
31
|
+
/** The floor inside the walls (the walls are at x 105/133, z 769 north and z 793 south). */
|
|
32
|
+
export declare const MUSTER_BOX: LanternWakeBox;
|
|
33
|
+
/** The corridor from the south gate to the rear door: nothing is placed in it. */
|
|
34
|
+
export declare const MUSTER_CORRIDOR: LanternWakeBox;
|
|
35
|
+
export declare const MUSTER_SOUTH_GATE: {
|
|
36
|
+
readonly x: 119;
|
|
37
|
+
readonly z: 793;
|
|
38
|
+
};
|
|
39
|
+
export declare const MUSTER_NORTH_DOOR: {
|
|
40
|
+
readonly x: 119;
|
|
41
|
+
readonly z: 769;
|
|
42
|
+
};
|
|
43
|
+
export type MusterProp = {
|
|
44
|
+
id: string;
|
|
45
|
+
kind: 'dreadmodel' | 'dreadprop' | 'campfire' | 'barrel' | 'bountyboard' | 'yardprop';
|
|
46
|
+
style: string;
|
|
47
|
+
x: number;
|
|
48
|
+
z: number;
|
|
49
|
+
scale?: number;
|
|
50
|
+
};
|
|
51
|
+
/** The Muster's pieces: the cook's corner in the west, the board and the dummies in the east, banners at the rear door. */
|
|
52
|
+
export declare const MUSTER_PIECES: readonly MusterProp[];
|
|
53
|
+
export declare const MUSTER_FOLK_NAMES: {
|
|
54
|
+
readonly lieutenant: "Lieutenant Corin Vale";
|
|
55
|
+
readonly scout: "Scout Merrin Quill";
|
|
56
|
+
readonly sapper: "Sapper Joss Thorne";
|
|
57
|
+
readonly cook: "Hob Tasker";
|
|
58
|
+
};
|
|
59
|
+
/** Residents on the default look (stand-ins, logged in upgrades). The cook is a camp trader (campTraders.ts), not here. */
|
|
60
|
+
export declare const MUSTER_FOLK: ReadonlyArray<CalvertonFolk>;
|
|
61
|
+
export declare function musterFolkByName(name: string | null | undefined): CalvertonFolk | null;
|
|
62
|
+
export type MusterQuestProp = {
|
|
63
|
+
id: string;
|
|
64
|
+
x: number;
|
|
65
|
+
z: number;
|
|
66
|
+
style: string;
|
|
67
|
+
};
|
|
68
|
+
export declare const BF_PROP: {
|
|
69
|
+
readonly post: "bfpost";
|
|
70
|
+
readonly wagon: "bfwagon";
|
|
71
|
+
readonly pier: "bfpier";
|
|
72
|
+
readonly drum: "bfdrum";
|
|
73
|
+
};
|
|
74
|
+
/** Merrin's three lookout posts along the soldiers' lake bank (between the cabbage plots; she counts the far bank's fires from each). */
|
|
75
|
+
export declare const BF_POST_WEST: MusterQuestProp;
|
|
76
|
+
export declare const BF_POST_BRIDGE: MusterQuestProp;
|
|
77
|
+
export declare const BF_POST_EAST: MusterQuestProp;
|
|
78
|
+
export declare const BF_POSTS: readonly MusterQuestProp[];
|
|
79
|
+
/** The supply wagon in the compound (Supplies for the Line loads it). */
|
|
80
|
+
export declare const BF_WAGON: MusterQuestProp;
|
|
81
|
+
/** The two bridge piers at the south foot the sapper has you look over (The Sappers' Span). */
|
|
82
|
+
export declare const BF_PIER_WEST: MusterQuestProp;
|
|
83
|
+
export declare const BF_PIER_EAST: MusterQuestProp;
|
|
84
|
+
export declare const BF_PIERS: readonly MusterQuestProp[];
|
|
85
|
+
/** The war drum on top of the Warchief's Hold (silenced at the end of The Warchief's Hold). */
|
|
86
|
+
export declare const BF_DRUM: MusterQuestProp;
|
|
87
|
+
export declare const BATTLEFIELD_QUEST_PROPS: readonly MusterQuestProp[];
|
|
88
|
+
export declare const BATTLEFIELD_QUEST_PROP_NAMES: Readonly<Record<string, string>>;
|
|
89
|
+
export declare const BATTLEFIELD_PROP_IDLE_LINES: Readonly<Record<string, string>>;
|
|
90
|
+
/** The kit model a Battlefield quest prop draws with (CAPITAL_BUILDING_MODELS stand-ins), or null if not one of them. */
|
|
91
|
+
export declare function battlefieldPropModel(prop: string): string | null;
|
|
92
|
+
/** The signs. The first two stand on the soldiers' lake bank, the third on the goblin bank, the fourth below the Hold, the fifth inside the Muster. */
|
|
93
|
+
export declare const BATTLEFIELD_SIGNS: ReadonlyArray<{
|
|
94
|
+
id: string;
|
|
95
|
+
x: number;
|
|
96
|
+
z: number;
|
|
97
|
+
text: string;
|
|
98
|
+
}>;
|
|
99
|
+
/**
|
|
100
|
+
* Rupert Row's brother rows the other way. He is the SAME NAME so every dialog, marker and server rule keyed on "Rupert Row" works unchanged
|
|
101
|
+
* (the server rows south from the north bank: world.ts handleRupertRowBridgeCrossing). The boat is tied in the water at the shore.
|
|
102
|
+
*/
|
|
103
|
+
export declare const RUPERT_ROW_NORTH: {
|
|
104
|
+
readonly x: 86;
|
|
105
|
+
readonly z: 710;
|
|
106
|
+
readonly faceX: 86;
|
|
107
|
+
readonly faceZ: 713;
|
|
108
|
+
readonly boatX: 86;
|
|
109
|
+
readonly boatZ: 713;
|
|
110
|
+
};
|
|
111
|
+
export declare const NORTH_LANDING_BOX: LanternWakeBox;
|
|
112
|
+
/**
|
|
113
|
+
* A goblin band crosses the lake and storms the shore north of the Muster's rear door every two hours, at ten to the hour on the ODD hours
|
|
114
|
+
* (01:50, 03:50, ... UTC) for twelve minutes, read off the wall clock (nothing rolled or stored, so every server agrees and a restart changes
|
|
115
|
+
* nothing). Odd hours keep it off the Fishing Derby (even hours at :40) and clear of the Redcap patrol (:20) and the lairs (:10).
|
|
116
|
+
* The band is a small copy of the Random World Events stream (scaled levels, lighter than a lone creature of the level, never respawning in
|
|
117
|
+
* place, leaving with the last player on the shore).
|
|
118
|
+
*/
|
|
119
|
+
export declare const GOBLIN_RAID: {
|
|
120
|
+
readonly periodMs: number;
|
|
121
|
+
/** Milliseconds past 00:00 UTC the first window opens at (01:50). */
|
|
122
|
+
readonly offsetMs: number;
|
|
123
|
+
readonly durationMs: number;
|
|
124
|
+
readonly kind: "goblin";
|
|
125
|
+
readonly name: "Goblin raider";
|
|
126
|
+
readonly levels: [number, number];
|
|
127
|
+
readonly cap: 4;
|
|
128
|
+
readonly perExtraPlayer: 1;
|
|
129
|
+
readonly everyMs: 9000;
|
|
130
|
+
readonly firstWave: 2;
|
|
131
|
+
/** The band ignores anyone below this Combat (a green newcomer on the shore is left alone). */
|
|
132
|
+
readonly aggroCombat: 8;
|
|
133
|
+
/** They storm the whole shore: the nests are fifteen tiles apart, so one band reaches any fighter between them. */
|
|
134
|
+
readonly aggroRadius: 16;
|
|
135
|
+
readonly leashRadius: 40;
|
|
136
|
+
readonly aggroText: "A goblin band swarms up the bank: \"Kill the soft ones!\"";
|
|
137
|
+
};
|
|
138
|
+
/** A muster drill (the Lieutenant sounds the horn): a short raid anyone on the shore can fight, paid nothing, at most once every ten minutes. */
|
|
139
|
+
export declare const GOBLIN_DRILL: {
|
|
140
|
+
readonly durationMs: number;
|
|
141
|
+
readonly cooldownMs: number;
|
|
142
|
+
};
|
|
143
|
+
export declare const GOBLIN_RAID_ID_PREFIX = "bfr-";
|
|
144
|
+
/** The shore the raid keeps: north of the compound's rear door to the lake bank, between the camps' fences. */
|
|
145
|
+
export declare const GOBLIN_RAID_ZONE: {
|
|
146
|
+
readonly minX: 96;
|
|
147
|
+
readonly maxX: 142;
|
|
148
|
+
readonly minZ: 747;
|
|
149
|
+
readonly maxZ: 768;
|
|
150
|
+
};
|
|
151
|
+
export declare function inGoblinRaidZone(x: number, z: number): boolean;
|
|
152
|
+
/** Where the band forms: along the lake bank (NPCs, so no entity rule applies). */
|
|
153
|
+
export declare const GOBLIN_RAID_NESTS: ReadonlyArray<{
|
|
154
|
+
x: number;
|
|
155
|
+
z: number;
|
|
156
|
+
}>;
|
|
157
|
+
export declare const GOBLIN_RAID_KILLS_TO_PAY = 4;
|
|
158
|
+
export declare const GOBLIN_RAID_REWARD: {
|
|
159
|
+
readonly coins: 150;
|
|
160
|
+
readonly explorerXp: 250;
|
|
161
|
+
};
|
|
162
|
+
export declare const GOBLIN_RAID_DIFFICULTY = 1;
|
|
163
|
+
/** The raid is not a quest creature by its kind: the kill key the story engine counts. */
|
|
164
|
+
export declare const GOBLIN_RAID_QUEST_KEY = "bf-raider";
|
|
165
|
+
export declare const GOBLIN_RAID_TEXTS: {
|
|
166
|
+
readonly start: "A goblin band is storming the shore north of the Muster! Hold the line until it breaks.";
|
|
167
|
+
readonly endPaid: "The goblins break and run for the lake. The Muster's horn sounds for you.";
|
|
168
|
+
readonly endPlain: "The goblin band breaks and runs for the lake.";
|
|
169
|
+
readonly quiet: "A goblin band is storming the shore, but they have no interest in someone so green. Keep to the camp.";
|
|
170
|
+
readonly warn: "The Muster horn sounds: a goblin band will storm the shore in a minute or so.";
|
|
171
|
+
readonly drill: "Lieutenant Vale sounds the horn: a drill raid! Goblin raiders come up the bank. Hold the line, and nothing is paid for a drill.";
|
|
172
|
+
readonly drillWait: "The Lieutenant shakes his head: the last drill was not ten minutes ago. Give the camp a breather.";
|
|
173
|
+
readonly drillActive: "The line is already holding a raid. Go and fight it.";
|
|
174
|
+
};
|
|
175
|
+
export declare const GOBLIN_RAID_WARN_MS = 90000;
|
|
176
|
+
export type GoblinRaidWindow = {
|
|
177
|
+
slot: number;
|
|
178
|
+
startMs: number;
|
|
179
|
+
endMs: number;
|
|
180
|
+
active: boolean;
|
|
181
|
+
nextStartMs: number;
|
|
182
|
+
};
|
|
183
|
+
/** The raid window `nowMs` is in or the next one: a pure function of the clock. */
|
|
184
|
+
export declare function goblinRaidWindow(nowMs: number): GoblinRaidWindow;
|
|
185
|
+
/** The slot whose window is open or the NEXT one to open (the slot the warning belongs to). */
|
|
186
|
+
export declare function goblinRaidSlotAfter(nowMs: number): number;
|
|
187
|
+
/** The hold: a ring of logs on the hilltop mesa (heights 6-7 at x 144-154, z 660-670), its gap on the south-west where the track comes up. */
|
|
188
|
+
export declare const WARCHIEF_HOLD: LanternWakeBox;
|
|
189
|
+
export declare const WARCHIEF_HOLD_CENTRE: {
|
|
190
|
+
readonly x: 149;
|
|
191
|
+
readonly z: 665;
|
|
192
|
+
};
|
|
193
|
+
/** The hold's ring wall: a square of logs round the mesa, with a three-wide gap at the south-west corner. */
|
|
194
|
+
export declare const WARCHIEF_HOLD_GAP: {
|
|
195
|
+
readonly minX: 142;
|
|
196
|
+
readonly maxX: 144;
|
|
197
|
+
readonly minZ: 670;
|
|
198
|
+
readonly maxZ: 672;
|
|
199
|
+
};
|
|
200
|
+
/** The foot of the hill where the quest's reach step lands and the approach is signed. */
|
|
201
|
+
export declare const WARCHIEF_HOLD_FOOT: {
|
|
202
|
+
readonly minX: 134;
|
|
203
|
+
readonly maxX: 146;
|
|
204
|
+
readonly minZ: 674;
|
|
205
|
+
readonly maxZ: 682;
|
|
206
|
+
};
|
|
207
|
+
export declare const WARCHIEF_HOLD_STANDS: {
|
|
208
|
+
readonly foot: {
|
|
209
|
+
readonly x: 140;
|
|
210
|
+
readonly z: 678;
|
|
211
|
+
};
|
|
212
|
+
readonly gate: {
|
|
213
|
+
readonly x: 143;
|
|
214
|
+
readonly z: 671;
|
|
215
|
+
};
|
|
216
|
+
readonly top: {
|
|
217
|
+
readonly x: 149;
|
|
218
|
+
readonly z: 665;
|
|
219
|
+
};
|
|
220
|
+
};
|
|
221
|
+
export declare const WARCHIEF_HOLD_PIECES: readonly MusterProp[];
|
|
222
|
+
export declare const WARCHIEF_KIND = "goblinwarchief";
|
|
223
|
+
export declare const WARCHIEF_NAME = "Warchief Skragg";
|
|
224
|
+
export declare const WARCHIEF: {
|
|
225
|
+
readonly name: "Warchief Skragg";
|
|
226
|
+
readonly level: readonly [number, number];
|
|
227
|
+
readonly maxHit: 9;
|
|
228
|
+
readonly healthFactor: 1.8;
|
|
229
|
+
readonly respawnMs: 240000;
|
|
230
|
+
readonly aggro: 7;
|
|
231
|
+
readonly leash: 14;
|
|
232
|
+
readonly x: 150;
|
|
233
|
+
readonly z: 664;
|
|
234
|
+
readonly spawnLeash: 2;
|
|
235
|
+
readonly text: "Warchief Skragg slams his maul on the drum frame. \"Little soldier come to die on my hill!\"";
|
|
236
|
+
readonly note: "The goblins' warchief, a head taller than his band, with a maul made from a wagon axle. He keeps a hill fort on the goblin side of the lake with four guards. Every fourth blow is a slam, announced a full turn ahead and twice an ordinary hit: step out of his reach before it lands and it misses.";
|
|
237
|
+
};
|
|
238
|
+
export declare function isBattlefieldHostileKind(kind: string): boolean;
|
|
239
|
+
/** The four guards: ordinary goblins (ids `bfh-`) inside the ring, who hold the hold. */
|
|
240
|
+
export declare const WARCHIEF_GUARD_ID_PREFIX = "bfh-";
|
|
241
|
+
export declare const WARCHIEF_GUARDS: ReadonlyArray<{
|
|
242
|
+
x: number;
|
|
243
|
+
z: number;
|
|
244
|
+
}>;
|
|
245
|
+
export declare function inWarchiefHold(x: number, z: number): boolean;
|
|
246
|
+
/** The Battlefield's lines (marked by the server, ids are the marks it writes; explorerLedger.ts section `field`). */
|
|
247
|
+
export declare const LEDGER_FIELD_LINES: readonly {
|
|
248
|
+
id: string;
|
|
249
|
+
label: string;
|
|
250
|
+
}[];
|
|
251
|
+
export declare const BATTLEFIELD_DISCOVERY_ZONES: readonly DiscoveryZone[];
|
|
252
|
+
/** Where the quest helper and the guide say each place is. */
|
|
253
|
+
export declare const BATTLEFIELD_PLACE_TEXT: Readonly<Record<string, string>>;
|
|
254
|
+
/** Standable tiles (teleport links, smokes). */
|
|
255
|
+
export declare const BATTLEFIELD_STANDS: {
|
|
256
|
+
readonly muster: {
|
|
257
|
+
readonly x: 119;
|
|
258
|
+
readonly z: 784;
|
|
259
|
+
};
|
|
260
|
+
readonly gate: {
|
|
261
|
+
readonly x: 119;
|
|
262
|
+
readonly z: 791;
|
|
263
|
+
};
|
|
264
|
+
readonly cook: {
|
|
265
|
+
readonly x: 112;
|
|
266
|
+
readonly z: 781;
|
|
267
|
+
};
|
|
268
|
+
readonly board: {
|
|
269
|
+
readonly x: 123;
|
|
270
|
+
readonly z: 777;
|
|
271
|
+
};
|
|
272
|
+
readonly rearDoor: {
|
|
273
|
+
readonly x: 119;
|
|
274
|
+
readonly z: 767;
|
|
275
|
+
};
|
|
276
|
+
readonly dock: {
|
|
277
|
+
readonly x: 80;
|
|
278
|
+
readonly z: 746;
|
|
279
|
+
};
|
|
280
|
+
readonly bridgeSouth: {
|
|
281
|
+
readonly x: 91;
|
|
282
|
+
readonly z: 746;
|
|
283
|
+
};
|
|
284
|
+
readonly bridgeNorth: {
|
|
285
|
+
readonly x: 91;
|
|
286
|
+
readonly z: 709;
|
|
287
|
+
};
|
|
288
|
+
readonly northLanding: {
|
|
289
|
+
readonly x: 86;
|
|
290
|
+
readonly z: 709;
|
|
291
|
+
};
|
|
292
|
+
readonly hold: {
|
|
293
|
+
readonly foot: {
|
|
294
|
+
readonly x: 140;
|
|
295
|
+
readonly z: 678;
|
|
296
|
+
};
|
|
297
|
+
readonly gate: {
|
|
298
|
+
readonly x: 143;
|
|
299
|
+
readonly z: 671;
|
|
300
|
+
};
|
|
301
|
+
readonly top: {
|
|
302
|
+
readonly x: 149;
|
|
303
|
+
readonly z: 665;
|
|
304
|
+
};
|
|
305
|
+
};
|
|
306
|
+
};
|
|
307
|
+
//# sourceMappingURL=battlefieldMuster.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"battlefieldMuster.d.ts","sourceRoot":"","sources":["../src/battlefieldMuster.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
export const BATTLEFIELD_MUSTER_NAME = "The Captain's Muster";
|
|
2
|
+
export const WARCHIEF_HOLD_NAME = "The Warchief's Hold";
|
|
3
|
+
export const SAPPERS_SPAN_NAME = "The Sappers' Span";
|
|
4
|
+
/** The Captain's compound, final-world tiles: its centre (types landmarks.ts BATTLEFIELD_CAPTAIN_CAMP in the final frame), walls at x 105 and 133. */
|
|
5
|
+
export const MUSTER_CENTRE = { x: 119, z: 780 };
|
|
6
|
+
/** The floor inside the walls (the walls are at x 105/133, z 769 north and z 793 south). */
|
|
7
|
+
export const MUSTER_BOX = { minX: 106, maxX: 132, minZ: 771, maxZ: 791 };
|
|
8
|
+
/** The corridor from the south gate to the rear door: nothing is placed in it. */
|
|
9
|
+
export const MUSTER_CORRIDOR = { minX: 117, maxX: 121, minZ: 770, maxZ: 792 };
|
|
10
|
+
export const MUSTER_SOUTH_GATE = { x: 119, z: 793 };
|
|
11
|
+
export const MUSTER_NORTH_DOOR = { x: 119, z: 769 };
|
|
12
|
+
/** The Muster's pieces: the cook's corner in the west, the board and the dummies in the east, banners at the rear door. */
|
|
13
|
+
export const MUSTER_PIECES = [
|
|
14
|
+
{ id: 'bf-cook-tent', kind: 'dreadprop', style: 'tent-face90', x: 109, z: 782 },
|
|
15
|
+
{ id: 'bf-cook-fire', kind: 'campfire', style: 'beach-pit', x: 113, z: 782, scale: 1 },
|
|
16
|
+
{ id: 'bf-cook-crates', kind: 'dreadmodel', style: 'hbcrates-s', x: 107, z: 779 },
|
|
17
|
+
{ id: 'bf-cook-barrel', kind: 'barrel', style: 'barrel', x: 111, z: 786, scale: 1 },
|
|
18
|
+
{ id: 'bf-cook-bench', kind: 'dreadmodel', style: 'hbbench-s', x: 110, z: 788 },
|
|
19
|
+
{ id: 'bf-board', kind: 'bountyboard', style: 'wall-s', x: 123, z: 775 },
|
|
20
|
+
{ id: 'bf-dummy-1', kind: 'yardprop', style: 'dummy', x: 126, z: 780 },
|
|
21
|
+
{ id: 'bf-dummy-2', kind: 'yardprop', style: 'dummy', x: 129, z: 780 },
|
|
22
|
+
{ id: 'bf-dummy-3', kind: 'yardprop', style: 'dummy', x: 126, z: 783 },
|
|
23
|
+
{ id: 'bf-banner-w', kind: 'dreadprop', style: 'banner', x: 116, z: 771 },
|
|
24
|
+
{ id: 'bf-banner-e', kind: 'dreadprop', style: 'banner', x: 122, z: 771 },
|
|
25
|
+
{ id: 'bf-lantern-w', kind: 'dreadmodel', style: 'townlantern1x1-s', x: 116, z: 790 },
|
|
26
|
+
{ id: 'bf-lantern-e', kind: 'dreadmodel', style: 'townlantern1x1-s', x: 122, z: 790 },
|
|
27
|
+
];
|
|
28
|
+
// ---- The people ----------------------------------------------------------------------------------------------------------------------
|
|
29
|
+
export const MUSTER_FOLK_NAMES = {
|
|
30
|
+
lieutenant: 'Lieutenant Corin Vale',
|
|
31
|
+
scout: 'Scout Merrin Quill',
|
|
32
|
+
sapper: 'Sapper Joss Thorne',
|
|
33
|
+
cook: 'Hob Tasker',
|
|
34
|
+
};
|
|
35
|
+
/** Residents on the default look (stand-ins, logged in upgrades). The cook is a camp trader (campTraders.ts), not here. */
|
|
36
|
+
export const MUSTER_FOLK = [
|
|
37
|
+
{
|
|
38
|
+
id: 'bf-lieutenant',
|
|
39
|
+
name: MUSTER_FOLK_NAMES.lieutenant,
|
|
40
|
+
place: "the Captain's Muster, the Battlefield",
|
|
41
|
+
x: 124, z: 778, faceX: 121, faceZ: 778, leash: 1,
|
|
42
|
+
speak: "Corin Vale, lieutenant under the Captain. Goblins hold the far bank of the lake and they raid this shore every other hour. Quill counts them, Thorne mends what they break, and I send everybody else out with a sword and a hot meal. Eat first.",
|
|
43
|
+
extras: [
|
|
44
|
+
{ id: 'raids', label: 'The goblin raids', say: "A goblin band comes over the lake on the odd hours, ten to fourteen past the horn at ten to the hour, and runs at anyone fit to fight on the shore north of this camp. Bring food, stay near the door, and the Muster will thank you for every raider you put down. If you are on my orders (Hold the Line), speak to me while it is quiet and I will sound a drill." },
|
|
45
|
+
{ id: 'lake', label: 'Crossing the lake', say: "The bridge is smashed mid-span. Rupert Row rows over from his dock for 200 coins, and his brother rows the other way. Thorne will show you how to mend the span yourself with birch and poplar (Woodwork 15). Do not cross under Combat 12: the far bank is goblin country." },
|
|
46
|
+
],
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
id: 'bf-scout',
|
|
50
|
+
name: MUSTER_FOLK_NAMES.scout,
|
|
51
|
+
place: "the Captain's Muster, the Battlefield",
|
|
52
|
+
x: 115, z: 781, faceX: 113, faceZ: 782, leash: 1,
|
|
53
|
+
speak: "Merrin Quill, scout. I count fires on the far bank from the lake posts and I sleep in the day. There are more of them every month. If you have two good legs and a head for heights, I could use them.",
|
|
54
|
+
extras: [{ id: 'far-bank', label: 'The far bank', say: "Goblin soldiers, level ten to twelve, in ten camps along the water, and a hold on the hill to the north-east with a chief who beats a drum. They hit hard and they chase. Do not go over before Combat 12 unless you like running." }],
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
id: 'bf-sapper',
|
|
58
|
+
name: MUSTER_FOLK_NAMES.sapper,
|
|
59
|
+
place: "the Captain's Muster, the Battlefield",
|
|
60
|
+
x: 124, z: 788, faceX: 124, faceZ: 790, leash: 1,
|
|
61
|
+
speak: "Joss Thorne, sapper. I mend what the goblins break and I break what the goblins build. The bridge over the lake has been smashed since before I came. A man with a saw and enough timber could plank it for good.",
|
|
62
|
+
extras: [{ id: 'timber', label: 'About the timber', say: "Thirty birch and twenty poplar, felled with a hatchet, and Woodwork fifteen to lay it true. Do the job yourself at the span if you like, or hand the timber to me and I will do it with you. Either way the crossing is yours for good." }],
|
|
63
|
+
},
|
|
64
|
+
];
|
|
65
|
+
export function musterFolkByName(name) {
|
|
66
|
+
return name ? MUSTER_FOLK.find((p) => p.name === name) ?? null : null;
|
|
67
|
+
}
|
|
68
|
+
export const BF_PROP = { post: 'bfpost', wagon: 'bfwagon', pier: 'bfpier', drum: 'bfdrum' };
|
|
69
|
+
/** Merrin's three lookout posts along the soldiers' lake bank (between the cabbage plots; she counts the far bank's fires from each). */
|
|
70
|
+
export const BF_POST_WEST = { id: 'bf-quest-post-west', x: 45, z: 747, style: `${BF_PROP.post}:west` };
|
|
71
|
+
export const BF_POST_BRIDGE = { id: 'bf-quest-post-bridge', x: 70, z: 747, style: `${BF_PROP.post}:bridge` };
|
|
72
|
+
export const BF_POST_EAST = { id: 'bf-quest-post-east', x: 148, z: 747, style: `${BF_PROP.post}:east` };
|
|
73
|
+
export const BF_POSTS = [BF_POST_WEST, BF_POST_BRIDGE, BF_POST_EAST];
|
|
74
|
+
/** The supply wagon in the compound (Supplies for the Line loads it). */
|
|
75
|
+
export const BF_WAGON = { id: 'bf-quest-wagon', x: 123, z: 790, style: `${BF_PROP.wagon}:load` };
|
|
76
|
+
/** The two bridge piers at the south foot the sapper has you look over (The Sappers' Span). */
|
|
77
|
+
export const BF_PIER_WEST = { id: 'bf-quest-pier-west', x: 88, z: 747, style: `${BF_PROP.pier}:west` };
|
|
78
|
+
export const BF_PIER_EAST = { id: 'bf-quest-pier-east', x: 94, z: 747, style: `${BF_PROP.pier}:east` };
|
|
79
|
+
export const BF_PIERS = [BF_PIER_WEST, BF_PIER_EAST];
|
|
80
|
+
/** The war drum on top of the Warchief's Hold (silenced at the end of The Warchief's Hold). */
|
|
81
|
+
export const BF_DRUM = { id: 'bf-quest-drum', x: 153, z: 666, style: `${BF_PROP.drum}:hold` };
|
|
82
|
+
export const BATTLEFIELD_QUEST_PROPS = [...BF_POSTS, BF_WAGON, ...BF_PIERS, BF_DRUM];
|
|
83
|
+
export const BATTLEFIELD_QUEST_PROP_NAMES = {
|
|
84
|
+
[BF_POST_WEST.style]: 'Lookout Post (west bank)',
|
|
85
|
+
[BF_POST_BRIDGE.style]: 'Lookout Post (by the dock)',
|
|
86
|
+
[BF_POST_EAST.style]: 'Lookout Post (east bank)',
|
|
87
|
+
[BF_WAGON.style]: 'The Supply Wagon',
|
|
88
|
+
[BF_PIER_WEST.style]: 'Bridge Pier (west)',
|
|
89
|
+
[BF_PIER_EAST.style]: 'Bridge Pier (east)',
|
|
90
|
+
[BF_DRUM.style]: "The Warchief's War Drum",
|
|
91
|
+
};
|
|
92
|
+
export const BATTLEFIELD_PROP_IDLE_LINES = {
|
|
93
|
+
[BF_PROP.post]: 'A lookout post: a rail to lean a spyglass on, and a slate scratched with a tally of fires on the far bank.',
|
|
94
|
+
[BF_PROP.wagon]: 'The Muster supply wagon, half loaded: sacks, a keg and a coil of rope. The Lieutenant wants it ready for the line.',
|
|
95
|
+
[BF_PROP.pier]: 'A pier of the old bridge, black with water and furred with weed. The deck above it is gone.',
|
|
96
|
+
[BF_PROP.drum]: 'A huge hide drum on a frame of lashed logs, its skin patched with goblin teeth.',
|
|
97
|
+
};
|
|
98
|
+
/** The kit model a Battlefield quest prop draws with (CAPITAL_BUILDING_MODELS stand-ins), or null if not one of them. */
|
|
99
|
+
export function battlefieldPropModel(prop) {
|
|
100
|
+
if (prop === BF_PROP.post)
|
|
101
|
+
return 'questclue';
|
|
102
|
+
if (prop === BF_PROP.wagon)
|
|
103
|
+
return 'merchantwagon';
|
|
104
|
+
if (prop === BF_PROP.pier)
|
|
105
|
+
return 'questclue';
|
|
106
|
+
if (prop === BF_PROP.drum)
|
|
107
|
+
return 'questbeacon';
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
/** The signs. The first two stand on the soldiers' lake bank, the third on the goblin bank, the fourth below the Hold, the fifth inside the Muster. */
|
|
111
|
+
export const BATTLEFIELD_SIGNS = [
|
|
112
|
+
{
|
|
113
|
+
id: 'bf-sign-dock',
|
|
114
|
+
x: 81,
|
|
115
|
+
z: 747,
|
|
116
|
+
text: 'The Battlefield lake. The bridge is smashed mid-span. Rupert Row rows travellers across from this dock for 200 coins, or mend the span with birch and poplar (Woodwork 15; ask the sapper at the Muster). The far bank is goblin country: levels 10 to 12. Combat 12 advised.',
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
id: 'bf-sign-bridge',
|
|
120
|
+
x: 96,
|
|
121
|
+
z: 747,
|
|
122
|
+
text: 'The old bridge. The middle of the span is in the lake. Goblins hold the far bank and they chase. Under Combat 12, turn back to the Muster for a hot meal, the training dummies and the Bounty Board.',
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
id: 'bf-sign-landing',
|
|
126
|
+
x: 96,
|
|
127
|
+
z: 708,
|
|
128
|
+
text: "The goblin bank. Rupert Row's brother keeps the north landing: he rows travellers home to the soldiers' shore for 200 coins. The camps run east and west along the water; the Warchief's Hold stands on the hill to the north-east.",
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
id: 'bf-sign-hold',
|
|
132
|
+
x: 140,
|
|
133
|
+
z: 676,
|
|
134
|
+
text: "The Warchief's Hold. Warchief Skragg (level 15) keeps the hill with four guards and a war drum. He lifts his maul and a ring closes round him every fourth blow: step out of his reach. Combat 18 recommended.",
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
id: 'bf-sign-muster',
|
|
138
|
+
x: 123,
|
|
139
|
+
z: 792,
|
|
140
|
+
text: "The Captain's Muster. A cook, a Bounty Board, training dummies and a supply wagon. Goblins raid the shore north of the rear door every other hour; the lake and its goblin bank lie beyond.",
|
|
141
|
+
},
|
|
142
|
+
];
|
|
143
|
+
// ---- The North Landing (a second Rupert Row) ----------------------------------------------------------------------------------------
|
|
144
|
+
/**
|
|
145
|
+
* Rupert Row's brother rows the other way. He is the SAME NAME so every dialog, marker and server rule keyed on "Rupert Row" works unchanged
|
|
146
|
+
* (the server rows south from the north bank: world.ts handleRupertRowBridgeCrossing). The boat is tied in the water at the shore.
|
|
147
|
+
*/
|
|
148
|
+
export const RUPERT_ROW_NORTH = { x: 86, z: 710, faceX: 86, faceZ: 713, boatX: 86, boatZ: 713 };
|
|
149
|
+
export const NORTH_LANDING_BOX = { minX: 82, maxX: 96, minZ: 704, maxZ: 711 };
|
|
150
|
+
// ---- The Goblin Raid (a clock-read event, like the Redcap patrol) ----------------------------------------------------------------------
|
|
151
|
+
/**
|
|
152
|
+
* A goblin band crosses the lake and storms the shore north of the Muster's rear door every two hours, at ten to the hour on the ODD hours
|
|
153
|
+
* (01:50, 03:50, ... UTC) for twelve minutes, read off the wall clock (nothing rolled or stored, so every server agrees and a restart changes
|
|
154
|
+
* nothing). Odd hours keep it off the Fishing Derby (even hours at :40) and clear of the Redcap patrol (:20) and the lairs (:10).
|
|
155
|
+
* The band is a small copy of the Random World Events stream (scaled levels, lighter than a lone creature of the level, never respawning in
|
|
156
|
+
* place, leaving with the last player on the shore).
|
|
157
|
+
*/
|
|
158
|
+
export const GOBLIN_RAID = {
|
|
159
|
+
periodMs: 2 * 3_600_000,
|
|
160
|
+
/** Milliseconds past 00:00 UTC the first window opens at (01:50). */
|
|
161
|
+
offsetMs: 110 * 60_000,
|
|
162
|
+
durationMs: 12 * 60_000,
|
|
163
|
+
kind: 'goblin',
|
|
164
|
+
name: 'Goblin raider',
|
|
165
|
+
levels: [10, 13],
|
|
166
|
+
cap: 4,
|
|
167
|
+
perExtraPlayer: 1,
|
|
168
|
+
everyMs: 9_000,
|
|
169
|
+
firstWave: 2,
|
|
170
|
+
/** The band ignores anyone below this Combat (a green newcomer on the shore is left alone). */
|
|
171
|
+
aggroCombat: 8,
|
|
172
|
+
/** They storm the whole shore: the nests are fifteen tiles apart, so one band reaches any fighter between them. */
|
|
173
|
+
aggroRadius: 16,
|
|
174
|
+
leashRadius: 40,
|
|
175
|
+
aggroText: 'A goblin band swarms up the bank: "Kill the soft ones!"',
|
|
176
|
+
};
|
|
177
|
+
/** A muster drill (the Lieutenant sounds the horn): a short raid anyone on the shore can fight, paid nothing, at most once every ten minutes. */
|
|
178
|
+
export const GOBLIN_DRILL = { durationMs: 6 * 60_000, cooldownMs: 10 * 60_000 };
|
|
179
|
+
export const GOBLIN_RAID_ID_PREFIX = 'bfr-';
|
|
180
|
+
/** The shore the raid keeps: north of the compound's rear door to the lake bank, between the camps' fences. */
|
|
181
|
+
export const GOBLIN_RAID_ZONE = { minX: 96, maxX: 142, minZ: 747, maxZ: 768 };
|
|
182
|
+
export function inGoblinRaidZone(x, z) {
|
|
183
|
+
const b = GOBLIN_RAID_ZONE;
|
|
184
|
+
return x >= b.minX && x <= b.maxX && z >= b.minZ && z <= b.maxZ;
|
|
185
|
+
}
|
|
186
|
+
/** Where the band forms: along the lake bank (NPCs, so no entity rule applies). */
|
|
187
|
+
export const GOBLIN_RAID_NESTS = [
|
|
188
|
+
{ x: 104, z: 749 },
|
|
189
|
+
{ x: 119, z: 749 },
|
|
190
|
+
{ x: 134, z: 749 },
|
|
191
|
+
];
|
|
192
|
+
export const GOBLIN_RAID_KILLS_TO_PAY = 4;
|
|
193
|
+
export const GOBLIN_RAID_REWARD = { coins: 150, explorerXp: 250 };
|
|
194
|
+
export const GOBLIN_RAID_DIFFICULTY = 1;
|
|
195
|
+
/** The raid is not a quest creature by its kind: the kill key the story engine counts. */
|
|
196
|
+
export const GOBLIN_RAID_QUEST_KEY = 'bf-raider';
|
|
197
|
+
export const GOBLIN_RAID_TEXTS = {
|
|
198
|
+
start: 'A goblin band is storming the shore north of the Muster! Hold the line until it breaks.',
|
|
199
|
+
endPaid: "The goblins break and run for the lake. The Muster's horn sounds for you.",
|
|
200
|
+
endPlain: 'The goblin band breaks and runs for the lake.',
|
|
201
|
+
quiet: 'A goblin band is storming the shore, but they have no interest in someone so green. Keep to the camp.',
|
|
202
|
+
warn: 'The Muster horn sounds: a goblin band will storm the shore in a minute or so.',
|
|
203
|
+
drill: "Lieutenant Vale sounds the horn: a drill raid! Goblin raiders come up the bank. Hold the line, and nothing is paid for a drill.",
|
|
204
|
+
drillWait: 'The Lieutenant shakes his head: the last drill was not ten minutes ago. Give the camp a breather.',
|
|
205
|
+
drillActive: 'The line is already holding a raid. Go and fight it.',
|
|
206
|
+
};
|
|
207
|
+
export const GOBLIN_RAID_WARN_MS = 90_000;
|
|
208
|
+
const RAID_EPOCH_MS = Date.UTC(2026, 0, 1, 0, 0, 0);
|
|
209
|
+
/** The raid window `nowMs` is in or the next one: a pure function of the clock. */
|
|
210
|
+
export function goblinRaidWindow(nowMs) {
|
|
211
|
+
const rel = nowMs - RAID_EPOCH_MS - GOBLIN_RAID.offsetMs;
|
|
212
|
+
const slot = Math.floor(rel / GOBLIN_RAID.periodMs);
|
|
213
|
+
const startMs = RAID_EPOCH_MS + GOBLIN_RAID.offsetMs + slot * GOBLIN_RAID.periodMs;
|
|
214
|
+
const endMs = startMs + GOBLIN_RAID.durationMs;
|
|
215
|
+
return { slot, startMs, endMs, active: nowMs >= startMs && nowMs < endMs, nextStartMs: startMs + GOBLIN_RAID.periodMs };
|
|
216
|
+
}
|
|
217
|
+
/** The slot whose window is open or the NEXT one to open (the slot the warning belongs to). */
|
|
218
|
+
export function goblinRaidSlotAfter(nowMs) {
|
|
219
|
+
const w = goblinRaidWindow(nowMs);
|
|
220
|
+
return w.active ? w.slot : w.slot + 1;
|
|
221
|
+
}
|
|
222
|
+
// ---- The Warchief's Hold (a hill fort on the goblin side) -------------------------------------------------------------------------------
|
|
223
|
+
/** The hold: a ring of logs on the hilltop mesa (heights 6-7 at x 144-154, z 660-670), its gap on the south-west where the track comes up. */
|
|
224
|
+
export const WARCHIEF_HOLD = { minX: 142, maxX: 156, minZ: 658, maxZ: 672 };
|
|
225
|
+
export const WARCHIEF_HOLD_CENTRE = { x: 149, z: 665 };
|
|
226
|
+
/** The hold's ring wall: a square of logs round the mesa, with a three-wide gap at the south-west corner. */
|
|
227
|
+
export const WARCHIEF_HOLD_GAP = { minX: 142, maxX: 144, minZ: 670, maxZ: 672 };
|
|
228
|
+
/** The foot of the hill where the quest's reach step lands and the approach is signed. */
|
|
229
|
+
export const WARCHIEF_HOLD_FOOT = { minX: 134, maxX: 146, minZ: 674, maxZ: 682 };
|
|
230
|
+
export const WARCHIEF_HOLD_STANDS = { foot: { x: 140, z: 678 }, gate: { x: 143, z: 671 }, top: { x: 149, z: 665 } };
|
|
231
|
+
export const WARCHIEF_HOLD_PIECES = [
|
|
232
|
+
{ id: 'bf-hold-tent', kind: 'dreadprop', style: 'tent-face0', x: 147, z: 661 },
|
|
233
|
+
{ id: 'bf-hold-fire', kind: 'campfire', style: 'beach-pit', x: 149, z: 668, scale: 1 },
|
|
234
|
+
{ id: 'bf-hold-crates', kind: 'dreadmodel', style: 'hbcrates-s', x: 154, z: 660 },
|
|
235
|
+
{ id: 'bf-hold-barrel', kind: 'barrel', style: 'barrel', x: 145, z: 662, scale: 1 },
|
|
236
|
+
{ id: 'bf-hold-banner', kind: 'dreadprop', style: 'banner', x: 152, z: 669 },
|
|
237
|
+
];
|
|
238
|
+
export const WARCHIEF_KIND = 'goblinwarchief';
|
|
239
|
+
export const WARCHIEF_NAME = 'Warchief Skragg';
|
|
240
|
+
export const WARCHIEF = {
|
|
241
|
+
name: WARCHIEF_NAME,
|
|
242
|
+
level: [15, 15],
|
|
243
|
+
maxHit: 9,
|
|
244
|
+
healthFactor: 1.8,
|
|
245
|
+
respawnMs: 240_000,
|
|
246
|
+
aggro: 7,
|
|
247
|
+
leash: 14,
|
|
248
|
+
x: 150,
|
|
249
|
+
z: 664,
|
|
250
|
+
spawnLeash: 2,
|
|
251
|
+
text: 'Warchief Skragg slams his maul on the drum frame. "Little soldier come to die on my hill!"',
|
|
252
|
+
note: "The goblins' warchief, a head taller than his band, with a maul made from a wagon axle. He keeps a hill fort on the goblin side of the lake with four guards. Every fourth blow is a slam, announced a full turn ahead and twice an ordinary hit: step out of his reach before it lands and it misses.",
|
|
253
|
+
};
|
|
254
|
+
export function isBattlefieldHostileKind(kind) {
|
|
255
|
+
return kind === WARCHIEF_KIND;
|
|
256
|
+
}
|
|
257
|
+
/** The four guards: ordinary goblins (ids `bfh-`) inside the ring, who hold the hold. */
|
|
258
|
+
export const WARCHIEF_GUARD_ID_PREFIX = 'bfh-';
|
|
259
|
+
export const WARCHIEF_GUARDS = [
|
|
260
|
+
{ x: 146, z: 664 },
|
|
261
|
+
{ x: 152, z: 663 },
|
|
262
|
+
{ x: 148, z: 668 },
|
|
263
|
+
{ x: 153, z: 667 },
|
|
264
|
+
];
|
|
265
|
+
export function inWarchiefHold(x, z) {
|
|
266
|
+
const b = WARCHIEF_HOLD;
|
|
267
|
+
return x >= b.minX && x <= b.maxX && z >= b.minZ && z <= b.maxZ;
|
|
268
|
+
}
|
|
269
|
+
// ---- The Explorer's Ledger page --------------------------------------------------------------------------------------------------------
|
|
270
|
+
/** The Battlefield's lines (marked by the server, ids are the marks it writes; explorerLedger.ts section `field`). */
|
|
271
|
+
export const LEDGER_FIELD_LINES = [
|
|
272
|
+
{ id: 'field:scout', label: 'Counted the far bank from the lake posts' },
|
|
273
|
+
{ id: 'field:supply', label: 'Loaded the Muster supply wagon' },
|
|
274
|
+
{ id: 'field:span', label: 'Mended the old bridge across the lake' },
|
|
275
|
+
{ id: 'field:raid', label: 'Held the shore against a goblin raid' },
|
|
276
|
+
{ id: 'field:warchief-dodged', label: "Stepped clear of the Warchief's slam" },
|
|
277
|
+
];
|
|
278
|
+
// ---- Discovery zones -------------------------------------------------------------------------------------------------------------------
|
|
279
|
+
export const BATTLEFIELD_DISCOVERY_ZONES = [
|
|
280
|
+
{ id: 'captains-muster', label: BATTLEFIELD_MUSTER_NAME, coordinateFrame: 'world', ...MUSTER_BOX },
|
|
281
|
+
{ id: 'warchief-hold', label: WARCHIEF_HOLD_NAME, coordinateFrame: 'world', minX: WARCHIEF_HOLD.minX - 2, maxX: WARCHIEF_HOLD.maxX + 2, minZ: WARCHIEF_HOLD.minZ - 2, maxZ: WARCHIEF_HOLD.maxZ + 2 },
|
|
282
|
+
];
|
|
283
|
+
/** Where the quest helper and the guide say each place is. */
|
|
284
|
+
export const BATTLEFIELD_PLACE_TEXT = {
|
|
285
|
+
'captains-muster': "The Captain's Muster is the big soldier camp inside the palisade of the Battlefield, the only way onto the soldiers' shore: through the south gate from No Harm Farm, and out of the rear door to the lake. It has a cook, a Bounty Board, training dummies and the Lieutenant.",
|
|
286
|
+
'warchief-hold': "The Warchief's Hold is a hill fort of logs on the goblin side of the lake, north-east of the old bridge's north foot, on the highest ground for some way around.",
|
|
287
|
+
};
|
|
288
|
+
/** Standable tiles (teleport links, smokes). */
|
|
289
|
+
export const BATTLEFIELD_STANDS = {
|
|
290
|
+
muster: { x: 119, z: 784 },
|
|
291
|
+
gate: { x: 119, z: 791 },
|
|
292
|
+
cook: { x: 112, z: 781 },
|
|
293
|
+
board: { x: 123, z: 777 },
|
|
294
|
+
rearDoor: { x: 119, z: 767 },
|
|
295
|
+
dock: { x: 80, z: 746 },
|
|
296
|
+
bridgeSouth: { x: 91, z: 746 },
|
|
297
|
+
bridgeNorth: { x: 91, z: 709 },
|
|
298
|
+
northLanding: { x: 86, z: 709 },
|
|
299
|
+
hold: WARCHIEF_HOLD_STANDS,
|
|
300
|
+
};
|
|
301
|
+
//# sourceMappingURL=battlefieldMuster.js.map
|