genshin-world 4.3.3 → 4.5.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 (154) hide show
  1. package/README.md +39 -16
  2. package/dist/Attribute-FE76VuWb.js +47 -0
  3. package/dist/AuraType-CiHpg4GS.js +13 -0
  4. package/dist/{ElementDamageBonusAttributeMap-Cf1kBcTu.js → ElementDamageBonusAttributeMap-Bgf-ujSP.js} +2 -1
  5. package/dist/addKitStatus-D3DgePzt.js +10 -0
  6. package/dist/{ainoKit-Z23iOdpE.js → ainoKit-BGP5pu5T.js} +33 -10
  7. package/dist/{albedoKit-h6MSXqhl.js → albedoKit-DAJKIiIE.js} +22 -8
  8. package/dist/{alhaithamKit-2VrwmZzn.js → alhaithamKit-DQWwT5Et.js} +17 -8
  9. package/dist/{aloyKit-Dlk_fLbL.js → aloyKit-DRi2hSnt.js} +23 -17
  10. package/dist/{amberKit-BuYU5ACZ.js → amberKit-BlwZ_3EN.js} +8 -6
  11. package/dist/arlecchinoKit-Q6xz16oZ.js +37 -0
  12. package/dist/{ayakaKit-D7K6RdMw.js → ayakaKit-BkvjSRw8.js} +11 -9
  13. package/dist/{ayatoKit-qQp-Ayun.js → ayatoKit-DA4dHSo5.js} +22 -16
  14. package/dist/{baizhuKit-9i8Hvfeg.js → baizhuKit-tr6Adax1.js} +19 -7
  15. package/dist/{barbaraKit-DMo_2qWo.js → barbaraKit-Cm3iXp-_.js} +9 -7
  16. package/dist/{beidouKit-1lURCwhO.js → beidouKit-BTDmjh54.js} +32 -32
  17. package/dist/{bennettKit-B-ipp-MR.js → bennettKit-BB8WO9BW.js} +14 -11
  18. package/dist/{candaceKit-oGYu9t5n.js → candaceKit-xP3OdFF1.js} +37 -8
  19. package/dist/{castKitField-BhB1fy3l.js → castKitField-B4qvtyqk.js} +1 -1
  20. package/dist/charlotteKit-CWIXixYz.js +176 -0
  21. package/dist/{chascaKit-isny33W1.js → chascaKit-CSbOZVZu.js} +5 -3
  22. package/dist/checkIsKitStatusActive-DXqQEIWV.js +4 -0
  23. package/dist/chevreuseKit-D4YBmfZt.js +72 -0
  24. package/dist/{chioriKit-CKfqMVtb.js → chioriKit-EkVgfoAT.js} +10 -8
  25. package/dist/{chongyunKit-DeZG-qOb.js → chongyunKit-CaGyY-Ox.js} +10 -7
  26. package/dist/{citlaliKit-BLY9P2cd.js → citlaliKit-D3s0VDcT.js} +10 -3
  27. package/dist/{clorindeKit-DGNp_1SZ.js → clorindeKit-Dp8vu9Qm.js} +5 -3
  28. package/dist/{collectKitEnergyDrops-4kTI3aGH.js → collectKitEnergyDrops-CG_RM4My.js} +3 -3
  29. package/dist/{colleiKit-CVBvP9-k.js → colleiKit-Czm_d4d5.js} +4 -4
  30. package/dist/{columbinaKit-BqmNtRDK.js → columbinaKit-BAYIWsJc.js} +11 -9
  31. package/dist/{constants-BIXoNz1x.js → constants-12fZ4HHz.js} +11 -5
  32. package/dist/{constants-r10WzaUG.js → constants-BTk8lcI_.js} +14 -1
  33. package/dist/{constants-DWgLZz-I.js → constants-DB_mcGtc.js} +5 -2
  34. package/dist/{consumeKitResource-DknosO6e.js → consumeKitResource-CxS0-hNi.js} +2 -2
  35. package/dist/{cynoKit-bhub8RfD.js → cynoKit-CGV-oxJF.js} +17 -13
  36. package/dist/dahliaKit-2117hXRk.js +69 -0
  37. package/dist/{dehyaKit-1qJYvLv-.js → dehyaKit-1N72XzVC.js} +4 -2
  38. package/dist/{dilucKit-DslGKmxO.js → dilucKit-C7zMjT-W.js} +5 -3
  39. package/dist/{dionaKit-B33zk3GI.js → dionaKit-BlfcKhIz.js} +48 -7
  40. package/dist/doriKit-Q2xz9GmQ.js +31 -0
  41. package/dist/{durinKit-CpCXxj-r.js → durinKit-CvgMpTL4.js} +5 -3
  42. package/dist/{emilieKit-BZqz4PVs.js → emilieKit-C0gUztv2.js} +2 -2
  43. package/dist/{escoffierKit-DFRj0Hpo.js → escoffierKit-MbLX6779.js} +21 -9
  44. package/dist/{eulaKit-BzD8ye_S.js → eulaKit-6WRTplwN.js} +13 -8
  45. package/dist/{faruzanKit-C5WQz91G.js → faruzanKit-BvIh7odY.js} +4 -3
  46. package/dist/{fischlKit-e4xAt26v.js → fischlKit-B-9CjGXV.js} +13 -10
  47. package/dist/{flinsKit-D82N06z5.js → flinsKit-oWonxdlY.js} +16 -3
  48. package/dist/freminetKit-D_sHoaIp.js +63 -0
  49. package/dist/{furinaKit-CzTKkE0N.js → furinaKit-BQH1g6dB.js} +41 -28
  50. package/dist/{gainKitResource-3F1z8Aco.js → gainKitResource-CNEFzX4H.js} +1 -1
  51. package/dist/{gamingKit-yxYvslgf.js → gamingKit-CE_SPUk_.js} +1 -1
  52. package/dist/{ganyuKit-B2pxzHKL.js → ganyuKit-BKUXTEld.js} +27 -4
  53. package/dist/{getBuffedCombatant-CwXmBrc6.js → getBuffedCombatant-DGjgyKdW.js} +4 -4
  54. package/dist/{gorouKit--Luf6-WZ.js → gorouKit-CElR4kHO.js} +7 -5
  55. package/dist/{heizouKit-DRleoyzF.js → heizouKit-C9RZ12py.js} +17 -10
  56. package/dist/{huTaoKit-WDMpqAzD.js → huTaoKit-B8RnVweC.js} +33 -16
  57. package/dist/{iansanKit-BPzX4C36.js → iansanKit-o5yurFW0.js} +92 -23
  58. package/dist/{ifaKit-Z57TFRSg.js → ifaKit-0RwkwCDe.js} +5 -6
  59. package/dist/{illugaKit-86u4wqrU.js → illugaKit-BPZGhZwK.js} +9 -7
  60. package/dist/index-DKFK4_Ih.d.ts +29419 -0
  61. package/dist/index.d.ts +2 -3
  62. package/dist/index.js +25223 -16603
  63. package/dist/{ineffaKit-D0SA01X2.js → ineffaKit-CmZxbaBi.js} +36 -11
  64. package/dist/{ittoKit-hM51Mywb.js → ittoKit-D1QGmUtM.js} +46 -12
  65. package/dist/{jahodaKit-CqtBpzVS.js → jahodaKit-UA2Tp-7O.js} +23 -14
  66. package/dist/{jeanKit-fwjmnF1v.js → jeanKit-oEjB1MxJ.js} +63 -9
  67. package/dist/{kachinaKit-Dyh5F-ob.js → kachinaKit-BvyiZGJf.js} +1 -1
  68. package/dist/{kaeyaKit-SBM0QxJ5.js → kaeyaKit-CzfMsH91.js} +12 -5
  69. package/dist/{kavehKit-1XyMxtUb.js → kavehKit-BwzF1tkH.js} +5 -3
  70. package/dist/{kazuhaKit-C726LLZy.js → kazuhaKit-DrVGSCvF.js} +34 -6
  71. package/dist/{keqingKit-O_V-tx1h.js → keqingKit-B0yC6wvb.js} +46 -7
  72. package/dist/{kinichKit-DIVa0P5s.js → kinichKit-de766BEY.js} +6 -4
  73. package/dist/{kiraraKit-nS9iOECm.js → kiraraKit-CxQhw2tt.js} +2 -1
  74. package/dist/{kleeKit-DzbELTyN.js → kleeKit-DrDxa_LO.js} +29 -8
  75. package/dist/{kokomiKit-BRzXNRVb.js → kokomiKit-BqtPZktg.js} +7 -5
  76. package/dist/{kujouSaraKit-BpN3Ipay.js → kujouSaraKit-2XnMeHJh.js} +23 -8
  77. package/dist/{kukiKit-DRdmE41e.js → kukiKit-DR2szNbR.js} +21 -5
  78. package/dist/{lanYanKit-CRK1J-LX.js → lanYanKit-DsodOaIC.js} +1 -1
  79. package/dist/{laumaKit-CRc88J5l.js → laumaKit-DEj4CPuv.js} +42 -9
  80. package/dist/{laylaKit-B7Pjqgzw.js → laylaKit-DsMCfdaw.js} +51 -18
  81. package/dist/{lisaKit-BJqj8t7j.js → lisaKit-DSjNkEhN.js} +8 -6
  82. package/dist/{lynetteKit-CfwhsLsJ.js → lynetteKit-D1Ogk-zD.js} +6 -4
  83. package/dist/{lyneyKit-BQiI15dt.js → lyneyKit-DliAqTaa.js} +8 -3
  84. package/dist/{mavuikaKit-MMBY1DJn.js → mavuikaKit-P-UGX4SG.js} +1 -1
  85. package/dist/{mikaKit-BIMafqBI.js → mikaKit-C7VZ33we.js} +1 -1
  86. package/dist/{mizukiKit-CC34yGgJ.js → mizukiKit-C5cNt5YD.js} +18 -2
  87. package/dist/{monaKit-BlrXXHlB.js → monaKit-BkaM7GNg.js} +9 -7
  88. package/dist/nahidaKit-BIAOyyY6.js +207 -0
  89. package/dist/{naviaKit-DDttg5Dp.js → naviaKit-BijwEz_P.js} +9 -6
  90. package/dist/{neferKit-Z-QBM46z.js → neferKit-Deg6U9-Y.js} +2 -2
  91. package/dist/{neuvilletteKit-B4EhID2O.js → neuvilletteKit-C92eqydr.js} +19 -13
  92. package/dist/{nicoleKit-Dmrpe0yU.js → nicoleKit-Cc4BOTai.js} +32 -27
  93. package/dist/{nilouKit-CoztU-uZ.js → nilouKit-BozGg1ex.js} +56 -26
  94. package/dist/{ningguangKit-BGOXmwd-.js → ningguangKit-DUdANcXN.js} +17 -4
  95. package/dist/{noelleKit-nl5ar8f1.js → noelleKit-C3D6Rvdm.js} +8 -5
  96. package/dist/{odetteKit-Bu1W8GX7.js → odetteKit-BmshjGvv.js} +3 -3
  97. package/dist/{ororonKit-CboDk9B8.js → ororonKit-iJbv44S9.js} +5 -5
  98. package/dist/{pruneKit-xgQ9cym6.js → pruneKit-DHyw27oI.js} +1 -1
  99. package/dist/{qiqiKit-lz_qLyLu.js → qiqiKit-DgIaJuTE.js} +12 -7
  100. package/dist/{raidenKit-CVTi4bpy.js → raidenKit-DhXNpHz5.js} +8 -7
  101. package/dist/{razorKit-BHyrlVEl.js → razorKit-CbWRxSI2.js} +28 -20
  102. package/dist/{readCharacterAvatar-xauJoD8Q.js → readCharacterAvatar-CUATz36q.js} +6 -5
  103. package/dist/rosariaKit-TRY4PA3E.js +110 -0
  104. package/dist/{save-W-sjOoN_.js → save-D-IcGqEm.js} +639 -272
  105. package/dist/save.d.ts +1 -1
  106. package/dist/save.js +1 -1
  107. package/dist/{sayuKit-DQbPlL_6.js → sayuKit-CrnsmO_J.js} +30 -8
  108. package/dist/{shenheKit-Xu_rt5aN.js → shenheKit-DII-mS2u.js} +7 -6
  109. package/dist/sigewinneKit-3120CDT8.js +53 -0
  110. package/dist/{skirkKit-CK183sCe.js → skirkKit-7VWgs8i4.js} +5 -1
  111. package/dist/style.css +7205 -3939
  112. package/dist/{sucroseKit-Brr_FwwP.js → sucroseKit-44fzCvn9.js} +7 -7
  113. package/dist/{tartagliaKit-DQzYxDRn.js → tartagliaKit-CGTfH-Tr.js} +22 -16
  114. package/dist/terrainTileWorker.js +4 -4
  115. package/dist/{thomaKit-CesNlmDH.js → thomaKit-Dl9rWoaP.js} +11 -6
  116. package/dist/{tighnariKit-B9BZlgE9.js → tighnariKit-2_-s6l8w.js} +3 -3
  117. package/dist/{varesaKit-D5iKxzdo.js → varesaKit-CRNMJSoc.js} +5 -3
  118. package/dist/{ventiKit-CM94zgZy.js → ventiKit-CA3xSK6I.js} +21 -3
  119. package/dist/{wandererKit-CW3sLw53.js → wandererKit-B_ifeLC0.js} +3 -1
  120. package/dist/{wriothesleyKit-CPwNVWnr.js → wriothesleyKit-DeQsvL4q.js} +11 -4
  121. package/dist/{xianglingKit-DAFhr2LW.js → xianglingKit-C817XGaX.js} +5 -4
  122. package/dist/{xianyunKit-G4ateSub.js → xianyunKit-CMHAhay9.js} +17 -10
  123. package/dist/{xiaoKit-CQljYrZS.js → xiaoKit-D4YDN5xd.js} +5 -4
  124. package/dist/xilonenKit-7NhQqLuF.js +80 -0
  125. package/dist/{xingqiuKit-nURrQ7vt.js → xingqiuKit-CfdF5bY4.js} +10 -5
  126. package/dist/{xinyanKit-DU0WpVms.js → xinyanKit-D3UNKfTl.js} +6 -5
  127. package/dist/{yaeMikoKit-kSDqAFyn.js → yaeMikoKit-C9vWIy6z.js} +21 -2
  128. package/dist/{yanfeiKit-Cst973qA.js → yanfeiKit-Dohf97o8.js} +25 -9
  129. package/dist/{yaoyaoKit-6yjjf3np.js → yaoyaoKit-B-fGVZ8A.js} +15 -10
  130. package/dist/{yelanKit-SSdzqMQa.js → yelanKit-CweIegpm.js} +42 -12
  131. package/dist/{yoimiyaKit-DqiQvgAt.js → yoimiyaKit-CsSrLPNg.js} +16 -9
  132. package/dist/{yunjinKit-lCP6TTRP.js → yunjinKit-B3yKAtk5.js} +29 -12
  133. package/dist/{zhongliKit-CTjDWUoW.js → zhongliKit-GyC8l0Qd.js} +11 -9
  134. package/dist/{zibaiKit-CatYt9BG.js → zibaiKit-CScZzBRk.js} +3 -3
  135. package/package.json +18 -21
  136. package/dist/GameDataset-oS0Tc9KV.js +0 -272
  137. package/dist/ReactionType-BTiek5WA.js +0 -36
  138. package/dist/TransformativeReactionType-DYhIEAoe.js +0 -14
  139. package/dist/addKitStatus-CecgwPmO.js +0 -8
  140. package/dist/arlecchinoKit-B2WJP5Y5.js +0 -16
  141. package/dist/characterPack-B3e_YsdJ.d.ts +0 -115
  142. package/dist/characterPack-DzYMqBNM.js +0 -697
  143. package/dist/characterPack.d.ts +0 -2
  144. package/dist/characterPack.js +0 -3
  145. package/dist/charlotteKit-BjNvcN8w.js +0 -103
  146. package/dist/chevreuseKit-BppMndmv.js +0 -47
  147. package/dist/dahliaKit-BeEPFn33.js +0 -20
  148. package/dist/doriKit-BmYySQcG.js +0 -24
  149. package/dist/freminetKit-Dq9ebIts.js +0 -20
  150. package/dist/index-C5rNBYhp.d.ts +0 -26017
  151. package/dist/nahidaKit-ZHrD7-m7.js +0 -112
  152. package/dist/rosariaKit-DEpP8gj7.js +0 -59
  153. package/dist/sigewinneKit-NOWCcIW4.js +0 -21
  154. package/dist/xilonenKit-39u8vLuk.js +0 -41
