@rine-kit/pubg-domain 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 (127) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +38 -2
  3. package/dist/config/default-team.json +27 -0
  4. package/dist/src/config/chicken-index.d.ts +9 -0
  5. package/dist/src/config/chicken-index.js +37 -0
  6. package/dist/src/config/chicken-index.js.map +1 -0
  7. package/dist/src/config/team.d.ts +22 -0
  8. package/dist/src/config/team.js +69 -0
  9. package/dist/src/config/team.js.map +1 -0
  10. package/dist/src/context/context-store.d.ts +40 -0
  11. package/dist/src/context/context-store.js +119 -0
  12. package/dist/src/context/context-store.js.map +1 -0
  13. package/dist/src/context/team-context.d.ts +13 -0
  14. package/dist/src/context/team-context.js +16 -0
  15. package/dist/src/context/team-context.js.map +1 -0
  16. package/dist/src/core.d.ts +23 -0
  17. package/dist/src/core.js +24 -0
  18. package/dist/src/core.js.map +1 -0
  19. package/dist/src/data/model.d.ts +123 -0
  20. package/dist/src/data/model.js +100 -0
  21. package/dist/src/data/model.js.map +1 -0
  22. package/dist/src/data/pubg-api-client.d.ts +59 -0
  23. package/dist/src/data/pubg-api-client.js +441 -0
  24. package/dist/src/data/pubg-api-client.js.map +1 -0
  25. package/dist/src/engine/query-engine.d.ts +20 -0
  26. package/dist/src/engine/query-engine.js +765 -0
  27. package/dist/src/engine/query-engine.js.map +1 -0
  28. package/dist/src/index.d.ts +27 -0
  29. package/dist/src/index.js +28 -0
  30. package/dist/src/index.js.map +1 -0
  31. package/dist/src/migration/importer.d.ts +35 -0
  32. package/dist/src/migration/importer.js +229 -0
  33. package/dist/src/migration/importer.js.map +1 -0
  34. package/dist/src/review/combat-scope.d.ts +11 -0
  35. package/dist/src/review/combat-scope.js +101 -0
  36. package/dist/src/review/combat-scope.js.map +1 -0
  37. package/dist/src/review/event-combination-engine.d.ts +17 -0
  38. package/dist/src/review/event-combination-engine.js +534 -0
  39. package/dist/src/review/event-combination-engine.js.map +1 -0
  40. package/dist/src/review/fight-detector.d.ts +4 -0
  41. package/dist/src/review/fight-detector.js +138 -0
  42. package/dist/src/review/fight-detector.js.map +1 -0
  43. package/dist/src/review/fight-integrity-validator.d.ts +13 -0
  44. package/dist/src/review/fight-integrity-validator.js +134 -0
  45. package/dist/src/review/fight-integrity-validator.js.map +1 -0
  46. package/dist/src/review/fun-candidate-generator.d.ts +9 -0
  47. package/dist/src/review/fun-candidate-generator.js +267 -0
  48. package/dist/src/review/fun-candidate-generator.js.map +1 -0
  49. package/dist/src/review/fun-event-generator.d.ts +8 -0
  50. package/dist/src/review/fun-event-generator.js +740 -0
  51. package/dist/src/review/fun-event-generator.js.map +1 -0
  52. package/dist/src/review/fun-intelligence.d.ts +13 -0
  53. package/dist/src/review/fun-intelligence.js +20 -0
  54. package/dist/src/review/fun-intelligence.js.map +1 -0
  55. package/dist/src/review/fun-ranker.d.ts +13 -0
  56. package/dist/src/review/fun-ranker.js +68 -0
  57. package/dist/src/review/fun-ranker.js.map +1 -0
  58. package/dist/src/review/heavy-weapon-intelligence.d.ts +5 -0
  59. package/dist/src/review/heavy-weapon-intelligence.js +215 -0
  60. package/dist/src/review/heavy-weapon-intelligence.js.map +1 -0
  61. package/dist/src/review/key-operation-detector.d.ts +3 -0
  62. package/dist/src/review/key-operation-detector.js +126 -0
  63. package/dist/src/review/key-operation-detector.js.map +1 -0
  64. package/dist/src/review/match-selector.d.ts +18 -0
  65. package/dist/src/review/match-selector.js +202 -0
  66. package/dist/src/review/match-selector.js.map +1 -0
  67. package/dist/src/review/review-analyzer.d.ts +2 -0
  68. package/dist/src/review/review-analyzer.js +652 -0
  69. package/dist/src/review/review-analyzer.js.map +1 -0
  70. package/dist/src/review/review-facts.d.ts +17 -0
  71. package/dist/src/review/review-facts.js +560 -0
  72. package/dist/src/review/review-facts.js.map +1 -0
  73. package/dist/src/review/review-share.d.ts +48 -0
  74. package/dist/src/review/review-share.js +37 -0
  75. package/dist/src/review/review-share.js.map +1 -0
  76. package/dist/src/review/selection-store.d.ts +25 -0
  77. package/dist/src/review/selection-store.js +80 -0
  78. package/dist/src/review/selection-store.js.map +1 -0
  79. package/dist/src/review/session-review.d.ts +72 -0
  80. package/dist/src/review/session-review.js +492 -0
  81. package/dist/src/review/session-review.js.map +1 -0
  82. package/dist/src/review/special-events.d.ts +3 -0
  83. package/dist/src/review/special-events.js +258 -0
  84. package/dist/src/review/special-events.js.map +1 -0
  85. package/dist/src/review/subgraph.d.ts +26 -0
  86. package/dist/src/review/subgraph.js +146 -0
  87. package/dist/src/review/subgraph.js.map +1 -0
  88. package/dist/src/review/supplemental-intelligence.d.ts +15 -0
  89. package/dist/src/review/supplemental-intelligence.js +431 -0
  90. package/dist/src/review/supplemental-intelligence.js.map +1 -0
  91. package/dist/src/review/team-damage.d.ts +8 -0
  92. package/dist/src/review/team-damage.js +180 -0
  93. package/dist/src/review/team-damage.js.map +1 -0
  94. package/dist/src/review/telemetry-events.d.ts +72 -0
  95. package/dist/src/review/telemetry-events.js +573 -0
  96. package/dist/src/review/telemetry-events.js.map +1 -0
  97. package/dist/src/review/telemetry.d.ts +86 -0
  98. package/dist/src/review/telemetry.js +266 -0
  99. package/dist/src/review/telemetry.js.map +1 -0
  100. package/dist/src/review/types.d.ts +501 -0
  101. package/dist/src/review/types.js +2 -0
  102. package/dist/src/review/types.js.map +1 -0
  103. package/dist/src/review/vehicle-intelligence.d.ts +3 -0
  104. package/dist/src/review/vehicle-intelligence.js +148 -0
  105. package/dist/src/review/vehicle-intelligence.js.map +1 -0
  106. package/dist/src/schema/query.d.ts +876 -0
  107. package/dist/src/schema/query.js +185 -0
  108. package/dist/src/schema/query.js.map +1 -0
  109. package/dist/src/schema/status.d.ts +66 -0
  110. package/dist/src/schema/status.js +49 -0
  111. package/dist/src/schema/status.js.map +1 -0
  112. package/dist/src/service/pubg-domain-service.d.ts +192 -0
  113. package/dist/src/service/pubg-domain-service.js +1598 -0
  114. package/dist/src/service/pubg-domain-service.js.map +1 -0
  115. package/dist/src/storage/repository-port.d.ts +84 -0
  116. package/dist/src/storage/repository-port.js +2 -0
  117. package/dist/src/storage/repository-port.js.map +1 -0
  118. package/dist/src/storage/sqlite-repository-adapter.d.ts +33 -0
  119. package/dist/src/storage/sqlite-repository-adapter.js +66 -0
  120. package/dist/src/storage/sqlite-repository-adapter.js.map +1 -0
  121. package/dist/src/storage/sqlite-repository.d.ts +73 -0
  122. package/dist/src/storage/sqlite-repository.js +652 -0
  123. package/dist/src/storage/sqlite-repository.js.map +1 -0
  124. package/dist/src/time/selector-resolver.d.ts +34 -0
  125. package/dist/src/time/selector-resolver.js +364 -0
  126. package/dist/src/time/selector-resolver.js.map +1 -0
  127. package/package.json +42 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-damage.js","sourceRoot":"","sources":["../../../src/review/team-damage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ import type { NormalizedMatch } from '../data/model.js';
