@rine-kit/pubg-intelligence 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/LICENSE +21 -0
  2. package/dist/src/analytics.d.ts +176 -0
  3. package/dist/src/analytics.js +431 -0
  4. package/dist/src/analytics.js.map +1 -0
  5. package/dist/src/assistant.d.ts +87 -0
  6. package/dist/src/assistant.js +310 -0
  7. package/dist/src/assistant.js.map +1 -0
  8. package/dist/src/battle.d.ts +280 -0
  9. package/dist/src/battle.js +1249 -0
  10. package/dist/src/battle.js.map +1 -0
  11. package/dist/src/combat-long.d.ts +42 -0
  12. package/dist/src/combat-long.js +146 -0
  13. package/dist/src/combat-long.js.map +1 -0
  14. package/dist/src/combat-quality.d.ts +101 -0
  15. package/dist/src/combat-quality.js +253 -0
  16. package/dist/src/combat-quality.js.map +1 -0
  17. package/dist/src/evaluation-fixtures.d.ts +13 -0
  18. package/dist/src/evaluation-fixtures.js +144 -0
  19. package/dist/src/evaluation-fixtures.js.map +1 -0
  20. package/dist/src/evaluation-replay.d.ts +5 -0
  21. package/dist/src/evaluation-replay.js +107 -0
  22. package/dist/src/evaluation-replay.js.map +1 -0
  23. package/dist/src/evaluation.d.ts +140 -0
  24. package/dist/src/evaluation.js +180 -0
  25. package/dist/src/evaluation.js.map +1 -0
  26. package/dist/src/experiment-store.d.ts +56 -0
  27. package/dist/src/experiment-store.js +159 -0
  28. package/dist/src/experiment-store.js.map +1 -0
  29. package/dist/src/field.d.ts +103 -0
  30. package/dist/src/field.js +298 -0
  31. package/dist/src/field.js.map +1 -0
  32. package/dist/src/fights.d.ts +89 -0
  33. package/dist/src/fights.js +238 -0
  34. package/dist/src/fights.js.map +1 -0
  35. package/dist/src/highlights.d.ts +44 -0
  36. package/dist/src/highlights.js +153 -0
  37. package/dist/src/highlights.js.map +1 -0
  38. package/dist/src/index.d.ts +24 -0
  39. package/dist/src/index.js +25 -0
  40. package/dist/src/index.js.map +1 -0
  41. package/dist/src/insights.d.ts +44 -0
  42. package/dist/src/insights.js +343 -0
  43. package/dist/src/insights.js.map +1 -0
  44. package/dist/src/intent.d.ts +40 -0
  45. package/dist/src/intent.js +119 -0
  46. package/dist/src/intent.js.map +1 -0
  47. package/dist/src/landing.d.ts +74 -0
  48. package/dist/src/landing.js +195 -0
  49. package/dist/src/landing.js.map +1 -0
  50. package/dist/src/lobby.d.ts +48 -0
  51. package/dist/src/lobby.js +209 -0
  52. package/dist/src/lobby.js.map +1 -0
  53. package/dist/src/match-insight.d.ts +165 -0
  54. package/dist/src/match-insight.js +542 -0
  55. package/dist/src/match-insight.js.map +1 -0
  56. package/dist/src/match-relative.d.ts +73 -0
  57. package/dist/src/match-relative.js +145 -0
  58. package/dist/src/match-relative.js.map +1 -0
  59. package/dist/src/match-story.d.ts +155 -0
  60. package/dist/src/match-story.js +636 -0
  61. package/dist/src/match-story.js.map +1 -0
  62. package/dist/src/profiles.d.ts +41 -0
  63. package/dist/src/profiles.js +136 -0
  64. package/dist/src/profiles.js.map +1 -0
  65. package/dist/src/raw-telemetry-archive.d.ts +29 -0
  66. package/dist/src/raw-telemetry-archive.js +340 -0
  67. package/dist/src/raw-telemetry-archive.js.map +1 -0
  68. package/dist/src/raw-telemetry-backfill.d.ts +28 -0
  69. package/dist/src/raw-telemetry-backfill.js +144 -0
  70. package/dist/src/raw-telemetry-backfill.js.map +1 -0
  71. package/dist/src/research.d.ts +89 -0
  72. package/dist/src/research.js +376 -0
  73. package/dist/src/research.js.map +1 -0
  74. package/dist/src/rhythm.d.ts +104 -0
  75. package/dist/src/rhythm.js +260 -0
  76. package/dist/src/rhythm.js.map +1 -0
  77. package/dist/src/streaks.d.ts +117 -0
  78. package/dist/src/streaks.js +367 -0
  79. package/dist/src/streaks.js.map +1 -0
  80. package/dist/src/style.d.ts +304 -0
  81. package/dist/src/style.js +1461 -0
  82. package/dist/src/style.js.map +1 -0
  83. package/dist/src/tactics.d.ts +88 -0
  84. package/dist/src/tactics.js +1221 -0
  85. package/dist/src/tactics.js.map +1 -0
  86. package/package.json +49 -3
  87. package/README.md +0 -3
