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.
- package/package.json +8 -8
- package/dist/ReactionType-BBSdxyO3.js +0 -47
- package/dist/addKitEffect-DBqTfm_3.js +0 -17
- package/dist/ainoKit-Dy3vTp3B.js +0 -28
- package/dist/albedoKit-CU5N1Hnm.js +0 -43
- package/dist/alhaithamKit-Bhs-coX9.js +0 -212
- package/dist/aloyKit-C7x_Jf16.js +0 -32
- package/dist/amberKit-BO7ZAQgU.js +0 -38
- package/dist/arlecchinoKit-DJawwVVl.js +0 -4
- package/dist/ayakaKit-Bu_QuYsR.js +0 -26
- package/dist/ayatoKit-BXZNajk7.js +0 -108
- package/dist/baizhuKit-8_4IzZ3A.js +0 -33
- package/dist/barbaraKit-B5DpLyHJ.js +0 -58
- package/dist/beidouKit-sQUahtIk.js +0 -59
- package/dist/bennettKit-Cr-zZ_25.js +0 -66
- package/dist/candaceKit-BUs_wwFU.js +0 -84
- package/dist/characterPack-YAEqbhAX.d.ts +0 -116
- package/dist/characterPack-zycIUHje.js +0 -641
- package/dist/characterPack.d.ts +0 -2
- package/dist/characterPack.js +0 -1
- package/dist/charlotteKit-BOZiCPEb.js +0 -90
- package/dist/chascaKit-C1Csj0Yf.js +0 -4
- package/dist/chevreuseKit-DDHga8Tj.js +0 -20
- package/dist/chioriKit-CxRUSHNw.js +0 -28
- package/dist/chongyunKit-jrWQKRkG.js +0 -104
- package/dist/citlaliKit-sv7XrzVx.js +0 -4
- package/dist/clorindeKit-DxtRn_To.js +0 -4
- package/dist/colleiKit-CO_n9qra.js +0 -28
- package/dist/columbinaKit-DrW0EvqN.js +0 -31
- package/dist/constants--ARZpp1u.js +0 -49
- package/dist/constants-BqrUOf2M.js +0 -48
- package/dist/constants-CSFiwyHy.js +0 -46
- package/dist/createWindriseGroundPaint-BmZkGq-r.js +0 -295
- package/dist/cynoKit-DpfT5dmS.js +0 -179
- package/dist/dahliaKit-B8fOPvvi.js +0 -16
- package/dist/dehyaKit-42tyEI0Z.js +0 -4
- package/dist/dilucKit-EwLUSPgs.js +0 -63
- package/dist/dionaKit-89B1hwYL.js +0 -48
- package/dist/doriKit-G9XTwwCP.js +0 -24
- package/dist/durinKit-BIYdUkbh.js +0 -49
- package/dist/emilieKit-0b2vhNtl.js +0 -21
- package/dist/escoffierKit-Da5UAvAF.js +0 -48
- package/dist/eulaKit-DAENHIEx.js +0 -129
- package/dist/faruzanKit-BcW6D-N3.js +0 -71
- package/dist/fischlKit-Bm8vNmuV.js +0 -98
- package/dist/flinsKit-GUnFJdUg.js +0 -9
- package/dist/freminetKit-CpwsVmTT.js +0 -4
- package/dist/furinaKit-BREisAdJ.js +0 -279
- package/dist/gamingKit-D9ekWGMJ.js +0 -4
- package/dist/ganyuKit-DLJa1t-Z.js +0 -74
- package/dist/gorouKit-DkpaGNA8.js +0 -94
- package/dist/heizouKit-B6kRXVCP.js +0 -35
- package/dist/huTaoKit-drjrzLjf.js +0 -58
- package/dist/iansanKit-RNjD9nSq.js +0 -4
- package/dist/ifaKit-CXWxCOPI.js +0 -4
- package/dist/illugaKit-BFtXIf3P.js +0 -4
- package/dist/index-DQB91Tfq.d.ts +0 -19820
- package/dist/index.d.ts +0 -4
- package/dist/index.js +0 -29218
- package/dist/ineffaKit-3J0FJo2E.js +0 -51
- package/dist/ittoKit-CfwXkR0g.js +0 -112
- package/dist/jahodaKit-C1sdSDfr.js +0 -97
- package/dist/jeanKit-Do8vx5Kp.js +0 -56
- package/dist/kachinaKit-DWLNDpgO.js +0 -4
- package/dist/kaeyaKit-DU8Df4RE.js +0 -14
- package/dist/kavehKit-BWoAaKs4.js +0 -9
- package/dist/kazuhaKit-C5gn8iGg.js +0 -55
- package/dist/keqingKit-uGsb_p7t.js +0 -12
- package/dist/kinichKit-Dp3lNUJt.js +0 -22
- package/dist/kiraraKit-CCAGXouk.js +0 -43
- package/dist/kleeKit-BzcJLC2i.js +0 -48
- package/dist/kokomiKit-DBdTlTDr.js +0 -42
- package/dist/kujouSaraKit-DDE-24jd.js +0 -56
- package/dist/kukiKit-DcARldP9.js +0 -59
- package/dist/lanYanKit-B3lwZ7OW.js +0 -18
- package/dist/laumaKit-DkG-i0rL.js +0 -59
- package/dist/laylaKit-DYtz0tSZ.js +0 -41
- package/dist/linneaKit-DlVhnbGM.js +0 -4
- package/dist/lisaKit-CWUiiam1.js +0 -22
- package/dist/lohenKit-D-uagI_g.js +0 -4
- package/dist/lynetteKit-BnNW81Pm.js +0 -20
- package/dist/lyneyKit-D6yTnfFv.js +0 -19
- package/dist/mavuikaKit-CUC1kHRJ.js +0 -4
- package/dist/mikaKit-C9xDhjJg.js +0 -17
- package/dist/mizukiKit-DY-gHM8N.js +0 -4
- package/dist/monaKit-B748iTEy.js +0 -26
- package/dist/mualaniKit-B-Km_dcQ.js +0 -4
- package/dist/nahidaKit-BGRc-swN.js +0 -4
- package/dist/naviaKit-CHh2VdX3.js +0 -64
- package/dist/neferKit-BTALTTiV.js +0 -4
- package/dist/neuvilletteKit-DAfX_2tC.js +0 -4
- package/dist/nicoleKit-BVjL7LI0.js +0 -4
- package/dist/nilouKit-BgM4u-hg.js +0 -52
- package/dist/ningguangKit-N88BhNb_.js +0 -105
- package/dist/noelleKit-DDewnuJ9.js +0 -48
- package/dist/ororonKit-DiAd2dlh.js +0 -86
- package/dist/pruneKit-CHkC_OSB.js +0 -4
- package/dist/qiqiKit-DCtsriE7.js +0 -88
- package/dist/raidenKit-BBWMmPFn.js +0 -144
- package/dist/razorKit-CBgdHYic.js +0 -90
- package/dist/readCharacterAvatar-C7FufK7J.js +0 -292
- package/dist/rosariaKit-D_RDXpLp.js +0 -29
- package/dist/save-CEbj1mOx.js +0 -854
- package/dist/save.d.ts +0 -2
- package/dist/save.js +0 -1
- package/dist/sayuKit-Hnv4iA3_.js +0 -35
- package/dist/sceneExport-BZaF05K-.d.ts +0 -70
- package/dist/sceneExport-DiiIi0PM.js +0 -27
- package/dist/sceneExport.d.ts +0 -2
- package/dist/sceneExport.js +0 -1
- package/dist/sethosKit-8EK04AA4.js +0 -4
- package/dist/shenheKit-DqrG2I4S.js +0 -50
- package/dist/sigewinneKit-CYJyadTr.js +0 -10
- package/dist/skirkKit-BDjoFGAq.js +0 -10
- package/dist/style.css +0 -3612
- package/dist/sucroseKit-DF0jcI2y.js +0 -101
- package/dist/tartagliaKit-Bbtww18S.js +0 -136
- package/dist/terrainTileWorker.d.ts +0 -1
- package/dist/terrainTileWorker.js +0 -81
- package/dist/thomaKit-Zm5AJ9Fm.js +0 -64
- package/dist/tighnariKit-CSa_Yqpp.js +0 -4
- package/dist/varesaKit-CMXLbBv9.js +0 -4
- package/dist/varkaKit-C8_HlTVH.js +0 -4
- package/dist/ventiKit-BcQkbI-z.js +0 -52
- package/dist/wandererKit-CQM691sn.js +0 -9
- package/dist/wriothesleyKit-CBTnYlOy.js +0 -4
- package/dist/xianglingKit-BPQN7cxU.js +0 -108
- package/dist/xianyunKit-CVhuYBde.js +0 -4
- package/dist/xiaoKit-BDI_SODG.js +0 -90
- package/dist/xilonenKit-YAVOPRwm.js +0 -4
- package/dist/xingqiuKit-Cv8JYeYO.js +0 -106
- package/dist/xinyanKit-CffF-Er0.js +0 -120
- package/dist/yaeMikoKit-xAKYm2K6.js +0 -44
- package/dist/yanfeiKit-C6elnkmn.js +0 -86
- package/dist/yaoyaoKit-CaPIIp-i.js +0 -4
- package/dist/yelanKit-Da0oQ6yu.js +0 -33
- package/dist/yoimiyaKit-DTENWB4y.js +0 -49
- package/dist/yunjinKit-PP4yeyn1.js +0 -22
- package/dist/zhongliKit-uMdKUTP-.js +0 -100
- 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,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 };
|
package/dist/ifaKit-CXWxCOPI.js
DELETED