genshin-world 4.2.0 → 4.3.3

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 (171) hide show
  1. package/README.md +2 -2
  2. package/dist/ElementDamageBonusAttributeMap-Cf1kBcTu.js +12 -0
  3. package/dist/EnemyState-BdsrVDVv.js +13 -0
  4. package/dist/GameDataset-oS0Tc9KV.js +272 -0
  5. package/dist/KitEventKind-DinObjiq.js +33 -0
  6. package/dist/ReactionType-BTiek5WA.js +36 -0
  7. package/dist/TransformativeReactionType-DYhIEAoe.js +14 -0
  8. package/dist/addKitEffect-DEhZUuxo.js +19 -0
  9. package/dist/addKitStatus-CecgwPmO.js +8 -0
  10. package/dist/ainoKit-Z23iOdpE.js +110 -0
  11. package/dist/albedoKit-h6MSXqhl.js +132 -0
  12. package/dist/alhaithamKit-2VrwmZzn.js +225 -0
  13. package/dist/aloyKit-Dlk_fLbL.js +66 -0
  14. package/dist/alyoshaKit-3ky4aL_z.js +3 -0
  15. package/dist/amberKit-BuYU5ACZ.js +85 -0
  16. package/dist/arlecchinoKit-B2WJP5Y5.js +16 -0
  17. package/dist/ayakaKit-D7K6RdMw.js +84 -0
  18. package/dist/ayatoKit-qQp-Ayun.js +136 -0
  19. package/dist/baizhuKit-9i8Hvfeg.js +81 -0
  20. package/dist/barbaraKit-DMo_2qWo.js +122 -0
  21. package/dist/beidouKit-1lURCwhO.js +89 -0
  22. package/dist/bennettKit-B-ipp-MR.js +75 -0
  23. package/dist/candaceKit-oGYu9t5n.js +92 -0
  24. package/dist/castKitField-BhB1fy3l.js +21 -0
  25. package/dist/characterPack-B3e_YsdJ.d.ts +115 -0
  26. package/dist/characterPack-DzYMqBNM.js +697 -0
  27. package/dist/characterPack.d.ts +2 -0
  28. package/dist/characterPack.js +3 -0
  29. package/dist/charlotteKit-BjNvcN8w.js +103 -0
  30. package/dist/chascaKit-isny33W1.js +52 -0
  31. package/dist/checkIsKitShieldLive-DEn8yb0C.js +3 -0
  32. package/dist/chevreuseKit-BppMndmv.js +47 -0
  33. package/dist/chioriKit-CKfqMVtb.js +30 -0
  34. package/dist/chongyunKit-DeZG-qOb.js +99 -0
  35. package/dist/citlaliKit-BLY9P2cd.js +62 -0
  36. package/dist/clorindeKit-DGNp_1SZ.js +61 -0
  37. package/dist/collectKitEnergyDrops-4kTI3aGH.js +61 -0
  38. package/dist/colleiKit-CVBvP9-k.js +51 -0
  39. package/dist/columbinaKit-BqmNtRDK.js +279 -0
  40. package/dist/computeFacingAngle-DapXsgDc.js +7 -0
  41. package/dist/constants-6NEnGOni.js +186 -0
  42. package/dist/constants-BIXoNz1x.js +73 -0
  43. package/dist/constants-DWgLZz-I.js +45 -0
  44. package/dist/constants-jHIdcxxW.js +3 -0
  45. package/dist/constants-r10WzaUG.js +48 -0
  46. package/dist/consumeKitResource-DknosO6e.js +17 -0
  47. package/dist/countKitResource-CPve-dw2.js +4 -0
  48. package/dist/createWindriseGroundPaint-CtFTL5uW.js +293 -0
  49. package/dist/cynoKit-bhub8RfD.js +203 -0
  50. package/dist/dahliaKit-BeEPFn33.js +20 -0
  51. package/dist/dehyaKit-1qJYvLv-.js +23 -0
  52. package/dist/dilucKit-DslGKmxO.js +166 -0
  53. package/dist/dionaKit-B33zk3GI.js +68 -0
  54. package/dist/doriKit-BmYySQcG.js +24 -0
  55. package/dist/durinKit-CpCXxj-r.js +49 -0
  56. package/dist/emilieKit-BZqz4PVs.js +20 -0
  57. package/dist/emitKitEvent-Cb-ZHu50.js +11 -0
  58. package/dist/escoffierKit-DFRj0Hpo.js +95 -0
  59. package/dist/eulaKit-BzD8ye_S.js +144 -0
  60. package/dist/faruzanKit-C5WQz91G.js +72 -0
  61. package/dist/findKitStatus-Dj_zauGj.js +3 -0
  62. package/dist/fischlKit-e4xAt26v.js +95 -0
  63. package/dist/flinsKit-D82N06z5.js +30 -0
  64. package/dist/freminetKit-Dq9ebIts.js +20 -0
  65. package/dist/furinaKit-CzTKkE0N.js +289 -0
  66. package/dist/gainKitResource-3F1z8Aco.js +14 -0
  67. package/dist/gainPartyMemberEnergy-DUbIxe6i.js +10 -0
  68. package/dist/gamingKit-yxYvslgf.js +25 -0
  69. package/dist/ganyuKit-B2pxzHKL.js +84 -0
  70. package/dist/getActiveCharacterId-D9TtVSWj.js +9 -0
  71. package/dist/getBuffedCombatant-CwXmBrc6.js +94 -0
  72. package/dist/getDeployedCharacterIds-TuIRCNKb.js +3 -0
  73. package/dist/getDeployedCombatants-BQdLjZha.js +16 -0
  74. package/dist/getPartyMember-BAb9wUiz.js +8 -0
  75. package/dist/gorouKit--Luf6-WZ.js +153 -0
  76. package/dist/heizouKit-DRleoyzF.js +49 -0
  77. package/dist/huTaoKit-WDMpqAzD.js +146 -0
  78. package/dist/iansanKit-BPzX4C36.js +145 -0
  79. package/dist/ifaKit-Z57TFRSg.js +39 -0
  80. package/dist/illugaKit-86u4wqrU.js +111 -0
  81. package/dist/index-C5rNBYhp.d.ts +26017 -0
  82. package/dist/index.d.ts +4 -0
  83. package/dist/index.js +48495 -0
  84. package/dist/ineffaKit-D0SA01X2.js +154 -0
  85. package/dist/ittoKit-hM51Mywb.js +132 -0
  86. package/dist/jahodaKit-CqtBpzVS.js +344 -0
  87. package/dist/jeanKit-fwjmnF1v.js +89 -0
  88. package/dist/kachinaKit-Dyh5F-ob.js +6 -0
  89. package/dist/kaeyaKit-SBM0QxJ5.js +91 -0
  90. package/dist/kavehKit-1XyMxtUb.js +33 -0
  91. package/dist/kazuhaKit-C726LLZy.js +76 -0
  92. package/dist/keqingKit-O_V-tx1h.js +100 -0
  93. package/dist/kinichKit-DIVa0P5s.js +71 -0
  94. package/dist/kiraraKit-nS9iOECm.js +70 -0
  95. package/dist/kleeKit-DzbELTyN.js +95 -0
  96. package/dist/kokomiKit-BRzXNRVb.js +83 -0
  97. package/dist/kujouSaraKit-BpN3Ipay.js +95 -0
  98. package/dist/kukiKit-DRdmE41e.js +70 -0
  99. package/dist/lanYanKit-CRK1J-LX.js +26 -0
  100. package/dist/laumaKit-CRc88J5l.js +161 -0
  101. package/dist/laylaKit-B7Pjqgzw.js +180 -0
  102. package/dist/linneaKit-CVZeam_T.js +3 -0
  103. package/dist/lisaKit-BJqj8t7j.js +65 -0
  104. package/dist/lohenKit-BZk4IiPV.js +3 -0
  105. package/dist/lynetteKit-CfwhsLsJ.js +39 -0
  106. package/dist/lyneyKit-BQiI15dt.js +42 -0
  107. package/dist/mavuikaKit-MMBY1DJn.js +21 -0
  108. package/dist/mikaKit-BIMafqBI.js +20 -0
  109. package/dist/mizukiKit-CC34yGgJ.js +57 -0
  110. package/dist/monaKit-BlrXXHlB.js +145 -0
  111. package/dist/mualaniKit-BUTB11j2.js +6 -0
  112. package/dist/nahidaKit-ZHrD7-m7.js +112 -0
  113. package/dist/naviaKit-DDttg5Dp.js +139 -0
  114. package/dist/neferKit-Z-QBM46z.js +29 -0
  115. package/dist/neuvilletteKit-B4EhID2O.js +117 -0
  116. package/dist/nicoleKit-Dmrpe0yU.js +281 -0
  117. package/dist/nilouKit-CoztU-uZ.js +104 -0
  118. package/dist/ningguangKit-BGOXmwd-.js +112 -0
  119. package/dist/noelleKit-nl5ar8f1.js +147 -0
  120. package/dist/odetteKit-Bu1W8GX7.js +101 -0
  121. package/dist/ororonKit-CboDk9B8.js +91 -0
  122. package/dist/pruneKit-xgQ9cym6.js +34 -0
  123. package/dist/qiqiKit-lz_qLyLu.js +104 -0
  124. package/dist/raidenKit-CVTi4bpy.js +152 -0
  125. package/dist/razorKit-BHyrlVEl.js +121 -0
  126. package/dist/readCharacterAvatar-xauJoD8Q.js +291 -0
  127. package/dist/removeKitEffects-Csap9Xyn.js +5 -0
  128. package/dist/rosariaKit-DEpP8gj7.js +59 -0
  129. package/dist/sandroneKit-C7vjjwWY.js +3 -0
  130. package/dist/save-W-sjOoN_.js +2475 -0
  131. package/dist/save.d.ts +2 -0
  132. package/dist/save.js +1 -0
  133. package/dist/sayuKit-DQbPlL_6.js +67 -0
  134. package/dist/sceneExport-3Se7hlVa.js +26 -0
  135. package/dist/sceneExport-C-q_cRxm.d.ts +57 -0
  136. package/dist/sceneExport.d.ts +2 -0
  137. package/dist/sceneExport.js +1 -0
  138. package/dist/sethosKit-o-Tz2GFI.js +6 -0
  139. package/dist/shenheKit-Xu_rt5aN.js +152 -0
  140. package/dist/sigewinneKit-NOWCcIW4.js +21 -0
  141. package/dist/skirkKit-CK183sCe.js +9 -0
  142. package/dist/spendKitResource-CC5kZDgu.js +9 -0
  143. package/dist/style.css +4570 -0
  144. package/dist/sucroseKit-Brr_FwwP.js +124 -0
  145. package/dist/tartagliaKit-DQzYxDRn.js +136 -0
  146. package/dist/terrainTileWorker.d.ts +1 -0
  147. package/dist/terrainTileWorker.js +80 -0
  148. package/dist/thomaKit-CesNlmDH.js +95 -0
  149. package/dist/tighnariKit-B9BZlgE9.js +45 -0
  150. package/dist/varesaKit-D5iKxzdo.js +36 -0
  151. package/dist/varkaKit-CNpU_rb3.js +3 -0
  152. package/dist/ventiKit-CM94zgZy.js +52 -0
  153. package/dist/vesnaKit-DtGBZlNW.js +3 -0
  154. package/dist/vodyanitsaKit-BurO3Fqh.js +3 -0
  155. package/dist/wandererKit-CW3sLw53.js +8 -0
  156. package/dist/wriothesleyKit-CPwNVWnr.js +102 -0
  157. package/dist/xianglingKit-DAFhr2LW.js +113 -0
  158. package/dist/xianyunKit-G4ateSub.js +107 -0
  159. package/dist/xiaoKit-CQljYrZS.js +104 -0
  160. package/dist/xilonenKit-39u8vLuk.js +41 -0
  161. package/dist/xingqiuKit-nURrQ7vt.js +126 -0
  162. package/dist/xinyanKit-DU0WpVms.js +144 -0
  163. package/dist/yaeMikoKit-kSDqAFyn.js +56 -0
  164. package/dist/yanfeiKit-Cst973qA.js +118 -0
  165. package/dist/yaoyaoKit-6yjjf3np.js +201 -0
  166. package/dist/yelanKit-SSdzqMQa.js +78 -0
  167. package/dist/yoimiyaKit-DqiQvgAt.js +90 -0
  168. package/dist/yunjinKit-lCP6TTRP.js +86 -0
  169. package/dist/zhongliKit-CTjDWUoW.js +109 -0
  170. package/dist/zibaiKit-CatYt9BG.js +62 -0
  171. package/package.json +11 -14