@@ -0,0 +1,542 @@
1
+ import { wilsonInterval } from './analytics.js';
2
+ export const MATCH_INSIGHT_SCHEMA_VERSION = 1;
3
+ /** How far back a down looks for the fire that caused it. */
4
+ export const DOWN_LOOKBACK_SECONDS = 20;
5
+ /** A shot taken from at least this far is a long-range pick. */
6
+ export const DOWN_FAR_METERS = 150;
7
+ /** A member this far from every teammate is on their own. */
8
+ export const DOWN_ALONE_METERS = 150;
9
+ /** Opposing players within this distance count as nearby. */
10
+ export const DOWN_NEARBY_METERS = 300;
11
+ export const DOWN_CAUSES = [
12
+ {
13
+ key: 'ambush_far',
14
+ label: '被远程先手打倒',
15
+ advice: '没来得及还手就被 150 米外的火力打倒:过空地、开阔地时分散并先找掩体,听到枪声先卧倒再判断方向。',
16
+ },
17
+ {
18
+ key: 'ambush_close',
19
+ label: '被近距离偷袭',
20
+ advice: '近距离突然被打倒且没还手:进房、过拐角前先架枪或扔雷,别几个人一起挤过门。',
21
+ },
22
+ {
23
+ key: 'crossfire',
24
+ label: '多队混战',
25
+ advice: '20 秒内被两支以上队伍打到:遇到枪声别硬凑,先判断是谁和谁在打,必要时撤出去等他们消耗。',
26
+ },
27
+ {
28
+ key: 'isolated',
29
+ label: '落单被击倒',
30
+ advice: '还了手但身边没有队友(150 米内无人):保持队形,落单的人先向队友靠拢再交战。',
31
+ },
32
+ {
33
+ key: 'lost_duel',
34
+ label: '正面交战落败',
35
+ advice: '双方互有输出但这边先倒:这是正常对枪的结果,可看火力配置、掩体和人数是否占优。',
36
+ },
37
+ {
38
+ key: 'bluezone',
39
+ label: '被毒圈击倒',
40
+ advice: '倒在毒里:转圈太晚,提前出发或用载具,别等到圈刷新才开始跑。',
41
+ },
42
+ { key: 'environment', label: '环境击倒', advice: '被坠落、爆炸、载具等击倒。' },
43
+ ];
44
+ function positionAt(route, t, maxGap) {
45
+ if (!route.length)
46
+ return null;
47
+ if (t < route[0].t - maxGap)
48
+ return null;
49
+ for (let index = 1; index < route.length; index += 1) {
50
+ const next = route[index];
51
+ if (t <= next.t) {
52
+ const prev = route[index - 1];
53
+ if (next.t - prev.t > maxGap * 3)
54
+ return Math.abs(t - prev.t) <= maxGap ? prev : Math.abs(next.t - t) <= maxGap ? next : null;
55
+ const f = next.t === prev.t ? 1 : (t - prev.t) / (next.t - prev.t);
56
+ return { x: prev.x + (next.x - prev.x) * f, y: prev.y + (next.y - prev.y) * f };
57
+ }
58
+ }
59
+ const last = route.at(-1);
60
+ return t - last.t <= maxGap ? last : null;
61
+ }
62
+ function aliveAt(player, t) {
63
+ return (player.lifeline.some((segment) => t >= segment.from && t <= segment.to && segment.state !== 'dead') ||
64
+ (player.diedAt === null && player.route.length > 0 && t >= (player.landing?.t ?? 0)));
65
+ }
66
+ export function buildDowns(story, contacts, blueDamage) {
67
+ const downs = [];
68
+ const stateAt = (t) => {
69
+ let found = null;
70
+ for (const point of story.circle) {
71
+ if (point.t > t)
72
+ break;
73
+ found = point;
74
+ }
75
+ return found;
76
+ };
77
+ for (const event of story.events) {
78
+ if (event.kind !== 'downed')
79
+ continue;
80
+ const t = event.t;
81
+ const downContact = contacts.find((item) => item.kind === 'downed' && item.member === event.member && Math.abs(item.t - t) < 1);
82
+ const attackerTeam = downContact?.enemyTeam ?? null;
83
+ const window = contacts.filter((item) => item.t >= t - DOWN_LOOKBACK_SECONDS && item.t <= t);
84
+ const takenBy = window.filter((item) => item.kind === 'taken');
85
+ const teamsHitting = new Set(takenBy.map((item) => item.enemyTeam).filter((team) => team !== null));
86
+ const returnDamage = attackerTeam === null
87
+ ? 0
88
+ : window
89
+ .filter((item) => item.kind === 'dealt' && item.enemyTeam === attackerTeam)
90
+ .reduce((sum, item) => sum + item.amount, 0);
91
+ const takenDamage = takenBy.reduce((sum, item) => sum + item.amount, 0);
92
+ const me = story.players.find((player) => player.member === event.member);
93
+ const here = me ? positionAt(me.route, t, 15) : null;
94
+ let nearest = null;
95
+ if (here) {
96
+ for (const mate of story.players) {
97
+ if (mate.member === event.member || !aliveAt(mate, t))
98
+ continue;
99
+ const there = positionAt(mate.route, t, 15);
100
+ if (there) {
101
+ const distance = Math.hypot(here.x - there.x, here.y - there.y);
102
+ nearest = nearest === null ? distance : Math.min(nearest, distance);
103
+ }
104
+ }
105
+ }
106
+ let teamsNearby = null;
107
+ if (here && story.enemies.length) {
108
+ const teams = new Set();
109
+ for (const enemy of story.enemies) {
110
+ const there = positionAt(enemy.route.map(([time, x, y]) => ({ t: time, x, y })), t, 25);
111
+ if (there &&
112
+ Math.hypot(here.x - there.x, here.y - there.y) <= DOWN_NEARBY_METERS &&
113
+ (enemy.diedAt === null || enemy.diedAt >= t))
114
+ teams.add(enemy.team);
115
+ }
116
+ teamsNearby = teams.size;
117
+ }
118
+ const inBlue = blueDamage.some((item) => item.member === event.member && item.t >= t - 12 && item.t <= t + 1);
119
+ let cause;
120
+ if (!event.byPlayer || attackerTeam === null)
121
+ cause = inBlue ? 'bluezone' : 'environment';
122
+ else if (teamsHitting.size >= 2)
123
+ cause = 'crossfire';
124
+ else if (returnDamage === 0)
125
+ cause = (event.meters ?? 0) >= DOWN_FAR_METERS ? 'ambush_far' : 'ambush_close';
126
+ else if (nearest !== null && nearest > DOWN_ALONE_METERS)
127
+ cause = 'isolated';
128
+ else
129
+ cause = 'lost_duel';
130
+ const later = story.events.find((item) => item.t > t &&
131
+ ((item.kind === 'death' && item.member === event.member) ||
132
+ (item.kind === 'revive' && item.other === event.member)));
133
+ downs.push({
134
+ t: Math.round(t),
135
+ member: event.member,
136
+ cause,
137
+ attackerTeam,
138
+ weapon: event.weapon,
139
+ meters: event.meters,
140
+ returnDamage: Math.round(returnDamage),
141
+ takenDamage: Math.round(takenDamage),
142
+ teamsHitting: teamsHitting.size,
143
+ nearestTeammate: nearest === null ? null : Math.round(nearest),
144
+ alone: nearest === null ? null : nearest > DOWN_ALONE_METERS,
145
+ teamsNearby,
146
+ phase: stateAt(t)?.phase ?? null,
147
+ outcome: !later ? 'unknown' : later.kind === 'revive' ? 'revived' : 'died',
148
+ afterSeconds: later ? Math.round(later.t - t) : null,
149
+ });
150
+ }
151
+ return downs;
152
+ }
153
+ export function buildTurningPoints(story) {
154
+ const points = [];
155
+ const firstDeath = story.events.find((event) => event.kind === 'death');
156
+ if (firstDeath) {
157
+ const fight = [...story.fights].reverse().find((item) => item.start <= firstDeath.t + 5) ?? null;
158
+ points.push({
159
+ kind: 'first_loss',
160
+ t: Math.round(firstDeath.t),
161
+ fight: fight?.index ?? null,
162
+ member: firstDeath.member,
163
+ count: 0,
164
+ });
165
+ }
166
+ if (story.squadOutAt !== null) {
167
+ const before = story.fights.filter((fight) => fight.start <= story.squadOutAt);
168
+ let streak = 0;
169
+ for (let index = before.length - 1; index >= 0; index -= 1) {
170
+ if (before[index].outcome === 'lose')
171
+ streak += 1;
172
+ else if (before[index].outcome === 'win')
173
+ break;
174
+ else if (streak === 0)
175
+ continue;
176
+ }
177
+ const last = before.at(-1);
178
+ if (streak >= 2) {
179
+ const first = before[before.length - streak];
180
+ points.push({
181
+ kind: 'collapse',
182
+ t: first.start,
183
+ fight: first.index,
184
+ member: null,
185
+ count: streak,
186
+ });
187
+ }
188
+ else if (last) {
189
+ points.push({
190
+ kind: 'final_fight',
191
+ t: last.start,
192
+ fight: last.index,
193
+ member: null,
194
+ count: last.ourDowns - last.enemyDowns,
195
+ });
196
+ }
197
+ }
198
+ const costly = [...story.fights].sort((left, right) => right.ourDowns - right.enemyDowns - (left.ourDowns - left.enemyDowns) ||
199
+ right.ourDowns - left.ourDowns)[0];
200
+ if (costly &&
201
+ costly.ourDowns >= 2 &&
202
+ costly.ourDowns > costly.enemyDowns &&
203
+ !points.some((point) => point.fight === costly.index && point.kind !== 'first_loss')) {
204
+ points.push({
205
+ kind: 'costly',
206
+ t: costly.start,
207
+ fight: costly.index,
208
+ member: null,
209
+ count: costly.ourDowns - costly.enemyDowns,
210
+ });
211
+ }
212
+ const decisive = [...story.fights].sort((left, right) => right.enemyDowns - right.ourDowns - (left.enemyDowns - left.ourDowns) ||
213
+ right.enemyDowns - left.enemyDowns)[0];
214
+ if (decisive && decisive.enemyDowns >= 2 && decisive.enemyDowns > decisive.ourDowns) {
215
+ points.push({
216
+ kind: 'decisive',
217
+ t: decisive.start,
218
+ fight: decisive.index,
219
+ member: null,
220
+ count: decisive.enemyDowns - decisive.ourDowns,
221
+ });
222
+ }
223
+ return points.sort((left, right) => left.t - right.t);
224
+ }
225
+ // ---------------------------------------------------------------------------------------------------------------
226
+ // Rotating with the circle
227
+ const GRID_SECONDS = 10;
228
+ /** Not inside the white circle when the wall started to close, or never inside. */
229
+ function isLate(epoch) {
230
+ return (epoch.enteredAfter === null ||
231
+ (epoch.shrinkAfter !== null && epoch.enteredAfter > epoch.shrinkAfter));
232
+ }
233
+ export function buildRotation(story, blueDamage) {
234
+ const empty = {
235
+ epochs: [],
236
+ blueSeconds: 0,
237
+ blueDamage: 0,
238
+ distance: 0,
239
+ vehicleShare: null,
240
+ landingToFight: null,
241
+ lateEntries: 0,
242
+ circlesChecked: 0,
243
+ };
244
+ if (!story.players.length || !story.circle.length)
245
+ return empty;
246
+ const routes = story.players.map((player) => ({
247
+ player,
248
+ route: player.route.map((point) => ({
249
+ t: point.t,
250
+ x: point.x,
251
+ y: point.y,
252
+ vehicle: point.vehicle,
253
+ blue: point.blue === true,
254
+ })),
255
+ }));
256
+ const centroidAt = (t) => {
257
+ const spots = routes
258
+ .filter(({ player }) => aliveAt(player, t))
259
+ .map(({ route }) => positionAt(route, t, GRID_SECONDS * 2))
260
+ .filter((spot) => spot !== null);
261
+ if (!spots.length)
262
+ return null;
263
+ return {
264
+ x: spots.reduce((sum, spot) => sum + spot.x, 0) / spots.length,
265
+ y: spots.reduce((sum, spot) => sum + spot.y, 0) / spots.length,
266
+ members: spots.length,
267
+ };
268
+ };
269
+ const flagsAt = (t) => {
270
+ let inBlue = false;
271
+ let samples = 0;
272
+ let vehicle = 0;
273
+ for (const { player, route } of routes) {
274
+ if (!aliveAt(player, t))
275
+ continue;
276
+ const near = route.filter((point) => Math.abs(point.t - t) <= GRID_SECONDS / 2 + 0.01);
277
+ if (!near.length)
278
+ continue;
279
+ samples += 1;
280
+ if (near.some((point) => point.blue))
281
+ inBlue = true;
282
+ if (near.some((point) => point.vehicle))
283
+ vehicle += 1;
284
+ }
285
+ return { inBlue, samples, vehicle };
286
+ };
287
+ const epochs = [];
288
+ for (const point of story.circle) {
289
+ if (!point.warn || (point.phase ?? 0) < 1)
290
+ continue;
291
+ const previous = epochs.at(-1);
292
+ if (!previous ||
293
+ Math.abs(previous.zone.x - point.warn.x) > 1 ||
294
+ Math.abs(previous.zone.y - point.warn.y) > 1 ||
295
+ Math.abs(previous.zone.r - point.warn.r) > 1)
296
+ epochs.push({ phase: point.phase, start: point.t, zone: point.warn });
297
+ }
298
+ const horizon = story.squadOutAt ?? story.durationSeconds;
299
+ const result = [];
300
+ let totalVehicle = 0;
301
+ let totalSamples = 0;
302
+ for (let index = 0; index < epochs.length; index += 1) {
303
+ const epoch = epochs[index];
304
+ const end = Math.min(epochs[index + 1]?.start ?? story.durationSeconds, horizon);
305
+ if (epoch.start >= horizon)
306
+ break;
307
+ const first = centroidAt(epoch.start);
308
+ if (!first)
309
+ continue;
310
+ const outsideAtStart = Math.max(0, Math.hypot(first.x - epoch.zone.x, first.y - epoch.zone.y) - epoch.zone.r);
311
+ let enteredAfter = outsideAtStart === 0 ? 0 : null;
312
+ // The wall starts to close at the first circle sample whose gas radius is smaller than the one before it.
313
+ let shrinkAfter = null;
314
+ let lastWall = null;
315
+ for (const point of story.circle) {
316
+ if (point.t < epoch.start || point.t >= end || !point.zone)
317
+ continue;
318
+ if (lastWall !== null && point.zone.r < lastWall - 1) {
319
+ shrinkAfter = Math.round(point.t - epoch.start);
320
+ break;
321
+ }
322
+ lastWall = point.zone.r;
323
+ }
324
+ let blueSeconds = 0;
325
+ let distance = 0;
326
+ let vehicle = 0;
327
+ let samples = 0;
328
+ let previous = null;
329
+ for (let t = epoch.start; t < end; t += GRID_SECONDS) {
330
+ const spot = centroidAt(t);
331
+ if (!spot)
332
+ continue;
333
+ if (enteredAfter === null &&
334
+ Math.hypot(spot.x - epoch.zone.x, spot.y - epoch.zone.y) <= epoch.zone.r)
335
+ enteredAfter = Math.round(t - epoch.start);
336
+ const flags = flagsAt(t);
337
+ if (flags.inBlue)
338
+ blueSeconds += GRID_SECONDS;
339
+ vehicle += flags.vehicle;
340
+ samples += flags.samples;
341
+ if (previous)
342
+ distance += Math.hypot(spot.x - previous.x, spot.y - previous.y);
343
+ previous = spot;
344
+ }
345
+ totalVehicle += vehicle;
346
+ totalSamples += samples;
347
+ result.push({
348
+ phase: epoch.phase,
349
+ start: epoch.start,
350
+ end,
351
+ radius: Math.round(epoch.zone.r),
352
+ outsideAtStart: Math.round(outsideAtStart),
353
+ enteredAfter,
354
+ shrinkAfter,
355
+ margin: shrinkAfter !== null && enteredAfter !== null ? shrinkAfter - enteredAfter : null,
356
+ blueSeconds,
357
+ blueDamage: Math.round(blueDamage
358
+ .filter((item) => item.t >= epoch.start && item.t < end)
359
+ .reduce((sum, item) => sum + item.amount, 0)),
360
+ distance: Math.round(distance),
361
+ vehicleShare: samples ? vehicle / samples : null,
362
+ });
363
+ }
364
+ const checked = result.filter((item) => (item.phase ?? 0) >= 3 && item.end - item.start >= 30);
365
+ const landing = story.players
366
+ .map((player) => player.landing?.t)
367
+ .filter((value) => value !== undefined)
368
+ .sort((left, right) => left - right)[0];
369
+ const firstFight = story.fights[0];
370
+ return {
371
+ epochs: result,
372
+ blueSeconds: result.reduce((sum, item) => sum + item.blueSeconds, 0),
373
+ blueDamage: Math.round(blueDamage.filter((item) => item.t <= horizon).reduce((sum, item) => sum + item.amount, 0)),
374
+ distance: result.reduce((sum, item) => sum + item.distance, 0),
375
+ vehicleShare: totalSamples ? totalVehicle / totalSamples : null,
376
+ landingToFight: landing !== undefined && firstFight
377
+ ? Math.max(0, Math.round(firstFight.start - landing))
378
+ : null,
379
+ lateEntries: checked.filter(isLate).length,
380
+ circlesChecked: checked.length,
381
+ };
382
+ }
383
+ export function summarizeDowns(items, names) {
384
+ const all = items.flatMap((item) => item.downs);
385
+ const counts = new Map();
386
+ for (const down of all) {
387
+ const entry = counts.get(down.cause) ?? { count: 0, died: 0 };
388
+ entry.count += 1;
389
+ if (down.outcome === 'died')
390
+ entry.died += 1;
391
+ counts.set(down.cause, entry);
392
+ }
393
+ const known = all.filter((down) => down.alone !== null);
394
+ const decided = all.filter((down) => down.outcome !== 'unknown');
395
+ const playerDowns = all.filter((down) => down.cause !== 'environment' && down.cause !== 'bluezone');
396
+ const members = new Map();
397
+ for (const down of all) {
398
+ const bucket = members.get(down.member) ?? new Map();
399
+ bucket.set(down.cause, (bucket.get(down.cause) ?? 0) + 1);
400
+ members.set(down.member, bucket);
401
+ }
402
+ const stageOf = (phase) => (phase === null || phase < 3 ? 'early' : phase < 5 ? 'mid' : 'late');
403
+ const byStage = ['early', 'mid', 'late'].map((stage) => {
404
+ const group = playerDowns.filter((down) => stageOf(down.phase) === stage);
405
+ return {
406
+ stage,
407
+ downs: group.length,
408
+ noReturnFire: group.filter((down) => down.returnDamage === 0).length,
409
+ };
410
+ });
411
+ const byCause = DOWN_CAUSES.map((cause) => ({
412
+ cause: cause.key,
413
+ label: cause.label,
414
+ advice: cause.advice,
415
+ count: counts.get(cause.key)?.count ?? 0,
416
+ share: all.length ? (counts.get(cause.key)?.count ?? 0) / all.length : 0,
417
+ died: counts.get(cause.key)?.died ?? 0,
418
+ }))
419
+ .filter((entry) => entry.count > 0)
420
+ .sort((left, right) => right.count - left.count);
421
+ const insights = [];
422
+ if (all.length >= 20) {
423
+ const noReturn = playerDowns.filter((down) => down.returnDamage === 0);
424
+ if (playerDowns.length >= 15)
425
+ insights.push(`被玩家击倒的 ${playerDowns.length} 次里,${((noReturn.length / playerDowns.length) * 100).toFixed(0)}% 在倒地前 ${DOWN_LOOKBACK_SECONDS} 秒内没有任何还手——大多数倒地发生在先手被打的一刻,而不是对枪输了。`);
426
+ const top = byCause[0];
427
+ if (top && top.share >= 0.25)
428
+ insights.push(`最常见的倒地原因是「${top.label}」(${(top.share * 100).toFixed(0)}%)。${top.advice}`);
429
+ const aloneKnown = known.filter((down) => down.cause !== 'environment' && down.cause !== 'bluezone');
430
+ const alone = aloneKnown.filter((down) => down.alone === true);
431
+ if (aloneKnown.length >= 15 && alone.length / aloneKnown.length >= 0.2)
432
+ insights.push(`${((alone.length / aloneKnown.length) * 100).toFixed(0)}% 的倒地发生时身边 ${DOWN_ALONE_METERS} 米内没有队友,落单是明显的风险。`);
433
+ if (decided.length >= 15) {
434
+ const revived = decided.filter((down) => down.outcome === 'revived').length;
435
+ insights.push(`倒地后 ${((revived / decided.length) * 100).toFixed(0)}% 被救起,其余被淘汰。`);
436
+ }
437
+ const alonePlayers = [...members.entries()]
438
+ .map(([member, bucket]) => ({
439
+ member,
440
+ total: [...bucket.values()].reduce((sum, value) => sum + value, 0),
441
+ isolated: bucket.get('isolated') ?? 0,
442
+ }))
443
+ .filter((entry) => entry.total >= 10 && entry.isolated / entry.total >= 0.25);
444
+ for (const entry of alonePlayers)
445
+ insights.push(`${names.get(entry.member) ?? '某队员'} 有 ${((entry.isolated / entry.total) * 100).toFixed(0)}% 的倒地是落单造成的。`);
446
+ }
447
+ return {
448
+ matches: items.length,
449
+ downs: all.length,
450
+ byCause,
451
+ alone: wilsonInterval(known.filter((down) => down.alone === true).length, known.length),
452
+ revived: wilsonInterval(decided.filter((down) => down.outcome === 'revived').length, decided.length),
453
+ noReturnFire: wilsonInterval(playerDowns.filter((down) => down.returnDamage === 0).length, playerDowns.length),
454
+ byMember: [...members.entries()]
455
+ .map(([member, bucket]) => ({
456
+ member,
457
+ downs: [...bucket.values()].reduce((sum, value) => sum + value, 0),
458
+ causes: [...bucket.entries()]
459
+ .map(([cause, count]) => ({ cause, count }))
460
+ .sort((left, right) => right.count - left.count),
461
+ }))
462
+ .sort((left, right) => right.downs - left.downs),
463
+ byStage,
464
+ insights,
465
+ };
466
+ }
467
+ /**
468
+ * Descriptive only. Comparing placement between matches with much and little gas damage would be misleading: a squad
469
+ * that survives longer goes through more circles and so takes more gas, which makes the gas look good for placement.
470
+ */
471
+ export function summarizeRotation(items) {
472
+ const rotations = items.map((item) => item.rotation).filter((item) => item.epochs.length > 0);
473
+ const avg = (values) => values.length ? values.reduce((sum, value) => sum + value, 0) / values.length : null;
474
+ const median = (values) => {
475
+ if (!values.length)
476
+ return null;
477
+ const sorted = [...values].sort((left, right) => left - right);
478
+ const mid = Math.floor(sorted.length / 2);
479
+ return sorted.length % 2 ? sorted[mid] : (sorted[mid - 1] + sorted[mid]) / 2;
480
+ };
481
+ const phases = new Map();
482
+ for (const rotation of rotations)
483
+ for (const epoch of rotation.epochs)
484
+ if (epoch.phase !== null)
485
+ phases.set(epoch.phase, [...(phases.get(epoch.phase) ?? []), epoch]);
486
+ const lateTotals = rotations.reduce((sum, item) => ({
487
+ late: sum.late + item.lateEntries,
488
+ checked: sum.checked + item.circlesChecked,
489
+ }), { late: 0, checked: 0 });
490
+ const blueHurt = rotations.filter((item) => item.blueDamage > 0).length;
491
+ const summary = {
492
+ matches: rotations.length,
493
+ bluePenaltyRate: wilsonInterval(blueHurt, rotations.length),
494
+ averageBlueDamage: avg(rotations.map((item) => item.blueDamage)),
495
+ averageBlueSeconds: avg(rotations.map((item) => item.blueSeconds)),
496
+ averageDistanceKm: avg(rotations.map((item) => item.distance / 1000)),
497
+ vehicleShare: avg(rotations.map((item) => item.vehicleShare).filter((value) => value !== null)),
498
+ averageLandingToFight: avg(rotations
499
+ .map((item) => item.landingToFight)
500
+ .filter((value) => value !== null)),
501
+ lateEntry: wilsonInterval(lateTotals.late, lateTotals.checked),
502
+ averageMargin: avg(rotations.flatMap((item) => item.epochs
503
+ .filter((epoch) => (epoch.phase ?? 0) >= 3)
504
+ .map((epoch) => epoch.margin)
505
+ .filter((value) => value !== null))),
506
+ byPhase: [...phases.entries()]
507
+ .sort((left, right) => left[0] - right[0])
508
+ .map(([phase, list]) => {
509
+ const entered = list
510
+ .map((item) => item.enteredAfter)
511
+ .filter((value) => value !== null);
512
+ return {
513
+ phase,
514
+ circles: list.length,
515
+ lateRate: list.length ? list.filter(isLate).length / list.length : null,
516
+ medianEnter: median(entered),
517
+ averageMargin: avg(list.map((item) => item.margin).filter((value) => value !== null)),
518
+ averageOutside: avg(list.map((item) => item.outsideAtStart)),
519
+ averageDistance: avg(list.map((item) => item.distance)),
520
+ };
521
+ }),
522
+ insights: [],
523
+ };
524
+ if (rotations.length >= 20) {
525
+ if (summary.lateEntry.rate !== null && summary.lateEntry.trials >= 40)
526
+ summary.insights.push(`第 3 圈起,${(summary.lateEntry.rate * 100).toFixed(0)}% 的圈是在毒圈开始收缩之后才进到白圈里的(或始终没进去);平均提前 ${Math.round(summary.averageMargin ?? 0)} 秒到位。`);
527
+ if (summary.bluePenaltyRate.rate !== null)
528
+ summary.insights.push(`${(summary.bluePenaltyRate.rate * 100).toFixed(0)}% 的对局小队吃到过毒圈伤害,场均 ${(summary.averageBlueDamage ?? 0).toFixed(0)} 点。`);
529
+ const worst = summary.byPhase
530
+ .filter((item) => item.circles >= 15 && item.lateRate !== null)
531
+ .sort((left, right) => right.lateRate - left.lateRate)[0];
532
+ if (worst && worst.lateRate >= 0.3)
533
+ summary.insights.push(`最容易转晚的是第 ${worst.phase} 圈:${(worst.lateRate * 100).toFixed(0)}% 的对局在毒圈开始收缩时还没进到白圈。`);
534
+ if (summary.averageLandingToFight !== null)
535
+ summary.insights.push(`落地后平均 ${Math.round(summary.averageLandingToFight)} 秒打响第一场交战。`);
536
+ }
537
+ return summary;
538
+ }
539
+ export function downCauseLabel(cause) {
540
+ return DOWN_CAUSES.find((item) => item.key === cause)?.label ?? cause;
541
+ }
542
+ //# sourceMappingURL=match-insight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"match-insight.js","sourceRoot":"","sources":["../../src/match-insight.ts"],"names":[],"mappings":"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"}