@axiapps/bridge-metrics 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 (86) hide show
  1. package/dist/aggregationTypes.cjs +18 -0
  2. package/dist/aggregationTypes.d.cts +21 -0
  3. package/dist/aggregationTypes.d.ts +21 -0
  4. package/dist/aggregationTypes.js +1 -0
  5. package/dist/boonGeneration.cjs +308 -0
  6. package/dist/boonGeneration.d.cts +65 -0
  7. package/dist/boonGeneration.d.ts +65 -0
  8. package/dist/boonGeneration.js +16 -0
  9. package/dist/chunk-42DVJJLC.js +106 -0
  10. package/dist/chunk-4F55Q6K2.js +0 -0
  11. package/dist/chunk-ELKDB763.js +349 -0
  12. package/dist/chunk-FU74LJEM.js +77 -0
  13. package/dist/chunk-J3YCFY3C.js +37 -0
  14. package/dist/chunk-JP2ZL44R.js +18 -0
  15. package/dist/chunk-K2SRAMGC.js +0 -0
  16. package/dist/chunk-KRHODGVU.js +48 -0
  17. package/dist/chunk-LIGIXSSA.js +1383 -0
  18. package/dist/chunk-M2WR3JBQ.js +0 -0
  19. package/dist/chunk-PMVLNDZZ.js +279 -0
  20. package/dist/chunk-R5EJF5AW.js +147 -0
  21. package/dist/chunk-RGXSI3AI.js +298 -0
  22. package/dist/chunk-UFJJ6WLD.js +197 -0
  23. package/dist/chunk-WW5XFXGC.js +234 -0
  24. package/dist/chunk-ZFZS7JFU.js +10 -0
  25. package/dist/combatMetrics.cjs +251 -0
  26. package/dist/combatMetrics.d.cts +26 -0
  27. package/dist/combatMetrics.d.ts +26 -0
  28. package/dist/combatMetrics.js +21 -0
  29. package/dist/computePlayerAggregation.cjs +2042 -0
  30. package/dist/computePlayerAggregation.d.cts +249 -0
  31. package/dist/computePlayerAggregation.d.ts +249 -0
  32. package/dist/computePlayerAggregation.js +30 -0
  33. package/dist/conditionsMetrics.cjs +328 -0
  34. package/dist/conditionsMetrics.d.cts +67 -0
  35. package/dist/conditionsMetrics.d.ts +67 -0
  36. package/dist/conditionsMetrics.js +18 -0
  37. package/dist/constants.cjs +36 -0
  38. package/dist/constants.d.cts +18 -0
  39. package/dist/constants.d.ts +18 -0
  40. package/dist/constants.js +10 -0
  41. package/dist/dashboardMetrics.cjs +226 -0
  42. package/dist/dashboardMetrics.d.cts +29 -0
  43. package/dist/dashboardMetrics.d.ts +29 -0
  44. package/dist/dashboardMetrics.js +42 -0
  45. package/dist/dpsReportTypes.cjs +18 -0
  46. package/dist/dpsReportTypes.d.cts +294 -0
  47. package/dist/dpsReportTypes.d.ts +294 -0
  48. package/dist/dpsReportTypes.js +1 -0
  49. package/dist/index.cjs +2902 -0
  50. package/dist/index.d.cts +13 -0
  51. package/dist/index.d.ts +13 -0
  52. package/dist/index.js +152 -0
  53. package/dist/metrics-methods.json +38 -0
  54. package/dist/metricsSettings.cjs +75 -0
  55. package/dist/metricsSettings.d.cts +23 -0
  56. package/dist/metricsSettings.d.ts +23 -0
  57. package/dist/metricsSettings.js +8 -0
  58. package/dist/professionUtils.cjs +265 -0
  59. package/dist/professionUtils.d.cts +10 -0
  60. package/dist/professionUtils.d.ts +10 -0
  61. package/dist/professionUtils.js +20 -0
  62. package/dist/reportMetrics.cjs +224 -0
  63. package/dist/reportMetrics.d.cts +85 -0
  64. package/dist/reportMetrics.d.ts +85 -0
  65. package/dist/reportMetrics.js +12 -0
  66. package/dist/resUtility.cjs +52 -0
  67. package/dist/resUtility.d.cts +5 -0
  68. package/dist/resUtility.d.ts +5 -0
  69. package/dist/resUtility.js +8 -0
  70. package/dist/roles.cjs +18 -0
  71. package/dist/roles.d.cts +17 -0
  72. package/dist/roles.d.ts +17 -0
  73. package/dist/roles.js +1 -0
  74. package/dist/rollup.cjs +378 -0
  75. package/dist/rollup.d.cts +103 -0
  76. package/dist/rollup.d.ts +103 -0
  77. package/dist/rollup.js +16 -0
  78. package/dist/statsMetrics.cjs +153 -0
  79. package/dist/statsMetrics.d.cts +39 -0
  80. package/dist/statsMetrics.d.ts +39 -0
  81. package/dist/statsMetrics.js +22 -0
  82. package/dist/timestampUtils.cjs +63 -0
  83. package/dist/timestampUtils.d.cts +12 -0
  84. package/dist/timestampUtils.d.ts +12 -0
  85. package/dist/timestampUtils.js +9 -0
  86. package/package.json +44 -0
