koishi-plugin-ggcevo-game 1.3.62 → 1.3.64

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 +746 -346
  2. package/package.json +1 -1
package/lib/index.js CHANGED
@@ -403,7 +403,7 @@ function apply(ctx, config) {
403
403
  type: "热能武器",
404
404
  damage: 25,
405
405
  description: "喷射稳定的液氮恒流,对长时间接触者造成致命的损伤",
406
- specialeffect: "",
406
+ specialeffect: "攻击使目标叠加“寒冷”层数,每层使其受到的伤害+5%",
407
407
  price: 775,
408
408
  redCrystalCost: 10,
409
409
  isantiair: false,
@@ -491,7 +491,7 @@ function apply(ctx, config) {
491
491
  description: "一个小型辛迪加机器人,可以破坏电子银行账户",
492
492
  price: 0,
493
493
  redCrystalCost: 60,
494
- effects: "此物品存放于仓库自动生效(阵营必须为辛迪加海盗)。每日签到金币奖励+50%,每拥有100金币,增加1%(至多增加100%)"
494
+ effects: "此物品存放于仓库自动生效(阵营必须为辛迪加海盗)。每日签到金币奖励+50%,每有一名人类联盟玩家额外增加1%(至多额外增加50%)"
495
495
  },
496
496
  "脉冲手雷": {
497
497
  id: 4,
@@ -526,7 +526,7 @@ function apply(ctx, config) {
526
526
  // 新增专属模块
527
527
  "裂甲核心": {
528
528
  cost: 750,
529
- effect: "伤害+40%,对重甲目标改为造成120%伤害",
529
+ effect: "伤害+40%,对重甲目标改为造成150%伤害",
530
530
  exclusiveTo: "高斯步枪",
531
531
  // 指定专属武器
532
532
  isExclusive: true
@@ -680,7 +680,7 @@ function apply(ctx, config) {
680
680
  },
681
681
  "嗜血狂暴": {
682
682
  effect: 0,
683
- description: "血量低于50%时,每次受到攻击将会额外获得一层“吸血”,并且受到的伤害-20%"
683
+ description: "血量低于50%时,进入狂暴状态,每次受到攻击将会额外获得一层“吸血”,并且受到的伤害-20%"
684
684
  },
685
685
  "吐血": {
686
686
  effect: 0,
@@ -688,15 +688,19 @@ function apply(ctx, config) {
688
688
  },
689
689
  "辐射": {
690
690
  effect: 0,
691
- description: "受到伽马枪攻击时会积累辐射层数,每层使受到的伤害增加1%(至多增加100%)"
691
+ description: "受到武器伽马枪攻击时会积累辐射层数,每层使受到的伤害增加1%(至多增加100%)"
692
+ },
693
+ "寒冷": {
694
+ effect: 0,
695
+ description: "受到武器零度之下攻击时会积累寒冷层数,每层使受到的伤害增加5%(至多增加50%)"
692
696
  },
693
697
  "电能导体": {
694
698
  effect: 0,
695
- description: "当血量降低到10%以下时,“护盾”标签变为“重甲”标签; 受到寒冷伤害时,会叠加一层“寒冷”(至多10层)"
699
+ description: "当血量降低到10%以下时,“护盾”标签变为“重甲”标签;"
696
700
  },
697
701
  "超导体": {
698
702
  effect: 0,
699
- description: "当血量降低到5%以下时,“护盾”标签变为“重甲”标签; 受到寒冷伤害时,会叠加一层“寒冷”(至多10层)"
703
+ description: "当血量降低到5%以下时,“护盾”标签变为“重甲”标签;"
700
704
  },
701
705
  "能量虹吸": {
702
706
  effect: 0,
@@ -719,8 +723,32 @@ function apply(ctx, config) {
719
723
  description: "当“能量”≥10%的时候,每次受到攻击有60%的概率回复所有存活的异形100点血量; 每拥有一层“寒冷”则降低5%的概率"
720
724
  },
721
725
  "能量黑洞": {
726
+ effect: -0.2,
727
+ description: "存在“能量黑洞”,受到的伤害-20%"
728
+ },
729
+ "火焰异形": {
730
+ effect: 0,
731
+ description: "免疫火焰伤害,受到火焰伤害时会回复生命值"
732
+ },
733
+ "庞兽狂暴": {
734
+ effect: 0,
735
+ description: "血量低于50%时,进入狂暴状态,受到的伤害-50%"
736
+ },
737
+ "灼烧粘液": {
722
738
  effect: 0,
723
- description: "存在“能量黑洞”,受到的伤害-10%; 每拥有一层“寒冷”,受到的伤害+5%"
739
+ description: "受到伤害后,会获得一层“胆汁”; 若存在“胆汁”层数时受到火焰攻击,将立刻清空层数并回复X点生命值(X为“胆汁”层数 x 10)"
740
+ },
741
+ "腐蚀胆汁": {
742
+ effect: 0,
743
+ description: "当“胆汁”达到10层后,下一次受到攻击将治愈所有存活异形1000点血量并清空层数,"
744
+ },
745
+ "火焰吐息": {
746
+ effect: 0,
747
+ description: "当“胆汁”达到20层后,下一次攻击将治愈所有存活异形50%的最大生命值并清空层数"
748
+ },
749
+ "太阳耀斑": {
750
+ effect: 0,
751
+ description: "当所有子代阵亡后,自身将移除“惧寒”标签和“孤立无援”并且免疫寒冷伤害"
724
752
  }
725
753
  };
726
754
  const defineBoss = /* @__PURE__ */ __name((config2) => config2, "defineBoss");
@@ -874,6 +902,27 @@ function apply(ctx, config) {
874
902
  passive: asPassives(["弱化形态", "电能导体", "能量虹吸", "能量黑洞"])
875
903
  }
876
904
  ]
905
+ }),
906
+ defineBoss({
907
+ main: {
908
+ id: 7,
909
+ name: "烈焰庞兽",
910
+ type: "主宰",
911
+ maxHP: 2e4,
912
+ energy: 0,
913
+ tags: asBossTags(["重甲", "生物", "惧寒", "重型", "异形"]),
914
+ passive: asPassives(["火焰异形", "庞兽狂暴", "灼烧粘液", "火焰吐息", "太阳耀斑"])
915
+ },
916
+ minions: [
917
+ {
918
+ name: "火焰甲虫",
919
+ type: "子代",
920
+ maxHP: 5e3,
921
+ energy: 0,
922
+ tags: asBossTags(["重甲", "生物", "惧寒", "异形"]),
923
+ passive: asPassives(["弱化形态", "火焰异形", "灼烧粘液", "腐蚀胆汁"])
924
+ }
925
+ ]
877
926
  })
878
927
  ];
879
928
  const spaceStationCrewConfig = [
@@ -1203,6 +1252,15 @@ function apply(ctx, config) {
1203
1252
  price: 100,
1204
1253
  redCrystalCost: 0,
1205
1254
  condition: "使用零度之下攻击异形并成功使寒冷层数+1"
1255
+ },
1256
+ "顾全大局": {
1257
+ id: 3,
1258
+ type: "可重复任务",
1259
+ description: "利用【焚烧枪】武器引爆异形目标的胆汁",
1260
+ target: 1,
1261
+ price: 200,
1262
+ redCrystalCost: 0,
1263
+ condition: "使用焚烧枪攻击异形并成功引爆≥10层的胆汁"
1206
1264
  }
1207
1265
  };
1208
1266
  async function calculateTotalDamage(ctx2, session, equippedWeapon, targetBoss, options) {
@@ -1259,7 +1317,7 @@ function apply(ctx, config) {
1259
1317
  __name(checkCritRhythm, "checkCritRhythm");
1260
1318
  async function calculateTagMultiplier(weaponData, tags, equippedWeapon) {
1261
1319
  const MOD_EFFECTS = [
1262
- { mod: "裂甲核心", tag: "重甲", value: 1.2 },
1320
+ { mod: "裂甲核心", tag: "重甲", value: 1.5 },
1263
1321
  { mod: "助燃核心", tag: "惧热", value: 3 },
1264
1322
  { mod: "助燃核心", tag: "生物", value: 2 }
1265
1323
  ];
@@ -1315,28 +1373,28 @@ function apply(ctx, config) {
1315
1373
  let message = "";
1316
1374
  if (careerData?.career === "警卫长") {
1317
1375
  value += 0.05;
1318
- message = "⚔️ 职业加成:警卫长(攻击伤害+5%)";
1376
+ message = "⚔️ 警卫长:攻击伤害+5%";
1319
1377
  }
1320
1378
  if (careerData?.career === "武器中士") {
1321
1379
  value += 0.15;
1322
- message = "⚔️ 职业加成:武器中士(攻击伤害+15%)";
1380
+ message = "⚔️ 武器中士:攻击伤害+15%";
1323
1381
  }
1324
1382
  if (careerData?.career === "能量武器专家") {
1325
1383
  if (weaponType === "能量武器") {
1326
1384
  value += 0.2;
1327
- message = "⚔️ 职业加成:能量武器专家(能量武器伤害+20%)";
1385
+ message = "⚔️ 能量武器专家:能量武器攻击伤害+20%";
1328
1386
  }
1329
1387
  }
1330
1388
  if (careerData?.career === "纵火狂") {
1331
1389
  if (weaponType === "热能武器") {
1332
1390
  value += 0.2;
1333
- message = "⚔️ 职业加成:纵火狂(热能武器伤害+20%)";
1391
+ message = "⚔️ 纵火狂:热能武器攻击伤害+20%";
1334
1392
  }
1335
1393
  }
1336
1394
  if (careerData?.career === "猩红杀手") {
1337
1395
  if (weaponId === 7) {
1338
1396
  value += 0.15;
1339
- message = "⚔️ 职业加成:猩红杀手(侦察步枪伤害+15%)";
1397
+ message = "⚔️ 猩红杀手:侦察步枪攻击伤害+15%";
1340
1398
  }
1341
1399
  }
1342
1400
  return { value, message };
@@ -1353,7 +1411,7 @@ function apply(ctx, config) {
1353
1411
  });
1354
1412
  if (sovereign) {
1355
1413
  value += 0.05;
1356
- messages.push("👑 王权增幅(攻击伤害+5%)");
1414
+ messages.push("👑 王权增幅:攻击伤害+5%");
1357
1415
  }
1358
1416
  const [lament] = await ctx2.database.get("ggcevo_Wish_Record", {
1359
1417
  handle,
@@ -1364,7 +1422,7 @@ function apply(ctx, config) {
1364
1422
  if (lament) {
1365
1423
  const levelBonus = 0.1 * (weapon.level + 1);
1366
1424
  value += levelBonus;
1367
- messages.push(`🗡️ 悲鸣之锋(攻击伤害+${Math.round(levelBonus * 100)}%)`);
1425
+ messages.push(`🗡️ 悲鸣之锋:攻击伤害+${Math.round(levelBonus * 100)}%`);
1368
1426
  }
1369
1427
  const [critRhythm] = await ctx2.database.get("ggcevo_Wish_Record", {
1370
1428
  handle,
@@ -1373,7 +1431,7 @@ function apply(ctx, config) {
1373
1431
  endTime: { $gte: /* @__PURE__ */ new Date() }
1374
1432
  });
1375
1433
  if (critRhythm) {
1376
- messages.push("🎵 暴击韵律(攻击暴击率+20%)");
1434
+ messages.push("🎵 暴击韵律:攻击暴击率+20%");
1377
1435
  }
1378
1436
  return {
1379
1437
  value,
@@ -1582,7 +1640,7 @@ function apply(ctx, config) {
1582
1640
  updatedHP: Math.min(targetBoss.HP + healAmount, maxHP),
1583
1641
  initialDamage: 0,
1584
1642
  // 直接设置伤害为0
1585
- messages: [`❄️ 【冰霜进化】生效:免疫冰霜伤害,${targetBoss.name}回复 ${healAmount} 生命值`]
1643
+ messages: [`❄️ 【冰霜进化】生效:免疫寒冷伤害,${targetBoss.name}回复${healAmount}生命值`]
1586
1644
  };
1587
1645
  }
1588
1646
  return null;
@@ -1695,7 +1753,7 @@ function apply(ctx, config) {
1695
1753
  if (!effect) return null;
1696
1754
  return {
1697
1755
  updatedHP: effect.heal,
1698
- messages: [`【${effect.skill}】生效,${targetBoss.name}瞬间回复${effect.heal}生命值!`],
1756
+ messages: [`【${effect.skill}】生效,${targetBoss.name}濒死时瞬间回复${effect.heal}生命值`],
1699
1757
  skillUpdates: [{
1700
1758
  name: targetBoss.name,
1701
1759
  remove: [effect.skill]
@@ -1710,7 +1768,7 @@ function apply(ctx, config) {
1710
1768
  return {
1711
1769
  damageMultiplier: -0.5,
1712
1770
  // 50% 减伤
1713
- messages: ["🛡️ 【感染空间站】生效:空间站哨枪塔存活,受到的伤害减少50%"]
1771
+ messages: ["🛡️ 【感染空间站】生效:空间站哨枪塔存活时,受到的伤害-50%"]
1714
1772
  };
1715
1773
  }
1716
1774
  return null;
@@ -1815,10 +1873,10 @@ function apply(ctx, config) {
1815
1873
  handleStructuralArmor: /* @__PURE__ */ __name((targetBoss, weaponData) => {
1816
1874
  if (!targetBoss.skills.includes("结构装甲")) return null;
1817
1875
  let reduction = 0.2;
1818
- let msg = "常规武器减伤20%";
1876
+ let msg = "受到常规武器伤害-20%";
1819
1877
  if (weaponData.type === "热能武器") {
1820
1878
  reduction = 0.4;
1821
- msg = "热能武器减伤40%";
1879
+ msg = "受到热能武器伤害-40%";
1822
1880
  }
1823
1881
  return {
1824
1882
  damageMultiplier: -reduction,
@@ -1841,7 +1899,7 @@ function apply(ctx, config) {
1841
1899
  }
1842
1900
  if (targetBoss.skills.includes("嗜血狂暴") && currentHP / maxHP < 0.5) {
1843
1901
  damageMultiplier -= 0.2;
1844
- messages.push(`🔥 【嗜血狂暴】生效:血量低于50%,进入狂暴状态,受到的伤害-20%`);
1902
+ messages.push(`🔥 【嗜血狂暴】生效:进入狂暴状态,受到的伤害-20%`);
1845
1903
  }
1846
1904
  if (targetBoss.skills.includes("吐血") && bloodStacks < 1) {
1847
1905
  damageMultiplier += 0.2;
@@ -1874,7 +1932,7 @@ function apply(ctx, config) {
1874
1932
  }
1875
1933
  newStacks = Math.min(newStacks, 20);
1876
1934
  if (oldStacks < 20 && newStacks >= 20) {
1877
- messages.push(`🩸 “吸血”层数达到${newStacks},下次受到攻击将触发【进食】`);
1935
+ messages.push(`🩸 “吸血”达到${newStacks}层,下次受到攻击将触发【进食】`);
1878
1936
  }
1879
1937
  await ctx2.database.set("ggcevo_boss", { name: targetBoss.name }, { Skillcountpoints: newStacks });
1880
1938
  return { updatedHP, messages };
@@ -1892,7 +1950,7 @@ function apply(ctx, config) {
1892
1950
  const newLayers = hasRadiation ? Math.min(currentLayers + 1, 100) : 1;
1893
1951
  let layerMsg;
1894
1952
  if (!hasRadiation) {
1895
- layerMsg = `☢️ ${targetBoss.name} 获得【辐射】效果(初始层数1)`;
1953
+ layerMsg = `☢️ ${targetBoss.name}获得【辐射】效果(当前1)`;
1896
1954
  skillUpdates.push({
1897
1955
  name: targetBoss.name,
1898
1956
  add: ["辐射"]
@@ -1901,7 +1959,7 @@ function apply(ctx, config) {
1901
1959
  } else if (newLayers === currentLayers) {
1902
1960
  layerMsg = `☢️ 辐射层数已达上限(100层)`;
1903
1961
  } else {
1904
- layerMsg = `☢️ 辐射层数+1`;
1962
+ layerMsg = `☢️ ${targetBoss.name}获得1层“辐射”(当前${newLayers}层)`;
1905
1963
  radiationApplied = true;
1906
1964
  }
1907
1965
  await ctx2.database.set(
@@ -1929,29 +1987,46 @@ function apply(ctx, config) {
1929
1987
  messages: radiationLayers > 0 ? [`☢️ 【辐射】生效:当前${radiationLayers}层辐射,受到的伤害+${radiationLayers}%`] : []
1930
1988
  };
1931
1989
  }, "calculateRadiationDamage"),
1932
- // === 电能相关被动处理 ===
1933
- // 处理寒冷伤害叠加(电能导体/超导体)
1934
- handleFreezingStack: /* @__PURE__ */ __name(async (ctx2, targetBoss, weaponName) => {
1935
- if (weaponName !== "零度之下" || !(targetBoss.skills.includes("电能导体") || targetBoss.skills.includes("超导体"))) {
1990
+ // 新增寒冷层数处理函数(类似辐射处理)
1991
+ handleColdEffect: /* @__PURE__ */ __name(async (ctx2, targetBoss, weaponName) => {
1992
+ if (weaponName !== "零度之下") {
1936
1993
  return null;
1937
1994
  }
1995
+ const messages = [];
1938
1996
  let freezing = false;
1939
1997
  const currentFreezing = targetBoss.freezing || 0;
1940
- if (currentFreezing < 10) {
1941
- const newFreezing = currentFreezing + 1;
1942
- await ctx2.database.set(
1943
- "ggcevo_boss",
1944
- { name: targetBoss.name },
1945
- { freezing: newFreezing }
1946
- );
1998
+ const newFreezing = Math.min(currentFreezing + 1, 10);
1999
+ await ctx2.database.set(
2000
+ "ggcevo_boss",
2001
+ { name: targetBoss.name },
2002
+ { freezing: newFreezing }
2003
+ );
2004
+ if (newFreezing === 10 && currentFreezing < 10) {
2005
+ messages.push(`❄️ 【寒冷】效果达到上限(10层)`);
2006
+ } else {
2007
+ messages.push(`❄️ ${targetBoss.name} 获得1层"寒冷"(当前${newFreezing}层)`);
1947
2008
  freezing = true;
2009
+ }
2010
+ return {
2011
+ messages,
2012
+ freezing
2013
+ };
2014
+ }, "handleColdEffect"),
2015
+ // 寒冷伤害计算(返回增伤系数)
2016
+ calculateColdDamage: /* @__PURE__ */ __name((targetBoss) => {
2017
+ const freezingLayers = targetBoss.freezing || 0;
2018
+ if (freezingLayers > 0) {
1948
2019
  return {
1949
- messages: [`❄️ ${targetBoss.name} 获得一层"寒冷"(当前 ${newFreezing}层)`],
1950
- freezing
2020
+ damageMultiplier: freezingLayers * 0.05,
2021
+ // 每层5%增伤
2022
+ messages: [
2023
+ `❄️ 【寒冷】生效:当前${freezingLayers}层,受到的伤害+${freezingLayers * 5}%`
2024
+ ]
1951
2025
  };
1952
2026
  }
1953
2027
  return null;
1954
- }, "handleFreezingStack"),
2028
+ }, "calculateColdDamage"),
2029
+ // === 电能相关被动处理 ===
1955
2030
  // 处理导体标签变化(血量低时护盾->重甲)
1956
2031
  handleConductorTagChange: /* @__PURE__ */ __name(async (ctx2, targetBoss, currentHP, maxHP) => {
1957
2032
  const triggerThreshold = targetBoss.skills.includes("超导体") ? 0.05 : 0.1;
@@ -2029,23 +2104,6 @@ function apply(ctx, config) {
2029
2104
  }
2030
2105
  return null;
2031
2106
  }, "handlePowerSiphon"),
2032
- // 处理能量黑洞减伤(基础减伤 + 寒冷增伤)
2033
- handleEnergyBlackhole: /* @__PURE__ */ __name((targetBoss) => {
2034
- if (!targetBoss.skills.includes("能量黑洞")) return null;
2035
- const currentFreezing = targetBoss.freezing || 0;
2036
- const baseReduction = 0.1;
2037
- const freezingBonus = currentFreezing * 0.05;
2038
- return {
2039
- damageMultiplier: -baseReduction + freezingBonus,
2040
- messages: [
2041
- `🌀 【能量黑洞】生效:基础减伤10%`,
2042
- currentFreezing > 0 ? (
2043
- // 关键修改:将百分比四舍五入为整数
2044
- `❄️ 寒冷(${currentFreezing}层)使受到的伤害+${Math.round(freezingBonus * 100)}%`
2045
- ) : ""
2046
- ].filter(Boolean)
2047
- };
2048
- }, "handleEnergyBlackhole"),
2049
2107
  // 处理电能立场(概率免疫伤害)
2050
2108
  handleEnergyField: /* @__PURE__ */ __name(async function(ctx2, targetBoss, weaponName, initialDamage) {
2051
2109
  if (!targetBoss.skills.includes("电能立场") || initialDamage === 0 || weaponName === "零度之下") {
@@ -2063,7 +2121,7 @@ function apply(ctx, config) {
2063
2121
  return {
2064
2122
  immune: true,
2065
2123
  messages: [
2066
- `🛡️ 【电能立场】生效:成功免疫伤害!`
2124
+ `🛡️ 【电能立场】生效:免疫非寒冷伤害!`
2067
2125
  ]
2068
2126
  };
2069
2127
  }
@@ -2077,8 +2135,8 @@ function apply(ctx, config) {
2077
2135
  }
2078
2136
  return null;
2079
2137
  }, "getMemberConfig"),
2080
- // 处理脉冲效果(概率治疗全体异形)
2081
- handlePulse: /* @__PURE__ */ __name(async function(ctx2, targetBoss, activeBosses, bossGroup) {
2138
+ // 修改后的脉冲处理函数
2139
+ handlePulse: /* @__PURE__ */ __name(async function(ctx2, targetBoss, activeBosses, bossGroup, currentHP) {
2082
2140
  if (!targetBoss.skills.includes("脉冲")) return null;
2083
2141
  const currentEnergy = targetBoss.energy || 0;
2084
2142
  const currentFreezing = targetBoss.freezing || 0;
@@ -2096,6 +2154,7 @@ function apply(ctx, config) {
2096
2154
  );
2097
2155
  const updates = [];
2098
2156
  const healMessages = [];
2157
+ let updatedHP = currentHP;
2099
2158
  for (const member of groupMembers) {
2100
2159
  const memberConfig = this.getMemberConfig(member.name, bossGroup);
2101
2160
  if (!memberConfig) continue;
@@ -2103,6 +2162,9 @@ function apply(ctx, config) {
2103
2162
  const healAmount = member.type === "主宰" ? 100 : 100;
2104
2163
  const newHP = Math.min(member.HP + healAmount, maxHP);
2105
2164
  const actualHeal = newHP - member.HP;
2165
+ if (member.name === targetBoss.name) {
2166
+ updatedHP = newHP;
2167
+ }
2106
2168
  updates.push(
2107
2169
  ctx2.database.set(
2108
2170
  "ggcevo_boss",
@@ -2111,16 +2173,16 @@ function apply(ctx, config) {
2111
2173
  )
2112
2174
  );
2113
2175
  if (actualHeal > 0) {
2114
- healMessages.push(`${member.name}+${actualHeal}HP(当前${newHP}/${maxHP})`);
2115
- } else {
2116
- healMessages.push(`${member.name}生命值已满`);
2176
+ healMessages.push(`${member.name}+${actualHeal}HP`);
2117
2177
  }
2118
2178
  }
2119
2179
  if (healMessages.length > 0) {
2120
2180
  await Promise.all(updates);
2121
2181
  return {
2182
+ newHP: updatedHP,
2183
+ // 返回当前目标的新HP值
2122
2184
  messages: [
2123
- `❤️ 【脉冲】生效:治疗全体异形!`,
2185
+ `❤️ 【脉冲】生效:治疗全体异形`,
2124
2186
  ...healMessages
2125
2187
  ]
2126
2188
  };
@@ -2169,6 +2231,225 @@ function apply(ctx, config) {
2169
2231
  return null;
2170
2232
  }
2171
2233
  }, "handleParticlePhaseEffect"),
2234
+ // 庞兽狂暴处理(血量低于50%时减伤)
2235
+ handleGiantRage: /* @__PURE__ */ __name(function(targetBoss, currentHP, maxHP) {
2236
+ if (!targetBoss.skills.includes("庞兽狂暴")) return null;
2237
+ if (currentHP / maxHP < 0.5) {
2238
+ return {
2239
+ damageMultiplier: -0.5,
2240
+ messages: [`🐗 【庞兽狂暴】生效:进入狂暴状态,受到的伤害-50%`]
2241
+ };
2242
+ }
2243
+ return null;
2244
+ }, "handleGiantRage"),
2245
+ // 修改后的灼烧粘液处理
2246
+ handleBileStacking: /* @__PURE__ */ __name(async function(ctx2, targetBoss, skipStack) {
2247
+ if (!targetBoss.skills.includes("灼烧粘液") || skipStack) return null;
2248
+ const currentStacks = targetBoss.Skillcountpoints || 0;
2249
+ const newStacks = Math.min(currentStacks + 1, 20);
2250
+ let messages = [`💧 【灼烧粘液】生效:获得1层"胆汁"(当前${newStacks}层)`];
2251
+ if (currentStacks < 10 && newStacks >= 10) {
2252
+ if (targetBoss.skills.includes("腐蚀胆汁")) {
2253
+ messages.push(`🟢 胆汁达到10层,下次攻击将触发【腐蚀胆汁】`);
2254
+ }
2255
+ }
2256
+ if (currentStacks < 20 && newStacks >= 20) {
2257
+ if (targetBoss.skills.includes("火焰吐息")) {
2258
+ messages.push(`🐲 胆汁达到20层,下次攻击将触发【火焰吐息】`);
2259
+ }
2260
+ }
2261
+ await ctx2.database.set(
2262
+ "ggcevo_boss",
2263
+ { name: targetBoss.name },
2264
+ { Skillcountpoints: newStacks }
2265
+ );
2266
+ return { messages };
2267
+ }, "handleBileStacking"),
2268
+ // 修改后的太阳耀斑处理(每次受击检测)
2269
+ handleSolarFlare: /* @__PURE__ */ __name(async function(ctx2, targetBoss, weaponName) {
2270
+ if (!targetBoss.skills.includes("太阳耀斑") || targetBoss.type !== "主宰") {
2271
+ return { immune: false, messages: [] };
2272
+ }
2273
+ const messages = [];
2274
+ let immune = false;
2275
+ const minions = await ctx2.database.get("ggcevo_boss", {
2276
+ groupId: targetBoss.groupId,
2277
+ type: "子代",
2278
+ isActive: true
2279
+ });
2280
+ const aliveMinions = minions.filter((m) => m.HP > 0);
2281
+ if (aliveMinions.length === 0) {
2282
+ const updates = [];
2283
+ if (targetBoss.tags.includes("惧寒")) {
2284
+ const newTags = targetBoss.tags.filter((tag) => tag !== "惧寒");
2285
+ updates.push(
2286
+ ctx2.database.set(
2287
+ "ggcevo_boss",
2288
+ { name: targetBoss.name },
2289
+ { tags: newTags }
2290
+ )
2291
+ );
2292
+ targetBoss.tags = newTags;
2293
+ messages.push(`☀️ 【太阳耀斑】生效:移除"惧寒"标签`);
2294
+ }
2295
+ if (targetBoss.skills.includes("孤立无援")) {
2296
+ const newSkills = targetBoss.skills.filter((skill) => skill !== "孤立无援");
2297
+ updates.push(
2298
+ ctx2.database.set(
2299
+ "ggcevo_boss",
2300
+ { name: targetBoss.name },
2301
+ { skills: newSkills }
2302
+ )
2303
+ );
2304
+ targetBoss.skills = newSkills;
2305
+ messages.push(`☀️ 【太阳耀斑】生效:移除"孤立无援"技能`);
2306
+ }
2307
+ await Promise.all(updates);
2308
+ }
2309
+ if (!targetBoss.tags.includes("惧寒") && weaponName === "零度之下") {
2310
+ immune = true;
2311
+ messages.push(`☀️ 【太阳耀斑】生效:免疫寒冷伤害`);
2312
+ }
2313
+ return { immune, messages };
2314
+ }, "handleSolarFlare"),
2315
+ // 辅助函数:从配置中获取成员的最大生命值
2316
+ getMemberMaxHP: /* @__PURE__ */ __name(function(name2, bossGroup) {
2317
+ if (bossGroup.main.name === name2) return bossGroup.main.maxHP;
2318
+ for (const minion of bossGroup.minions) {
2319
+ if (minion.name === name2) return minion.maxHP;
2320
+ }
2321
+ return null;
2322
+ }, "getMemberMaxHP"),
2323
+ // 修改后的腐蚀胆汁处理函数
2324
+ handleCorrosiveBile: /* @__PURE__ */ __name(async function(ctx2, targetBoss, bossGroup, currentHP) {
2325
+ if (!targetBoss.skills.includes("腐蚀胆汁")) return null;
2326
+ const bileStacks = targetBoss.Skillcountpoints || 0;
2327
+ if (bileStacks < 10) return null;
2328
+ await ctx2.database.set(
2329
+ "ggcevo_boss",
2330
+ { name: targetBoss.name },
2331
+ { Skillcountpoints: 0 }
2332
+ );
2333
+ const messages = [
2334
+ `🟢 【腐蚀胆汁】生效:消耗10层"胆汁",治愈所有存活异形`
2335
+ ];
2336
+ const updates = [];
2337
+ let updatedHP = currentHP;
2338
+ const groupMembers = await ctx2.database.get("ggcevo_boss", {
2339
+ groupId: targetBoss.groupId,
2340
+ isActive: true,
2341
+ HP: { $gt: 0 }
2342
+ });
2343
+ for (const member of groupMembers) {
2344
+ const maxHP = this.getMemberMaxHP(member.name, bossGroup);
2345
+ if (!maxHP) continue;
2346
+ const healAmount = 1e3;
2347
+ const newHP = Math.min(member.HP + healAmount, maxHP);
2348
+ const actualHeal = newHP - member.HP;
2349
+ if (member.name === targetBoss.name) {
2350
+ updatedHP = newHP;
2351
+ }
2352
+ updates.push(
2353
+ ctx2.database.set(
2354
+ "ggcevo_boss",
2355
+ { name: member.name },
2356
+ { HP: newHP }
2357
+ )
2358
+ );
2359
+ messages.push(`${member.name} 回复${actualHeal}点生命值`);
2360
+ }
2361
+ await Promise.all(updates);
2362
+ return { messages, currentHP: updatedHP };
2363
+ }, "handleCorrosiveBile"),
2364
+ // 修改后的火焰吐息处理函数
2365
+ handleFireBreath: /* @__PURE__ */ __name(async function(ctx2, targetBoss, bossGroup, currentHP) {
2366
+ if (!targetBoss.skills.includes("火焰吐息")) return null;
2367
+ const bileStacks = targetBoss.Skillcountpoints || 0;
2368
+ if (bileStacks < 20) return null;
2369
+ await ctx2.database.set(
2370
+ "ggcevo_boss",
2371
+ { name: targetBoss.name },
2372
+ { Skillcountpoints: 0 }
2373
+ );
2374
+ const messages = [
2375
+ `🐲 【火焰吐息】生效:消耗20层"胆汁",治愈所有存活异形50%的最大生命值`
2376
+ ];
2377
+ const updates = [];
2378
+ let updatedHP = currentHP;
2379
+ const groupMembers = await ctx2.database.get("ggcevo_boss", {
2380
+ groupId: targetBoss.groupId,
2381
+ isActive: true,
2382
+ HP: { $gt: 0 }
2383
+ });
2384
+ for (const member of groupMembers) {
2385
+ const maxHP = this.getMemberMaxHP(member.name, bossGroup);
2386
+ if (!maxHP) continue;
2387
+ const healAmount = Math.floor(maxHP * 0.5);
2388
+ const newHP = Math.min(member.HP + healAmount, maxHP);
2389
+ const actualHeal = newHP - member.HP;
2390
+ if (member.name === targetBoss.name) {
2391
+ updatedHP = newHP;
2392
+ }
2393
+ updates.push(
2394
+ ctx2.database.set(
2395
+ "ggcevo_boss",
2396
+ { name: member.name },
2397
+ { HP: newHP }
2398
+ )
2399
+ );
2400
+ messages.push(`${member.name} 回复${actualHeal}点生命值`);
2401
+ }
2402
+ await Promise.all(updates);
2403
+ return { messages, currentHP: updatedHP };
2404
+ }, "handleFireBreath"),
2405
+ // 修改后的火焰异形处理
2406
+ handleFireEvolution: /* @__PURE__ */ __name(async function(ctx2, targetBoss, weaponName, initialDamage, bossGroup) {
2407
+ if (targetBoss.skills.includes("火焰异形") && weaponName === "焚烧枪") {
2408
+ const maxHP = this.getMemberMaxHP(targetBoss.name, bossGroup);
2409
+ if (!maxHP) return null;
2410
+ const healAmount = Math.min(initialDamage, maxHP - targetBoss.HP);
2411
+ let updatedHP = Math.min(targetBoss.HP + healAmount, maxHP);
2412
+ const messages = [
2413
+ `🔥 【火焰异形】生效:免疫火焰伤害`,
2414
+ healAmount > 0 ? `${targetBoss.name}回复${healAmount}点生命值` : ""
2415
+ ].filter(Boolean);
2416
+ const bileResult = await this.handleBileIgnition(ctx2, targetBoss, bossGroup, updatedHP);
2417
+ if (bileResult) {
2418
+ updatedHP = bileResult.newHP;
2419
+ messages.push(...bileResult.messages);
2420
+ }
2421
+ return {
2422
+ updatedHP,
2423
+ initialDamage: 0,
2424
+ // 免疫伤害
2425
+ messages,
2426
+ bileStacks: bileResult?.bileStacks || 0
2427
+ };
2428
+ }
2429
+ return null;
2430
+ }, "handleFireEvolution"),
2431
+ // 修改后的灼烧粘液引爆
2432
+ handleBileIgnition: /* @__PURE__ */ __name(async function(ctx2, targetBoss, bossGroup, updatedHP) {
2433
+ if (!targetBoss.skills.includes("灼烧粘液")) return null;
2434
+ const bileStacks = targetBoss.Skillcountpoints || 0;
2435
+ if (bileStacks < 1) return null;
2436
+ const maxHP = this.getMemberMaxHP(targetBoss.name, bossGroup);
2437
+ if (!maxHP) return null;
2438
+ const healAmount = bileStacks * 10;
2439
+ const newHP = Math.min(updatedHP + healAmount, maxHP);
2440
+ await ctx2.database.set(
2441
+ "ggcevo_boss",
2442
+ { name: targetBoss.name },
2443
+ { Skillcountpoints: 0, HP: newHP }
2444
+ );
2445
+ return {
2446
+ messages: [
2447
+ `💥 【灼烧粘液】引爆:消耗${bileStacks}层"胆汁",${targetBoss.name}回复${healAmount}点生命值`
2448
+ ],
2449
+ newHP,
2450
+ bileStacks
2451
+ };
2452
+ }, "handleBileIgnition"),
2172
2453
  // 统一处理被动技能
2173
2454
  handlePassives: /* @__PURE__ */ __name(async function(ctx2, targetBoss, initialDamage, currentHP, maxHP, weaponName, weaponData, activeBosses, bossGroup) {
2174
2455
  let messages = [];
@@ -2176,6 +2457,16 @@ function apply(ctx, config) {
2176
2457
  let totalMultiplier = 0;
2177
2458
  let radiationApplied = false;
2178
2459
  let freezing = false;
2460
+ let bileStacks = 0;
2461
+ const solarFlareResult = await this.handleSolarFlare(ctx2, targetBoss, weaponName);
2462
+ if (solarFlareResult.immune) {
2463
+ return {
2464
+ currentHP: targetBoss.HP,
2465
+ messages: solarFlareResult.messages,
2466
+ skillUpdates: [],
2467
+ initialDamage: 0
2468
+ };
2469
+ }
2179
2470
  const frostEvoResult = this.handleFrostEvolution(targetBoss, weaponName, initialDamage, maxHP);
2180
2471
  if (frostEvoResult) {
2181
2472
  return {
@@ -2206,6 +2497,22 @@ function apply(ctx, config) {
2206
2497
  };
2207
2498
  }
2208
2499
  }
2500
+ const fireEvoResult = await this.handleFireEvolution(
2501
+ ctx2,
2502
+ targetBoss,
2503
+ weaponName,
2504
+ initialDamage,
2505
+ bossGroup
2506
+ );
2507
+ if (fireEvoResult) {
2508
+ return {
2509
+ currentHP: fireEvoResult.updatedHP,
2510
+ messages: fireEvoResult.messages,
2511
+ skillUpdates: [],
2512
+ initialDamage: fireEvoResult.initialDamage,
2513
+ bileStacks: fireEvoResult.bileStacks
2514
+ };
2515
+ }
2209
2516
  targetBoss.skills.forEach((skill) => {
2210
2517
  const config2 = passiveConfig[skill];
2211
2518
  if (config2 && config2.effect !== void 0 && config2.effect !== 0) {
@@ -2239,16 +2546,21 @@ function apply(ctx, config) {
2239
2546
  totalMultiplier += powerSiphonResult.damageMultiplier;
2240
2547
  messages.push(...powerSiphonResult.messages);
2241
2548
  }
2242
- const blackholeResult = this.handleEnergyBlackhole(targetBoss);
2243
- if (blackholeResult) {
2244
- totalMultiplier += blackholeResult.damageMultiplier;
2245
- messages.push(...blackholeResult.messages);
2549
+ const giantRageResult = this.handleGiantRage(targetBoss, currentHP, maxHP);
2550
+ if (giantRageResult) {
2551
+ totalMultiplier += giantRageResult.damageMultiplier;
2552
+ messages.push(...giantRageResult.messages);
2246
2553
  }
2247
2554
  const radiationCalc = this.calculateRadiationDamage(targetBoss);
2248
2555
  if (radiationCalc) {
2249
2556
  totalMultiplier += radiationCalc.damageMultiplier;
2250
2557
  messages.push(...radiationCalc.messages);
2251
2558
  }
2559
+ const coldDamageResult = this.calculateColdDamage(targetBoss);
2560
+ if (coldDamageResult) {
2561
+ totalMultiplier += coldDamageResult.damageMultiplier;
2562
+ messages.push(...coldDamageResult.messages);
2563
+ }
2252
2564
  const particleResult = this.handleParticlePhaseEffect(
2253
2565
  targetBoss,
2254
2566
  weaponName,
@@ -2258,6 +2570,9 @@ function apply(ctx, config) {
2258
2570
  totalMultiplier = particleResult.damageMultiplier;
2259
2571
  messages.push(...particleResult.messages);
2260
2572
  }
2573
+ if (solarFlareResult.messages.length > 0) {
2574
+ messages.push(...solarFlareResult.messages);
2575
+ }
2261
2576
  const originalMultiplier = totalMultiplier;
2262
2577
  if (originalMultiplier < -1) {
2263
2578
  messages.push(`⚠️ 触发伤害保底机制:强制造成1点伤害`);
@@ -2298,10 +2613,37 @@ function apply(ctx, config) {
2298
2613
  messages.push(...survivalResult.messages);
2299
2614
  skillUpdates.push(...survivalResult.skillUpdates);
2300
2615
  }
2301
- const pulseResult = await this.handlePulse(ctx2, targetBoss, activeBosses, bossGroup);
2616
+ const pulseResult = await this.handlePulse(
2617
+ ctx2,
2618
+ targetBoss,
2619
+ activeBosses,
2620
+ bossGroup,
2621
+ currentHP
2622
+ // 传入当前HP值
2623
+ );
2302
2624
  if (pulseResult) {
2625
+ currentHP = pulseResult.newHP;
2303
2626
  messages.push(...pulseResult.messages);
2304
2627
  }
2628
+ let skipBileStacking = false;
2629
+ if (weaponName !== "焚烧枪") {
2630
+ if (targetBoss.skills.includes("腐蚀胆汁")) {
2631
+ const bileTriggered = await this.handleCorrosiveBile(ctx2, targetBoss, bossGroup, currentHP);
2632
+ if (bileTriggered) {
2633
+ currentHP = bileTriggered.currentHP;
2634
+ skipBileStacking = true;
2635
+ messages.push(...bileTriggered.messages);
2636
+ }
2637
+ }
2638
+ if (targetBoss.skills.includes("火焰吐息")) {
2639
+ const breathTriggered = await this.handleFireBreath(ctx2, targetBoss, bossGroup, currentHP);
2640
+ if (breathTriggered) {
2641
+ currentHP = breathTriggered.currentHP;
2642
+ skipBileStacking = true;
2643
+ messages.push(...breathTriggered.messages);
2644
+ }
2645
+ }
2646
+ }
2305
2647
  const coldAdaptResult = await this.handleColdAdaptation(ctx2, targetBoss, weaponName);
2306
2648
  if (coldAdaptResult) {
2307
2649
  messages.push(...coldAdaptResult.messages);
@@ -2315,11 +2657,6 @@ function apply(ctx, config) {
2315
2657
  if (sentryResult) {
2316
2658
  messages.push(...sentryResult.messages);
2317
2659
  }
2318
- const freezingStackResult = await this.handleFreezingStack(ctx2, targetBoss, weaponName);
2319
- if (freezingStackResult) {
2320
- messages.push(...freezingStackResult.messages);
2321
- freezing = freezingStackResult.freezing;
2322
- }
2323
2660
  const tagChangeResult = await this.handleConductorTagChange(ctx2, targetBoss, currentHP, maxHP);
2324
2661
  if (tagChangeResult) {
2325
2662
  messages.push(...tagChangeResult.messages);
@@ -2338,6 +2675,15 @@ function apply(ctx, config) {
2338
2675
  skillUpdates.push(...gammaRadResult.skillUpdates);
2339
2676
  radiationApplied = gammaRadResult.radiationApplied;
2340
2677
  }
2678
+ const bileStackResult = await this.handleBileStacking(ctx2, targetBoss, skipBileStacking);
2679
+ if (bileStackResult) {
2680
+ messages.push(...bileStackResult.messages);
2681
+ }
2682
+ const coldEffectResult = await this.handleColdEffect(ctx2, targetBoss, weaponName);
2683
+ if (coldEffectResult) {
2684
+ messages.push(...coldEffectResult.messages);
2685
+ freezing = coldEffectResult.freezing;
2686
+ }
2341
2687
  return {
2342
2688
  currentHP,
2343
2689
  messages,
@@ -2521,6 +2867,7 @@ function apply(ctx, config) {
2521
2867
  });
2522
2868
  if (!allCleaners.length) return [];
2523
2869
  let killerBonus = false;
2870
+ let killerBonusMessage = "";
2524
2871
  for (const cleaner of allCleaners) {
2525
2872
  let rewardAmount = baseReward;
2526
2873
  if (cleaner.handle === killerHandle) {
@@ -2532,13 +2879,8 @@ function apply(ctx, config) {
2532
2879
  redcrystal: (cleaner.redcrystal || 0) + rewardAmount
2533
2880
  }], ["handle"]);
2534
2881
  }
2535
- const rewardMessages = [
2536
- `🧹 全体清洁工因清理 ${bossName} 尸体获得 ${baseReward} 红晶!`
2537
- ];
2538
- if (killerBonus) {
2539
- rewardMessages.push(`🎖️ ${killerName}(致命一击)获得双倍红晶奖励!`);
2540
- }
2541
- return rewardMessages;
2882
+ const rewardMessage = `🧹 全体清洁工因清理 ${bossName} 获得 ${baseReward} 红晶${killerBonus ? ` (致命一击奖励 ${killerName})` : ""}`;
2883
+ return [rewardMessage];
2542
2884
  } catch (error) {
2543
2885
  ctx2.logger("ggcevo").warn("清洁工奖励发放失败", error);
2544
2886
  return [];
@@ -2550,6 +2892,10 @@ function apply(ctx, config) {
2550
2892
  const extraDamages = [];
2551
2893
  const actuallyDead = [];
2552
2894
  let scatterBroadcast = null;
2895
+ const allCleanerRewards = [];
2896
+ let masterDeathEvent = null;
2897
+ const otherBroadcastMessages = [];
2898
+ const processedGroups = /* @__PURE__ */ new Set();
2553
2899
  const secondaryTargets = activeBosses.filter(
2554
2900
  (boss) => boss.name !== targetBoss.name
2555
2901
  );
@@ -2571,7 +2917,6 @@ function apply(ctx, config) {
2571
2917
  scatterEffectMessages.push(scatterMsg);
2572
2918
  const baseDamage = weaponData.damage * (1 + 0.1 * equippedWeapon.level);
2573
2919
  const secondaryDamage = Math.round(baseDamage * scatterRatio);
2574
- const cleanerRewards = [];
2575
2920
  for (const secondaryTarget of secondaryTargets) {
2576
2921
  const secondaryMaxHP = getBossMaxHP(secondaryTarget.name);
2577
2922
  let currentDamage = secondaryDamage;
@@ -2631,24 +2976,17 @@ function apply(ctx, config) {
2631
2976
  redcrystal: (cleaner.redcrystal || 0) + rewardAmount
2632
2977
  }], ["handle"]);
2633
2978
  }
2634
- let rewardMsg = `🧹 全体清洁工因清理 ${bossName} 尸体获得 ${baseReward} 红晶!`;
2979
+ let rewardMsg = `🧹 全体清洁工因清理 ${bossName} 获得 ${baseReward} 红晶`;
2635
2980
  if (killerBonus) {
2636
- rewardMsg += `
2637
- 🎖️ ${playerName}(致命一击)获得双倍红晶奖励!`;
2638
- }
2639
- if (!scatterBroadcast) {
2640
- scatterBroadcast = [];
2641
- }
2642
- if (Array.isArray(scatterBroadcast)) {
2643
- scatterBroadcast.push(rewardMsg);
2644
- } else {
2645
- scatterBroadcast = [rewardMsg];
2981
+ rewardMsg += ` (致命一击奖励 ${playerName})`;
2646
2982
  }
2983
+ allCleanerRewards.push(rewardMsg);
2647
2984
  }
2985
+ const groupId = secondaryTarget.groupId;
2648
2986
  if (secondaryTarget.type === "子代") {
2649
2987
  if (secondaryTarget.name === "机械感染虫") {
2650
2988
  const [mainBoss] = await ctx2.database.get("ggcevo_boss", {
2651
- groupId: secondaryTarget.groupId,
2989
+ groupId,
2652
2990
  type: "主宰",
2653
2991
  isActive: true
2654
2992
  });
@@ -2656,24 +2994,18 @@ function apply(ctx, config) {
2656
2994
  await ctx2.database.set("ggcevo_boss", { name: mainBoss.name }, {
2657
2995
  skills: [...mainBoss.skills, "孤立无援"]
2658
2996
  });
2659
- const isolationMsg = "💥 机械感染虫已阵亡,空间站感染虫进入【孤立无援】状态,受到的伤害+20%!";
2660
- if (!scatterBroadcast) {
2661
- scatterBroadcast = isolationMsg;
2662
- } else if (Array.isArray(scatterBroadcast)) {
2663
- scatterBroadcast.push(isolationMsg);
2664
- } else {
2665
- scatterBroadcast = [scatterBroadcast, isolationMsg];
2666
- }
2997
+ otherBroadcastMessages.push("💥 机械感染虫已阵亡,空间站感染虫进入【孤立无援】状态,受到的伤害+20%!");
2667
2998
  }
2668
2999
  } else {
2669
3000
  const remainingMinions = await ctx2.database.get("ggcevo_boss", {
2670
- groupId: secondaryTarget.groupId,
3001
+ groupId,
2671
3002
  type: "子代",
2672
3003
  isActive: true
2673
3004
  });
2674
- if (remainingMinions.length === 0) {
3005
+ if (remainingMinions.length === 0 && !processedGroups.has(groupId)) {
3006
+ processedGroups.add(groupId);
2675
3007
  const [mainBoss] = await ctx2.database.get("ggcevo_boss", {
2676
- groupId: secondaryTarget.groupId,
3008
+ groupId,
2677
3009
  type: "主宰",
2678
3010
  isActive: true
2679
3011
  });
@@ -2681,21 +3013,14 @@ function apply(ctx, config) {
2681
3013
  await ctx2.database.set("ggcevo_boss", { name: mainBoss.name }, {
2682
3014
  skills: [...mainBoss.skills, "孤立无援"]
2683
3015
  });
2684
- const isolationMsg = `💥 所有子代已阵亡,${mainBoss.name}进入【孤立无援】状态,受到的伤害+20%!`;
2685
- if (!scatterBroadcast) {
2686
- scatterBroadcast = isolationMsg;
2687
- } else if (Array.isArray(scatterBroadcast)) {
2688
- scatterBroadcast.push(isolationMsg);
2689
- } else {
2690
- scatterBroadcast = [scatterBroadcast, isolationMsg];
2691
- }
3016
+ otherBroadcastMessages.push(`💥 所有子代已阵亡,${mainBoss.name}进入【孤立无援】状态,受到的伤害+20%!`);
2692
3017
  }
2693
3018
  }
2694
3019
  }
2695
3020
  } else if (secondaryTarget.type === "主宰") {
2696
3021
  await ctx2.database.set(
2697
3022
  "ggcevo_boss",
2698
- { groupId: secondaryTarget.groupId },
3023
+ { groupId },
2699
3024
  { isActive: false, HP: 0 }
2700
3025
  );
2701
3026
  const respawnTime = /* @__PURE__ */ new Date();
@@ -2707,25 +3032,39 @@ function apply(ctx, config) {
2707
3032
  );
2708
3033
  const { rewardMessages } = await handleBossDefeatRewards(ctx2, secondaryTarget);
2709
3034
  await ctx2.database.remove("ggcevo_boss_damage", {
2710
- bossGroupId: secondaryTarget.groupId
3035
+ bossGroupId: groupId
2711
3036
  });
2712
- const defeatMsg = [
2713
- `🎯 主宰 ${secondaryTarget.name} 已被 ${session.username} 的散射伤害击败!`,
2714
- `所有子代已消失,下一个主宰将在1小时后重生`,
2715
- "",
2716
- "🏆 伤害排行榜奖励:",
2717
- ...rewardMessages
2718
- ];
2719
- if (!scatterBroadcast) {
2720
- scatterBroadcast = defeatMsg;
2721
- } else if (Array.isArray(scatterBroadcast)) {
2722
- scatterBroadcast.push(...defeatMsg);
2723
- } else {
2724
- scatterBroadcast = [scatterBroadcast, ...defeatMsg];
2725
- }
3037
+ masterDeathEvent = {
3038
+ name: secondaryTarget.name,
3039
+ rewards: [
3040
+ `🎯 主宰 ${secondaryTarget.name} 已被 ${session.username} 的散射伤害击败!`,
3041
+ `所有子代已消失,下一个主宰将在1小时后重生`,
3042
+ "",
3043
+ "🏆 伤害排行榜奖励:",
3044
+ ...rewardMessages
3045
+ ]
3046
+ };
2726
3047
  }
2727
3048
  }
2728
3049
  }
3050
+ if (allCleanerRewards.length > 0) {
3051
+ const combinedRewards = `✨ 散射攻击击败奖励
3052
+ ${allCleanerRewards.join("\n")}`;
3053
+ otherBroadcastMessages.push(combinedRewards);
3054
+ }
3055
+ if (masterDeathEvent) {
3056
+ scatterBroadcast = [
3057
+ ...masterDeathEvent.rewards
3058
+ ];
3059
+ if (otherBroadcastMessages.length > 0) {
3060
+ scatterBroadcast.push("", ...otherBroadcastMessages);
3061
+ }
3062
+ } else if (otherBroadcastMessages.length > 0) {
3063
+ scatterBroadcast = otherBroadcastMessages;
3064
+ }
3065
+ if (Array.isArray(scatterBroadcast) && scatterBroadcast.length === 1) {
3066
+ scatterBroadcast = scatterBroadcast[0];
3067
+ }
2729
3068
  return { scatterEffectMessages, extraDamages, actuallyDead, scatterBroadcast };
2730
3069
  }
2731
3070
  __name(handleSecondaryTargets, "handleSecondaryTargets");
@@ -2877,7 +3216,7 @@ function apply(ctx, config) {
2877
3216
  });
2878
3217
  return {
2879
3218
  success: true,
2880
- message: `成功引爆 ${itemName},造成 ${damageValue} 点伤害,获得等额金币`
3219
+ message: `成功引爆${itemName},对空间站哨枪塔造成${damageValue}点伤害,获得等额金币。`
2881
3220
  };
2882
3221
  }
2883
3222
  if (itemConfig2.id === 2) {
@@ -2891,7 +3230,7 @@ function apply(ctx, config) {
2891
3230
  });
2892
3231
  if (!targetboss || targetboss?.Skillcountpoints === 0 || targetboss?.tags.includes("建筑") || targetboss?.tags.includes("重型")) return {
2893
3232
  success: false,
2894
- message: "您无法对目标使用。(目标已死亡/目标的技能计数为0/目标拥有“建筑”或“重型”标签)"
3233
+ message: "您无法对目标使用(目标已死亡/目标的技能计数为0/目标拥有“建筑”或“重型”标签)"
2895
3234
  };
2896
3235
  await ctx.database.set(
2897
3236
  "ggcevo_boss",
@@ -2900,7 +3239,7 @@ function apply(ctx, config) {
2900
3239
  );
2901
3240
  return {
2902
3241
  success: true,
2903
- message: `成功使用 ${itemName},已重置 ${target} 的技能计数`
3242
+ message: `成功使用${itemName},已重置${target}的技能计数。`
2904
3243
  };
2905
3244
  }
2906
3245
  if (itemConfig2.id === 3 || itemConfig2.id === 5) {
@@ -2920,7 +3259,7 @@ function apply(ctx, config) {
2920
3259
  });
2921
3260
  if (!targetboss || targetboss?.energy === 0) return {
2922
3261
  success: false,
2923
- message: "您无法对目标使用。(目标的能量为0)"
3262
+ message: "您无法对目标使用(目标的能量为0)"
2924
3263
  };
2925
3264
  await ctx.database.set(
2926
3265
  "ggcevo_boss",
@@ -2930,18 +3269,18 @@ function apply(ctx, config) {
2930
3269
  );
2931
3270
  return {
2932
3271
  success: true,
2933
- message: `成功使用 ${itemName},消耗 ${target} 500点能量`
3272
+ message: `成功使用${itemName},消耗${target}500点能量。`
2934
3273
  };
2935
3274
  }
2936
3275
  return {
2937
3276
  success: false,
2938
- message: `${itemName} 效果开发中,无法使用`
3277
+ message: `${itemName} 效果开发中,无法使用。`
2939
3278
  };
2940
3279
  } catch (error) {
2941
3280
  console.error("物品效果处理失败:", error);
2942
3281
  return {
2943
3282
  success: false,
2944
- message: "⚠️ 物品效果处理异常,已回滚操作"
3283
+ message: "⚠️ 物品效果处理异常,已回滚操作。"
2945
3284
  };
2946
3285
  }
2947
3286
  }
@@ -2959,14 +3298,19 @@ function apply(ctx, config) {
2959
3298
  if (currentLevel >= tech.maxLevel) return `❌ ${tech.techname}已达最高等级`;
2960
3299
  const nextLevel = currentLevel + 1;
2961
3300
  const levelData = tech.levels.find((l) => l.level === nextLevel);
2962
- let actualCost = levelData.cost;
3301
+ let originalCost = levelData.cost;
3302
+ let actualCost = originalCost;
3303
+ let discountApplied = false;
3304
+ let discountDetails = [];
2963
3305
  if (careerData.career === "情报副官") {
2964
- actualCost = Math.floor(actualCost * 0.8);
3306
+ discountApplied = true;
3307
+ actualCost = Math.floor(originalCost * 0.8);
3308
+ discountDetails.push("🎖️ 情报副官:20%折扣");
2965
3309
  }
2966
3310
  const [signInfo] = await ctx.database.get("ggcevo_sign", { handle });
2967
3311
  if (signInfo?.totalRewards < actualCost) {
2968
- const originalHint = careerData.career === "情报副官" ? `(原价${levelData.cost})` : "";
2969
- return `❌ 需要 ${actualCost} 金币${originalHint},当前持有:${signInfo?.totalRewards || 0}`;
3312
+ const priceHint = discountApplied ? ` (原价${originalCost}金币)` : "";
3313
+ return `❌ 金币不足!需要${actualCost}金币${priceHint},您当前拥有:${signInfo?.totalRewards || 0}金币`;
2970
3314
  }
2971
3315
  await ctx.database.withTransaction(async () => {
2972
3316
  await ctx.database.set("ggcevo_sign", { handle }, {
@@ -2978,13 +3322,22 @@ function apply(ctx, config) {
2978
3322
  level: nextLevel
2979
3323
  }], ["handle", "techId"]);
2980
3324
  });
2981
- const costLine = careerData.career === "情报副官" ? `💰 花费金币: ${actualCost}(原价${levelData.cost})` : `💰 花费金币: ${actualCost}`;
2982
- const discountHint = careerData.career === "情报副官" ? `📉 情报副官职业加成:20%折扣
2983
- ` : "";
2984
- return `✅ ${tech.techname} 升级至 Lv.${nextLevel}
2985
- ${discountHint}${costLine}
2986
- 📝 ${levelData.description}
2987
- 💼 ${levelData.careerBonus}`;
3325
+ let discountInfo = [];
3326
+ if (discountApplied) {
3327
+ discountInfo = [
3328
+ "折扣明细:",
3329
+ ...discountDetails.map((detail) => `▸ ${detail}`)
3330
+ ];
3331
+ }
3332
+ const costInfo = discountApplied ? `💰 花费金币:${actualCost} (原价${originalCost})` : `💰 花费金币:${actualCost}`;
3333
+ return [
3334
+ `✅ ${tech.techname} 升级至 Lv.${nextLevel}`,
3335
+ costInfo,
3336
+ ...discountInfo,
3337
+ // 插入折扣明细
3338
+ `📝 ${levelData.description}`,
3339
+ `💼 ${levelData.careerBonus}`
3340
+ ].filter(Boolean).join("\n");
2988
3341
  }
2989
3342
  __name(handleTechUpgrade, "handleTechUpgrade");
2990
3343
  async function handleWeaponUpgrade(handle, target) {
@@ -3014,22 +3367,22 @@ ${discountHint}${costLine}
3014
3367
  if (weaponDiscount > 0) {
3015
3368
  totalDiscount += weaponDiscount;
3016
3369
  discountDetails.push(
3017
- `武器系统 Lv${techLevel}${isCareerMatch ? "(科技职业加成)" : ""}:${weaponDiscount}%)`
3370
+ `⚙️ 武器系统 Lv${techLevel}:${weaponDiscount}%折扣`
3018
3371
  );
3019
3372
  }
3020
3373
  }
3021
3374
  const activeWish = await checkFoxBlessing(handle);
3022
3375
  if (activeWish) {
3023
3376
  totalDiscount += 20;
3024
- discountDetails.push("灵狐升运祈愿生效:20%");
3377
+ discountDetails.push("🦊 灵狐升运:20%折扣");
3025
3378
  }
3026
3379
  totalDiscount = Math.min(totalDiscount, 100);
3027
3380
  const discountedCost = baseCost * (100 - totalDiscount) / 100;
3028
3381
  const actualCost = Math.floor(discountedCost);
3029
3382
  const [signInfo] = await ctx.database.get("ggcevo_sign", { handle });
3030
3383
  if (signInfo?.totalRewards < actualCost) {
3031
- const priceInfo2 = totalDiscount > 0 ? `需要 ${actualCost} 金币(原价${baseCost})` : `需要 ${actualCost} 金币`;
3032
- return `❌ ${priceInfo2},当前持有:${signInfo?.totalRewards || 0}`;
3384
+ const priceInfo2 = totalDiscount > 0 ? `需要${actualCost}金币(原价${baseCost}金币)` : `需要${actualCost}金币`;
3385
+ return `❌ ${priceInfo2},您当前拥有:${signInfo?.totalRewards || 0}金币`;
3033
3386
  }
3034
3387
  await ctx.database.withTransaction(async () => {
3035
3388
  await ctx.database.set("ggcevo_sign", { handle }, {
@@ -3055,18 +3408,18 @@ ${discountHint}${costLine}
3055
3408
  const damage = (weaponData.damage * (1 + 0.1 * newLevel)).toFixed(1);
3056
3409
  let msg = `${target} 升级成功!Lv.${newLevel}`;
3057
3410
  const priceInfo = totalDiscount > 0 ? `
3058
- 💸 消耗:${actualCost}金币 (原价${baseCost})` : `
3411
+ 💸 消耗:${actualCost}金币 (原价${baseCost}金币)` : `
3059
3412
  💸 消耗:${actualCost}金币`;
3060
3413
  msg += priceInfo;
3061
3414
  if (discountDetails.length > 0) {
3062
3415
  msg += `
3063
- 🔧 折扣:
3416
+ 💰 折扣明细:
3064
3417
  ${discountDetails.join("\n▸ ")}`;
3065
3418
  }
3066
3419
  msg += `
3067
3420
  💥 伤害:${damage}`;
3068
3421
  msg += `
3069
- 🔩 改装槽:${Math.floor(newLevel / 3) + 1}个`;
3422
+ 🔧 改装槽:${Math.floor(newLevel / 3) + 1}个`;
3070
3423
  return msg;
3071
3424
  }
3072
3425
  __name(handleWeaponUpgrade, "handleWeaponUpgrade");
@@ -3109,26 +3462,30 @@ ${discountDetails.join("\n▸ ")}`;
3109
3462
  const showOriginal = finalPrice < baseCost;
3110
3463
  return [
3111
3464
  `等级 ${level.padEnd(5)}`,
3112
- `▸ 价格: ${finalPrice.toString().padStart(4)}${showOriginal ? ` (原价 ${baseCost})` : ""}`
3465
+ `▸ 价格: ${finalPrice.toString().padStart(4)}${showOriginal ? ` (原价${baseCost})` : ""}`
3113
3466
  ].join("\n");
3114
3467
  });
3115
3468
  const discountNotice = [];
3469
+ if (hasTechDiscount || hasFoxDiscount) {
3470
+ discountNotice.push("💰 当前折扣:");
3471
+ }
3116
3472
  if (hasTechDiscount) {
3117
- discountNotice.push(`🔧 武器系统 Lv${techLevel} (${techDiscountRate}% 折扣)`);
3473
+ discountNotice.push(`⚙️ 武器系统 Lv${techLevel}:${techDiscountRate}%折扣`);
3118
3474
  }
3119
3475
  if (hasFoxDiscount) {
3120
- discountNotice.push("🦊 灵狐升运祈愿 (20% 折扣)");
3476
+ discountNotice.push(`🦊 灵狐升运:20%折扣`);
3121
3477
  }
3122
3478
  if (!hasTechDiscount && !hasFoxDiscount) {
3123
3479
  discountNotice.push("💡 提示:加入人类联盟并升级武器系统可获得折扣");
3124
3480
  }
3125
3481
  return [
3126
3482
  "⚡ 武器升级价格表 ⚡",
3483
+ "使用「升级 武器名称」对武器进行等级升级",
3127
3484
  ...discountNotice,
3485
+ // 现在折扣信息前有标题
3128
3486
  "====================",
3129
3487
  ...priceDetails,
3130
- "====================",
3131
- "使用「升级 武器名称」进行具体升级"
3488
+ "===================="
3132
3489
  ].join("\n");
3133
3490
  }
3134
3491
  __name(generateUpgradePriceList, "generateUpgradePriceList");
@@ -3193,18 +3550,18 @@ ${discountDetails.join("\n▸ ")}`;
3193
3550
  let hiddenWinCount = 0;
3194
3551
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
3195
3552
  if (!profile) {
3196
- return "🔒 需要先绑定游戏句柄";
3553
+ return "🔒 需要先绑定游戏句柄。";
3197
3554
  }
3198
3555
  const { regionId, realmId, profileId } = profile;
3199
3556
  const handle = `${regionId}-S2-${realmId}-${profileId}`;
3200
3557
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
3201
3558
  if (existingEntries.length > 0) {
3202
- return `⛔ 您已被列入黑名单`;
3559
+ return `⛔ 您已被列入黑名单。`;
3203
3560
  }
3204
3561
  const [backpack] = await ctx.database.get("ggcevo_backpack", { handle, itemId: 1 });
3205
3562
  const quantity = backpack?.quantity;
3206
3563
  if (quantity < 1) {
3207
- return "您背包中的咕咕币不足";
3564
+ return "您背包内的咕咕币不足。";
3208
3565
  }
3209
3566
  await ctx.database.upsert("ggcevo_backpack", [{
3210
3567
  handle,
@@ -3219,27 +3576,27 @@ ${discountDetails.join("\n▸ ")}`;
3219
3576
  }
3220
3577
  const [record] = await ctx.database.get("ggcevo_records", { handle });
3221
3578
  return [
3222
- `🎰 您使用了 ${quantity} 枚咕咕币`,
3223
- winCount > 0 ? `🎉 其中获得 ${winCount} 张兑换券!` : "💔 本次未获得任何兑换券",
3579
+ `🎰 您使用了${quantity}枚咕咕币`,
3580
+ winCount > 0 ? `🎉 其中获得${winCount}张兑换券!` : "💔 本次未获得任何兑换券",
3224
3581
  `📊 当前保底进度:${record.pityCounter}/90`,
3225
- ...hiddenWinCount > 0 ? [`🎉 恭喜你抽中隐藏奖励,额外获得 ${hiddenWinCount} 张兑换券和 ${hiddenWinCount} 枚扭蛋币!`] : []
3582
+ ...hiddenWinCount > 0 ? [`🎉 恭喜你抽中隐藏奖励,额外获得${hiddenWinCount}张兑换券和${hiddenWinCount}枚扭蛋币!`] : []
3226
3583
  ].join("\n");
3227
3584
  });
3228
3585
  ctx.command("ggcevo/单抽").action(async (argv) => {
3229
3586
  const session = argv.session;
3230
3587
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
3231
3588
  if (!profile) {
3232
- return "🔒 需要先绑定游戏句柄";
3589
+ return "🔒 需要先绑定游戏句柄。";
3233
3590
  }
3234
3591
  const { regionId, realmId, profileId } = profile;
3235
3592
  const handle = `${regionId}-S2-${realmId}-${profileId}`;
3236
3593
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
3237
3594
  if (existingEntries.length > 0) {
3238
- return `⛔ 您已被列入黑名单`;
3595
+ return `⛔ 您已被列入黑名单。`;
3239
3596
  }
3240
3597
  const [backpack] = await ctx.database.get("ggcevo_backpack", { handle, itemId: 1 });
3241
3598
  if (backpack?.quantity < 1) {
3242
- return "您背包中的咕咕币不足";
3599
+ return "您背包内的咕咕币不足。";
3243
3600
  }
3244
3601
  await ctx.database.upsert("ggcevo_backpack", [{
3245
3602
  handle,
@@ -3251,7 +3608,7 @@ ${discountDetails.join("\n▸ ")}`;
3251
3608
  const [record] = await ctx.database.get("ggcevo_records", { handle });
3252
3609
  return [
3253
3610
  `${result ? "🎉 获得兑换券!" : "❌ 未中奖"} 保底进度:${record.pityCounter}/90`,
3254
- ...HiddenAward2 ? [`🎉 恭喜你抽中隐藏奖励,额外获得 1 张兑换券和 1 枚扭蛋币!`] : []
3611
+ ...HiddenAward2 ? [`🎉 恭喜你抽中隐藏奖励,额外获得1张兑换券和1枚扭蛋币!`] : []
3255
3612
  ].join("\n");
3256
3613
  });
3257
3614
  ctx.command("ggcevo/十连抽").action(async (argv) => {
@@ -3259,17 +3616,17 @@ ${discountDetails.join("\n▸ ")}`;
3259
3616
  let hiddenWinCount = 0;
3260
3617
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
3261
3618
  if (!profile) {
3262
- return "🔒 需要先绑定游戏句柄";
3619
+ return "🔒 需要先绑定游戏句柄。";
3263
3620
  }
3264
3621
  const { regionId, realmId, profileId } = profile;
3265
3622
  const handle = `${regionId}-S2-${realmId}-${profileId}`;
3266
3623
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
3267
3624
  if (existingEntries.length > 0) {
3268
- return `⛔ 您已被列入黑名单`;
3625
+ return `⛔ 您已被列入黑名单。`;
3269
3626
  }
3270
3627
  const [backpack] = await ctx.database.get("ggcevo_backpack", { handle, itemId: 1 });
3271
3628
  if (backpack?.quantity < 10) {
3272
- return "您背包中的咕咕币不足";
3629
+ return "您背包内的咕咕币不足。";
3273
3630
  }
3274
3631
  await ctx.database.upsert("ggcevo_backpack", [{
3275
3632
  handle,
@@ -3287,13 +3644,13 @@ ${discountDetails.join("\n▸ ")}`;
3287
3644
  "十连抽结果:",
3288
3645
  ...results.map((r) => r ? "🎉 获得兑换券" : "❌ 未中奖"),
3289
3646
  `保底进度:${record.pityCounter}/90`,
3290
- ...hiddenWinCount > 0 ? [`🎉 恭喜你抽中隐藏奖励,额外获得 ${hiddenWinCount} 张兑换券和 ${hiddenWinCount} 枚扭蛋币!`] : []
3647
+ ...hiddenWinCount > 0 ? [`🎉 恭喜你抽中隐藏奖励,额外获得${hiddenWinCount}张兑换券和${hiddenWinCount}枚扭蛋币!`] : []
3291
3648
  ].join("\n");
3292
3649
  });
3293
3650
  ctx.command("ggcevo/背包").action(async (argv) => {
3294
3651
  const session = argv.session;
3295
3652
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
3296
- if (!profile) return "🔒 需要先绑定游戏句柄";
3653
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
3297
3654
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
3298
3655
  const items = await ctx.database.get("ggcevo_backpack", { handle });
3299
3656
  const validItems = items.filter((item) => item.quantity > 0);
@@ -3314,11 +3671,11 @@ ${itemDetails.join("\n")}`;
3314
3671
  const session = argv.session;
3315
3672
  let latestTime;
3316
3673
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
3317
- if (!profile) return "🔒 需要先绑定游戏句柄";
3674
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
3318
3675
  const { regionId, realmId, profileId } = profile;
3319
3676
  const handle = `${regionId}-S2-${realmId}-${profileId}`;
3320
3677
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
3321
- if (existingEntries.length > 0) return "⛔ 您已被列入黑名单";
3678
+ if (existingEntries.length > 0) return "⛔ 您已被列入黑名单。";
3322
3679
  const now = /* @__PURE__ */ new Date();
3323
3680
  const currentChinaTime = convertUTCtoChinaTime(now);
3324
3681
  if (config.signrequire) {
@@ -3380,7 +3737,7 @@ ${itemDetails.join("\n")}`;
3380
3737
  const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
3381
3738
  if (careerData?.group === "人类联盟") {
3382
3739
  totalBonus += 0.2;
3383
- messages.push("🏛️ 人类联盟阵营加成:金币+20%");
3740
+ messages.push("🏛️ 人类联盟:+20%金币");
3384
3741
  const [userMiningTech] = await ctx.database.get("ggcevo_tech", { handle, techId: 1 }).catch(() => [{ level: 0 }]);
3385
3742
  const techLevel = Math.min(userMiningTech?.level || 0, 5);
3386
3743
  const miningTechConfig = Spacestationtechnology.find((t) => t.techId === 1);
@@ -3395,22 +3752,22 @@ ${itemDetails.join("\n")}`;
3395
3752
  const finalBonus = Math.max(baseTechBonus, careerTechBonus);
3396
3753
  if (finalBonus > 0) {
3397
3754
  totalBonus += finalBonus / 100;
3398
- messages.push(`⚙️ 采掘系统 Lv${techLevel} 加成:金币+${finalBonus}%`);
3755
+ messages.push(`⚙️ 采掘系统 Lv${techLevel}:+${finalBonus}%金币`);
3399
3756
  }
3400
3757
  }
3401
3758
  if (careerData.career === "深空矿工") {
3402
3759
  totalBonus += 0.5;
3403
- messages.push("⛏️ 深空矿工职业加成:金币+50%");
3760
+ messages.push("🎖️ 深空矿工:+50%金币");
3404
3761
  }
3405
3762
  }
3406
3763
  if (careerData?.group === "辛迪加海盗") {
3407
3764
  const [cred17Item] = await ctx.database.get("ggcevo_warehouse", { handle, itemId: 3 });
3408
3765
  if (cred17Item?.quantity >= 1) {
3409
- const currentGold = record?.totalRewards || 0;
3410
- const additional = Math.min(Math.floor(currentGold / 100), 100);
3411
- const credBonus = 0.5 + additional / 100;
3766
+ const humanPlayersCount = await ctx.database.select("ggcevo_careers").where({ group: "人类联盟" }).execute((row) => import_koishi.$.count(row.handle));
3767
+ const additionalBonus = Math.min(humanPlayersCount, 50);
3768
+ const credBonus = 0.5 + additionalBonus / 100;
3412
3769
  totalBonus += credBonus;
3413
- messages.push(`💎 CRED-17生效:金币+50% 额外+${additional}%`);
3770
+ messages.push(`💎 CRED-17:+50%金币 (${additionalBonus}名人类联盟玩家,额外+${additionalBonus}%金币)`);
3414
3771
  }
3415
3772
  }
3416
3773
  const [meowEffect] = await ctx.database.get("ggcevo_Wish_Record", {
@@ -3423,7 +3780,7 @@ ${itemDetails.join("\n")}`;
3423
3780
  if (meowEffect) {
3424
3781
  tickets *= 2;
3425
3782
  totalBonus += 1;
3426
- messages.push("🐾 喵喵财源祈愿生效:咕咕币×2,金币+100%");
3783
+ messages.push("🐾 喵喵财源:咕咕币+100%,金币+100%");
3427
3784
  }
3428
3785
  const finalPoints = Math.round(basePoints * (1 + totalBonus));
3429
3786
  let redCrystal = 0;
@@ -3439,7 +3796,7 @@ ${itemDetails.join("\n")}`;
3439
3796
  } else {
3440
3797
  redCrystal = 5;
3441
3798
  }
3442
- messages.push(`⚓ 辛迪加财务经理职业加成:获得${redCrystal}枚红晶`);
3799
+ messages.push(`🎖️ 辛迪加财务经理:+${redCrystal}枚红晶`);
3443
3800
  }
3444
3801
  await ctx.database.withTransaction(async () => {
3445
3802
  await ctx.database.upsert("ggcevo_sign", [{
@@ -3476,11 +3833,11 @@ ${itemDetails.join("\n")}`;
3476
3833
  try {
3477
3834
  const session = argv.session;
3478
3835
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
3479
- if (!profile) return "🔒 需要先绑定游戏句柄";
3836
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
3480
3837
  const { regionId, realmId, profileId } = profile;
3481
3838
  const handle = `${regionId}-S2-${realmId}-${profileId}`;
3482
3839
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
3483
- if (existingEntries.length > 0) return "⛔ 您已被列入黑名单";
3840
+ if (existingEntries.length > 0) return "⛔ 您已被列入黑名单。";
3484
3841
  const [record] = await ctx.database.get("ggcevo_sign", { handle });
3485
3842
  if (!record) return "暂未查询到您的签到记录";
3486
3843
  const lastSignChina = convertUTCtoChinaTime(record.lastSign);
@@ -3495,7 +3852,7 @@ ${itemDetails.join("\n")}`;
3495
3852
  }
3496
3853
  const costPoints = 100;
3497
3854
  if (record.totalRewards < costPoints) {
3498
- return `补签需要消耗${costPoints}枚金币,您的金币不足。`;
3855
+ return `补签需要消耗${costPoints}枚金币,您当前拥有:${record.totalRewards}枚金币`;
3499
3856
  }
3500
3857
  const newMonthlyDays = record.monthlyDays + 1;
3501
3858
  let tickets = 3, points = 0;
@@ -3521,7 +3878,7 @@ ${itemDetails.join("\n")}`;
3521
3878
  await ctx.database.set("ggcevo_backpack", { handle, itemId: 1 }, {
3522
3879
  quantity: (backpack?.quantity || 0) + tickets
3523
3880
  });
3524
- const rewardsMessage = points > 0 ? `获得${points}枚金币和${tickets}枚咕咕币` : `获得${tickets}枚咕咕币`;
3881
+ const rewardsMessage = points > 0 ? `获得${points}枚金币和${tickets}枚咕咕币。` : `获得${tickets}枚咕咕币。`;
3525
3882
  return `补签成功!本月累计签到${newMonthlyDays}天,消耗${costPoints}枚金币,${rewardsMessage}`;
3526
3883
  } catch (error) {
3527
3884
  console.error("补签错误:", error);
@@ -3531,13 +3888,13 @@ ${itemDetails.join("\n")}`;
3531
3888
  ctx.guild().command("ggcevo/每月津贴").action(async (argv) => {
3532
3889
  const session = argv.session;
3533
3890
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
3534
- if (!profile) return "🔒 需要先绑定游戏句柄";
3891
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
3535
3892
  const { regionId, realmId, profileId } = profile;
3536
3893
  const handle = `${regionId}-S2-${realmId}-${profileId}`;
3537
3894
  const [backpack] = await ctx.database.get("ggcevo_backpack", { handle, itemId: 1 });
3538
3895
  const memberInfo = await session.event?.member?.roles;
3539
3896
  if (memberInfo?.includes("member")) {
3540
- return "❌ 仅限管理员和群主领取每月津贴";
3897
+ return "❌ 仅限管理员和群主领取每月津贴。";
3541
3898
  }
3542
3899
  const now = /* @__PURE__ */ new Date();
3543
3900
  const chinatime = convertUTCtoChinaTime(now);
@@ -3551,7 +3908,7 @@ ${itemDetails.join("\n")}`;
3551
3908
  const lastYear = lastSignTime.getUTCFullYear();
3552
3909
  const lastMonth = lastSignTime.getUTCMonth();
3553
3910
  if (lastYear === currentYear && lastMonth === currentMonth) {
3554
- return `您的本月管理津贴已领取,${currentMonth + 2}月1日后可再次领取`;
3911
+ return `您的本月管理津贴已领取,${currentMonth + 2}月1日后可再次领取。`;
3555
3912
  }
3556
3913
  }
3557
3914
  await ctx.database.upsert("ggcevo_adminbenefit", [{
@@ -3566,15 +3923,15 @@ ${itemDetails.join("\n")}`;
3566
3923
  itemId: 1,
3567
3924
  quantity: (backpack?.quantity || 0) + 50
3568
3925
  }]);
3569
- return `[管理专属] 成功领取本月津贴,获得了50枚咕咕币!`;
3926
+ return `[管理专属] 您成功领取本月津贴,获得了50枚咕咕币!`;
3570
3927
  });
3571
3928
  ctx.command("ggcevo/领取 [name]").action(async (argv, name2) => {
3572
3929
  const session = argv.session;
3573
3930
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
3574
- if (!profile) return "🔒 需要先绑定游戏句柄";
3931
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
3575
3932
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
3576
3933
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
3577
- if (existingEntries.length > 0) return "⛔ 您已被列入黑名单";
3934
+ if (existingEntries.length > 0) return "⛔ 您已被列入黑名单。";
3578
3935
  if (!name2) {
3579
3936
  await session.send("请在30秒内输入活动名称:");
3580
3937
  name2 = await session.prompt(3e4);
@@ -3655,7 +4012,7 @@ ${itemDetails.join("\n")}`;
3655
4012
  });
3656
4013
  ctx.command("ggcevo/活动列表").action(async ({ session }) => {
3657
4014
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
3658
- if (!profile) return "🔒 需要先绑定游戏句柄";
4015
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
3659
4016
  const activities = await ctx.database.get(
3660
4017
  "ggcevo_activity",
3661
4018
  { status: "进行中" },
@@ -3821,7 +4178,7 @@ ${itemDetails.join("\n")}`;
3821
4178
  });
3822
4179
  ctx.command("ggcevo/胜点榜 [page]").usage("输入 胜点榜 [页码] 查看对应页的排行榜,每页10条").action(async ({ session }, page) => {
3823
4180
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
3824
- if (!profile) return "🔒 需要先绑定游戏句柄";
4181
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
3825
4182
  const pageNum = parseInt(page) || 1;
3826
4183
  if (pageNum < 1) return "请输入有效的页码。";
3827
4184
  const offset = (pageNum - 1) * 10;
@@ -3830,7 +4187,7 @@ ${itemDetails.join("\n")}`;
3830
4187
  ctx.database.select("ggcevo_rank").where({ Blacklist: false, rankseason: config.rankseason }).execute((row) => import_koishi.$.count(row.handle))
3831
4188
  ]);
3832
4189
  const totalPages = Math.ceil(total / 10);
3833
- if (pageNum > totalPages) return `查询失败,最多有 ${totalPages} 页`;
4190
+ if (pageNum > totalPages) return `查询失败,最多有${totalPages}页`;
3834
4191
  const processedRecords = await Promise.all(
3835
4192
  records.map(async (item) => ({
3836
4193
  ...item,
@@ -3993,7 +4350,7 @@ ${itemDetails.join("\n")}`;
3993
4350
  if (!player) {
3994
4351
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
3995
4352
  if (!profile) {
3996
- return "🔒 需要先绑定游戏句柄";
4353
+ return "🔒 需要先绑定游戏句柄。";
3997
4354
  }
3998
4355
  const { regionId, realmId, profileId } = profile;
3999
4356
  const handle = `${regionId}-S2-${realmId}-${profileId}`;
@@ -4009,7 +4366,7 @@ ${itemDetails.join("\n")}`;
4009
4366
  ) + 1;
4010
4367
  const isSafe = await checkSensitiveWord(user.name);
4011
4368
  const displayName = isSafe ? user.name : (user.name[0] || "") + "***";
4012
- return `🎮 咕咕胜点榜排名信息 🎮
4369
+ return `🎮 咕咕排名信息 🎮
4013
4370
  ------------------------------
4014
4371
  昵称:${displayName}
4015
4372
  句柄:${user.handle}
@@ -4043,7 +4400,7 @@ ${itemDetails.join("\n")}`;
4043
4400
  ) + 1;
4044
4401
  const isSafe = await checkSensitiveWord(user.name);
4045
4402
  const displayName = isSafe ? user.name : (user.name[0] || "") + "***";
4046
- return `🎮 咕咕胜点榜排名信息 🎮
4403
+ return `🎮 咕咕排名信息 🎮
4047
4404
  ------------------------------
4048
4405
  昵称:${displayName}
4049
4406
  句柄:${user.handle}
@@ -4069,7 +4426,7 @@ ${itemDetails.join("\n")}`;
4069
4426
  lastSign: signData?.lastSign || /* @__PURE__ */ new Date(0),
4070
4427
  monthlyDays: signData?.monthlyDays || 0
4071
4428
  }]);
4072
- return `成功为 ${handle} 添加 ${parsedAmount} 金币!当前总数:${newTotal}`;
4429
+ return `✅ 成功为 ${handle} 添加 ${parsedAmount} 金币!用户当前总数:${newTotal}`;
4073
4430
  } else if (itemName === "红晶") {
4074
4431
  const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
4075
4432
  const currentRed = careerData?.redcrystal || 0;
@@ -4081,7 +4438,7 @@ ${itemDetails.join("\n")}`;
4081
4438
  career: careerData?.career || "",
4082
4439
  date: careerData?.date || /* @__PURE__ */ new Date()
4083
4440
  }]);
4084
- return `成功为 ${handle} 添加 ${parsedAmount} 红晶!当前总数:${newRed}`;
4441
+ return `✅ 成功为 ${handle} 添加 ${parsedAmount} 红晶!用户当前总数:${newRed}`;
4085
4442
  } else {
4086
4443
  const validItems = Object.keys(initDefaultItems);
4087
4444
  if (!validItems.includes(itemName)) {
@@ -4095,7 +4452,7 @@ ${itemDetails.join("\n")}`;
4095
4452
  itemId,
4096
4453
  quantity: newQuantity
4097
4454
  }], ["handle", "itemId"]);
4098
- return `成功为 ${handle} 添加 ${parsedAmount} 个${itemName}!当前总数:${newQuantity}`;
4455
+ return `✅ 成功为 ${handle} 添加 ${parsedAmount} 个${itemName}!用户当前总数:${newQuantity}`;
4099
4456
  }
4100
4457
  } catch (err) {
4101
4458
  console.error("[给予命令错误]", err);
@@ -4109,7 +4466,7 @@ ${itemDetails.join("\n")}`;
4109
4466
  let handle;
4110
4467
  if (!user) {
4111
4468
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
4112
- if (!profile) return "🔒 需要先绑定游戏句柄";
4469
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
4113
4470
  handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
4114
4471
  } else {
4115
4472
  const parsedUser = import_koishi.h.parse(user)[0];
@@ -4158,11 +4515,11 @@ ${itemDetails.join("\n")}`;
4158
4515
  ctx.command("ggcevo/兑换", "兑换物品").action(async ({ session }) => {
4159
4516
  try {
4160
4517
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
4161
- if (!profile) return "🔒 需要先绑定游戏句柄";
4518
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
4162
4519
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
4163
4520
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
4164
4521
  if (existingEntries.length > 0) {
4165
- return `⛔ 您已被列入黑名单`;
4522
+ return `⛔ 您已被列入黑名单。`;
4166
4523
  }
4167
4524
  const currentSeason = config.rankseason;
4168
4525
  const qualityGroups = {};
@@ -4243,7 +4600,7 @@ ${items.join("、")}
4243
4600
  }
4244
4601
  const [coupon] = await ctx.database.get("ggcevo_backpack", { handle, itemId });
4245
4602
  if (!coupon || coupon.quantity < cost) {
4246
- const requireMsg = petItems.has(name2) ? `需要1个${configname.quality}级宠物扭蛋 或${configname.cost}张兑奖券` : `需要${configname.cost}张兑奖券`;
4603
+ const requireMsg = petItems.has(name2) ? `需要1个${configname.quality}级宠物扭蛋或${configname.cost}张兑奖券` : `需要${configname.cost}张兑奖券`;
4247
4604
  return `${requireMsg}
4248
4605
  您当前持有:${coupon?.quantity || 0}个${couponName}`;
4249
4606
  }
@@ -4266,7 +4623,7 @@ ${items.join("、")}
4266
4623
  season: currentSeason
4267
4624
  });
4268
4625
  });
4269
- return `🎉 恭喜!您使用 ${cost} 个 ${couponName} 兑换了 【${name2}】`;
4626
+ return `🎉 恭喜!您使用${cost}个${couponName}兑换了【${name2}】`;
4270
4627
  } catch (error) {
4271
4628
  console.error("兑换失败:", error);
4272
4629
  return "兑换失败";
@@ -4274,11 +4631,11 @@ ${items.join("、")}
4274
4631
  });
4275
4632
  ctx.command("ggcevo/兑换扭蛋币").action(async ({ session }) => {
4276
4633
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
4277
- if (!profile) return "🔒 需要先绑定游戏句柄";
4634
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
4278
4635
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
4279
4636
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
4280
4637
  if (existingEntries.length > 0) {
4281
- return `⛔ 您已被列入黑名单`;
4638
+ return `⛔ 您已被列入黑名单。`;
4282
4639
  }
4283
4640
  await session.send(`您确定要使用3张兑换券换取一枚扭蛋币吗?(请在30秒内回复“是”确认)`);
4284
4641
  const confirm = await session.prompt(3e4);
@@ -4286,7 +4643,7 @@ ${items.join("、")}
4286
4643
  const [backpack] = await ctx.database.get("ggcevo_backpack", { handle, itemId: 3 });
4287
4644
  const [coupon] = await ctx.database.get("ggcevo_backpack", { handle, itemId: 2 });
4288
4645
  if (!coupon || coupon.quantity < 3) {
4289
- return `兑换扭蛋币需要3张兑奖券,您当前持有:${coupon?.quantity || 0}`;
4646
+ return `兑换扭蛋币需要3张兑奖券,您当前持有:${coupon?.quantity || 0}张兑换券`;
4290
4647
  }
4291
4648
  await ctx.database.set(
4292
4649
  "ggcevo_backpack",
@@ -4298,23 +4655,23 @@ ${items.join("、")}
4298
4655
  itemId: 3,
4299
4656
  quantity: (backpack?.quantity || 0) + 1
4300
4657
  }]);
4301
- return `🎉恭喜!您使用 3 张兑奖券兑换了 1 枚扭蛋币`;
4658
+ return `🎉恭喜!您使用3张兑奖券兑换了1枚扭蛋币`;
4302
4659
  });
4303
4660
  ctx.command("ggcevo/扭蛋").action(async (argv) => {
4304
4661
  const session = argv.session;
4305
4662
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
4306
4663
  if (!profile) {
4307
- return "🔒 需要先绑定游戏句柄";
4664
+ return "🔒 需要先绑定游戏句柄。";
4308
4665
  }
4309
4666
  const { regionId, realmId, profileId } = profile;
4310
4667
  const handle = `${regionId}-S2-${realmId}-${profileId}`;
4311
4668
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
4312
4669
  if (existingEntries.length > 0) {
4313
- return `⛔ 您已被列入黑名单`;
4670
+ return `⛔ 您已被列入黑名单。`;
4314
4671
  }
4315
4672
  const [backpack] = await ctx.database.get("ggcevo_backpack", { handle, itemId: 3 });
4316
4673
  if (!backpack || backpack.quantity < 1) {
4317
- return `当前扭蛋币不足,您拥有:${backpack?.quantity || 0}枚`;
4674
+ return `当前扭蛋币不足,您当前拥有:${backpack?.quantity || 0}枚扭蛋币`;
4318
4675
  }
4319
4676
  const awardName = PetCapsuleToy();
4320
4677
  const awardItem = Object.entries(initDefaultItems).find(
@@ -4336,7 +4693,7 @@ ${items.join("、")}
4336
4693
  itemId: itemData.id,
4337
4694
  quantity: currentQuantity + 1
4338
4695
  }]);
4339
- return `🎉 恭喜!您获得了 ${itemName}`;
4696
+ return `🎉 恭喜!您获得了${itemName}`;
4340
4697
  });
4341
4698
  ctx.command("ggcevo/拉黑 [handle]", "添加用户到黑名单").action(async (argv, handle) => {
4342
4699
  const session = argv.session;
@@ -4401,7 +4758,7 @@ ${items.join("、")}
4401
4758
  const session = argv.session;
4402
4759
  const output = [];
4403
4760
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
4404
- if (!profile) return "🔒 需要先绑定游戏句柄";
4761
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
4405
4762
  const { regionId, realmId, profileId } = profile;
4406
4763
  const handle = `${regionId}-S2-${realmId}-${profileId}`;
4407
4764
  output.push(`🎮 游戏句柄:${handle}
@@ -4459,7 +4816,7 @@ ${items.join("、")}
4459
4816
  lottery && "抽奖",
4460
4817
  exchanges.length && "兑换"
4461
4818
  ].filter(Boolean);
4462
- output.push(`📊 共查询到 ${existModules.length} 类信息`);
4819
+ output.push(`📊 共查询到${existModules.length}类信息`);
4463
4820
  return output.join("\n");
4464
4821
  });
4465
4822
  const processedLobbies = /* @__PURE__ */ new Set();
@@ -4534,11 +4891,11 @@ ${items.join("、")}
4534
4891
  try {
4535
4892
  const session = argv.session;
4536
4893
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
4537
- if (!profile) return "🔒 需要先绑定游戏句柄";
4894
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
4538
4895
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
4539
4896
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
4540
4897
  if (existingEntries.length > 0) {
4541
- return `⛔ 您已被列入黑名单`;
4898
+ return `⛔ 您已被列入黑名单。`;
4542
4899
  }
4543
4900
  if (!user) return "请输入“pk @玩家”。";
4544
4901
  const parsedUser = import_koishi.h.parse(user)[0];
@@ -4589,7 +4946,7 @@ ${items.join("、")}
4589
4946
  const hasProtection = diffInDays < 30;
4590
4947
  const isPKDisabled = targetPKRecord && !targetPKRecord.enable;
4591
4948
  if ((isNewPlayer || isPKDisabled) && hasProtection) {
4592
- return `🛡️ 该玩家是人类联盟成员,尚在30天保护期内(剩余${30 - diffInDays}天),无法挑战`;
4949
+ return `🛡️ 该玩家是人类联盟成员,当前处于30天保护期内(剩余${30 - diffInDays}天),无法PK`;
4593
4950
  }
4594
4951
  }
4595
4952
  let initiatorPK;
@@ -4783,23 +5140,23 @@ ${items.join("、")}
4783
5140
  `🎰 金币变动:${stealPercentage}%`
4784
5141
  ];
4785
5142
  if (targetCareer.group === "人类联盟" && isWin) {
4786
- result.push(`🛡️ 人类联盟保护:${targetRankname} 被动应战的PK失败时仅损失1%的金币`);
5143
+ result.push(`🛡️ 人类联盟:应战者PK失败时仅损失1%的金币`);
4787
5144
  }
4788
5145
  if (computerExpertProtection) {
4789
- result.push(`💻 计算机专家职业加成:${targetRankname} 被动应战的PK失败时不损失金币`);
5146
+ result.push(`💻 计算机专家:应战者PK失败时不损失金币`);
4790
5147
  } else if (isWin) {
4791
5148
  result.push(`💰 您从对方的口袋里抢夺了${goldTransfer}枚金币`);
4792
5149
  } else {
4793
5150
  result.push(`💸 您从口袋里拿出了${goldTransfer}枚金币上交给对方`);
4794
5151
  }
4795
5152
  if (mp3Effect) {
4796
- result.push(`💿 MP3播放器生效:${initiatorRankname} 主动发起的PK失败时上交的金币减少50%`);
5153
+ result.push(`💿 MP3播放器:挑战者PK失败时上交的金币减少50%`);
4797
5154
  }
4798
5155
  if (initiatorCareer?.group === "辛迪加海盗") {
4799
- result.push(`🔴 辛迪加海盗阵营加成:${initiatorRankname} 获得1枚红晶`);
5156
+ result.push(`🔴 辛迪加海盗:+1枚红晶`);
4800
5157
  }
4801
5158
  if (isWin && initiatorCareer?.career === "辛迪加财务经理") {
4802
- result.push(`💰 辛迪加财务经理职业加成:${initiatorRankname} 额外获得1枚红晶`);
5159
+ result.push(`💰 辛迪加财务经理:+1枚红晶`);
4803
5160
  }
4804
5161
  result.push(`📅 剩余挑战次数:${config.dailyPKLimit - (initiatorPK.todayCount + 1)}`);
4805
5162
  return result.join("\n");
@@ -4810,7 +5167,7 @@ ${items.join("、")}
4810
5167
  });
4811
5168
  ctx.command("ggcevo/pk榜 [page]", "查看玩家PK排行榜").usage("输入 pk榜 [页码] 查看对应页的排行榜,每页10条").action(async ({ session }, page) => {
4812
5169
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
4813
- if (!profile) return "🔒 需要先绑定游戏句柄";
5170
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
4814
5171
  const pageNum = parseInt(page) || 1;
4815
5172
  if (pageNum < 1) return "请输入有效的页码。";
4816
5173
  const offset = (pageNum - 1) * 10;
@@ -4860,14 +5217,14 @@ ${items.join("、")}
4860
5217
  const careerDiscount = isCareerMatch ? CAREER_DISCOUNTS[techLevel - 1] : 0;
4861
5218
  techDiscount = Math.max(baseDiscount, careerDiscount);
4862
5219
  if (techDiscount > 0) {
4863
- discountDetails.push(`⚙️ 武器系统 Lv${techLevel}:${techDiscount}%`);
5220
+ discountDetails.push(`⚙️ 武器系统 Lv${techLevel}:${techDiscount}%折扣`);
4864
5221
  }
4865
5222
  }
4866
5223
  }
4867
5224
  let weaponSpecialistDiscount = 0;
4868
5225
  if (careerData?.career === "武器中士") {
4869
5226
  weaponSpecialistDiscount = 20;
4870
- discountDetails.push(`🎖️ 武器中士:20%`);
5227
+ discountDetails.push(`🎖️ 武器中士:20%折扣`);
4871
5228
  }
4872
5229
  const activeWish = await ctx.database.get("ggcevo_Wish_Record", {
4873
5230
  handle,
@@ -4878,7 +5235,7 @@ ${items.join("、")}
4878
5235
  }).then((records) => records[0]);
4879
5236
  let grasshopperDiscount = activeWish ? 20 : 0;
4880
5237
  if (grasshopperDiscount > 0) {
4881
- discountDetails.push(`🦗 蚱蜢优购:${grasshopperDiscount}%`);
5238
+ discountDetails.push(`🦗 蚱蜢优购:${grasshopperDiscount}%折扣`);
4882
5239
  }
4883
5240
  let totalDiscount = techDiscount + weaponSpecialistDiscount + grasshopperDiscount;
4884
5241
  totalDiscount = Math.min(totalDiscount, 100);
@@ -4970,10 +5327,10 @@ ${validTypes.join("、")}`;
4970
5327
  });
4971
5328
  ctx.command("ggcevo/购买 <item>").action(async ({ session }, item) => {
4972
5329
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
4973
- if (!profile) return "🔒 需要先绑定游戏句柄";
5330
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
4974
5331
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
4975
5332
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
4976
- if (existingEntries.length > 0) return "⛔ 您已被列入黑名单";
5333
+ if (existingEntries.length > 0) return "⛔ 您已被列入黑名单。";
4977
5334
  const allItems = { ...weaponConfig, ...SyndicatedItems };
4978
5335
  if (!item) return "请输入“购买 物品名称”来购买所需物品。";
4979
5336
  const config2 = allItems[item];
@@ -5032,7 +5389,7 @@ ${validTypes.join("、")}`;
5032
5389
  if ((signInfo?.totalRewards || 0) < actualPrice) {
5033
5390
  let priceInfo = `需要 ${actualPrice} 金币`;
5034
5391
  if (discountDetails.length > 0) {
5035
- priceInfo += `(原价 ${config2.price})`;
5392
+ priceInfo += `(原价${config2.price})`;
5036
5393
  }
5037
5394
  return `❌ 金币不足,${priceInfo}`;
5038
5395
  }
@@ -5079,7 +5436,7 @@ ${validTypes.join("、")}`;
5079
5436
  `;
5080
5437
  message += `花费 ${actualPrice} 金币`;
5081
5438
  if (discountDetails.length > 0) {
5082
- message += `(原价 ${config2.price} 金币)
5439
+ message += `(原价${config2.price} 金币)
5083
5440
  折扣明细:
5084
5441
  ▸ ${discountDetails.join("\n▸ ")}`;
5085
5442
  }
@@ -5097,7 +5454,7 @@ ${validTypes.join("、")}`;
5097
5454
  });
5098
5455
  ctx.command("ggcevo/武器仓库").action(async ({ session }) => {
5099
5456
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
5100
- if (!profile) return "🔒 需要先绑定游戏句柄";
5457
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
5101
5458
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
5102
5459
  const weapons = await ctx.database.get("ggcevo_equipment", {
5103
5460
  handle
@@ -5129,11 +5486,11 @@ ${validTypes.join("、")}`;
5129
5486
  });
5130
5487
  ctx.command("ggcevo/装备 <weapon>").action(async ({ session }, weapon) => {
5131
5488
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
5132
- if (!profile) return "🔒 需要先绑定游戏句柄";
5489
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
5133
5490
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
5134
5491
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
5135
5492
  if (existingEntries.length > 0) {
5136
- return `⛔ 您已被列入黑名单`;
5493
+ return `⛔ 您已被列入黑名单。`;
5137
5494
  }
5138
5495
  if (!weapon) return "请输入“装备 武器名称”来装备一把你拥有的武器。";
5139
5496
  if (!weaponConfig[weapon]) return "武器名称错误,请输入“装备 武器名称”来装备一把你拥有的武器。";
@@ -5163,10 +5520,10 @@ ${validTypes.join("、")}`;
5163
5520
  });
5164
5521
  ctx.command("ggcevo/升级 <target>", "升级武器或科技").action(async ({ session }, target) => {
5165
5522
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
5166
- if (!profile) return "🔒 需要先绑定游戏句柄";
5523
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
5167
5524
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
5168
5525
  if ((await ctx.database.get("ggcevo_blacklist", { handle })).length) {
5169
- return "⛔ 您已被列入黑名单";
5526
+ return "⛔ 您已被列入黑名单。";
5170
5527
  }
5171
5528
  if (!target) {
5172
5529
  return generateUpgradePriceList(handle);
@@ -5184,10 +5541,10 @@ ${validTypes.join("、")}`;
5184
5541
  });
5185
5542
  ctx.command("ggcevo/改装 <weapon> [mod]", "安装武器模块").action(async ({ session }, weapon, mod) => {
5186
5543
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
5187
- if (!profile) return "🔒 需要先绑定游戏句柄";
5544
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
5188
5545
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
5189
5546
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
5190
- if (existingEntries.length > 0) return "⛔ 您已被列入黑名单";
5547
+ if (existingEntries.length > 0) return "⛔ 您已被列入黑名单。";
5191
5548
  const isValidWeapon = weapon && weaponConfig[weapon]?.id !== void 0;
5192
5549
  const processModInstallation = /* @__PURE__ */ __name(async () => {
5193
5550
  const modInfo = modConfig[mod];
@@ -5311,10 +5668,10 @@ ${validTypes.join("、")}`;
5311
5668
  });
5312
5669
  ctx.command("ggcevo/拆卸 <weapon> <mod>", "卸载武器模块,专属模块返还50%金币,通用模块返还80%金币").action(async ({ session }, weapon, mod) => {
5313
5670
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
5314
- if (!profile) return "🔒 需要先绑定游戏句柄";
5671
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
5315
5672
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
5316
5673
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
5317
- if (existingEntries.length > 0) return "⛔ 您已被列入黑名单";
5674
+ if (existingEntries.length > 0) return "⛔ 您已被列入黑名单。";
5318
5675
  const weaponId = weaponConfig[weapon]?.id;
5319
5676
  if (!weaponId) return "❌ 请输入“拆卸 武器名称 模块名称”\n注意:专属模块返还50%金币,通用模块返还80%金币";
5320
5677
  const modInfo = modConfig[mod];
@@ -5356,10 +5713,10 @@ ${validTypes.join("、")}`;
5356
5713
  let scatterBroadcast = null;
5357
5714
  let cleanerRewardBroadcast = null;
5358
5715
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
5359
- if (!profile) return "🔒 需要先绑定游戏句柄";
5716
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
5360
5717
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
5361
5718
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
5362
- if (existingEntries.length > 0) return "⛔ 您已被列入黑名单";
5719
+ if (existingEntries.length > 0) return "⛔ 您已被列入黑名单。";
5363
5720
  const getActiveBossNames = /* @__PURE__ */ __name(async () => {
5364
5721
  const activeBosses2 = await ctx.database.get("ggcevo_boss", { isActive: true });
5365
5722
  return activeBosses2.map((b) => b.name).join(",");
@@ -5438,6 +5795,7 @@ ${validTypes.join("、")}`;
5438
5795
  let passiveMessages = [];
5439
5796
  let radiationApplied = false;
5440
5797
  let freezing = false;
5798
+ let bileStacks = 0;
5441
5799
  const passiveResult = await PassiveHandler.handlePassives(
5442
5800
  ctx,
5443
5801
  targetBoss,
@@ -5452,8 +5810,9 @@ ${validTypes.join("、")}`;
5452
5810
  currentHP = passiveResult.currentHP;
5453
5811
  initialDamage = passiveResult.initialDamage;
5454
5812
  passiveMessages.push(...passiveResult.messages);
5455
- radiationApplied = passiveResult.radiationApplied;
5456
- freezing = passiveResult.freezing;
5813
+ radiationApplied = passiveResult?.radiationApplied || false;
5814
+ freezing = passiveResult?.freezing || false;
5815
+ bileStacks = passiveResult?.bileStacks || 0;
5457
5816
  if (passiveResult.skillUpdates.length > 0) {
5458
5817
  await PassiveHandler.applySkillUpdates(ctx, passiveResult.skillUpdates);
5459
5818
  }
@@ -5494,6 +5853,17 @@ ${validTypes.join("、")}`;
5494
5853
  progress: (freezingRecord?.progress || 0) + 1
5495
5854
  }], ["handle"]);
5496
5855
  }
5856
+ if (bileStacks >= 10) {
5857
+ const [bileStacksRecord] = await ctx.database.get("ggcevo_task", {
5858
+ handle,
5859
+ taskId: 3
5860
+ });
5861
+ await ctx.database.upsert("ggcevo_task", [{
5862
+ handle,
5863
+ taskId: 3,
5864
+ progress: (bileStacksRecord?.progress || 0) + 1
5865
+ }], ["handle"]);
5866
+ }
5497
5867
  if (isDefeated) {
5498
5868
  if (targetBoss.type === "主宰") {
5499
5869
  await ctx.database.set(
@@ -5522,12 +5892,14 @@ ${validTypes.join("、")}`;
5522
5892
  "🏆 伤害排行榜奖励:",
5523
5893
  ...rewardMessages
5524
5894
  ];
5525
- cleanerRewardBroadcast = await getCleanerRewardBroadcast(
5526
- ctx,
5527
- targetBoss,
5528
- handle,
5529
- session.username
5530
- );
5895
+ if (!(equippedWeapon.installedMods?.includes("光束曲射晶片") && weaponName === "碎骨步枪") && !(weaponName === "中子步枪")) {
5896
+ cleanerRewardBroadcast = await getCleanerRewardBroadcast(
5897
+ ctx,
5898
+ targetBoss,
5899
+ handle,
5900
+ session.username
5901
+ );
5902
+ }
5531
5903
  } else {
5532
5904
  await ctx.database.set(
5533
5905
  "ggcevo_boss",
@@ -5573,12 +5945,14 @@ ${validTypes.join("、")}`;
5573
5945
  }
5574
5946
  }
5575
5947
  bossEventBroadcast = broadcastMessages2;
5576
- cleanerRewardBroadcast = await getCleanerRewardBroadcast(
5577
- ctx,
5578
- targetBoss,
5579
- handle,
5580
- session.username
5581
- );
5948
+ if (!(equippedWeapon.installedMods?.includes("光束曲射晶片") && weaponName === "碎骨步枪") && !(weaponName === "中子步枪")) {
5949
+ cleanerRewardBroadcast = await getCleanerRewardBroadcast(
5950
+ ctx,
5951
+ targetBoss,
5952
+ handle,
5953
+ session.username
5954
+ );
5955
+ }
5582
5956
  }
5583
5957
  } else {
5584
5958
  await ctx.database.set(
@@ -5666,17 +6040,19 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
5666
6040
  isDefeated ? `🎉 恭喜,已成功击败 ${targetBoss.name}!` : ""
5667
6041
  ].filter((line) => line).join("\n");
5668
6042
  await session.send(resultMessage);
6043
+ const isScatterAttack = equippedWeapon.installedMods?.includes("光束曲射晶片") && weaponName === "碎骨步枪" || weaponName === "中子步枪";
5669
6044
  const broadcastMessages = [];
5670
6045
  const groupId = [...config2.groupId];
5671
6046
  if (scatterBroadcast) {
5672
6047
  const scatterMsg = Array.isArray(scatterBroadcast) ? scatterBroadcast.join("\n") : scatterBroadcast;
5673
- broadcastMessages.push(scatterMsg);
6048
+ broadcastMessages.push(`✨ 散射攻击结果
6049
+ ${scatterMsg}`);
5674
6050
  }
5675
6051
  if (bossEventBroadcast) {
5676
6052
  const bossMsg = Array.isArray(bossEventBroadcast) ? bossEventBroadcast.join("\n") : bossEventBroadcast;
5677
6053
  broadcastMessages.push(bossMsg);
5678
6054
  }
5679
- if (cleanerRewardBroadcast && cleanerRewardBroadcast.length > 0) {
6055
+ if (!isScatterAttack && cleanerRewardBroadcast && cleanerRewardBroadcast.length > 0) {
5680
6056
  broadcastMessages.push(cleanerRewardBroadcast.join("\n"));
5681
6057
  }
5682
6058
  if (broadcastMessages.length > 0) {
@@ -5689,10 +6065,10 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
5689
6065
  const parseList = /* @__PURE__ */ __name((str) => str ? str.split(",").map((s) => s.trim()).filter(Boolean) : [], "parseList");
5690
6066
  const tags = parseList(options.tags);
5691
6067
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
5692
- if (!profile) return "🔒 需要先绑定游戏句柄";
6068
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
5693
6069
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
5694
6070
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
5695
- if (existingEntries.length > 0) return "⛔ 您已被列入黑名单";
6071
+ if (existingEntries.length > 0) return "⛔ 您已被列入黑名单。";
5696
6072
  const [equippedWeapon] = await ctx.database.get("ggcevo_equipment", {
5697
6073
  handle,
5698
6074
  equipped: true
@@ -5772,7 +6148,7 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
5772
6148
  const mainBossHpBar = createHpBar(mainBoss.HP, bossGroup.main.maxHP);
5773
6149
  const result = [
5774
6150
  `🔴 主宰:${mainBoss.name}`,
5775
- `❤️ ${mainBossHpBar} (${mainBoss.HP}/${bossGroup.main.maxHP})`
6151
+ `${mainBossHpBar} (${mainBoss.HP}/${bossGroup.main.maxHP})`
5776
6152
  ];
5777
6153
  if (bossGroup.main.energy > 0) {
5778
6154
  result.push(`⚡ 能量:${mainBoss.energy}/1000`);
@@ -5790,7 +6166,7 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
5790
6166
  } else {
5791
6167
  result.push("➤ 无");
5792
6168
  }
5793
- const countingSkill = mainBoss.skills?.find((s) => ["冷适应", "岗哨机枪", "吸血唾液"].includes(s));
6169
+ const countingSkill = mainBoss.skills?.find((s) => ["冷适应", "岗哨机枪", "吸血唾液", "灼烧粘液"].includes(s));
5794
6170
  if (countingSkill) {
5795
6171
  result.push(`📈 ${countingSkill}:${mainBoss.Skillcountpoints}层`);
5796
6172
  }
@@ -5801,8 +6177,8 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
5801
6177
  const minionConfig = bossGroup.minions.find((m) => m.name === minion.name);
5802
6178
  const minionHpBar = createHpBar(minion.HP, minionConfig?.maxHP || 1e3);
5803
6179
  const minionInfo = [
5804
- `👤 ${minion.name}`,
5805
- `❤️ ${minionHpBar} (${minion.HP}/${minionConfig?.maxHP || "未知"})`
6180
+ `❤️ ${minion.name}`,
6181
+ `${minionHpBar} (${minion.HP}/${minionConfig?.maxHP || "未知"})`
5806
6182
  ];
5807
6183
  if (minionConfig && minionConfig.energy > 0) {
5808
6184
  minionInfo.push(`⚡ 能量:${minion.energy}/1000`);
@@ -5866,11 +6242,11 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
5866
6242
  ctx.command("ggcevo/祈愿").action(async (argv) => {
5867
6243
  const session = argv.session;
5868
6244
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
5869
- if (!profile) return "🔒 需要先绑定游戏句柄";
6245
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
5870
6246
  const { regionId, realmId, profileId } = profile;
5871
6247
  const handle = `${regionId}-S2-${realmId}-${profileId}`;
5872
6248
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
5873
- if (existingEntries.length > 0) return "⛔ 您已被列入黑名单";
6249
+ if (existingEntries.length > 0) return "⛔ 您已被列入黑名单。";
5874
6250
  const [sign] = await ctx.database.get("ggcevo_sign", { handle });
5875
6251
  if (!sign || sign.totalRewards < 50) return "需要50金币进行祈愿,您的金币不足。";
5876
6252
  const now = /* @__PURE__ */ new Date();
@@ -5943,12 +6319,12 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
5943
6319
  });
5944
6320
  ctx.command("ggcevo/兑换金币", "使用兑换券兑换金币").action(async ({ session }) => {
5945
6321
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
5946
- if (!profile) return "🔒 需要先绑定游戏句柄";
6322
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
5947
6323
  const { regionId, realmId, profileId } = profile;
5948
6324
  const handle = `${regionId}-S2-${realmId}-${profileId}`;
5949
6325
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
5950
6326
  if (existingEntries.length > 0) {
5951
- return `⛔ 您已被列入黑名单`;
6327
+ return `⛔ 您已被列入黑名单。`;
5952
6328
  }
5953
6329
  await session.send(`请输入你要使用多少张兑换券来兑换金币?(请在30秒内回复数字,回复“0”为取消兑换)
5954
6330
  注意:1张兑换券=2000金币`);
@@ -5982,11 +6358,11 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
5982
6358
  });
5983
6359
  ctx.command("ggcevo/兑换红晶", "使用金币兑换红晶").action(async ({ session }) => {
5984
6360
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
5985
- if (!profile) return "🔒 需要先绑定游戏句柄";
6361
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
5986
6362
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
5987
6363
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
5988
6364
  if (existingEntries.length > 0) {
5989
- return `⛔ 您已被列入黑名单`;
6365
+ return `⛔ 您已被列入黑名单。`;
5990
6366
  }
5991
6367
  const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
5992
6368
  if (!careerData || careerData.group !== "辛迪加海盗") {
@@ -6022,12 +6398,12 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
6022
6398
  });
6023
6399
  ctx.command("ggcevo/加入 <faction>", "加入阵营").alias("加入阵营").action(async ({ session }, faction) => {
6024
6400
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
6025
- if (!profile) return "🔒 需要先绑定游戏句柄";
6401
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
6026
6402
  const { regionId, realmId, profileId } = profile;
6027
6403
  const handle = `${regionId}-S2-${realmId}-${profileId}`;
6028
6404
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
6029
6405
  if (existingEntries.length > 0) {
6030
- return `⛔ 您已被列入黑名单`;
6406
+ return `⛔ 您已被列入黑名单。`;
6031
6407
  }
6032
6408
  const validFactions = ["人类联盟", "辛迪加海盗"];
6033
6409
  if (!faction) return `请输入“加入 阵营名称”加入对应阵营
@@ -6088,11 +6464,11 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
6088
6464
  });
6089
6465
  ctx.command("ggcevo/转职 [profession]", "转职系统").action(async ({ session }, profession) => {
6090
6466
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
6091
- if (!profile) return "🔒 需要先绑定游戏句柄";
6467
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
6092
6468
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
6093
6469
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
6094
6470
  if (existingEntries.length > 0) {
6095
- return `⛔ 您已被列入黑名单`;
6471
+ return `⛔ 您已被列入黑名单。`;
6096
6472
  }
6097
6473
  const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
6098
6474
  if (!careerData) return "请先加入阵营后使用转职功能。";
@@ -6172,7 +6548,7 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
6172
6548
  const [profile] = await ctx.database.get("sc2arcade_player", {
6173
6549
  userId: session.userId
6174
6550
  });
6175
- if (!profile) return "🔒 需要先绑定游戏句柄";
6551
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
6176
6552
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
6177
6553
  const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
6178
6554
  if (!careerData) return "您尚未加入任何阵营。";
@@ -6215,7 +6591,7 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
6215
6591
  });
6216
6592
  ctx.command("ggcevo/黑市 [type]", "辛迪加海盗专属黑市").usage("输入“黑市”查看类型,或“黑市 类型”查看详细").action(async ({ session }, type) => {
6217
6593
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
6218
- if (!profile) return "🔒 需要先绑定游戏句柄";
6594
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
6219
6595
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
6220
6596
  const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
6221
6597
  if (!careerData || careerData.group !== "辛迪加海盗") {
@@ -6231,13 +6607,16 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
6231
6607
  });
6232
6608
  if (!type) {
6233
6609
  return [
6234
- "🏴☠️ 辛迪加黑市 🏴☠️",
6610
+ "🏴 辛迪加黑市 🏴",
6235
6611
  '使用 "黑市 类型名称" 查看详细信息',
6612
+ // 添加计算机专家提示 - 优化为带emoji的分行显示
6613
+ isComputerExpert ? [
6614
+ "💰 当前折扣:",
6615
+ "💻 计算机专家:设备工具类物品50%折扣"
6616
+ ].join("\n") : "",
6236
6617
  "====================",
6237
6618
  ...Object.entries(typeStats).map(([typeName, count]) => `▸ ${typeName} (${count}种)`),
6238
- "====================",
6239
- // 添加计算机专家提示
6240
- isComputerExpert ? "💳 计算机专家可享受设备工具类物品50%折扣!" : ""
6619
+ "===================="
6241
6620
  ].join("\n");
6242
6621
  }
6243
6622
  const normalizedType = Object.keys(typeStats).find((t) => t === type);
@@ -6260,7 +6639,7 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
6260
6639
  }
6261
6640
  infoBlocks.push(
6262
6641
  `描述:${config2.description}`,
6263
- "──────────────"
6642
+ "------------------"
6264
6643
  );
6265
6644
  return infoBlocks.join("\n");
6266
6645
  }),
@@ -6284,26 +6663,33 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
6284
6663
  infoBlocks.push(
6285
6664
  `特殊效果:${item.effects}`,
6286
6665
  `描述:${item.description}`,
6287
- "──────────────"
6666
+ "------------------"
6288
6667
  );
6289
6668
  return infoBlocks.join("\n");
6290
6669
  })
6291
6670
  ];
6671
+ let discountInfo = [];
6672
+ if (isComputerExpert && normalizedType === "设备工具") {
6673
+ discountInfo = [
6674
+ "💰 当前折扣:",
6675
+ "💻 计算机专家:设备工具类物品50%折扣"
6676
+ ];
6677
+ }
6292
6678
  return [
6293
6679
  `🏴☠️ 辛迪加黑市 - ${normalizedType} 🏴☠️`,
6294
- "使用“订购 物品名称”进行购买(仅消耗红晶)",
6295
- // 计算机专家专属提示
6296
- isComputerExpert && normalizedType === "设备工具" ? "💳 计算机专家可享受50%折扣!" : "",
6680
+ '使用"订购 物品名称"进行购买(仅消耗红晶)',
6681
+ // 显示折扣信息(如果有)
6682
+ ...discountInfo,
6297
6683
  "====================",
6298
6684
  ...items
6299
- ].filter(Boolean).join("\n\n");
6685
+ ].filter(Boolean).join("\n");
6300
6686
  });
6301
6687
  ctx.command("ggcevo/订购 <item>").action(async ({ session }, item) => {
6302
6688
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
6303
- if (!profile) return "🔒 需要先绑定游戏句柄";
6689
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
6304
6690
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
6305
6691
  if (await ctx.database.get("ggcevo_blacklist", { handle }).then((r) => r.length)) {
6306
- return "⛔ 您已被列入黑名单";
6692
+ return "⛔ 您已被列入黑名单。";
6307
6693
  }
6308
6694
  const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
6309
6695
  if (!careerData || careerData.group !== "辛迪加海盗") {
@@ -6368,44 +6754,50 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
6368
6754
  }], ["handle", "itemId"]);
6369
6755
  }
6370
6756
  });
6371
- let discountInfo = "";
6372
- if (discountApplied) {
6373
- discountInfo = `
6374
- 💳 计算机专家职业加成:设备工具类物品50%折扣`;
6375
- }
6376
- if (isWeapon) {
6377
- const equippedStatus = await ctx.database.get("ggcevo_equipment", {
6378
- handle,
6379
- weaponId: itemConfig2.id
6380
- }).then((r) => r[0]?.equipped ? "已自动装备武器" : "需手动装备武器");
6381
- return [
6382
- `✅ 成功订购【${item}】!`,
6383
- `消耗红晶:${finalCost}${discountInfo}`,
6384
- `装备状态:${equippedStatus}`,
6385
- '输入 "武器仓库" 管理武器'
6386
- ].join("\n");
6387
- } else {
6388
- const currentStock = await ctx.database.get("ggcevo_warehouse", {
6389
- handle,
6390
- itemId: itemConfig2.id
6391
- }).then((r) => r[0]?.quantity || 1);
6392
- let priceInfo = `消耗红晶:${finalCost}`;
6393
- if (isComputerExpertDiscount) {
6394
- priceInfo += `(原价${originalPrice})`;
6757
+ const buildResponse = /* @__PURE__ */ __name(async () => {
6758
+ const discountLines = [];
6759
+ if (discountApplied) {
6760
+ discountLines.push("💻 计算机专家:设备工具类物品50%折扣");
6395
6761
  }
6396
- priceInfo += discountInfo;
6397
- return [
6398
- `✅ 成功订购【${item}】x1!`,
6399
- priceInfo,
6400
- `当前库存:${currentStock}件`,
6401
- '输入 "仓库" 查看所有物品'
6402
- ].join("\n");
6403
- }
6762
+ const priceInfo = [
6763
+ `消耗红晶:${finalCost}${discountApplied ? ` (原价${originalPrice})` : ""}`
6764
+ ];
6765
+ if (discountApplied) {
6766
+ priceInfo.push("折扣明细:");
6767
+ priceInfo.push(...discountLines);
6768
+ }
6769
+ if (isWeapon) {
6770
+ const equippedStatus = await ctx.database.get("ggcevo_equipment", {
6771
+ handle,
6772
+ weaponId: itemConfig2.id
6773
+ }).then((r) => r[0]?.equipped ? "已自动装备武器" : "需手动装备武器");
6774
+ return [
6775
+ `✅ 成功订购【${item}】!`,
6776
+ ...priceInfo,
6777
+ // 价格和折扣信息显示在一起
6778
+ `装备状态:${equippedStatus}`,
6779
+ '输入 "武器仓库" 管理武器'
6780
+ ].filter(Boolean).join("\n");
6781
+ } else {
6782
+ const currentStock = await ctx.database.get("ggcevo_warehouse", {
6783
+ handle,
6784
+ itemId: itemConfig2.id
6785
+ }).then((r) => r[0]?.quantity || 1);
6786
+ return [
6787
+ `✅ 成功订购【${item}】x1!`,
6788
+ ...priceInfo,
6789
+ // 价格和折扣信息显示在一起
6790
+ `当前库存:${currentStock}件`,
6791
+ '输入 "仓库" 查看所有物品'
6792
+ ].filter(Boolean).join("\n");
6793
+ }
6794
+ }, "buildResponse");
6795
+ return await buildResponse();
6404
6796
  });
6405
6797
  ctx.command("ggcevo/仓库").action(async (argv) => {
6406
6798
  const session = argv.session;
6407
6799
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
6408
- if (!profile) return "🔒 需要先绑定游戏句柄";
6800
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
6409
6801
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
6410
6802
  const [items, signData, careerData] = await Promise.all([
6411
6803
  ctx.database.get("ggcevo_warehouse", { handle }),
@@ -6449,10 +6841,10 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
6449
6841
  ctx.command("ggcevo/使用 [itemName] [target]").action(async (argv, itemName, target) => {
6450
6842
  const session = argv.session;
6451
6843
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
6452
- if (!profile) return "🔒 需要先绑定游戏句柄";
6844
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
6453
6845
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
6454
6846
  if (await ctx.database.get("ggcevo_blacklist", { handle }).then((r) => r.length)) {
6455
- return "⛔ 您已被列入黑名单";
6847
+ return "⛔ 您已被列入黑名单。";
6456
6848
  }
6457
6849
  try {
6458
6850
  if (!itemName) return "请输入“使用 物品名称 (可选目标)”使用仓库中的物品。";
@@ -6479,9 +6871,8 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
6479
6871
  );
6480
6872
  return [
6481
6873
  `✅ 成功使用 ${itemNameConfirmed}`,
6482
- `├ 剩余数量:${newQuantity}`,
6483
- `└ 效果触发:${effectResult.message}`,
6484
- "─".repeat(14)
6874
+ `剩余数量:${newQuantity}`,
6875
+ `效果触发:${effectResult.message}`
6485
6876
  ].join("\n");
6486
6877
  } catch (error) {
6487
6878
  ctx.logger("GGCEVO").error(error);
@@ -6490,7 +6881,7 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
6490
6881
  });
6491
6882
  ctx.command("ggcevo/科技 [techName]", "查看空间站科技信息").usage("输入“科技”查看列表,或“科技 科技名称”查看详细信息").action(async ({ session }, techName) => {
6492
6883
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
6493
- if (!profile) return "🔒 需要先绑定游戏句柄";
6884
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
6494
6885
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
6495
6886
  const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
6496
6887
  if (!careerData || careerData.group !== "人类联盟") {
@@ -6505,11 +6896,13 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
6505
6896
  return [
6506
6897
  "🛰️ 空间站科技系统 🛰️",
6507
6898
  '使用 "科技 科技名称" 查看详细信息',
6899
+ isIntelligenceOfficer ? [
6900
+ "💰 当前折扣:",
6901
+ "🎖️ 情报副官:20%"
6902
+ ].join("\n") : "",
6508
6903
  "====================",
6509
6904
  ...techList,
6510
- "====================",
6511
- isIntelligenceOfficer && "※ 情报副官享受20%升级折扣"
6512
- // 新增折扣提示
6905
+ "===================="
6513
6906
  ].filter(Boolean).join("\n");
6514
6907
  }
6515
6908
  const tech = Spacestationtechnology.find(
@@ -6530,22 +6923,29 @@ ${Spacestationtechnology.map((t) => t.techname).join("、")}`;
6530
6923
  "------------------"
6531
6924
  ].join("\n");
6532
6925
  });
6926
+ let discountInfo = [];
6927
+ if (isIntelligenceOfficer) {
6928
+ discountInfo = [
6929
+ "💰 当前折扣:",
6930
+ "🎖️ 情报副官:20%"
6931
+ ];
6932
+ }
6533
6933
  return [
6534
6934
  `🛠️ ${tech.techname} 科技详情 🛠️`,
6535
6935
  `最大可升级等级:${romanNumerals[tech.maxLevel]}`,
6536
6936
  '使用 "升级 科技名称" 进行升级',
6937
+ ...discountInfo,
6938
+ // 插入折扣信息
6537
6939
  "====================",
6538
- ...techDetails,
6539
- isIntelligenceOfficer && "※ 情报副官享受20%升级折扣"
6540
- // 新增折扣提示
6940
+ ...techDetails
6541
6941
  ].filter(Boolean).join("\n");
6542
6942
  });
6543
6943
  ctx.command("ggcevo/挖矿").action(async ({ session }) => {
6544
6944
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
6545
- if (!profile) return "🔒 需要先绑定游戏句柄";
6945
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
6546
6946
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
6547
6947
  if (await ctx.database.get("ggcevo_blacklist", { handle }).then((r) => r.length)) {
6548
- return "⛔ 您已被列入黑名单";
6948
+ return "⛔ 您已被列入黑名单。";
6549
6949
  }
6550
6950
  const [career] = await ctx.database.get("ggcevo_careers", { handle });
6551
6951
  if (!career || career.group !== "人类联盟") {
@@ -6652,16 +7052,16 @@ ${Spacestationtechnology.map((t) => t.techname).join("、")}`;
6652
7052
  `类型: ${task2.type}`,
6653
7053
  `目标: ${task2.target}次`,
6654
7054
  `奖励: ${task2.price}金币`,
6655
- `进度: ${completionStatus}`
7055
+ `进度: ${completionStatus}`,
7056
+ "------------------"
6656
7057
  ].join("\n"));
6657
7058
  }
6658
7059
  return [
6659
7060
  "📋 任务列表",
6660
7061
  '使用"任务 任务名称"查看详细任务信息',
6661
7062
  "====================",
6662
- ...taskList,
6663
- "===================="
6664
- ].join("\n\n");
7063
+ ...taskList
7064
+ ].join("\n");
6665
7065
  }
6666
7066
  const task = Object.entries(Tasklist).find(
6667
7067
  ([taskName]) => taskName === name2
@@ -6682,10 +7082,10 @@ ${Spacestationtechnology.map((t) => t.techname).join("、")}`;
6682
7082
  `任务奖励: ${task.price}金币`,
6683
7083
  `当前进度: ${progress}/${task.target}`,
6684
7084
  `累计完成: ${completions}次`,
6685
- "-------------------",
7085
+ "------------------",
6686
7086
  "任务描述:",
6687
7087
  task.description,
6688
- "-------------------",
7088
+ "------------------",
6689
7089
  "完成条件:",
6690
7090
  task.condition,
6691
7091
  "====================",
@@ -6697,7 +7097,7 @@ ${Spacestationtechnology.map((t) => t.techname).join("、")}`;
6697
7097
  if (!profile) return "⚠️ 需要先绑定游戏句柄";
6698
7098
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
6699
7099
  if (await ctx.database.get("ggcevo_blacklist", { handle }).then((r) => r.length)) {
6700
- return "⛔ 您已被列入黑名单";
7100
+ return "⛔ 您已被列入黑名单。";
6701
7101
  }
6702
7102
  const taskEntry = Object.entries(Tasklist).find(
6703
7103
  ([taskName2]) => taskName2.includes(name2)