2
+ export type NormalizedTelemetryEventType = 'ATTACK' | 'DAMAGE' | 'KNOCK' | 'KILL' | 'REVIVE' | 'ITEM_ACQUIRE' | 'ITEM_DROP' | 'ITEM_USE' | 'ITEM_LOOT' | 'ITEM_TRUNK_PUT' | 'ITEM_TRUNK_PICKUP' | 'ITEM_ATTACH' | 'ITEM_DETACH' | 'THROWABLE_USE' | 'HEAL' | 'ARMOR_DESTROY' | 'WHEEL_DESTROY' | 'OBJECT_INTERACTION' | 'OBJECT_DESTROY' | 'VAULT' | 'VEHICLE_RIDE' | 'VEHICLE_LEAVE' | 'VEHICLE_DAMAGE' | 'VEHICLE_DESTROY' | 'POSITION';
3
+ export type TelemetryEventPhase = 'pre_match' | 'in_match' | 'unknown';
4
+ export type MeleeKind = 'PUNCH' | 'KICK' | 'OTHER';
5
+ export interface TelemetryLocation {
6
+ label: string | null;
7
+ x: number | null;
8
+ y: number | null;
9
+ z: number | null;
10
+ reliable: boolean;
11
+ }
12
+ export interface NormalizedTelemetryEvent {
13
+ id: string;
14
+ type: NormalizedTelemetryEventType;
15
+ rawType: string;
16
+ timeSeconds: number | null;
17
+ /** Set only from a reliable absolute/relative timestamp signal. */
18
+ phase?: TelemetryEventPhase;
19
+ actorId: string | null;
20
+ victimId: string | null;
21
+ actorTeamId: string | null;
22
+ victimTeamId: string | null;
23
+ weaponId: string | null;
24
+ damageTypeCategory?: string | null;
25
+ itemId: string | null;
26
+ vehicleId: string | null;
27
+ vehicleType: string | null;
28
+ attackId: string | null;
29
+ dbnoId: string | null;
30
+ damage: number;
31
+ vehicleDamage: number;
32
+ kills: number;
33
+ knocks: number;
34
+ hit: boolean;
35
+ seatIndex: number | null;
36
+ driverConfirmed: boolean | null;
37
+ passengerConfirmed: boolean | null;
38
+ speed: number | null;
39
+ distanceMeters: number | null;
40
+ location: TelemetryLocation | null;
41
+ /** Supplemental telemetry fields; omitted by old cached facts. */
42
+ healAmount?: number;
43
+ health?: number | null;
44
+ blueZone?: boolean | null;
45
+ redZone?: boolean | null;
46
+ specialZone?: string | null;
47
+ itemCategory?: string | null;
48
+ itemSubCategory?: string | null;
49
+ stackCount?: number | null;
50
+ ownerTeamId?: string | null;
51
+ creatorId?: string | null;
52
+ parentItemId?: string | null;
53
+ childItemId?: string | null;
54
+ damageReason?: string | null;
55
+ wheelIndex?: number | null;
56
+ objectType?: string | null;
57
+ objectStatus?: string | null;
58
+ isLedgeGrab?: boolean | null;
59
+ isVaultOnVehicle?: boolean | null;
60
+ }
61
+ export declare function parseTelemetryPayload(value: unknown): unknown[];
62
+ export declare function isHeavyWeapon(weapon: string | null): boolean;
63
+ export declare function meleeKindOf(weapon: string | null, damageCategory?: string | null): MeleeKind;
64
+ export declare function isPunchWeapon(weapon: string | null, damageCategory?: string | null): boolean;
65
+ export declare function isKickWeapon(weapon: string | null, damageCategory?: string | null): boolean;
66
+ export declare function isMeleeWeapon(weapon: string | null, damageCategory?: string | null): boolean;
67
+ export declare function isFlashWeapon(weapon: string | null): boolean;
68
+ export declare function isExplosiveWeapon(weapon: string | null): boolean;
69
+ export declare function isVehicleWeapon(event: Pick<NormalizedTelemetryEvent, 'type' | 'vehicleId' | 'vehicleType' | 'weaponId' | 'rawType'> & {
70
+ damageTypeCategory?: string | null;
71
+ }): boolean;
72
+ export declare function normalizeTelemetryEvents(value: unknown, match: NormalizedMatch): NormalizedTelemetryEvent[];
@@ -0,0 +1,573 @@
1
+ import { gunzipSync } from 'node:zlib';
2
+ function objectValue(value) {
3
+ return value && typeof value === 'object' && !Array.isArray(value) ? value : {};
4
+ }
5
+ function stringValue(value) {
6
+ if (value === null ||
7
+ value === undefined ||
8
+ value === '' ||
9
+ (typeof value === 'object' && value !== null))
10
+ return null;
11
+ const text = String(value).trim();
12
+ return text || null;
13
+ }
14
+ function firstString(...values) {
15
+ for (const value of values) {
16
+ const result = stringValue(value);
17
+ if (result)
18
+ return result;
19
+ }
20
+ return null;
21
+ }
22
+ function numberValue(value) {
23
+ if (value === null || value === undefined || value === '')
24
+ return null;
25
+ const parsed = Number(value);
26
+ return Number.isFinite(parsed) ? parsed : null;
27
+ }
28
+ function booleanValue(value) {
29
+ if (typeof value === 'boolean')
30
+ return value;
31
+ if (typeof value === 'string' && /^(?:true|false)$/iu.test(value.trim()))
32
+ return value.trim().toLowerCase() === 'true';
33
+ return null;
34
+ }
35
+ function correlationId(value) {
36
+ const id = stringValue(value);
37
+ // PUBG uses -1 for an event without a usable attack/DBNO correlation.
38
+ return id && id !== '-1' ? id : null;
39
+ }
40
+ function entityId(value) {
41
+ const entity = objectValue(value);
42
+ return firstString(entity.accountId, entity.account_id, entity.playerId, entity.name, entity.playerName, value);
43
+ }
44
+ function firstEntity(event, keys) {
45
+ for (const key of keys) {
46
+ const value = entityId(event[key]);
47
+ if (value)
48
+ return value;
49
+ }
50
+ return null;
51
+ }
52
+ function firstEntityObject(event, keys) {
53
+ for (const key of keys) {
54
+ const value = event[key];
55
+ if (entityId(value))
56
+ return objectValue(value);
57
+ }
58
+ return null;
59
+ }
60
+ function entityTeamId(value) {
61
+ return firstString(value?.teamId, value?.team_id);
62
+ }
63
+ function rawType(event) {
64
+ return stringValue(event._T ?? event.type ?? event.eventType ?? event.name) ?? '';
65
+ }
66
+ function eventType(type) {
67
+ const normalized = type.replace(/^Log/u, '').toLowerCase();
68
+ if (normalized.includes('itempickupfromlootbox'))
69
+ return 'ITEM_LOOT';
70
+ if (normalized.includes('itempickupfromvehicletrunk'))
71
+ return 'ITEM_TRUNK_PICKUP';
72
+ if (normalized.includes('itemputtovehicletrunk'))
73
+ return 'ITEM_TRUNK_PUT';
74
+ if (normalized.includes('itemuse'))
75
+ return 'ITEM_USE';
76
+ if (normalized.includes('itemattach'))
77
+ return 'ITEM_ATTACH';
78
+ if (normalized.includes('itemdetach'))
79
+ return 'ITEM_DETACH';
80
+ if (normalized === 'heal' || normalized.includes('playerheal'))
81
+ return 'HEAL';
82
+ if (normalized.includes('armordestroy'))
83
+ return 'ARMOR_DESTROY';
84
+ if (normalized.includes('wheeldestroy'))
85
+ return 'WHEEL_DESTROY';
86
+ if (normalized.includes('objectinteraction'))
87
+ return 'OBJECT_INTERACTION';
88
+ if (normalized.includes('objectdestroy') || normalized.includes('destroyprop'))
89
+ return 'OBJECT_DESTROY';
90
+ if (normalized.includes('vaultstart'))
91
+ return 'VAULT';
92
+ if (normalized.includes('playerattack') || normalized === 'weaponfire')
93
+ return 'ATTACK';
94
+ if (normalized.includes('playerdamage') || normalized.includes('takedamage'))
95
+ return 'DAMAGE';
96
+ if (normalized.includes('makegroggy') || normalized.includes('knock'))
97
+ return 'KNOCK';
98
+ if (normalized.includes('playerkill') || normalized === 'kill')
99
+ return 'KILL';
100
+ if (normalized.includes('playerrevive') || normalized.includes('revive'))
101
+ return 'REVIVE';
102
+ if (normalized.includes('itempickup') || normalized.includes('itemacquire'))
103
+ return 'ITEM_ACQUIRE';
104
+ if (normalized.includes('itemdrop'))
105
+ return 'ITEM_DROP';
106
+ if (normalized.includes('playerusethrowable') || normalized.includes('throwableuse'))
107
+ return 'THROWABLE_USE';
108
+ if (normalized.includes('vehicleride') || normalized.includes('vehicleenter'))
109
+ return 'VEHICLE_RIDE';
110
+ if (normalized.includes('vehicleleave') || normalized.includes('vehicleexit'))
111
+ return 'VEHICLE_LEAVE';
112
+ if (normalized.includes('vehicledamage'))
113
+ return 'VEHICLE_DAMAGE';
114
+ if (normalized.includes('vehicledestroy'))
115
+ return 'VEHICLE_DESTROY';
116
+ if (normalized.includes('playerposition') || normalized.includes('position'))
117
+ return 'POSITION';
118
+ return null;
119
+ }
120
+ function parseClock(value) {
121
+ const parts = value.split(':').map(Number);
122
+ if (parts.some((part) => !Number.isFinite(part)) || parts.length < 2 || parts.length > 3)
123
+ return null;
124
+ if (parts.length === 3)
125
+ return parts[0] * 3600 + parts[1] * 60 + parts[2];
126
+ return parts[0] * 60 + parts[1];
127
+ }
128
+ function epochMilliseconds(value) {
129
+ const numeric = numberValue(value);
130
+ if (numeric === null)
131
+ return null;
132
+ if (numeric > 100_000_000_000)
133
+ return numeric;
134
+ if (numeric > 1_000_000_000)
135
+ return numeric * 1000;
136
+ return null;
137
+ }
138
+ function matchStartMilliseconds(match) {
139
+ const fromCreatedAt = Date.parse(String(match.createdAt ?? ''));
140
+ if (Number.isFinite(fromCreatedAt))
141
+ return fromCreatedAt;
142
+ return epochMilliseconds(match.timestamp);
143
+ }
144
+ function absoluteEventSeconds(event, match) {
145
+ const matchMs = matchStartMilliseconds(match);
146
+ if (matchMs === null)
147
+ return null;
148
+ for (const value of [event._D, event.timestamp, event.createdAt, event.time]) {
149
+ const text = typeof value === 'string' ? value.trim() : '';
150
+ if (!text || /^\d{1,2}:\d{2}(?::\d{2})?$/u.test(text))
151
+ continue;
152
+ const eventMs = epochMilliseconds(value) ?? (typeof value === 'string' ? Date.parse(value) : Number.NaN);
153
+ if (!Number.isFinite(eventMs))
154
+ continue;
155
+ const delta = (eventMs - matchMs) / 1000;
156
+ // Do not turn a pre-match/invalid absolute value into a synthetic 00:00.
157
+ if (delta >= 0 && delta < 24 * 60 * 60)
158
+ return delta;
159
+ }
160
+ return null;
161
+ }
162
+ function eventPhase(event, match) {
163
+ const gamePhase = commonGamePhase(event);
164
+ if (gamePhase)
165
+ return gamePhase;
166
+ const matchMs = matchStartMilliseconds(match);
167
+ if (matchMs !== null) {
168
+ for (const value of [event._D, event.timestamp, event.createdAt, event.time]) {
169
+ const text = typeof value === 'string' ? value.trim() : '';
170
+ if (!text || /^\d{1,2}:\d{2}(?::\d{2})?$/u.test(text))
171
+ continue;
172
+ const eventMs = epochMilliseconds(value) ?? (typeof value === 'string' ? Date.parse(value) : Number.NaN);
173
+ if (!Number.isFinite(eventMs))
174
+ continue;
175
+ const delta = (eventMs - matchMs) / 1000;
176
+ if (delta >= 0 && delta < 24 * 60 * 60)
177
+ return 'in_match';
178
+ if (delta < 0 && delta >= -24 * 60 * 60)
179
+ return 'pre_match';
180
+ }
181
+ }
182
+ const rawValues = [event._D, event.timestamp, event.createdAt, event.time];
183
+ for (const raw of rawValues) {
184
+ const rawText = typeof raw === 'string' ? raw.trim() : '';
185
+ if (/^\d{1,2}:\d{2}(?::\d{2})?$/u.test(rawText) && (parseClock(rawText) ?? 0) > 0)
186
+ return 'in_match';
187
+ }
188
+ const common = objectValue(event.common);
189
+ const relative = [
190
+ event.timeSeconds,
191
+ event.elapsedSeconds,
192
+ event.gameTime,
193
+ event.game_time,
194
+ event.elapsedTime,
195
+ common.elapsedTime,
196
+ ]
197
+ .map(numberValue)
198
+ .find((value) => value !== null && value > 0 && value < 24 * 60 * 60);
199
+ return relative === undefined ? 'unknown' : 'in_match';
200
+ }
201
+ /** PUBG's common.isGame is the blue-zone/safe-zone phase, not a clock. */
202
+ function commonGamePhase(event) {
203
+ const raw = objectValue(event.common).isGame;
204
+ if (typeof raw === 'boolean')
205
+ return raw ? 'in_match' : 'pre_match';
206
+ const value = numberValue(raw);
207
+ if (value === null)
208
+ return null;
209
+ if (value >= 0 && value < 1)
210
+ return 'pre_match';
211
+ // PUBG documents 1.0 as the first safe zone and each 0.5 step thereafter
212
+ // as a blue-zone transition. All values >=1 are in-match phases.
213
+ if (value >= 1)
214
+ return 'in_match';
215
+ return null;
216
+ }
217
+ function timeSeconds(event, match) {
218
+ const common = objectValue(event.common);
219
+ const absolute = absoluteEventSeconds(event, match);
220
+ if (absolute !== null)
221
+ return absolute;
222
+ const rawValues = [event._D, event.timestamp, event.createdAt, event.time];
223
+ for (const raw of rawValues) {
224
+ const rawText = typeof raw === 'string' ? raw.trim() : '';
225
+ if (/^\d{1,2}:\d{2}(?::\d{2})?$/u.test(rawText)) {
226
+ const clock = parseClock(rawText);
227
+ if (clock !== null && clock > 0)
228
+ return clock;
229
+ }
230
+ }
231
+ // Explicit game-clock fields are usable only when they carry a positive
232
+ // value. A zero from a position record is commonly a missing timestamp.
233
+ const explicitRelative = [
234
+ event.timeSeconds,
235
+ event.elapsedSeconds,
236
+ event.gameTime,
237
+ event.game_time,
238
+ ]
239
+ .map(numberValue)
240
+ .find((value) => value !== null && value > 0 && value < 24 * 60 * 60);
241
+ if (explicitRelative !== undefined)
242
+ return explicitRelative;
243
+ const elapsed = numberValue(event.elapsedTime ?? common.elapsedTime);
244
+ if (elapsed !== null && elapsed > 0 && elapsed < 24 * 60 * 60)
245
+ return elapsed;
246
+ // A small numeric `_D` is not a documented absolute timestamp and is not
247
+ // safe to reinterpret as a game clock.
248
+ return null;
249
+ }
250
+ function locationOf(event) {
251
+ const candidate = event.location ??
252
+ event.position ??
253
+ objectValue(event.character).location ??
254
+ objectValue(event.attacker).location ??
255
+ objectValue(event.victim).location ??
256
+ objectValue(event.vehicle).location;
257
+ const location = objectValue(candidate);
258
+ const nested = objectValue(location.location ?? location.position);
259
+ const source = Object.keys(nested).length ? nested : location;
260
+ const x = numberValue(source.x ?? source.X);
261
+ const y = numberValue(source.y ?? source.Y);
262
+ const z = numberValue(source.z ?? source.Z);
263
+ const label = stringValue(source.name ?? source.label ?? source.locationName);
264
+ if (x === null && y === null && z === null && !label)
265
+ return null;
266
+ return { label, x, y, z, reliable: Boolean(label) };
267
+ }
268
+ function damageInfoObjects(event) {
269
+ return [
270
+ event.damageInfo,
271
+ event.killerDamageInfo,
272
+ event.finishDamageInfo,
273
+ event.dBNODamageInfo,
274
+ event.dbnoDamageInfo,
275
+ ].map(objectValue);
276
+ }
277
+ function weaponId(event) {
278
+ const weapon = objectValue(event.weapon);
279
+ const damageCauser = objectValue(event.damageCauser);
280
+ const damageInfos = damageInfoObjects(event);
281
+ return stringValue(firstString(event.weaponId, event.weapon_id, weapon.itemId, weapon.item_id, weapon.name, event.damageCauserName, event.damageCauser, damageCauser.itemId, damageCauser.name, ...damageInfos.flatMap((info) => [
282
+ info.damageCauserName,
283
+ info.damageCauser,
284
+ info.itemId,
285
+ info.item_id,
286
+ info.name,
287
+ ]), typeof event.weapon === 'string' ? event.weapon : null));
288
+ }
289
+ function damageTypeCategory(event) {
290
+ return firstString(event.damageTypeCategory, ...damageInfoObjects(event).map((info) => info.damageTypeCategory));
291
+ }
292
+ function itemId(event) {
293
+ const item = objectValue(event.item);
294
+ return stringValue(event.itemId ?? event.item_id ?? item.itemId ?? item.item_id ?? item.name);
295
+ }
296
+ function vehicleId(event) {
297
+ const vehicles = [
298
+ event.vehicle,
299
+ event.killerVehicle,
300
+ event.attackerVehicle,
301
+ event.victimVehicle,
302
+ event.vehicleInfo,
303
+ ].map(objectValue);
304
+ return firstString(event.vehicleId, event.vehicle_id, ...vehicles.flatMap((vehicle) => [vehicle.id, vehicle.vehicleId, vehicle.vehicle_id]), typeof event.vehicle === 'string' ? event.vehicle : null);
305
+ }
306
+ function vehicleType(event) {
307
+ const vehicles = [
308
+ event.vehicle,
309
+ event.killerVehicle,
310
+ event.attackerVehicle,
311
+ event.victimVehicle,
312
+ event.vehicleInfo,
313
+ ].map(objectValue);
314
+ return firstString(event.vehicleType, ...vehicles.flatMap((vehicle) => [vehicle.vehicleType, vehicle.type]));
315
+ }
316
+ function toBuffer(value) {
317
+ if (Buffer.isBuffer(value))
318
+ return value;
319
+ if (value instanceof Uint8Array)
320
+ return Buffer.from(value);
321
+ return null;
322
+ }
323
+ export function parseTelemetryPayload(value) {
324
+ const buffer = toBuffer(value);
325
+ if (buffer) {
326
+ const decoded = buffer.length >= 2 && buffer[0] === 0x1f && buffer[1] === 0x8b ? gunzipSync(buffer) : buffer;
327
+ return parseTelemetryPayload(decoded.toString('utf8'));
328
+ }
329
+ if (typeof value === 'string') {
330
+ try {
331
+ return parseTelemetryPayload(JSON.parse(value));
332
+ }
333
+ catch {
334
+ return [];
335
+ }
336
+ }
337
+ if (Array.isArray(value))
338
+ return value;
339
+ const object = objectValue(value);
340
+ if (Array.isArray(object.events))
341
+ return object.events;
342
+ if (Array.isArray(object.data))
343
+ return object.data;
344
+ if (Array.isArray(object.telemetry))
345
+ return object.telemetry;
346
+ return [];
347
+ }
348
+ export function isHeavyWeapon(weapon) {
349
+ return Boolean(weapon && /panzer|rocket|rpg|m79|m203|grenade_launcher/i.test(weapon));
350
+ }
351
+ function normalizedWeapon(value) {
352
+ return (value ?? '')
353
+ .replace(/^Item_Weapon_/iu, '')
354
+ .replace(/^Weap/iu, '')
355
+ .replace(/_C$/iu, '')
356
+ .toLowerCase();
357
+ }
358
+ export function meleeKindOf(weapon, damageCategory = null) {
359
+ const value = normalizedWeapon(weapon);
360
+ const category = normalizedWeapon(damageCategory);
361
+ // Damage_Kick and Damage_Punch are authoritative. PUBG commonly reports
362
+ // both with PlayerMale/PlayerFemale as the causer, so causer-name fallback
363
+ // must never turn an explicit kick into a punch.
364
+ if (/damage[_-]?kick/u.test(category))
365
+ return 'KICK';
366
+ if (/damage[_-]?punch/u.test(category))
367
+ return 'PUNCH';
368
+ if (/player(?:male|female)[_-]?a/u.test(value) ||
369
+ /fist|punch|barehand|unarmed|meleehand/u.test(value))
370
+ return 'PUNCH';
371
+ return 'OTHER';
372
+ }
373
+ export function isPunchWeapon(weapon, damageCategory = null) {
374
+ return meleeKindOf(weapon, damageCategory) === 'PUNCH';
375
+ }
376
+ export function isKickWeapon(weapon, damageCategory = null) {
377
+ return meleeKindOf(weapon, damageCategory) === 'KICK';
378
+ }
379
+ export function isMeleeWeapon(weapon, damageCategory = null) {
380
+ const value = normalizedWeapon(weapon);
381
+ const category = normalizedWeapon(damageCategory);
382
+ return (meleeKindOf(weapon, damageCategory) !== 'OTHER' ||
383
+ /damage[_-]?(?:melee|meleethrow)/u.test(category) ||
384
+ /pickaxe|pan(?:projectile)?|machete|sickle|crowbar|sword|melee/u.test(value));
385
+ }
386
+ export function isFlashWeapon(weapon) {
387
+ const value = normalizedWeapon(weapon);
388
+ return /flashbang|flash_grenade|flashgrenade|stungrenade|stun_grenade/u.test(value);
389
+ }
390
+ export function isExplosiveWeapon(weapon) {
391
+ const value = normalizedWeapon(weapon);
392
+ return (isHeavyWeapon(weapon) ||
393
+ /frag|grenade|molotov|incendiary|c4|stickybomb|explosive|smoke/u.test(value));
394
+ }
395
+ export function isVehicleWeapon(event) {
396
+ if (event.type === 'VEHICLE_DAMAGE')
397
+ return true;
398
+ // LogPlayerTakeDamage/MakeGroggy often omit vehicleId and expose the
399
+ // collision actor only through damageCauserName (normalized as weaponId).
400
+ // Vehicle metadata alone is not enough: a passenger can have a vehicle
401
+ // object while firing a gun. Prefer an explicit collision category/causer,
402
+ // and use an ID-only fallback only when no weapon/category contradicts it.
403
+ const weapon = (event.weaponId ?? '').toLowerCase();
404
+ const category = (event.damageTypeCategory ?? '').toLowerCase();
405
+ const causer = `${weapon} ${category}`;
406
+ if (/damage[_-]?(?:vehicle|vehiclehit|vehiclecrashhit)|collision|runover/u.test(causer))
407
+ return true;
408
+ if (/dacia|buggy|uaz|boat|motorcycle|motorbike|coupe|vantage|roadglide|snowmobile|tuk|truck|van|jeep|quad|scooter|bp_.*_c/u.test(weapon))
409
+ return true;
410
+ if ((event.type === 'KNOCK' || event.type === 'KILL') &&
411
+ Boolean(event.vehicleId || event.vehicleType) &&
412
+ !weapon &&
413
+ !category)
414
+ return true;
415
+ return ((event.type === 'DAMAGE' || event.type === 'KNOCK' || event.type === 'KILL') &&
416
+ Boolean(event.vehicleId) &&
417
+ !weapon &&
418
+ !category);
419
+ }
420
+ function normalizeEvent(event, index, match) {
421
+ const raw = rawType(event);
422
+ const type = eventType(raw);
423
+ if (!type)
424
+ return null;
425
+ const actorKeys = {
426
+ ATTACK: ['attacker', 'character', 'player'],
427
+ DAMAGE: ['attacker', 'character', 'player'],
428
+ KNOCK: ['attacker', 'dBNOMaker', 'character', 'player'],
429
+ KILL: ['killer', 'finisher', 'attacker', 'dBNOMaker', 'character', 'player'],
430
+ REVIVE: ['reviver', 'character', 'player'],
431
+ ITEM_ACQUIRE: ['character', 'player'],
432
+ ITEM_DROP: ['character', 'player'],
433
+ ITEM_USE: ['character', 'player'],
434
+ ITEM_LOOT: ['character', 'player'],
435
+ ITEM_TRUNK_PUT: ['character', 'player'],
436
+ ITEM_TRUNK_PICKUP: ['character', 'player'],
437
+ ITEM_ATTACH: ['character', 'player'],
438
+ ITEM_DETACH: ['character', 'player'],
439
+ THROWABLE_USE: ['attacker', 'character', 'player'],
440
+ HEAL: ['character', 'player'],
441
+ ARMOR_DESTROY: ['attacker', 'character', 'player'],
442
+ WHEEL_DESTROY: ['attacker', 'character', 'player'],
443
+ OBJECT_INTERACTION: ['character', 'player'],
444
+ OBJECT_DESTROY: ['attacker', 'character', 'player'],
445
+ VAULT: ['character', 'player'],
446
+ VEHICLE_RIDE: ['character', 'player'],
447
+ VEHICLE_LEAVE: ['character', 'player'],
448
+ VEHICLE_DAMAGE: ['attacker', 'character', 'player'],
449
+ VEHICLE_DESTROY: ['attacker', 'destroyer', 'character', 'player'],
450
+ POSITION: ['character', 'player'],
451
+ };
452
+ // PUBG damage/kill events identify the actor and victim separately. Never
453
+ // fall back to `player` here: on LogPlayerTakeDamage that field can be the
454
+ // attacker, which would fabricate self-damage and false fight participants.
455
+ const victim = firstEntity(event, [
456
+ 'victim',
457
+ 'target',
458
+ 'damagedPlayer',
459
+ 'victimCharacter',
460
+ 'attackedCharacter',
461
+ ]);
462
+ const actorEntity = firstEntityObject(event, actorKeys[type]);
463
+ const victimEntity = firstEntityObject(event, [
464
+ 'victim',
465
+ 'target',
466
+ 'damagedPlayer',
467
+ 'victimCharacter',
468
+ 'attackedCharacter',
469
+ ]);
470
+ const vehicles = [
471
+ event.vehicle,
472
+ event.killerVehicle,
473
+ event.attackerVehicle,
474
+ event.vehicleInfo,
475
+ ].map(objectValue);
476
+ const speed = numberValue(event.speed ??
477
+ event.maxSpeed ??
478
+ vehicles.map((vehicle) => vehicle.maxSpeed).find((value) => value !== undefined));
479
+ const distanceCandidate = numberValue(event.distanceMeters ?? event.rideDistance ?? event.distance);
480
+ const distanceMeters = distanceCandidate !== null && distanceCandidate >= 0 ? distanceCandidate : null;
481
+ const category = damageTypeCategory(event);
482
+ const normalizedVehicleId = vehicleId(event);
483
+ const normalizedVehicleType = vehicleType(event);
484
+ const normalizedType = type;
485
+ const normalizedDamage = numberValue(event.damage ?? event.damageAmount ?? event.totalDamage) ?? 0;
486
+ const normalizedVehicleDamage = numberValue(event.vehicleDamage ?? event.damageToVehicle) ??
487
+ (normalizedType === 'VEHICLE_DAMAGE' ? normalizedDamage : 0);
488
+ const character = objectValue(event.character);
489
+ const item = objectValue(event.item);
490
+ const parentItem = objectValue(event.parentItem);
491
+ const childItem = objectValue(event.childItem);
492
+ const object = objectValue(event.object ?? event.destroyedObject ?? event.prop);
493
+ const objectType = firstString(event.objectType, event.object_type, event.propType, event.prop_type, event.objectName, event.propName, object.type, object.objectType, object.name);
494
+ const objectStatus = firstString(event.objectTypeStatus, event.objectStatus, event.status);
495
+ return {
496
+ id: `telemetry-${index + 1}`,
497
+ type,
498
+ rawType: raw,
499
+ timeSeconds: timeSeconds(event, match),
500
+ phase: eventPhase(event, match),
501
+ actorId: firstEntity(event, actorKeys[type]),
502
+ victimId: victim,
503
+ actorTeamId: entityTeamId(actorEntity),
504
+ victimTeamId: entityTeamId(victimEntity),
505
+ weaponId: weaponId(event),
506
+ damageTypeCategory: category,
507
+ itemId: itemId(event),
508
+ vehicleId: normalizedVehicleId,
509
+ vehicleType: normalizedVehicleType,
510
+ attackId: correlationId(event.attackId ?? event.attack_id ?? event.shotId),
511
+ dbnoId: correlationId(event.dBNOId ?? event.dbnoId ?? event.dbno_id ?? event.dBNOID),
512
+ damage: normalizedDamage,
513
+ vehicleDamage: normalizedVehicleDamage,
514
+ kills: type === 'KILL' ? 1 : 0,
515
+ knocks: type === 'KNOCK' ? 1 : 0,
516
+ hit: type === 'DAMAGE'
517
+ ? normalizedDamage > 0 || event.hit === true
518
+ : type === 'VEHICLE_DAMAGE'
519
+ ? normalizedVehicleDamage > 0 || normalizedDamage > 0 || event.hit === true
520
+ : Boolean(event.hit),
521
+ seatIndex: numberValue(event.seatIndex ??
522
+ event.seat ??
523
+ character.seatIndex ??
524
+ character.seat ??
525
+ vehicles
526
+ .map((vehicle) => vehicle.seatIndex ?? vehicle.seat)
527
+ .find((value) => value !== undefined)),
528
+ driverConfirmed: booleanValue(event.driverConfirmed ??
529
+ event.isDriver ??
530
+ event.is_driver ??
531
+ event.driver ??
532
+ vehicles
533
+ .map((vehicle) => vehicle.isDriver ?? vehicle.is_driver ?? vehicle.driver)
534
+ .find((value) => value !== undefined)),
535
+ passengerConfirmed: booleanValue(event.passengerConfirmed ??
536
+ event.isPassenger ??
537
+ event.is_passenger ??
538
+ event.passenger ??
539
+ vehicles
540
+ .map((vehicle) => vehicle.isPassenger ?? vehicle.is_passenger ?? vehicle.passenger)
541
+ .find((value) => value !== undefined)),
542
+ speed,
543
+ distanceMeters,
544
+ location: locationOf(event),
545
+ healAmount: numberValue(event.healAmount) ?? 0,
546
+ health: numberValue(character.health),
547
+ blueZone: booleanValue(character.isInBlueZone),
548
+ redZone: booleanValue(character.isInRedZone),
549
+ specialZone: stringValue(character.inSpecialZone),
550
+ itemCategory: stringValue(item.category),
551
+ itemSubCategory: stringValue(item.subCategory),
552
+ stackCount: numberValue(item.stackCount),
553
+ ownerTeamId: firstString(event.ownerTeamId, event.owner_team_id),
554
+ creatorId: firstString(event.creatorAccountId, event.creator_account_id),
555
+ parentItemId: firstString(parentItem.itemId, parentItem.item_id),
556
+ childItemId: firstString(childItem.itemId, childItem.item_id),
557
+ damageReason: firstString(event.damageReason, event.damage_reason),
558
+ wheelIndex: numberValue(event.wheelIndex),
559
+ objectType,
560
+ objectStatus,
561
+ isLedgeGrab: booleanValue(event.isLedgeGrab),
562
+ isVaultOnVehicle: booleanValue(event.isVaultOnVehicle),
563
+ };
564
+ }
565
+ export function normalizeTelemetryEvents(value, match) {
566
+ return parseTelemetryPayload(value)
567
+ .filter((item) => Boolean(item && typeof item === 'object' && !Array.isArray(item)))
568
+ .map((item, index) => normalizeEvent(item, index, match))
569
+ .filter((item) => item !== null)
570
+ .sort((left, right) => (left.timeSeconds ?? Number.POSITIVE_INFINITY) -
571
+ (right.timeSeconds ?? Number.POSITIVE_INFINITY) || left.id.localeCompare(right.id));
572
+ }
573
+ //# sourceMappingURL=telemetry-events.js.map