genshin-world 4.1.2 → 4.2.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 (140) hide show
  1. package/package.json +8 -8
  2. package/dist/ReactionType-BBSdxyO3.js +0 -47
  3. package/dist/addKitEffect-DBqTfm_3.js +0 -17
  4. package/dist/ainoKit-Dy3vTp3B.js +0 -28
  5. package/dist/albedoKit-CU5N1Hnm.js +0 -43
  6. package/dist/alhaithamKit-Bhs-coX9.js +0 -212
  7. package/dist/aloyKit-C7x_Jf16.js +0 -32
  8. package/dist/amberKit-BO7ZAQgU.js +0 -38
  9. package/dist/arlecchinoKit-DJawwVVl.js +0 -4
  10. package/dist/ayakaKit-Bu_QuYsR.js +0 -26
  11. package/dist/ayatoKit-BXZNajk7.js +0 -108
  12. package/dist/baizhuKit-8_4IzZ3A.js +0 -33
  13. package/dist/barbaraKit-B5DpLyHJ.js +0 -58
  14. package/dist/beidouKit-sQUahtIk.js +0 -59
  15. package/dist/bennettKit-Cr-zZ_25.js +0 -66
  16. package/dist/candaceKit-BUs_wwFU.js +0 -84
  17. package/dist/characterPack-YAEqbhAX.d.ts +0 -116
  18. package/dist/characterPack-zycIUHje.js +0 -641
  19. package/dist/characterPack.d.ts +0 -2
  20. package/dist/characterPack.js +0 -1
  21. package/dist/charlotteKit-BOZiCPEb.js +0 -90
  22. package/dist/chascaKit-C1Csj0Yf.js +0 -4
  23. package/dist/chevreuseKit-DDHga8Tj.js +0 -20
  24. package/dist/chioriKit-CxRUSHNw.js +0 -28
  25. package/dist/chongyunKit-jrWQKRkG.js +0 -104
  26. package/dist/citlaliKit-sv7XrzVx.js +0 -4
  27. package/dist/clorindeKit-DxtRn_To.js +0 -4
  28. package/dist/colleiKit-CO_n9qra.js +0 -28
  29. package/dist/columbinaKit-DrW0EvqN.js +0 -31
  30. package/dist/constants--ARZpp1u.js +0 -49
  31. package/dist/constants-BqrUOf2M.js +0 -48
  32. package/dist/constants-CSFiwyHy.js +0 -46
  33. package/dist/createWindriseGroundPaint-BmZkGq-r.js +0 -295
  34. package/dist/cynoKit-DpfT5dmS.js +0 -179
  35. package/dist/dahliaKit-B8fOPvvi.js +0 -16
  36. package/dist/dehyaKit-42tyEI0Z.js +0 -4
  37. package/dist/dilucKit-EwLUSPgs.js +0 -63
  38. package/dist/dionaKit-89B1hwYL.js +0 -48
  39. package/dist/doriKit-G9XTwwCP.js +0 -24
  40. package/dist/durinKit-BIYdUkbh.js +0 -49
  41. package/dist/emilieKit-0b2vhNtl.js +0 -21
  42. package/dist/escoffierKit-Da5UAvAF.js +0 -48
  43. package/dist/eulaKit-DAENHIEx.js +0 -129
  44. package/dist/faruzanKit-BcW6D-N3.js +0 -71
  45. package/dist/fischlKit-Bm8vNmuV.js +0 -98
  46. package/dist/flinsKit-GUnFJdUg.js +0 -9
  47. package/dist/freminetKit-CpwsVmTT.js +0 -4
  48. package/dist/furinaKit-BREisAdJ.js +0 -279
  49. package/dist/gamingKit-D9ekWGMJ.js +0 -4
  50. package/dist/ganyuKit-DLJa1t-Z.js +0 -74
  51. package/dist/gorouKit-DkpaGNA8.js +0 -94
  52. package/dist/heizouKit-B6kRXVCP.js +0 -35
  53. package/dist/huTaoKit-drjrzLjf.js +0 -58
  54. package/dist/iansanKit-RNjD9nSq.js +0 -4
  55. package/dist/ifaKit-CXWxCOPI.js +0 -4
  56. package/dist/illugaKit-BFtXIf3P.js +0 -4
  57. package/dist/index-DQB91Tfq.d.ts +0 -19820
  58. package/dist/index.d.ts +0 -4
  59. package/dist/index.js +0 -29218
  60. package/dist/ineffaKit-3J0FJo2E.js +0 -51
  61. package/dist/ittoKit-CfwXkR0g.js +0 -112
  62. package/dist/jahodaKit-C1sdSDfr.js +0 -97
  63. package/dist/jeanKit-Do8vx5Kp.js +0 -56
  64. package/dist/kachinaKit-DWLNDpgO.js +0 -4
  65. package/dist/kaeyaKit-DU8Df4RE.js +0 -14
  66. package/dist/kavehKit-BWoAaKs4.js +0 -9
  67. package/dist/kazuhaKit-C5gn8iGg.js +0 -55
  68. package/dist/keqingKit-uGsb_p7t.js +0 -12
  69. package/dist/kinichKit-Dp3lNUJt.js +0 -22
  70. package/dist/kiraraKit-CCAGXouk.js +0 -43
  71. package/dist/kleeKit-BzcJLC2i.js +0 -48
  72. package/dist/kokomiKit-DBdTlTDr.js +0 -42
  73. package/dist/kujouSaraKit-DDE-24jd.js +0 -56
  74. package/dist/kukiKit-DcARldP9.js +0 -59
  75. package/dist/lanYanKit-B3lwZ7OW.js +0 -18
  76. package/dist/laumaKit-DkG-i0rL.js +0 -59
  77. package/dist/laylaKit-DYtz0tSZ.js +0 -41
  78. package/dist/linneaKit-DlVhnbGM.js +0 -4
  79. package/dist/lisaKit-CWUiiam1.js +0 -22
  80. package/dist/lohenKit-D-uagI_g.js +0 -4
  81. package/dist/lynetteKit-BnNW81Pm.js +0 -20
  82. package/dist/lyneyKit-D6yTnfFv.js +0 -19
  83. package/dist/mavuikaKit-CUC1kHRJ.js +0 -4
  84. package/dist/mikaKit-C9xDhjJg.js +0 -17
  85. package/dist/mizukiKit-DY-gHM8N.js +0 -4
  86. package/dist/monaKit-B748iTEy.js +0 -26
  87. package/dist/mualaniKit-B-Km_dcQ.js +0 -4
  88. package/dist/nahidaKit-BGRc-swN.js +0 -4
  89. package/dist/naviaKit-CHh2VdX3.js +0 -64
  90. package/dist/neferKit-BTALTTiV.js +0 -4
  91. package/dist/neuvilletteKit-DAfX_2tC.js +0 -4
  92. package/dist/nicoleKit-BVjL7LI0.js +0 -4
  93. package/dist/nilouKit-BgM4u-hg.js +0 -52
  94. package/dist/ningguangKit-N88BhNb_.js +0 -105
  95. package/dist/noelleKit-DDewnuJ9.js +0 -48
  96. package/dist/ororonKit-DiAd2dlh.js +0 -86
  97. package/dist/pruneKit-CHkC_OSB.js +0 -4
  98. package/dist/qiqiKit-DCtsriE7.js +0 -88
  99. package/dist/raidenKit-BBWMmPFn.js +0 -144
  100. package/dist/razorKit-CBgdHYic.js +0 -90
  101. package/dist/readCharacterAvatar-C7FufK7J.js +0 -292
  102. package/dist/rosariaKit-D_RDXpLp.js +0 -29
  103. package/dist/save-CEbj1mOx.js +0 -854
  104. package/dist/save.d.ts +0 -2
  105. package/dist/save.js +0 -1
  106. package/dist/sayuKit-Hnv4iA3_.js +0 -35
  107. package/dist/sceneExport-BZaF05K-.d.ts +0 -70
  108. package/dist/sceneExport-DiiIi0PM.js +0 -27
  109. package/dist/sceneExport.d.ts +0 -2
  110. package/dist/sceneExport.js +0 -1
  111. package/dist/sethosKit-8EK04AA4.js +0 -4
  112. package/dist/shenheKit-DqrG2I4S.js +0 -50
  113. package/dist/sigewinneKit-CYJyadTr.js +0 -10
  114. package/dist/skirkKit-BDjoFGAq.js +0 -10
  115. package/dist/style.css +0 -3612
  116. package/dist/sucroseKit-DF0jcI2y.js +0 -101
  117. package/dist/tartagliaKit-Bbtww18S.js +0 -136
  118. package/dist/terrainTileWorker.d.ts +0 -1
  119. package/dist/terrainTileWorker.js +0 -81
  120. package/dist/thomaKit-Zm5AJ9Fm.js +0 -64
  121. package/dist/tighnariKit-CSa_Yqpp.js +0 -4
  122. package/dist/varesaKit-CMXLbBv9.js +0 -4
  123. package/dist/varkaKit-C8_HlTVH.js +0 -4
  124. package/dist/ventiKit-BcQkbI-z.js +0 -52
  125. package/dist/wandererKit-CQM691sn.js +0 -9
  126. package/dist/wriothesleyKit-CBTnYlOy.js +0 -4
  127. package/dist/xianglingKit-BPQN7cxU.js +0 -108
  128. package/dist/xianyunKit-CVhuYBde.js +0 -4
  129. package/dist/xiaoKit-BDI_SODG.js +0 -90
  130. package/dist/xilonenKit-YAVOPRwm.js +0 -4
  131. package/dist/xingqiuKit-Cv8JYeYO.js +0 -106
  132. package/dist/xinyanKit-CffF-Er0.js +0 -120
  133. package/dist/yaeMikoKit-xAKYm2K6.js +0 -44
  134. package/dist/yanfeiKit-C6elnkmn.js +0 -86
  135. package/dist/yaoyaoKit-CaPIIp-i.js +0 -4
  136. package/dist/yelanKit-Da0oQ6yu.js +0 -33
  137. package/dist/yoimiyaKit-DTENWB4y.js +0 -49
  138. package/dist/yunjinKit-PP4yeyn1.js +0 -22
  139. package/dist/zhongliKit-uMdKUTP-.js +0 -100
  140. package/dist/zibaiKit-Dq6mFWSx.js +0 -4
