koishi-plugin-ggcevo-game 1.4.41 → 1.4.42
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/lib/boss/BattleEffectProcessor.d.ts +1 -1
- package/lib/index.js +80 -28
- package/package.json +1 -1
|
@@ -317,7 +317,7 @@ export declare const BattleEffectProcessor: {
|
|
|
317
317
|
} | null;
|
|
318
318
|
} | null;
|
|
319
319
|
/** 远古预兆处理(概率免疫能量伤害)- 增加boost参数 */
|
|
320
|
-
handleAncientOmen: (targetBoss: any, weaponData: any, boost
|
|
320
|
+
handleAncientOmen: (targetBoss: any, weaponData: any, boost?: number) => {
|
|
321
321
|
isImmune: boolean;
|
|
322
322
|
messages: string[];
|
|
323
323
|
targetUpdates: {
|
package/lib/index.js
CHANGED
|
@@ -1542,15 +1542,18 @@ async function calculateTotalDamage(ctx, session, config, equippedWeapon, target
|
|
|
1542
1542
|
const weaponConfigEntry = Object.entries(weaponConfig).find(([_, c]) => c.id === equippedWeapon.weaponId);
|
|
1543
1543
|
const [weaponName, weaponData] = weaponConfigEntry;
|
|
1544
1544
|
const baseDamage = weaponData.damage * (1 + 0.1 * equippedWeapon.level);
|
|
1545
|
+
const levelBonusPercent = (0.1 * equippedWeapon.level * 100).toFixed(0);
|
|
1546
|
+
effectMessage.push(`🔫 ${weaponName}Lv.${equippedWeapon.level}:基础伤害+${levelBonusPercent}%`);
|
|
1545
1547
|
let totalAdditive = 0;
|
|
1546
1548
|
const tagAdditive = await calculateTagMultiplier(weaponData, finalTags, equippedWeapon);
|
|
1547
1549
|
totalAdditive += tagAdditive;
|
|
1548
|
-
const { totalModAdd, hasCrit } = calculateModifiers(
|
|
1550
|
+
const { totalModAdd, hasCrit, modMessages } = calculateModifiers(
|
|
1549
1551
|
equippedWeapon,
|
|
1550
1552
|
weaponName,
|
|
1551
1553
|
await checkCritRhythm(ctx, handle)
|
|
1552
1554
|
);
|
|
1553
1555
|
totalAdditive += totalModAdd;
|
|
1556
|
+
effectMessage.push(...modMessages);
|
|
1554
1557
|
const careerBonus = await calculateCareerAdditive(ctx, handle, weaponData.type, weaponData.id);
|
|
1555
1558
|
totalAdditive += careerBonus.value;
|
|
1556
1559
|
if (careerBonus.message) effectMessage.push(careerBonus.message);
|
|
@@ -1566,7 +1569,6 @@ async function calculateTotalDamage(ctx, session, config, equippedWeapon, target
|
|
|
1566
1569
|
let finalDamage = baseDamage * (1 + totalAdditive);
|
|
1567
1570
|
if (finalDamage < 1) {
|
|
1568
1571
|
finalDamage = 1;
|
|
1569
|
-
effectMessage.push("⚠️ 触发伤害保底机制:强制造成1点伤害");
|
|
1570
1572
|
}
|
|
1571
1573
|
return {
|
|
1572
1574
|
damage: Math.round(finalDamage),
|
|
@@ -1607,33 +1609,45 @@ __name(calculateTagMultiplier, "calculateTagMultiplier");
|
|
|
1607
1609
|
function calculateModifiers(equippedWeapon, weaponName, hasCritRhythm) {
|
|
1608
1610
|
let totalModAdd = 0;
|
|
1609
1611
|
let hasCrit = false;
|
|
1612
|
+
const modMessages = [];
|
|
1610
1613
|
let crystalCrit = 0;
|
|
1611
1614
|
let overloadCrit = 0;
|
|
1612
1615
|
let rhythmCrit = 0;
|
|
1613
1616
|
let weaponCrit = 0;
|
|
1614
1617
|
if (weaponName === "MK-4激光步枪") {
|
|
1615
1618
|
weaponCrit = 80;
|
|
1619
|
+
modMessages.push(`🔫 【MK-4激光步枪】武器效果:暴击率+${weaponCrit}%`);
|
|
1616
1620
|
}
|
|
1617
1621
|
equippedWeapon.installedMods.forEach((mod) => {
|
|
1618
1622
|
if (mod === "动能增幅") {
|
|
1619
1623
|
totalModAdd += 0.2;
|
|
1624
|
+
modMessages.push(`🛠️ 【动能增幅】生效:攻击伤害+20%`);
|
|
1620
1625
|
}
|
|
1621
1626
|
if (mod === "裂甲核心" && weaponName === modConfig[mod].exclusiveTo) {
|
|
1622
1627
|
totalModAdd += 0.4;
|
|
1628
|
+
modMessages.push(`🛠️ 【裂甲核心】生效:攻击伤害+40%`);
|
|
1623
1629
|
}
|
|
1624
1630
|
if (mod === "棱镜水晶") {
|
|
1625
1631
|
crystalCrit = 20;
|
|
1632
|
+
modMessages.push(`🛠️ 【棱镜水晶】生效:暴击率+20%`);
|
|
1626
1633
|
}
|
|
1627
1634
|
if (mod === "棱镜超载核心" && weaponName === modConfig[mod].exclusiveTo) {
|
|
1628
1635
|
overloadCrit = 80;
|
|
1636
|
+
modMessages.push(`🛠️ 【棱镜超载核心】生效:暴击率+80%`);
|
|
1629
1637
|
}
|
|
1630
1638
|
});
|
|
1631
1639
|
rhythmCrit = hasCritRhythm ? 20 : 0;
|
|
1640
|
+
if (hasCritRhythm) {
|
|
1641
|
+
modMessages.push(`🎵 暴击韵律祈愿:暴击率+20%`);
|
|
1642
|
+
}
|
|
1632
1643
|
const totalCritRate = Math.min(
|
|
1633
1644
|
crystalCrit + overloadCrit + rhythmCrit + weaponCrit,
|
|
1634
1645
|
// 包含武器专属暴击
|
|
1635
1646
|
100
|
|
1636
1647
|
);
|
|
1648
|
+
if (totalCritRate > 0) {
|
|
1649
|
+
modMessages.push(`🎯 总暴击率:${totalCritRate}%`);
|
|
1650
|
+
}
|
|
1637
1651
|
if (totalCritRate > 0) {
|
|
1638
1652
|
const roll = Math.random() * 100;
|
|
1639
1653
|
if (roll <= totalCritRate) {
|
|
@@ -1641,7 +1655,12 @@ function calculateModifiers(equippedWeapon, weaponName, hasCritRhythm) {
|
|
|
1641
1655
|
totalModAdd += 1;
|
|
1642
1656
|
}
|
|
1643
1657
|
}
|
|
1644
|
-
return {
|
|
1658
|
+
return {
|
|
1659
|
+
totalModAdd,
|
|
1660
|
+
hasCrit,
|
|
1661
|
+
modMessages
|
|
1662
|
+
// 返回模块消息数组
|
|
1663
|
+
};
|
|
1645
1664
|
}
|
|
1646
1665
|
__name(calculateModifiers, "calculateModifiers");
|
|
1647
1666
|
async function calculateCareerAdditive(ctx, handle, weaponType, weaponId) {
|
|
@@ -3510,6 +3529,7 @@ var BattleEffectProcessor = {
|
|
|
3510
3529
|
}
|
|
3511
3530
|
return { nerfMultiplier, doubleAstralWind, messages };
|
|
3512
3531
|
}, "handleMindFrenzy"),
|
|
3532
|
+
//宇宙能量
|
|
3513
3533
|
handleCosmicEnergy: /* @__PURE__ */ __name(function(targetBoss, damage) {
|
|
3514
3534
|
if (!targetBoss.skills.includes("宇宙能量")) {
|
|
3515
3535
|
return null;
|
|
@@ -3613,7 +3633,7 @@ var BattleEffectProcessor = {
|
|
|
3613
3633
|
};
|
|
3614
3634
|
}, "handleBladeOfLight"),
|
|
3615
3635
|
/** 远古预兆处理(概率免疫能量伤害)- 增加boost参数 */
|
|
3616
|
-
handleAncientOmen: /* @__PURE__ */ __name(function(targetBoss, weaponData, boost) {
|
|
3636
|
+
handleAncientOmen: /* @__PURE__ */ __name(function(targetBoss, weaponData, boost = 0) {
|
|
3617
3637
|
const messages = [];
|
|
3618
3638
|
let isImmune = false;
|
|
3619
3639
|
let targetUpdates = null;
|
|
@@ -3981,21 +4001,12 @@ function applyPassiveEffects(targetBoss, activeBosses, weaponName, damage, ignor
|
|
|
3981
4001
|
messages.push(...lightningResult.messages);
|
|
3982
4002
|
}
|
|
3983
4003
|
const coldImmuneEffects = [
|
|
3984
|
-
{
|
|
3985
|
-
effect: BattleEffectProcessor.handleFrostEvolution,
|
|
3986
|
-
args: [targetBoss, weaponName, damage]
|
|
3987
|
-
},
|
|
3988
4004
|
{
|
|
3989
4005
|
effect: BattleEffectProcessor.handleColdAdaptation,
|
|
3990
4006
|
args: [targetBoss, weaponName]
|
|
3991
4007
|
}
|
|
3992
4008
|
];
|
|
3993
|
-
const fireImmuneEffects = [
|
|
3994
|
-
{
|
|
3995
|
-
effect: BattleEffectProcessor.handleFlameAlien,
|
|
3996
|
-
args: [targetBoss, weaponName, damage]
|
|
3997
|
-
}
|
|
3998
|
-
];
|
|
4009
|
+
const fireImmuneEffects = [];
|
|
3999
4010
|
const chanceImmuneEffects = [
|
|
4000
4011
|
{
|
|
4001
4012
|
effect: BattleEffectProcessor.handleDeadlyHit,
|
|
@@ -4024,7 +4035,7 @@ function applyPassiveEffects(targetBoss, activeBosses, weaponName, damage, ignor
|
|
|
4024
4035
|
updateStatsByName(solarFlareResult.targetUpdates.name, solarFlareResult.targetUpdates.updates);
|
|
4025
4036
|
}
|
|
4026
4037
|
}
|
|
4027
|
-
const carpetBombResult =
|
|
4038
|
+
const carpetBombResult = BattleEffectProcessor.handleCarpetBombing(targetBoss);
|
|
4028
4039
|
if (carpetBombResult) {
|
|
4029
4040
|
isolatedImmunityMark = carpetBombResult.tempMark || false;
|
|
4030
4041
|
if (carpetBombResult.nerfMultiplier) {
|
|
@@ -4043,6 +4054,8 @@ function applyPassiveEffects(targetBoss, activeBosses, weaponName, damage, ignor
|
|
|
4043
4054
|
{ effect: BattleEffectProcessor.handleEnergyBlackhole, args: [targetBoss] },
|
|
4044
4055
|
{ effect: BattleEffectProcessor.handleColossalRampage, args: [targetBoss] },
|
|
4045
4056
|
{ effect: BattleEffectProcessor.handleVomit, args: [targetBoss] },
|
|
4057
|
+
{ effect: BattleEffectProcessor.handleRampage, args: [targetBoss] },
|
|
4058
|
+
{ effect: BattleEffectProcessor.handleHyperRangeShift, args: [targetBoss] },
|
|
4046
4059
|
// 双参数效果
|
|
4047
4060
|
{ effect: BattleEffectProcessor.handleStructuralArmor, args: [targetBoss, weaponData] },
|
|
4048
4061
|
{ effect: BattleEffectProcessor.handleDisguise, args: [targetBoss, weaponName] },
|
|
@@ -4050,9 +4063,7 @@ function applyPassiveEffects(targetBoss, activeBosses, weaponName, damage, ignor
|
|
|
4050
4063
|
{ effect: BattleEffectProcessor.handleIsolated, args: [targetBoss, activeBosses, isolatedImmunityMark] },
|
|
4051
4064
|
{ effect: BattleEffectProcessor.handleInfectedSpaceStation, args: [targetBoss, activeBosses] },
|
|
4052
4065
|
{ effect: BattleEffectProcessor.handleInfernalBomb, args: [targetBoss, activeBosses] },
|
|
4053
|
-
{ effect: BattleEffectProcessor.handleHunterAlien, args: [targetBoss, activeBosses, weaponName] }
|
|
4054
|
-
{ effect: BattleEffectProcessor.handleRampage, args: [targetBoss, activeBosses] },
|
|
4055
|
-
{ effect: BattleEffectProcessor.handleHyperRangeShift, args: [targetBoss] }
|
|
4066
|
+
{ effect: BattleEffectProcessor.handleHunterAlien, args: [targetBoss, activeBosses, weaponName] }
|
|
4056
4067
|
];
|
|
4057
4068
|
for (const effectItem of damageAdjustEffects) {
|
|
4058
4069
|
const result = processEffect(effectItem.effect, ...effectItem.args);
|
|
@@ -4098,7 +4109,6 @@ function applyPassiveEffects(targetBoss, activeBosses, weaponName, damage, ignor
|
|
|
4098
4109
|
{ effect: BattleEffectProcessor.handlePulse, args: [targetBoss, activeBosses] },
|
|
4099
4110
|
{ effect: BattleEffectProcessor.handleFeeding, args: [targetBoss] },
|
|
4100
4111
|
{ effect: BattleEffectProcessor.handleBurningBurrow, args: [targetBoss] },
|
|
4101
|
-
{ effect: BattleEffectProcessor.handleCosmicEnergy, args: [targetBoss, damage] },
|
|
4102
4112
|
{ effect: BattleEffectProcessor.handleBombardmentGuide, args: [targetBoss] },
|
|
4103
4113
|
{ effect: BattleEffectProcessor.handleOverdriveShield, args: [targetBoss, activeBosses] }
|
|
4104
4114
|
];
|
|
@@ -4182,14 +4192,56 @@ function applyPassiveEffects(targetBoss, activeBosses, weaponName, damage, ignor
|
|
|
4182
4192
|
layerReduced = layerReduceResult.reductionSuccess || false;
|
|
4183
4193
|
}
|
|
4184
4194
|
let finalDamage = damage;
|
|
4185
|
-
|
|
4186
|
-
|
|
4187
|
-
|
|
4188
|
-
|
|
4189
|
-
|
|
4190
|
-
|
|
4195
|
+
let adjustedNerfMultiplier = totalNerfMultiplier * (1 - ignoreRate);
|
|
4196
|
+
const damageMultiplier = 1 + totalBuffMultiplier - adjustedNerfMultiplier;
|
|
4197
|
+
finalDamage = Math.max(1, Math.round(damage * damageMultiplier));
|
|
4198
|
+
const frostEvolutionResult = BattleEffectProcessor.handleFrostEvolution(
|
|
4199
|
+
targetBoss,
|
|
4200
|
+
weaponName,
|
|
4201
|
+
finalDamage
|
|
4202
|
+
// 使用最新计算的finalDamage
|
|
4203
|
+
);
|
|
4204
|
+
if (frostEvolutionResult) {
|
|
4205
|
+
messages.push(...frostEvolutionResult.messages);
|
|
4206
|
+
if (frostEvolutionResult.targetUpdates) {
|
|
4207
|
+
updateStatsByName(frostEvolutionResult.targetUpdates.name, frostEvolutionResult.targetUpdates.updates);
|
|
4208
|
+
}
|
|
4209
|
+
if (frostEvolutionResult.isImmune) {
|
|
4210
|
+
immune = true;
|
|
4211
|
+
finalDamage = 0;
|
|
4212
|
+
}
|
|
4213
|
+
}
|
|
4214
|
+
const flameAlienResult = BattleEffectProcessor.handleFlameAlien(
|
|
4215
|
+
targetBoss,
|
|
4216
|
+
weaponName,
|
|
4217
|
+
finalDamage
|
|
4218
|
+
// 使用最新计算的finalDamage
|
|
4219
|
+
);
|
|
4220
|
+
if (flameAlienResult) {
|
|
4221
|
+
messages.push(...flameAlienResult.messages);
|
|
4222
|
+
if (flameAlienResult.targetUpdates) {
|
|
4223
|
+
updateStatsByName(flameAlienResult.targetUpdates.name, flameAlienResult.targetUpdates.updates);
|
|
4224
|
+
}
|
|
4225
|
+
if (flameAlienResult.isImmune) {
|
|
4226
|
+
immune = true;
|
|
4227
|
+
finalDamage = 0;
|
|
4228
|
+
}
|
|
4229
|
+
}
|
|
4230
|
+
const cosmicEnergyResult = BattleEffectProcessor.handleCosmicEnergy(
|
|
4231
|
+
targetBoss,
|
|
4232
|
+
finalDamage
|
|
4233
|
+
// 使用最新计算的finalDamage
|
|
4234
|
+
);
|
|
4235
|
+
if (cosmicEnergyResult) {
|
|
4236
|
+
messages.push(...cosmicEnergyResult.messages);
|
|
4237
|
+
if (cosmicEnergyResult.targetUpdates) {
|
|
4238
|
+
updateStatsByName(cosmicEnergyResult.targetUpdates.name, cosmicEnergyResult.targetUpdates.updates);
|
|
4239
|
+
}
|
|
4240
|
+
}
|
|
4241
|
+
if (immune) {
|
|
4191
4242
|
finalDamage = 0;
|
|
4192
4243
|
}
|
|
4244
|
+
const isLethal = finalDamage >= targetBoss.HP && finalDamage > 0;
|
|
4193
4245
|
const survivalSkills = [
|
|
4194
4246
|
{ func: BattleEffectProcessor.handleSurvivalInstinctI, name: "求生本能I" },
|
|
4195
4247
|
{ func: BattleEffectProcessor.handleSurvivalInstinctII, name: "求生本能II" },
|
|
@@ -4748,7 +4800,7 @@ async function handleIgnoreReductionEffects(ctx, handle, weaponName, targetBoss)
|
|
|
4748
4800
|
}
|
|
4749
4801
|
if (careerData.career === "猩红杀手" && weaponName === "侦察步枪") {
|
|
4750
4802
|
ignoreEffects.push(0.2);
|
|
4751
|
-
messages.push(`🎯
|
|
4803
|
+
messages.push(`🎯 猩红杀手职业:无视20%减伤效果`);
|
|
4752
4804
|
}
|
|
4753
4805
|
}, "handleCareerEffects");
|
|
4754
4806
|
await handleCareerEffects();
|
|
@@ -6991,12 +7043,12 @@ ${validTypes.join("、")}`;
|
|
|
6991
7043
|
return [
|
|
6992
7044
|
`${statusIcon} ${weaponName} ${statusText}`,
|
|
6993
7045
|
`等级:Lv.${w.level} | 改装槽:${w.modificationSlots}`,
|
|
6994
|
-
|
|
7046
|
+
`基础伤害:${currentDamage.toFixed(1)}`,
|
|
6995
7047
|
`改装:${mods}`
|
|
6996
7048
|
].join("\n");
|
|
6997
7049
|
}));
|
|
6998
7050
|
return [
|
|
6999
|
-
`🛡️ ${session.username}
|
|
7051
|
+
`🛡️ ${session.username}的武器仓库`,
|
|
7000
7052
|
'使用"装备 武器名称"来装备武器',
|
|
7001
7053
|
"⚡表示当前装备武器",
|
|
7002
7054
|
"──────────────",
|