koishi-plugin-ggcevo-game 1.3.36 → 1.3.37
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/index.js +316 -147
- package/package.json +1 -1
package/lib/index.js
CHANGED
|
@@ -444,13 +444,28 @@ function apply(ctx, config) {
|
|
|
444
444
|
type: "能量武器",
|
|
445
445
|
damage: 30,
|
|
446
446
|
description: "激光步枪的变种,采用折射技术升级",
|
|
447
|
-
specialeffect: "",
|
|
447
|
+
specialeffect: "攻击目标后,若有存活的其他异形,则对其造成20%的武器基础伤害",
|
|
448
448
|
price: 1450,
|
|
449
449
|
redCrystalCost: 15,
|
|
450
450
|
isantiair: true,
|
|
451
451
|
tagEffects: {
|
|
452
452
|
"灵能": 1.5
|
|
453
453
|
}
|
|
454
|
+
},
|
|
455
|
+
"粒子相位枪": {
|
|
456
|
+
id: 12,
|
|
457
|
+
type: "能量武器",
|
|
458
|
+
damage: 30,
|
|
459
|
+
description: "面对护盾目标而开发的武器",
|
|
460
|
+
specialeffect: "",
|
|
461
|
+
price: 1050,
|
|
462
|
+
redCrystalCost: 15,
|
|
463
|
+
isantiair: true,
|
|
464
|
+
tagEffects: {
|
|
465
|
+
"护盾": 2,
|
|
466
|
+
"轻甲": 0.5,
|
|
467
|
+
"重甲": 0.2
|
|
468
|
+
}
|
|
454
469
|
}
|
|
455
470
|
};
|
|
456
471
|
const SyndicatedItems = {
|
|
@@ -673,7 +688,7 @@ function apply(ctx, config) {
|
|
|
673
688
|
},
|
|
674
689
|
"电能立场": {
|
|
675
690
|
effect: 0,
|
|
676
|
-
description: "当“能量”大于
|
|
691
|
+
description: "当“能量”大于20%的时候,每次受到攻击有55%的概率免疫此次伤害(无法免疫寒冷伤害); 每拥有一层“寒冷”则降低5%的概率"
|
|
677
692
|
},
|
|
678
693
|
"电能冲击波": {
|
|
679
694
|
effect: 0,
|
|
@@ -848,21 +863,21 @@ function apply(ctx, config) {
|
|
|
848
863
|
const spaceStationCrewConfig = [
|
|
849
864
|
{
|
|
850
865
|
professionName: "深空矿工",
|
|
851
|
-
effect: "
|
|
866
|
+
effect: "每日签到获得的金币+50%",
|
|
852
867
|
requirements: "当月累计签到7天及以上",
|
|
853
868
|
Jobtransfer: true,
|
|
854
869
|
costcoins: 1500
|
|
855
870
|
},
|
|
856
871
|
{
|
|
857
872
|
professionName: "警卫员下士",
|
|
858
|
-
effect: "
|
|
873
|
+
effect: "攻击获得的金币+50%",
|
|
859
874
|
requirements: "当期伤害榜累计攻击4次及以上",
|
|
860
875
|
Jobtransfer: true,
|
|
861
876
|
costcoins: 2e3
|
|
862
877
|
},
|
|
863
878
|
{
|
|
864
879
|
professionName: "警卫长",
|
|
865
|
-
effect: "攻击伤害+5
|
|
880
|
+
effect: "攻击伤害+5%,攻击获得的金币+100%",
|
|
866
881
|
requirements: "当期伤害榜前十名",
|
|
867
882
|
Jobtransfer: true,
|
|
868
883
|
costcoins: 3e3
|
|
@@ -1113,6 +1128,45 @@ function apply(ctx, config) {
|
|
|
1113
1128
|
careerBonus: "武器中士/情报副官: 武器改装通用模块享有20%的折扣; 武器改装专属模块享有10%的折扣"
|
|
1114
1129
|
}
|
|
1115
1130
|
]
|
|
1131
|
+
},
|
|
1132
|
+
{
|
|
1133
|
+
techId: 4,
|
|
1134
|
+
techname: "安防系统",
|
|
1135
|
+
careerNames: ["警卫员下士", "警卫长", "情报副官"],
|
|
1136
|
+
// 新增职业名称字段
|
|
1137
|
+
maxLevel: 5,
|
|
1138
|
+
levels: [
|
|
1139
|
+
{
|
|
1140
|
+
level: 1,
|
|
1141
|
+
cost: 500,
|
|
1142
|
+
description: "重启安防参数代码,攻击获得的金币+5%",
|
|
1143
|
+
careerBonus: "警卫员下士/警卫长/情报副官: 攻击获得的金币+10%"
|
|
1144
|
+
},
|
|
1145
|
+
{
|
|
1146
|
+
level: 2,
|
|
1147
|
+
cost: 2050,
|
|
1148
|
+
description: "提高空间站安防系统强度,攻击获得的金币+10%",
|
|
1149
|
+
careerBonus: "警卫员下士/警卫长/情报副官: 攻击获得的金币+20%"
|
|
1150
|
+
},
|
|
1151
|
+
{
|
|
1152
|
+
level: 3,
|
|
1153
|
+
cost: 3250,
|
|
1154
|
+
description: "进一步提高空间站安防系统强度,攻击获得的金币+15%",
|
|
1155
|
+
careerBonus: "警卫员下士/警卫长/情报副官: 攻击获得的金币+30%"
|
|
1156
|
+
},
|
|
1157
|
+
{
|
|
1158
|
+
level: 4,
|
|
1159
|
+
cost: 4250,
|
|
1160
|
+
description: "大幅提高空间站安防系统强度,攻击获得的金币+20%",
|
|
1161
|
+
careerBonus: "警卫员下士/警卫长/情报副官: 攻击获得的金币+40%"
|
|
1162
|
+
},
|
|
1163
|
+
{
|
|
1164
|
+
level: 5,
|
|
1165
|
+
cost: 5350,
|
|
1166
|
+
description: "完全恢复空间站安防系统,攻击获得的金币+25%",
|
|
1167
|
+
careerBonus: "警卫员下士/警卫长/情报副官: 攻击获得的金币+50%; 打开安全军械库防爆门,随机获得一把传奇武器"
|
|
1168
|
+
}
|
|
1169
|
+
]
|
|
1116
1170
|
}
|
|
1117
1171
|
];
|
|
1118
1172
|
const Tasklist = {
|
|
@@ -1449,6 +1503,7 @@ function apply(ctx, config) {
|
|
|
1449
1503
|
tags: nextBossGroup.main.tags,
|
|
1450
1504
|
// 新增标签字段
|
|
1451
1505
|
skills: [...nextBossGroup.main.passive],
|
|
1506
|
+
energy: nextBossGroup.main.energy,
|
|
1452
1507
|
groupId: nextBossGroup.main.id,
|
|
1453
1508
|
isActive: true,
|
|
1454
1509
|
respawnTime: /* @__PURE__ */ new Date()
|
|
@@ -1461,6 +1516,7 @@ function apply(ctx, config) {
|
|
|
1461
1516
|
tags: minion.tags,
|
|
1462
1517
|
// 新增标签字段
|
|
1463
1518
|
skills: [...minion.passive],
|
|
1519
|
+
energy: minion.energy,
|
|
1464
1520
|
groupId: mainBoss.groupId,
|
|
1465
1521
|
isActive: true,
|
|
1466
1522
|
respawnTime: /* @__PURE__ */ new Date()
|
|
@@ -1968,7 +2024,7 @@ function apply(ctx, config) {
|
|
|
1968
2024
|
const currentFreezing = targetBoss.freezing || 0;
|
|
1969
2025
|
let immuneChance = 55 - currentFreezing * 5;
|
|
1970
2026
|
immuneChance = Math.max(immuneChance, 5);
|
|
1971
|
-
if (currentEnergy <
|
|
2027
|
+
if (currentEnergy < 200) {
|
|
1972
2028
|
return null;
|
|
1973
2029
|
}
|
|
1974
2030
|
const roll = Math.random() * 100;
|
|
@@ -1982,12 +2038,21 @@ function apply(ctx, config) {
|
|
|
1982
2038
|
}
|
|
1983
2039
|
return null;
|
|
1984
2040
|
}, "handleEnergyField"),
|
|
2041
|
+
// 辅助函数:从配置中获取成员配置
|
|
2042
|
+
getMemberConfig: /* @__PURE__ */ __name((name2, bossGroup) => {
|
|
2043
|
+
if (bossGroup.main.name === name2) return bossGroup.main;
|
|
2044
|
+
for (const minion of bossGroup.minions) {
|
|
2045
|
+
if (minion.name === name2) return minion;
|
|
2046
|
+
}
|
|
2047
|
+
return null;
|
|
2048
|
+
}, "getMemberConfig"),
|
|
1985
2049
|
// 处理脉冲效果(概率治疗全体异形)
|
|
1986
|
-
handlePulse: /* @__PURE__ */ __name(async function(ctx2, targetBoss, activeBosses) {
|
|
2050
|
+
handlePulse: /* @__PURE__ */ __name(async function(ctx2, targetBoss, activeBosses, bossGroup) {
|
|
1987
2051
|
if (!targetBoss.skills.includes("脉冲")) return null;
|
|
1988
2052
|
const currentEnergy = targetBoss.energy || 0;
|
|
1989
2053
|
const currentFreezing = targetBoss.freezing || 0;
|
|
1990
|
-
|
|
2054
|
+
const maxEnergy = 1e3;
|
|
2055
|
+
if (currentEnergy < maxEnergy * 0.8) {
|
|
1991
2056
|
return null;
|
|
1992
2057
|
}
|
|
1993
2058
|
let triggerChance = 60 - currentFreezing * 5;
|
|
@@ -1995,14 +2060,18 @@ function apply(ctx, config) {
|
|
|
1995
2060
|
const roll = Math.random() * 100;
|
|
1996
2061
|
if (roll <= triggerChance) {
|
|
1997
2062
|
const groupMembers = activeBosses.filter(
|
|
1998
|
-
(b) => b.groupId === targetBoss.groupId && b.HP > 0
|
|
1999
|
-
//
|
|
2063
|
+
(b) => b.groupId === targetBoss.groupId && b.HP > 0
|
|
2064
|
+
// 只包括存活的异形
|
|
2000
2065
|
);
|
|
2001
2066
|
const updates = [];
|
|
2002
2067
|
const healMessages = [];
|
|
2003
|
-
|
|
2004
|
-
const
|
|
2005
|
-
|
|
2068
|
+
for (const member of groupMembers) {
|
|
2069
|
+
const memberConfig = this.getMemberConfig(member.name, bossGroup);
|
|
2070
|
+
if (!memberConfig) continue;
|
|
2071
|
+
const maxHP = memberConfig.maxHP;
|
|
2072
|
+
const healAmount = member.type === "主宰" ? 200 : 100;
|
|
2073
|
+
const newHP = Math.min(member.HP + healAmount, maxHP);
|
|
2074
|
+
const actualHeal = newHP - member.HP;
|
|
2006
2075
|
updates.push(
|
|
2007
2076
|
ctx2.database.set(
|
|
2008
2077
|
"ggcevo_boss",
|
|
@@ -2010,13 +2079,17 @@ function apply(ctx, config) {
|
|
|
2010
2079
|
{ HP: newHP }
|
|
2011
2080
|
)
|
|
2012
2081
|
);
|
|
2013
|
-
|
|
2014
|
-
|
|
2015
|
-
|
|
2082
|
+
if (actualHeal > 0) {
|
|
2083
|
+
healMessages.push(`${member.name}+${actualHeal}HP(当前${newHP}/${maxHP})`);
|
|
2084
|
+
} else {
|
|
2085
|
+
healMessages.push(`${member.name}生命值已满`);
|
|
2086
|
+
}
|
|
2087
|
+
}
|
|
2088
|
+
if (healMessages.length > 0) {
|
|
2016
2089
|
await Promise.all(updates);
|
|
2017
2090
|
return {
|
|
2018
2091
|
messages: [
|
|
2019
|
-
`❤️
|
|
2092
|
+
`❤️ 【脉冲】生效:治疗全体异形!`,
|
|
2020
2093
|
...healMessages
|
|
2021
2094
|
]
|
|
2022
2095
|
};
|
|
@@ -2137,7 +2210,7 @@ function apply(ctx, config) {
|
|
|
2137
2210
|
messages.push(...survivalResult.messages);
|
|
2138
2211
|
skillUpdates.push(...survivalResult.skillUpdates);
|
|
2139
2212
|
}
|
|
2140
|
-
const pulseResult = await this.handlePulse(ctx2, targetBoss, activeBosses);
|
|
2213
|
+
const pulseResult = await this.handlePulse(ctx2, targetBoss, activeBosses, bossGroup);
|
|
2141
2214
|
if (pulseResult) {
|
|
2142
2215
|
messages.push(...pulseResult.messages);
|
|
2143
2216
|
}
|
|
@@ -2353,6 +2426,134 @@ function apply(ctx, config) {
|
|
|
2353
2426
|
return { rewardMessages };
|
|
2354
2427
|
}
|
|
2355
2428
|
__name(handleBossDefeatRewards, "handleBossDefeatRewards");
|
|
2429
|
+
async function handleSecondaryTargets(ctx2, session, equippedWeapon, targetBoss, weaponName, weaponData, activeBosses, bossGroup) {
|
|
2430
|
+
const scatterEffectMessages = [];
|
|
2431
|
+
const extraDamages = [];
|
|
2432
|
+
const actuallyDead = [];
|
|
2433
|
+
let scatterBroadcast = null;
|
|
2434
|
+
const secondaryTargets = activeBosses.filter(
|
|
2435
|
+
(boss) => boss.name !== targetBoss.name
|
|
2436
|
+
);
|
|
2437
|
+
if (secondaryTargets.length === 0) return {
|
|
2438
|
+
scatterEffectMessages,
|
|
2439
|
+
extraDamages,
|
|
2440
|
+
actuallyDead,
|
|
2441
|
+
scatterBroadcast
|
|
2442
|
+
};
|
|
2443
|
+
let scatterMsg = "";
|
|
2444
|
+
let scatterRatio = 0;
|
|
2445
|
+
if (weaponName === "碎骨步枪") {
|
|
2446
|
+
scatterMsg = "🔆 【光束曲射晶片】触发散射攻击!";
|
|
2447
|
+
scatterRatio = 0.5;
|
|
2448
|
+
} else if (weaponName === "中子步枪") {
|
|
2449
|
+
scatterMsg = "🔆 【中子步枪】触发散射攻击!";
|
|
2450
|
+
scatterRatio = 0.2;
|
|
2451
|
+
}
|
|
2452
|
+
scatterEffectMessages.push(scatterMsg);
|
|
2453
|
+
const baseDamage = weaponData.damage * (1 + 0.1 * equippedWeapon.level);
|
|
2454
|
+
const secondaryDamage = Math.round(baseDamage * scatterRatio);
|
|
2455
|
+
for (const secondaryTarget of secondaryTargets) {
|
|
2456
|
+
const secondaryMaxHP = getBossMaxHP(secondaryTarget.name);
|
|
2457
|
+
let currentDamage = secondaryDamage;
|
|
2458
|
+
const passiveResult = await PassiveHandler.handlePassives(
|
|
2459
|
+
ctx2,
|
|
2460
|
+
secondaryTarget,
|
|
2461
|
+
currentDamage,
|
|
2462
|
+
secondaryTarget.HP - currentDamage,
|
|
2463
|
+
secondaryMaxHP,
|
|
2464
|
+
weaponName,
|
|
2465
|
+
weaponData,
|
|
2466
|
+
secondaryTargets,
|
|
2467
|
+
// 传入所有次要目标作为上下文
|
|
2468
|
+
bossGroup
|
|
2469
|
+
);
|
|
2470
|
+
const finalDamage = passiveResult.initialDamage;
|
|
2471
|
+
const actualDamage = Math.min(finalDamage, secondaryTarget.HP);
|
|
2472
|
+
extraDamages.push({
|
|
2473
|
+
name: secondaryTarget.name,
|
|
2474
|
+
damage: actualDamage
|
|
2475
|
+
});
|
|
2476
|
+
const newHP = passiveResult.currentHP;
|
|
2477
|
+
if (passiveResult.skillUpdates.length > 0) {
|
|
2478
|
+
await PassiveHandler.applySkillUpdates(ctx2, passiveResult.skillUpdates);
|
|
2479
|
+
}
|
|
2480
|
+
const isDead = newHP <= 0;
|
|
2481
|
+
await ctx2.database.set(
|
|
2482
|
+
"ggcevo_boss",
|
|
2483
|
+
{ name: secondaryTarget.name },
|
|
2484
|
+
{
|
|
2485
|
+
HP: Math.max(newHP, 0),
|
|
2486
|
+
isActive: !isDead
|
|
2487
|
+
}
|
|
2488
|
+
);
|
|
2489
|
+
scatterEffectMessages.push(
|
|
2490
|
+
...passiveResult.messages.map((m) => ` 对 ${secondaryTarget.name} ${m}`)
|
|
2491
|
+
);
|
|
2492
|
+
if (isDead) {
|
|
2493
|
+
actuallyDead.push(secondaryTarget.name);
|
|
2494
|
+
if (secondaryTarget.type === "子代") {
|
|
2495
|
+
if (secondaryTarget.name === "机械感染虫") {
|
|
2496
|
+
const [mainBoss] = await ctx2.database.get("ggcevo_boss", {
|
|
2497
|
+
groupId: secondaryTarget.groupId,
|
|
2498
|
+
type: "主宰",
|
|
2499
|
+
isActive: true
|
|
2500
|
+
});
|
|
2501
|
+
if (mainBoss && !mainBoss.skills.includes("孤立无援")) {
|
|
2502
|
+
await ctx2.database.set("ggcevo_boss", { name: mainBoss.name }, {
|
|
2503
|
+
skills: [...mainBoss.skills, "孤立无援"]
|
|
2504
|
+
});
|
|
2505
|
+
scatterBroadcast = "💥 机械感染虫已阵亡,空间站感染虫进入【孤立无援】状态,受到的伤害+20%!";
|
|
2506
|
+
}
|
|
2507
|
+
} else {
|
|
2508
|
+
const remainingMinions = await ctx2.database.get("ggcevo_boss", {
|
|
2509
|
+
groupId: secondaryTarget.groupId,
|
|
2510
|
+
type: "子代",
|
|
2511
|
+
isActive: true
|
|
2512
|
+
});
|
|
2513
|
+
if (remainingMinions.length === 0) {
|
|
2514
|
+
const [mainBoss] = await ctx2.database.get("ggcevo_boss", {
|
|
2515
|
+
groupId: secondaryTarget.groupId,
|
|
2516
|
+
type: "主宰",
|
|
2517
|
+
isActive: true
|
|
2518
|
+
});
|
|
2519
|
+
if (mainBoss && !mainBoss.skills.includes("孤立无援")) {
|
|
2520
|
+
await ctx2.database.set("ggcevo_boss", { name: mainBoss.name }, {
|
|
2521
|
+
skills: [...mainBoss.skills, "孤立无援"]
|
|
2522
|
+
});
|
|
2523
|
+
scatterBroadcast = `💥 所有子代已阵亡,${mainBoss.name}进入【孤立无援】状态,受到的伤害+20%!`;
|
|
2524
|
+
}
|
|
2525
|
+
}
|
|
2526
|
+
}
|
|
2527
|
+
} else if (secondaryTarget.type === "主宰") {
|
|
2528
|
+
await ctx2.database.set(
|
|
2529
|
+
"ggcevo_boss",
|
|
2530
|
+
{ groupId: secondaryTarget.groupId },
|
|
2531
|
+
{ isActive: false, HP: 0 }
|
|
2532
|
+
);
|
|
2533
|
+
const respawnTime = /* @__PURE__ */ new Date();
|
|
2534
|
+
respawnTime.setSeconds(respawnTime.getSeconds() + 3600);
|
|
2535
|
+
await ctx2.database.set(
|
|
2536
|
+
"ggcevo_boss",
|
|
2537
|
+
{ name: secondaryTarget.name },
|
|
2538
|
+
{ respawnTime }
|
|
2539
|
+
);
|
|
2540
|
+
const { rewardMessages } = await handleBossDefeatRewards(ctx2, secondaryTarget);
|
|
2541
|
+
await ctx2.database.remove("ggcevo_boss_damage", {
|
|
2542
|
+
bossGroupId: secondaryTarget.groupId
|
|
2543
|
+
});
|
|
2544
|
+
scatterBroadcast = [
|
|
2545
|
+
`🎯 主宰 ${secondaryTarget.name} 已被 ${session.username} 的散射伤害击败!`,
|
|
2546
|
+
`所有子代已消失,下一个主宰将在1小时后重生`,
|
|
2547
|
+
"",
|
|
2548
|
+
"🏆 伤害排行榜奖励:",
|
|
2549
|
+
...rewardMessages
|
|
2550
|
+
];
|
|
2551
|
+
}
|
|
2552
|
+
}
|
|
2553
|
+
}
|
|
2554
|
+
return { scatterEffectMessages, extraDamages, actuallyDead, scatterBroadcast };
|
|
2555
|
+
}
|
|
2556
|
+
__name(handleSecondaryTargets, "handleSecondaryTargets");
|
|
2356
2557
|
async function checkTransferRequirements(ctx2, handle, profession) {
|
|
2357
2558
|
const [mainBoss] = await ctx2.database.get("ggcevo_boss", {
|
|
2358
2559
|
type: "主宰",
|
|
@@ -3031,7 +3232,7 @@ ${itemDetails.join("\n")}`;
|
|
|
3031
3232
|
⚡ 加成效果:
|
|
3032
3233
|
▸ ${messages.join("\n▸ ")}`;
|
|
3033
3234
|
}
|
|
3034
|
-
return "签到成功!本月累计签到" + monthlyDays + "天,获得:\n💰 金币 x " + finalPoints + (totalBonus > 0 ? " (
|
|
3235
|
+
return "签到成功!本月累计签到" + monthlyDays + "天,获得:\n💰 金币 x " + finalPoints + (totalBonus > 0 ? " (基础值:" + basePoints + "金币)" : "") + "\n🪙 咕咕币 x " + tickets + effectMessage;
|
|
3035
3236
|
} catch (error) {
|
|
3036
3237
|
console.error("签到命令时发生错误:", error);
|
|
3037
3238
|
return "服务器繁忙,请稍后尝试。";
|
|
@@ -4590,7 +4791,7 @@ ${validTypes.join("、")}`;
|
|
|
4590
4791
|
}
|
|
4591
4792
|
if (isWeapon) {
|
|
4592
4793
|
if (isAutoEquipped) {
|
|
4593
|
-
message += "\n
|
|
4794
|
+
message += "\n【系统已为您自动装备该武器】";
|
|
4594
4795
|
}
|
|
4595
4796
|
message += "\n输入「武器仓库」查看详情";
|
|
4596
4797
|
} else {
|
|
@@ -4804,6 +5005,7 @@ ${validTypes.join("、")}`;
|
|
|
4804
5005
|
ctx.command("ggcevo/攻击 <bossName>").usage("请输入要攻击的异形名称(例如:攻击 异齿猛兽 或 攻击 寒冰王蛇)").action(async (argv, bossName) => {
|
|
4805
5006
|
const session = argv.session;
|
|
4806
5007
|
let broadcastMessage = null;
|
|
5008
|
+
let scatterBroadcast = null;
|
|
4807
5009
|
const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
|
|
4808
5010
|
if (!profile) return "🔒 需要先绑定游戏句柄";
|
|
4809
5011
|
const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
|
|
@@ -4857,118 +5059,29 @@ ${validTypes.join("、")}`;
|
|
|
4857
5059
|
if (!bossGroup) return "无法获取异形组配置。";
|
|
4858
5060
|
const maxHP = targetBoss.type === "主宰" ? bossGroup.main.maxHP : bossGroup.minions.find((m) => m.name === targetBoss.name)?.maxHP || 0;
|
|
4859
5061
|
const { damage, hasCrit, effectMessage } = await calculateTotalDamage(ctx, session, equippedWeapon, targetBoss);
|
|
4860
|
-
|
|
4861
|
-
|
|
4862
|
-
let
|
|
4863
|
-
if (equippedWeapon.installedMods?.includes("光束曲射晶片") && weaponName === "碎骨步枪") {
|
|
4864
|
-
const activeBosses2 = await ctx.database.get("ggcevo_boss", {
|
|
4865
|
-
|
|
4866
|
-
name
|
|
4867
|
-
|
|
4868
|
-
|
|
4869
|
-
|
|
4870
|
-
|
|
4871
|
-
|
|
4872
|
-
|
|
4873
|
-
|
|
4874
|
-
|
|
4875
|
-
|
|
4876
|
-
|
|
4877
|
-
|
|
4878
|
-
|
|
4879
|
-
|
|
4880
|
-
|
|
4881
|
-
|
|
4882
|
-
|
|
4883
|
-
weaponData,
|
|
4884
|
-
activeBosses2,
|
|
4885
|
-
bossGroup
|
|
4886
|
-
);
|
|
4887
|
-
const finalDamage = passiveResult2.initialDamage;
|
|
4888
|
-
const actualDamage = Math.min(finalDamage, secondaryTarget.HP);
|
|
4889
|
-
extraDamages.push({
|
|
4890
|
-
name: secondaryTarget.name,
|
|
4891
|
-
damage: actualDamage
|
|
4892
|
-
});
|
|
4893
|
-
const newHP = passiveResult2.currentHP;
|
|
4894
|
-
if (passiveResult2.skillUpdates.length > 0) {
|
|
4895
|
-
await PassiveHandler.applySkillUpdates(ctx, passiveResult2.skillUpdates);
|
|
4896
|
-
}
|
|
4897
|
-
const isDead = newHP <= 0;
|
|
4898
|
-
await ctx.database.set(
|
|
4899
|
-
"ggcevo_boss",
|
|
4900
|
-
{ name: secondaryTarget.name },
|
|
4901
|
-
{
|
|
4902
|
-
HP: Math.max(newHP, 0),
|
|
4903
|
-
isActive: !isDead
|
|
4904
|
-
}
|
|
4905
|
-
);
|
|
4906
|
-
effectMessage.push(...passiveResult2.messages.map((m) => `+ 对 ${secondaryTarget.name} ${m}`));
|
|
4907
|
-
if (isDead) {
|
|
4908
|
-
actuallyDead.push(secondaryTarget.name);
|
|
4909
|
-
if (secondaryTarget.type === "子代") {
|
|
4910
|
-
if (secondaryTarget.name === "机械感染虫") {
|
|
4911
|
-
const [mainBoss] = await ctx.database.get("ggcevo_boss", {
|
|
4912
|
-
groupId: secondaryTarget.groupId,
|
|
4913
|
-
type: "主宰",
|
|
4914
|
-
isActive: true
|
|
4915
|
-
});
|
|
4916
|
-
if (mainBoss && !mainBoss.skills.includes("孤立无援")) {
|
|
4917
|
-
await ctx.database.set("ggcevo_boss", { name: mainBoss.name }, {
|
|
4918
|
-
skills: [...mainBoss.skills, "孤立无援"]
|
|
4919
|
-
});
|
|
4920
|
-
broadcastMessage = "💥 机械感染虫已阵亡,空间站感染虫进入【孤立无援】状态,受到的伤害+20%!";
|
|
4921
|
-
}
|
|
4922
|
-
} else {
|
|
4923
|
-
const remainingMinions = await ctx.database.get("ggcevo_boss", {
|
|
4924
|
-
groupId: secondaryTarget.groupId,
|
|
4925
|
-
type: "子代",
|
|
4926
|
-
isActive: true
|
|
4927
|
-
});
|
|
4928
|
-
if (remainingMinions.length === 0) {
|
|
4929
|
-
const [mainBoss] = await ctx.database.get("ggcevo_boss", {
|
|
4930
|
-
groupId: secondaryTarget.groupId,
|
|
4931
|
-
type: "主宰",
|
|
4932
|
-
isActive: true
|
|
4933
|
-
});
|
|
4934
|
-
if (mainBoss && !mainBoss.skills.includes("孤立无援")) {
|
|
4935
|
-
await ctx.database.set("ggcevo_boss", { name: mainBoss.name }, {
|
|
4936
|
-
skills: [...mainBoss.skills, "孤立无援"]
|
|
4937
|
-
});
|
|
4938
|
-
broadcastMessage = `💥 所有子代已阵亡,${mainBoss.name}进入【孤立无援】状态,受到的伤害+20%!`;
|
|
4939
|
-
}
|
|
4940
|
-
}
|
|
4941
|
-
}
|
|
4942
|
-
} else if (secondaryTarget.type === "主宰") {
|
|
4943
|
-
await ctx.database.set(
|
|
4944
|
-
"ggcevo_boss",
|
|
4945
|
-
{ groupId: secondaryTarget.groupId },
|
|
4946
|
-
{
|
|
4947
|
-
isActive: false,
|
|
4948
|
-
HP: 0
|
|
4949
|
-
}
|
|
4950
|
-
);
|
|
4951
|
-
const respawnTime = /* @__PURE__ */ new Date();
|
|
4952
|
-
respawnTime.setSeconds(respawnTime.getSeconds() + 3600);
|
|
4953
|
-
await ctx.database.set(
|
|
4954
|
-
"ggcevo_boss",
|
|
4955
|
-
{ name: secondaryTarget.name },
|
|
4956
|
-
{ respawnTime }
|
|
4957
|
-
);
|
|
4958
|
-
const { rewardMessages } = await handleBossDefeatRewards(ctx, secondaryTarget);
|
|
4959
|
-
await ctx.database.remove("ggcevo_boss_damage", {
|
|
4960
|
-
bossGroupId: secondaryTarget.groupId
|
|
4961
|
-
});
|
|
4962
|
-
scatterBroadcast = [
|
|
4963
|
-
`🎯 主宰 ${secondaryTarget.name} 已被 ${session.username} 的散射伤害击败!`,
|
|
4964
|
-
`所有子代已消失,下一个主宰将在1小时后重生`,
|
|
4965
|
-
"",
|
|
4966
|
-
"🏆 伤害排行榜奖励:",
|
|
4967
|
-
...rewardMessages
|
|
4968
|
-
].join("\n");
|
|
4969
|
-
}
|
|
4970
|
-
}
|
|
4971
|
-
}
|
|
5062
|
+
let scatterEffectMessages = [];
|
|
5063
|
+
let extraDamages = [];
|
|
5064
|
+
let actuallyDead = [];
|
|
5065
|
+
if (equippedWeapon.installedMods?.includes("光束曲射晶片") && weaponName === "碎骨步枪" || weaponName === "中子步枪") {
|
|
5066
|
+
const activeBosses2 = await ctx.database.get("ggcevo_boss", { isActive: true });
|
|
5067
|
+
const bossGroup2 = bossPool.find(
|
|
5068
|
+
(g) => g.main.name === targetBoss.name || g.minions.some((m) => m.name === targetBoss.name)
|
|
5069
|
+
);
|
|
5070
|
+
if (bossGroup2) {
|
|
5071
|
+
const scatterResult = await handleSecondaryTargets(
|
|
5072
|
+
ctx,
|
|
5073
|
+
session,
|
|
5074
|
+
equippedWeapon,
|
|
5075
|
+
targetBoss,
|
|
5076
|
+
weaponName,
|
|
5077
|
+
weaponData,
|
|
5078
|
+
activeBosses2,
|
|
5079
|
+
bossGroup2
|
|
5080
|
+
);
|
|
5081
|
+
scatterEffectMessages = scatterResult.scatterEffectMessages;
|
|
5082
|
+
extraDamages = scatterResult.extraDamages;
|
|
5083
|
+
actuallyDead = scatterResult.actuallyDead;
|
|
5084
|
+
scatterBroadcast = scatterResult.scatterBroadcast;
|
|
4972
5085
|
}
|
|
4973
5086
|
}
|
|
4974
5087
|
let initialDamage = Math.min(damage, targetBoss.HP);
|
|
@@ -5102,18 +5215,39 @@ ${validTypes.join("、")}`;
|
|
|
5102
5215
|
}
|
|
5103
5216
|
);
|
|
5104
5217
|
}
|
|
5218
|
+
const SECURITY_BONUS_MAPPING = {
|
|
5219
|
+
// 普通用户加成 [等级1-5]
|
|
5220
|
+
base: [5, 10, 15, 20, 25],
|
|
5221
|
+
// 职业用户加成 [等级1-5]
|
|
5222
|
+
career: [10, 20, 30, 40, 50]
|
|
5223
|
+
};
|
|
5105
5224
|
const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
|
|
5106
5225
|
const career = careerData?.career;
|
|
5107
|
-
|
|
5226
|
+
const [securityTech] = await ctx.database.get("ggcevo_tech", {
|
|
5227
|
+
handle,
|
|
5228
|
+
techId: 4
|
|
5229
|
+
});
|
|
5230
|
+
let techBonusPercent = 0;
|
|
5231
|
+
if (securityTech && securityTech.level >= 1) {
|
|
5232
|
+
const techLevel = securityTech.level - 1;
|
|
5233
|
+
const securityConfig = Spacestationtechnology.find((t) => t.techId === 4);
|
|
5234
|
+
const isEligibleForCareerBonus = securityConfig?.careerNames.includes(career);
|
|
5235
|
+
techBonusPercent = isEligibleForCareerBonus ? SECURITY_BONUS_MAPPING.career[techLevel] : SECURITY_BONUS_MAPPING.base[techLevel];
|
|
5236
|
+
}
|
|
5237
|
+
const techMessage = techBonusPercent ? ` + ${techBonusPercent}% (${securityTech.level}级安防系统${career ? ` + ${career}职业加成` : ""})` : "";
|
|
5238
|
+
let careerMultiplier = 0;
|
|
5108
5239
|
let careerMessage = "";
|
|
5109
5240
|
let redcrystalMessage = "";
|
|
5110
5241
|
if (career === "警卫员下士") {
|
|
5111
|
-
careerMultiplier =
|
|
5242
|
+
careerMultiplier = 50;
|
|
5112
5243
|
careerMessage = "(+50% 警卫员下士职业加成)";
|
|
5113
5244
|
} else if (career === "警卫长") {
|
|
5114
|
-
careerMultiplier =
|
|
5245
|
+
careerMultiplier = 100;
|
|
5115
5246
|
careerMessage = "(+100% 警卫长职业加成)";
|
|
5116
5247
|
}
|
|
5248
|
+
const totalBonusPercent = careerMultiplier + techBonusPercent;
|
|
5249
|
+
const totalBonusFactor = 1 + totalBonusPercent / 100;
|
|
5250
|
+
const finalReward = Math.round(totalDamage * totalBonusFactor);
|
|
5117
5251
|
if (career === "清洁工") {
|
|
5118
5252
|
await ctx.database.upsert("ggcevo_careers", [{
|
|
5119
5253
|
handle,
|
|
@@ -5121,7 +5255,6 @@ ${validTypes.join("、")}`;
|
|
|
5121
5255
|
}], ["handle"]);
|
|
5122
5256
|
redcrystalMessage = "🔴 清洁工职业加成:获得1枚红晶";
|
|
5123
5257
|
}
|
|
5124
|
-
const finalReward = Math.round(totalDamage * careerMultiplier);
|
|
5125
5258
|
const [existingSign] = await ctx.database.get("ggcevo_sign", { handle });
|
|
5126
5259
|
await ctx.database.upsert("ggcevo_sign", [{
|
|
5127
5260
|
handle,
|
|
@@ -5138,13 +5271,20 @@ ${effectMessage.map((m) => `▸ ${m}`).join("\n")}`
|
|
|
5138
5271
|
...passiveMessages.length > 0 ? [
|
|
5139
5272
|
`🛡️ 被动效果:
|
|
5140
5273
|
${passiveMessages.map((m) => `▸ ${m}`).join("\n")}`
|
|
5274
|
+
] : [],
|
|
5275
|
+
...scatterEffectMessages.length > 0 ? [
|
|
5276
|
+
`⚡ 散射效果:
|
|
5277
|
+
${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
|
|
5141
5278
|
] : [],
|
|
5142
5279
|
`造成伤害:${initialDamage}${hasCrit ? "(✨ 暴击)" : ""}`,
|
|
5143
5280
|
...extraDamages.length > 0 ? [
|
|
5144
5281
|
`散射伤害:`,
|
|
5145
5282
|
...extraDamages.map((d) => `▸ 对 ${d.name} 造成 ${d.damage} 伤害`)
|
|
5146
5283
|
] : [],
|
|
5147
|
-
`获得金币:${finalReward}
|
|
5284
|
+
`获得金币:${finalReward}`,
|
|
5285
|
+
// === 新增详细金币加成信息 ===
|
|
5286
|
+
`${careerMultiplier > 0 ? `🛡️ 警卫职业加成: 金币+${careerMultiplier}%` : ""}`,
|
|
5287
|
+
`${techBonusPercent > 0 ? `🔧 安防系统加成: 金币+${techBonusPercent}%` : ""}`,
|
|
5148
5288
|
redcrystalMessage,
|
|
5149
5289
|
`目标剩余HP:${Math.max(currentHP, 0)}/${maxHP}`,
|
|
5150
5290
|
...actuallyDead.length > 0 ? [
|
|
@@ -5250,24 +5390,51 @@ ${passiveMessages.map((m) => `▸ ${m}`).join("\n")}`
|
|
|
5250
5390
|
const mainBossHpBar = createHpBar(mainBoss.HP, bossGroup.main.maxHP);
|
|
5251
5391
|
const result = [
|
|
5252
5392
|
`🔴 主宰:${mainBoss.name}`,
|
|
5253
|
-
|
|
5254
|
-
`标签:${mainBoss.tags?.join("、") || "无"}`,
|
|
5255
|
-
"被动:",
|
|
5256
|
-
...mainBoss.skills.map((p) => `${p}:${passiveConfig[p]?.description}`) || ["无"]
|
|
5393
|
+
`❤️ ${mainBossHpBar} (${mainBoss.HP}/${bossGroup.main.maxHP})`
|
|
5257
5394
|
];
|
|
5395
|
+
if (bossGroup.main.energy > 0) {
|
|
5396
|
+
result.push(`⚡ 能量:${mainBoss.energy}`);
|
|
5397
|
+
}
|
|
5398
|
+
result.push(
|
|
5399
|
+
`🏷️ 标签:${mainBoss.tags?.join("、") || "无"}`,
|
|
5400
|
+
`✨ 被动:`
|
|
5401
|
+
);
|
|
5402
|
+
if (mainBoss.skills.length > 0) {
|
|
5403
|
+
result.push(...mainBoss.skills.map((p) => `➤ ${p}:${passiveConfig[p]?.description}`));
|
|
5404
|
+
} else {
|
|
5405
|
+
result.push("➤ 无");
|
|
5406
|
+
}
|
|
5407
|
+
const countingSkill = mainBoss.skills?.find((s) => ["冷适应", "岗哨机枪", "吸血唾液"].includes(s));
|
|
5408
|
+
if (countingSkill) {
|
|
5409
|
+
result.push(`📈 ${countingSkill}:${mainBoss.Skillcountpoints}层`);
|
|
5410
|
+
}
|
|
5258
5411
|
if (minions.length > 0) {
|
|
5259
5412
|
result.push("\n🟠 子代:");
|
|
5260
5413
|
for (let i = 0; i < minions.length; i++) {
|
|
5261
5414
|
const minion = minions[i];
|
|
5262
5415
|
const minionConfig = bossGroup.minions.find((m) => m.name === minion.name);
|
|
5263
5416
|
const minionHpBar = createHpBar(minion.HP, minionConfig?.maxHP || 1e3);
|
|
5264
|
-
|
|
5265
|
-
|
|
5266
|
-
|
|
5267
|
-
|
|
5268
|
-
|
|
5269
|
-
|
|
5417
|
+
const minionInfo = [
|
|
5418
|
+
`👤 ${minion.name}`,
|
|
5419
|
+
`❤️ ${minionHpBar} (${minion.HP}/${minionConfig?.maxHP || "未知"})`
|
|
5420
|
+
];
|
|
5421
|
+
if (minionConfig && minionConfig.energy > 0) {
|
|
5422
|
+
minionInfo.push(`⚡ 能量:${minion.energy}`);
|
|
5423
|
+
}
|
|
5424
|
+
minionInfo.push(
|
|
5425
|
+
`🏷️ 标签:${minion.tags?.join("、") || "无"}`,
|
|
5426
|
+
`✨ 被动:`
|
|
5270
5427
|
);
|
|
5428
|
+
if (minion.skills.length > 0) {
|
|
5429
|
+
minionInfo.push(...minion.skills.map((p) => `➤ ${p}:${passiveConfig[p]?.description}`));
|
|
5430
|
+
} else {
|
|
5431
|
+
minionInfo.push("➤ 无");
|
|
5432
|
+
}
|
|
5433
|
+
const minionCountingSkill = minion.skills?.find((s) => ["冷适应", "岗哨机枪", "吸血唾液"].includes(s));
|
|
5434
|
+
if (minionCountingSkill) {
|
|
5435
|
+
minionInfo.push(`📈 ${minionCountingSkill}:${minion.Skillcountpoints}层`);
|
|
5436
|
+
}
|
|
5437
|
+
result.push(...minionInfo);
|
|
5271
5438
|
if (i < minions.length - 1) result.push("");
|
|
5272
5439
|
}
|
|
5273
5440
|
}
|
|
@@ -5286,6 +5453,7 @@ ${passiveMessages.map((m) => `▸ ${m}`).join("\n")}`
|
|
|
5286
5453
|
HP: bossConfig.main.maxHP,
|
|
5287
5454
|
tags: bossConfig.main.tags,
|
|
5288
5455
|
skills: [...bossConfig.main.passive],
|
|
5456
|
+
energy: bossConfig.main.energy,
|
|
5289
5457
|
groupId: groupid,
|
|
5290
5458
|
isActive: true,
|
|
5291
5459
|
respawnTime: /* @__PURE__ */ new Date()
|
|
@@ -5297,6 +5465,7 @@ ${passiveMessages.map((m) => `▸ ${m}`).join("\n")}`
|
|
|
5297
5465
|
HP: minion.maxHP,
|
|
5298
5466
|
tags: minion.tags,
|
|
5299
5467
|
skills: [...minion.passive],
|
|
5468
|
+
energy: minion.energy,
|
|
5300
5469
|
groupId: groupid,
|
|
5301
5470
|
isActive: true,
|
|
5302
5471
|
respawnTime: /* @__PURE__ */ new Date()
|