genshin-world 4.4.0 → 4.6.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 (167) hide show
  1. package/README.md +12 -5
  2. package/dist/Attribute-FE76VuWb.js +47 -0
  3. package/dist/AuraType-CiHpg4GS.js +13 -0
  4. package/dist/ElementDamageBonusAttributeMap-BsRfIWKr.js +13 -0
  5. package/dist/EnemyState-BdsrVDVv.js +13 -0
  6. package/dist/KitEventKind-DinObjiq.js +33 -0
  7. package/dist/addKitEffect-DEhZUuxo.js +19 -0
  8. package/dist/addKitStatus-D3DgePzt.js +10 -0
  9. package/dist/ainoKit-wjzuRhrt.js +133 -0
  10. package/dist/albedoKit-Dg5ojCKB.js +146 -0
  11. package/dist/alhaithamKit-DVQNAevi.js +234 -0
  12. package/dist/aloyKit-DCDdztHK.js +72 -0
  13. package/dist/alyoshaKit-3ky4aL_z.js +3 -0
  14. package/dist/amberKit-BlwZ_3EN.js +87 -0
  15. package/dist/arlecchinoKit-Q6xz16oZ.js +37 -0
  16. package/dist/ayakaKit-CndIwofN.js +86 -0
  17. package/dist/ayatoKit-B68Ad6ir.js +142 -0
  18. package/dist/baizhuKit-gHgBWeYK.js +93 -0
  19. package/dist/barbaraKit-ClW8uZys.js +124 -0
  20. package/dist/beidouKit-CKZteOXS.js +89 -0
  21. package/dist/bennettKit-CFu-8If9.js +78 -0
  22. package/dist/candaceKit-B9AHJYGp.js +121 -0
  23. package/dist/castKitField-BJnNhmCf.js +21 -0
  24. package/dist/charlotteKit-BwmTAFqK.js +178 -0
  25. package/dist/chascaKit-DqO28RuO.js +54 -0
  26. package/dist/checkIsKitShieldLive-DEn8yb0C.js +3 -0
  27. package/dist/checkIsKitStatusActive-DXqQEIWV.js +4 -0
  28. package/dist/chevreuseKit-DfSSGSeF.js +72 -0
  29. package/dist/chioriKit-EkVgfoAT.js +32 -0
  30. package/dist/chongyunKit-BNgS4yHr.js +102 -0
  31. package/dist/citlaliKit-D7vByCmX.js +69 -0
  32. package/dist/clorindeKit-Dp8vu9Qm.js +63 -0
  33. package/dist/collectKitEnergyDrops-CG_RM4My.js +61 -0
  34. package/dist/colleiKit-CVKuDTuw.js +51 -0
  35. package/dist/columbinaKit-CbBr8-6H.js +281 -0
  36. package/dist/computeFacingAngle-DapXsgDc.js +7 -0
  37. package/dist/constants-6NEnGOni.js +186 -0
  38. package/dist/constants-BTk8lcI_.js +61 -0
  39. package/dist/constants-DB_mcGtc.js +48 -0
  40. package/dist/constants-Dfr1OGi7.js +79 -0
  41. package/dist/constants-jHIdcxxW.js +3 -0
  42. package/dist/consumeKitResource-CxS0-hNi.js +17 -0
  43. package/dist/countKitResource-CPve-dw2.js +4 -0
  44. package/dist/createWindriseGroundPaint-CtFTL5uW.js +293 -0
  45. package/dist/cynoKit-CeBTtmuK.js +207 -0
  46. package/dist/dahliaKit-yGKx6g4i.js +69 -0
  47. package/dist/dehyaKit-1N72XzVC.js +25 -0
  48. package/dist/dilucKit-Dt3y8Akp.js +168 -0
  49. package/dist/dionaKit-D3lbKcgb.js +109 -0
  50. package/dist/doriKit-DOezX6lR.js +31 -0
  51. package/dist/durinKit-CvgMpTL4.js +51 -0
  52. package/dist/emilieKit-Cz0Up4kR.js +20 -0
  53. package/dist/emitKitEvent-Cb-ZHu50.js +11 -0
  54. package/dist/escoffierKit-DAEXVD6D.js +107 -0
  55. package/dist/eulaKit-WtKqOBzC.js +149 -0
  56. package/dist/faruzanKit-B8WaYwhO.js +73 -0
  57. package/dist/findKitStatus-Dj_zauGj.js +3 -0
  58. package/dist/fischlKit-CccY1lcs.js +98 -0
  59. package/dist/flinsKit-Bo9ayCq9.js +43 -0
  60. package/dist/freminetKit-txexrTDc.js +63 -0
  61. package/dist/furinaKit-GhOToru8.js +302 -0
  62. package/dist/gainKitResource-CNEFzX4H.js +14 -0
  63. package/dist/gainPartyMemberEnergy-DUbIxe6i.js +10 -0
  64. package/dist/gamingKit-CE_SPUk_.js +25 -0
  65. package/dist/ganyuKit-CbHG7QxL.js +107 -0
  66. package/dist/getActiveCharacterId-D9TtVSWj.js +9 -0
  67. package/dist/getBuffedCombatant-D-Mskvyg.js +94 -0
  68. package/dist/getDeployedCharacterIds-TuIRCNKb.js +3 -0
  69. package/dist/getDeployedCombatants-BQdLjZha.js +16 -0
  70. package/dist/getPartyMember-BAb9wUiz.js +8 -0
  71. package/dist/gorouKit-cdYNbceF.js +155 -0
  72. package/dist/heizouKit-C9RZ12py.js +56 -0
  73. package/dist/huTaoKit-oUR_AixZ.js +163 -0
  74. package/dist/iansanKit-CodP_Bok.js +214 -0
  75. package/dist/ifaKit-BU2bY7j_.js +38 -0
  76. package/dist/illugaKit-CPgukt-w.js +113 -0
  77. package/dist/index-scAJWo82.d.ts +38127 -0
  78. package/dist/index.d.ts +3 -0
  79. package/dist/index.js +57576 -0
  80. package/dist/ineffaKit-D3uiuUVW.js +178 -0
  81. package/dist/ittoKit-D_AL3ZKB.js +166 -0
  82. package/dist/jahodaKit-CcsZ6d02.js +354 -0
  83. package/dist/jeanKit-QbuhkThT.js +143 -0
  84. package/dist/kachinaKit-BvyiZGJf.js +6 -0
  85. package/dist/kaeyaKit-DDMWp27g.js +98 -0
  86. package/dist/kavehKit-BMP3OtZZ.js +35 -0
  87. package/dist/kazuhaKit-BuuPEZTm.js +104 -0
  88. package/dist/keqingKit-BvSceP8P.js +139 -0
  89. package/dist/kinichKit-CmNvDnKc.js +73 -0
  90. package/dist/kiraraKit-Bfieazvq.js +71 -0
  91. package/dist/kleeKit-DrDxa_LO.js +116 -0
  92. package/dist/kokomiKit-DCB6vDwa.js +85 -0
  93. package/dist/kujouSaraKit-Cmu8ZTSI.js +110 -0
  94. package/dist/kukiKit-DM9x-fF6.js +87 -0
  95. package/dist/lanYanKit-DsodOaIC.js +26 -0
  96. package/dist/laumaKit-lD_wFce0.js +194 -0
  97. package/dist/laylaKit-Bt-aeOlj.js +213 -0
  98. package/dist/linneaKit-CVZeam_T.js +3 -0
  99. package/dist/lisaKit-DSjNkEhN.js +67 -0
  100. package/dist/lohenKit-BZk4IiPV.js +3 -0
  101. package/dist/lynetteKit-Bxptl56E.js +41 -0
  102. package/dist/lyneyKit-BzSX5yX5.js +47 -0
  103. package/dist/mavuikaKit-CEjQP3Ee.js +21 -0
  104. package/dist/mikaKit-n1ffj7Jt.js +20 -0
  105. package/dist/mizukiKit-BAWEL4Lx.js +73 -0
  106. package/dist/monaKit-DUho3Z_q.js +147 -0
  107. package/dist/mualaniKit-BUTB11j2.js +6 -0
  108. package/dist/nahidaKit-CI4eZEIc.js +207 -0
  109. package/dist/naviaKit-D7XtBvNS.js +142 -0
  110. package/dist/neferKit-Deg6U9-Y.js +29 -0
  111. package/dist/neuvilletteKit-C92eqydr.js +123 -0
  112. package/dist/nicoleKit-BQeK6GHV.js +289 -0
  113. package/dist/nilouKit-DGTKQuN4.js +134 -0
  114. package/dist/ningguangKit-C4PNV8aB.js +125 -0
  115. package/dist/noelleKit-BNopls2C.js +150 -0
  116. package/dist/odetteKit-DFwqHO2H.js +101 -0
  117. package/dist/ororonKit-DIFGfu4g.js +91 -0
  118. package/dist/pruneKit-DxP2XAnR.js +34 -0
  119. package/dist/qiqiKit-DIvJyc9W.js +111 -0
  120. package/dist/raidenKit-0rRacxst.js +153 -0
  121. package/dist/razorKit-Br9pBTh8.js +129 -0
  122. package/dist/readCharacterAvatar-CUATz36q.js +292 -0
  123. package/dist/removeKitEffects-Csap9Xyn.js +5 -0
  124. package/dist/rosariaKit-bFmJFG5t.js +110 -0
  125. package/dist/sandroneKit-C7vjjwWY.js +3 -0
  126. package/dist/save-jjzW_Kla.js +2842 -0
  127. package/dist/save.d.ts +2 -0
  128. package/dist/save.js +1 -0
  129. package/dist/sayuKit-tV0UTZcc.js +90 -0
  130. package/dist/sceneExport-3Se7hlVa.js +26 -0
  131. package/dist/sceneExport-C-q_cRxm.d.ts +57 -0
  132. package/dist/sceneExport.d.ts +2 -0
  133. package/dist/sceneExport.js +1 -0
  134. package/dist/sethosKit-o-Tz2GFI.js +6 -0
  135. package/dist/shenheKit-zg5JKIKK.js +153 -0
  136. package/dist/sigewinneKit-CzAKhEM2.js +53 -0
  137. package/dist/skirkKit-7VWgs8i4.js +13 -0
  138. package/dist/spendKitResource-CC5kZDgu.js +9 -0
  139. package/dist/style.css +7872 -0
  140. package/dist/sucroseKit-BE6mf6sL.js +124 -0
  141. package/dist/tartagliaKit-DU7hNYbK.js +142 -0
  142. package/dist/terrainTileWorker.d.ts +1 -0
  143. package/dist/terrainTileWorker.js +80 -0
  144. package/dist/thomaKit-Dkmqql3Z.js +100 -0
  145. package/dist/tighnariKit-KUBoeE71.js +45 -0
  146. package/dist/varesaKit-DFWXknWy.js +38 -0
  147. package/dist/varkaKit-CNpU_rb3.js +3 -0
  148. package/dist/ventiKit-D-0Jk1Nf.js +70 -0
  149. package/dist/vesnaKit-DtGBZlNW.js +3 -0
  150. package/dist/vodyanitsaKit-BurO3Fqh.js +3 -0
  151. package/dist/wandererKit-B_ifeLC0.js +10 -0
  152. package/dist/wriothesleyKit-DeQsvL4q.js +109 -0
  153. package/dist/xianglingKit-DKC-YtMt.js +114 -0
  154. package/dist/xianyunKit-B2AhLuaS.js +117 -0
  155. package/dist/xiaoKit-BCFSMiwG.js +105 -0
  156. package/dist/xilonenKit-CGKYweyJ.js +80 -0
  157. package/dist/xingqiuKit-D_PyvPNv.js +131 -0
  158. package/dist/xinyanKit-CeBG3Kgb.js +145 -0
  159. package/dist/yaeMikoKit-C9vWIy6z.js +75 -0
  160. package/dist/yanfeiKit-BiGLsEGn.js +134 -0
  161. package/dist/yaoyaoKit-C8xLQ7Yz.js +206 -0
  162. package/dist/yelanKit-CxG16qLm.js +108 -0
  163. package/dist/yoimiyaKit-DsMph9aZ.js +97 -0
  164. package/dist/yunjinKit-DQreMU-x.js +103 -0
  165. package/dist/zhongliKit-BQJgISFw.js +111 -0
  166. package/dist/zibaiKit-BekBiL_5.js +62 -0
  167. package/package.json +20 -19