@@ -1,279 +0,0 @@
1
- import "./characterPack-zycIUHje.js";
2
- import { t as addKitEffect } from "./addKitEffect-DBqTfm_3.js";
3
- import { DAMAGE_BONUS_ATTRIBUTES, addKitStatus, buffKitMember, castKitField, castKitSummon, changeKitMemberHealth, checkHasKitStatus, checkIsKitStatusActive, createMaxHealthScaledBonus, findKitStatus, gainPartyMemberEnergy, getDeployedCharacterIds, getPartyMember, removeKitEffects, scheduleKitTask, selectAttackTarget, startKitCooldown, toKitSeconds } from "./index.js";
4
- import { takeOne } from "@esposter/shared";
5
- //#region src/services/kit/characters/furinaKit.ts
6
- const PNEUMA_STATUS_ID = "furina-pneuma";
7
- const SPIRITBREATH_THORN_COOLDOWN_STATUS_ID = "furina-spiritbreath-thorn-cooldown";
8
- const SURGING_BLADE_COOLDOWN_STATUS_ID = "furina-surging-blade-cooldown";
9
- const SALON_STATUS_ID = "furina-salon-solitaire";
10
- const SALON_MEMBER_FIELD_ID = "furina-salon-member";
11
- const SALON_ATTACK_SUMMON_ID = "furina-salon-attack";
12
- const SINGER_FIELD_ID = "furina-singer";
13
- const SALON_DRAINED_HEALTH_SHARE_MIN = .5;
14
- const SALON_DAMAGE_BONUS_PER_DRAINED_MEMBER = .1;
15
- const FANFARE_SECONDS = 18.2;
16
- const FANFARE_STATUS_ID = "furina-fanfare";
17
- const FANFARE_DEBOUNCE_STATUS_ID = "furina-fanfare-debounce";
18
- const FANFARE_BUFF_SOURCE = "furina-fanfare";
19
- const ASCENSION_1 = 1;
20
- const ASCENSION_4 = 4;
21
- const ENDLESS_WALTZ_STATUS_ID = "furina-endless-waltz";
22
- const ENDLESS_WALTZ_FIELD_ID = "furina-endless-waltz-regeneration";
23
- const ENDLESS_WALTZ_SECONDS = 4;
24
- const ENDLESS_WALTZ_INTERVAL_SECONDS = 2;
25
- const ENDLESS_WALTZ_HEALTH_SHARE = .02;
26
- const ASCENSION_4_MAX_HEALTH_STEP = 1e3;
27
- const ASCENSION_4_DAMAGE_BONUS_PER_STEP = .007;
28
- const ASCENSION_4_DAMAGE_BONUS_MAX = .28;
29
- const ASCENSION_4_INTERVAL_CUT_PER_STEP = .004;
30
- const ASCENSION_4_INTERVAL_CUT_MAX = .16;
31
- const CONSTELLATION_1 = 1;
32
- const CONSTELLATION_2 = 2;
33
- const CONSTELLATION_4 = 4;
34
- const CONSTELLATION_1_FANFARE_START = 150;
35
- const CONSTELLATION_1_FANFARE_MAX_BONUS = 100;
36
- const CONSTELLATION_2_FANFARE_MULTIPLIER = 3.5;
37
- const CONSTELLATION_4_ENERGY = 4;
38
- const CONSTELLATION_4_COOLDOWN_SECONDS = 5;
39
- const CONSTELLATION_4_COOLDOWN_STATUS_ID = "furina-c4-cooldown";
40
- const getAscension4MaxHealthShare = ({ ascension, attributes }, rate, cap) => ascension < ASCENSION_4 ? 0 : Math.min(attributes.maxHealth / ASCENSION_4_MAX_HEALTH_STEP * rate, cap);
41
- const getSalonDamageBonus = (combatant) => getAscension4MaxHealthShare(combatant, ASCENSION_4_DAMAGE_BONUS_PER_STEP, ASCENSION_4_DAMAGE_BONUS_MAX);
42
- const getSingerIntervalCut = (combatant) => getAscension4MaxHealthShare(combatant, ASCENSION_4_INTERVAL_CUT_PER_STEP, ASCENSION_4_INTERVAL_CUT_MAX);
43
- const endSalon = (kitEffectState, characterId) => {
44
- const checkIsSalonEffect = (effect) => effect.kind === "field" && effect.characterId === characterId && (effect.id === SALON_MEMBER_FIELD_ID || effect.id === SINGER_FIELD_ID) || effect.kind === "summon" && effect.combatant.characterId === characterId && effect.id === SALON_ATTACK_SUMMON_ID;
45
- for (const effect of kitEffectState.effects) if (checkIsSalonEffect(effect)) effect.secondsRemaining = 0;
46
- removeKitEffects(kitEffectState, checkIsSalonEffect);
47
- };
48
- const gainConstellation4Energy = ({ kitEffectState, party }, combatant) => {
49
- const { characterId, constellationCount } = combatant;
50
- if (constellationCount < CONSTELLATION_4 || !startKitCooldown(kitEffectState, characterId, CONSTELLATION_4_COOLDOWN_STATUS_ID, CONSTELLATION_4_COOLDOWN_SECONDS)) return;
51
- gainPartyMemberEnergy(party, combatant, CONSTELLATION_4_ENERGY);
52
- };
53
- const castEndlessWaltz = (kitEffectState, combatant, { x, z }) => {
54
- const { characterId } = combatant;
55
- const field = castKitField(kitEffectState, characterId, {
56
- x,
57
- z
58
- }, {
59
- id: ENDLESS_WALTZ_FIELD_ID,
60
- nextTickSeconds: ENDLESS_WALTZ_INTERVAL_SECONDS,
61
- onTick: (tick) => {
62
- if (field.secondsRemaining <= 0) return;
63
- if (!checkIsKitStatusActive(tick.kitEffectState.effects, characterId, ENDLESS_WALTZ_STATUS_ID)) {
64
- field.secondsRemaining = 0;
65
- return;
66
- }
67
- for (const memberId of getDeployedCharacterIds(tick.party)) {
68
- const member = tick.characterIdCombatantMap.get(memberId);
69
- if (member) changeKitMemberHealth(tick, combatant, memberId, ENDLESS_WALTZ_HEALTH_SHARE * member.attributes.maxHealth);
70
- }
71
- },
72
- secondsRemaining: Number.POSITIVE_INFINITY,
73
- tickIntervalSeconds: ENDLESS_WALTZ_INTERVAL_SECONDS
74
- });
75
- };
76
- const startEndlessWaltz = ({ activeCombatant, body, kitEffectState }, combatant, event) => {
77
- const { ascension, characterId } = combatant;
78
- if (ascension < ASCENSION_1 || event.overflowHealthShare <= 0 || event.sourceCharacterId === characterId || event.characterId !== activeCombatant.characterId) return;
79
- if (!checkIsKitStatusActive(kitEffectState.effects, characterId, ENDLESS_WALTZ_STATUS_ID)) {
80
- for (const effect of kitEffectState.effects) if (effect.kind === "field" && effect.characterId === characterId && effect.id === ENDLESS_WALTZ_FIELD_ID) effect.secondsRemaining = 0;
81
- castEndlessWaltz(kitEffectState, combatant, body.position);
82
- }
83
- addKitStatus(kitEffectState, characterId, {
84
- id: ENDLESS_WALTZ_STATUS_ID,
85
- secondsRemaining: ENDLESS_WALTZ_SECONDS
86
- });
87
- };
88
- const castFollowingField = (kitEffectState, combatant, { x, z }, { delaySeconds, id, initialTickSeconds, intervalSeconds, onTick, secondsRemaining }) => {
89
- const field = castKitField(kitEffectState, combatant.characterId, {
90
- x,
91
- z
92
- }, {
93
- id,
94
- isFollowing: true,
95
- nextTickSeconds: delaySeconds + initialTickSeconds,
96
- onTick: (tick) => onTick(tick, field),
97
- secondsRemaining,
98
- tickIntervalSeconds: intervalSeconds
99
- });
100
- };
101
- const createFurinaKitBehaviour = ({ kit, readFrames, readHit, readHits, readParameter, readParameters, readSeconds, readSecondsList }) => {
102
- const arkhe = readHit("arkhe");
103
- const arkheCooldownSecondsList = readParameters("arkheHitCooldownSeconds");
104
- const surgingBladeCooldownSeconds = takeOne(arkheCooldownSecondsList, 0);
105
- const spiritbreathThornCooldownSeconds = takeOne(arkheCooldownSecondsList, 1);
106
- const ousiaBubble = readHit("ousiaBubble");
107
- const salonSeconds = readSeconds("salon");
108
- const pneumaSummonDelaySeconds = readSeconds("pneumaSummonDelay");
109
- const arkheSwitchSeconds = readSeconds("arkheSwitch");
110
- const salonMemberAttacks = readHits("salonMemberAttacks");
111
- const salonMemberInitialTickSecondsList = readSecondsList("salonMemberInitialTicks");
112
- const salonMemberIntervalSecondsList = readSecondsList("salonMemberIntervals");
113
- const salonMemberDrainedMaxHealthShares = readParameters("salonMemberDrainedMaxHealthShares");
114
- const salonMemberMultipliers = readParameters("salonMemberMultipliers");
115
- const salonMembers = salonMemberAttacks.map((attack, index) => ({
116
- attack,
117
- drainedMaxHealthShare: takeOne(salonMemberDrainedMaxHealthShares, index),
118
- initialTickSeconds: takeOne(salonMemberInitialTickSecondsList, index),
119
- intervalSeconds: takeOne(salonMemberIntervalSecondsList, index),
120
- multiplier: takeOne(salonMemberMultipliers, index)
121
- }));
122
- const singerFlatHealth = readParameter("singerHealFlatHealth");
123
- const singerMaxHealthShare = readParameter("singerHealMaxHealthShare");
124
- const singerInitialTickSeconds = readSeconds("singerInitialTick");
125
- const singerIntervalFrames = readFrames("singerInterval");
126
- const fanfareMax = readParameter("fanfareMax");
127
- const fanfareHealthShare = readParameter("fanfareHealthSharePerPoint");
128
- const fanfareDamageBonusPerPoint = readParameter("fanfareDamageBonusPerPoint");
129
- const fanfareIncomingHealingBonusPerPoint = readParameter("fanfareIncomingHealingBonusPerPoint");
130
- const fanfareStartSeconds = readSeconds("fanfareStart");
131
- const fanfareGainDelaySeconds = readSeconds("fanfareGainDelay");
132
- const fanfareDebounceStartSeconds = readSeconds("fanfareDebounceStart");
133
- const fanfareDebounceSeconds = readSeconds("fanfareDebounce");
134
- const openArkheHit = ({ kitEffectState }, { body, combatant }) => {
135
- const { characterId } = combatant;
136
- const isPneuma = checkHasKitStatus(kitEffectState.effects, characterId, PNEUMA_STATUS_ID);
137
- if (!startKitCooldown(kitEffectState, characterId, isPneuma ? SURGING_BLADE_COOLDOWN_STATUS_ID : SPIRITBREATH_THORN_COOLDOWN_STATUS_ID, isPneuma ? surgingBladeCooldownSeconds : spiritbreathThornCooldownSeconds)) return;
138
- castKitSummon(kitEffectState, body, combatant, [arkhe], { attackTag: "NormalAttack" });
139
- };
140
- const attackWithSalonMember = (tick, combatant, { attack, drainedMaxHealthShare, multiplier }, centre) => {
141
- const target = selectAttackTarget(kit.elementalSkill.targetingArea, {
142
- facing: 0,
143
- height: 0,
144
- position: centre
145
- }, tick.enemyMap.values());
146
- if (!target) return;
147
- let drainedCount = 0;
148
- for (const memberId of getDeployedCharacterIds(tick.party)) {
149
- const member = tick.characterIdCombatantMap.get(memberId);
150
- if (!member || getPartyMember(tick.party, memberId).healthShare <= SALON_DRAINED_HEALTH_SHARE_MIN) continue;
151
- drainedCount++;
152
- changeKitMemberHealth(tick, combatant, memberId, -drainedMaxHealthShare * member.attributes.maxHealth);
153
- }
154
- const hit = {
155
- ...attack,
156
- additiveBaseDamageBonus: createMaxHealthScaledBonus(multiplier * (1 + SALON_DAMAGE_BONUS_PER_DRAINED_MEMBER * drainedCount)),
157
- damageBonus: getSalonDamageBonus(combatant),
158
- onStrike: (context, strike) => gainConstellation4Energy(context, strike.combatant)
159
- };
160
- castKitSummon(tick.kitEffectState, {
161
- facing: 0,
162
- height: 0,
163
- position: target.position
164
- }, combatant, [hit], {
165
- attackTag: "ElementalSkill",
166
- id: SALON_ATTACK_SUMMON_ID
167
- });
168
- };
169
- const castSalonMember = (kitEffectState, combatant, salonMember, centre, delaySeconds, secondsRemaining) => castFollowingField(kitEffectState, combatant, centre, {
170
- delaySeconds,
171
- id: SALON_MEMBER_FIELD_ID,
172
- initialTickSeconds: salonMember.initialTickSeconds,
173
- intervalSeconds: salonMember.intervalSeconds,
174
- onTick: (tick, field) => {
175
- if (field.secondsRemaining > 0) attackWithSalonMember(tick, combatant, salonMember, field.centre);
176
- },
177
- secondsRemaining
178
- });
179
- const castSinger = (kitEffectState, combatant, centre, delaySeconds, secondsRemaining) => castFollowingField(kitEffectState, combatant, centre, {
180
- delaySeconds,
181
- id: SINGER_FIELD_ID,
182
- initialTickSeconds: singerInitialTickSeconds,
183
- intervalSeconds: toKitSeconds(Math.round(singerIntervalFrames * (1 - getSingerIntervalCut(combatant)))),
184
- onTick: (tick, field) => {
185
- if (field.secondsRemaining <= 0) return;
186
- changeKitMemberHealth(tick, combatant, tick.activeCombatant.characterId, singerFlatHealth + singerMaxHealthShare * combatant.attributes.maxHealth);
187
- gainConstellation4Energy(tick, combatant);
188
- },
189
- secondsRemaining
190
- });
191
- const summonSalon = (kitEffectState, combatant, centre, delaySeconds, secondsRemaining) => {
192
- endSalon(kitEffectState, combatant.characterId);
193
- if (checkHasKitStatus(kitEffectState.effects, combatant.characterId, PNEUMA_STATUS_ID)) castSinger(kitEffectState, combatant, centre, delaySeconds, secondsRemaining);
194
- else for (const salonMember of salonMembers) castSalonMember(kitEffectState, combatant, salonMember, centre, delaySeconds, secondsRemaining);
195
- };
196
- const switchArkhe = (kitEffectState, combatant, centre) => {
197
- const { characterId } = combatant;
198
- const pneuma = findKitStatus(kitEffectState.effects, characterId, PNEUMA_STATUS_ID);
199
- if (pneuma) removeKitEffects(kitEffectState, (effect) => effect === pneuma);
200
- else addKitStatus(kitEffectState, characterId, {
201
- id: PNEUMA_STATUS_ID,
202
- secondsRemaining: Number.POSITIVE_INFINITY
203
- });
204
- const salon = findKitStatus(kitEffectState.effects, characterId, SALON_STATUS_ID);
205
- if (salon && salon.secondsRemaining > 0) summonSalon(kitEffectState, combatant, centre, 0, salon.secondsRemaining);
206
- };
207
- const getFanfareMax = ({ constellationCount }) => fanfareMax + (constellationCount >= CONSTELLATION_1 ? CONSTELLATION_1_FANFARE_MAX_BONUS : 0);
208
- const fanfareBonusesPerPoint = [...DAMAGE_BONUS_ATTRIBUTES.map((attribute) => [attribute, fanfareDamageBonusPerPoint]), ["FIGHT_PROP_HEALED_ADD", fanfareIncomingHealingBonusPerPoint]];
209
- const setFanfare = (kitEffectState, party, combatant, fanfareStatus, fanfare) => {
210
- fanfareStatus.stacks = Math.min(getFanfareMax(combatant), fanfare);
211
- const { secondsRemaining, stacks } = fanfareStatus;
212
- for (const characterId of getDeployedCharacterIds(party)) for (const [attribute, amountPerPoint] of fanfareBonusesPerPoint) buffKitMember(kitEffectState, characterId, {
213
- amount: stacks * amountPerPoint,
214
- attribute,
215
- secondsRemaining,
216
- source: FANFARE_BUFF_SOURCE
217
- });
218
- };
219
- const gainFanfare = ({ kitEffectState }, combatant, healthShare) => {
220
- const { characterId, constellationCount } = combatant;
221
- if (healthShare === 0 || !checkIsKitStatusActive(kitEffectState.effects, characterId, FANFARE_STATUS_ID)) return;
222
- const fanfare = Math.abs(healthShare) / fanfareHealthShare * (constellationCount >= CONSTELLATION_2 ? CONSTELLATION_2_FANFARE_MULTIPLIER : 1);
223
- const debounce = findKitStatus(kitEffectState.effects, characterId, FANFARE_DEBOUNCE_STATUS_ID);
224
- let delaySeconds = fanfareGainDelaySeconds;
225
- if (debounce && debounce.secondsRemaining > 0) delaySeconds = debounce.secondsRemaining;
226
- else scheduleKitTask(kitEffectState, characterId, fanfareDebounceStartSeconds, (tick) => addKitStatus(tick.kitEffectState, characterId, {
227
- id: FANFARE_DEBOUNCE_STATUS_ID,
228
- secondsRemaining: fanfareDebounceSeconds
229
- }));
230
- scheduleKitTask(kitEffectState, characterId, delaySeconds, (tick) => {
231
- const fanfareStatus = findKitStatus(tick.kitEffectState.effects, characterId, FANFARE_STATUS_ID);
232
- if (fanfareStatus && fanfareStatus.secondsRemaining > 0) setFanfare(tick.kitEffectState, tick.party, combatant, fanfareStatus, (fanfareStatus.stacks ?? 0) + fanfare);
233
- });
234
- };
235
- const strike = { hits: [{ onStrike: openArkheHit }] };
236
- return {
237
- burst: { onStart: ({ activeCombatant: combatant, kitEffectState }) => {
238
- const { characterId, constellationCount } = combatant;
239
- for (const effect of kitEffectState.effects) if (effect.kind === "status" && effect.characterId === characterId && effect.id === FANFARE_STATUS_ID || effect.kind === "buff" && effect.source === FANFARE_BUFF_SOURCE) effect.secondsRemaining = 0;
240
- scheduleKitTask(kitEffectState, characterId, fanfareStartSeconds, (tick) => {
241
- const fanfareStatus = {
242
- characterId,
243
- id: FANFARE_STATUS_ID,
244
- kind: "status",
245
- secondsRemaining: FANFARE_SECONDS,
246
- stacks: 0
247
- };
248
- addKitEffect(tick.kitEffectState, fanfareStatus);
249
- setFanfare(tick.kitEffectState, tick.party, combatant, fanfareStatus, constellationCount >= CONSTELLATION_1 ? CONSTELLATION_1_FANFARE_START : 0);
250
- });
251
- } },
252
- chargedAttack: { onStart: ({ activeCombatant: combatant, body, kitEffectState }) => scheduleKitTask(kitEffectState, combatant.characterId, arkheSwitchSeconds, (tick) => switchArkhe(tick.kitEffectState, combatant, body.position)) },
253
- normalAttacks: [
254
- strike,
255
- strike,
256
- strike,
257
- strike
258
- ],
259
- onKitEvent: (event, context, combatant) => {
260
- if (event.kind !== "HealthChanged") return;
261
- gainFanfare(context, combatant, event.healthShare);
262
- startEndlessWaltz(context, combatant, event);
263
- },
264
- skill: { onStart: ({ activeCombatant: combatant, body, kitEffectState }) => {
265
- const { characterId } = combatant;
266
- const isPneuma = checkHasKitStatus(kitEffectState.effects, characterId, PNEUMA_STATUS_ID);
267
- const delaySeconds = isPneuma ? pneumaSummonDelaySeconds : ousiaBubble.hitmarkSeconds;
268
- const secondsRemaining = salonSeconds + delaySeconds;
269
- addKitStatus(kitEffectState, characterId, {
270
- id: SALON_STATUS_ID,
271
- secondsRemaining
272
- });
273
- if (!isPneuma) castKitSummon(kitEffectState, body, combatant, [ousiaBubble], { attackTag: "ElementalSkill" });
274
- summonSalon(kitEffectState, combatant, body.position, delaySeconds, secondsRemaining);
275
- } }
276
- };
277
- };
278
- //#endregion
279
- export { createFurinaKitBehaviour };
@@ -1,4 +0,0 @@
1
- //#region src/services/kit/characters/gamingKit.ts
2
- const createGamingKitBehaviour = () => ({});
3
- //#endregion
4
- export { createGamingKitBehaviour };
@@ -1,74 +0,0 @@
1
- import "./characterPack-zycIUHje.js";
2
- import { buffKitMember, castKitField, castKitSummon, castKitTaunt } from "./index.js";
3
- import { takeOne } from "@esposter/shared";
4
- //#region src/services/kit/characters/ganyuKit.ts
5
- const ICE_LOTUS_HEALTH = Number.POSITIVE_INFINITY;
6
- const CELESTIAL_SHOWER_RADIUS = 10;
7
- const HARMONY_ASCENSION = 4;
8
- const HARMONY_CRYO_DAMAGE_BONUS = .2;
9
- const HARMONY_SECONDS = 1;
10
- const UNDIVIDED_HEART_ASCENSION = 1;
11
- const UNDIVIDED_HEART_CRITICAL_RATE = .2;
12
- const UNDIVIDED_HEART_SECONDS = 5;
13
- const UNDIVIDED_HEART_SOURCE = "ganyu-undivided-heart";
14
- const HARMONY_SOURCE = "ganyu-harmony";
15
- const FROSTFLAKE_CONSTELLATION = 1;
16
- const FROSTFLAKE_CRYO_RESISTANCE_REDUCTION = .15;
17
- const FROSTFLAKE_STATUS = {
18
- damageTakenBonus: 0,
19
- id: "ganyu-frostflake",
20
- resistanceReduction: { ["Ice"]: FROSTFLAKE_CRYO_RESISTANCE_REDUCTION },
21
- secondsRemaining: 5
22
- };
23
- const getFrostflakeStatus = ({ constellationCount }) => constellationCount >= FROSTFLAKE_CONSTELLATION ? FROSTFLAKE_STATUS : void 0;
24
- const createGanyuKitBehaviour = ({ kit, readHit, readParameter, readSeconds }) => {
25
- const iceLotusFlowerHitmarkSeconds = takeOne(kit.elementalSkill.hits).hitmarkSeconds;
26
- const iceLotusExplosion = readHit("iceLotusExplosion");
27
- const iceLotusSeconds = readParameter("iceLotusSeconds");
28
- const celestialShowerHit = readHit("celestialShower");
29
- const celestialShowerSeconds = readParameter("celestialShowerSeconds");
30
- const celestialShowerStartSeconds = readSeconds("celestialShowerStart");
31
- const celestialShowerTickIntervalSeconds = readSeconds("celestialShowerTickInterval");
32
- return {
33
- burst: { onStart: ({ activeCombatant: combatant, body: { facing, height, position }, kitEffectState }) => {
34
- const field = castKitField(kitEffectState, combatant.characterId, position, {
35
- nextTickSeconds: celestialShowerStartSeconds,
36
- onTick: ({ activeCombatant, kitEffectState: tickEffectState }) => {
37
- if (combatant.ascension >= HARMONY_ASCENSION) buffKitMember(tickEffectState, activeCombatant.characterId, {
38
- amount: HARMONY_CRYO_DAMAGE_BONUS,
39
- attribute: "FIGHT_PROP_ICE_ADD_HURT",
40
- secondsRemaining: HARMONY_SECONDS,
41
- source: HARMONY_SOURCE
42
- });
43
- castKitSummon(tickEffectState, {
44
- facing,
45
- height,
46
- position: field.centre
47
- }, combatant, [celestialShowerHit]);
48
- },
49
- radius: CELESTIAL_SHOWER_RADIUS,
50
- secondsRemaining: celestialShowerSeconds + celestialShowerStartSeconds + .1,
51
- tickIntervalSeconds: celestialShowerTickIntervalSeconds
52
- });
53
- } },
54
- chargedAttack: { hits: [{
55
- enemyStatus: getFrostflakeStatus,
56
- onStrike: ({ kitEffectState }, { combatant }) => {
57
- if (combatant.ascension < UNDIVIDED_HEART_ASCENSION) return;
58
- buffKitMember(kitEffectState, combatant.characterId, {
59
- amount: UNDIVIDED_HEART_CRITICAL_RATE,
60
- attribute: "FIGHT_PROP_CRITICAL",
61
- secondsRemaining: UNDIVIDED_HEART_SECONDS,
62
- source: UNDIVIDED_HEART_SOURCE
63
- });
64
- }
65
- }, { enemyStatus: getFrostflakeStatus }] },
66
- skill: { onStart: ({ activeCombatant: combatant, body, kitEffectState }) => castKitTaunt(kitEffectState, body, combatant, {
67
- explosion: iceLotusExplosion,
68
- health: ICE_LOTUS_HEALTH,
69
- secondsRemaining: iceLotusFlowerHitmarkSeconds + iceLotusSeconds
70
- }) }
71
- };
72
- };
73
- //#endregion
74
- export { createGanyuKitBehaviour };
@@ -1,94 +0,0 @@
1
- import "./characterPack-zycIUHje.js";
2
- import { buffKitMember, buffKitTeam, castKitField, castKitSummon, createAheadBody } from "./index.js";
3
- import { takeOne } from "@esposter/shared";
4
- //#region src/services/kit/characters/gorouKit.ts
5
- const SKILL_OFFSET_METRES = 2;
6
- const BANNER_RADIUS = 8;
7
- const BANNER_BUFF_SECONDS = 2;
8
- const CRUNCH_GEO_COUNT = 3;
9
- const WAR_BANNER_ID = "gorou-war-banner";
10
- const JUUGA_ID = "gorou-juuga";
11
- const DEFENSE_SOURCE = "gorou-defense";
12
- const CRUNCH_SOURCE = "gorou-crunch";
13
- const A1_SOURCE = "gorou-a1";
14
- const A1_DEFENSE_PERCENT = .25;
15
- const A1_SECONDS = 12;
16
- const DEFENSE_DAMAGE_ASCENSION = 4;
17
- const SKILL_DEFENSE_SHARE = 1.56;
18
- const BURST_DEFENSE_SHARE = .156;
19
- const createDefenseDamageBonus = (share) => (combatant) => combatant.ascension >= DEFENSE_DAMAGE_ASCENSION ? combatant.attributes.defense * share : 0;
20
- const createGorouKitBehaviour = ({ kit, readHit, readParameter, readSeconds }) => {
21
- const skillHitmarkSeconds = takeOne(kit.elementalSkill.hits).hitmarkSeconds;
22
- const burstHitmarkSeconds = takeOne(kit.elementalBurst.hits).hitmarkSeconds;
23
- const defenseBonus = readParameter("generalsWarBannerDefenseBonus");
24
- const crunchGeoDamageBonus = readParameter("crunchGeoDamageBonus");
25
- const bannerSeconds = readParameter("bannerSeconds");
26
- const juugaSeconds = readParameter("juugaSeconds");
27
- const warBannerNextTickSeconds = readSeconds("generalsWarBannerFirstTick");
28
- const juugaFieldNextTickSeconds = readSeconds("generalsGloryFirstTick");
29
- const bannerTickSeconds = readSeconds("bannerTick");
30
- const crystalCollapseFirstSeconds = readSeconds("crystalCollapseFirst");
31
- const crystalCollapseIntervalSeconds = readSeconds("crystalCollapseInterval");
32
- const burstDefenseDamageBonus = createDefenseDamageBonus(BURST_DEFENSE_SHARE);
33
- const crystalCollapseHit = readHit("crystalCollapse", { additiveBaseDamageBonus: burstDefenseDamageBonus });
34
- const crystalCollapseHits = Array.from({ length: Math.floor(juugaSeconds / crystalCollapseIntervalSeconds) }, (_value, index) => ({
35
- ...crystalCollapseHit,
36
- hitmarkSeconds: burstHitmarkSeconds + (crystalCollapseFirstSeconds + crystalCollapseIntervalSeconds * index)
37
- }));
38
- const addFieldBuffs = ({ activeCombatant, characterIdCombatantMap, kitEffectState }) => {
39
- buffKitMember(kitEffectState, activeCombatant.characterId, {
40
- amount: defenseBonus,
41
- attribute: "FIGHT_PROP_DEFENSE",
42
- secondsRemaining: BANNER_BUFF_SECONDS,
43
- source: DEFENSE_SOURCE
44
- });
45
- if ([...characterIdCombatantMap.values()].filter(({ element }) => element === "Rock").length >= CRUNCH_GEO_COUNT) buffKitMember(kitEffectState, activeCombatant.characterId, {
46
- amount: crunchGeoDamageBonus,
47
- attribute: "FIGHT_PROP_ROCK_ADD_HURT",
48
- secondsRemaining: BANNER_BUFF_SECONDS,
49
- source: CRUNCH_SOURCE
50
- });
51
- };
52
- return {
53
- burst: {
54
- hits: [{ additiveBaseDamageBonus: burstDefenseDamageBonus }],
55
- onStart: ({ activeCombatant: combatant, body, kitEffectState, party }) => {
56
- for (const effect of kitEffectState.effects) if (effect.kind === "field" && effect.id === WAR_BANNER_ID) effect.secondsRemaining = 0;
57
- castKitField(kitEffectState, combatant.characterId, body.position, {
58
- id: JUUGA_ID,
59
- isFollowing: true,
60
- nextTickSeconds: juugaFieldNextTickSeconds,
61
- onTick: addFieldBuffs,
62
- secondsRemaining: burstHitmarkSeconds + juugaSeconds,
63
- tickIntervalSeconds: bannerTickSeconds
64
- });
65
- castKitSummon(kitEffectState, body, combatant, crystalCollapseHits, {
66
- isFollowing: true,
67
- secondsRemaining: burstHitmarkSeconds + juugaSeconds
68
- });
69
- if (combatant.ascension >= 1) buffKitTeam(kitEffectState, party, {
70
- amount: A1_DEFENSE_PERCENT,
71
- attribute: "FIGHT_PROP_DEFENSE_PERCENT",
72
- secondsRemaining: A1_SECONDS,
73
- source: A1_SOURCE
74
- });
75
- }
76
- },
77
- skill: {
78
- hits: [{ additiveBaseDamageBonus: createDefenseDamageBonus(SKILL_DEFENSE_SHARE) }],
79
- onStart: ({ activeCombatant: combatant, body, kitEffectState }) => {
80
- if (kitEffectState.effects.some((effect) => effect.kind === "field" && effect.id === JUUGA_ID && effect.secondsRemaining > 0)) return;
81
- castKitField(kitEffectState, combatant.characterId, createAheadBody(body, SKILL_OFFSET_METRES).position, {
82
- id: WAR_BANNER_ID,
83
- nextTickSeconds: warBannerNextTickSeconds,
84
- onTick: addFieldBuffs,
85
- radius: BANNER_RADIUS,
86
- secondsRemaining: skillHitmarkSeconds + bannerSeconds,
87
- tickIntervalSeconds: bannerTickSeconds
88
- });
89
- }
90
- }
91
- };
92
- };
93
- //#endregion
94
- export { createGorouKitBehaviour };
@@ -1,35 +0,0 @@
1
- import { addKitStatus, castKitSummon, findAbsorbedElement, findKitStatus } from "./index.js";
2
- //#region src/services/kit/characters/heizouKit.ts
3
- const IRIS_TAG_STATUS_ID = "heizou-windmuster-iris-tags";
4
- const IRIS_MAX_TAGS = 4;
5
- const createHeizouKitBehaviour = ({ kit, readHit }) => {
6
- const [irisCheckHit] = kit.elementalBurst.hits;
7
- const iris = readHit("iris");
8
- const createIrisHit = (element) => ({
9
- ...iris,
10
- element
11
- });
12
- return {
13
- burst: { onStart: ({ activeCombatant: combatant, kitEffectState }) => addKitStatus(kitEffectState, combatant.characterId, {
14
- id: IRIS_TAG_STATUS_ID,
15
- secondsRemaining: kit.elementalBurst.seconds,
16
- stacks: 0
17
- }) },
18
- onKitEvent: (event, { kitEffectState }) => {
19
- if (event.kind !== "DamageTaken" || event.hit !== irisCheckHit) return;
20
- const { enemy, striker } = event;
21
- const tags = findKitStatus(kitEffectState.effects, striker.characterId, IRIS_TAG_STATUS_ID);
22
- if (!tags || (tags.stacks ?? 0) >= IRIS_MAX_TAGS) return;
23
- tags.stacks = (tags.stacks ?? 0) + 1;
24
- const element = findAbsorbedElement([enemy]);
25
- if (element === void 0) return;
26
- castKitSummon(kitEffectState, {
27
- facing: 0,
28
- height: 0,
29
- position: enemy.position
30
- }, striker, [createIrisHit(element)]);
31
- }
32
- };
33
- };
34
- //#endregion
35
- export { createHeizouKitBehaviour };
@@ -1,58 +0,0 @@
1
- import "./characterPack-zycIUHje.js";
2
- import { t as addKitEffect } from "./addKitEffect-DBqTfm_3.js";
3
- import { buffKitMember, castKitSummon, damagePartyMember, enterKitStance, getPartyMember } from "./index.js";
4
- //#region src/services/kit/characters/huTaoKit.ts
5
- const PARAMITA_SOURCE = "hu-tao-paramita";
6
- const GUIDE_MINIMUM_HP = 1;
7
- const BLOOD_BLOSSOM_STATUS_ID = "hu-tao-blood-blossom";
8
- const createHuTaoKitBehaviour = ({ readHit, readParameter, readSeconds, readStance }) => {
9
- const lowHealthShare = readParameter("spiritSootherLowHealthShare");
10
- const guideToAfterlifeHealthShare = readParameter("guideToAfterlifeHealthCost");
11
- const paramitaSeconds = readParameter("paramitaSeconds");
12
- const paramitaMaxHealthAttackShare = readParameter("paramitaMaxHealthAttackShare");
13
- const bloodBlossomSeconds = readSeconds("bloodBlossom");
14
- const bloodBlossomIntervalSeconds = readSeconds("bloodBlossomInterval");
15
- const bloodBlossomHit = readHit("bloodBlossom");
16
- const createBloodBlossomStatus = () => ({
17
- damageTakenBonus: 0,
18
- id: BLOOD_BLOSSOM_STATUS_ID,
19
- nextTickSeconds: bloodBlossomIntervalSeconds,
20
- secondsRemaining: bloodBlossomSeconds,
21
- tickIntervalSeconds: bloodBlossomIntervalSeconds
22
- });
23
- const paramita = readStance("paramita", { chargedAttack: { hits: [{ enemyStatus: createBloodBlossomStatus }] } });
24
- return {
25
- burstVariant: { checkIsActive: ({ activeCombatant: combatant, party }) => getPartyMember(party, combatant.characterId).healthShare <= lowHealthShare },
26
- onKitEvent: (event, { kitEffectState }, combatant) => {
27
- if (event.kind !== "StatusTicked" || event.status.id !== BLOOD_BLOSSOM_STATUS_ID) return;
28
- castKitSummon(kitEffectState, {
29
- facing: 0,
30
- height: 0,
31
- position: event.enemy.position
32
- }, combatant, [bloodBlossomHit], { target: event.enemy });
33
- },
34
- skill: { onStart: ({ activeCombatant: combatant, kitEffectState, party }) => {
35
- const { healthShare } = getPartyMember(party, combatant.characterId);
36
- const minimumHealthShare = GUIDE_MINIMUM_HP / combatant.attributes.maxHealth;
37
- const lostHealthShare = Math.max(0, Math.min(guideToAfterlifeHealthShare * healthShare, healthShare - minimumHealthShare));
38
- damagePartyMember(party, combatant.characterId, lostHealthShare);
39
- enterKitStance(kitEffectState, combatant, paramita, paramitaSeconds, { isEndedOnSwap: true });
40
- addKitEffect(kitEffectState, {
41
- characterId: combatant.characterId,
42
- element: "Fire",
43
- isEndedOnSwap: true,
44
- kind: "infusion",
45
- secondsRemaining: paramitaSeconds
46
- });
47
- buffKitMember(kitEffectState, combatant.characterId, {
48
- amount: paramitaMaxHealthAttackShare * combatant.attributes.maxHealth,
49
- attribute: "FIGHT_PROP_ATTACK",
50
- isEndedOnSwap: true,
51
- secondsRemaining: paramitaSeconds,
52
- source: PARAMITA_SOURCE
53
- });
54
- } }
55
- };
56
- };
57
- //#endregion
58
- export { createHuTaoKitBehaviour };
@@ -1,4 +0,0 @@
1
- //#region src/services/kit/characters/iansanKit.ts
2
- const createIansanKitBehaviour = () => ({});
3
- //#endregion
4
- export { createIansanKitBehaviour };
@@ -1,4 +0,0 @@
1
- //#region src/services/kit/characters/ifaKit.ts
2
- const createIfaKitBehaviour = () => ({});
3
- //#endregion
4
- export { createIfaKitBehaviour };
@@ -1,4 +0,0 @@
1
- //#region src/services/kit/characters/illugaKit.ts
2
- const createIllugaKitBehaviour = () => ({});
3
- //#endregion
4
- export { createIllugaKitBehaviour };