package/README.md CHANGED
@@ -5,19 +5,14 @@
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. It holds everything that is the game's rather than any engine's:
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.
9
9
 
10
- - the catalogue of regions, areas and subareas;
11
- - each region's authored data: its heights, colours, look and landmarks;
12
- - the TresJS components and composables that build all of it;
13
- - the game's screens — its opening's splashes, login screen and startup loading — built from [`genshin-interface`](https://github.com/Esposter/Esposter/tree/main/packages/genshin-interface)'s pieces.
14
-
15
- 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.
10
+ Design notes live in [the specs](https://github.com/Esposter/Esposter/tree/main/openspec/specs/genshin).
16
11
 
17
12
  ## Table of Contents
18
13
 
19
14
  - 🚀 [Getting Started](#getting-started)
20
- - 📖 [Documentation](#documentation)
15
+ - 🧩 [Key Exports](#key-exports)
21
16
  - ⚖️ [License](#license)
22
17
 
23
18
  ---
@@ -25,37 +20,65 @@ It ships no image, model or sound from the game: every mesh, texture and shader
25
20
  ## <a name="getting-started">🚀 Getting Started</a>
26
21
 
27
22
  ```bash
28
- pnpm i genshin-world genshin-engine genshin-interface @esposter/shared @tresjs/core @vueuse/core three vue zod
23
+ pnpm i genshin-world genshin-engine genshin-interface genshin-text @esposter/shared @tresjs/core @vueuse/core three vue zod
29
24
  ```
30
25
 
31
- 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:
32
29
 
33
30
  ```vue
34
31
  <script setup lang="ts">
35
32
  import { WorldScreen } from "genshin-world";
36
33
  import TerrainTileWorker from "genshin-world/terrainTileWorker?worker";
34
+ import { QualityTier } from "genshin-engine";
35
+ import { ENGLISH_GAME_TEXT, GameLanguage } from "genshin-text";
37
36
  import "genshin-interface/style.css";
38
37
  import "genshin-world/style.css";
38
+
39
+ const isDevelopment = import.meta.env.DEV;
40
+ const qualityTier = QualityTier.High;
39
41
  </script>
40
42
 
41
43
  <template>
42
44
  <WorldScreen
45
+ account-avatar-url="https://your-host.example/avatar.png"
43
46
  :create-terrain-worker="() => new TerrainTileWorker()"
44
- :is-tuning="isDevelopment || undefined"
45
- :quality-tier
47
+ :game-text="ENGLISH_GAME_TEXT"
48
+ :is-paused="false"
49
+ :is-tuning="isDevelopment"
50
+ :language="GameLanguage.English"
51
+ :quality-tier="qualityTier"
52
+ :server-clock-offset-ms="0"
46
53
  game-data-base-url="https://your-host.example/game-data"
47
54
  region-data-base-url="genshin"
55
+ scene-export-base-url="https://your-host.example/scene-exports"
48
56
  />
49
57
  </template>
50
58
  ```
51
59
 
52
- Region data lives in `src/data/regions/<region>.json`, and your server serves it at the base URL, so a region is fetched as the camera comes within reach and released as it leaves.
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`.
53
66
 
54
- The game's data is not bundled. Every record the world reads — the opening's title logo and login screen, the world's ground, catalogue and animals, the game's tables and words, the character profiles and the book bodies — is fetched from `game-data-base-url`, which `GameOpening` takes as `WorldScreen` does, and every reader the package exports (`readGameData`, `readStatTables` and the rest) takes the same base as its first argument. Your host must serve every object and index entry that the package's `gameDataLock.json` names, each 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.
67
+ Allow CORS for your page's origin. Esposter's own accounts admit only Esposter's origins. Another host must publish its own copy.
55
68
 
56
- ## <a name="documentation">📖 Documentation</a>
69
+ ## <a name="key-exports">🧩 Key Exports</a>
57
70
 
58
- We highly recommend you take a look at the [documentation](https://github.com/Esposter/Esposter/tree/main/openspec/specs/genshin) to level up. How each screen is matched to the game is described on the [parity page](https://github.com/Esposter/Esposter/tree/main/openspec/specs/genshin/parity).
71
+ | Export | Kind | Purpose |
72
+ | ------------------- | ---------- | ----------------------------------------------------------------------------------------------------------- |
73
+ | `GameOpening` | component | The game's opening: its splash sequence, login screen and startup loading |
74
+ | `GenshinSave` | type | One player's whole Genshin save, with one key per system |
75
+ | `genshinSaveSchema` | schema | The Zod schema a save is parsed against, refusing one that is too large |
76
+ | `readCatalogue` | function | The catalogue of regions, areas and subareas, fetched by key and checked against its schema |
77
+ | `readGameData` | function | Reads one game-data record by key and parses it with the schema given |
78
+ | `readGenshinSave` | function | Reads a save into the world's systems, leaving derived ones to the rules that read them on load |
79
+ | `readStatTables` | function | The game's stat tables, fetched by key and checked against their schema |
80
+ | `useSky` | composable | Writes the sky at the game's clock into everything the sky lights, and drifts the clouds with the wind |
81
+ | `WorldScreen` | component | The whole world as one screen with its own canvas, opened once its names, tables and first view have loaded |
59
82
 
60
83
  ## <a name="license">⚖️ License</a>
61
84
 
@@ -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 };
@@ -1,4 +1,5 @@
1
- import "./GameDataset-oS0Tc9KV.js";
1
+ import "./Attribute-FE76VuWb.js";
2
+ import "./save-D-IcGqEm.js";
2
3
  // src/services/combat/damage/ElementDamageBonusAttributeMap.ts
3
4
  const ElementDamageBonusAttributeMap = {
4
5
  ["Wind"]: "FIGHT_PROP_WIND_ADD_HURT",
@@ -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 };
@@ -1,10 +1,12 @@
1
- import "./GameDataset-oS0Tc9KV.js";
2
- import { t as gainPartyMemberEnergy } from "./gainPartyMemberEnergy-DUbIxe6i.js";
1
+ import "./Attribute-FE76VuWb.js";
2
+ import { buffKitMember, castKitSummon, elementalMasteryMultiplier, getMoonsignLevel, queueKitPassiveHit, startKitCooldown } from "./index.js";
3
+ import "./save-D-IcGqEm.js";
3
4
  import "./KitEventKind-DinObjiq.js";
5
+ import { t as addKitStatus } from "./addKitStatus-D3DgePzt.js";
6
+ import { t as castKitField } from "./castKitField-B4qvtyqk.js";
7
+ import { t as checkIsKitStatusActive } from "./checkIsKitStatusActive-DXqQEIWV.js";
4
8
  import { t as findKitStatus } from "./findKitStatus-Dj_zauGj.js";
5
- import { t as addKitStatus } from "./addKitStatus-CecgwPmO.js";
6
- import { t as castKitField } from "./castKitField-BhB1fy3l.js";
7
- import { buffKitMember, castKitSummon, checkIsKitStatusActive, elementalMasteryMultiplier, getMoonsignLevel, queueKitPassiveHit, startKitCooldown } from "./index.js";
9
+ import { t as gainPartyMemberEnergy } from "./gainPartyMemberEnergy-DUbIxe6i.js";
8
10
  // src/services/kit/characters/ainoKit.ts
9
11
  const ASCENSION_4 = 4;
10
12
  const ASCENSION_1 = 1;
@@ -25,6 +27,17 @@ const CONSTELLATION_2_COOLDOWN_ID = "aino-constellation-2-cooldown";
25
27
  const CONSTELLATION_2_COOLDOWN_SECONDS = 5;
26
28
  const CONSTELLATION_2_RADIUS = 1.5;
27
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
+ ]);
28
41
  const createAinoKitBehaviour = ({ kit, readHit, readParameter, readSeconds }) => {
29
42
  const masteryShare = readParameter("ascension4MasteryShare");
30
43
  const burstFirstTickSeconds = readSeconds("burstStart");
@@ -62,16 +75,26 @@ const createAinoKitBehaviour = ({ kit, readHit, readParameter, readSeconds }) =>
62
75
  id: BURST_FIELD_ID,
63
76
  isFollowing: true,
64
77
  nextTickSeconds: burstFirstTickSeconds,
65
- onTick: ({ kitEffectState: tickKitEffectState }) => castKitSummon(tickKitEffectState, {
66
- facing,
67
- height,
68
- position: burstField.centre
69
- }, combatant, [isAscendantBurst ? ascendantWaterBall : waterBall], { attackTag: "ElementalBurst" }),
78
+ onTick: ({ kitEffectState: tickKitEffectState }) => {
79
+ castKitSummon(tickKitEffectState, {
80
+ facing,
81
+ height,
82
+ position: burstField.centre
83
+ }, combatant, [isAscendantBurst ? ascendantWaterBall : waterBall], { attackTag: "ElementalBurst" });
84
+ },
70
85
  radius: burstRadius,
71
86
  secondsRemaining: burstFirstTickSeconds + burstSeconds,
72
87
  tickIntervalSeconds: isAscendantBurst ? ASCENSION_1_WATER_BALL_INTERVAL_SECONDS : burstTickIntervalSeconds
73
88
  });
89
+ if (combatant.constellationCount >= CONSTELLATION_6) addKitStatus(kitEffectState, combatant.characterId, {
90
+ id: CONSTELLATION_6_STATUS_ID,
91
+ secondsRemaining: CONSTELLATION_6_SECONDS
92
+ });
74
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
+ },
75
98
  onKitEvent: (event, context, combatant) => {
76
99
  const { activeCombatant, kitEffectState, party } = context;
77
100
  if (combatant.constellationCount >= CONSTELLATION_1 && (event.kind === "SkillUsed" || event.kind === "BurstUsed") && event.characterId === combatant.characterId) {
@@ -1,10 +1,12 @@
1
- import "./GameDataset-oS0Tc9KV.js";
2
- import { t as getBuffedCombatant } from "./getBuffedCombatant-CwXmBrc6.js";
3
- import { t as getPartyMember } from "./getPartyMember-BAb9wUiz.js";
1
+ import "./Attribute-FE76VuWb.js";
2
+ import { buffKitMember, buffKitTeam, castKitSummon, checkIsInKitField, createAheadBody, createKitBody, findStandingKitSummon, startKitCooldown } from "./index.js";
4
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";
5
7
  import { t as findKitStatus } from "./findKitStatus-Dj_zauGj.js";
6
- import { t as addKitStatus } from "./addKitStatus-CecgwPmO.js";
7
- import { buffKitMember, buffKitTeam, castKitSummon, checkIsInKitField, checkIsKitStatusActive, createAheadBody, createKitBody, findStandingKitSummon, startKitCooldown } from "./index.js";
8
+ import { t as getBuffedCombatant } from "./getBuffedCombatant-DGjgyKdW.js";
9
+ import { t as getPartyMember } from "./getPartyMember-BAb9wUiz.js";
8
10
  // src/services/kit/characters/albedoKit.ts
9
11
  const SOLAR_ISOTOMA_ID = "albedo-solar-isotoma";
10
12
  const TRANSIENT_BLOSSOM_COOLDOWN_STATUS_ID = "albedo-transient-blossom-cooldown";
@@ -22,6 +24,10 @@ const CONSTELLATION_4_SECONDS = 1;
22
24
  const CONSTELLATION_4_CHECK_SECONDS = .3;
23
25
  const CONSTELLATION_4_CHECK_STATUS_ID = "albedo-constellation-4-check";
24
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";
25
31
  const TRANSIENT_BLOSSOM_ENERGY = 1.2;
26
32
  const SOLAR_ISOTOMA_DEFENSE_PERCENT = .5;
27
33
  const SOLAR_ISOTOMA_DEFENSE_SECONDS = 20;
@@ -93,20 +99,28 @@ const createAlbedoKitBehaviour = ({ readHit, readHits, readParameter, readSecond
93
99
  const member = getPartyMember(party, characterId);
94
100
  member.energy = Math.min(combatant.kit.burstEnergyCost, member.energy + TRANSIENT_BLOSSOM_ENERGY);
95
101
  },
96
- onStep: ({ activeCombatant, body, kitEffectState }, combatant) => {
102
+ onStep: ({ activeCombatant, body, kitEffectState, party }, combatant) => {
97
103
  if (combatant.constellationCount < ALBEDO_CONSTELLATION_4) return;
98
104
  if (!startKitCooldown(kitEffectState, combatant.characterId, CONSTELLATION_4_CHECK_STATUS_ID, CONSTELLATION_4_CHECK_SECONDS)) return;
99
105
  const solarIsotoma = findStandingKitSummon(kitEffectState.effects, SOLAR_ISOTOMA_ID, combatant.characterId);
100
- if (!solarIsotoma || solarIsotoma.secondsRemaining <= 0 || !checkIsInKitField({
106
+ if (!solarIsotoma || solarIsotoma.secondsRemaining <= 0) return;
107
+ const field = {
101
108
  centre: solarIsotoma.body.position,
102
109
  radius: solarIsotomaRadius
103
- }, body.position)) return;
110
+ };
111
+ if (!checkIsInKitField(field, body.position)) return;
104
112
  buffKitMember(kitEffectState, activeCombatant.characterId, {
105
113
  amount: CONSTELLATION_4_PLUNGING_ATTACK_BONUS,
106
114
  attribute: "FIGHT_PROP_PLUNGING_ATTACK_ADD_HURT",
107
115
  secondsRemaining: CONSTELLATION_4_SECONDS,
108
116
  source: CONSTELLATION_4_SOURCE
109
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
+ });
110
124
  },
111
125
  skill: { onStart: ({ activeCombatant: combatant, body, kitEffectState }) => {
112
126
  if (combatant.constellationCount >= ALBEDO_CONSTELLATION_1) buffKitMember(kitEffectState, combatant.characterId, {
@@ -1,11 +1,12 @@
1
- import "./GameDataset-oS0Tc9KV.js";
2
- import { t as getDeployedCharacterIds } from "./getDeployedCharacterIds-TuIRCNKb.js";
1
+ import "./Attribute-FE76VuWb.js";
2
+ import { buffKitMember, castKitSummon, changeKitSkillCooldown, elementalMasteryMultiplier, scheduleKitTask, startKitCooldown } from "./index.js";
3
+ import "./save-D-IcGqEm.js";
3
4
  import "./KitEventKind-DinObjiq.js";
4
5
  import { t as addKitEffect } from "./addKitEffect-DEhZUuxo.js";
6
+ import { t as addKitStatus } from "./addKitStatus-D3DgePzt.js";
7
+ import { t as castKitField } from "./castKitField-B4qvtyqk.js";
5
8
  import { t as findKitStatus } from "./findKitStatus-Dj_zauGj.js";
6
- import { t as addKitStatus } from "./addKitStatus-CecgwPmO.js";
7
- import { t as castKitField } from "./castKitField-BhB1fy3l.js";
8
- import { buffKitMember, castKitSummon, changeKitSkillCooldown, elementalMasteryMultiplier, scheduleKitTask, startKitCooldown } from "./index.js";
9
+ import { t as getDeployedCharacterIds } from "./getDeployedCharacterIds-TuIRCNKb.js";
9
10
  import { takeOne } from "@esposter/shared";
10
11
  // src/services/kit/characters/alhaithamKit.ts
11
12
  const ASCENSION_1 = 1;
@@ -172,11 +173,19 @@ const createAlhaithamKitBehaviour = ({ kit, readHits, readParameter, readSeconds
172
173
  if (count === 0 || !startKitCooldown(kitEffectState, characterId, PROJECTION_ICD_STATUS_ID, projectionCooldownSeconds)) return;
173
174
  castKitSummon(kitEffectState, body, combatant, takeOne(projectionAttacks, count - 1), { attackTag: "ElementalSkill" });
174
175
  };
175
- const strikeHitBehaviour = { onStrike: (context, strike) => triggerProjection(context, strike, false) };
176
- const mirrorSourceHitBehaviour = { onStrike: (context, strike) => triggerProjection(context, strike, true) };
176
+ const strikeHitBehaviour = { onStrike: (context, strike) => {
177
+ triggerProjection(context, strike, false);
178
+ } };
179
+ const mirrorSourceHitBehaviour = { onStrike: (context, strike) => {
180
+ triggerProjection(context, strike, true);
181
+ } };
177
182
  const createSkillBehaviour = (mirrorSeconds) => ({
178
183
  hits: [{ additiveBaseDamageBonus: (striker) => elementalMasteryMultiplier(striker, skillElementalMasteryShare) }],
179
- onStart: ({ activeCombatant: combatant, body, kitEffectState }) => scheduleKitTask(kitEffectState, combatant.characterId, mirrorSeconds, (tick) => gainMirrors(tick.kitEffectState, body, combatant, getSkillMirrorGain(tick.kitEffectState.effects, combatant.characterId)))
184
+ onStart: ({ activeCombatant: combatant, body, kitEffectState }) => {
185
+ scheduleKitTask(kitEffectState, combatant.characterId, mirrorSeconds, (tick) => {
186
+ gainMirrors(tick.kitEffectState, body, combatant, getSkillMirrorGain(tick.kitEffectState.effects, combatant.characterId));
187
+ });
188
+ }
180
189
  });
181
190
  return {
182
191
  burst: { onStart: ({ activeCombatant: combatant, body, kitEffectState, party }) => {
@@ -1,12 +1,14 @@
1
- import "./GameDataset-oS0Tc9KV.js";
1
+ import "./Attribute-FE76VuWb.js";
2
+ import "./save-D-IcGqEm.js";
2
3
  import { t as addKitEffect } from "./addKitEffect-DEhZUuxo.js";
3
- import { t as addKitStatus } from "./addKitStatus-CecgwPmO.js";
4
- import { t as spendKitResource } from "./spendKitResource-CC5kZDgu.js";
5
- import { t as gainKitResource } from "./gainKitResource-3F1z8Aco.js";
4
+ import { t as addKitStatus } from "./addKitStatus-D3DgePzt.js";
6
5
  import { buffKitMember, buffKitTeam, checkHasKitStatus, scheduleKitTask } from "./index.js";
6
+ import { t as gainKitResource } from "./gainKitResource-CNEFzX4H.js";
7
+ import { t as spendKitResource } from "./spendKitResource-CC5kZDgu.js";
7
8
  // src/services/kit/characters/aloyKit.ts
8
9
  const COIL_RUSHING_ICE_STACKS = 4;
9
10
  const COIL_RESOURCE_ID = "aloy-coil";
11
+ const CHILLWATER_BOMBLET_COUNT = 6;
10
12
  const RUSHING_ICE_STATUS_ID = "aloy-rushing-ice";
11
13
  const ASCENSION_1 = 1;
12
14
  const ASCENSION_1_ATTACK_SHARE = .08;
@@ -17,15 +19,21 @@ const ASCENSION_4 = 4;
17
19
  const ASCENSION_4_CRYO_SHARE_PER_STACK = .035;
18
20
  const ASCENSION_4_MAX_STACKS = 10;
19
21
  const ASCENSION_4_SOURCE = "aloy-ascension-4";
20
- const addCryoStacks = (kitEffectState, characterId, stacks, secondsRemaining) => buffKitMember(kitEffectState, characterId, {
21
- amount: Math.min(stacks, ASCENSION_4_MAX_STACKS) * ASCENSION_4_CRYO_SHARE_PER_STACK,
22
- attribute: "FIGHT_PROP_ICE_ADD_HURT",
23
- secondsRemaining,
24
- source: ASCENSION_4_SOURCE
25
- });
22
+ const addCryoStacks = (kitEffectState, characterId, stacks, secondsRemaining) => {
23
+ buffKitMember(kitEffectState, characterId, {
24
+ amount: Math.min(stacks, ASCENSION_4_MAX_STACKS) * ASCENSION_4_CRYO_SHARE_PER_STACK,
25
+ attribute: "FIGHT_PROP_ICE_ADD_HURT",
26
+ secondsRemaining,
27
+ source: ASCENSION_4_SOURCE
28
+ });
29
+ };
26
30
  const createAloyKitBehaviour = ({ readSeconds }) => {
27
31
  const rushingIceSeconds = readSeconds("rushingIceDuration");
28
- const addCoilStack = ({ kitEffectState, party }, { combatant }) => {
32
+ const countedCoilStrikes = /* @__PURE__ */ new WeakSet();
33
+ const addCoilStack = ({ kitEffectState, party }, strike) => {
34
+ if (countedCoilStrikes.has(strike)) return;
35
+ countedCoilStrikes.add(strike);
36
+ const { combatant } = strike;
29
37
  if (checkHasKitStatus(kitEffectState.effects, combatant.characterId, RUSHING_ICE_STATUS_ID)) return;
30
38
  if (gainKitResource(kitEffectState, combatant.characterId, COIL_RESOURCE_ID, 1, COIL_RUSHING_ICE_STACKS) < COIL_RUSHING_ICE_STACKS) return;
31
39
  spendKitResource(kitEffectState, combatant.characterId, COIL_RESOURCE_ID);
@@ -55,12 +63,10 @@ const createAloyKitBehaviour = ({ readSeconds }) => {
55
63
  }
56
64
  if (combatant.ascension < ASCENSION_4) return;
57
65
  addCryoStacks(kitEffectState, combatant.characterId, 1, rushingIceSeconds);
58
- for (let second = 1; second < ASCENSION_4_MAX_STACKS; second++) scheduleKitTask(kitEffectState, combatant.characterId, second, ({ kitEffectState: tickKitEffectState }) => addCryoStacks(tickKitEffectState, combatant.characterId, second + 1, rushingIceSeconds - second));
66
+ for (let second = 1; second < ASCENSION_4_MAX_STACKS; second++) scheduleKitTask(kitEffectState, combatant.characterId, second, ({ kitEffectState: tickKitEffectState }) => {
67
+ addCryoStacks(tickKitEffectState, combatant.characterId, second + 1, rushingIceSeconds - second);
68
+ });
59
69
  };
60
- return { skill: { hits: [
61
- {},
62
- { onStrike: addCoilStack },
63
- { onStrike: addCoilStack }
64
- ] } };
70
+ return { skill: { hits: [{}, ...Array.from({ length: CHILLWATER_BOMBLET_COUNT }, () => ({ onStrike: addCoilStack }))] } };
65
71
  };
66
72
  export { createAloyKitBehaviour };
@@ -1,4 +1,4 @@
1
- import "./GameDataset-oS0Tc9KV.js";
1
+ import "./Attribute-FE76VuWb.js";
2
2
  import { buffKitTeam, castKitSummon, castKitTaunt, createConstellationSkillChargeBonus, getKitMaxHealth, queueKitPassiveHit } from "./index.js";
3
3
  // src/services/kit/characters/amberKit.ts
4
4
  const EVERY_ARROW_FINDS_ITS_TARGET_ASCENSION = 1;
@@ -75,11 +75,13 @@ const createAmberKitBehaviour = ({ readHit, readHits, readParameter, readSeconds
75
75
  },
76
76
  getSkillChargeBonus: createConstellationSkillChargeBonus(CONSTELLATION_4),
77
77
  getSkillCooldownMultiplier: ({ activeCombatant }) => activeCombatant.constellationCount >= CONSTELLATION_4 ? CONSTELLATION_4_SKILL_COOLDOWN_MULTIPLIER : 1,
78
- skill: { onStart: ({ activeCombatant: combatant, body, characterIdCombatantMap, kitEffectState, party }) => castKitTaunt(kitEffectState, body, combatant, {
79
- explosion: bunnyExplosion,
80
- health: bunnyMaxHealthShare * getKitMaxHealth(combatant, kitEffectState.effects, party, characterIdCombatantMap),
81
- secondsRemaining: bunnySeconds
82
- }) }
78
+ skill: { onStart: ({ activeCombatant: combatant, body, characterIdCombatantMap, kitEffectState, party }) => {
79
+ castKitTaunt(kitEffectState, body, combatant, {
80
+ explosion: bunnyExplosion,
81
+ health: bunnyMaxHealthShare * getKitMaxHealth(combatant, kitEffectState.effects, party, characterIdCombatantMap),
82
+ secondsRemaining: bunnySeconds
83
+ });
84
+ } }
83
85
  };
84
86
  };
85
87
  export { createAmberKitBehaviour };
@@ -0,0 +1,37 @@
1
+ import "./Attribute-FE76VuWb.js";
2
+ import { scheduleKitTask, startKitCooldown, toKitSeconds } from "./index.js";
3
+ import { t as addKitStatus } from "./addKitStatus-D3DgePzt.js";
4
+ import { t as checkIsKitStatusActive } from "./checkIsKitStatusActive-DXqQEIWV.js";
5
+ import { t as getPartyMember } from "./getPartyMember-BAb9wUiz.js";
6
+ // src/services/kit/characters/arlecchinoKit.ts
7
+ const PYRO_DAMAGE_BONUS = .4;
8
+ const BURST_SKILL_RESET_FRAMES = 107;
9
+ const CONSTELLATION_6 = 6;
10
+ const CONSTELLATION_6_CRITICAL_RATE = .1;
11
+ const CONSTELLATION_6_CRITICAL_DAMAGE = .7;
12
+ const CONSTELLATION_6_SECONDS = 20;
13
+ const CONSTELLATION_6_COOLDOWN_SECONDS = 15;
14
+ const CONSTELLATION_6_COOLDOWN_ID = "arlecchino-constellation-6-cooldown";
15
+ const CONSTELLATION_6_STATUS_ID = "arlecchino-constellation-6";
16
+ const CONSTELLATION_6_ATTACK_TAGS = /* @__PURE__ */ new Set(["ElementalBurst", "NormalAttack"]);
17
+ const checkIsConstellation6Strike = (strike, effects) => strike.attackTag !== void 0 && CONSTELLATION_6_ATTACK_TAGS.has(strike.attackTag) && checkIsKitStatusActive(effects, strike.combatant.characterId, CONSTELLATION_6_STATUS_ID);
18
+ const createArlecchinoKitBehaviour = () => ({
19
+ burst: { onStart: ({ activeCombatant: combatant, kitEffectState }) => {
20
+ scheduleKitTask(kitEffectState, combatant.characterId, toKitSeconds(BURST_SKILL_RESET_FRAMES), ({ party }) => {
21
+ getPartyMember(party, combatant.characterId).skillCooldownSeconds = 0;
22
+ });
23
+ } },
24
+ getPassiveBonuses: () => [{
25
+ amount: PYRO_DAMAGE_BONUS,
26
+ attribute: "FIGHT_PROP_FIRE_ADD_HURT"
27
+ }],
28
+ getStrikeCriticalDamageBonus: (strike, _enemy, _party, effects) => checkIsConstellation6Strike(strike, effects) ? CONSTELLATION_6_CRITICAL_DAMAGE : 0,
29
+ getStrikeCriticalRateBonus: (strike, _enemy, _party, effects) => checkIsConstellation6Strike(strike, effects) ? CONSTELLATION_6_CRITICAL_RATE : 0,
30
+ skill: { onStart: ({ activeCombatant: combatant, kitEffectState }) => {
31
+ if (combatant.constellationCount >= CONSTELLATION_6 && startKitCooldown(kitEffectState, combatant.characterId, CONSTELLATION_6_COOLDOWN_ID, CONSTELLATION_6_COOLDOWN_SECONDS)) addKitStatus(kitEffectState, combatant.characterId, {
32
+ id: CONSTELLATION_6_STATUS_ID,
33
+ secondsRemaining: CONSTELLATION_6_SECONDS
34
+ });
35
+ } }
36
+ });
37
+ export { createArlecchinoKitBehaviour };
@@ -1,8 +1,8 @@
1
- import "./GameDataset-oS0Tc9KV.js";
1
+ import { castKitSummon, changeKitSkillCooldown, startKitCooldown } from "./index.js";
2
+ import "./save-D-IcGqEm.js";
2
3
  import { t as addKitEffect } from "./addKitEffect-DEhZUuxo.js";
4
+ import { t as addKitStatus } from "./addKitStatus-D3DgePzt.js";
3
5
  import { t as findKitStatus } from "./findKitStatus-Dj_zauGj.js";
4
- import { t as addKitStatus } from "./addKitStatus-CecgwPmO.js";
5
- import { castKitSummon, changeKitSkillCooldown, startKitCooldown } from "./index.js";
6
6
  // src/services/kit/characters/ayakaKit.ts
7
7
  const BLIZZARD_BLADE_SEKI_NO_TO_CONSTELLATION = 2;
8
8
  const SENHO_INFUSION_SECONDS = 5;
@@ -66,12 +66,14 @@ const createAyakaKitBehaviour = ({ kit, readHits }) => {
66
66
  return ((attackTag === "NormalAttack" || attackTag === "ChargedAttack") && findKitStatus(effects, combatant.characterId, AMATSUMI_KUNITSUMI_SANCTIFICATION_STATUS_ID) ? AMATSUMI_KUNITSUMI_SANCTIFICATION_DAMAGE_BONUS : 0) + (attackTag === "ChargedAttack" && combatant.constellationCount >= CONSTELLATION_6 && checkIsUsurahiButouOn(effects, combatant.characterId) ? USURAHI_BUTOU_DAMAGE_BONUS : 0);
67
67
  },
68
68
  normalAttacks: kit.normalAttacks.map(({ hits }) => ({ hits: hits.map(() => snowsweptSakuraHit) })),
69
- onSprint: ({ activeCombatant: combatant, kitEffectState }) => addKitEffect(kitEffectState, {
70
- characterId: combatant.characterId,
71
- element: "Ice",
72
- kind: "infusion",
73
- secondsRemaining: SENHO_INFUSION_SECONDS
74
- }),
69
+ onSprint: ({ activeCombatant: combatant, kitEffectState }) => {
70
+ addKitEffect(kitEffectState, {
71
+ characterId: combatant.characterId,
72
+ element: "Ice",
73
+ kind: "infusion",
74
+ secondsRemaining: SENHO_INFUSION_SECONDS
75
+ });
76
+ },
75
77
  skill: { onStart: ({ activeCombatant: combatant, kitEffectState }) => {
76
78
  if (combatant.ascension < ASCENSION_1) return;
77
79
  addKitStatus(kitEffectState, combatant.characterId, {
@@ -1,10 +1,10 @@
1
- import { t as gainPartyMemberEnergy } from "./gainPartyMemberEnergy-DUbIxe6i.js";
2
- import { t as getPartyMember } from "./getPartyMember-BAb9wUiz.js";
1
+ import { castKitSummon, enterKitStance, scheduleKitTask } from "./index.js";
3
2
  import "./KitEventKind-DinObjiq.js";
3
+ import { t as addKitStatus } from "./addKitStatus-D3DgePzt.js";
4
+ import { t as castKitField } from "./castKitField-B4qvtyqk.js";
4
5
  import { t as findKitStatus } from "./findKitStatus-Dj_zauGj.js";
5
- import { t as addKitStatus } from "./addKitStatus-CecgwPmO.js";
6
- import { t as castKitField } from "./castKitField-BhB1fy3l.js";
7
- import { castKitSummon, enterKitStance, scheduleKitTask } from "./index.js";
6
+ import { t as gainPartyMemberEnergy } from "./gainPartyMemberEnergy-DUbIxe6i.js";
7
+ import { t as getPartyMember } from "./getPartyMember-BAb9wUiz.js";
8
8
  import { takeOne } from "@esposter/shared";
9
9
  // src/services/kit/characters/ayatoKit.ts
10
10
  const SOUKAI_KANKA_SECONDS = 6;
@@ -79,17 +79,21 @@ const createAyatoKitBehaviour = ({ kit, readHit, readHitFields, readParameter, r
79
79
  const gardenOfPurity = castKitField(kitEffectState, combatant.characterId, position, {
80
80
  isFollowing: true,
81
81
  nextTickSeconds: bloomwaterBladeFirstTickSeconds,
82
- onTick: ({ kitEffectState: tickKitEffectState }) => castKitSummon(tickKitEffectState, {
83
- facing,
84
- height,
85
- position: gardenOfPurity.centre
86
- }, combatant, [bloomwaterBlade], { attackTag: "ElementalBurst" }),
82
+ onTick: ({ kitEffectState: tickKitEffectState }) => {
83
+ castKitSummon(tickKitEffectState, {
84
+ facing,
85
+ height,
86
+ position: gardenOfPurity.centre
87
+ }, combatant, [bloomwaterBlade], { attackTag: "ElementalBurst" });
88
+ },
87
89
  secondsRemaining: bloomwaterBladeFirstTickSeconds + gardenOfPuritySeconds,
88
90
  tickIntervalSeconds: bloomwaterBladeIntervalSeconds
89
91
  });
90
92
  };
91
93
  return {
92
- burst: { onStart: ({ activeCombatant: combatant, body, kitEffectState }) => castGardenOfPurity(kitEffectState, body, combatant) },
94
+ burst: { onStart: ({ activeCombatant: combatant, body, kitEffectState }) => {
95
+ castGardenOfPurity(kitEffectState, body, combatant);
96
+ } },
93
97
  getStrikeDamageBonus: ({ attackTag, combatant }, enemy) => combatant.constellationCount >= CONSTELLATION_1 && attackTag === "NormalAttack" && enemy.health / enemy.maxHealth <= CONSTELLATION_1_HEALTH_SHARE ? CONSTELLATION_1_DAMAGE_BONUS : 0,
94
98
  onKitEvent: (event, { kitEffectState }, combatant) => {
95
99
  if (event.kind !== "CharacterSwapped") return;
@@ -109,11 +113,13 @@ const createAyatoKitBehaviour = ({ kit, readHit, readHitFields, readParameter, r
109
113
  secondsRemaining: HELD_UNTIL_SWAP_SECONDS,
110
114
  stacks: ASCENSION_1_CAST_STACKS
111
115
  });
112
- scheduleKitTask(kitEffectState, characterId, illusionSeconds, ({ kitEffectState: effectState }) => addKitStatus(effectState, characterId, {
113
- id: NAMISEN_STATUS_ID,
114
- secondsRemaining: HELD_UNTIL_SWAP_SECONDS,
115
- stacks: getNamisenStacksMax(combatant)
116
- }));
116
+ scheduleKitTask(kitEffectState, characterId, illusionSeconds, ({ kitEffectState: effectState }) => {
117
+ addKitStatus(effectState, characterId, {
118
+ id: NAMISEN_STATUS_ID,
119
+ secondsRemaining: HELD_UNTIL_SWAP_SECONDS,
120
+ stacks: getNamisenStacksMax(combatant)
121
+ });
122
+ });
117
123
  }
118
124
  if (combatant.constellationCount >= CONSTELLATION_6) addKitStatus(kitEffectState, characterId, {
119
125
  id: CONSTELLATION_6_STATUS_ID,