package/README.md CHANGED
@@ -5,9 +5,7 @@
5
5
  [![NPM downloads][badge-npm-downloads]][url-npm]
6
6
  [![NPM Unpacked Size (with version)][badge-npm-unpacked-size]][url-npm]
7
7
 
8
- Genshin Impact's world, rebuilt as an unofficial, non-commercial fan work on [`genshin-engine`](https://github.com/Esposter/Esposter/tree/main/packages/genshin-engine) and not affiliated with HoYoverse.
9
-
10
- It ships no image, model or sound from the game: every mesh, texture and shader is generated by code, and each mark on a screen is a vector path traced from the game's own or taken from a published vector of it.
8
+ Genshin Impact's world, rebuilt as an unofficial, non-commercial fan work on [`genshin-engine`](https://github.com/Esposter/Esposter/tree/main/packages/genshin-engine), with no image, model or sound from the game. It is not affiliated with HoYoverse.
11
9
 
12
10
  Design notes live in [the specs](https://github.com/Esposter/Esposter/tree/main/openspec/specs/genshin).
13
11
 
@@ -25,7 +23,9 @@ Design notes live in [the specs](https://github.com/Esposter/Esposter/tree/main/
25
23
  pnpm i genshin-world genshin-engine genshin-interface genshin-text @esposter/shared @tresjs/core @vueuse/core three vue zod
26
24
  ```
27
25
 
28
- Mount `WorldScreen`, which brings its own canvas, and pass in only what your bundler and server decide, and load the screens' styles once:
26
+ 1. Mount `WorldScreen`. It brings its own canvas.
27
+ 2. Pass in only the values that your bundler and server decide.
28
+ 3. Import the styles once, as shown:
29
29
 
30
30
  ```vue
31
31
  <script setup lang="ts">
@@ -57,7 +57,14 @@ const qualityTier = QualityTier.High;
57
57
  </template>
58
58
  ```
59
59
 
60
- Your host serves region data at `region-data-base-url` and every game-data record at `game-data-base-url`, each object and index entry that `gameDataLock.json` names as `<base>/<sha256>.json`, with CORS for your page's origin. Esposter's own accounts admit only Esposter's origins, so another host must publish its own copy.
60
+ Check: the screen opens once its names, tables and first view have loaded.
61
+
62
+ Your host must serve two sets of files:
63
+
64
+ - The region data, at `region-data-base-url`.
65
+ - Every game-data record, at `game-data-base-url`. Each object and index entry that `gameDataLock.json` names is served as `<base>/<sha256>.json`.
66
+
67
+ Allow CORS for your page's origin. Esposter's own accounts admit only Esposter's origins. Another host must publish its own copy.
61
68
 
62
69
  ## <a name="key-exports">🧩 Key Exports</a>
63
70
 
@@ -0,0 +1,47 @@
1
+ // src/models/character/Attribute.ts
2
+ let Attribute = /* @__PURE__ */ function(Attribute) {
3
+ Attribute["AllDamageBonus"] = "FIGHT_PROP_ADD_HURT";
4
+ Attribute["AnemoDamageBonus"] = "FIGHT_PROP_WIND_ADD_HURT";
5
+ Attribute["AnemoResistance"] = "FIGHT_PROP_WIND_SUB_HURT";
6
+ Attribute["Attack"] = "FIGHT_PROP_ATTACK";
7
+ Attribute["AttackPercent"] = "FIGHT_PROP_ATTACK_PERCENT";
8
+ Attribute["BaseAttack"] = "FIGHT_PROP_BASE_ATTACK";
9
+ Attribute["BaseDefense"] = "FIGHT_PROP_BASE_DEFENSE";
10
+ Attribute["BaseHealth"] = "FIGHT_PROP_BASE_HP";
11
+ Attribute["ChargedAttackDamageBonus"] = "FIGHT_PROP_CHARGED_ADD_HURT";
12
+ Attribute["CooldownReduction"] = "FIGHT_PROP_SKILL_CD_MINUS_RATIO";
13
+ Attribute["CriticalDamage"] = "FIGHT_PROP_CRITICAL_HURT";
14
+ Attribute["CriticalRate"] = "FIGHT_PROP_CRITICAL";
15
+ Attribute["CryoDamageBonus"] = "FIGHT_PROP_ICE_ADD_HURT";
16
+ Attribute["CryoResistance"] = "FIGHT_PROP_ICE_SUB_HURT";
17
+ Attribute["DamageReduction"] = "FIGHT_PROP_SUB_HURT";
18
+ Attribute["Defense"] = "FIGHT_PROP_DEFENSE";
19
+ Attribute["DefensePercent"] = "FIGHT_PROP_DEFENSE_PERCENT";
20
+ Attribute["DendroDamageBonus"] = "FIGHT_PROP_GRASS_ADD_HURT";
21
+ Attribute["DendroResistance"] = "FIGHT_PROP_GRASS_SUB_HURT";
22
+ Attribute["ElectroDamageBonus"] = "FIGHT_PROP_ELEC_ADD_HURT";
23
+ Attribute["ElectroResistance"] = "FIGHT_PROP_ELEC_SUB_HURT";
24
+ Attribute["ElementalMastery"] = "FIGHT_PROP_ELEMENT_MASTERY";
25
+ Attribute["EnergyRecharge"] = "FIGHT_PROP_CHARGE_EFFICIENCY";
26
+ Attribute["GeoDamageBonus"] = "FIGHT_PROP_ROCK_ADD_HURT";
27
+ Attribute["GeoResistance"] = "FIGHT_PROP_ROCK_SUB_HURT";
28
+ Attribute["HealingBonus"] = "FIGHT_PROP_HEAL_ADD";
29
+ Attribute["Health"] = "FIGHT_PROP_HP";
30
+ Attribute["HealthPercent"] = "FIGHT_PROP_HP_PERCENT";
31
+ Attribute["HydroDamageBonus"] = "FIGHT_PROP_WATER_ADD_HURT";
32
+ Attribute["HydroResistance"] = "FIGHT_PROP_WATER_SUB_HURT";
33
+ Attribute["IncomingHealingBonus"] = "FIGHT_PROP_HEALED_ADD";
34
+ Attribute["MovementSpeed"] = "FIGHT_PROP_MOVE_SPEED";
35
+ Attribute["NormalAttackDamageBonus"] = "FIGHT_PROP_NORMAL_ADD_HURT";
36
+ Attribute["NormalAttackSpeed"] = "FIGHT_PROP_NORMAL_ATTACK_SPEED";
37
+ Attribute["PhysicalDamageBonus"] = "FIGHT_PROP_PHYSICAL_ADD_HURT";
38
+ Attribute["PhysicalResistance"] = "FIGHT_PROP_PHYSICAL_SUB_HURT";
39
+ Attribute["PlungingAttackDamageBonus"] = "FIGHT_PROP_PLUNGING_ATTACK_ADD_HURT";
40
+ Attribute["PyroDamageBonus"] = "FIGHT_PROP_FIRE_ADD_HURT";
41
+ Attribute["PyroResistance"] = "FIGHT_PROP_FIRE_SUB_HURT";
42
+ Attribute["ShieldStrength"] = "FIGHT_PROP_SHIELD_COST_MINUS_RATIO";
43
+ Attribute["StellarGlimmerReactionDamageBonus"] = "FIGHT_PROP_STELLAR_GLIMMER_ADD_HURT";
44
+ return Attribute;
45
+ }({});
46
+ const Attributes = Object.values(Attribute);
47
+ export { Attributes as n, Attribute as t };
@@ -0,0 +1,13 @@
1
+ // src/models/combat/AuraType.ts
2
+ let AuraType = /* @__PURE__ */ function(AuraType) {
3
+ AuraType["Burning"] = "Burning";
4
+ AuraType["Cryo"] = "Cryo";
5
+ AuraType["Dendro"] = "Dendro";
6
+ AuraType["Electro"] = "Electro";
7
+ AuraType["Freeze"] = "Freeze";
8
+ AuraType["Hydro"] = "Hydro";
9
+ AuraType["Pyro"] = "Pyro";
10
+ AuraType["Quicken"] = "Quicken";
11
+ return AuraType;
12
+ }({});
13
+ export { AuraType as t };
@@ -0,0 +1,13 @@
1
+ import "./Attribute-FE76VuWb.js";
2
+ import "./save-jjzW_Kla.js";
3
+ // src/services/combat/damage/ElementDamageBonusAttributeMap.ts
4
+ const ElementDamageBonusAttributeMap = {
5
+ ["Wind"]: "FIGHT_PROP_WIND_ADD_HURT",
6
+ ["Ice"]: "FIGHT_PROP_ICE_ADD_HURT",
7
+ ["Grass"]: "FIGHT_PROP_GRASS_ADD_HURT",
8
+ ["Electric"]: "FIGHT_PROP_ELEC_ADD_HURT",
9
+ ["Rock"]: "FIGHT_PROP_ROCK_ADD_HURT",
10
+ ["Water"]: "FIGHT_PROP_WATER_ADD_HURT",
11
+ ["Fire"]: "FIGHT_PROP_FIRE_ADD_HURT"
12
+ };
13
+ export { ElementDamageBonusAttributeMap as t };
@@ -0,0 +1,13 @@
1
+ // src/models/enemy/EnemyState.ts
2
+ let EnemyState = /* @__PURE__ */ function(EnemyState) {
3
+ EnemyState["Alert"] = "Alert";
4
+ EnemyState["Chase"] = "Chase";
5
+ EnemyState["Dead"] = "Dead";
6
+ EnemyState["Idle"] = "Idle";
7
+ EnemyState["Recovery"] = "Recovery";
8
+ EnemyState["Return"] = "Return";
9
+ EnemyState["Stagger"] = "Stagger";
10
+ EnemyState["Windup"] = "Windup";
11
+ return EnemyState;
12
+ }({});
13
+ export { EnemyState as t };
@@ -0,0 +1,33 @@
1
+ // src/models/kit/KitEventKind.ts
2
+ let KitEventKind = /* @__PURE__ */ function(KitEventKind) {
3
+ KitEventKind["BurstUsed"] = "BurstUsed";
4
+ KitEventKind["CharacterSwapped"] = "CharacterSwapped";
5
+ KitEventKind["ChargedAttackLanded"] = "ChargedAttackLanded";
6
+ KitEventKind["ChestOpened"] = "ChestOpened";
7
+ KitEventKind["CrystallizeShardPickedUp"] = "CrystallizeShardPickedUp";
8
+ KitEventKind["DamageTaken"] = "DamageTaken";
9
+ KitEventKind["EffectExpired"] = "EffectExpired";
10
+ KitEventKind["ElementApplied"] = "ElementApplied";
11
+ KitEventKind["EnemyDefeated"] = "EnemyDefeated";
12
+ KitEventKind["EnemyHit"] = "EnemyHit";
13
+ KitEventKind["EnergyParticleCollected"] = "EnergyParticleCollected";
14
+ KitEventKind["FallRefused"] = "FallRefused";
15
+ KitEventKind["HealthChanged"] = "HealthChanged";
16
+ KitEventKind["MoraPickedUp"] = "MoraPickedUp";
17
+ KitEventKind["NightsoulBurst"] = "NightsoulBurst";
18
+ KitEventKind["NightsoulPointsConsumed"] = "NightsoulPointsConsumed";
19
+ KitEventKind["NightsoulPointsGained"] = "NightsoulPointsGained";
20
+ KitEventKind["NormalAttackLanded"] = "NormalAttackLanded";
21
+ KitEventKind["NormalAttackStarted"] = "NormalAttackStarted";
22
+ KitEventKind["PartyMemberStruck"] = "PartyMemberStruck";
23
+ KitEventKind["ReactionTriggered"] = "ReactionTriggered";
24
+ KitEventKind["ShieldAbsorbed"] = "ShieldAbsorbed";
25
+ KitEventKind["ShieldCast"] = "ShieldCast";
26
+ KitEventKind["SkillUsed"] = "SkillUsed";
27
+ KitEventKind["StatusTicked"] = "StatusTicked";
28
+ KitEventKind["TauntDamaged"] = "TauntDamaged";
29
+ KitEventKind["WeakPointHit"] = "WeakPointHit";
30
+ KitEventKind["WildlifeStruck"] = "WildlifeStruck";
31
+ return KitEventKind;
32
+ }({});
33
+ export { KitEventKind as t };
@@ -0,0 +1,19 @@
1
+ // src/services/kit/effects/addKitEffect.ts
2
+ const checkIsRestartedBy = (earlier, effect) => {
3
+ if (earlier.kind === "buff" && effect.kind === "buff") return earlier.characterId === effect.characterId && earlier.attribute === effect.attribute && earlier.source === effect.source;
4
+ if (earlier.kind === "infusion" && effect.kind === "infusion") return earlier.characterId === effect.characterId && earlier.element === effect.element;
5
+ if (earlier.kind === "status" && effect.kind === "status") return earlier.characterId === effect.characterId && earlier.id === effect.id;
6
+ if (earlier.kind === "stance" && effect.kind === "stance") return earlier.characterId === effect.characterId;
7
+ if (earlier.kind === "antiCold" && effect.kind === "antiCold") return true;
8
+ if (earlier.kind === "field" && effect.kind === "field") return effect.isStacked !== true && earlier.characterId === effect.characterId && earlier.id !== void 0 && earlier.id === effect.id;
9
+ if (earlier.kind === "elementCriticalDamage" && effect.kind === "elementCriticalDamage") return earlier.characterId === effect.characterId && earlier.element === effect.element && earlier.source === effect.source;
10
+ return false;
11
+ };
12
+ const addKitEffect = (kitEffectState, effect) => {
13
+ if (effect.kind === "shield") {
14
+ for (const earlier of kitEffectState.effects) if (earlier.kind === "shield" && Boolean(earlier.isCrystallize) === Boolean(effect.isCrystallize) && (effect.isCrystallize || earlier.characterId === effect.characterId)) earlier.secondsRemaining = 0;
15
+ }
16
+ const index = kitEffectState.effects.findIndex((earlier) => checkIsRestartedBy(earlier, effect));
17
+ kitEffectState.effects = index === -1 ? [...kitEffectState.effects, effect] : kitEffectState.effects.with(index, effect);
18
+ };
19
+ export { addKitEffect as t };
@@ -0,0 +1,10 @@
1
+ import { t as addKitEffect } from "./addKitEffect-DEhZUuxo.js";
2
+ // src/services/kit/effects/addKitStatus.ts
3
+ const addKitStatus = (kitEffectState, characterId, status) => {
4
+ addKitEffect(kitEffectState, {
5
+ characterId,
6
+ kind: "status",
7
+ ...status
8
+ });
9
+ };
10
+ export { addKitStatus as t };
@@ -0,0 +1,133 @@
1
+ import "./Attribute-FE76VuWb.js";
2
+ import { buffKitMember, castKitSummon, elementalMasteryMultiplier, getMoonsignLevel, queueKitPassiveHit, startKitCooldown } from "./index.js";
3
+ import "./save-jjzW_Kla.js";
4
+ import "./KitEventKind-DinObjiq.js";
5
+ import { t as addKitStatus } from "./addKitStatus-D3DgePzt.js";
6
+ import { t as castKitField } from "./castKitField-BJnNhmCf.js";
7
+ import { t as checkIsKitStatusActive } from "./checkIsKitStatusActive-DXqQEIWV.js";
8
+ import { t as findKitStatus } from "./findKitStatus-Dj_zauGj.js";
9
+ import { t as gainPartyMemberEnergy } from "./gainPartyMemberEnergy-DUbIxe6i.js";
10
+ // src/services/kit/characters/ainoKit.ts
11
+ const ASCENSION_4 = 4;
12
+ const ASCENSION_1 = 1;
13
+ const ASCENSION_1_WATER_BALL_INTERVAL_SECONDS = .7;
14
+ const ASCENSION_1_WATER_BALL_RADIUS = 4;
15
+ const CONSTELLATION_4 = 4;
16
+ const CONSTELLATION_4_COOLDOWN_SECONDS = 10;
17
+ const CONSTELLATION_4_ENERGY = 10;
18
+ const CONSTELLATION_4_STATUS_ID = "aino-constellation-4";
19
+ const CONSTELLATION_1 = 1;
20
+ const CONSTELLATION_1_MASTERY = 80;
21
+ const CONSTELLATION_1_SECONDS = 15;
22
+ const CONSTELLATION_1_STATUS_ID = "aino-constellation-1";
23
+ const CONSTELLATION_2 = 2;
24
+ const CONSTELLATION_2_ATTACK_SHARE = .25;
25
+ const CONSTELLATION_2_MASTERY_SHARE = 1;
26
+ const CONSTELLATION_2_COOLDOWN_ID = "aino-constellation-2-cooldown";
27
+ const CONSTELLATION_2_COOLDOWN_SECONDS = 5;
28
+ const CONSTELLATION_2_RADIUS = 1.5;
29
+ const BURST_FIELD_ID = "aino-precision-hydronic-cooler";
30
+ const CONSTELLATION_6 = 6;
31
+ const CONSTELLATION_6_DAMAGE_BONUS = .15;
32
+ const CONSTELLATION_6_SECONDS = 15;
33
+ const CONSTELLATION_6_STATUS_ID = "aino-constellation-6";
34
+ const CONSTELLATION_6_REACTION_TYPES = /* @__PURE__ */ new Set([
35
+ "LunarBloom",
36
+ "LunarCharged",
37
+ "LunarCrystallize",
38
+ "Bloom",
39
+ "ElectroCharged"
40
+ ]);
41
+ const createAinoKitBehaviour = ({ kit, readHit, readParameter, readSeconds }) => {
42
+ const masteryShare = readParameter("ascension4MasteryShare");
43
+ const burstFirstTickSeconds = readSeconds("burstStart");
44
+ const waterBallHit = readHit("waterBall", { additiveBaseDamageBonus: (combatant) => combatant.ascension >= ASCENSION_4 ? elementalMasteryMultiplier(combatant, masteryShare) : 0 });
45
+ const waterBall = {
46
+ ...waterBallHit,
47
+ hitmarkSeconds: waterBallHit.hitmarkSeconds - burstFirstTickSeconds
48
+ };
49
+ const burstTickIntervalSeconds = readSeconds("waterBallInterval");
50
+ const burstSeconds = readSeconds("burstDuration");
51
+ const burstRadius = readParameter("burstRadius");
52
+ const ascendantWaterBall = {
53
+ ...waterBall,
54
+ hitArea: {
55
+ ...waterBall.hitArea,
56
+ radius: burstRadius + ASCENSION_1_WATER_BALL_RADIUS
57
+ },
58
+ internalCooldownTag: "AinoBurstMoonHit"
59
+ };
60
+ const { internalCooldownTag: _internalCooldownTag, ...waterBallWithoutCooldown } = waterBall;
61
+ const constellation2WaterBall = {
62
+ ...waterBallWithoutCooldown,
63
+ additiveBaseDamageBonus: (combatant) => (waterBall.additiveBaseDamageBonus?.(combatant) ?? 0) + elementalMasteryMultiplier(combatant, CONSTELLATION_2_MASTERY_SHARE),
64
+ hitArea: {
65
+ ...waterBall.hitArea,
66
+ radius: CONSTELLATION_2_RADIUS
67
+ },
68
+ talentMultiplier: CONSTELLATION_2_ATTACK_SHARE
69
+ };
70
+ const skillHits = kit.elementalSkill.hits;
71
+ return {
72
+ burst: { onStart: ({ activeCombatant: combatant, body: { facing, height, position }, characterIdCombatantMap, kitEffectState, party }) => {
73
+ const isAscendantBurst = combatant.ascension >= ASCENSION_1 && getMoonsignLevel(characterIdCombatantMap, party) === "AscendantGleam";
74
+ const burstField = castKitField(kitEffectState, combatant.characterId, position, {
75
+ id: BURST_FIELD_ID,
76
+ isFollowing: true,
77
+ nextTickSeconds: burstFirstTickSeconds,
78
+ onTick: ({ kitEffectState: tickKitEffectState }) => {
79
+ castKitSummon(tickKitEffectState, {
80
+ facing,
81
+ height,
82
+ position: burstField.centre
83
+ }, combatant, [isAscendantBurst ? ascendantWaterBall : waterBall], { attackTag: "ElementalBurst" });
84
+ },
85
+ radius: burstRadius,
86
+ secondsRemaining: burstFirstTickSeconds + burstSeconds,
87
+ tickIntervalSeconds: isAscendantBurst ? ASCENSION_1_WATER_BALL_INTERVAL_SECONDS : burstTickIntervalSeconds
88
+ });
89
+ if (combatant.constellationCount >= CONSTELLATION_6) addKitStatus(kitEffectState, combatant.characterId, {
90
+ id: CONSTELLATION_6_STATUS_ID,
91
+ secondsRemaining: CONSTELLATION_6_SECONDS
92
+ });
93
+ } },
94
+ getPartyReactionBonus: (member, { combatant, reactionType }, { activeCombatant, characterIdCombatantMap, kitEffectState, party }) => {
95
+ if (!CONSTELLATION_6_REACTION_TYPES.has(reactionType) || combatant.characterId !== activeCombatant.characterId || !checkIsKitStatusActive(kitEffectState.effects, member.characterId, CONSTELLATION_6_STATUS_ID)) return {};
96
+ return { damageBonus: getMoonsignLevel(characterIdCombatantMap, party) === "AscendantGleam" ? .35 : CONSTELLATION_6_DAMAGE_BONUS };
97
+ },
98
+ onKitEvent: (event, context, combatant) => {
99
+ const { activeCombatant, kitEffectState, party } = context;
100
+ if (combatant.constellationCount >= CONSTELLATION_1 && (event.kind === "SkillUsed" || event.kind === "BurstUsed") && event.characterId === combatant.characterId) {
101
+ addKitStatus(kitEffectState, combatant.characterId, {
102
+ id: CONSTELLATION_1_STATUS_ID,
103
+ secondsRemaining: CONSTELLATION_1_SECONDS
104
+ });
105
+ buffKitMember(kitEffectState, combatant.characterId, {
106
+ amount: CONSTELLATION_1_MASTERY,
107
+ attribute: "FIGHT_PROP_ELEMENT_MASTERY",
108
+ secondsRemaining: CONSTELLATION_1_SECONDS,
109
+ source: CONSTELLATION_1_STATUS_ID
110
+ });
111
+ }
112
+ if (event.kind === "CharacterSwapped" && event.characterId !== combatant.characterId) {
113
+ const constellation1Seconds = findKitStatus(kitEffectState.effects, combatant.characterId, CONSTELLATION_1_STATUS_ID)?.secondsRemaining ?? 0;
114
+ if (constellation1Seconds > 0) buffKitMember(kitEffectState, event.characterId, {
115
+ amount: CONSTELLATION_1_MASTERY,
116
+ attribute: "FIGHT_PROP_ELEMENT_MASTERY",
117
+ isEndedOnSwap: true,
118
+ secondsRemaining: constellation1Seconds,
119
+ source: CONSTELLATION_1_STATUS_ID
120
+ });
121
+ }
122
+ if (event.kind !== "DamageTaken") return;
123
+ if (combatant.constellationCount >= CONSTELLATION_2 && activeCombatant.characterId !== combatant.characterId && event.striker.characterId === activeCombatant.characterId && kitEffectState.effects.some((effect) => effect.kind === "field" && effect.id === BURST_FIELD_ID && effect.secondsRemaining > 0) && startKitCooldown(kitEffectState, combatant.characterId, CONSTELLATION_2_COOLDOWN_ID, CONSTELLATION_2_COOLDOWN_SECONDS)) queueKitPassiveHit(context, combatant, constellation2WaterBall, event.enemy);
124
+ if (combatant.constellationCount < CONSTELLATION_4 || event.striker.characterId !== combatant.characterId || !skillHits.includes(event.hit) || checkIsKitStatusActive(kitEffectState.effects, combatant.characterId, CONSTELLATION_4_STATUS_ID)) return;
125
+ addKitStatus(kitEffectState, combatant.characterId, {
126
+ id: CONSTELLATION_4_STATUS_ID,
127
+ secondsRemaining: CONSTELLATION_4_COOLDOWN_SECONDS
128
+ });
129
+ gainPartyMemberEnergy(party, combatant, CONSTELLATION_4_ENERGY);
130
+ }
131
+ };
132
+ };
133
+ export { createAinoKitBehaviour };
@@ -0,0 +1,146 @@
1
+ import "./Attribute-FE76VuWb.js";
2
+ import { buffKitMember, buffKitTeam, castKitSummon, checkIsInKitField, createAheadBody, createKitBody, findStandingKitSummon, startKitCooldown } from "./index.js";
3
+ import "./KitEventKind-DinObjiq.js";
4
+ import { t as addKitStatus } from "./addKitStatus-D3DgePzt.js";
5
+ import { t as checkIsKitShieldLive } from "./checkIsKitShieldLive-DEn8yb0C.js";
6
+ import { t as checkIsKitStatusActive } from "./checkIsKitStatusActive-DXqQEIWV.js";
7
+ import { t as findKitStatus } from "./findKitStatus-Dj_zauGj.js";
8
+ import { t as getBuffedCombatant } from "./getBuffedCombatant-D-Mskvyg.js";
9
+ import { t as getPartyMember } from "./getPartyMember-BAb9wUiz.js";
10
+ // src/services/kit/characters/albedoKit.ts
11
+ const SOLAR_ISOTOMA_ID = "albedo-solar-isotoma";
12
+ const TRANSIENT_BLOSSOM_COOLDOWN_STATUS_ID = "albedo-transient-blossom-cooldown";
13
+ const CALCITE_MIGHT_ASCENSION = 1;
14
+ const CALCITE_MIGHT_HEALTH_SHARE = .5;
15
+ const CALCITE_MIGHT_DAMAGE_BONUS = .25;
16
+ const TECTONIC_TIDE_ASCENSION = 4;
17
+ const TECTONIC_TIDE_ELEMENTAL_MASTERY = 125;
18
+ const TECTONIC_TIDE_ELEMENTAL_MASTERY_SECONDS = 10;
19
+ const TECTONIC_TIDE_SOURCE = "albedo-tectonic-tide";
20
+ const ALBEDO_CONSTELLATION_1 = 1;
21
+ const ALBEDO_CONSTELLATION_4 = 4;
22
+ const CONSTELLATION_4_PLUNGING_ATTACK_BONUS = .3;
23
+ const CONSTELLATION_4_SECONDS = 1;
24
+ const CONSTELLATION_4_CHECK_SECONDS = .3;
25
+ const CONSTELLATION_4_CHECK_STATUS_ID = "albedo-constellation-4-check";
26
+ const CONSTELLATION_4_SOURCE = "albedo-constellation-4";
27
+ const ALBEDO_CONSTELLATION_6 = 6;
28
+ const CONSTELLATION_6_DAMAGE_BONUS = .17;
29
+ const CONSTELLATION_6_SECONDS = 1;
30
+ const CONSTELLATION_6_SOURCE = "albedo-constellation-6";
31
+ const TRANSIENT_BLOSSOM_ENERGY = 1.2;
32
+ const SOLAR_ISOTOMA_DEFENSE_PERCENT = .5;
33
+ const SOLAR_ISOTOMA_DEFENSE_SECONDS = 20;
34
+ const FLOWER_OF_EDEN_SOURCE = "albedo-flower-of-eden";
35
+ const ALBEDO_CONSTELLATION_2 = 2;
36
+ const FATAL_RECKONING_DEFENSE_SHARE = .3;
37
+ const FATAL_RECKONING_MAX_STACKS = 4;
38
+ const FATAL_RECKONING_SECONDS = 30;
39
+ const FATAL_RECKONING_STATUS_ID = "albedo-fatal-reckoning";
40
+ const ALBEDO_CHARACTER_ID = 10000038;
41
+ const addFatalReckoningStack = (kitEffectState, combatant) => {
42
+ const { characterId } = combatant;
43
+ const stacks = checkIsKitStatusActive(kitEffectState.effects, characterId, FATAL_RECKONING_STATUS_ID) ? findKitStatus(kitEffectState.effects, characterId, FATAL_RECKONING_STATUS_ID)?.stacks ?? 0 : 0;
44
+ addKitStatus(kitEffectState, characterId, {
45
+ id: FATAL_RECKONING_STATUS_ID,
46
+ secondsRemaining: FATAL_RECKONING_SECONDS,
47
+ stacks: Math.min(FATAL_RECKONING_MAX_STACKS, stacks + 1)
48
+ });
49
+ };
50
+ const withFatalReckoningBonus = (hit, bonus) => ({
51
+ ...hit,
52
+ additiveBaseDamageBonus: (combatant) => (hit.additiveBaseDamageBonus?.(combatant) ?? 0) + bonus
53
+ });
54
+ const consumeFatalReckoningBonus = (context) => {
55
+ const { activeCombatant: combatant, characterIdCombatantMap, kitEffectState, party } = context;
56
+ const { characterId } = combatant;
57
+ if (combatant.constellationCount < ALBEDO_CONSTELLATION_2 || !checkIsKitStatusActive(kitEffectState.effects, characterId, FATAL_RECKONING_STATUS_ID)) return 0;
58
+ const status = findKitStatus(kitEffectState.effects, characterId, FATAL_RECKONING_STATUS_ID);
59
+ const stacks = status?.stacks ?? 0;
60
+ if (status) status.stacks = 0;
61
+ const { defense } = getBuffedCombatant(combatant, kitEffectState.effects, party, characterIdCombatantMap).attributes;
62
+ return stacks * FATAL_RECKONING_DEFENSE_SHARE * defense;
63
+ };
64
+ const createAlbedoKitBehaviour = ({ readHit, readHits, readParameter, readSeconds }) => {
65
+ const solarIsotomaAheadMetres = readParameter("solarIsotomaAheadMetres");
66
+ const solarIsotomaRadius = readParameter("solarIsotomaRadius");
67
+ const solarIsotomaSeconds = readSeconds("solarIsotomaDuration");
68
+ const transientBlossomCooldownSeconds = readSeconds("transientBlossomCooldown");
69
+ const solarIsotomaHit = readHit("solarIsotoma");
70
+ const transientBlossom = readHit("transientBlossom");
71
+ const fatalBlossoms = readHits("fatalBlossoms");
72
+ return {
73
+ burst: { onStart: (context) => {
74
+ const { activeCombatant: combatant, kitEffectState, party } = context;
75
+ const fatalReckoningBonus = consumeFatalReckoningBonus(context);
76
+ const blossoms = fatalReckoningBonus === 0 ? fatalBlossoms : fatalBlossoms.map((hit) => withFatalReckoningBonus(hit, fatalReckoningBonus));
77
+ const solarIsotoma = findStandingKitSummon(kitEffectState.effects, SOLAR_ISOTOMA_ID, combatant.characterId);
78
+ if (solarIsotoma && solarIsotoma.secondsRemaining > 0) castKitSummon(kitEffectState, solarIsotoma.body, solarIsotoma.combatant, blossoms, { attackTag: "ElementalBurst" });
79
+ if (combatant.ascension < TECTONIC_TIDE_ASCENSION) return;
80
+ buffKitTeam(kitEffectState, party, {
81
+ amount: TECTONIC_TIDE_ELEMENTAL_MASTERY,
82
+ attribute: "FIGHT_PROP_ELEMENT_MASTERY",
83
+ secondsRemaining: TECTONIC_TIDE_ELEMENTAL_MASTERY_SECONDS,
84
+ source: TECTONIC_TIDE_SOURCE
85
+ });
86
+ } },
87
+ getStrikeDamageBonus: ({ combatant, hit }, enemy) => combatant.ascension >= CALCITE_MIGHT_ASCENSION && hit === transientBlossom && enemy.health / enemy.maxHealth < CALCITE_MIGHT_HEALTH_SHARE ? CALCITE_MIGHT_DAMAGE_BONUS : 0,
88
+ onKitEvent: (event, { kitEffectState, party }, combatant) => {
89
+ if (event.kind !== "DamageTaken") return;
90
+ const { characterId } = combatant;
91
+ const { effects } = kitEffectState;
92
+ const solarIsotoma = findStandingKitSummon(effects, SOLAR_ISOTOMA_ID, characterId);
93
+ if (!solarIsotoma || solarIsotoma.secondsRemaining <= 0) return;
94
+ const { position } = event.enemy;
95
+ if (Math.hypot(position.x - solarIsotoma.body.position.x, position.z - solarIsotoma.body.position.z) > solarIsotomaRadius || !startKitCooldown(kitEffectState, characterId, TRANSIENT_BLOSSOM_COOLDOWN_STATUS_ID, transientBlossomCooldownSeconds)) return;
96
+ castKitSummon(kitEffectState, createKitBody(position), solarIsotoma.combatant, [transientBlossom], { attackTag: "ElementalSkill" });
97
+ if (combatant.constellationCount >= ALBEDO_CONSTELLATION_2) addFatalReckoningStack(kitEffectState, combatant);
98
+ if (combatant.constellationCount < ALBEDO_CONSTELLATION_1) return;
99
+ const member = getPartyMember(party, characterId);
100
+ member.energy = Math.min(combatant.kit.burstEnergyCost, member.energy + TRANSIENT_BLOSSOM_ENERGY);
101
+ },
102
+ onStep: ({ activeCombatant, body, kitEffectState, party }, combatant) => {
103
+ if (combatant.constellationCount < ALBEDO_CONSTELLATION_4) return;
104
+ if (!startKitCooldown(kitEffectState, combatant.characterId, CONSTELLATION_4_CHECK_STATUS_ID, CONSTELLATION_4_CHECK_SECONDS)) return;
105
+ const solarIsotoma = findStandingKitSummon(kitEffectState.effects, SOLAR_ISOTOMA_ID, combatant.characterId);
106
+ if (!solarIsotoma || solarIsotoma.secondsRemaining <= 0) return;
107
+ const field = {
108
+ centre: solarIsotoma.body.position,
109
+ radius: solarIsotomaRadius
110
+ };
111
+ if (!checkIsInKitField(field, body.position)) return;
112
+ buffKitMember(kitEffectState, activeCombatant.characterId, {
113
+ amount: CONSTELLATION_4_PLUNGING_ATTACK_BONUS,
114
+ attribute: "FIGHT_PROP_PLUNGING_ATTACK_ADD_HURT",
115
+ secondsRemaining: CONSTELLATION_4_SECONDS,
116
+ source: CONSTELLATION_4_SOURCE
117
+ });
118
+ if (combatant.constellationCount >= ALBEDO_CONSTELLATION_6 && (kitEffectState.effects.some((effect) => checkIsKitShieldLive(effect) && effect.isCrystallize === true) || party.lunarCrystallize.moondrifts.some((moondrift) => checkIsInKitField(field, moondrift.position)))) buffKitMember(kitEffectState, activeCombatant.characterId, {
119
+ amount: CONSTELLATION_6_DAMAGE_BONUS,
120
+ attribute: "FIGHT_PROP_ADD_HURT",
121
+ secondsRemaining: CONSTELLATION_6_SECONDS,
122
+ source: CONSTELLATION_6_SOURCE
123
+ });
124
+ },
125
+ skill: { onStart: ({ activeCombatant: combatant, body, kitEffectState }) => {
126
+ if (combatant.constellationCount >= ALBEDO_CONSTELLATION_1) buffKitMember(kitEffectState, combatant.characterId, {
127
+ amount: SOLAR_ISOTOMA_DEFENSE_PERCENT,
128
+ attribute: "FIGHT_PROP_DEFENSE_PERCENT",
129
+ secondsRemaining: SOLAR_ISOTOMA_DEFENSE_SECONDS,
130
+ source: FLOWER_OF_EDEN_SOURCE
131
+ });
132
+ for (const effect of kitEffectState.effects) if (effect.kind === "summon" && effect.id === SOLAR_ISOTOMA_ID) effect.secondsRemaining = 0;
133
+ if (combatant.constellationCount >= ALBEDO_CONSTELLATION_4) addKitStatus(kitEffectState, combatant.characterId, {
134
+ id: CONSTELLATION_4_CHECK_STATUS_ID,
135
+ secondsRemaining: solarIsotomaHit.hitmarkSeconds + CONSTELLATION_4_CHECK_SECONDS
136
+ });
137
+ castKitSummon(kitEffectState, createAheadBody(body, solarIsotomaAheadMetres), combatant, [solarIsotomaHit], {
138
+ attackTag: "ElementalSkill",
139
+ id: SOLAR_ISOTOMA_ID,
140
+ secondsRemaining: solarIsotomaSeconds,
141
+ spawnSeconds: solarIsotomaHit.hitmarkSeconds
142
+ });
143
+ } }
144
+ };
145
+ };
146
+ export { ALBEDO_CHARACTER_ID, createAlbedoKitBehaviour };