@@ -0,0 +1,234 @@
1
+ // src/professionUtils.ts
2
+ var PROFESSION_COLORS = {
3
+ "Guardian": "#72C1D9",
4
+ "Dragonhunter": "#72C1D9",
5
+ "Firebrand": "#72C1D9",
6
+ "Willbender": "#72C1D9",
7
+ "Revenant": "#D16E5A",
8
+ "Herald": "#D16E5A",
9
+ "Renegade": "#D16E5A",
10
+ "Vindicator": "#D16E5A",
11
+ "Warrior": "#FFD166",
12
+ "Berserker": "#FFD166",
13
+ "Spellbreaker": "#FFD166",
14
+ "Bladesworn": "#FFD166",
15
+ "Engineer": "#D09C59",
16
+ "Scrapper": "#D09C59",
17
+ "Holosmith": "#D09C59",
18
+ "Mechanist": "#D09C59",
19
+ "Ranger": "#8CDC82",
20
+ "Druid": "#8CDC82",
21
+ "Soulbeast": "#8CDC82",
22
+ "Untamed": "#8CDC82",
23
+ "Thief": "#C08F95",
24
+ "Daredevil": "#C08F95",
25
+ "Deadeye": "#C08F95",
26
+ "Specter": "#C08F95",
27
+ "Elementalist": "#F68A87",
28
+ "Tempest": "#F68A87",
29
+ "Weaver": "#F68A87",
30
+ "Catalyst": "#F68A87",
31
+ "Mesmer": "#B679D5",
32
+ "Chronomancer": "#B679D5",
33
+ "Mirage": "#B679D5",
34
+ "Virtuoso": "#B679D5",
35
+ "Necromancer": "#52A76F",
36
+ "Reaper": "#52A76F",
37
+ "Scourge": "#52A76F",
38
+ "Harbinger": "#52A76F",
39
+ "Ritualist": "#52A76F",
40
+ "Luminary": "#72C1D9",
41
+ "Conduit": "#D16E5A",
42
+ "Paragon": "#FFD166",
43
+ "Amalgam": "#D09C59",
44
+ "Galeshot": "#8CDC82",
45
+ "Antiquary": "#C08F95",
46
+ "Evoker": "#F68A87",
47
+ "Troubadour": "#B679D5",
48
+ "Unknown": "#64748B"
49
+ };
50
+ var PROFESSION_BASE = {
51
+ Guardian: "Guardian",
52
+ Dragonhunter: "Guardian",
53
+ Firebrand: "Guardian",
54
+ Willbender: "Guardian",
55
+ Revenant: "Revenant",
56
+ Herald: "Revenant",
57
+ Renegade: "Revenant",
58
+ Vindicator: "Revenant",
59
+ Warrior: "Warrior",
60
+ Berserker: "Warrior",
61
+ Spellbreaker: "Warrior",
62
+ Bladesworn: "Warrior",
63
+ Engineer: "Engineer",
64
+ Scrapper: "Engineer",
65
+ Holosmith: "Engineer",
66
+ Mechanist: "Engineer",
67
+ Ranger: "Ranger",
68
+ Druid: "Ranger",
69
+ Soulbeast: "Ranger",
70
+ Untamed: "Ranger",
71
+ Thief: "Thief",
72
+ Daredevil: "Thief",
73
+ Deadeye: "Thief",
74
+ Specter: "Thief",
75
+ Elementalist: "Elementalist",
76
+ Tempest: "Elementalist",
77
+ Weaver: "Elementalist",
78
+ Catalyst: "Elementalist",
79
+ Mesmer: "Mesmer",
80
+ Chronomancer: "Mesmer",
81
+ Mirage: "Mesmer",
82
+ Virtuoso: "Mesmer",
83
+ Necromancer: "Necromancer",
84
+ Reaper: "Necromancer",
85
+ Scourge: "Necromancer",
86
+ Harbinger: "Necromancer",
87
+ Ritualist: "Necromancer",
88
+ Luminary: "Guardian",
89
+ Conduit: "Revenant",
90
+ Paragon: "Warrior",
91
+ Amalgam: "Engineer",
92
+ Galeshot: "Ranger",
93
+ Antiquary: "Thief",
94
+ Evoker: "Elementalist",
95
+ Troubadour: "Mesmer",
96
+ Unknown: "Unknown"
97
+ };
98
+ var PROFESSION_ABBREVIATIONS = {
99
+ Guardian: "gdn",
100
+ Dragonhunter: "dh",
101
+ Firebrand: "fb",
102
+ Willbender: "wb",
103
+ Revenant: "rev",
104
+ Herald: "her",
105
+ Renegade: "ren",
106
+ Vindicator: "vin",
107
+ Warrior: "war",
108
+ Berserker: "ber",
109
+ Spellbreaker: "spb",
110
+ Bladesworn: "bsw",
111
+ Engineer: "eng",
112
+ Scrapper: "scr",
113
+ Holosmith: "hol",
114
+ Mechanist: "mec",
115
+ Ranger: "rng",
116
+ Druid: "dru",
117
+ Soulbeast: "slb",
118
+ Untamed: "unt",
119
+ Thief: "thi",
120
+ Daredevil: "dar",
121
+ Deadeye: "dea",
122
+ Specter: "spe",
123
+ Elementalist: "ele",
124
+ Tempest: "tem",
125
+ Weaver: "wev",
126
+ Catalyst: "cat",
127
+ Mesmer: "mes",
128
+ Chronomancer: "chr",
129
+ Mirage: "mir",
130
+ Virtuoso: "vir",
131
+ Necromancer: "nec",
132
+ Reaper: "rea",
133
+ Scourge: "sco",
134
+ Harbinger: "har",
135
+ Ritualist: "rit",
136
+ Luminary: "lum",
137
+ Conduit: "con",
138
+ Paragon: "par",
139
+ Amalgam: "ama",
140
+ Galeshot: "gal",
141
+ Antiquary: "ant",
142
+ Evoker: "evo",
143
+ Troubadour: "tro",
144
+ Unknown: "unk"
145
+ };
146
+ var PROFESSION_EMOJI = {
147
+ Guardian: "\u{1F535}",
148
+ Revenant: "\u{1F534}",
149
+ Warrior: "\u{1F7E1}",
150
+ Engineer: "\u{1F7E0}",
151
+ Ranger: "\u{1F7E2}",
152
+ Thief: "\u26AB\uFE0F",
153
+ Elementalist: "\u{1F534}",
154
+ Mesmer: "\u{1F7E3}",
155
+ Necromancer: "\u{1F7E2}",
156
+ Unknown: "\u26AA\uFE0F"
157
+ };
158
+ function getProfessionColor(profession) {
159
+ return PROFESSION_COLORS[profession] || PROFESSION_COLORS["Unknown"];
160
+ }
161
+ function hexToRgba(hex, alpha) {
162
+ const h = hex.replace("#", "");
163
+ const r = parseInt(h.substring(0, 2), 16);
164
+ const g = parseInt(h.substring(2, 4), 16);
165
+ const b = parseInt(h.substring(4, 6), 16);
166
+ return `rgba(${r},${g},${b},${alpha})`;
167
+ }
168
+ function getProfessionBase(profession) {
169
+ if (!profession) return "Unknown";
170
+ return PROFESSION_BASE[profession] || profession;
171
+ }
172
+ function getProfessionAbbrev(profession) {
173
+ if (!profession) return PROFESSION_ABBREVIATIONS.Unknown;
174
+ return PROFESSION_ABBREVIATIONS[profession] || profession.slice(0, 3).toLowerCase();
175
+ }
176
+ function getProfessionEmoji(profession) {
177
+ const base = getProfessionBase(profession);
178
+ return PROFESSION_EMOJI[base] || PROFESSION_EMOJI.Unknown;
179
+ }
180
+ var SUPERSCRIPT_MAP = {
181
+ a: "\u1D43",
182
+ b: "\u1D47",
183
+ c: "\u1D9C",
184
+ d: "\u1D48",
185
+ e: "\u1D49",
186
+ f: "\u1DA0",
187
+ g: "\u1D4D",
188
+ h: "\u02B0",
189
+ i: "\u2071",
190
+ j: "\u02B2",
191
+ k: "\u1D4F",
192
+ l: "\u02E1",
193
+ m: "\u1D50",
194
+ n: "\u207F",
195
+ o: "\u1D52",
196
+ p: "\u1D56",
197
+ q: "\u146B",
198
+ r: "\u02B3",
199
+ s: "\u02E2",
200
+ t: "\u1D57",
201
+ u: "\u1D58",
202
+ v: "\u1D5B",
203
+ w: "\u02B7",
204
+ x: "\u02E3",
205
+ y: "\u02B8",
206
+ z: "\u1DBB",
207
+ "0": "\u2070",
208
+ "1": "\xB9",
209
+ "2": "\xB2",
210
+ "3": "\xB3",
211
+ "4": "\u2074",
212
+ "5": "\u2075",
213
+ "6": "\u2076",
214
+ "7": "\u2077",
215
+ "8": "\u2078",
216
+ "9": "\u2079"
217
+ };
218
+ function toSuperscript(value) {
219
+ return value.toLowerCase().split("").map((char) => SUPERSCRIPT_MAP[char] || char).join("");
220
+ }
221
+ function getProfessionAbbrevSuperscript(profession) {
222
+ return toSuperscript(getProfessionAbbrev(profession));
223
+ }
224
+
225
+ export {
226
+ PROFESSION_COLORS,
227
+ getProfessionColor,
228
+ hexToRgba,
229
+ getProfessionBase,
230
+ getProfessionAbbrev,
231
+ getProfessionEmoji,
232
+ toSuperscript,
233
+ getProfessionAbbrevSuperscript
234
+ };
@@ -0,0 +1,10 @@
1
+ // src/constants.ts
2
+ var TIMESTAMP_MS_THRESHOLD = 1e12;
3
+ var STABILITY_BOON_ID = 1122;
4
+ var BULK_PROCESS_CONCURRENCY = 3;
5
+
6
+ export {
7
+ TIMESTAMP_MS_THRESHOLD,
8
+ STABILITY_BOON_ID,
9
+ BULK_PROCESS_CONCURRENCY
10
+ };
@@ -0,0 +1,251 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/combatMetrics.ts
21
+ var combatMetrics_exports = {};
22
+ __export(combatMetrics_exports, {
23
+ applySquadStabilityGeneration: () => applySquadStabilityGeneration,
24
+ computeDownContribution: () => computeDownContribution,
25
+ computeIncomingDisruptions: () => computeIncomingDisruptions,
26
+ computeOutgoingCrowdControl: () => computeOutgoingCrowdControl,
27
+ computeSquadBarrier: () => computeSquadBarrier,
28
+ computeSquadHealing: () => computeSquadHealing,
29
+ resolveDisruptionValue: () => resolveDisruptionValue
30
+ });
31
+ module.exports = __toCommonJS(combatMetrics_exports);
32
+
33
+ // src/boonGeneration.ts
34
+ var CATEGORY_COUNT = {
35
+ selfBuffs: () => 1,
36
+ groupBuffs: (groupCount) => Math.max(groupCount - 1, 0),
37
+ squadBuffs: (_groupCount, squadCount) => Math.max(squadCount - 1, 0)
38
+ };
39
+ var toBoonId = (id) => `b${id}`;
40
+ var computeGenerationMs = (category, stacking, generation, wasted, durationMs, groupCount, squadCount) => {
41
+ const count = CATEGORY_COUNT[category](groupCount, squadCount);
42
+ if (!count || !durationMs) {
43
+ return { generationMs: 0, wastedMs: 0 };
44
+ }
45
+ if (stacking) {
46
+ return {
47
+ generationMs: generation * durationMs * count,
48
+ wastedMs: wasted * durationMs * count
49
+ };
50
+ }
51
+ return {
52
+ generationMs: generation / 100 * durationMs * count,
53
+ wastedMs: wasted / 100 * durationMs * count
54
+ };
55
+ };
56
+ var getPlayerBoonGenerationMs = (player, category, boonId, durationMs, groupCount, squadCount, buffMap = {}) => {
57
+ const buffs = player?.[category] || [];
58
+ const target = buffs.find((buff) => buff.id === boonId);
59
+ if (!target) {
60
+ return { generationMs: 0, wastedMs: 0 };
61
+ }
62
+ const meta = buffMap[toBoonId(boonId)];
63
+ const stacking = meta?.stacking ?? false;
64
+ const generation = target.buffData?.[0]?.generation ?? 0;
65
+ const wasted = target.buffData?.[0]?.wasted ?? 0;
66
+ return computeGenerationMs(category, stacking, generation, wasted, durationMs, groupCount, squadCount);
67
+ };
68
+
69
+ // src/metrics-methods.json
70
+ var metrics_methods_default = {
71
+ specVersion: "v5",
72
+ methods: {
73
+ count: {
74
+ label: "Count Events",
75
+ summary: "Counts each CC/strip event once.",
76
+ implications: [
77
+ "Simple and stable across EI versions.",
78
+ "Multi-hit skills can inflate totals."
79
+ ]
80
+ },
81
+ duration: {
82
+ label: "Duration (Seconds)",
83
+ summary: "Uses total CC/strip duration in seconds.",
84
+ implications: [
85
+ "Reflects control impact more directly.",
86
+ "Totals represent time, not event count."
87
+ ]
88
+ },
89
+ tiered: {
90
+ label: "Tiered Impact",
91
+ summary: "Weights events based on average duration tiers.",
92
+ implications: [
93
+ "Balances short vs long CC/strip effects.",
94
+ "Uses averaged durations per player."
95
+ ],
96
+ tiers: {
97
+ shortMs: 500,
98
+ mediumMs: 1500,
99
+ weights: {
100
+ short: 0.5,
101
+ medium: 1,
102
+ long: 2
103
+ }
104
+ }
105
+ }
106
+ }
107
+ };
108
+
109
+ // src/metricsSettings.ts
110
+ var METRICS_SPEC = metrics_methods_default;
111
+ var DEFAULT_DISRUPTION_METHOD = "count";
112
+
113
+ // src/constants.ts
114
+ var STABILITY_BOON_ID = 1122;
115
+
116
+ // src/combatMetrics.ts
117
+ var toSeconds = (ms) => (ms || 0) / 1e3;
118
+ var applyTierWeight = (count, durationMs) => {
119
+ if (!count) return 0;
120
+ const tiers = METRICS_SPEC.methods.tiered?.tiers;
121
+ if (!tiers) return count;
122
+ const avg = durationMs / Math.max(count, 1);
123
+ if (avg <= tiers.shortMs) return count * tiers.weights.short;
124
+ if (avg <= tiers.mediumMs) return count * tiers.weights.medium;
125
+ return count * tiers.weights.long;
126
+ };
127
+ var resolveDisruptionValue = (count, durationMs, method) => {
128
+ if (method === "duration") return toSeconds(durationMs);
129
+ if (method === "tiered") return applyTierWeight(count, durationMs);
130
+ return count;
131
+ };
132
+ function computeOutgoingCrowdControl(player, method = DEFAULT_DISRUPTION_METHOD) {
133
+ const stats = player.statsAll?.[0];
134
+ const count = Number(stats?.appliedCrowdControl ?? 0);
135
+ const durationMs = Number(stats?.appliedCrowdControlDuration ?? 0);
136
+ return resolveDisruptionValue(count, durationMs, method);
137
+ }
138
+ function computeIncomingDisruptions(player, method = DEFAULT_DISRUPTION_METHOD) {
139
+ const defenses = player.defenses?.[0];
140
+ const incomingCcCount = Number(defenses?.receivedCrowdControl ?? 0);
141
+ const incomingCcDurationMs = Number(defenses?.receivedCrowdControlDuration ?? 0);
142
+ const incomingStripCount = Number(defenses?.boonStrips ?? 0);
143
+ const incomingStripDurationMs = Number(defenses?.boonStripsTime ?? 0);
144
+ const resolveValue = (count, durationMs) => resolveDisruptionValue(count, durationMs, method);
145
+ return {
146
+ strips: {
147
+ total: resolveValue(incomingStripCount, incomingStripDurationMs),
148
+ missed: 0,
149
+ blocked: 0
150
+ },
151
+ cc: {
152
+ total: resolveValue(incomingCcCount, incomingCcDurationMs),
153
+ missed: 0,
154
+ blocked: 0
155
+ }
156
+ };
157
+ }
158
+ function applySquadStabilityGeneration(players, context) {
159
+ const durationMs = context?.durationMS || 0;
160
+ const buffMap = context?.buffMap || {};
161
+ const squadPlayers = players.filter((p) => !p.notInSquad);
162
+ const squadCount = squadPlayers.length;
163
+ const groupCounts = /* @__PURE__ */ new Map();
164
+ squadPlayers.forEach((player) => {
165
+ const group = player.group ?? 0;
166
+ groupCounts.set(group, (groupCounts.get(group) || 0) + 1);
167
+ });
168
+ squadPlayers.forEach((player) => {
169
+ const groupCount = groupCounts.get(player.group ?? 0) || 1;
170
+ const self = getPlayerBoonGenerationMs(
171
+ player,
172
+ "selfBuffs",
173
+ STABILITY_BOON_ID,
174
+ durationMs,
175
+ groupCount,
176
+ squadCount,
177
+ buffMap
178
+ );
179
+ const squad = getPlayerBoonGenerationMs(
180
+ player,
181
+ "squadBuffs",
182
+ STABILITY_BOON_ID,
183
+ durationMs,
184
+ groupCount,
185
+ squadCount,
186
+ buffMap
187
+ );
188
+ player.stabGeneration = (self.generationMs + squad.generationMs) / 1e3;
189
+ });
190
+ }
191
+ function computeDownContribution(player) {
192
+ if (player.statsAll && player.statsAll.length > 0) {
193
+ const val = player.statsAll[0].downContribution;
194
+ if (typeof val === "number" && val > 0) return val;
195
+ }
196
+ let total = 0;
197
+ if (player.totalDamageDist) {
198
+ for (const targetList of player.totalDamageDist) {
199
+ if (targetList) {
200
+ for (const entry of targetList) {
201
+ total += entry.downContribution || 0;
202
+ }
203
+ }
204
+ }
205
+ }
206
+ if (total > 0) return total;
207
+ if (player.statsTargets) {
208
+ for (const targetStats of player.statsTargets) {
209
+ if (targetStats && targetStats.length > 0) {
210
+ total += targetStats[0].downContribution || 0;
211
+ }
212
+ }
213
+ }
214
+ return total;
215
+ }
216
+ function computeSquadBarrier(player) {
217
+ if (!player.extBarrierStats || !player.extBarrierStats.outgoingBarrierAllies) return 0;
218
+ let total = 0;
219
+ for (const squadMember of player.extBarrierStats.outgoingBarrierAllies) {
220
+ if (!squadMember) continue;
221
+ for (const phaseData of squadMember) {
222
+ if (phaseData) {
223
+ total += phaseData.barrier || 0;
224
+ }
225
+ }
226
+ }
227
+ return total;
228
+ }
229
+ function computeSquadHealing(player) {
230
+ if (!player.extHealingStats || !player.extHealingStats.outgoingHealingAllies) return 0;
231
+ let total = 0;
232
+ for (const squadMember of player.extHealingStats.outgoingHealingAllies) {
233
+ if (!squadMember) continue;
234
+ for (const phaseData of squadMember) {
235
+ if (phaseData) {
236
+ total += phaseData.healing || 0;
237
+ }
238
+ }
239
+ }
240
+ return total;
241
+ }
242
+ // Annotate the CommonJS export names for ESM import in node:
243
+ 0 && (module.exports = {
244
+ applySquadStabilityGeneration,
245
+ computeDownContribution,
246
+ computeIncomingDisruptions,
247
+ computeOutgoingCrowdControl,
248
+ computeSquadBarrier,
249
+ computeSquadHealing,
250
+ resolveDisruptionValue
251
+ });
@@ -0,0 +1,26 @@
1
+ import { Player } from './dpsReportTypes.cjs';
2
+ import { DisruptionMethod } from './metricsSettings.cjs';
3
+
4
+ declare const resolveDisruptionValue: (count: number, durationMs: number, method: DisruptionMethod) => number;
5
+ declare function computeOutgoingCrowdControl(player: Player, method?: DisruptionMethod): number;
6
+ declare function computeIncomingDisruptions(player: Player, method?: DisruptionMethod): {
7
+ strips: {
8
+ total: number;
9
+ missed: number;
10
+ blocked: number;
11
+ };
12
+ cc: {
13
+ total: number;
14
+ missed: number;
15
+ blocked: number;
16
+ };
17
+ };
18
+ declare function applySquadStabilityGeneration(players: Player[], context?: {
19
+ durationMS?: number;
20
+ buffMap?: Record<string, any>;
21
+ }): void;
22
+ declare function computeDownContribution(player: Player): number;
23
+ declare function computeSquadBarrier(player: Player): number;
24
+ declare function computeSquadHealing(player: Player): number;
25
+
26
+ export { applySquadStabilityGeneration, computeDownContribution, computeIncomingDisruptions, computeOutgoingCrowdControl, computeSquadBarrier, computeSquadHealing, resolveDisruptionValue };
@@ -0,0 +1,26 @@
1
+ import { Player } from './dpsReportTypes.js';
2
+ import { DisruptionMethod } from './metricsSettings.js';
3
+
4
+ declare const resolveDisruptionValue: (count: number, durationMs: number, method: DisruptionMethod) => number;
5
+ declare function computeOutgoingCrowdControl(player: Player, method?: DisruptionMethod): number;
6
+ declare function computeIncomingDisruptions(player: Player, method?: DisruptionMethod): {
7
+ strips: {
8
+ total: number;
9
+ missed: number;
10
+ blocked: number;
11
+ };
12
+ cc: {
13
+ total: number;
14
+ missed: number;
15
+ blocked: number;
16
+ };
17
+ };
18
+ declare function applySquadStabilityGeneration(players: Player[], context?: {
19
+ durationMS?: number;
20
+ buffMap?: Record<string, any>;
21
+ }): void;
22
+ declare function computeDownContribution(player: Player): number;
23
+ declare function computeSquadBarrier(player: Player): number;
24
+ declare function computeSquadHealing(player: Player): number;
25
+
26
+ export { applySquadStabilityGeneration, computeDownContribution, computeIncomingDisruptions, computeOutgoingCrowdControl, computeSquadBarrier, computeSquadHealing, resolveDisruptionValue };
@@ -0,0 +1,21 @@
1
+ import {
2
+ applySquadStabilityGeneration,
3
+ computeDownContribution,
4
+ computeIncomingDisruptions,
5
+ computeOutgoingCrowdControl,
6
+ computeSquadBarrier,
7
+ computeSquadHealing,
8
+ resolveDisruptionValue
9
+ } from "./chunk-R5EJF5AW.js";
10
+ import "./chunk-ZFZS7JFU.js";
11
+ import "./chunk-PMVLNDZZ.js";
12
+ import "./chunk-KRHODGVU.js";
13
+ export {
14
+ applySquadStabilityGeneration,
15
+ computeDownContribution,
16
+ computeIncomingDisruptions,
17
+ computeOutgoingCrowdControl,
18
+ computeSquadBarrier,
19
+ computeSquadHealing,
20
+ resolveDisruptionValue
21
+ };