@dreadwood-types/types 0.1.313 → 0.1.315
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/beaconNight.d.ts +268 -0
- package/dist/beaconNight.d.ts.map +1 -0
- package/dist/beaconNight.js +506 -0
- package/dist/beaconNight.js.map +1 -0
- package/dist/bounty.d.ts +1 -1
- package/dist/bounty.d.ts.map +1 -1
- package/dist/bounty.js +13 -1
- package/dist/bounty.js.map +1 -1
- package/dist/dailyHooks.d.ts.map +1 -1
- package/dist/dailyHooks.js +6 -0
- package/dist/dailyHooks.js.map +1 -1
- package/dist/explorerLedger.d.ts +7 -1
- package/dist/explorerLedger.d.ts.map +1 -1
- package/dist/explorerLedger.js +15 -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 +5 -0
- package/dist/quests.js.map +1 -1
- package/dist/skillQuests.js +1 -1
- package/dist/skillQuests.js.map +1 -1
- package/dist/storyQuests.d.ts +2 -1
- package/dist/storyQuests.d.ts.map +1 -1
- package/dist/storyQuests.js +4 -0
- package/dist/storyQuests.js.map +1 -1
- package/dist/wardensBounty.d.ts +41 -0
- package/dist/wardensBounty.d.ts.map +1 -0
- package/dist/wardensBounty.js +182 -0
- package/dist/wardensBounty.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,506 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BEACON NIGHT (coverage slice 10, track T105, 2026-10-14; levels 8-14): after dark the Old Watchtower's signal basin is lit for ten
|
|
3
|
+
* minutes at one of five places round the tower (three on the open lawn north of the Dreadwoods wall, two inside the woods' northern
|
|
4
|
+
* edge, where other players can attack and nobody heals), and the gang's night raiders come for it. Defenders keep the flame alive: they
|
|
5
|
+
* RELIGHT the basin (a click, a short cool-down) and cut down the raiders that crowd it. Raiders at the basin drain the flame; if it
|
|
6
|
+
* goes out the night is lost, if it still burns when the ten minutes end the night is held. A podium is named by contribution.
|
|
7
|
+
*
|
|
8
|
+
* Everything here is pure: the clock, the places, the flame, the scoring, the prizes, the chat lines and the saved state, so the
|
|
9
|
+
* server, a test and the login line agree. The clock is READ off the wall clock, never rolled or stored (the Passing Bay's pattern):
|
|
10
|
+
* four starts a day, at 01:50, 05:40, 19:50 and 23:40 UTC, picked so that no ring fight, lair awakening, Heartwood Hunt, Fishing Derby
|
|
11
|
+
* round or Redcap patrol window comes within ten minutes of one (the test checks 300 days of every clock). A restart, a deploy or a
|
|
12
|
+
* second server agree on the slot and the place without saving anything.
|
|
13
|
+
*
|
|
14
|
+
* The scoring is the Heartwood Hunt's collusion-safe one (heartwoodHunt.ts), built against farming (abuse-first):
|
|
15
|
+
* - only OWN actions score: a relight that really raised the flame, and a kill of this night's own raiders. A player kill, a death or a
|
|
16
|
+
* trade scores nothing, so an ambush at the basin takes points from nobody and a friend cannot be fed points;
|
|
17
|
+
* - each side is capped (12 relights, 10 raider kills); past the caps an action still helps the flame, which is the shared goal;
|
|
18
|
+
* - one place per ACCOUNT, a minimum score to be paid at all, a podium only when three different accounts qualified AND the beacon was
|
|
19
|
+
* held, and at most three paid nights per account per UTC day;
|
|
20
|
+
* - ties go to whoever reached the score first, then the character key, so the order is total;
|
|
21
|
+
* - prizes are Explorer XP, torches and arrows: no coins, nothing that outclasses the gated 41+ gear.
|
|
22
|
+
*
|
|
23
|
+
* Amounts are PLACEHOLDERS for the balance pass, done last with James. The raiders are the Old Watchtower gang's own kind (hijackers).
|
|
24
|
+
*/
|
|
25
|
+
const MINUTE = 60_000;
|
|
26
|
+
const HOUR = 60 * MINUTE;
|
|
27
|
+
const DAY = 24 * HOUR;
|
|
28
|
+
export const BEACON_NAME = 'Beacon Night';
|
|
29
|
+
// ---- the clock ----------------------------------------------------------------------------------------------------------
|
|
30
|
+
/** The four starts, in minutes after UTC midnight: 01:50, 05:40, 19:50 and 23:40 (night hours; the test checks them against every other clock). */
|
|
31
|
+
export const BEACON_START_MINUTES = [110, 340, 1190, 1420];
|
|
32
|
+
export const BEACON_PER_DAY = BEACON_START_MINUTES.length;
|
|
33
|
+
/** How long the basin burns and is defended. */
|
|
34
|
+
export const BEACON_ROUND_MS = 10 * MINUTE;
|
|
35
|
+
/** How long the result stays up after the round. */
|
|
36
|
+
export const BEACON_RESULTS_MS = 3 * MINUTE;
|
|
37
|
+
/** The warning before the round starts, and the warning before it ends. */
|
|
38
|
+
export const BEACON_SOON_MS = 10 * MINUTE;
|
|
39
|
+
export const BEACON_LAST_MS = 1 * MINUTE;
|
|
40
|
+
export const BEACON_STAGES = ['idle', 'soon', 'open', 'last', 'results'];
|
|
41
|
+
export function isBeaconStage(s) {
|
|
42
|
+
return typeof s === 'string' && BEACON_STAGES.includes(s);
|
|
43
|
+
}
|
|
44
|
+
/** The start of slot `slot` (slot = day * 4 + the start's index; any integer, negative included). */
|
|
45
|
+
export function beaconStartOf(slot) {
|
|
46
|
+
const day = Math.floor(slot / BEACON_PER_DAY);
|
|
47
|
+
const i = ((slot % BEACON_PER_DAY) + BEACON_PER_DAY) % BEACON_PER_DAY;
|
|
48
|
+
return day * DAY + BEACON_START_MINUTES[i] * MINUTE;
|
|
49
|
+
}
|
|
50
|
+
export function beaconEndOf(slot) {
|
|
51
|
+
return beaconStartOf(slot) + BEACON_ROUND_MS;
|
|
52
|
+
}
|
|
53
|
+
/** The slot of the latest start at or before `now`. */
|
|
54
|
+
function slotAtOrBefore(now) {
|
|
55
|
+
const day = Math.floor(now / DAY);
|
|
56
|
+
const into = now - day * DAY;
|
|
57
|
+
let n = 0;
|
|
58
|
+
for (const m of BEACON_START_MINUTES)
|
|
59
|
+
if (m * MINUTE <= into)
|
|
60
|
+
n++;
|
|
61
|
+
return day * BEACON_PER_DAY + n - 1;
|
|
62
|
+
}
|
|
63
|
+
export function beaconClockAt(now) {
|
|
64
|
+
const k = slotAtOrBefore(now);
|
|
65
|
+
const elapsed = now - beaconStartOf(k);
|
|
66
|
+
if (elapsed < BEACON_ROUND_MS) {
|
|
67
|
+
const msToEnd = BEACON_ROUND_MS - elapsed;
|
|
68
|
+
return { slot: k, stage: msToEnd <= BEACON_LAST_MS ? 'last' : 'open', msToStart: 0, msToEnd };
|
|
69
|
+
}
|
|
70
|
+
if (elapsed < BEACON_ROUND_MS + BEACON_RESULTS_MS)
|
|
71
|
+
return { slot: k, stage: 'results', msToStart: 0, msToEnd: 0 };
|
|
72
|
+
const next = k + 1;
|
|
73
|
+
const msToStart = beaconStartOf(next) - now;
|
|
74
|
+
return { slot: next, stage: msToStart <= BEACON_SOON_MS ? 'soon' : 'idle', msToStart, msToEnd: beaconEndOf(next) - now };
|
|
75
|
+
}
|
|
76
|
+
/** True while the basin burns and relights and raider kills count. */
|
|
77
|
+
export function beaconIsOpen(stage) {
|
|
78
|
+
return stage === 'open' || stage === 'last';
|
|
79
|
+
}
|
|
80
|
+
/** The next night to start strictly after `now` (for the login line). */
|
|
81
|
+
export function beaconNextRound(now) {
|
|
82
|
+
const k = slotAtOrBefore(now);
|
|
83
|
+
const slot = beaconStartOf(k) > now ? k : k + 1;
|
|
84
|
+
return { slot, startsAt: beaconStartOf(slot) };
|
|
85
|
+
}
|
|
86
|
+
/** The UTC day a time falls in (the daily paid-nights cap resets at midnight UTC). */
|
|
87
|
+
export function beaconDayOf(now) {
|
|
88
|
+
return Math.floor(now / DAY);
|
|
89
|
+
}
|
|
90
|
+
function span(ms) {
|
|
91
|
+
const mins = Math.max(1, Math.round(ms / MINUTE));
|
|
92
|
+
if (mins < 60)
|
|
93
|
+
return `${mins} minute${mins === 1 ? '' : 's'}`;
|
|
94
|
+
const h = Math.floor(mins / 60);
|
|
95
|
+
const m = mins % 60;
|
|
96
|
+
return m === 0 ? `${h} hour${h === 1 ? '' : 's'}` : `${h} h ${m} min`;
|
|
97
|
+
}
|
|
98
|
+
// ---- the places ---------------------------------------------------------------------------------------------------------
|
|
99
|
+
/**
|
|
100
|
+
* Where the basin can be lit (world tiles; the backend smoke pins each one standable with a standable ring round it, outside the Old
|
|
101
|
+
* Watchtower gang's camp (x 374-406, z 226-250) by at least twelve tiles). `woods` marks a place inside the Dreadwoods (PvP, no healing).
|
|
102
|
+
*/
|
|
103
|
+
export const BEACON_SITES = [
|
|
104
|
+
{ id: 'north-lawn', x: 392, z: 210, label: "the lawn north of the Old Watchtower", woods: false },
|
|
105
|
+
{ id: 'west-lawn', x: 350, z: 234, label: "the lawn west of the Old Watchtower", woods: false },
|
|
106
|
+
{ id: 'east-lawn', x: 434, z: 230, label: "the lawn east of the Old Watchtower", woods: false },
|
|
107
|
+
{ id: 'wall-east', x: 404, z: 290, label: "the woods' north edge, east of the old wall gate", woods: true },
|
|
108
|
+
{ id: 'wall-west', x: 336, z: 290, label: "the woods' north edge, in the ash west of the wall", woods: true },
|
|
109
|
+
];
|
|
110
|
+
/** The place of a night. Consecutive nights never share one (the step is 2 inside a block of five and 3 across a block edge). */
|
|
111
|
+
export function beaconSiteFor(slot) {
|
|
112
|
+
const n = BEACON_SITES.length;
|
|
113
|
+
const s = Math.floor(slot);
|
|
114
|
+
const idx = (((2 * s + Math.floor(s / n)) % n) + n) % n;
|
|
115
|
+
return BEACON_SITES[idx];
|
|
116
|
+
}
|
|
117
|
+
/** The basin: a quest prop (the old `beacon` model) the server places while a night is on and takes away after. */
|
|
118
|
+
export const BEACON_ID = 'bn-beacon';
|
|
119
|
+
export const BEACON_PROP = 'beacon';
|
|
120
|
+
export const BEACON_STYLE = `${BEACON_PROP}:night`;
|
|
121
|
+
export const BEACON_ENTITY_NAME = "The Watchtower's Signal Basin";
|
|
122
|
+
export const BEACON_IDLE_LINE = 'A great iron basin of pitch and driftwood. Lit on the right nights, it tells the road the Watchtower is held.';
|
|
123
|
+
// ---- the flame ----------------------------------------------------------------------------------------------------------
|
|
124
|
+
export const BEACON_FLAME = {
|
|
125
|
+
max: 100,
|
|
126
|
+
start: 60,
|
|
127
|
+
/** What one relight adds. */
|
|
128
|
+
relight: 6,
|
|
129
|
+
/** Flame lost per second for each raider standing within `atBasin` tiles of the basin. */
|
|
130
|
+
drainPerRaiderPerSec: 1.2,
|
|
131
|
+
/** The wind: flame lost per second with no raider at all. */
|
|
132
|
+
decayPerSec: 0.1,
|
|
133
|
+
atBasin: 2,
|
|
134
|
+
/** One relight per player this often (a click held down adds nothing). */
|
|
135
|
+
relightCooldownMs: 3_000,
|
|
136
|
+
/** A relight needs the player this close to the basin (the server's reach rules apply too). */
|
|
137
|
+
reach: 3,
|
|
138
|
+
};
|
|
139
|
+
/** The flame after `dtMs` with `raidersAtBasin` raiders on it, never below 0. Pure. */
|
|
140
|
+
export function beaconFlameAfter(flame, dtMs, raidersAtBasin) {
|
|
141
|
+
const secs = Math.max(0, dtMs) / 1000;
|
|
142
|
+
const loss = secs * (BEACON_FLAME.decayPerSec + BEACON_FLAME.drainPerRaiderPerSec * Math.max(0, raidersAtBasin));
|
|
143
|
+
return Math.max(0, Math.min(BEACON_FLAME.max, flame - loss));
|
|
144
|
+
}
|
|
145
|
+
/** The flame after one relight (capped). */
|
|
146
|
+
export function beaconFlameRelit(flame) {
|
|
147
|
+
return Math.min(BEACON_FLAME.max, flame + BEACON_FLAME.relight);
|
|
148
|
+
}
|
|
149
|
+
/** True when a player may relight now: the cool-down has run and the flame is not already full. */
|
|
150
|
+
export function beaconMayRelight(lastAtMs, now, flame) {
|
|
151
|
+
if (flame >= BEACON_FLAME.max)
|
|
152
|
+
return false;
|
|
153
|
+
return lastAtMs === undefined || now - lastAtMs >= BEACON_FLAME.relightCooldownMs;
|
|
154
|
+
}
|
|
155
|
+
// ---- the raiders --------------------------------------------------------------------------------------------------------
|
|
156
|
+
/**
|
|
157
|
+
* The night raiders: the Old Watchtower gang's own kind, sent in waves while the basin burns. Levels follow the defenders' average
|
|
158
|
+
* Combat, clamped; the count follows how many are at the basin. They aggro defenders in reach, and advance on the basin when nobody is
|
|
159
|
+
* in reach. PLACEHOLDERS.
|
|
160
|
+
*/
|
|
161
|
+
export const BEACON_RAIDERS = {
|
|
162
|
+
kind: 'hijacker',
|
|
163
|
+
idPrefix: 'bn-',
|
|
164
|
+
name: 'Night Raider',
|
|
165
|
+
firstWave: 3,
|
|
166
|
+
waveEveryMs: 30_000,
|
|
167
|
+
perExtraDefender: 1,
|
|
168
|
+
waveMax: 7,
|
|
169
|
+
aliveCap: 12,
|
|
170
|
+
/** Raiders come out of the dark this far from the basin. */
|
|
171
|
+
spawnMin: 10,
|
|
172
|
+
spawnMax: 13,
|
|
173
|
+
aggroRadius: 8,
|
|
174
|
+
leashRadius: 20,
|
|
175
|
+
minLevel: 10,
|
|
176
|
+
maxLevel: 14,
|
|
177
|
+
/** A defender is "at the basin" this close (a wave grows with them). */
|
|
178
|
+
nearBasin: 14,
|
|
179
|
+
/** A player under this Combat is not locked on to (they may still relight, which is the safe job). */
|
|
180
|
+
aggroCombat: 8,
|
|
181
|
+
aggroText: 'A night raider charges out of the dark at you!',
|
|
182
|
+
};
|
|
183
|
+
/** How many raiders a wave brings: the first wave is fixed; later ones grow with the defenders at the basin. */
|
|
184
|
+
export function beaconWaveSize(wave, defenders) {
|
|
185
|
+
if (wave <= 0)
|
|
186
|
+
return BEACON_RAIDERS.firstWave;
|
|
187
|
+
return Math.min(BEACON_RAIDERS.waveMax, BEACON_RAIDERS.firstWave + Math.max(0, defenders - 1) * BEACON_RAIDERS.perExtraDefender);
|
|
188
|
+
}
|
|
189
|
+
/** The raiders' level for a party's average Combat. */
|
|
190
|
+
export function beaconRaiderLevel(avgCombat) {
|
|
191
|
+
return Math.max(BEACON_RAIDERS.minLevel, Math.min(BEACON_RAIDERS.maxLevel, Math.round(avgCombat)));
|
|
192
|
+
}
|
|
193
|
+
// ---- the scoring --------------------------------------------------------------------------------------------------------
|
|
194
|
+
export const BEACON_LIGHT_POINTS = 2;
|
|
195
|
+
export const BEACON_KILL_POINTS = 3;
|
|
196
|
+
/** Past these a relight or a kill still helps (the flame still burns) but scores nothing more. */
|
|
197
|
+
export const BEACON_LIGHT_CAP = 12;
|
|
198
|
+
export const BEACON_KILL_CAP = 10;
|
|
199
|
+
/** The least score that counts as having taken part (3 relights, or 2 raiders). Below it: no prize, no mark. */
|
|
200
|
+
export const BEACON_MIN_SCORE = 6;
|
|
201
|
+
/** Podium prizes need at least this many different accounts above the minimum, and the beacon held. */
|
|
202
|
+
export const BEACON_MIN_DEFENDERS = 3;
|
|
203
|
+
/** Paid nights per account per UTC day (alts and shared accounts cannot farm every night of the day). */
|
|
204
|
+
export const BEACON_DAILY_PAID_NIGHTS = 3;
|
|
205
|
+
/** A raider kill counts only for a player this close to the basin (a raider kited across the lawn scores nothing). */
|
|
206
|
+
export const BEACON_KILL_REACH = 24;
|
|
207
|
+
export function beaconScore(lights, kills) {
|
|
208
|
+
return Math.min(Math.max(0, lights), BEACON_LIGHT_CAP) * BEACON_LIGHT_POINTS + Math.min(Math.max(0, kills), BEACON_KILL_CAP) * BEACON_KILL_POINTS;
|
|
209
|
+
}
|
|
210
|
+
export function beaconEntryScore(e) {
|
|
211
|
+
return beaconScore(e.lights, e.kills);
|
|
212
|
+
}
|
|
213
|
+
function baseEntry(entry, who, at) {
|
|
214
|
+
return entry ?? { key: who.key, account: who.account, name: who.name, lights: 0, kills: 0, at };
|
|
215
|
+
}
|
|
216
|
+
/** One relight by this character. Returns a new entry (the old is untouched). */
|
|
217
|
+
export function beaconWithLight(entry, who, at) {
|
|
218
|
+
const base = baseEntry(entry, who, at);
|
|
219
|
+
const next = { ...base, name: who.name, lights: base.lights + 1 };
|
|
220
|
+
return { ...next, at: beaconEntryScore(next) > beaconEntryScore(base) ? at : base.at };
|
|
221
|
+
}
|
|
222
|
+
/** One raider kill by this character. */
|
|
223
|
+
export function beaconWithKill(entry, who, at) {
|
|
224
|
+
const base = baseEntry(entry, who, at);
|
|
225
|
+
const next = { ...base, name: who.name, kills: base.kills + 1 };
|
|
226
|
+
return { ...next, at: beaconEntryScore(next) > beaconEntryScore(base) ? at : base.at };
|
|
227
|
+
}
|
|
228
|
+
export function beaconQualifies(e) {
|
|
229
|
+
return beaconEntryScore(e) >= BEACON_MIN_SCORE;
|
|
230
|
+
}
|
|
231
|
+
function accountOf(e) {
|
|
232
|
+
return e.account || `key:${e.key}`;
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* The ranking: higher score first, then whoever reached it first, then the key (a total order a test can pin). One place per ACCOUNT:
|
|
236
|
+
* of an account's characters only the best-placed one is listed. Entries below the minimum score are not ranked.
|
|
237
|
+
*/
|
|
238
|
+
export function beaconRanking(entries) {
|
|
239
|
+
const sorted = entries
|
|
240
|
+
.filter(beaconQualifies)
|
|
241
|
+
.sort((a, b) => {
|
|
242
|
+
const sa = beaconEntryScore(a);
|
|
243
|
+
const sb = beaconEntryScore(b);
|
|
244
|
+
if (sb !== sa)
|
|
245
|
+
return sb - sa;
|
|
246
|
+
if (a.at !== b.at)
|
|
247
|
+
return a.at - b.at;
|
|
248
|
+
return a.key < b.key ? -1 : a.key > b.key ? 1 : 0;
|
|
249
|
+
});
|
|
250
|
+
const seen = new Set();
|
|
251
|
+
const out = [];
|
|
252
|
+
for (const e of sorted) {
|
|
253
|
+
const acc = accountOf(e);
|
|
254
|
+
if (seen.has(acc))
|
|
255
|
+
continue;
|
|
256
|
+
seen.add(acc);
|
|
257
|
+
out.push(e);
|
|
258
|
+
}
|
|
259
|
+
return out;
|
|
260
|
+
}
|
|
261
|
+
/** The 1-based place of a character in the ranking (ranked entries only), or 0. */
|
|
262
|
+
export function beaconPlaceOf(entries, key) {
|
|
263
|
+
const i = beaconRanking(entries).findIndex((e) => e.key === key);
|
|
264
|
+
return i < 0 ? 0 : i + 1;
|
|
265
|
+
}
|
|
266
|
+
const RIBBONS = ['red', 'blue', 'bronze'];
|
|
267
|
+
export const BEACON_RIBBON_LABEL = { red: 'Red Ribbon', blue: 'Blue Ribbon', bronze: 'Bronze Ribbon' };
|
|
268
|
+
/** PLACEHOLDER prizes by place (held night only): Explorer XP and birch arrows on top of the participation prize. */
|
|
269
|
+
export const BEACON_PODIUM_PRIZES = [
|
|
270
|
+
{ explorerXp: 100, arrows: 15 },
|
|
271
|
+
{ explorerXp: 70, arrows: 10 },
|
|
272
|
+
{ explorerXp: 40, arrows: 5 },
|
|
273
|
+
];
|
|
274
|
+
/** Everyone paid who qualified. A beacon that went out halves the XP and gives no torches. */
|
|
275
|
+
export const BEACON_PARTICIPATION = { explorerXp: 25, torches: 2 };
|
|
276
|
+
export const BEACON_TORCH_KIND = 'unlitbirchtorch';
|
|
277
|
+
export const BEACON_ARROW_KIND = 'bircharrow';
|
|
278
|
+
/** Ledger marks (types explorerLedger.ts `beacon` page) a result can write. */
|
|
279
|
+
export const BEACON_MARK_ENTERED = 'beacon:entered';
|
|
280
|
+
export const BEACON_MARK_HELD = 'beacon:held';
|
|
281
|
+
export const BEACON_MARK_LIGHT = 'beacon:lit';
|
|
282
|
+
export const BEACON_MARK_GUARD = 'beacon:guard';
|
|
283
|
+
export const BEACON_MARK_RIBBON = { red: 'beacon:red', blue: 'beacon:blue', bronze: 'beacon:bronze' };
|
|
284
|
+
/** Paid nights this account has had on this UTC day. */
|
|
285
|
+
export function beaconPaidToday(paid, account, day) {
|
|
286
|
+
const p = paid[account];
|
|
287
|
+
return p && p.day === day ? p.n : 0;
|
|
288
|
+
}
|
|
289
|
+
/** The record after one more paid night for these accounts (old days dropped). Returns a new object. */
|
|
290
|
+
export function beaconWithPaid(paid, accounts, day) {
|
|
291
|
+
const next = {};
|
|
292
|
+
for (const [acc, p] of Object.entries(paid))
|
|
293
|
+
if (p.day === day)
|
|
294
|
+
next[acc] = p;
|
|
295
|
+
for (const acc of accounts)
|
|
296
|
+
next[acc] = { day, n: beaconPaidToday(next, acc, day) + 1 };
|
|
297
|
+
return next;
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Everything a finished night pays, by character key. One prize per account (the ranking lists an account once). An account that has
|
|
301
|
+
* had its paid nights today is skipped (the podium moves up to the next account). Pure, so a restart that finalises a night late pays
|
|
302
|
+
* exactly what the clock-time finalise would have.
|
|
303
|
+
*/
|
|
304
|
+
export function beaconPrizes(entries, input) {
|
|
305
|
+
const out = new Map();
|
|
306
|
+
const ranked = beaconRanking(entries);
|
|
307
|
+
if (ranked.length === 0)
|
|
308
|
+
return out;
|
|
309
|
+
const eligible = ranked.filter((e) => beaconPaidToday(input.paid, accountOf(e), input.day) < BEACON_DAILY_PAID_NIGHTS);
|
|
310
|
+
const podium = input.held && ranked.length >= BEACON_MIN_DEFENDERS;
|
|
311
|
+
const half = input.held ? 1 : 0.5;
|
|
312
|
+
for (const e of eligible) {
|
|
313
|
+
const prize = {
|
|
314
|
+
explorerXp: Math.floor(BEACON_PARTICIPATION.explorerXp * half),
|
|
315
|
+
items: input.held ? [{ kind: BEACON_TORCH_KIND, qty: BEACON_PARTICIPATION.torches }] : [],
|
|
316
|
+
marks: [BEACON_MARK_ENTERED],
|
|
317
|
+
text: '',
|
|
318
|
+
};
|
|
319
|
+
if (input.held)
|
|
320
|
+
prize.marks.push(BEACON_MARK_HELD);
|
|
321
|
+
if (e.lights >= BEACON_LIGHT_CAP)
|
|
322
|
+
prize.marks.push(BEACON_MARK_LIGHT);
|
|
323
|
+
if (e.kills >= BEACON_KILL_CAP)
|
|
324
|
+
prize.marks.push(BEACON_MARK_GUARD);
|
|
325
|
+
out.set(e.key, prize);
|
|
326
|
+
}
|
|
327
|
+
const notes = new Map();
|
|
328
|
+
if (podium) {
|
|
329
|
+
for (let i = 0; i < Math.min(3, eligible.length); i++) {
|
|
330
|
+
const e = eligible[i];
|
|
331
|
+
const prize = out.get(e.key);
|
|
332
|
+
const row = BEACON_PODIUM_PRIZES[i];
|
|
333
|
+
prize.explorerXp += row.explorerXp;
|
|
334
|
+
prize.items.push({ kind: BEACON_ARROW_KIND, qty: row.arrows });
|
|
335
|
+
prize.marks.push(BEACON_MARK_RIBBON[RIBBONS[i]]);
|
|
336
|
+
notes.set(e.key, `${BEACON_RIBBON_LABEL[RIBBONS[i]]} for ${i === 0 ? '1st' : i === 1 ? '2nd' : '3rd'} place`);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
for (const [key, prize] of out) {
|
|
340
|
+
const e = eligible.find((x) => x.key === key);
|
|
341
|
+
const base = notes.get(key) ?? (input.held ? 'the beacon held' : 'thanks for trying');
|
|
342
|
+
prize.text = `Beacon Night: ${base} (${e.lights} relight${e.lights === 1 ? '' : 's'}, ${e.kills} raider${e.kills === 1 ? '' : 's'} put down, score ${beaconEntryScore(e)}). +${prize.explorerXp} Explorer XP.`;
|
|
343
|
+
}
|
|
344
|
+
return out;
|
|
345
|
+
}
|
|
346
|
+
/** The world chat line for a finished night. */
|
|
347
|
+
export function beaconResultLine(entries, held) {
|
|
348
|
+
const ranked = beaconRanking(entries);
|
|
349
|
+
const lead = held ? 'The signal basin still burns: the Watchtower holds the night!' : 'The signal basin has gone out. The night raiders have the lawn.';
|
|
350
|
+
if (ranked.length === 0)
|
|
351
|
+
return `${lead} Nobody scored enough to be named.`;
|
|
352
|
+
const top = ranked[0];
|
|
353
|
+
const podium = !held ? ' (no ribbons for a beacon that went out)' : ranked.length < BEACON_MIN_DEFENDERS ? ` (it takes ${BEACON_MIN_DEFENDERS} defenders to hand out ribbons)` : '';
|
|
354
|
+
return `${lead} Top defender: ${top.name}, score ${beaconEntryScore(top)}${ranked[1] ? `; then ${ranked[1].name}${ranked[2] ? ` and ${ranked[2].name}` : ''}` : ''}.${podium}`;
|
|
355
|
+
}
|
|
356
|
+
// ---- the telling --------------------------------------------------------------------------------------------------------
|
|
357
|
+
/** The world chat line for a stage (idle and results have none: the results line is built from the standings). */
|
|
358
|
+
export function beaconChatLine(stage, slot) {
|
|
359
|
+
const site = beaconSiteFor(slot);
|
|
360
|
+
const pvp = site.woods ? ' It is PvP ground there.' : '';
|
|
361
|
+
switch (stage) {
|
|
362
|
+
case 'soon':
|
|
363
|
+
return `World event: Beacon Night starts in ${span(BEACON_SOON_MS)}. The Old Watchtower's signal basin will be lit at ${site.label}; night raiders will come for it. Hold it for ${span(BEACON_ROUND_MS)}.${pvp}`;
|
|
364
|
+
case 'open':
|
|
365
|
+
return `World event: the signal basin is LIT at ${site.label}! ${span(BEACON_ROUND_MS)}: keep it burning (click it to relight) and cut down the night raiders. Relights and raiders score.${pvp}`;
|
|
366
|
+
case 'last':
|
|
367
|
+
return `World event: ${span(BEACON_LAST_MS)} left of Beacon Night.`;
|
|
368
|
+
default:
|
|
369
|
+
return null;
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
/** The login line's piece about Beacon Night. */
|
|
373
|
+
export function beaconTodayText(now) {
|
|
374
|
+
const c = beaconClockAt(now);
|
|
375
|
+
if (beaconIsOpen(c.stage))
|
|
376
|
+
return `Beacon Night is on now at the Old Watchtower (${span(c.msToEnd)} left)`;
|
|
377
|
+
const next = beaconNextRound(now);
|
|
378
|
+
return `Beacon Night lights the Old Watchtower's basin in ${span(next.startsAt - now)}`;
|
|
379
|
+
}
|
|
380
|
+
/** What /beacon tells a player. */
|
|
381
|
+
export function beaconStatusLines(clock, entries, myKey, flame, now) {
|
|
382
|
+
const lines = [];
|
|
383
|
+
if (beaconIsOpen(clock.stage)) {
|
|
384
|
+
lines.push(`Beacon Night is ON at ${beaconSiteFor(clock.slot).label}: ${span(clock.msToEnd)} left. The flame stands at ${Math.round(flame)} of ${BEACON_FLAME.max}.`);
|
|
385
|
+
}
|
|
386
|
+
else if (clock.stage === 'results') {
|
|
387
|
+
lines.push('Beacon Night has ended; the results are in.');
|
|
388
|
+
}
|
|
389
|
+
else {
|
|
390
|
+
const next = beaconNextRound(now);
|
|
391
|
+
lines.push(`Next Beacon Night: in ${span(next.startsAt - now)}, at ${beaconSiteFor(next.slot).label}.`);
|
|
392
|
+
}
|
|
393
|
+
if (beaconIsOpen(clock.stage) || clock.stage === 'results') {
|
|
394
|
+
const ranked = beaconRanking(entries);
|
|
395
|
+
if (ranked.length === 0)
|
|
396
|
+
lines.push(`Nobody has scored enough to be ranked yet (${BEACON_MIN_SCORE} points: 3 relights or 2 raiders).`);
|
|
397
|
+
else
|
|
398
|
+
lines.push(`Top defenders: ${ranked.slice(0, 3).map((e, i) => `${i + 1}. ${e.name} ${beaconEntryScore(e)}`).join(', ')}`);
|
|
399
|
+
if (myKey) {
|
|
400
|
+
const mine = entries.find((e) => e.key === myKey);
|
|
401
|
+
if (mine)
|
|
402
|
+
lines.push(`You: ${mine.lights} relight${mine.lights === 1 ? '' : 's'}, ${mine.kills} raider${mine.kills === 1 ? '' : 's'}, score ${beaconEntryScore(mine)}${beaconQualifies(mine) ? '' : ` (${BEACON_MIN_SCORE} to be ranked)`}.`);
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
return lines;
|
|
406
|
+
}
|
|
407
|
+
export function emptyBeaconSave() {
|
|
408
|
+
return { v: 1, slot: -1, announced: null, finalized: true, flame: BEACON_FLAME.start, outcome: 'none', waves: 0, entries: [], pending: {}, paid: {} };
|
|
409
|
+
}
|
|
410
|
+
/** At most this many prizes wait for one character, and entries are never more than this many. */
|
|
411
|
+
export const BEACON_PENDING_MAX = 5;
|
|
412
|
+
export const BEACON_MAX_ENTRIES = 1000;
|
|
413
|
+
function num(x, min, max) {
|
|
414
|
+
return typeof x === 'number' && Number.isFinite(x) && x >= min && x <= max ? x : null;
|
|
415
|
+
}
|
|
416
|
+
function parseEntry(raw) {
|
|
417
|
+
if (!raw || typeof raw !== 'object')
|
|
418
|
+
return null;
|
|
419
|
+
const r = raw;
|
|
420
|
+
const lights = num(r.lights, 0, 100_000);
|
|
421
|
+
const kills = num(r.kills, 0, 100_000);
|
|
422
|
+
const at = num(r.at, 0, 1e15);
|
|
423
|
+
if (typeof r.key !== 'string' || r.key.length === 0 || r.key.length > 80 || lights === null || kills === null || at === null)
|
|
424
|
+
return null;
|
|
425
|
+
return {
|
|
426
|
+
key: r.key,
|
|
427
|
+
account: typeof r.account === 'string' ? r.account.slice(0, 80) : '',
|
|
428
|
+
name: typeof r.name === 'string' ? r.name.slice(0, 40) : 'Defender',
|
|
429
|
+
lights: Math.floor(lights),
|
|
430
|
+
kills: Math.floor(kills),
|
|
431
|
+
at,
|
|
432
|
+
};
|
|
433
|
+
}
|
|
434
|
+
function parsePrize(raw) {
|
|
435
|
+
if (!raw || typeof raw !== 'object')
|
|
436
|
+
return null;
|
|
437
|
+
const r = raw;
|
|
438
|
+
const explorerXp = num(r.explorerXp, 0, 100_000);
|
|
439
|
+
if (explorerXp === null || typeof r.text !== 'string')
|
|
440
|
+
return null;
|
|
441
|
+
const items = [];
|
|
442
|
+
if (Array.isArray(r.items)) {
|
|
443
|
+
for (const it of r.items.slice(0, 8)) {
|
|
444
|
+
if (it && typeof it === 'object' && typeof it.kind === 'string' && num(it.qty, 1, 1000) !== null) {
|
|
445
|
+
items.push({ kind: it.kind.slice(0, 60), qty: Math.floor(it.qty) });
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
const marks = Array.isArray(r.marks) ? r.marks.filter((m) => typeof m === 'string' && m.startsWith('beacon:')).slice(0, 12) : [];
|
|
450
|
+
return { explorerXp: Math.floor(explorerXp), items, marks, text: r.text.slice(0, 300) };
|
|
451
|
+
}
|
|
452
|
+
/** A saved state, checked field by field (it comes from the database); anything wrong gives the empty state. */
|
|
453
|
+
export function parseBeaconSave(raw) {
|
|
454
|
+
if (!raw || typeof raw !== 'object')
|
|
455
|
+
return emptyBeaconSave();
|
|
456
|
+
const r = raw;
|
|
457
|
+
if (r.v !== 1)
|
|
458
|
+
return emptyBeaconSave();
|
|
459
|
+
const slot = num(r.slot, -1e9, 1e9);
|
|
460
|
+
const entries = Array.isArray(r.entries) ? r.entries.slice(0, 2000).map(parseEntry).filter((e) => e !== null) : [];
|
|
461
|
+
const seen = new Set();
|
|
462
|
+
const unique = entries.filter((e) => (seen.has(e.key) ? false : (seen.add(e.key), true)));
|
|
463
|
+
let announced = null;
|
|
464
|
+
const a = r.announced;
|
|
465
|
+
if (a && typeof a === 'object' && num(a.slot, -1e9, 1e9) !== null && isBeaconStage(a.stage))
|
|
466
|
+
announced = { slot: Math.floor(a.slot), stage: a.stage };
|
|
467
|
+
const pending = {};
|
|
468
|
+
if (r.pending && typeof r.pending === 'object') {
|
|
469
|
+
for (const [key, list] of Object.entries(r.pending).slice(0, 5000)) {
|
|
470
|
+
if (!Array.isArray(list))
|
|
471
|
+
continue;
|
|
472
|
+
const prizes = list.map(parsePrize).filter((p) => p !== null).slice(-BEACON_PENDING_MAX);
|
|
473
|
+
if (prizes.length > 0)
|
|
474
|
+
pending[key] = prizes;
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
const paid = {};
|
|
478
|
+
if (r.paid && typeof r.paid === 'object') {
|
|
479
|
+
for (const [acc, raw2] of Object.entries(r.paid).slice(0, 5000)) {
|
|
480
|
+
const p = raw2;
|
|
481
|
+
if (!p || typeof p !== 'object')
|
|
482
|
+
continue;
|
|
483
|
+
const day = num(p.day, 0, 1e7);
|
|
484
|
+
const n = num(p.n, 0, 1000);
|
|
485
|
+
if (day === null || n === null)
|
|
486
|
+
continue;
|
|
487
|
+
paid[acc.slice(0, 80)] = { day: Math.floor(day), n: Math.floor(n) };
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
const flame = num(r.flame, 0, BEACON_FLAME.max);
|
|
491
|
+
const waves = num(r.waves, 0, 100_000);
|
|
492
|
+
const outcome = r.outcome === 'held' || r.outcome === 'out' ? r.outcome : 'none';
|
|
493
|
+
return {
|
|
494
|
+
v: 1,
|
|
495
|
+
slot: slot === null ? -1 : Math.floor(slot),
|
|
496
|
+
announced,
|
|
497
|
+
finalized: r.finalized === true,
|
|
498
|
+
flame: flame === null ? BEACON_FLAME.start : flame,
|
|
499
|
+
outcome,
|
|
500
|
+
waves: waves === null ? 0 : Math.floor(waves),
|
|
501
|
+
entries: unique,
|
|
502
|
+
pending,
|
|
503
|
+
paid,
|
|
504
|
+
};
|
|
505
|
+
}
|
|
506
|
+
//# sourceMappingURL=beaconNight.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"beaconNight.js","sourceRoot":"","sources":["../src/beaconNight.ts"],"names":[],"mappings":"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"}
|
package/dist/bounty.d.ts
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
*/
|
|
12
12
|
import type { NpcKind } from './constants.js';
|
|
13
13
|
/** Bounty targets - all reuse an existing NpcKind. */
|
|
14
|
-
export type BountyTargetKind = 'seagull' | 'crab' | 'rabbit' | 'fox' | 'hijacker' | 'soldier' | 'goblin' | 'amazon' | 'redcap' | 'redcaparcher' | 'blackwakedeckhand' | 'cutthroat' | 'drowneddeckhand' | 'gravehound' | 'mosswolf' | 'mammoth' | 'mammothbull' | 'polarbear' | 'ironjawogre' | 'mireleech' | 'blacktom';
|
|
14
|
+
export type BountyTargetKind = 'seagull' | 'crab' | 'rabbit' | 'fox' | 'hijacker' | 'soldier' | 'goblin' | 'amazon' | 'redcap' | 'redcaparcher' | 'blackwakedeckhand' | 'cutthroat' | 'drowneddeckhand' | 'gravehound' | 'mosswolf' | 'mammoth' | 'mammothbull' | 'polarbear' | 'ironjawogre' | 'mireleech' | 'blacktom' | 'galecrow' | 'chalkburrower' | 'chasmprowler' | 'wasteraider';
|
|
15
15
|
/** Compile-time check: every bounty target is a real NpcKind (a typo or a retired kind fails the build). */
|
|
16
16
|
type BountyTargetsAreNpcKinds = BountyTargetKind extends NpcKind ? true : never;
|
|
17
17
|
export declare const BOUNTY_TARGETS_ARE_NPC_KINDS: BountyTargetsAreNpcKinds;
|
package/dist/bounty.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bounty.d.ts","sourceRoot":"","sources":["../src/bounty.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAE9C,sDAAsD;AACtD,MAAM,MAAM,gBAAgB,GACxB,SAAS,GACT,MAAM,GACN,QAAQ,GACR,KAAK,GACL,UAAU,GACV,SAAS,GACT,QAAQ,GACR,QAAQ,GAER,QAAQ,GACR,cAAc,GACd,mBAAmB,GACnB,WAAW,GACX,iBAAiB,GACjB,YAAY,GACZ,UAAU,GACV,SAAS,GACT,aAAa,GACb,WAAW,GACX,aAAa,GAEb,WAAW,GAEX,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"bounty.d.ts","sourceRoot":"","sources":["../src/bounty.ts"],"names":[],"mappings":"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"}
|
package/dist/bounty.js
CHANGED
|
@@ -15,7 +15,7 @@ export const BOUNTY_TARGETS_ARE_NPC_KINDS = true;
|
|
|
15
15
|
* A tier never offers one as its only choice: a player who avoids PvP always has an open-country contract too.
|
|
16
16
|
* The guide and the board label these so nobody takes one by surprise.
|
|
17
17
|
*/
|
|
18
|
-
export const BOUNTY_PVP_TARGETS = ['gravehound', 'mosswolf', 'ironjawogre', 'mireleech'];
|
|
18
|
+
export const BOUNTY_PVP_TARGETS = ['gravehound', 'mosswolf', 'ironjawogre', 'mireleech', 'chasmprowler', 'wasteraider'];
|
|
19
19
|
/**
|
|
20
20
|
* Targets that are a single named boss (not a herd): their contract asks for fewer kills than the 5-50 of a band's ordinary quarry,
|
|
21
21
|
* because the boss returns only every eight to ten minutes (northWilds.ts MAMMOTH_BULL_RESPAWN_MS).
|
|
@@ -103,6 +103,8 @@ export const BOUNTY_TIERS_20_TO_40_PROVISIONAL = [
|
|
|
103
103
|
{ target: 'redcap', count: 20, rewardLevel: 17 },
|
|
104
104
|
{ target: 'blackwakedeckhand', count: 25, rewardLevel: 15 },
|
|
105
105
|
{ target: 'goblin', count: 50, rewardLevel: 12 },
|
|
106
|
+
// T103 (2026-10-14): Windward Signal Field's gale crows (level 18-22, nine spots), the board in the keeper's yard.
|
|
107
|
+
{ target: 'galecrow', count: 8, rewardLevel: 20 },
|
|
106
108
|
],
|
|
107
109
|
},
|
|
108
110
|
{
|
|
@@ -111,6 +113,8 @@ export const BOUNTY_TIERS_20_TO_40_PROVISIONAL = [
|
|
|
111
113
|
{ target: 'cutthroat', count: 15, rewardLevel: 20 },
|
|
112
114
|
{ target: 'redcaparcher', count: 12, rewardLevel: 19 },
|
|
113
115
|
{ target: 'redcap', count: 30, rewardLevel: 17 },
|
|
116
|
+
// T103: Chalkshell Scarp's burrowers (level 22-27, twelve spots) north of Windward.
|
|
117
|
+
{ target: 'chalkburrower', count: 10, rewardLevel: 24 },
|
|
114
118
|
],
|
|
115
119
|
},
|
|
116
120
|
{
|
|
@@ -131,6 +135,8 @@ export const BOUNTY_TIERS_20_TO_40_PROVISIONAL = [
|
|
|
131
135
|
{ target: 'redcaparcher', count: 20, rewardLevel: 19 },
|
|
132
136
|
{ target: 'drowneddeckhand', count: 20, rewardLevel: 22 },
|
|
133
137
|
{ target: 'mosswolf', count: 15, rewardLevel: 24 },
|
|
138
|
+
// T103: the Red Waste's chasm prowlers (level 27-29; a PvP target like the moss wolves, never a tier's only choice).
|
|
139
|
+
{ target: 'chasmprowler', count: 10, rewardLevel: 28 },
|
|
134
140
|
],
|
|
135
141
|
},
|
|
136
142
|
{
|
|
@@ -139,6 +145,8 @@ export const BOUNTY_TIERS_20_TO_40_PROVISIONAL = [
|
|
|
139
145
|
{ target: 'cutthroat', count: 40, rewardLevel: 20 },
|
|
140
146
|
{ target: 'drowneddeckhand', count: 25, rewardLevel: 22 },
|
|
141
147
|
{ target: 'gravehound', count: 25, rewardLevel: 22 },
|
|
148
|
+
// T103: the Red Waste's raiders (level 29-31, PvP).
|
|
149
|
+
{ target: 'wasteraider', count: 10, rewardLevel: 30 },
|
|
142
150
|
],
|
|
143
151
|
},
|
|
144
152
|
{
|
|
@@ -250,6 +258,10 @@ export const BOUNTY_TARGET_NAME = {
|
|
|
250
258
|
ironjawogre: 'Ironjaw ogres',
|
|
251
259
|
mireleech: 'Mire leeches',
|
|
252
260
|
blacktom: 'Black Tom Harrow',
|
|
261
|
+
galecrow: 'gale crows',
|
|
262
|
+
chalkburrower: 'chalk burrowers',
|
|
263
|
+
chasmprowler: 'chasm prowlers',
|
|
264
|
+
wasteraider: 'Waste Raiders',
|
|
253
265
|
};
|
|
254
266
|
export function bountyTargetDisplayName(target) {
|
|
255
267
|
return BOUNTY_TARGET_NAME[target] ?? target;
|