@dreadwood-types/types 0.1.317 → 0.1.318
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/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 +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/timberConvoy.d.ts +282 -0
- package/dist/timberConvoy.d.ts.map +1 -0
- package/dist/timberConvoy.js +547 -0
- package/dist/timberConvoy.js.map +1 -0
- package/package.json +43 -43
|
@@ -0,0 +1,547 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THE TIMBER CONVOY (coverage slice 11, track T123, 2026-10-15; levels 21-30, a Dreadwoods woods feature): six times a day, in daylight, the
|
|
3
|
+
* forester's crew rolls a loaded timber wagon out of the camp (a PvP-off pocket at the Rotwood Grove's southern edge) and walks it down the
|
|
4
|
+
* woods to the Gallowmere road head. It takes eight minutes. The wagon is an NPC, not a prize: nobody can rob it. Players may ESCORT it, and
|
|
5
|
+
* the woods' wolves come for it as it goes, so an escort that stays close and cuts the wolves down is what gets it there whole.
|
|
6
|
+
*
|
|
7
|
+
* Everything here is pure: the clock, the route, the wagon's tile and health, the scoring, the prizes, the chat lines and the saved state, so
|
|
8
|
+
* the server, a test and the login line agree. It is the Beacon Night pattern (beaconNight.ts) and the Heartwood Hunt's collusion-safe scoring
|
|
9
|
+
* (heartwoodHunt.ts), with the Redcap patrol's clock-read timing (tollRoad.ts):
|
|
10
|
+
* - the clock is READ off the wall clock, never rolled or stored: six starts a day at 04:17, 07:17, 10:17, 13:17, 16:17 and 19:17 UTC, picked so
|
|
11
|
+
* that no ring fight, lair awakening, Heartwood Hunt, Fishing Derby round, Redcap patrol or Beacon Night comes close (the test checks 300
|
|
12
|
+
* days of every clock). The wagon's tile is a pure function of the clock along the route, so a restart, a deploy or a second server agree
|
|
13
|
+
* on where it is without saving anything;
|
|
14
|
+
* - only OWN actions score: time spent within reach of the wagon (small, capped, and on its own never enough to be paid) and kills of this
|
|
15
|
+
* convoy's own wolves (the `tc-` ids) made near the wagon. A player kill, a death or a trade scores nothing, so ambushing an escort in the
|
|
16
|
+
* PvP woods takes points from nobody and a friend cannot be fed points;
|
|
17
|
+
* - one place per ACCOUNT, a minimum score to be paid at all, a podium only when the wagon ARRIVED and three different accounts qualified,
|
|
18
|
+
* and at most four paid convoys per account per UTC day;
|
|
19
|
+
* - ties go to whoever reached the score first, then the character key, so the order is total;
|
|
20
|
+
* - prizes are Woodwork and Explorer XP and alder and ash logs: no coins, nothing that outclasses the gated 41+ gear. Escorts are paid at
|
|
21
|
+
* arrival (a wagon that is wrecked pays half the XP and no logs; a void convoy pays nothing).
|
|
22
|
+
*
|
|
23
|
+
* Amounts are PLACEHOLDERS for the balance pass, done last with James. The wolves are the Heartwood brood's own kind (mosswolf).
|
|
24
|
+
*/
|
|
25
|
+
const MINUTE = 60_000;
|
|
26
|
+
const HOUR = 60 * MINUTE;
|
|
27
|
+
const DAY = 24 * HOUR;
|
|
28
|
+
export const CONVOY_NAME = 'Timber Convoy';
|
|
29
|
+
// ---- the clock ----------------------------------------------------------------------------------------------------------
|
|
30
|
+
/** The six starts, in minutes after UTC midnight: 04:17, 07:17, 10:17, 13:17, 16:17 and 19:17 (daylight; the test checks them against every other clock). */
|
|
31
|
+
export const CONVOY_START_MINUTES = [257, 437, 617, 797, 977, 1157];
|
|
32
|
+
export const CONVOY_PER_DAY = CONVOY_START_MINUTES.length;
|
|
33
|
+
/** How long the wagon takes from the camp to the road head. */
|
|
34
|
+
export const CONVOY_TRAVEL_MS = 8 * MINUTE;
|
|
35
|
+
/** How long the unloading stays up after the wagon arrives (the wagon stands at the road head and the standings are up). */
|
|
36
|
+
export const CONVOY_RESULTS_MS = 2 * MINUTE;
|
|
37
|
+
/** The loading time before the start, and the warning before the end. */
|
|
38
|
+
export const CONVOY_SOON_MS = 4 * MINUTE;
|
|
39
|
+
export const CONVOY_LAST_MS = 1 * MINUTE;
|
|
40
|
+
export const CONVOY_STAGES = ['idle', 'soon', 'open', 'last', 'results'];
|
|
41
|
+
export function isConvoyStage(s) {
|
|
42
|
+
return typeof s === 'string' && CONVOY_STAGES.includes(s);
|
|
43
|
+
}
|
|
44
|
+
/** The start of slot `slot` (slot = day * 6 + the start's index; any integer, negative included). */
|
|
45
|
+
export function convoyStartOf(slot) {
|
|
46
|
+
const day = Math.floor(slot / CONVOY_PER_DAY);
|
|
47
|
+
const i = ((slot % CONVOY_PER_DAY) + CONVOY_PER_DAY) % CONVOY_PER_DAY;
|
|
48
|
+
return day * DAY + CONVOY_START_MINUTES[i] * MINUTE;
|
|
49
|
+
}
|
|
50
|
+
export function convoyEndOf(slot) {
|
|
51
|
+
return convoyStartOf(slot) + CONVOY_TRAVEL_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 CONVOY_START_MINUTES)
|
|
59
|
+
if (m * MINUTE <= into)
|
|
60
|
+
n++;
|
|
61
|
+
return day * CONVOY_PER_DAY + n - 1;
|
|
62
|
+
}
|
|
63
|
+
export function convoyClockAt(now) {
|
|
64
|
+
const k = slotAtOrBefore(now);
|
|
65
|
+
const elapsed = now - convoyStartOf(k);
|
|
66
|
+
if (elapsed < CONVOY_TRAVEL_MS) {
|
|
67
|
+
const msToEnd = CONVOY_TRAVEL_MS - elapsed;
|
|
68
|
+
return { slot: k, stage: msToEnd <= CONVOY_LAST_MS ? 'last' : 'open', msToStart: 0, msToEnd };
|
|
69
|
+
}
|
|
70
|
+
if (elapsed < CONVOY_TRAVEL_MS + CONVOY_RESULTS_MS)
|
|
71
|
+
return { slot: k, stage: 'results', msToStart: 0, msToEnd: 0 };
|
|
72
|
+
const next = k + 1;
|
|
73
|
+
const msToStart = convoyStartOf(next) - now;
|
|
74
|
+
return { slot: next, stage: msToStart <= CONVOY_SOON_MS ? 'soon' : 'idle', msToStart, msToEnd: convoyEndOf(next) - now };
|
|
75
|
+
}
|
|
76
|
+
/** True while the wagon is on the road and presence and wolf kills count. */
|
|
77
|
+
export function convoyIsOpen(stage) {
|
|
78
|
+
return stage === 'open' || stage === 'last';
|
|
79
|
+
}
|
|
80
|
+
/** True from the loading (soon) until the unloading ends (results): the wagon is on the ground. */
|
|
81
|
+
export function convoyWagonOut(stage) {
|
|
82
|
+
return stage !== 'idle';
|
|
83
|
+
}
|
|
84
|
+
/** The next convoy to start strictly after `now` (for the login line). */
|
|
85
|
+
export function convoyNextRound(now) {
|
|
86
|
+
const k = slotAtOrBefore(now);
|
|
87
|
+
const slot = convoyStartOf(k) > now ? k : k + 1;
|
|
88
|
+
return { slot, startsAt: convoyStartOf(slot) };
|
|
89
|
+
}
|
|
90
|
+
/** The UTC day a time falls in (the daily paid-convoys cap resets at midnight UTC). */
|
|
91
|
+
export function convoyDayOf(now) {
|
|
92
|
+
return Math.floor(now / DAY);
|
|
93
|
+
}
|
|
94
|
+
function wolves(n) {
|
|
95
|
+
return `${n} wol${n === 1 ? "f" : "ves"}`;
|
|
96
|
+
}
|
|
97
|
+
function span(ms) {
|
|
98
|
+
const mins = Math.max(1, Math.round(ms / MINUTE));
|
|
99
|
+
if (mins < 60)
|
|
100
|
+
return `${mins} minute${mins === 1 ? '' : 's'}`;
|
|
101
|
+
const h = Math.floor(mins / 60);
|
|
102
|
+
const m = mins % 60;
|
|
103
|
+
return m === 0 ? `${h} hour${h === 1 ? '' : 's'}` : `${h} h ${m} min`;
|
|
104
|
+
}
|
|
105
|
+
// ---- the route ----------------------------------------------------------------------------------------------------------
|
|
106
|
+
/**
|
|
107
|
+
* The road, in world tiles: from the forester's camp (the PvP-off pocket x 324-336, z 404-412) down through the woods to the Gallowmere road
|
|
108
|
+
* head. Surveyed 2026-10-15 with the backend's pathfinder: every tile of every straight run is standable and every step is a legal step (the
|
|
109
|
+
* backend smoke walks it). 165 tiles, so the wagon plods at about one tile every three seconds.
|
|
110
|
+
*/
|
|
111
|
+
export const CONVOY_ROUTE = [
|
|
112
|
+
{ x: 330, z: 411 },
|
|
113
|
+
{ x: 332, z: 416 },
|
|
114
|
+
{ x: 358, z: 440 },
|
|
115
|
+
{ x: 394, z: 443 },
|
|
116
|
+
{ x: 407, z: 473 },
|
|
117
|
+
{ x: 394, z: 499 },
|
|
118
|
+
{ x: 374, z: 504 },
|
|
119
|
+
{ x: 352, z: 500 },
|
|
120
|
+
];
|
|
121
|
+
function segLen(a, b) {
|
|
122
|
+
return Math.max(Math.abs(b.x - a.x), Math.abs(b.z - a.z));
|
|
123
|
+
}
|
|
124
|
+
/** The route's length in tiles (Chebyshev, the walking metric). */
|
|
125
|
+
export const CONVOY_ROUTE_LENGTH = (() => {
|
|
126
|
+
let n = 0;
|
|
127
|
+
for (let i = 0; i + 1 < CONVOY_ROUTE.length; i++)
|
|
128
|
+
n += segLen(CONVOY_ROUTE[i], CONVOY_ROUTE[i + 1]);
|
|
129
|
+
return n;
|
|
130
|
+
})();
|
|
131
|
+
/** The tile `d` tiles along the route (clamped to both ends). The same rounding the backend smoke walks. */
|
|
132
|
+
export function convoyTileAtDistance(d) {
|
|
133
|
+
const want = Math.max(0, Math.min(CONVOY_ROUTE_LENGTH, Math.round(d)));
|
|
134
|
+
let left = want;
|
|
135
|
+
for (let i = 0; i + 1 < CONVOY_ROUTE.length; i++) {
|
|
136
|
+
const a = CONVOY_ROUTE[i];
|
|
137
|
+
const b = CONVOY_ROUTE[i + 1];
|
|
138
|
+
const len = segLen(a, b);
|
|
139
|
+
if (left <= len || i + 2 === CONVOY_ROUTE.length) {
|
|
140
|
+
const s = Math.min(left, len);
|
|
141
|
+
return { x: Math.round(a.x + ((b.x - a.x) * s) / len), z: Math.round(a.z + ((b.z - a.z) * s) / len) };
|
|
142
|
+
}
|
|
143
|
+
left -= len;
|
|
144
|
+
}
|
|
145
|
+
return { ...CONVOY_ROUTE[CONVOY_ROUTE.length - 1] };
|
|
146
|
+
}
|
|
147
|
+
/** How far along the road the wagon is for convoy `slot` at `now`, 0 to 1 (0 while it loads, 1 once it has arrived). Pure: no stored position. */
|
|
148
|
+
export function convoyProgress(slot, now) {
|
|
149
|
+
return Math.max(0, Math.min(1, (now - convoyStartOf(slot)) / CONVOY_TRAVEL_MS));
|
|
150
|
+
}
|
|
151
|
+
/** The wagon's tile for convoy `slot` at `now`. */
|
|
152
|
+
export function convoyWagonTile(slot, now) {
|
|
153
|
+
return convoyTileAtDistance(convoyProgress(slot, now) * CONVOY_ROUTE_LENGTH);
|
|
154
|
+
}
|
|
155
|
+
export const CONVOY_START_PLACE = "the forester's camp";
|
|
156
|
+
export const CONVOY_END_PLACE = 'the Gallowmere road head';
|
|
157
|
+
// ---- the wagon ----------------------------------------------------------------------------------------------------------
|
|
158
|
+
/** The wagon: a tame pony NPC (the existing `penpony` kind) named for the cargo; never a fight, never attackable. Upgrade row: its own cart model. */
|
|
159
|
+
export const CONVOY_WAGON = {
|
|
160
|
+
id: 'tc-wagon',
|
|
161
|
+
kind: 'penpony',
|
|
162
|
+
name: 'Timber wagon',
|
|
163
|
+
healthMax: 100,
|
|
164
|
+
/** Health lost per second for each wolf standing within `atWagon` tiles of it. */
|
|
165
|
+
drainPerWolfPerSec: 0.8,
|
|
166
|
+
atWagon: 2,
|
|
167
|
+
/** The wagon arrived "whole" with at least this much health left (a Ledger line). */
|
|
168
|
+
intact: 70,
|
|
169
|
+
/** The server steps the wagon towards its clock tile; further behind than this, it is put on the tile (a blocked step never strands it). */
|
|
170
|
+
snapBehind: 4,
|
|
171
|
+
/** Missing from the world this long (removed by something else, nowhere to stand), the convoy is void. */
|
|
172
|
+
missingVoidMs: 20_000,
|
|
173
|
+
};
|
|
174
|
+
/** The wagon's health after `dtMs` with `wolvesAtWagon` wolves on it, never below 0. Pure. */
|
|
175
|
+
export function convoyHealthAfter(health, dtMs, wolvesAtWagon) {
|
|
176
|
+
const secs = Math.max(0, dtMs) / 1000;
|
|
177
|
+
return Math.max(0, Math.min(CONVOY_WAGON.healthMax, health - secs * CONVOY_WAGON.drainPerWolfPerSec * Math.max(0, wolvesAtWagon)));
|
|
178
|
+
}
|
|
179
|
+
// ---- the wolves ---------------------------------------------------------------------------------------------------------
|
|
180
|
+
/**
|
|
181
|
+
* The woods' wolves that come for the wagon: the Heartwood brood's kind, ids `tc-`, sent in waves while somebody is near the wagon. Levels
|
|
182
|
+
* follow the escorts' average Combat, clamped; the count follows how many escorts are near. They go for an escort in reach, and for the wagon
|
|
183
|
+
* when nobody is in reach. No drops (no farming a convoy for fur). PLACEHOLDERS.
|
|
184
|
+
*/
|
|
185
|
+
export const CONVOY_WOLVES = {
|
|
186
|
+
kind: 'mosswolf',
|
|
187
|
+
idPrefix: 'tc-',
|
|
188
|
+
name: 'Ambush wolf',
|
|
189
|
+
firstWave: 2,
|
|
190
|
+
firstWaveAfterMs: 25_000,
|
|
191
|
+
waveEveryMs: 40_000,
|
|
192
|
+
perExtraEscort: 1,
|
|
193
|
+
waveMax: 6,
|
|
194
|
+
aliveCap: 10,
|
|
195
|
+
/** Wolves come out of the trees this far from the wagon. */
|
|
196
|
+
spawnMin: 9,
|
|
197
|
+
spawnMax: 12,
|
|
198
|
+
aggroRadius: 8,
|
|
199
|
+
leashRadius: 24,
|
|
200
|
+
minLevel: 21,
|
|
201
|
+
maxLevel: 30,
|
|
202
|
+
/** An escort is "near" this close to the wagon (a wave grows with them, and the first wave waits for one). */
|
|
203
|
+
nearWagon: 22,
|
|
204
|
+
/** A player under this Combat is not locked on to (they may still walk beside the wagon, which is the safe job). */
|
|
205
|
+
aggroCombat: 18,
|
|
206
|
+
aggroText: 'A wolf bursts out of the trees at you!',
|
|
207
|
+
};
|
|
208
|
+
/** How many wolves a wave brings: the first wave is fixed; later ones grow with the escorts near the wagon. */
|
|
209
|
+
export function convoyWaveSize(wave, escorts) {
|
|
210
|
+
if (wave <= 0)
|
|
211
|
+
return CONVOY_WOLVES.firstWave;
|
|
212
|
+
return Math.min(CONVOY_WOLVES.waveMax, CONVOY_WOLVES.firstWave + Math.max(0, escorts - 1) * CONVOY_WOLVES.perExtraEscort);
|
|
213
|
+
}
|
|
214
|
+
/** The wolves' level for a party's average Combat. */
|
|
215
|
+
export function convoyWolfLevel(avgCombat) {
|
|
216
|
+
return Math.max(CONVOY_WOLVES.minLevel, Math.min(CONVOY_WOLVES.maxLevel, Math.round(avgCombat)));
|
|
217
|
+
}
|
|
218
|
+
// ---- the scoring --------------------------------------------------------------------------------------------------------
|
|
219
|
+
/** One presence point for each stretch this long spent within `CONVOY_ESCORT_REACH` of the wagon. */
|
|
220
|
+
export const CONVOY_PRESENCE_EVERY_MS = 20_000;
|
|
221
|
+
export const CONVOY_ESCORT_REACH = 8;
|
|
222
|
+
export const CONVOY_PRESENCE_POINTS = 1;
|
|
223
|
+
export const CONVOY_KILL_POINTS = 3;
|
|
224
|
+
/** Past these a stretch or a kill still helps the wagon (a dead wolf is a dead wolf) but scores nothing more. Presence alone never reaches the minimum. */
|
|
225
|
+
export const CONVOY_PRESENCE_CAP = 5;
|
|
226
|
+
export const CONVOY_KILL_CAP = 10;
|
|
227
|
+
/** The least score that counts as having escorted (2 wolves, or 1 wolf and 3 stretches). Presence alone (at most 5) is never enough. */
|
|
228
|
+
export const CONVOY_MIN_SCORE = 6;
|
|
229
|
+
/** Podium prizes need at least this many different accounts above the minimum, and the wagon arrived. */
|
|
230
|
+
export const CONVOY_MIN_ESCORTS = 3;
|
|
231
|
+
/** Paid convoys per account per UTC day (alts and shared accounts cannot farm every wagon of the day). */
|
|
232
|
+
export const CONVOY_DAILY_PAID = 4;
|
|
233
|
+
/** A wolf kill counts only for a player this close to the wagon (a wolf kited across the woods scores nothing). */
|
|
234
|
+
export const CONVOY_KILL_REACH = 20;
|
|
235
|
+
export function convoyScore(presence, kills) {
|
|
236
|
+
return Math.min(Math.max(0, presence), CONVOY_PRESENCE_CAP) * CONVOY_PRESENCE_POINTS + Math.min(Math.max(0, kills), CONVOY_KILL_CAP) * CONVOY_KILL_POINTS;
|
|
237
|
+
}
|
|
238
|
+
export function convoyEntryScore(e) {
|
|
239
|
+
return convoyScore(e.presence, e.kills);
|
|
240
|
+
}
|
|
241
|
+
function baseEntry(entry, who, at) {
|
|
242
|
+
return entry ?? { key: who.key, account: who.account, name: who.name, presence: 0, kills: 0, at };
|
|
243
|
+
}
|
|
244
|
+
/** One stretch beside the wagon by this character. Returns a new entry (the old is untouched). */
|
|
245
|
+
export function convoyWithPresence(entry, who, at) {
|
|
246
|
+
const base = baseEntry(entry, who, at);
|
|
247
|
+
const next = { ...base, name: who.name, presence: base.presence + 1 };
|
|
248
|
+
return { ...next, at: convoyEntryScore(next) > convoyEntryScore(base) ? at : base.at };
|
|
249
|
+
}
|
|
250
|
+
/** One wolf kill by this character. */
|
|
251
|
+
export function convoyWithKill(entry, who, at) {
|
|
252
|
+
const base = baseEntry(entry, who, at);
|
|
253
|
+
const next = { ...base, name: who.name, kills: base.kills + 1 };
|
|
254
|
+
return { ...next, at: convoyEntryScore(next) > convoyEntryScore(base) ? at : base.at };
|
|
255
|
+
}
|
|
256
|
+
export function convoyQualifies(e) {
|
|
257
|
+
return convoyEntryScore(e) >= CONVOY_MIN_SCORE;
|
|
258
|
+
}
|
|
259
|
+
function accountOf(e) {
|
|
260
|
+
return e.account || `key:${e.key}`;
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* The ranking: higher score first, then whoever reached it first, then the key (a total order a test can pin). One place per ACCOUNT:
|
|
264
|
+
* of an account's characters only the best-placed one is listed. Entries below the minimum score are not ranked.
|
|
265
|
+
*/
|
|
266
|
+
export function convoyRanking(entries) {
|
|
267
|
+
const sorted = entries
|
|
268
|
+
.filter(convoyQualifies)
|
|
269
|
+
.sort((a, b) => {
|
|
270
|
+
const sa = convoyEntryScore(a);
|
|
271
|
+
const sb = convoyEntryScore(b);
|
|
272
|
+
if (sb !== sa)
|
|
273
|
+
return sb - sa;
|
|
274
|
+
if (a.at !== b.at)
|
|
275
|
+
return a.at - b.at;
|
|
276
|
+
return a.key < b.key ? -1 : a.key > b.key ? 1 : 0;
|
|
277
|
+
});
|
|
278
|
+
const seen = new Set();
|
|
279
|
+
const out = [];
|
|
280
|
+
for (const e of sorted) {
|
|
281
|
+
const acc = accountOf(e);
|
|
282
|
+
if (seen.has(acc))
|
|
283
|
+
continue;
|
|
284
|
+
seen.add(acc);
|
|
285
|
+
out.push(e);
|
|
286
|
+
}
|
|
287
|
+
return out;
|
|
288
|
+
}
|
|
289
|
+
/** The 1-based place of a character in the ranking (ranked entries only), or 0. */
|
|
290
|
+
export function convoyPlaceOf(entries, key) {
|
|
291
|
+
const i = convoyRanking(entries).findIndex((e) => e.key === key);
|
|
292
|
+
return i < 0 ? 0 : i + 1;
|
|
293
|
+
}
|
|
294
|
+
const RIBBONS = ['red', 'blue', 'bronze'];
|
|
295
|
+
export const CONVOY_RIBBON_LABEL = { red: 'Red Ribbon', blue: 'Blue Ribbon', bronze: 'Bronze Ribbon' };
|
|
296
|
+
/** PLACEHOLDER podium prizes by place (an arrived wagon only), on top of the participation prize. */
|
|
297
|
+
export const CONVOY_PODIUM_PRIZES = [
|
|
298
|
+
{ woodworkXp: 500, explorerXp: 100, ash: 3 },
|
|
299
|
+
{ woodworkXp: 330, explorerXp: 70, ash: 2 },
|
|
300
|
+
{ woodworkXp: 200, explorerXp: 40, ash: 1 },
|
|
301
|
+
];
|
|
302
|
+
/** Everyone paid who qualified. A wagon that was wrecked halves the XP and gives no logs. */
|
|
303
|
+
export const CONVOY_PARTICIPATION = { woodworkXp: 100, explorerXp: 20, alder: 3 };
|
|
304
|
+
export const CONVOY_ALDER_KIND = 'alderwood';
|
|
305
|
+
export const CONVOY_ASH_KIND = 'ashwood';
|
|
306
|
+
/** Ledger marks (types explorerLedger.ts `convoy` page) a result can write. */
|
|
307
|
+
export const CONVOY_MARK_ENTERED = 'convoy:entered';
|
|
308
|
+
export const CONVOY_MARK_ARRIVED = 'convoy:arrived';
|
|
309
|
+
export const CONVOY_MARK_WHOLE = 'convoy:whole';
|
|
310
|
+
export const CONVOY_MARK_GUARD = 'convoy:guard';
|
|
311
|
+
export const CONVOY_MARK_RIBBON = { red: 'convoy:red', blue: 'convoy:blue', bronze: 'convoy:bronze' };
|
|
312
|
+
/** Paid convoys this account has had on this UTC day. */
|
|
313
|
+
export function convoyPaidToday(paid, account, day) {
|
|
314
|
+
const p = paid[account];
|
|
315
|
+
return p && p.day === day ? p.n : 0;
|
|
316
|
+
}
|
|
317
|
+
/** The record after one more paid convoy for these accounts (old days dropped). Returns a new object. */
|
|
318
|
+
export function convoyWithPaid(paid, accounts, day) {
|
|
319
|
+
const next = {};
|
|
320
|
+
for (const [acc, p] of Object.entries(paid))
|
|
321
|
+
if (p.day === day)
|
|
322
|
+
next[acc] = p;
|
|
323
|
+
for (const acc of accounts)
|
|
324
|
+
next[acc] = { day, n: convoyPaidToday(next, acc, day) + 1 };
|
|
325
|
+
return next;
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Everything a finished convoy pays, by character key. One prize per account (the ranking lists an account once). An account that has had its
|
|
329
|
+
* paid convoys today is skipped (the podium moves up to the next account). A void convoy pays nothing. Pure, so a restart that finalises a
|
|
330
|
+
* convoy late pays exactly what the clock-time finalise would have.
|
|
331
|
+
*/
|
|
332
|
+
export function convoyPrizes(entries, input) {
|
|
333
|
+
const out = new Map();
|
|
334
|
+
if (input.outcome === 'void' || input.outcome === 'none')
|
|
335
|
+
return out;
|
|
336
|
+
const ranked = convoyRanking(entries);
|
|
337
|
+
if (ranked.length === 0)
|
|
338
|
+
return out;
|
|
339
|
+
const arrived = input.outcome === 'arrived';
|
|
340
|
+
const eligible = ranked.filter((e) => convoyPaidToday(input.paid, accountOf(e), input.day) < CONVOY_DAILY_PAID);
|
|
341
|
+
const podium = arrived && ranked.length >= CONVOY_MIN_ESCORTS;
|
|
342
|
+
const half = arrived ? 1 : 0.5;
|
|
343
|
+
const whole = arrived && input.health >= CONVOY_WAGON.intact;
|
|
344
|
+
for (const e of eligible) {
|
|
345
|
+
const prize = {
|
|
346
|
+
woodworkXp: Math.floor(CONVOY_PARTICIPATION.woodworkXp * half),
|
|
347
|
+
explorerXp: Math.floor(CONVOY_PARTICIPATION.explorerXp * half),
|
|
348
|
+
items: arrived ? [{ kind: CONVOY_ALDER_KIND, qty: CONVOY_PARTICIPATION.alder }] : [],
|
|
349
|
+
marks: [CONVOY_MARK_ENTERED],
|
|
350
|
+
text: '',
|
|
351
|
+
};
|
|
352
|
+
if (arrived)
|
|
353
|
+
prize.marks.push(CONVOY_MARK_ARRIVED);
|
|
354
|
+
if (whole)
|
|
355
|
+
prize.marks.push(CONVOY_MARK_WHOLE);
|
|
356
|
+
if (e.kills >= CONVOY_KILL_CAP)
|
|
357
|
+
prize.marks.push(CONVOY_MARK_GUARD);
|
|
358
|
+
out.set(e.key, prize);
|
|
359
|
+
}
|
|
360
|
+
const notes = new Map();
|
|
361
|
+
if (podium) {
|
|
362
|
+
for (let i = 0; i < Math.min(3, eligible.length); i++) {
|
|
363
|
+
const e = eligible[i];
|
|
364
|
+
const prize = out.get(e.key);
|
|
365
|
+
const row = CONVOY_PODIUM_PRIZES[i];
|
|
366
|
+
prize.woodworkXp += row.woodworkXp;
|
|
367
|
+
prize.explorerXp += row.explorerXp;
|
|
368
|
+
prize.items.push({ kind: CONVOY_ASH_KIND, qty: row.ash });
|
|
369
|
+
prize.marks.push(CONVOY_MARK_RIBBON[RIBBONS[i]]);
|
|
370
|
+
notes.set(e.key, `${CONVOY_RIBBON_LABEL[RIBBONS[i]]} for ${i === 0 ? '1st' : i === 1 ? '2nd' : '3rd'} place`);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
for (const [key, prize] of out) {
|
|
374
|
+
const e = eligible.find((x) => x.key === key);
|
|
375
|
+
const base = notes.get(key) ?? (arrived ? 'the wagon got through' : 'thanks for trying');
|
|
376
|
+
prize.text = `Timber Convoy: ${base} (${wolves(e.kills)} put down, score ${convoyEntryScore(e)}). +${prize.woodworkXp} Woodwork XP, +${prize.explorerXp} Explorer XP.`;
|
|
377
|
+
}
|
|
378
|
+
return out;
|
|
379
|
+
}
|
|
380
|
+
/** The world chat line for a finished convoy. */
|
|
381
|
+
export function convoyResultLine(entries, outcome, health) {
|
|
382
|
+
if (outcome === 'void')
|
|
383
|
+
return 'The Timber Convoy was called off: the wagon was lost on the road. Nobody is paid.';
|
|
384
|
+
const ranked = convoyRanking(entries);
|
|
385
|
+
const arrived = outcome === 'arrived';
|
|
386
|
+
const lead = arrived
|
|
387
|
+
? `The timber wagon rolls in at ${CONVOY_END_PLACE} with ${Math.round(health)} of ${CONVOY_WAGON.healthMax} left.`
|
|
388
|
+
: 'The wolves have broken the timber wagon. The load is lost on the road.';
|
|
389
|
+
if (ranked.length === 0)
|
|
390
|
+
return `${lead} Nobody scored enough to be named.`;
|
|
391
|
+
const top = ranked[0];
|
|
392
|
+
const podium = !arrived ? ' (no ribbons for a wrecked wagon)' : ranked.length < CONVOY_MIN_ESCORTS ? ` (it takes ${CONVOY_MIN_ESCORTS} escorts to hand out ribbons)` : '';
|
|
393
|
+
return `${lead} Top escort: ${top.name}, score ${convoyEntryScore(top)}${ranked[1] ? `; then ${ranked[1].name}${ranked[2] ? ` and ${ranked[2].name}` : ''}` : ''}.${podium}`;
|
|
394
|
+
}
|
|
395
|
+
// ---- the telling --------------------------------------------------------------------------------------------------------
|
|
396
|
+
/** The world chat line for a stage (idle and results have none: the results line is built from the standings). */
|
|
397
|
+
export function convoyChatLine(stage) {
|
|
398
|
+
switch (stage) {
|
|
399
|
+
case 'soon':
|
|
400
|
+
return `World event: the Timber Convoy leaves ${CONVOY_START_PLACE} in ${span(CONVOY_SOON_MS)}. Walk beside the wagon and cut down the wolves that come for it. The woods are PvP ground and nobody heals there.`;
|
|
401
|
+
case 'open':
|
|
402
|
+
return `World event: the timber wagon is ROLLING from ${CONVOY_START_PLACE} to ${CONVOY_END_PLACE}: ${span(CONVOY_TRAVEL_MS)}. Stay within ${CONVOY_ESCORT_REACH} tiles of it and put down the ambush wolves. Standing beside it and wolf kills score.`;
|
|
403
|
+
case 'last':
|
|
404
|
+
return `World event: ${span(CONVOY_LAST_MS)} left of the Timber Convoy.`;
|
|
405
|
+
default:
|
|
406
|
+
return null;
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
/** The login line's piece about the Timber Convoy. */
|
|
410
|
+
export function convoyTodayText(now) {
|
|
411
|
+
const c = convoyClockAt(now);
|
|
412
|
+
if (convoyIsOpen(c.stage))
|
|
413
|
+
return `the Timber Convoy is on the road now (${span(c.msToEnd)} to the road head)`;
|
|
414
|
+
const next = convoyNextRound(now);
|
|
415
|
+
return `the Timber Convoy leaves the forester's camp in ${span(next.startsAt - now)} (PvP woods)`;
|
|
416
|
+
}
|
|
417
|
+
/** What /convoy tells a player. */
|
|
418
|
+
export function convoyStatusLines(clock, entries, myKey, health, now) {
|
|
419
|
+
const lines = [];
|
|
420
|
+
if (convoyIsOpen(clock.stage)) {
|
|
421
|
+
lines.push(`The Timber Convoy is ON the road: ${span(clock.msToEnd)} to ${CONVOY_END_PLACE}. The wagon stands at ${Math.round(health)} of ${CONVOY_WAGON.healthMax}.`);
|
|
422
|
+
}
|
|
423
|
+
else if (clock.stage === 'results') {
|
|
424
|
+
lines.push('The Timber Convoy has finished; the results are in.');
|
|
425
|
+
}
|
|
426
|
+
else if (clock.stage === 'soon') {
|
|
427
|
+
lines.push(`The wagon is being loaded at ${CONVOY_START_PLACE}: it leaves in ${span(clock.msToStart)}.`);
|
|
428
|
+
}
|
|
429
|
+
else {
|
|
430
|
+
const next = convoyNextRound(now);
|
|
431
|
+
lines.push(`Next Timber Convoy: in ${span(next.startsAt - now)}, from ${CONVOY_START_PLACE} to ${CONVOY_END_PLACE}.`);
|
|
432
|
+
}
|
|
433
|
+
if (convoyIsOpen(clock.stage) || clock.stage === 'results') {
|
|
434
|
+
const ranked = convoyRanking(entries);
|
|
435
|
+
if (ranked.length === 0)
|
|
436
|
+
lines.push(`Nobody has scored enough to be ranked yet (${CONVOY_MIN_SCORE} points: 2 wolves, or 1 wolf and 3 stretches beside the wagon).`);
|
|
437
|
+
else
|
|
438
|
+
lines.push(`Top escorts: ${ranked.slice(0, 3).map((e, i) => `${i + 1}. ${e.name} ${convoyEntryScore(e)}`).join(', ')}`);
|
|
439
|
+
if (myKey) {
|
|
440
|
+
const mine = entries.find((e) => e.key === myKey);
|
|
441
|
+
if (mine)
|
|
442
|
+
lines.push(`You: ${Math.min(mine.presence, CONVOY_PRESENCE_CAP)} stretch${mine.presence === 1 ? '' : 'es'} beside the wagon, ${wolves(mine.kills)}, score ${convoyEntryScore(mine)}${convoyQualifies(mine) ? '' : ` (${CONVOY_MIN_SCORE} to be ranked)`}.`);
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
return lines;
|
|
446
|
+
}
|
|
447
|
+
export function emptyConvoySave() {
|
|
448
|
+
return { v: 1, slot: -1, announced: null, finalized: true, health: CONVOY_WAGON.healthMax, outcome: 'none', waves: 0, entries: [], pending: {}, paid: {} };
|
|
449
|
+
}
|
|
450
|
+
/** At most this many prizes wait for one character, and entries are never more than this many. */
|
|
451
|
+
export const CONVOY_PENDING_MAX = 5;
|
|
452
|
+
export const CONVOY_MAX_ENTRIES = 1000;
|
|
453
|
+
function num(x, min, max) {
|
|
454
|
+
return typeof x === 'number' && Number.isFinite(x) && x >= min && x <= max ? x : null;
|
|
455
|
+
}
|
|
456
|
+
function parseEntry(raw) {
|
|
457
|
+
if (!raw || typeof raw !== 'object')
|
|
458
|
+
return null;
|
|
459
|
+
const r = raw;
|
|
460
|
+
const presence = num(r.presence, 0, 100_000);
|
|
461
|
+
const kills = num(r.kills, 0, 100_000);
|
|
462
|
+
const at = num(r.at, 0, 1e15);
|
|
463
|
+
if (typeof r.key !== 'string' || r.key.length === 0 || r.key.length > 80 || presence === null || kills === null || at === null)
|
|
464
|
+
return null;
|
|
465
|
+
return {
|
|
466
|
+
key: r.key,
|
|
467
|
+
account: typeof r.account === 'string' ? r.account.slice(0, 80) : '',
|
|
468
|
+
name: typeof r.name === 'string' ? r.name.slice(0, 40) : 'Escort',
|
|
469
|
+
presence: Math.floor(presence),
|
|
470
|
+
kills: Math.floor(kills),
|
|
471
|
+
at,
|
|
472
|
+
};
|
|
473
|
+
}
|
|
474
|
+
function parsePrize(raw) {
|
|
475
|
+
if (!raw || typeof raw !== 'object')
|
|
476
|
+
return null;
|
|
477
|
+
const r = raw;
|
|
478
|
+
const woodworkXp = num(r.woodworkXp, 0, 100_000);
|
|
479
|
+
const explorerXp = num(r.explorerXp, 0, 100_000);
|
|
480
|
+
if (woodworkXp === null || explorerXp === null || typeof r.text !== 'string')
|
|
481
|
+
return null;
|
|
482
|
+
const items = [];
|
|
483
|
+
if (Array.isArray(r.items)) {
|
|
484
|
+
for (const it of r.items.slice(0, 8)) {
|
|
485
|
+
if (it && typeof it === 'object' && typeof it.kind === 'string' && num(it.qty, 1, 1000) !== null) {
|
|
486
|
+
items.push({ kind: it.kind.slice(0, 60), qty: Math.floor(it.qty) });
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
const marks = Array.isArray(r.marks) ? r.marks.filter((m) => typeof m === 'string' && m.startsWith('convoy:')).slice(0, 12) : [];
|
|
491
|
+
return { woodworkXp: Math.floor(woodworkXp), explorerXp: Math.floor(explorerXp), items, marks, text: r.text.slice(0, 300) };
|
|
492
|
+
}
|
|
493
|
+
/** A saved state, checked field by field (it comes from the database); anything wrong gives the empty state. */
|
|
494
|
+
export function parseConvoySave(raw) {
|
|
495
|
+
if (!raw || typeof raw !== 'object')
|
|
496
|
+
return emptyConvoySave();
|
|
497
|
+
const r = raw;
|
|
498
|
+
if (r.v !== 1)
|
|
499
|
+
return emptyConvoySave();
|
|
500
|
+
const slot = num(r.slot, -1e9, 1e9);
|
|
501
|
+
const entries = Array.isArray(r.entries) ? r.entries.slice(0, 2000).map(parseEntry).filter((e) => e !== null) : [];
|
|
502
|
+
const seen = new Set();
|
|
503
|
+
const unique = entries.filter((e) => (seen.has(e.key) ? false : (seen.add(e.key), true)));
|
|
504
|
+
let announced = null;
|
|
505
|
+
const a = r.announced;
|
|
506
|
+
if (a && typeof a === 'object' && num(a.slot, -1e9, 1e9) !== null && isConvoyStage(a.stage))
|
|
507
|
+
announced = { slot: Math.floor(a.slot), stage: a.stage };
|
|
508
|
+
const pending = {};
|
|
509
|
+
if (r.pending && typeof r.pending === 'object') {
|
|
510
|
+
for (const [key, list] of Object.entries(r.pending).slice(0, 5000)) {
|
|
511
|
+
if (!Array.isArray(list))
|
|
512
|
+
continue;
|
|
513
|
+
const prizes = list.map(parsePrize).filter((p) => p !== null).slice(-CONVOY_PENDING_MAX);
|
|
514
|
+
if (prizes.length > 0)
|
|
515
|
+
pending[key] = prizes;
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
const paid = {};
|
|
519
|
+
if (r.paid && typeof r.paid === 'object') {
|
|
520
|
+
for (const [acc, raw2] of Object.entries(r.paid).slice(0, 5000)) {
|
|
521
|
+
const p = raw2;
|
|
522
|
+
if (!p || typeof p !== 'object')
|
|
523
|
+
continue;
|
|
524
|
+
const day = num(p.day, 0, 1e7);
|
|
525
|
+
const n = num(p.n, 0, 1000);
|
|
526
|
+
if (day === null || n === null)
|
|
527
|
+
continue;
|
|
528
|
+
paid[acc.slice(0, 80)] = { day: Math.floor(day), n: Math.floor(n) };
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
const health = num(r.health, 0, CONVOY_WAGON.healthMax);
|
|
532
|
+
const waves = num(r.waves, 0, 100_000);
|
|
533
|
+
const outcome = r.outcome === 'arrived' || r.outcome === 'wrecked' || r.outcome === 'void' ? r.outcome : 'none';
|
|
534
|
+
return {
|
|
535
|
+
v: 1,
|
|
536
|
+
slot: slot === null ? -1 : Math.floor(slot),
|
|
537
|
+
announced,
|
|
538
|
+
finalized: r.finalized === true,
|
|
539
|
+
health: health === null ? CONVOY_WAGON.healthMax : health,
|
|
540
|
+
outcome,
|
|
541
|
+
waves: waves === null ? 0 : Math.floor(waves),
|
|
542
|
+
entries: unique,
|
|
543
|
+
pending,
|
|
544
|
+
paid,
|
|
545
|
+
};
|
|
546
|
+
}
|
|
547
|
+
//# sourceMappingURL=timberConvoy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timberConvoy.js","sourceRoot":"","sources":["../src/timberConvoy.ts"],"names":[],"mappings":"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"}
|