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.
Files changed (2) hide show
  1. package/lib/index.js +316 -147
  2. 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: "当“能量”大于10%的时候,每次受到攻击有55%的概率消耗10%的“能量”免疫此次伤害(无法免疫寒冷伤害); 每拥有一层“寒冷”则降低5%的概率"
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: "每日签到获得的金币增加50%",
866
+ effect: "每日签到获得的金币+50%",
852
867
  requirements: "当月累计签到7天及以上",
853
868
  Jobtransfer: true,
854
869
  costcoins: 1500
855
870
  },
856
871
  {
857
872
  professionName: "警卫员下士",
858
- effect: "攻击获得的金币增加50%",
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%,攻击获得的金币增加100%",
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 < 100) {
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
- if (currentEnergy < 80) {
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 && b.name !== targetBoss.name
1999
- // 不包括自己
2063
+ (b) => b.groupId === targetBoss.groupId && b.HP > 0
2064
+ // 只包括存活的异形
2000
2065
  );
2001
2066
  const updates = [];
2002
2067
  const healMessages = [];
2003
- groupMembers.forEach((member) => {
2004
- const healAmount = member.type === "主宰" ? 100 : 100;
2005
- const newHP = Math.min(member.HP + healAmount, member.maxHP);
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
- healMessages.push(`${member.name}+${healAmount}HP`);
2014
- });
2015
- if (groupMembers.length > 0) {
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
- `❤️ 【脉冲】生效:治疗全体异形!(概率:${triggerChance.toFixed(1)}%)`,
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 ? " (基础值 " + basePoints + ")" : "") + "\n🪙 咕咕币 x " + tickets + effectMessage;
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
- const extraDamages = [];
4861
- const actuallyDead = [];
4862
- let scatterBroadcast = null;
4863
- if (equippedWeapon.installedMods?.includes("光束曲射晶片") && weaponName === "碎骨步枪") {
4864
- const activeBosses2 = await ctx.database.get("ggcevo_boss", {
4865
- isActive: true,
4866
- name: { $ne: targetBoss.name }
4867
- // 排除当前目标
4868
- });
4869
- if (activeBosses2.length > 0) {
4870
- effectMessage.push("🔆 【光束曲射晶片】触发!");
4871
- const baseDamage = weaponData.damage * (1 + 0.1 * equippedWeapon.level);
4872
- const secondaryDamage = Math.round(baseDamage * 0.5);
4873
- for (const secondaryTarget of activeBosses2) {
4874
- const secondaryMaxHP = getBossMaxHP(secondaryTarget.name);
4875
- let currentDamage = secondaryDamage;
4876
- const passiveResult2 = await PassiveHandler.handlePassives(
4877
- ctx,
4878
- secondaryTarget,
4879
- currentDamage,
4880
- secondaryTarget.HP - currentDamage,
4881
- secondaryMaxHP,
4882
- weaponName,
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
- let careerMultiplier = 1;
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 = 1.5;
5242
+ careerMultiplier = 50;
5112
5243
  careerMessage = "(+50% 警卫员下士职业加成)";
5113
5244
  } else if (career === "警卫长") {
5114
- careerMultiplier = 2;
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}${careerMessage}`,
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
- `${mainBossHpBar} (${mainBoss.HP}/${bossGroup.main.maxHP})`,
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
- result.push(
5265
- `${minion.name}`,
5266
- `${minionHpBar} (${minion.HP}/${minionConfig?.maxHP || "未知"})`,
5267
- `标签:${minion.tags?.join("、") || "无"}`,
5268
- "被动:",
5269
- ...minion.skills.map((p) => `${p}:${passiveConfig[p]?.description}`) || ["无"]
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()
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "koishi-plugin-ggcevo-game",
3
3
  "description": "《星际争霸2》咕咕虫-evolved地图的专属游戏助手插件,集成天梯排行、抽奖系统、签到福利、兑换商城等丰富功能。",
4
- "version": "1.3.36",
4
+ "version": "1.3.37",
5
5
  "main": "lib/index.js",
6
6
  "typings": "lib/index.d.ts",
7
7
  "files": [