@@ -0,0 +1,2 @@
1
+ import { B as chooseCharacterTermsFile, V as chooseCharacterPackModel, a as decodeCharacterTerms, h as CHARACTER_PACK_INDEX_PATH, i as readCharacterNames, n as resolveCharacterPackTextures, p as CHARACTER_MODEL_PATH, t as GAME_DATA_BLOB_PATH, w as CHARACTER_TERMS_PATH } from "./characterPack-B3e_YsdJ.js";
2
+ export { CHARACTER_MODEL_PATH, CHARACTER_PACK_INDEX_PATH, CHARACTER_TERMS_PATH, GAME_DATA_BLOB_PATH, chooseCharacterPackModel, chooseCharacterTermsFile, decodeCharacterTerms, readCharacterNames, resolveCharacterPackTextures };
@@ -0,0 +1,3 @@
1
+ import { S as decodeCharacterTerms, T as chooseCharacterPackModel, i as readCharacterNames, n as resolveCharacterPackTextures, t as GAME_DATA_BLOB_PATH, w as chooseCharacterTermsFile } from "./characterPack-DzYMqBNM.js";
2
+ import { f as CHARACTER_PACK_INDEX_PATH, u as CHARACTER_MODEL_PATH, x as CHARACTER_TERMS_PATH } from "./GameDataset-oS0Tc9KV.js";
3
+ export { CHARACTER_MODEL_PATH, CHARACTER_PACK_INDEX_PATH, CHARACTER_TERMS_PATH, GAME_DATA_BLOB_PATH, chooseCharacterPackModel, chooseCharacterTermsFile, decodeCharacterTerms, readCharacterNames, resolveCharacterPackTextures };
@@ -0,0 +1,103 @@
1
+ import "./GameDataset-oS0Tc9KV.js";
2
+ import { t as getDeployedCharacterIds } from "./getDeployedCharacterIds-TuIRCNKb.js";
3
+ import "./KitEventKind-DinObjiq.js";
4
+ import { B as SUMMON_LINGER_SECONDS } from "./constants-BIXoNz1x.js";
5
+ import { t as castKitField } from "./castKitField-BhB1fy3l.js";
6
+ import { castKitSummon, changeKitMemberHealth, createAheadBody, createKitBody, scheduleKitTask, startKitCooldown } from "./index.js";
7
+ import { takeOne } from "@esposter/shared";
8
+ // src/services/kit/characters/charlotteKit.ts
9
+ const ASCENSION_4 = 4;
10
+ const ASCENSION_4_BONUS_PER_MEMBER = .05;
11
+ const FONTAINE_REGION_ID = "fontaine";
12
+ const THORN_COOLDOWN_STATUS_ID = "charlotte-thorn-cooldown";
13
+ const SNAPPY_MARK_STATUS_ID = "charlotte-snappy-silhouette";
14
+ const SNAPPY_MARK_INTERVAL_SECONDS = 1.5;
15
+ const SNAPPY_MARK_CAP = 5;
16
+ const BURST_OFFSET_METRES = 4.5;
17
+ const BURST_HEAL_RADIUS = 7;
18
+ const healTeam = (context, caster, flatHealth, attackShare) => {
19
+ const healedHealth = flatHealth + attackShare * caster.attributes.attack;
20
+ for (const characterId of getDeployedCharacterIds(context.party)) changeKitMemberHealth(context, caster, characterId, healedHealth);
21
+ };
22
+ const createCharlotteKitBehaviour = ({ kit, readHit, readHits, readParameter, readSeconds }) => {
23
+ const thorn = readHit("thorn");
24
+ const thornHitmarkSeconds = readSeconds("thornHitmark");
25
+ const thornCooldownSeconds = readParameter("spiritbreathThornCooldownSeconds");
26
+ const snappyMarkHit = readHit("snappyMark");
27
+ const snappyMarkSeconds = readSeconds("snappyMark");
28
+ const kameraHits = readHits("kamera");
29
+ const burstHitmarkSeconds = takeOne(kit.elementalBurst.hits).hitmarkSeconds;
30
+ const stillPhotoFlatHealth = readParameter("stillPhotoFlatHealth");
31
+ const stillPhotoAttackShare = readParameter("stillPhotoAttackShare");
32
+ const kameraFlatHealth = readParameter("kameraFlatHealth");
33
+ const kameraAttackShare = readParameter("kameraAttackShare");
34
+ let markedCount = 0;
35
+ const createSnappyMark = () => ({
36
+ damageTakenBonus: 0,
37
+ id: SNAPPY_MARK_STATUS_ID,
38
+ nextTickSeconds: SNAPPY_MARK_INTERVAL_SECONDS,
39
+ secondsRemaining: snappyMarkSeconds,
40
+ tickIntervalSeconds: SNAPPY_MARK_INTERVAL_SECONDS
41
+ });
42
+ return {
43
+ burst: { onStart: ({ activeCombatant: combatant, body, kitEffectState }) => {
44
+ const { characterId } = combatant;
45
+ const castCentre = createAheadBody(body, BURST_OFFSET_METRES).position;
46
+ castKitSummon(kitEffectState, body, combatant, kameraHits, { attackTag: "ElementalBurst" });
47
+ scheduleKitTask(kitEffectState, characterId, burstHitmarkSeconds, (tick) => healTeam(tick, combatant, stillPhotoFlatHealth, stillPhotoAttackShare));
48
+ for (const { hitmarkSeconds } of kameraHits) castKitField(kitEffectState, characterId, castCentre, {
49
+ nextTickSeconds: hitmarkSeconds,
50
+ onTick: (tick) => changeKitMemberHealth(tick, combatant, tick.activeCombatant.characterId, kameraFlatHealth + kameraAttackShare * combatant.attributes.attack),
51
+ radius: BURST_HEAL_RADIUS,
52
+ secondsRemaining: hitmarkSeconds + SUMMON_LINGER_SECONDS,
53
+ tickIntervalSeconds: 1
54
+ });
55
+ } },
56
+ chargedAttack: { onStart: ({ activeCombatant: combatant, kitEffectState }, target) => {
57
+ if (!target) return;
58
+ const { characterId } = combatant;
59
+ const { position } = target;
60
+ const thornBody = createKitBody({
61
+ x: position.x,
62
+ z: position.z
63
+ });
64
+ scheduleKitTask(kitEffectState, characterId, thornHitmarkSeconds, ({ kitEffectState: effectState }) => {
65
+ if (!startKitCooldown(effectState, characterId, THORN_COOLDOWN_STATUS_ID, thornCooldownSeconds)) return;
66
+ castKitSummon(effectState, thornBody, combatant, [thorn], { attackTag: "ChargedAttack" });
67
+ });
68
+ } },
69
+ getPassiveBonuses: (combatant, _healthShare, deployedCombatants) => {
70
+ if (combatant.ascension < ASCENSION_4) return [];
71
+ const otherMembers = deployedCombatants.filter(({ characterId }) => characterId !== combatant.characterId);
72
+ const fontaineCount = otherMembers.filter(({ regionId }) => regionId === FONTAINE_REGION_ID).length;
73
+ return [{
74
+ amount: ASCENSION_4_BONUS_PER_MEMBER * fontaineCount,
75
+ attribute: "FIGHT_PROP_HEAL_ADD"
76
+ }, {
77
+ amount: ASCENSION_4_BONUS_PER_MEMBER * (otherMembers.length - fontaineCount),
78
+ attribute: "FIGHT_PROP_ICE_ADD_HURT"
79
+ }];
80
+ },
81
+ onKitEvent: (event, { kitEffectState }, combatant) => {
82
+ if (event.kind !== "StatusTicked" || event.status.id !== SNAPPY_MARK_STATUS_ID) return;
83
+ const { enemy } = event;
84
+ castKitSummon(kitEffectState, createKitBody({
85
+ x: enemy.position.x,
86
+ z: enemy.position.z
87
+ }), combatant, [snappyMarkHit], {
88
+ attackTag: "ElementalSkill",
89
+ target: enemy
90
+ });
91
+ },
92
+ skill: {
93
+ hits: [{ enemyStatus: () => {
94
+ markedCount++;
95
+ return markedCount <= SNAPPY_MARK_CAP ? createSnappyMark() : void 0;
96
+ } }],
97
+ onStart: () => {
98
+ markedCount = 0;
99
+ }
100
+ }
101
+ };
102
+ };
103
+ export { createCharlotteKitBehaviour };
@@ -0,0 +1,52 @@
1
+ import "./GameDataset-oS0Tc9KV.js";
2
+ import { v as NIGHTSOUL_BLESSING_STATUS_ID } from "./constants-BIXoNz1x.js";
3
+ import { castKitSummon, changeKitSkillCooldown, checkHasKitStatus, createNightsoulBlessingStart, drainKitSprintNightsoulPoints, shuffleWithRandom } from "./index.js";
4
+ // src/services/kit/characters/chascaKit.ts
5
+ const NIGHTSOUL_POINTS = 80;
6
+ const NIGHTSOUL_DRAIN_PER_SECOND = 8;
7
+ const NIGHTSOUL_SPRINT_DRAIN = 13.3;
8
+ const RADIANT_ELEMENTS = /* @__PURE__ */ new Set([
9
+ "Ice",
10
+ "Electric",
11
+ "Water",
12
+ "Fire"
13
+ ]);
14
+ const readRadiantElements = ({ activeCombatant, random }) => {
15
+ const elements = (activeCombatant.deployedElements ?? []).flatMap((element) => element !== void 0 && RADIANT_ELEMENTS.has(element) ? [element] : []);
16
+ return shuffleWithRandom([...elements, ...elements], random);
17
+ };
18
+ const createChascaKitBehaviour = ({ readHit, readSecondsList }) => {
19
+ const shellSeconds = readSecondsList("shellHitmarks");
20
+ const radiantShell = readHit("radiantShell");
21
+ const soulseekerShell = readHit("soulseekerShell");
22
+ return {
23
+ burst: { onStart: (context) => {
24
+ const { activeCombatant, body, kitEffectState } = context;
25
+ const radiantElements = readRadiantElements(context);
26
+ const shells = [];
27
+ for (const [index, hitmarkSeconds] of shellSeconds.entries()) {
28
+ const radiantElement = radiantElements[index];
29
+ const shell = radiantElement === void 0 ? soulseekerShell : {
30
+ ...radiantShell,
31
+ element: radiantElement
32
+ };
33
+ shells.push({
34
+ ...shell,
35
+ attackTag: "ElementalBurst",
36
+ hitmarkSeconds,
37
+ targetIndex: index
38
+ });
39
+ }
40
+ castKitSummon(kitEffectState, body, activeCombatant, shells, { attackTag: "ElementalBurst" });
41
+ } },
42
+ onSprint: (context, kitState, stepSeconds) => drainKitSprintNightsoulPoints(context, kitState, stepSeconds, NIGHTSOUL_SPRINT_DRAIN),
43
+ onStep: ({ kitEffectState, party }, { characterId }, stepSeconds) => {
44
+ if (checkHasKitStatus(kitEffectState.effects, characterId, "nightsoul-blessing")) changeKitSkillCooldown(party, characterId, stepSeconds);
45
+ },
46
+ skill: {
47
+ checkIsStateEndingPress: ({ activeCombatant, kitEffectState }) => checkHasKitStatus(kitEffectState.effects, activeCombatant.characterId, NIGHTSOUL_BLESSING_STATUS_ID),
48
+ onStart: createNightsoulBlessingStart(NIGHTSOUL_POINTS, NIGHTSOUL_DRAIN_PER_SECOND)
49
+ }
50
+ };
51
+ };
52
+ export { createChascaKitBehaviour };
@@ -0,0 +1,3 @@
1
+ // src/services/kit/effects/checkIsKitShieldLive.ts
2
+ const checkIsKitShieldLive = (effect) => effect.kind === "shield" && effect.secondsRemaining > 0;
3
+ export { checkIsKitShieldLive as t };
@@ -0,0 +1,47 @@
1
+ import "./GameDataset-oS0Tc9KV.js";
2
+ import { t as getDeployedCharacterIds } from "./getDeployedCharacterIds-TuIRCNKb.js";
3
+ import { t as ReactionType } from "./ReactionType-BTiek5WA.js";
4
+ import "./KitEventKind-DinObjiq.js";
5
+ import { t as addKitStatus } from "./addKitStatus-CecgwPmO.js";
6
+ import { t as removeKitEffects } from "./removeKitEffects-Csap9Xyn.js";
7
+ import { buffKitMember, checkHasKitStatus, getKitMaxHealth } from "./index.js";
8
+ // src/services/kit/characters/chevreuseKit.ts
9
+ const OVERCHARGED_BALL_STATUS_ID = "chevreuse-overcharged-ball";
10
+ const ASCENSION_4 = 4;
11
+ const VERTICAL_FORCE_ATK_PER_1000_MAX_HEALTH = .01;
12
+ const VERTICAL_FORCE_ATK_MAX = .4;
13
+ const VERTICAL_FORCE_ELEMENTS = /* @__PURE__ */ new Set(["Electric", "Fire"]);
14
+ const VERTICAL_FORCE_SECONDS = 30;
15
+ const VERTICAL_FORCE_SOURCE = "chevreuse-ascension-4";
16
+ const grantVerticalForce = ({ activeCombatant: combatant, characterIdCombatantMap, kitEffectState, party }) => {
17
+ const maxHealth = getKitMaxHealth(combatant, kitEffectState.effects, party, characterIdCombatantMap);
18
+ const amount = Math.min(maxHealth / 1e3 * VERTICAL_FORCE_ATK_PER_1000_MAX_HEALTH, VERTICAL_FORCE_ATK_MAX);
19
+ for (const characterId of getDeployedCharacterIds(party)) {
20
+ const member = characterIdCombatantMap.get(characterId);
21
+ if (!member?.element || !VERTICAL_FORCE_ELEMENTS.has(member.element)) continue;
22
+ buffKitMember(kitEffectState, characterId, {
23
+ amount,
24
+ attribute: "FIGHT_PROP_ATTACK_PERCENT",
25
+ secondsRemaining: VERTICAL_FORCE_SECONDS,
26
+ source: VERTICAL_FORCE_SOURCE
27
+ });
28
+ }
29
+ };
30
+ const createChevreuseKitBehaviour = () => ({
31
+ onKitEvent: (event, { kitEffectState }, combatant) => {
32
+ if (event.kind !== "ReactionTriggered" || !event.reactions.some(({ reactionType }) => reactionType === ReactionType.Overloaded)) return;
33
+ if (checkHasKitStatus(kitEffectState.effects, combatant.characterId, OVERCHARGED_BALL_STATUS_ID)) return;
34
+ addKitStatus(kitEffectState, combatant.characterId, {
35
+ id: OVERCHARGED_BALL_STATUS_ID,
36
+ secondsRemaining: Number.POSITIVE_INFINITY
37
+ });
38
+ },
39
+ skillHolds: [{ variant: {
40
+ checkIsActive: ({ activeCombatant: combatant, kitEffectState }) => checkHasKitStatus(kitEffectState.effects, combatant.characterId, OVERCHARGED_BALL_STATUS_ID),
41
+ onStart: (context) => {
42
+ removeKitEffects(context.kitEffectState, (effect) => effect.kind === "status" && effect.id === OVERCHARGED_BALL_STATUS_ID);
43
+ if (context.activeCombatant.ascension >= ASCENSION_4) grantVerticalForce(context);
44
+ }
45
+ } }]
46
+ });
47
+ export { createChevreuseKitBehaviour };
@@ -0,0 +1,30 @@
1
+ import { castKitSummon } from "./index.js";
2
+ import { takeOne } from "@esposter/shared";
3
+ // src/services/kit/characters/chioriKit.ts
4
+ const createDefenseShareBehaviour = (defenseShare) => ({ additiveBaseDamageBonus: ({ attributes }) => defenseShare * attributes.defense });
5
+ const castTamoto = (hits, secondsRemaining) => ({ activeCombatant: combatant, body, kitEffectState }) => {
6
+ castKitSummon(kitEffectState, body, combatant, hits, {
7
+ attackTag: "ElementalSkill",
8
+ secondsRemaining
9
+ });
10
+ };
11
+ const createChioriKitBehaviour = ({ readHits, readParameter, readSecondsList }) => {
12
+ const sweepHitBehaviour = createDefenseShareBehaviour(readParameter("sweepDefenseShare"));
13
+ const tamotoHitBehaviour = createDefenseShareBehaviour(readParameter("tamotoDefenseShare"));
14
+ const burstHitBehaviour = createDefenseShareBehaviour(readParameter("burstDefenseShare"));
15
+ const pressTamotoHits = readHits("pressTamotoAttacks", tamotoHitBehaviour);
16
+ const holdTamotoHits = readHits("holdTamotoAttacks", tamotoHitBehaviour);
17
+ const tamotoSecondsList = readSecondsList("tamotoEnds");
18
+ return {
19
+ burst: { hits: [burstHitBehaviour] },
20
+ skill: {
21
+ hits: [sweepHitBehaviour],
22
+ onStart: castTamoto(pressTamotoHits, takeOne(tamotoSecondsList, 0))
23
+ },
24
+ skillHolds: [{
25
+ hits: [sweepHitBehaviour],
26
+ onStart: castTamoto(holdTamotoHits, takeOne(tamotoSecondsList, 1))
27
+ }]
28
+ };
29
+ };
30
+ export { createChioriKitBehaviour };
@@ -0,0 +1,99 @@
1
+ import "./GameDataset-oS0Tc9KV.js";
2
+ import { t as gainPartyMemberEnergy } from "./gainPartyMemberEnergy-DUbIxe6i.js";
3
+ import { t as getPartyMember } from "./getPartyMember-BAb9wUiz.js";
4
+ import "./KitEventKind-DinObjiq.js";
5
+ import { t as addKitEffect } from "./addKitEffect-DEhZUuxo.js";
6
+ import { m as MELEE_WEAPON_TYPES } from "./constants-BIXoNz1x.js";
7
+ import { t as castKitField } from "./castKitField-BhB1fy3l.js";
8
+ import { castKitSummon, createKitBody, selectAttackTarget, startKitCooldown } from "./index.js";
9
+ import { takeOne } from "@esposter/shared";
10
+ // src/services/kit/characters/chongyunKit.ts
11
+ const FIELD_RADIUS = 8;
12
+ const FIELD_OFFSET_METRES = 1.5;
13
+ const FIELD_TICK_SECONDS = 1;
14
+ const FIELD_TICK_MARGIN_SECONDS = .1;
15
+ const STEADY_BREATHING_ASCENSION = 1;
16
+ const STEADY_BREATHING_NORMAL_ATTACK_SPEED_BONUS = .08;
17
+ const RIMECHASER_BLADE_ASCENSION = 4;
18
+ const RIMECHASER_BLADE_STATUS_ID = "chongyun-rimechaser-blade";
19
+ const RIMECHASER_BLADE_CRYO_RESISTANCE_REDUCTION = .1;
20
+ const RIMECHASER_BLADE_STATUS_SECONDS = 8;
21
+ const ICE_UNLEASHED_CONSTELLATION = 1;
22
+ const ATMOSPHERIC_REVOLUTION_CONSTELLATION = 2;
23
+ const ATMOSPHERIC_REVOLUTION_COOLDOWN_MULTIPLIER = .85;
24
+ const FROZEN_SKIES_CONSTELLATION = 4;
25
+ const FROZEN_SKIES_ENERGY = 1;
26
+ const FROZEN_SKIES_COOLDOWN_STATUS_ID = "chongyun-frozen-skies-cooldown";
27
+ const FROZEN_SKIES_COOLDOWN_SECONDS = 2;
28
+ const RALLY_OF_FOUR_BLADES_CONSTELLATION = 6;
29
+ const RALLY_OF_FOUR_BLADES_DAMAGE_BONUS = .15;
30
+ const FROST_FIELD_ID = "chongyun-frost-field";
31
+ const checkIsFrostField = (effect) => effect.kind === "field" && effect.id === FROST_FIELD_ID;
32
+ const createChongyunKitBehaviour = ({ kit, readHit, readHits, readParameter }) => {
33
+ const infusionSeconds = readParameter("infusionSeconds");
34
+ const skillHitmarkSeconds = takeOne(kit.elementalSkill.hits).hitmarkSeconds;
35
+ const fieldSeconds = readParameter("frostFieldSeconds") + skillHitmarkSeconds + FIELD_TICK_MARGIN_SECONDS;
36
+ const rimechaserBladeHit = readHit("rimechaserBlade", { enemyStatus: () => ({
37
+ damageTakenBonus: 0,
38
+ id: RIMECHASER_BLADE_STATUS_ID,
39
+ resistanceReduction: { ["Ice"]: RIMECHASER_BLADE_CRYO_RESISTANCE_REDUCTION },
40
+ secondsRemaining: RIMECHASER_BLADE_STATUS_SECONDS
41
+ }) });
42
+ const iceUnleashedHits = readHits("iceUnleashed");
43
+ const burstBladeHits = kit.elementalBurst.hits;
44
+ const rallyOfFourBladesHit = readHit("rallyOfFourBlades");
45
+ const fourthStrike = kit.normalAttacks.at(-1);
46
+ const infuse = (kitEffectState, { ascension }, { characterId, weaponType }) => {
47
+ if (weaponType === void 0 || !MELEE_WEAPON_TYPES.has(weaponType)) return;
48
+ addKitEffect(kitEffectState, {
49
+ characterId,
50
+ element: "Ice",
51
+ kind: "infusion",
52
+ ...ascension >= STEADY_BREATHING_ASCENSION && { normalAttackSpeedBonus: STEADY_BREATHING_NORMAL_ATTACK_SPEED_BONUS },
53
+ secondsRemaining: infusionSeconds
54
+ });
55
+ };
56
+ return {
57
+ burst: { onStart: ({ activeCombatant: combatant, body, kitEffectState }) => {
58
+ if (combatant.constellationCount >= RALLY_OF_FOUR_BLADES_CONSTELLATION) castKitSummon(kitEffectState, body, combatant, [rallyOfFourBladesHit], { attackTag: "ElementalBurst" });
59
+ } },
60
+ getStrikeDamageBonus: ({ combatant, hit }, enemy, party) => combatant.constellationCount >= RALLY_OF_FOUR_BLADES_CONSTELLATION && (burstBladeHits.includes(hit) || hit === rallyOfFourBladesHit) && enemy.health / enemy.maxHealth < getPartyMember(party, combatant.characterId).healthShare ? RALLY_OF_FOUR_BLADES_DAMAGE_BONUS : 0,
61
+ onKitEvent: (event, { activeCombatant, body, enemyMap, kitEffectState, party }, combatant) => {
62
+ const { ascension, characterId, constellationCount } = combatant;
63
+ if (event.kind === "CharacterSwapped") {
64
+ if (kitEffectState.effects.some((effect) => checkIsFrostField(effect))) infuse(kitEffectState, combatant, activeCombatant);
65
+ } else if (event.kind === "EffectExpired") {
66
+ const { effect } = event;
67
+ if (!checkIsFrostField(effect) || effect.characterId !== characterId || ascension < RIMECHASER_BLADE_ASCENSION) return;
68
+ const { centre, radius } = effect;
69
+ const enemy = selectAttackTarget({
70
+ angle: 2 * Math.PI,
71
+ height: Number.POSITIVE_INFINITY,
72
+ radius
73
+ }, createKitBody(centre), enemyMap.values());
74
+ castKitSummon(kitEffectState, createKitBody(enemy?.position ?? centre), combatant, [rimechaserBladeHit], { attackTag: "ElementalSkill" });
75
+ } else if (event.kind === "NormalAttackLanded") {
76
+ if (activeCombatant.characterId === characterId && constellationCount >= ICE_UNLEASHED_CONSTELLATION && event.action === fourthStrike) castKitSummon(kitEffectState, body, combatant, iceUnleashedHits);
77
+ } else if (event.kind === "DamageTaken") {
78
+ if (constellationCount < FROZEN_SKIES_CONSTELLATION || event.striker.characterId !== characterId || activeCombatant.characterId !== characterId || !event.enemy.elementalState.auras.has("Cryo") || !startKitCooldown(kitEffectState, characterId, FROZEN_SKIES_COOLDOWN_STATUS_ID, FROZEN_SKIES_COOLDOWN_SECONDS)) return;
79
+ gainPartyMemberEnergy(party, combatant, FROZEN_SKIES_ENERGY);
80
+ }
81
+ },
82
+ skill: { onStart: ({ activeCombatant: combatant, body, kitEffectState }) => {
83
+ for (const effect of kitEffectState.effects) if (checkIsFrostField(effect)) effect.secondsRemaining = 0;
84
+ castKitField(kitEffectState, combatant.characterId, {
85
+ x: body.position.x - Math.sin(body.facing) * FIELD_OFFSET_METRES,
86
+ z: body.position.z - Math.cos(body.facing) * FIELD_OFFSET_METRES
87
+ }, {
88
+ ...combatant.constellationCount >= ATMOSPHERIC_REVOLUTION_CONSTELLATION && { cooldownMultiplier: ATMOSPHERIC_REVOLUTION_COOLDOWN_MULTIPLIER },
89
+ id: FROST_FIELD_ID,
90
+ nextTickSeconds: skillHitmarkSeconds,
91
+ onTick: ({ activeCombatant, kitEffectState: tickEffectState }) => infuse(tickEffectState, combatant, activeCombatant),
92
+ radius: FIELD_RADIUS,
93
+ secondsRemaining: fieldSeconds,
94
+ tickIntervalSeconds: FIELD_TICK_SECONDS
95
+ });
96
+ } }
97
+ };
98
+ };
99
+ export { createChongyunKitBehaviour };
@@ -0,0 +1,62 @@
1
+ import { y as NIGHTSOUL_POINTS_ID } from "./constants-BIXoNz1x.js";
2
+ import { t as castKitField } from "./castKitField-BhB1fy3l.js";
3
+ import { t as countKitResource } from "./countKitResource-CPve-dw2.js";
4
+ import { t as removeKitEffects } from "./removeKitEffects-Csap9Xyn.js";
5
+ import { checkHasKitStatus, checkIsInAttackArea, drainKitNightsoulPoints, enterKitNightsoulBlessing, generateKitNightsoulPoints, queueKitPassiveHit, toKitSeconds } from "./index.js";
6
+ // src/services/kit/characters/citlaliKit.ts
7
+ const NIGHTSOUL_MAXIMUM = 100;
8
+ const NIGHTSOUL_BURST_POINTS = 24;
9
+ const NIGHTSOUL_SKILL_POINTS = 24;
10
+ const NIGHTSOUL_BLESSING_SECONDS = 20;
11
+ const OPAL_FIRE_POINTS = 50;
12
+ const OPAL_FIRE_DRAIN_POINTS = .8;
13
+ const OPAL_FIRE_DRAIN_FRAMES = 6;
14
+ const FROSTFALL_STORM_FRAMES = 59;
15
+ const OPAL_FIRE_FIELD_ID = "citlali-opal-fire";
16
+ const createCitlaliKitBehaviour = ({ readHit }) => {
17
+ const frostfallStormHit = readHit("frostfallStorm");
18
+ const strikeFrostfallStorm = (context, combatant) => {
19
+ const { body, enemyMap } = context;
20
+ for (const enemy of enemyMap.values()) if (enemy.health > 0 && checkIsInAttackArea(frostfallStormHit.hitArea, body, enemy)) queueKitPassiveHit(context, combatant, frostfallStormHit, enemy);
21
+ };
22
+ const enterOpalFire = (context) => {
23
+ const { activeCombatant, kitEffectState } = context;
24
+ const { characterId } = activeCombatant;
25
+ if (!checkHasKitStatus(kitEffectState.effects, characterId, "nightsoul-blessing")) return;
26
+ if (countKitResource(kitEffectState.effects, characterId, "nightsoul-points") < OPAL_FIRE_POINTS) return;
27
+ if (kitEffectState.effects.some((effect) => effect.kind === "field" && effect.id === OPAL_FIRE_FIELD_ID && effect.characterId === characterId)) return;
28
+ const opalFire = castKitField(kitEffectState, characterId, {
29
+ x: 0,
30
+ z: 0
31
+ }, {
32
+ id: OPAL_FIRE_FIELD_ID,
33
+ nextTickSeconds: toKitSeconds(1),
34
+ onTick: (tickContext, tickIndex) => {
35
+ if (!tickContext.kitEffectState.effects.includes(opalFire)) return;
36
+ const frame = tickIndex + 1;
37
+ if (frame % FROSTFALL_STORM_FRAMES === 0) strikeFrostfallStorm(tickContext, activeCombatant);
38
+ if (frame % OPAL_FIRE_DRAIN_FRAMES !== 0) return;
39
+ drainKitNightsoulPoints(tickContext.kitEffectState, characterId, OPAL_FIRE_DRAIN_POINTS);
40
+ if (countKitResource(tickContext.kitEffectState.effects, characterId, "nightsoul-points") === 0) removeKitEffects(tickContext.kitEffectState, (effect) => effect === opalFire);
41
+ },
42
+ secondsRemaining: Number.POSITIVE_INFINITY,
43
+ tickIntervalSeconds: toKitSeconds(1)
44
+ });
45
+ };
46
+ return {
47
+ burst: { onStart: (context) => {
48
+ generateKitNightsoulPoints(context, NIGHTSOUL_BURST_POINTS, NIGHTSOUL_MAXIMUM);
49
+ enterOpalFire(context);
50
+ } },
51
+ skill: { onStart: (context) => {
52
+ const { activeCombatant, kitEffectState } = context;
53
+ const { characterId } = activeCombatant;
54
+ enterKitNightsoulBlessing(kitEffectState, characterId, {
55
+ points: countKitResource(kitEffectState.effects, characterId, NIGHTSOUL_POINTS_ID) + NIGHTSOUL_SKILL_POINTS,
56
+ secondsRemaining: NIGHTSOUL_BLESSING_SECONDS
57
+ });
58
+ enterOpalFire(context);
59
+ } }
60
+ };
61
+ };
62
+ export { createCitlaliKitBehaviour };
@@ -0,0 +1,61 @@
1
+ import "./GameDataset-oS0Tc9KV.js";
2
+ import { t as getPartyMember } from "./getPartyMember-BAb9wUiz.js";
3
+ import { buffKitMember, castKitSummon, changeKitMemberHealth, enterKitStance, getKitMaxHealth, grantPartyMemberBondOfLife } from "./index.js";
4
+ // src/services/kit/characters/clorindeKit.ts
5
+ const CONSTELLATION_6 = 6;
6
+ const HUNTERS_VIGIL_CRIT_DAMAGE = .7;
7
+ const HUNTERS_VIGIL_CRIT_RATE = .1;
8
+ const HUNTERS_VIGIL_CRIT_SECONDS = 12;
9
+ const BOND_OF_LIFE_FULL_SHARE = 1;
10
+ const BOND_OF_LIFE_TOLERANCE = 1e-7;
11
+ const createClorindeKitBehaviour = ({ readHit, readHits, readParameter, readStance }) => {
12
+ const nightVigilSeconds = readParameter("nightVigilSeconds");
13
+ const swiftHuntBondOfLifeGain = readParameter("swiftHuntBondOfLifeGain");
14
+ const swiftHuntNormalShots = readHits("swiftHuntNormalShot");
15
+ const swiftHuntPiercingShots = readHits("swiftHuntPiercingShot", { onStrike: (context, strike) => grantPartyMemberBondOfLife(context.party, strike.combatant.characterId, swiftHuntBondOfLifeGain) });
16
+ const impaleTheNightFullHits = readHits("impaleTheNightFullBondOfLife");
17
+ const impaleTheNightLowHit = readHit("impaleTheNightLowBondOfLife");
18
+ const impaleTheNightNoHit = readHit("impaleTheNightNoBondOfLife");
19
+ const impaleTheNightFullHealing = readParameter("impaleTheNightFullBondOfLifeHealing");
20
+ const impaleTheNightLowHealing = readParameter("impaleTheNightLowBondOfLifeHealing");
21
+ const swiftHuntStep = (index) => ({ onStart: ({ activeCombatant, body, kitEffectState, party }) => {
22
+ const hit = (getPartyMember(party, activeCombatant.characterId).bondOfLifeShare < BOND_OF_LIFE_FULL_SHARE ? swiftHuntPiercingShots : swiftHuntNormalShots).at(index);
23
+ if (hit !== void 0) castKitSummon(kitEffectState, body, activeCombatant, [hit], { attackTag: "NormalAttack" });
24
+ } });
25
+ const impaleTheNight = (context) => {
26
+ const { activeCombatant, body, characterIdCombatantMap, kitEffectState, party } = context;
27
+ const { bondOfLifeShare } = getPartyMember(party, activeCombatant.characterId);
28
+ if (Math.abs(bondOfLifeShare) < BOND_OF_LIFE_TOLERANCE) {
29
+ castKitSummon(kitEffectState, body, activeCombatant, [impaleTheNightNoHit], { attackTag: "NormalAttack" });
30
+ return;
31
+ }
32
+ const isFull = bondOfLifeShare >= BOND_OF_LIFE_FULL_SHARE;
33
+ castKitSummon(kitEffectState, body, activeCombatant, isFull ? impaleTheNightFullHits : [impaleTheNightLowHit], { attackTag: "NormalAttack" });
34
+ changeKitMemberHealth(context, activeCombatant, activeCombatant.characterId, bondOfLifeShare * (isFull ? impaleTheNightFullHealing : impaleTheNightLowHealing) * getKitMaxHealth(activeCombatant, kitEffectState.effects, party, characterIdCombatantMap));
35
+ };
36
+ const nightVigil = readStance("nightVigil", {
37
+ normalAttacks: [
38
+ swiftHuntStep(0),
39
+ swiftHuntStep(1),
40
+ swiftHuntStep(2)
41
+ ],
42
+ skill: { onStart: impaleTheNight }
43
+ });
44
+ return { skill: { onStart: (context) => {
45
+ const { activeCombatant: combatant, kitEffectState } = context;
46
+ if (combatant.constellationCount >= CONSTELLATION_6) {
47
+ buffKitMember(kitEffectState, combatant.characterId, {
48
+ amount: HUNTERS_VIGIL_CRIT_RATE,
49
+ attribute: "FIGHT_PROP_CRITICAL",
50
+ secondsRemaining: HUNTERS_VIGIL_CRIT_SECONDS
51
+ });
52
+ buffKitMember(kitEffectState, combatant.characterId, {
53
+ amount: HUNTERS_VIGIL_CRIT_DAMAGE,
54
+ attribute: "FIGHT_PROP_CRITICAL_HURT",
55
+ secondsRemaining: HUNTERS_VIGIL_CRIT_SECONDS
56
+ });
57
+ }
58
+ enterKitStance(kitEffectState, combatant, nightVigil, nightVigilSeconds, { isEndedOnSwap: true });
59
+ } } };
60
+ };
61
+ export { createClorindeKitBehaviour };
@@ -0,0 +1,61 @@
1
+ import "./GameDataset-oS0Tc9KV.js";
2
+ import { t as gainPartyMemberEnergy } from "./gainPartyMemberEnergy-DUbIxe6i.js";
3
+ import { t as getDeployedCharacterIds } from "./getDeployedCharacterIds-TuIRCNKb.js";
4
+ import "./KitEventKind-DinObjiq.js";
5
+ import { t as emitKitEvent } from "./emitKitEvent-Cb-ZHu50.js";
6
+ import { t as getActiveCharacterId } from "./getActiveCharacterId-D9TtVSWj.js";
7
+ import "vue";
8
+ // src/models/shared/EnergyDropKind.ts
9
+ let EnergyDropKind = /* @__PURE__ */ function(EnergyDropKind) {
10
+ EnergyDropKind["Orb"] = "Orb";
11
+ EnergyDropKind["Particle"] = "Particle";
12
+ return EnergyDropKind;
13
+ }({});
14
+ // src/services/combat/energy/constants.ts
15
+ const SAME_ELEMENT_PARTICLE_ENERGY = 3;
16
+ const OTHER_ELEMENT_PARTICLE_ENERGY = 1;
17
+ const CLEAR_PARTICLE_ENERGY = 2;
18
+ const ORB_PARTICLE_COUNT = 3;
19
+ const INACTIVE_ENERGY_LOSS_PER_PARTY_MEMBER = .1;
20
+ const ATTACK_ENERGY = 1;
21
+ // src/services/combat/energy/getEnergyGain.ts
22
+ const getEnergyGain = (energyDropKind, { element, energyRecharge, isActive, partySize }, dropElement) => {
23
+ const particleEnergy = dropElement ? dropElement === element ? 3 : 1 : 2;
24
+ const particleCount = energyDropKind === "Orb" ? 3 : 1;
25
+ const share = isActive ? 1 : 1 - INACTIVE_ENERGY_LOSS_PER_PARTY_MEMBER * partySize;
26
+ return particleEnergy * particleCount * share * energyRecharge;
27
+ };
28
+ // src/services/party/gainPartyEnergy.ts
29
+ const gainPartyEnergy = (party, { count, energyDropKind }, dropElement, characterIdCombatantMap) => {
30
+ const characterIds = getDeployedCharacterIds(party);
31
+ const activeCharacterId = getActiveCharacterId(party);
32
+ for (const characterId of characterIds) {
33
+ const combatant = characterIdCombatantMap.get(characterId);
34
+ if (!combatant) continue;
35
+ const recipient = {
36
+ element: combatant.element,
37
+ energyRecharge: combatant.attributes.attributeTotalMap["FIGHT_PROP_CHARGE_EFFICIENCY"],
38
+ isActive: characterId === activeCharacterId,
39
+ partySize: characterIds.length
40
+ };
41
+ gainPartyMemberEnergy(party, combatant, count * getEnergyGain(energyDropKind, recipient, dropElement));
42
+ }
43
+ };
44
+ // src/services/kit/collectKitEnergyDrops.ts
45
+ const collectKitEnergyDrops = (energyDrops, element, context) => {
46
+ const { characterIdCombatantMap, party } = context;
47
+ const characterId = getActiveCharacterId(party);
48
+ for (const energyDrop of energyDrops) {
49
+ const dropElement = "element" in energyDrop ? energyDrop.element : element;
50
+ gainPartyEnergy(party, energyDrop, dropElement, characterIdCombatantMap);
51
+ const { count, energyDropKind } = energyDrop;
52
+ emitKitEvent({
53
+ characterId,
54
+ count,
55
+ element: dropElement,
56
+ energyDropKind,
57
+ kind: "EnergyParticleCollected"
58
+ }, context);
59
+ }
60
+ };
61
+ export { CLEAR_PARTICLE_ENERGY as a, OTHER_ELEMENT_PARTICLE_ENERGY as c, ATTACK_ENERGY as i, SAME_ELEMENT_PARTICLE_ENERGY as l, gainPartyEnergy as n, INACTIVE_ENERGY_LOSS_PER_PARTY_MEMBER as o, getEnergyGain as r, ORB_PARTICLE_COUNT as s, collectKitEnergyDrops as t, EnergyDropKind as u };
@@ -0,0 +1,51 @@
1
+ import "./GameDataset-oS0Tc9KV.js";
2
+ import { t as getDeployedCharacterIds } from "./getDeployedCharacterIds-TuIRCNKb.js";
3
+ import { U as UNBOUNDED_FIELD_RADIUS } from "./constants-BIXoNz1x.js";
4
+ import { t as castKitField } from "./castKitField-BhB1fy3l.js";
5
+ import { buffKitMember, castKitSummon } from "./index.js";
6
+ import { takeOne } from "@esposter/shared";
7
+ // src/services/kit/characters/colleiKit.ts
8
+ const CONSTELLATION_4 = 4;
9
+ const CONSTELLATION_1 = 1;
10
+ const OFF_FIELD_ENERGY_RECHARGE = .2;
11
+ const TRUMP_CARD_KITTY_ELEMENTAL_MASTERY = 60;
12
+ const TRUMP_CARD_KITTY_BUFF_SECONDS = 12;
13
+ const createColleiKitBehaviour = ({ kit, readHit, readSeconds }) => {
14
+ const explosionHitmarkSeconds = takeOne(kit.elementalBurst.hits).hitmarkSeconds;
15
+ const leap = readHit("leap");
16
+ const leapFirstTickSeconds = readSeconds("leapFirstTick");
17
+ const leapTickIntervalSeconds = readSeconds("leapTickInterval");
18
+ const trumpCardKittySeconds = readSeconds("trumpCardKitty");
19
+ return {
20
+ burst: { onStart: ({ activeCombatant: combatant, body: { facing, height, position }, kitEffectState, party }) => {
21
+ if (combatant.constellationCount >= CONSTELLATION_4) {
22
+ for (const characterId of getDeployedCharacterIds(party)) if (characterId !== combatant.characterId) buffKitMember(kitEffectState, characterId, {
23
+ amount: TRUMP_CARD_KITTY_ELEMENTAL_MASTERY,
24
+ attribute: "FIGHT_PROP_ELEMENT_MASTERY",
25
+ secondsRemaining: TRUMP_CARD_KITTY_BUFF_SECONDS
26
+ });
27
+ }
28
+ const field = castKitField(kitEffectState, combatant.characterId, position, {
29
+ nextTickSeconds: leapFirstTickSeconds,
30
+ onTick: ({ kitEffectState: tickEffectState }) => {
31
+ castKitSummon(tickEffectState, {
32
+ facing,
33
+ height,
34
+ position: field.centre
35
+ }, combatant, [leap], { attackTag: "ElementalBurst" });
36
+ },
37
+ radius: UNBOUNDED_FIELD_RADIUS,
38
+ secondsRemaining: explosionHitmarkSeconds + trumpCardKittySeconds,
39
+ tickIntervalSeconds: leapTickIntervalSeconds
40
+ });
41
+ } },
42
+ getPassiveBonuses: (combatant, _healthShare, deployedCombatants) => {
43
+ const self = deployedCombatants.find(({ characterId }) => characterId === combatant.characterId);
44
+ return combatant.constellationCount >= CONSTELLATION_1 && self !== void 0 && !self.isOnField ? [{
45
+ amount: OFF_FIELD_ENERGY_RECHARGE,
46
+ attribute: "FIGHT_PROP_CHARGE_EFFICIENCY"
47
+ }] : [];
48
+ }
49
+ };
50
+ };
51
+ export { createColleiKitBehaviour };