koishi-plugin-ggcevo-game 1.3.61 → 1.3.63

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 +655 -332
  2. package/package.json +1 -1
package/lib/index.js CHANGED
@@ -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,
@@ -721,6 +721,30 @@ function apply(ctx, config) {
721
721
  "能量黑洞": {
722
722
  effect: 0,
723
723
  description: "存在“能量黑洞”,受到的伤害-10%; 每拥有一层“寒冷”,受到的伤害+5%"
724
+ },
725
+ "火焰异形": {
726
+ effect: 0,
727
+ description: "免疫火焰伤害,受到火焰伤害时会回复生命值"
728
+ },
729
+ "庞兽狂暴": {
730
+ effect: 0,
731
+ description: "血量低于50%后,进入狂暴状态,受到的伤害-50%"
732
+ },
733
+ "灼烧粘液": {
734
+ effect: 0,
735
+ description: "受到伤害后,会获得一层“胆汁”; 若存在“胆汁”层数下受到火焰攻击,将立刻引爆并使受到的伤害+100%,同时层数清零"
736
+ },
737
+ "腐蚀胆汁": {
738
+ effect: 0,
739
+ description: "当“胆汁”达到5层时,发射灼热强酸爆蛋并清空层数,治愈所有存活的异形500点血量"
740
+ },
741
+ "火焰吐息": {
742
+ effect: 0,
743
+ description: "当“胆汁”达到10层时,发射灼热强酸爆蛋并清空层数,治愈所有存活的异形20%最大生命值"
744
+ },
745
+ "太阳耀斑": {
746
+ effect: 0,
747
+ description: "当所有子代阵亡后,自身移除“惧寒”标签和“孤立无援”并免疫寒冷伤害"
724
748
  }
725
749
  };
726
750
  const defineBoss = /* @__PURE__ */ __name((config2) => config2, "defineBoss");
@@ -874,6 +898,27 @@ function apply(ctx, config) {
874
898
  passive: asPassives(["弱化形态", "电能导体", "能量虹吸", "能量黑洞"])
875
899
  }
876
900
  ]
901
+ }),
902
+ defineBoss({
903
+ main: {
904
+ id: 7,
905
+ name: "烈焰庞兽",
906
+ type: "主宰",
907
+ maxHP: 2e4,
908
+ energy: 0,
909
+ tags: asBossTags(["重甲", "生物", "惧寒", "重型", "异形"]),
910
+ passive: asPassives(["火焰异形", "庞兽狂暴", "灼烧粘液", "火焰吐息", "太阳耀斑"])
911
+ },
912
+ minions: [
913
+ {
914
+ name: "火焰甲虫",
915
+ type: "子代",
916
+ maxHP: 5e3,
917
+ energy: 0,
918
+ tags: asBossTags(["重甲", "生物", "惧寒", "异形"]),
919
+ passive: asPassives(["弱化形态", "火焰异形", "灼烧粘液", "腐蚀胆汁"])
920
+ }
921
+ ]
877
922
  })
878
923
  ];
879
924
  const spaceStationCrewConfig = [
@@ -900,7 +945,7 @@ function apply(ctx, config) {
900
945
  },
901
946
  {
902
947
  professionName: "武器中士",
903
- effect: "攻击伤害+15%",
948
+ effect: "攻击伤害+15%; 购买武器(非传奇)享有20%的折扣",
904
949
  requirements: "当期伤害榜累计造成100及以上伤害",
905
950
  Jobtransfer: true,
906
951
  costcoins: 2e3
@@ -914,7 +959,7 @@ function apply(ctx, config) {
914
959
  },
915
960
  {
916
961
  professionName: "情报副官",
917
- effect: "升级空间站科技花费的金币是原价的80%",
962
+ effect: "升级空间站科技享有20%的折扣",
918
963
  requirements: "至少一个空间站科技等级≥3级",
919
964
  Jobtransfer: true,
920
965
  costcoins: 3e3
@@ -1259,7 +1304,7 @@ function apply(ctx, config) {
1259
1304
  __name(checkCritRhythm, "checkCritRhythm");
1260
1305
  async function calculateTagMultiplier(weaponData, tags, equippedWeapon) {
1261
1306
  const MOD_EFFECTS = [
1262
- { mod: "裂甲核心", tag: "重甲", value: 1.2 },
1307
+ { mod: "裂甲核心", tag: "重甲", value: 1.5 },
1263
1308
  { mod: "助燃核心", tag: "惧热", value: 3 },
1264
1309
  { mod: "助燃核心", tag: "生物", value: 2 }
1265
1310
  ];
@@ -1315,28 +1360,28 @@ function apply(ctx, config) {
1315
1360
  let message = "";
1316
1361
  if (careerData?.career === "警卫长") {
1317
1362
  value += 0.05;
1318
- message = "⚔️ 职业加成:警卫长(攻击伤害+5%)";
1363
+ message = "⚔️ 警卫长:攻击伤害+5%";
1319
1364
  }
1320
1365
  if (careerData?.career === "武器中士") {
1321
1366
  value += 0.15;
1322
- message = "⚔️ 职业加成:武器中士(攻击伤害+15%)";
1367
+ message = "⚔️ 武器中士:攻击伤害+15%";
1323
1368
  }
1324
1369
  if (careerData?.career === "能量武器专家") {
1325
1370
  if (weaponType === "能量武器") {
1326
1371
  value += 0.2;
1327
- message = "⚔️ 职业加成:能量武器专家(能量武器伤害+20%)";
1372
+ message = "⚔️ 能量武器专家:能量武器攻击伤害+20%";
1328
1373
  }
1329
1374
  }
1330
1375
  if (careerData?.career === "纵火狂") {
1331
1376
  if (weaponType === "热能武器") {
1332
1377
  value += 0.2;
1333
- message = "⚔️ 职业加成:纵火狂(热能武器伤害+20%)";
1378
+ message = "⚔️ 纵火狂:热能武器攻击伤害+20%";
1334
1379
  }
1335
1380
  }
1336
1381
  if (careerData?.career === "猩红杀手") {
1337
1382
  if (weaponId === 7) {
1338
1383
  value += 0.15;
1339
- message = "⚔️ 职业加成:猩红杀手(侦察步枪伤害+15%)";
1384
+ message = "⚔️ 猩红杀手:侦察步枪攻击伤害+15%";
1340
1385
  }
1341
1386
  }
1342
1387
  return { value, message };
@@ -1353,7 +1398,7 @@ function apply(ctx, config) {
1353
1398
  });
1354
1399
  if (sovereign) {
1355
1400
  value += 0.05;
1356
- messages.push("👑 王权增幅(攻击伤害+5%)");
1401
+ messages.push("👑 王权增幅:攻击伤害+5%");
1357
1402
  }
1358
1403
  const [lament] = await ctx2.database.get("ggcevo_Wish_Record", {
1359
1404
  handle,
@@ -1364,7 +1409,7 @@ function apply(ctx, config) {
1364
1409
  if (lament) {
1365
1410
  const levelBonus = 0.1 * (weapon.level + 1);
1366
1411
  value += levelBonus;
1367
- messages.push(`🗡️ 悲鸣之锋(攻击伤害+${Math.round(levelBonus * 100)}%)`);
1412
+ messages.push(`🗡️ 悲鸣之锋:攻击伤害+${Math.round(levelBonus * 100)}%`);
1368
1413
  }
1369
1414
  const [critRhythm] = await ctx2.database.get("ggcevo_Wish_Record", {
1370
1415
  handle,
@@ -1373,7 +1418,7 @@ function apply(ctx, config) {
1373
1418
  endTime: { $gte: /* @__PURE__ */ new Date() }
1374
1419
  });
1375
1420
  if (critRhythm) {
1376
- messages.push("🎵 暴击韵律(攻击暴击率+20%)");
1421
+ messages.push("🎵 暴击韵律:攻击暴击率+20%");
1377
1422
  }
1378
1423
  return {
1379
1424
  value,
@@ -1582,7 +1627,7 @@ function apply(ctx, config) {
1582
1627
  updatedHP: Math.min(targetBoss.HP + healAmount, maxHP),
1583
1628
  initialDamage: 0,
1584
1629
  // 直接设置伤害为0
1585
- messages: [`❄️ 【冰霜进化】生效:免疫冰霜伤害,${targetBoss.name}回复 ${healAmount} 生命值`]
1630
+ messages: [`❄️ 【冰霜进化】生效:免疫寒冷伤害,${targetBoss.name}回复${healAmount}生命值`]
1586
1631
  };
1587
1632
  }
1588
1633
  return null;
@@ -1695,7 +1740,7 @@ function apply(ctx, config) {
1695
1740
  if (!effect) return null;
1696
1741
  return {
1697
1742
  updatedHP: effect.heal,
1698
- messages: [`【${effect.skill}】生效,${targetBoss.name}瞬间回复${effect.heal}生命值!`],
1743
+ messages: [`【${effect.skill}】生效,${targetBoss.name}濒死时瞬间回复${effect.heal}生命值`],
1699
1744
  skillUpdates: [{
1700
1745
  name: targetBoss.name,
1701
1746
  remove: [effect.skill]
@@ -1710,7 +1755,7 @@ function apply(ctx, config) {
1710
1755
  return {
1711
1756
  damageMultiplier: -0.5,
1712
1757
  // 50% 减伤
1713
- messages: ["🛡️ 【感染空间站】生效:空间站哨枪塔存活,受到的伤害减少50%"]
1758
+ messages: ["🛡️ 【感染空间站】生效:空间站哨枪塔存活时,受到的伤害-50%"]
1714
1759
  };
1715
1760
  }
1716
1761
  return null;
@@ -1815,10 +1860,10 @@ function apply(ctx, config) {
1815
1860
  handleStructuralArmor: /* @__PURE__ */ __name((targetBoss, weaponData) => {
1816
1861
  if (!targetBoss.skills.includes("结构装甲")) return null;
1817
1862
  let reduction = 0.2;
1818
- let msg = "常规武器减伤20%";
1863
+ let msg = "受到常规武器伤害-20%";
1819
1864
  if (weaponData.type === "热能武器") {
1820
1865
  reduction = 0.4;
1821
- msg = "热能武器减伤40%";
1866
+ msg = "受到热能武器伤害-40%";
1822
1867
  }
1823
1868
  return {
1824
1869
  damageMultiplier: -reduction,
@@ -1841,7 +1886,7 @@ function apply(ctx, config) {
1841
1886
  }
1842
1887
  if (targetBoss.skills.includes("嗜血狂暴") && currentHP / maxHP < 0.5) {
1843
1888
  damageMultiplier -= 0.2;
1844
- messages.push(`🔥 【嗜血狂暴】生效:血量低于50%,进入狂暴状态,受到的伤害-20%`);
1889
+ messages.push(`🔥 【嗜血狂暴】生效:进入狂暴状态,受到的伤害-20%`);
1845
1890
  }
1846
1891
  if (targetBoss.skills.includes("吐血") && bloodStacks < 1) {
1847
1892
  damageMultiplier += 0.2;
@@ -1874,7 +1919,7 @@ function apply(ctx, config) {
1874
1919
  }
1875
1920
  newStacks = Math.min(newStacks, 20);
1876
1921
  if (oldStacks < 20 && newStacks >= 20) {
1877
- messages.push(`🩸 “吸血”层数达到${newStacks},下次受到攻击将触发【进食】`);
1922
+ messages.push(`🩸 “吸血”达到${newStacks}层,下次受到攻击将触发【进食】`);
1878
1923
  }
1879
1924
  await ctx2.database.set("ggcevo_boss", { name: targetBoss.name }, { Skillcountpoints: newStacks });
1880
1925
  return { updatedHP, messages };
@@ -2063,7 +2108,7 @@ function apply(ctx, config) {
2063
2108
  return {
2064
2109
  immune: true,
2065
2110
  messages: [
2066
- `🛡️ 【电能立场】生效:成功免疫伤害!`
2111
+ `🛡️ 【电能立场】生效:免疫非寒冷伤害!`
2067
2112
  ]
2068
2113
  };
2069
2114
  }
@@ -2120,7 +2165,7 @@ function apply(ctx, config) {
2120
2165
  await Promise.all(updates);
2121
2166
  return {
2122
2167
  messages: [
2123
- `❤️ 【脉冲】生效:治疗全体异形!`,
2168
+ `❤️ 【脉冲】生效:治疗全体异形`,
2124
2169
  ...healMessages
2125
2170
  ]
2126
2171
  };
@@ -2142,7 +2187,7 @@ function apply(ctx, config) {
2142
2187
  { name: targetBoss.name },
2143
2188
  { energy: newEnergy }
2144
2189
  );
2145
- messages.push(`⚡ 【弧焊枪】触发特效:消耗目标${energyDrain}点能量`);
2190
+ messages.push(`⚡ 【弧焊枪】触发特效:消耗目标200点能量`);
2146
2191
  } else {
2147
2192
  return null;
2148
2193
  }
@@ -2169,6 +2214,184 @@ function apply(ctx, config) {
2169
2214
  return null;
2170
2215
  }
2171
2216
  }, "handleParticlePhaseEffect"),
2217
+ // 火焰异形处理(免疫火焰伤害)
2218
+ handleFlameCreature: /* @__PURE__ */ __name(function(targetBoss, weaponName, damage, maxHP) {
2219
+ if (targetBoss.skills.includes("火焰异形") && weaponName === "焚烧枪") {
2220
+ const healAmount = damage;
2221
+ return {
2222
+ updatedHP: Math.min(targetBoss.HP + healAmount, maxHP),
2223
+ initialDamage: 0,
2224
+ messages: [`🔥 【火焰异形】生效:免疫火焰伤害,${targetBoss.name}回复${healAmount}生命值`]
2225
+ };
2226
+ }
2227
+ return null;
2228
+ }, "handleFlameCreature"),
2229
+ // 庞兽狂暴处理(每次攻击时检测血量)
2230
+ handleTitanRage: /* @__PURE__ */ __name(function(targetBoss, currentHP, maxHP) {
2231
+ if (!targetBoss.skills.includes("庞兽狂暴")) return null;
2232
+ const hpPercent = currentHP / maxHP;
2233
+ const isBelowThreshold = hpPercent < 0.5;
2234
+ if (isBelowThreshold) {
2235
+ return {
2236
+ damageMultiplier: -0.5,
2237
+ messages: [`🔥 【庞兽狂暴】生效:进入狂暴状态,受到的伤害-50%`]
2238
+ };
2239
+ }
2240
+ return null;
2241
+ }, "handleTitanRage"),
2242
+ // 胆汁效果处理(返回伤害调整系数)
2243
+ handleBileEffects: /* @__PURE__ */ __name(function(targetBoss, weaponName, initialDamage) {
2244
+ if (!targetBoss.skills.includes("灼烧粘液")) return null;
2245
+ const bileLayers = targetBoss.Skillcountpoints || 0;
2246
+ const messages = [];
2247
+ let currentDamage = initialDamage;
2248
+ if (weaponName === "焚烧枪" && bileLayers > 0) {
2249
+ currentDamage *= 2;
2250
+ messages.push(`🔥 【灼烧粘液】引爆:已有${bileLayers}层胆汁,本次伤害+100%`);
2251
+ return {
2252
+ messages,
2253
+ clearBile: true,
2254
+ currentDamage
2255
+ };
2256
+ }
2257
+ return null;
2258
+ }, "handleBileEffects"),
2259
+ // 胆汁叠层和效果触发处理
2260
+ handleBileCount: /* @__PURE__ */ __name(async function(ctx2, targetBoss, weaponName, bossGroup) {
2261
+ if (!targetBoss.skills.includes("灼烧粘液")) return null;
2262
+ const maxBile = targetBoss.type === "主宰" ? 10 : 5;
2263
+ const messages = [];
2264
+ const updates = [];
2265
+ const currentBile = targetBoss.Skillcountpoints || 0;
2266
+ if (currentBile >= 5 && targetBoss.skills.includes("腐蚀胆汁")) {
2267
+ await this.triggerCorrosiveBile(ctx2, targetBoss, bossGroup);
2268
+ updates.push(
2269
+ ctx2.database.set(
2270
+ "ggcevo_boss",
2271
+ { name: targetBoss.name },
2272
+ { Skillcountpoints: 0 }
2273
+ )
2274
+ );
2275
+ messages.push(`💚 【腐蚀胆汁】触发:胆汁达到5层,治愈所有存活的异形500点血量`);
2276
+ } else if (currentBile >= 10 && targetBoss.skills.includes("火焰吐息")) {
2277
+ await this.triggerFlamingBreath(ctx2, targetBoss, bossGroup);
2278
+ updates.push(
2279
+ ctx2.database.set(
2280
+ "ggcevo_boss",
2281
+ { name: targetBoss.name },
2282
+ { Skillcountpoints: 0 }
2283
+ )
2284
+ );
2285
+ messages.push(`🔥 【火焰吐息】触发:胆汁达到10层,治愈所有存活的异形20%最大生命值`);
2286
+ }
2287
+ if (updates.length > 0) {
2288
+ await Promise.all(updates);
2289
+ return { messages };
2290
+ }
2291
+ if (weaponName !== "焚烧枪" && currentBile < maxBile) {
2292
+ const newBile = currentBile + 1;
2293
+ updates.push(
2294
+ ctx2.database.set(
2295
+ "ggcevo_boss",
2296
+ { name: targetBoss.name },
2297
+ { Skillcountpoints: newBile }
2298
+ )
2299
+ );
2300
+ messages.push(`🟢 【灼烧粘液】生效:获得1层胆汁(当前${newBile}/${maxBile}层)`);
2301
+ if (newBile === 5 && targetBoss.skills.includes("腐蚀胆汁")) {
2302
+ messages.push(`💚 层数达到5层,下次受到攻击将触发【腐蚀胆汁】效果`);
2303
+ } else if (newBile === 10 && targetBoss.skills.includes("火焰吐息")) {
2304
+ messages.push(`🔥 层数达到10层,下次受到攻击将触发【火焰吐息】效果`);
2305
+ }
2306
+ }
2307
+ if (updates.length > 0) {
2308
+ await Promise.all(updates);
2309
+ }
2310
+ return { messages };
2311
+ }, "handleBileCount"),
2312
+ // 触发腐蚀胆汁效果
2313
+ triggerCorrosiveBile: /* @__PURE__ */ __name(async function(ctx2, targetBoss, bossGroup) {
2314
+ const updates = [];
2315
+ const activeMembers = await ctx2.database.get("ggcevo_boss", {
2316
+ groupId: targetBoss.groupId,
2317
+ isActive: true
2318
+ });
2319
+ for (const member of activeMembers) {
2320
+ const memberConfig = this.getMemberConfig(member.name, bossGroup);
2321
+ if (!memberConfig) continue;
2322
+ const maxHP = memberConfig.maxHP;
2323
+ const healAmount = 500;
2324
+ const newHP = Math.min(member.HP + healAmount, maxHP);
2325
+ updates.push(
2326
+ ctx2.database.set(
2327
+ "ggcevo_boss",
2328
+ { name: member.name },
2329
+ { HP: newHP }
2330
+ )
2331
+ );
2332
+ }
2333
+ if (updates.length > 0) {
2334
+ await Promise.all(updates);
2335
+ }
2336
+ }, "triggerCorrosiveBile"),
2337
+ // 触发火焰吐息效果
2338
+ triggerFlamingBreath: /* @__PURE__ */ __name(async function(ctx2, targetBoss, bossGroup) {
2339
+ const updates = [];
2340
+ const activeMembers = await ctx2.database.get("ggcevo_boss", {
2341
+ groupId: targetBoss.groupId,
2342
+ isActive: true
2343
+ });
2344
+ for (const member of activeMembers) {
2345
+ const memberConfig = this.getMemberConfig(member.name, bossGroup);
2346
+ if (!memberConfig) continue;
2347
+ const maxHP = memberConfig.maxHP;
2348
+ const healAmount = Math.floor(maxHP * 0.2);
2349
+ const newHP = Math.min(member.HP + healAmount, maxHP);
2350
+ updates.push(
2351
+ ctx2.database.set(
2352
+ "ggcevo_boss",
2353
+ { name: member.name },
2354
+ { HP: newHP }
2355
+ )
2356
+ );
2357
+ }
2358
+ if (updates.length > 0) {
2359
+ await Promise.all(updates);
2360
+ }
2361
+ }, "triggerFlamingBreath"),
2362
+ // 太阳耀斑处理(每次受到攻击时检测)
2363
+ handleSolarFlare: /* @__PURE__ */ __name(async function(ctx2, targetBoss, weaponName, activeBosses) {
2364
+ if (!targetBoss.skills.includes("太阳耀斑")) return null;
2365
+ const minionDead = activeBosses.every(
2366
+ (boss) => boss.groupId === targetBoss.groupId && boss.type === "子代" && (!boss.isActive || boss.HP <= 0)
2367
+ );
2368
+ if (!minionDead) return null;
2369
+ const messages = [];
2370
+ let immuneCold = false;
2371
+ if (targetBoss.tags.includes("惧寒")) {
2372
+ const newTags = targetBoss.tags.filter((tag) => tag !== "惧寒");
2373
+ await ctx2.database.set(
2374
+ "ggcevo_boss",
2375
+ { name: targetBoss.name },
2376
+ { tags: newTags }
2377
+ );
2378
+ messages.push(`☀️ 【太阳耀斑】降临:所有子代阵亡,${targetBoss.name}移除「惧寒」标签`);
2379
+ }
2380
+ if (targetBoss.skills.includes("孤立无援")) {
2381
+ const newSkills = targetBoss.skills.filter((skill) => skill !== "孤立无援");
2382
+ await ctx2.database.set(
2383
+ "ggcevo_boss",
2384
+ { name: targetBoss.name },
2385
+ { skills: newSkills }
2386
+ );
2387
+ messages.push(`${targetBoss.name}移除【孤立无援】效果`);
2388
+ }
2389
+ if (weaponName === "零度之下" && !targetBoss.tags.includes("惧寒")) {
2390
+ immuneCold = true;
2391
+ messages.push(`☀️ 【太阳耀斑】生效:免疫寒冷伤害`);
2392
+ }
2393
+ return { immuneCold, messages };
2394
+ }, "handleSolarFlare"),
2172
2395
  // 统一处理被动技能
2173
2396
  handlePassives: /* @__PURE__ */ __name(async function(ctx2, targetBoss, initialDamage, currentHP, maxHP, weaponName, weaponData, activeBosses, bossGroup) {
2174
2397
  let messages = [];
@@ -2206,6 +2429,31 @@ function apply(ctx, config) {
2206
2429
  };
2207
2430
  }
2208
2431
  }
2432
+ const solarFlareResult = await this.handleSolarFlare(ctx2, targetBoss, weaponName, activeBosses);
2433
+ if (solarFlareResult?.immuneCold && weaponName === "零度之下") {
2434
+ messages.push(...solarFlareResult.messages);
2435
+ return {
2436
+ currentHP,
2437
+ messages,
2438
+ initialDamage: 0
2439
+ };
2440
+ }
2441
+ const bileDetonationResult = await this.handleBileEffects(targetBoss, weaponName, initialDamage);
2442
+ if (bileDetonationResult) {
2443
+ messages.push(...bileDetonationResult.messages);
2444
+ initialDamage = bileDetonationResult.currentDamage;
2445
+ if (bileDetonationResult.clearBile) {
2446
+ targetBoss.Skillcountpoints = 0;
2447
+ }
2448
+ }
2449
+ const flameResult = this.handleFlameCreature(targetBoss, weaponName, initialDamage, maxHP);
2450
+ if (flameResult) {
2451
+ return {
2452
+ currentHP: flameResult.updatedHP,
2453
+ messages: flameResult.messages,
2454
+ initialDamage: 0
2455
+ };
2456
+ }
2209
2457
  targetBoss.skills.forEach((skill) => {
2210
2458
  const config2 = passiveConfig[skill];
2211
2459
  if (config2 && config2.effect !== void 0 && config2.effect !== 0) {
@@ -2244,6 +2492,11 @@ function apply(ctx, config) {
2244
2492
  totalMultiplier += blackholeResult.damageMultiplier;
2245
2493
  messages.push(...blackholeResult.messages);
2246
2494
  }
2495
+ const titanRageResult = this.handleTitanRage(targetBoss, currentHP, maxHP);
2496
+ if (titanRageResult) {
2497
+ totalMultiplier += titanRageResult.damageMultiplier;
2498
+ messages.push(...titanRageResult.messages);
2499
+ }
2247
2500
  const radiationCalc = this.calculateRadiationDamage(targetBoss);
2248
2501
  if (radiationCalc) {
2249
2502
  totalMultiplier += radiationCalc.damageMultiplier;
@@ -2311,6 +2564,13 @@ function apply(ctx, config) {
2311
2564
  currentHP = bloodCountResult.updatedHP;
2312
2565
  messages.push(...bloodCountResult.messages);
2313
2566
  }
2567
+ const bileCountResult = await this.handleBileCount(ctx2, targetBoss, weaponName, bossGroup);
2568
+ if (bileCountResult) {
2569
+ messages.push(...bileCountResult.messages);
2570
+ if (bileCountResult.newBile !== void 0) {
2571
+ targetBoss.Skillcountpoints = bileCountResult.newBile;
2572
+ }
2573
+ }
2314
2574
  const sentryResult = await this.handleSentryGun(ctx2, targetBoss, bossGroup);
2315
2575
  if (sentryResult) {
2316
2576
  messages.push(...sentryResult.messages);
@@ -2521,6 +2781,7 @@ function apply(ctx, config) {
2521
2781
  });
2522
2782
  if (!allCleaners.length) return [];
2523
2783
  let killerBonus = false;
2784
+ let killerBonusMessage = "";
2524
2785
  for (const cleaner of allCleaners) {
2525
2786
  let rewardAmount = baseReward;
2526
2787
  if (cleaner.handle === killerHandle) {
@@ -2532,13 +2793,8 @@ function apply(ctx, config) {
2532
2793
  redcrystal: (cleaner.redcrystal || 0) + rewardAmount
2533
2794
  }], ["handle"]);
2534
2795
  }
2535
- const rewardMessages = [
2536
- `🧹 全体清洁工因清理 ${bossName} 尸体获得 ${baseReward} 红晶!`
2537
- ];
2538
- if (killerBonus) {
2539
- rewardMessages.push(`🎖️ ${killerName}(致命一击)获得双倍红晶奖励!`);
2540
- }
2541
- return rewardMessages;
2796
+ const rewardMessage = `🧹 全体清洁工因清理 ${bossName} 获得 ${baseReward} 红晶${killerBonus ? ` (致命一击奖励 ${killerName})` : ""}`;
2797
+ return [rewardMessage];
2542
2798
  } catch (error) {
2543
2799
  ctx2.logger("ggcevo").warn("清洁工奖励发放失败", error);
2544
2800
  return [];
@@ -2550,6 +2806,10 @@ function apply(ctx, config) {
2550
2806
  const extraDamages = [];
2551
2807
  const actuallyDead = [];
2552
2808
  let scatterBroadcast = null;
2809
+ const allCleanerRewards = [];
2810
+ let masterDeathEvent = null;
2811
+ const otherBroadcastMessages = [];
2812
+ const processedGroups = /* @__PURE__ */ new Set();
2553
2813
  const secondaryTargets = activeBosses.filter(
2554
2814
  (boss) => boss.name !== targetBoss.name
2555
2815
  );
@@ -2571,7 +2831,6 @@ function apply(ctx, config) {
2571
2831
  scatterEffectMessages.push(scatterMsg);
2572
2832
  const baseDamage = weaponData.damage * (1 + 0.1 * equippedWeapon.level);
2573
2833
  const secondaryDamage = Math.round(baseDamage * scatterRatio);
2574
- const cleanerRewards = [];
2575
2834
  for (const secondaryTarget of secondaryTargets) {
2576
2835
  const secondaryMaxHP = getBossMaxHP(secondaryTarget.name);
2577
2836
  let currentDamage = secondaryDamage;
@@ -2631,24 +2890,17 @@ function apply(ctx, config) {
2631
2890
  redcrystal: (cleaner.redcrystal || 0) + rewardAmount
2632
2891
  }], ["handle"]);
2633
2892
  }
2634
- let rewardMsg = `🧹 全体清洁工因清理 ${bossName} 尸体获得 ${baseReward} 红晶!`;
2893
+ let rewardMsg = `🧹 全体清洁工因清理 ${bossName} 获得 ${baseReward} 红晶`;
2635
2894
  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];
2895
+ rewardMsg += ` (致命一击奖励 ${playerName})`;
2646
2896
  }
2897
+ allCleanerRewards.push(rewardMsg);
2647
2898
  }
2899
+ const groupId = secondaryTarget.groupId;
2648
2900
  if (secondaryTarget.type === "子代") {
2649
2901
  if (secondaryTarget.name === "机械感染虫") {
2650
2902
  const [mainBoss] = await ctx2.database.get("ggcevo_boss", {
2651
- groupId: secondaryTarget.groupId,
2903
+ groupId,
2652
2904
  type: "主宰",
2653
2905
  isActive: true
2654
2906
  });
@@ -2656,24 +2908,18 @@ function apply(ctx, config) {
2656
2908
  await ctx2.database.set("ggcevo_boss", { name: mainBoss.name }, {
2657
2909
  skills: [...mainBoss.skills, "孤立无援"]
2658
2910
  });
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
- }
2911
+ otherBroadcastMessages.push("💥 机械感染虫已阵亡,空间站感染虫进入【孤立无援】状态,受到的伤害+20%!");
2667
2912
  }
2668
2913
  } else {
2669
2914
  const remainingMinions = await ctx2.database.get("ggcevo_boss", {
2670
- groupId: secondaryTarget.groupId,
2915
+ groupId,
2671
2916
  type: "子代",
2672
2917
  isActive: true
2673
2918
  });
2674
- if (remainingMinions.length === 0) {
2919
+ if (remainingMinions.length === 0 && !processedGroups.has(groupId)) {
2920
+ processedGroups.add(groupId);
2675
2921
  const [mainBoss] = await ctx2.database.get("ggcevo_boss", {
2676
- groupId: secondaryTarget.groupId,
2922
+ groupId,
2677
2923
  type: "主宰",
2678
2924
  isActive: true
2679
2925
  });
@@ -2681,21 +2927,14 @@ function apply(ctx, config) {
2681
2927
  await ctx2.database.set("ggcevo_boss", { name: mainBoss.name }, {
2682
2928
  skills: [...mainBoss.skills, "孤立无援"]
2683
2929
  });
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
- }
2930
+ otherBroadcastMessages.push(`💥 所有子代已阵亡,${mainBoss.name}进入【孤立无援】状态,受到的伤害+20%!`);
2692
2931
  }
2693
2932
  }
2694
2933
  }
2695
2934
  } else if (secondaryTarget.type === "主宰") {
2696
2935
  await ctx2.database.set(
2697
2936
  "ggcevo_boss",
2698
- { groupId: secondaryTarget.groupId },
2937
+ { groupId },
2699
2938
  { isActive: false, HP: 0 }
2700
2939
  );
2701
2940
  const respawnTime = /* @__PURE__ */ new Date();
@@ -2707,25 +2946,39 @@ function apply(ctx, config) {
2707
2946
  );
2708
2947
  const { rewardMessages } = await handleBossDefeatRewards(ctx2, secondaryTarget);
2709
2948
  await ctx2.database.remove("ggcevo_boss_damage", {
2710
- bossGroupId: secondaryTarget.groupId
2949
+ bossGroupId: groupId
2711
2950
  });
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
- }
2951
+ masterDeathEvent = {
2952
+ name: secondaryTarget.name,
2953
+ rewards: [
2954
+ `🎯 主宰 ${secondaryTarget.name} 已被 ${session.username} 的散射伤害击败!`,
2955
+ `所有子代已消失,下一个主宰将在1小时后重生`,
2956
+ "",
2957
+ "🏆 伤害排行榜奖励:",
2958
+ ...rewardMessages
2959
+ ]
2960
+ };
2726
2961
  }
2727
2962
  }
2728
2963
  }
2964
+ if (allCleanerRewards.length > 0) {
2965
+ const combinedRewards = `✨ 散射攻击击败奖励
2966
+ ${allCleanerRewards.join("\n")}`;
2967
+ otherBroadcastMessages.push(combinedRewards);
2968
+ }
2969
+ if (masterDeathEvent) {
2970
+ scatterBroadcast = [
2971
+ ...masterDeathEvent.rewards
2972
+ ];
2973
+ if (otherBroadcastMessages.length > 0) {
2974
+ scatterBroadcast.push("", ...otherBroadcastMessages);
2975
+ }
2976
+ } else if (otherBroadcastMessages.length > 0) {
2977
+ scatterBroadcast = otherBroadcastMessages;
2978
+ }
2979
+ if (Array.isArray(scatterBroadcast) && scatterBroadcast.length === 1) {
2980
+ scatterBroadcast = scatterBroadcast[0];
2981
+ }
2729
2982
  return { scatterEffectMessages, extraDamages, actuallyDead, scatterBroadcast };
2730
2983
  }
2731
2984
  __name(handleSecondaryTargets, "handleSecondaryTargets");
@@ -2877,7 +3130,7 @@ function apply(ctx, config) {
2877
3130
  });
2878
3131
  return {
2879
3132
  success: true,
2880
- message: `成功引爆 ${itemName},造成 ${damageValue} 点伤害,获得等额金币`
3133
+ message: `成功引爆${itemName},对空间站哨枪塔造成${damageValue}点伤害,获得等额金币。`
2881
3134
  };
2882
3135
  }
2883
3136
  if (itemConfig2.id === 2) {
@@ -2891,7 +3144,7 @@ function apply(ctx, config) {
2891
3144
  });
2892
3145
  if (!targetboss || targetboss?.Skillcountpoints === 0 || targetboss?.tags.includes("建筑") || targetboss?.tags.includes("重型")) return {
2893
3146
  success: false,
2894
- message: "您无法对目标使用。(目标已死亡/目标的技能计数为0/目标拥有“建筑”或“重型”标签)"
3147
+ message: "您无法对目标使用(目标已死亡/目标的技能计数为0/目标拥有“建筑”或“重型”标签)"
2895
3148
  };
2896
3149
  await ctx.database.set(
2897
3150
  "ggcevo_boss",
@@ -2900,7 +3153,7 @@ function apply(ctx, config) {
2900
3153
  );
2901
3154
  return {
2902
3155
  success: true,
2903
- message: `成功使用 ${itemName},已重置 ${target} 的技能计数`
3156
+ message: `成功使用${itemName},已重置${target}的技能计数。`
2904
3157
  };
2905
3158
  }
2906
3159
  if (itemConfig2.id === 3 || itemConfig2.id === 5) {
@@ -2920,7 +3173,7 @@ function apply(ctx, config) {
2920
3173
  });
2921
3174
  if (!targetboss || targetboss?.energy === 0) return {
2922
3175
  success: false,
2923
- message: "您无法对目标使用。(目标的能量为0)"
3176
+ message: "您无法对目标使用(目标的能量为0)"
2924
3177
  };
2925
3178
  await ctx.database.set(
2926
3179
  "ggcevo_boss",
@@ -2930,18 +3183,18 @@ function apply(ctx, config) {
2930
3183
  );
2931
3184
  return {
2932
3185
  success: true,
2933
- message: `成功使用 ${itemName},消耗 ${target} 500点能量`
3186
+ message: `成功使用${itemName},消耗${target}500点能量。`
2934
3187
  };
2935
3188
  }
2936
3189
  return {
2937
3190
  success: false,
2938
- message: `${itemName} 效果开发中,无法使用`
3191
+ message: `${itemName} 效果开发中,无法使用。`
2939
3192
  };
2940
3193
  } catch (error) {
2941
3194
  console.error("物品效果处理失败:", error);
2942
3195
  return {
2943
3196
  success: false,
2944
- message: "⚠️ 物品效果处理异常,已回滚操作"
3197
+ message: "⚠️ 物品效果处理异常,已回滚操作。"
2945
3198
  };
2946
3199
  }
2947
3200
  }
@@ -2959,14 +3212,19 @@ function apply(ctx, config) {
2959
3212
  if (currentLevel >= tech.maxLevel) return `❌ ${tech.techname}已达最高等级`;
2960
3213
  const nextLevel = currentLevel + 1;
2961
3214
  const levelData = tech.levels.find((l) => l.level === nextLevel);
2962
- let actualCost = levelData.cost;
3215
+ let originalCost = levelData.cost;
3216
+ let actualCost = originalCost;
3217
+ let discountApplied = false;
3218
+ let discountDetails = [];
2963
3219
  if (careerData.career === "情报副官") {
2964
- actualCost = Math.floor(actualCost * 0.8);
3220
+ discountApplied = true;
3221
+ actualCost = Math.floor(originalCost * 0.8);
3222
+ discountDetails.push("🎖️ 情报副官:20%折扣");
2965
3223
  }
2966
3224
  const [signInfo] = await ctx.database.get("ggcevo_sign", { handle });
2967
3225
  if (signInfo?.totalRewards < actualCost) {
2968
- const originalHint = careerData.career === "情报副官" ? `(原价${levelData.cost})` : "";
2969
- return `❌ 需要 ${actualCost} 金币${originalHint},当前持有:${signInfo?.totalRewards || 0}`;
3226
+ const priceHint = discountApplied ? ` (原价${originalCost}金币)` : "";
3227
+ return `❌ 金币不足!需要${actualCost}金币${priceHint},您当前拥有:${signInfo?.totalRewards || 0}金币`;
2970
3228
  }
2971
3229
  await ctx.database.withTransaction(async () => {
2972
3230
  await ctx.database.set("ggcevo_sign", { handle }, {
@@ -2978,13 +3236,22 @@ function apply(ctx, config) {
2978
3236
  level: nextLevel
2979
3237
  }], ["handle", "techId"]);
2980
3238
  });
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}`;
3239
+ let discountInfo = [];
3240
+ if (discountApplied) {
3241
+ discountInfo = [
3242
+ "折扣明细:",
3243
+ ...discountDetails.map((detail) => `▸ ${detail}`)
3244
+ ];
3245
+ }
3246
+ const costInfo = discountApplied ? `💰 花费金币:${actualCost} (原价${originalCost})` : `💰 花费金币:${actualCost}`;
3247
+ return [
3248
+ `✅ ${tech.techname} 升级至 Lv.${nextLevel}`,
3249
+ costInfo,
3250
+ ...discountInfo,
3251
+ // 插入折扣明细
3252
+ `📝 ${levelData.description}`,
3253
+ `💼 ${levelData.careerBonus}`
3254
+ ].filter(Boolean).join("\n");
2988
3255
  }
2989
3256
  __name(handleTechUpgrade, "handleTechUpgrade");
2990
3257
  async function handleWeaponUpgrade(handle, target) {
@@ -3014,22 +3281,22 @@ ${discountHint}${costLine}
3014
3281
  if (weaponDiscount > 0) {
3015
3282
  totalDiscount += weaponDiscount;
3016
3283
  discountDetails.push(
3017
- `武器系统 Lv${techLevel}${isCareerMatch ? "(科技职业加成)" : ""}:${weaponDiscount}%)`
3284
+ `⚙️ 武器系统 Lv${techLevel}:${weaponDiscount}%折扣`
3018
3285
  );
3019
3286
  }
3020
3287
  }
3021
3288
  const activeWish = await checkFoxBlessing(handle);
3022
3289
  if (activeWish) {
3023
3290
  totalDiscount += 20;
3024
- discountDetails.push("灵狐升运祈愿生效:20%");
3291
+ discountDetails.push("🦊 灵狐升运:20%折扣");
3025
3292
  }
3026
3293
  totalDiscount = Math.min(totalDiscount, 100);
3027
3294
  const discountedCost = baseCost * (100 - totalDiscount) / 100;
3028
3295
  const actualCost = Math.floor(discountedCost);
3029
3296
  const [signInfo] = await ctx.database.get("ggcevo_sign", { handle });
3030
3297
  if (signInfo?.totalRewards < actualCost) {
3031
- const priceInfo2 = totalDiscount > 0 ? `需要 ${actualCost} 金币(原价${baseCost})` : `需要 ${actualCost} 金币`;
3032
- return `❌ ${priceInfo2},当前持有:${signInfo?.totalRewards || 0}`;
3298
+ const priceInfo2 = totalDiscount > 0 ? `需要${actualCost}金币(原价${baseCost}金币)` : `需要${actualCost}金币`;
3299
+ return `❌ ${priceInfo2},您当前拥有:${signInfo?.totalRewards || 0}金币`;
3033
3300
  }
3034
3301
  await ctx.database.withTransaction(async () => {
3035
3302
  await ctx.database.set("ggcevo_sign", { handle }, {
@@ -3055,18 +3322,18 @@ ${discountHint}${costLine}
3055
3322
  const damage = (weaponData.damage * (1 + 0.1 * newLevel)).toFixed(1);
3056
3323
  let msg = `${target} 升级成功!Lv.${newLevel}`;
3057
3324
  const priceInfo = totalDiscount > 0 ? `
3058
- 💸 消耗:${actualCost}金币 (原价${baseCost})` : `
3325
+ 💸 消耗:${actualCost}金币 (原价${baseCost}金币)` : `
3059
3326
  💸 消耗:${actualCost}金币`;
3060
3327
  msg += priceInfo;
3061
3328
  if (discountDetails.length > 0) {
3062
3329
  msg += `
3063
- 🔧 折扣:
3330
+ 💰 折扣明细:
3064
3331
  ${discountDetails.join("\n▸ ")}`;
3065
3332
  }
3066
3333
  msg += `
3067
3334
  💥 伤害:${damage}`;
3068
3335
  msg += `
3069
- 🔩 改装槽:${Math.floor(newLevel / 3) + 1}个`;
3336
+ 🔧 改装槽:${Math.floor(newLevel / 3) + 1}个`;
3070
3337
  return msg;
3071
3338
  }
3072
3339
  __name(handleWeaponUpgrade, "handleWeaponUpgrade");
@@ -3109,26 +3376,30 @@ ${discountDetails.join("\n▸ ")}`;
3109
3376
  const showOriginal = finalPrice < baseCost;
3110
3377
  return [
3111
3378
  `等级 ${level.padEnd(5)}`,
3112
- `▸ 价格: ${finalPrice.toString().padStart(4)}${showOriginal ? ` (原价 ${baseCost})` : ""}`
3379
+ `▸ 价格: ${finalPrice.toString().padStart(4)}${showOriginal ? ` (原价${baseCost})` : ""}`
3113
3380
  ].join("\n");
3114
3381
  });
3115
3382
  const discountNotice = [];
3383
+ if (hasTechDiscount || hasFoxDiscount) {
3384
+ discountNotice.push("💰 当前折扣:");
3385
+ }
3116
3386
  if (hasTechDiscount) {
3117
- discountNotice.push(`🔧 武器系统 Lv${techLevel} (${techDiscountRate}% 折扣)`);
3387
+ discountNotice.push(`⚙️ 武器系统 Lv${techLevel}:${techDiscountRate}%折扣`);
3118
3388
  }
3119
3389
  if (hasFoxDiscount) {
3120
- discountNotice.push("🦊 灵狐升运祈愿 (20% 折扣)");
3390
+ discountNotice.push(`🦊 灵狐升运:20%折扣`);
3121
3391
  }
3122
3392
  if (!hasTechDiscount && !hasFoxDiscount) {
3123
3393
  discountNotice.push("💡 提示:加入人类联盟并升级武器系统可获得折扣");
3124
3394
  }
3125
3395
  return [
3126
3396
  "⚡ 武器升级价格表 ⚡",
3397
+ "使用「升级 武器名称」对武器进行等级升级",
3127
3398
  ...discountNotice,
3399
+ // 现在折扣信息前有标题
3128
3400
  "====================",
3129
3401
  ...priceDetails,
3130
- "====================",
3131
- "使用「升级 武器名称」进行具体升级"
3402
+ "===================="
3132
3403
  ].join("\n");
3133
3404
  }
3134
3405
  __name(generateUpgradePriceList, "generateUpgradePriceList");
@@ -3193,18 +3464,18 @@ ${discountDetails.join("\n▸ ")}`;
3193
3464
  let hiddenWinCount = 0;
3194
3465
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
3195
3466
  if (!profile) {
3196
- return "🔒 需要先绑定游戏句柄";
3467
+ return "🔒 需要先绑定游戏句柄。";
3197
3468
  }
3198
3469
  const { regionId, realmId, profileId } = profile;
3199
3470
  const handle = `${regionId}-S2-${realmId}-${profileId}`;
3200
3471
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
3201
3472
  if (existingEntries.length > 0) {
3202
- return `⛔ 您已被列入黑名单`;
3473
+ return `⛔ 您已被列入黑名单。`;
3203
3474
  }
3204
3475
  const [backpack] = await ctx.database.get("ggcevo_backpack", { handle, itemId: 1 });
3205
3476
  const quantity = backpack?.quantity;
3206
3477
  if (quantity < 1) {
3207
- return "您背包中的咕咕币不足";
3478
+ return "您背包内的咕咕币不足。";
3208
3479
  }
3209
3480
  await ctx.database.upsert("ggcevo_backpack", [{
3210
3481
  handle,
@@ -3219,27 +3490,27 @@ ${discountDetails.join("\n▸ ")}`;
3219
3490
  }
3220
3491
  const [record] = await ctx.database.get("ggcevo_records", { handle });
3221
3492
  return [
3222
- `🎰 您使用了 ${quantity} 枚咕咕币`,
3223
- winCount > 0 ? `🎉 其中获得 ${winCount} 张兑换券!` : "💔 本次未获得任何兑换券",
3493
+ `🎰 您使用了${quantity}枚咕咕币`,
3494
+ winCount > 0 ? `🎉 其中获得${winCount}张兑换券!` : "💔 本次未获得任何兑换券",
3224
3495
  `📊 当前保底进度:${record.pityCounter}/90`,
3225
- ...hiddenWinCount > 0 ? [`🎉 恭喜你抽中隐藏奖励,额外获得 ${hiddenWinCount} 张兑换券和 ${hiddenWinCount} 枚扭蛋币!`] : []
3496
+ ...hiddenWinCount > 0 ? [`🎉 恭喜你抽中隐藏奖励,额外获得${hiddenWinCount}张兑换券和${hiddenWinCount}枚扭蛋币!`] : []
3226
3497
  ].join("\n");
3227
3498
  });
3228
3499
  ctx.command("ggcevo/单抽").action(async (argv) => {
3229
3500
  const session = argv.session;
3230
3501
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
3231
3502
  if (!profile) {
3232
- return "🔒 需要先绑定游戏句柄";
3503
+ return "🔒 需要先绑定游戏句柄。";
3233
3504
  }
3234
3505
  const { regionId, realmId, profileId } = profile;
3235
3506
  const handle = `${regionId}-S2-${realmId}-${profileId}`;
3236
3507
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
3237
3508
  if (existingEntries.length > 0) {
3238
- return `⛔ 您已被列入黑名单`;
3509
+ return `⛔ 您已被列入黑名单。`;
3239
3510
  }
3240
3511
  const [backpack] = await ctx.database.get("ggcevo_backpack", { handle, itemId: 1 });
3241
3512
  if (backpack?.quantity < 1) {
3242
- return "您背包中的咕咕币不足";
3513
+ return "您背包内的咕咕币不足。";
3243
3514
  }
3244
3515
  await ctx.database.upsert("ggcevo_backpack", [{
3245
3516
  handle,
@@ -3251,7 +3522,7 @@ ${discountDetails.join("\n▸ ")}`;
3251
3522
  const [record] = await ctx.database.get("ggcevo_records", { handle });
3252
3523
  return [
3253
3524
  `${result ? "🎉 获得兑换券!" : "❌ 未中奖"} 保底进度:${record.pityCounter}/90`,
3254
- ...HiddenAward2 ? [`🎉 恭喜你抽中隐藏奖励,额外获得 1 张兑换券和 1 枚扭蛋币!`] : []
3525
+ ...HiddenAward2 ? [`🎉 恭喜你抽中隐藏奖励,额外获得1张兑换券和1枚扭蛋币!`] : []
3255
3526
  ].join("\n");
3256
3527
  });
3257
3528
  ctx.command("ggcevo/十连抽").action(async (argv) => {
@@ -3259,17 +3530,17 @@ ${discountDetails.join("\n▸ ")}`;
3259
3530
  let hiddenWinCount = 0;
3260
3531
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
3261
3532
  if (!profile) {
3262
- return "🔒 需要先绑定游戏句柄";
3533
+ return "🔒 需要先绑定游戏句柄。";
3263
3534
  }
3264
3535
  const { regionId, realmId, profileId } = profile;
3265
3536
  const handle = `${regionId}-S2-${realmId}-${profileId}`;
3266
3537
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
3267
3538
  if (existingEntries.length > 0) {
3268
- return `⛔ 您已被列入黑名单`;
3539
+ return `⛔ 您已被列入黑名单。`;
3269
3540
  }
3270
3541
  const [backpack] = await ctx.database.get("ggcevo_backpack", { handle, itemId: 1 });
3271
3542
  if (backpack?.quantity < 10) {
3272
- return "您背包中的咕咕币不足";
3543
+ return "您背包内的咕咕币不足。";
3273
3544
  }
3274
3545
  await ctx.database.upsert("ggcevo_backpack", [{
3275
3546
  handle,
@@ -3287,13 +3558,13 @@ ${discountDetails.join("\n▸ ")}`;
3287
3558
  "十连抽结果:",
3288
3559
  ...results.map((r) => r ? "🎉 获得兑换券" : "❌ 未中奖"),
3289
3560
  `保底进度:${record.pityCounter}/90`,
3290
- ...hiddenWinCount > 0 ? [`🎉 恭喜你抽中隐藏奖励,额外获得 ${hiddenWinCount} 张兑换券和 ${hiddenWinCount} 枚扭蛋币!`] : []
3561
+ ...hiddenWinCount > 0 ? [`🎉 恭喜你抽中隐藏奖励,额外获得${hiddenWinCount}张兑换券和${hiddenWinCount}枚扭蛋币!`] : []
3291
3562
  ].join("\n");
3292
3563
  });
3293
3564
  ctx.command("ggcevo/背包").action(async (argv) => {
3294
3565
  const session = argv.session;
3295
3566
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
3296
- if (!profile) return "🔒 需要先绑定游戏句柄";
3567
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
3297
3568
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
3298
3569
  const items = await ctx.database.get("ggcevo_backpack", { handle });
3299
3570
  const validItems = items.filter((item) => item.quantity > 0);
@@ -3314,11 +3585,11 @@ ${itemDetails.join("\n")}`;
3314
3585
  const session = argv.session;
3315
3586
  let latestTime;
3316
3587
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
3317
- if (!profile) return "🔒 需要先绑定游戏句柄";
3588
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
3318
3589
  const { regionId, realmId, profileId } = profile;
3319
3590
  const handle = `${regionId}-S2-${realmId}-${profileId}`;
3320
3591
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
3321
- if (existingEntries.length > 0) return "⛔ 您已被列入黑名单";
3592
+ if (existingEntries.length > 0) return "⛔ 您已被列入黑名单。";
3322
3593
  const now = /* @__PURE__ */ new Date();
3323
3594
  const currentChinaTime = convertUTCtoChinaTime(now);
3324
3595
  if (config.signrequire) {
@@ -3380,7 +3651,7 @@ ${itemDetails.join("\n")}`;
3380
3651
  const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
3381
3652
  if (careerData?.group === "人类联盟") {
3382
3653
  totalBonus += 0.2;
3383
- messages.push("🏛️ 人类联盟阵营加成:金币+20%");
3654
+ messages.push("🏛️ 人类联盟:+20%金币");
3384
3655
  const [userMiningTech] = await ctx.database.get("ggcevo_tech", { handle, techId: 1 }).catch(() => [{ level: 0 }]);
3385
3656
  const techLevel = Math.min(userMiningTech?.level || 0, 5);
3386
3657
  const miningTechConfig = Spacestationtechnology.find((t) => t.techId === 1);
@@ -3395,22 +3666,22 @@ ${itemDetails.join("\n")}`;
3395
3666
  const finalBonus = Math.max(baseTechBonus, careerTechBonus);
3396
3667
  if (finalBonus > 0) {
3397
3668
  totalBonus += finalBonus / 100;
3398
- messages.push(`⚙️ 采掘系统 Lv${techLevel} 加成:金币+${finalBonus}%`);
3669
+ messages.push(`⚙️ 采掘系统 Lv${techLevel}:+${finalBonus}%金币`);
3399
3670
  }
3400
3671
  }
3401
3672
  if (careerData.career === "深空矿工") {
3402
3673
  totalBonus += 0.5;
3403
- messages.push("⛏️ 深空矿工职业加成:金币+50%");
3674
+ messages.push("🎖️ 深空矿工:+50%金币");
3404
3675
  }
3405
3676
  }
3406
3677
  if (careerData?.group === "辛迪加海盗") {
3407
3678
  const [cred17Item] = await ctx.database.get("ggcevo_warehouse", { handle, itemId: 3 });
3408
3679
  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;
3680
+ const humanPlayersCount = await ctx.database.select("ggcevo_careers").where({ group: "人类联盟" }).execute((row) => import_koishi.$.count(row.handle));
3681
+ const additionalBonus = Math.min(humanPlayersCount, 50);
3682
+ const credBonus = 0.5 + additionalBonus / 100;
3412
3683
  totalBonus += credBonus;
3413
- messages.push(`💎 CRED-17生效:金币+50% 额外+${additional}%`);
3684
+ messages.push(`💎 CRED-17:+50%金币 (${additionalBonus}名人类联盟玩家,额外+${additionalBonus}%金币)`);
3414
3685
  }
3415
3686
  }
3416
3687
  const [meowEffect] = await ctx.database.get("ggcevo_Wish_Record", {
@@ -3423,7 +3694,7 @@ ${itemDetails.join("\n")}`;
3423
3694
  if (meowEffect) {
3424
3695
  tickets *= 2;
3425
3696
  totalBonus += 1;
3426
- messages.push("🐾 喵喵财源祈愿生效:咕咕币×2,金币+100%");
3697
+ messages.push("🐾 喵喵财源:咕咕币+100%,金币+100%");
3427
3698
  }
3428
3699
  const finalPoints = Math.round(basePoints * (1 + totalBonus));
3429
3700
  let redCrystal = 0;
@@ -3439,7 +3710,7 @@ ${itemDetails.join("\n")}`;
3439
3710
  } else {
3440
3711
  redCrystal = 5;
3441
3712
  }
3442
- messages.push(`⚓ 辛迪加财务经理职业加成:获得${redCrystal}枚红晶`);
3713
+ messages.push(`🎖️ 辛迪加财务经理:+${redCrystal}枚红晶`);
3443
3714
  }
3444
3715
  await ctx.database.withTransaction(async () => {
3445
3716
  await ctx.database.upsert("ggcevo_sign", [{
@@ -3476,11 +3747,11 @@ ${itemDetails.join("\n")}`;
3476
3747
  try {
3477
3748
  const session = argv.session;
3478
3749
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
3479
- if (!profile) return "🔒 需要先绑定游戏句柄";
3750
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
3480
3751
  const { regionId, realmId, profileId } = profile;
3481
3752
  const handle = `${regionId}-S2-${realmId}-${profileId}`;
3482
3753
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
3483
- if (existingEntries.length > 0) return "⛔ 您已被列入黑名单";
3754
+ if (existingEntries.length > 0) return "⛔ 您已被列入黑名单。";
3484
3755
  const [record] = await ctx.database.get("ggcevo_sign", { handle });
3485
3756
  if (!record) return "暂未查询到您的签到记录";
3486
3757
  const lastSignChina = convertUTCtoChinaTime(record.lastSign);
@@ -3495,7 +3766,7 @@ ${itemDetails.join("\n")}`;
3495
3766
  }
3496
3767
  const costPoints = 100;
3497
3768
  if (record.totalRewards < costPoints) {
3498
- return `补签需要消耗${costPoints}枚金币,您的金币不足。`;
3769
+ return `补签需要消耗${costPoints}枚金币,您当前拥有:${record.totalRewards}枚金币`;
3499
3770
  }
3500
3771
  const newMonthlyDays = record.monthlyDays + 1;
3501
3772
  let tickets = 3, points = 0;
@@ -3521,7 +3792,7 @@ ${itemDetails.join("\n")}`;
3521
3792
  await ctx.database.set("ggcevo_backpack", { handle, itemId: 1 }, {
3522
3793
  quantity: (backpack?.quantity || 0) + tickets
3523
3794
  });
3524
- const rewardsMessage = points > 0 ? `获得${points}枚金币和${tickets}枚咕咕币` : `获得${tickets}枚咕咕币`;
3795
+ const rewardsMessage = points > 0 ? `获得${points}枚金币和${tickets}枚咕咕币。` : `获得${tickets}枚咕咕币。`;
3525
3796
  return `补签成功!本月累计签到${newMonthlyDays}天,消耗${costPoints}枚金币,${rewardsMessage}`;
3526
3797
  } catch (error) {
3527
3798
  console.error("补签错误:", error);
@@ -3531,13 +3802,13 @@ ${itemDetails.join("\n")}`;
3531
3802
  ctx.guild().command("ggcevo/每月津贴").action(async (argv) => {
3532
3803
  const session = argv.session;
3533
3804
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
3534
- if (!profile) return "🔒 需要先绑定游戏句柄";
3805
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
3535
3806
  const { regionId, realmId, profileId } = profile;
3536
3807
  const handle = `${regionId}-S2-${realmId}-${profileId}`;
3537
3808
  const [backpack] = await ctx.database.get("ggcevo_backpack", { handle, itemId: 1 });
3538
3809
  const memberInfo = await session.event?.member?.roles;
3539
3810
  if (memberInfo?.includes("member")) {
3540
- return "❌ 仅限管理员和群主领取每月津贴";
3811
+ return "❌ 仅限管理员和群主领取每月津贴。";
3541
3812
  }
3542
3813
  const now = /* @__PURE__ */ new Date();
3543
3814
  const chinatime = convertUTCtoChinaTime(now);
@@ -3551,7 +3822,7 @@ ${itemDetails.join("\n")}`;
3551
3822
  const lastYear = lastSignTime.getUTCFullYear();
3552
3823
  const lastMonth = lastSignTime.getUTCMonth();
3553
3824
  if (lastYear === currentYear && lastMonth === currentMonth) {
3554
- return `您的本月管理津贴已领取,${currentMonth + 2}月1日后可再次领取`;
3825
+ return `您的本月管理津贴已领取,${currentMonth + 2}月1日后可再次领取。`;
3555
3826
  }
3556
3827
  }
3557
3828
  await ctx.database.upsert("ggcevo_adminbenefit", [{
@@ -3566,15 +3837,15 @@ ${itemDetails.join("\n")}`;
3566
3837
  itemId: 1,
3567
3838
  quantity: (backpack?.quantity || 0) + 50
3568
3839
  }]);
3569
- return `[管理专属] 成功领取本月津贴,获得了50枚咕咕币!`;
3840
+ return `[管理专属] 您成功领取本月津贴,获得了50枚咕咕币!`;
3570
3841
  });
3571
3842
  ctx.command("ggcevo/领取 [name]").action(async (argv, name2) => {
3572
3843
  const session = argv.session;
3573
3844
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
3574
- if (!profile) return "🔒 需要先绑定游戏句柄";
3845
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
3575
3846
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
3576
3847
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
3577
- if (existingEntries.length > 0) return "⛔ 您已被列入黑名单";
3848
+ if (existingEntries.length > 0) return "⛔ 您已被列入黑名单。";
3578
3849
  if (!name2) {
3579
3850
  await session.send("请在30秒内输入活动名称:");
3580
3851
  name2 = await session.prompt(3e4);
@@ -3655,7 +3926,7 @@ ${itemDetails.join("\n")}`;
3655
3926
  });
3656
3927
  ctx.command("ggcevo/活动列表").action(async ({ session }) => {
3657
3928
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
3658
- if (!profile) return "🔒 需要先绑定游戏句柄";
3929
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
3659
3930
  const activities = await ctx.database.get(
3660
3931
  "ggcevo_activity",
3661
3932
  { status: "进行中" },
@@ -3821,7 +4092,7 @@ ${itemDetails.join("\n")}`;
3821
4092
  });
3822
4093
  ctx.command("ggcevo/胜点榜 [page]").usage("输入 胜点榜 [页码] 查看对应页的排行榜,每页10条").action(async ({ session }, page) => {
3823
4094
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
3824
- if (!profile) return "🔒 需要先绑定游戏句柄";
4095
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
3825
4096
  const pageNum = parseInt(page) || 1;
3826
4097
  if (pageNum < 1) return "请输入有效的页码。";
3827
4098
  const offset = (pageNum - 1) * 10;
@@ -3830,7 +4101,7 @@ ${itemDetails.join("\n")}`;
3830
4101
  ctx.database.select("ggcevo_rank").where({ Blacklist: false, rankseason: config.rankseason }).execute((row) => import_koishi.$.count(row.handle))
3831
4102
  ]);
3832
4103
  const totalPages = Math.ceil(total / 10);
3833
- if (pageNum > totalPages) return `查询失败,最多有 ${totalPages} 页`;
4104
+ if (pageNum > totalPages) return `查询失败,最多有${totalPages}页`;
3834
4105
  const processedRecords = await Promise.all(
3835
4106
  records.map(async (item) => ({
3836
4107
  ...item,
@@ -3993,7 +4264,7 @@ ${itemDetails.join("\n")}`;
3993
4264
  if (!player) {
3994
4265
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
3995
4266
  if (!profile) {
3996
- return "🔒 需要先绑定游戏句柄";
4267
+ return "🔒 需要先绑定游戏句柄。";
3997
4268
  }
3998
4269
  const { regionId, realmId, profileId } = profile;
3999
4270
  const handle = `${regionId}-S2-${realmId}-${profileId}`;
@@ -4009,7 +4280,7 @@ ${itemDetails.join("\n")}`;
4009
4280
  ) + 1;
4010
4281
  const isSafe = await checkSensitiveWord(user.name);
4011
4282
  const displayName = isSafe ? user.name : (user.name[0] || "") + "***";
4012
- return `🎮 咕咕胜点榜排名信息 🎮
4283
+ return `🎮 咕咕排名信息 🎮
4013
4284
  ------------------------------
4014
4285
  昵称:${displayName}
4015
4286
  句柄:${user.handle}
@@ -4043,7 +4314,7 @@ ${itemDetails.join("\n")}`;
4043
4314
  ) + 1;
4044
4315
  const isSafe = await checkSensitiveWord(user.name);
4045
4316
  const displayName = isSafe ? user.name : (user.name[0] || "") + "***";
4046
- return `🎮 咕咕胜点榜排名信息 🎮
4317
+ return `🎮 咕咕排名信息 🎮
4047
4318
  ------------------------------
4048
4319
  昵称:${displayName}
4049
4320
  句柄:${user.handle}
@@ -4069,7 +4340,7 @@ ${itemDetails.join("\n")}`;
4069
4340
  lastSign: signData?.lastSign || /* @__PURE__ */ new Date(0),
4070
4341
  monthlyDays: signData?.monthlyDays || 0
4071
4342
  }]);
4072
- return `成功为 ${handle} 添加 ${parsedAmount} 金币!当前总数:${newTotal}`;
4343
+ return `✅ 成功为 ${handle} 添加 ${parsedAmount} 金币!用户当前总数:${newTotal}`;
4073
4344
  } else if (itemName === "红晶") {
4074
4345
  const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
4075
4346
  const currentRed = careerData?.redcrystal || 0;
@@ -4081,7 +4352,7 @@ ${itemDetails.join("\n")}`;
4081
4352
  career: careerData?.career || "",
4082
4353
  date: careerData?.date || /* @__PURE__ */ new Date()
4083
4354
  }]);
4084
- return `成功为 ${handle} 添加 ${parsedAmount} 红晶!当前总数:${newRed}`;
4355
+ return `✅ 成功为 ${handle} 添加 ${parsedAmount} 红晶!用户当前总数:${newRed}`;
4085
4356
  } else {
4086
4357
  const validItems = Object.keys(initDefaultItems);
4087
4358
  if (!validItems.includes(itemName)) {
@@ -4095,7 +4366,7 @@ ${itemDetails.join("\n")}`;
4095
4366
  itemId,
4096
4367
  quantity: newQuantity
4097
4368
  }], ["handle", "itemId"]);
4098
- return `成功为 ${handle} 添加 ${parsedAmount} 个${itemName}!当前总数:${newQuantity}`;
4369
+ return `✅ 成功为 ${handle} 添加 ${parsedAmount} 个${itemName}!用户当前总数:${newQuantity}`;
4099
4370
  }
4100
4371
  } catch (err) {
4101
4372
  console.error("[给予命令错误]", err);
@@ -4109,7 +4380,7 @@ ${itemDetails.join("\n")}`;
4109
4380
  let handle;
4110
4381
  if (!user) {
4111
4382
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
4112
- if (!profile) return "🔒 需要先绑定游戏句柄";
4383
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
4113
4384
  handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
4114
4385
  } else {
4115
4386
  const parsedUser = import_koishi.h.parse(user)[0];
@@ -4158,11 +4429,11 @@ ${itemDetails.join("\n")}`;
4158
4429
  ctx.command("ggcevo/兑换", "兑换物品").action(async ({ session }) => {
4159
4430
  try {
4160
4431
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
4161
- if (!profile) return "🔒 需要先绑定游戏句柄";
4432
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
4162
4433
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
4163
4434
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
4164
4435
  if (existingEntries.length > 0) {
4165
- return `⛔ 您已被列入黑名单`;
4436
+ return `⛔ 您已被列入黑名单。`;
4166
4437
  }
4167
4438
  const currentSeason = config.rankseason;
4168
4439
  const qualityGroups = {};
@@ -4243,7 +4514,7 @@ ${items.join("、")}
4243
4514
  }
4244
4515
  const [coupon] = await ctx.database.get("ggcevo_backpack", { handle, itemId });
4245
4516
  if (!coupon || coupon.quantity < cost) {
4246
- const requireMsg = petItems.has(name2) ? `需要1个${configname.quality}级宠物扭蛋 或${configname.cost}张兑奖券` : `需要${configname.cost}张兑奖券`;
4517
+ const requireMsg = petItems.has(name2) ? `需要1个${configname.quality}级宠物扭蛋或${configname.cost}张兑奖券` : `需要${configname.cost}张兑奖券`;
4247
4518
  return `${requireMsg}
4248
4519
  您当前持有:${coupon?.quantity || 0}个${couponName}`;
4249
4520
  }
@@ -4266,7 +4537,7 @@ ${items.join("、")}
4266
4537
  season: currentSeason
4267
4538
  });
4268
4539
  });
4269
- return `🎉 恭喜!您使用 ${cost} 个 ${couponName} 兑换了 【${name2}】`;
4540
+ return `🎉 恭喜!您使用${cost}个${couponName}兑换了【${name2}】`;
4270
4541
  } catch (error) {
4271
4542
  console.error("兑换失败:", error);
4272
4543
  return "兑换失败";
@@ -4274,11 +4545,11 @@ ${items.join("、")}
4274
4545
  });
4275
4546
  ctx.command("ggcevo/兑换扭蛋币").action(async ({ session }) => {
4276
4547
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
4277
- if (!profile) return "🔒 需要先绑定游戏句柄";
4548
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
4278
4549
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
4279
4550
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
4280
4551
  if (existingEntries.length > 0) {
4281
- return `⛔ 您已被列入黑名单`;
4552
+ return `⛔ 您已被列入黑名单。`;
4282
4553
  }
4283
4554
  await session.send(`您确定要使用3张兑换券换取一枚扭蛋币吗?(请在30秒内回复“是”确认)`);
4284
4555
  const confirm = await session.prompt(3e4);
@@ -4286,7 +4557,7 @@ ${items.join("、")}
4286
4557
  const [backpack] = await ctx.database.get("ggcevo_backpack", { handle, itemId: 3 });
4287
4558
  const [coupon] = await ctx.database.get("ggcevo_backpack", { handle, itemId: 2 });
4288
4559
  if (!coupon || coupon.quantity < 3) {
4289
- return `兑换扭蛋币需要3张兑奖券,您当前持有:${coupon?.quantity || 0}`;
4560
+ return `兑换扭蛋币需要3张兑奖券,您当前持有:${coupon?.quantity || 0}张兑换券`;
4290
4561
  }
4291
4562
  await ctx.database.set(
4292
4563
  "ggcevo_backpack",
@@ -4298,23 +4569,23 @@ ${items.join("、")}
4298
4569
  itemId: 3,
4299
4570
  quantity: (backpack?.quantity || 0) + 1
4300
4571
  }]);
4301
- return `🎉恭喜!您使用 3 张兑奖券兑换了 1 枚扭蛋币`;
4572
+ return `🎉恭喜!您使用3张兑奖券兑换了1枚扭蛋币`;
4302
4573
  });
4303
4574
  ctx.command("ggcevo/扭蛋").action(async (argv) => {
4304
4575
  const session = argv.session;
4305
4576
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
4306
4577
  if (!profile) {
4307
- return "🔒 需要先绑定游戏句柄";
4578
+ return "🔒 需要先绑定游戏句柄。";
4308
4579
  }
4309
4580
  const { regionId, realmId, profileId } = profile;
4310
4581
  const handle = `${regionId}-S2-${realmId}-${profileId}`;
4311
4582
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
4312
4583
  if (existingEntries.length > 0) {
4313
- return `⛔ 您已被列入黑名单`;
4584
+ return `⛔ 您已被列入黑名单。`;
4314
4585
  }
4315
4586
  const [backpack] = await ctx.database.get("ggcevo_backpack", { handle, itemId: 3 });
4316
4587
  if (!backpack || backpack.quantity < 1) {
4317
- return `当前扭蛋币不足,您拥有:${backpack?.quantity || 0}枚`;
4588
+ return `当前扭蛋币不足,您当前拥有:${backpack?.quantity || 0}枚扭蛋币`;
4318
4589
  }
4319
4590
  const awardName = PetCapsuleToy();
4320
4591
  const awardItem = Object.entries(initDefaultItems).find(
@@ -4336,7 +4607,7 @@ ${items.join("、")}
4336
4607
  itemId: itemData.id,
4337
4608
  quantity: currentQuantity + 1
4338
4609
  }]);
4339
- return `🎉 恭喜!您获得了 ${itemName}`;
4610
+ return `🎉 恭喜!您获得了${itemName}`;
4340
4611
  });
4341
4612
  ctx.command("ggcevo/拉黑 [handle]", "添加用户到黑名单").action(async (argv, handle) => {
4342
4613
  const session = argv.session;
@@ -4401,7 +4672,7 @@ ${items.join("、")}
4401
4672
  const session = argv.session;
4402
4673
  const output = [];
4403
4674
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
4404
- if (!profile) return "🔒 需要先绑定游戏句柄";
4675
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
4405
4676
  const { regionId, realmId, profileId } = profile;
4406
4677
  const handle = `${regionId}-S2-${realmId}-${profileId}`;
4407
4678
  output.push(`🎮 游戏句柄:${handle}
@@ -4459,7 +4730,7 @@ ${items.join("、")}
4459
4730
  lottery && "抽奖",
4460
4731
  exchanges.length && "兑换"
4461
4732
  ].filter(Boolean);
4462
- output.push(`📊 共查询到 ${existModules.length} 类信息`);
4733
+ output.push(`📊 共查询到${existModules.length}类信息`);
4463
4734
  return output.join("\n");
4464
4735
  });
4465
4736
  const processedLobbies = /* @__PURE__ */ new Set();
@@ -4534,11 +4805,11 @@ ${items.join("、")}
4534
4805
  try {
4535
4806
  const session = argv.session;
4536
4807
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
4537
- if (!profile) return "🔒 需要先绑定游戏句柄";
4808
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
4538
4809
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
4539
4810
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
4540
4811
  if (existingEntries.length > 0) {
4541
- return `⛔ 您已被列入黑名单`;
4812
+ return `⛔ 您已被列入黑名单。`;
4542
4813
  }
4543
4814
  if (!user) return "请输入“pk @玩家”。";
4544
4815
  const parsedUser = import_koishi.h.parse(user)[0];
@@ -4582,8 +4853,14 @@ ${items.join("、")}
4582
4853
  const now2 = /* @__PURE__ */ new Date();
4583
4854
  const timeDiff = now2.getTime() - joinDate.getTime();
4584
4855
  const diffInDays = Math.floor(timeDiff / (1e3 * 60 * 60 * 24));
4585
- if (diffInDays < 30) {
4586
- return `🛡️ 该玩家是人类联盟成员,尚在30天保护期内(剩余${30 - diffInDays}天),无法挑战`;
4856
+ const [targetPKRecord] = await ctx.database.get("ggcevo_pk", {
4857
+ handle: targetHandle
4858
+ });
4859
+ const isNewPlayer = !targetPKRecord;
4860
+ const hasProtection = diffInDays < 30;
4861
+ const isPKDisabled = targetPKRecord && !targetPKRecord.enable;
4862
+ if ((isNewPlayer || isPKDisabled) && hasProtection) {
4863
+ return `🛡️ 该玩家是人类联盟成员,当前处于30天保护期内(剩余${30 - diffInDays}天),无法PK`;
4587
4864
  }
4588
4865
  }
4589
4866
  let initiatorPK;
@@ -4777,23 +5054,23 @@ ${items.join("、")}
4777
5054
  `🎰 金币变动:${stealPercentage}%`
4778
5055
  ];
4779
5056
  if (targetCareer.group === "人类联盟" && isWin) {
4780
- result.push(`🛡️ 人类联盟保护:${targetRankname} 被动应战的PK失败时仅损失1%的金币`);
5057
+ result.push(`🛡️ 人类联盟:应战者PK失败时仅损失1%的金币`);
4781
5058
  }
4782
5059
  if (computerExpertProtection) {
4783
- result.push(`💻 计算机专家职业加成:${targetRankname} 被动应战的PK失败时不损失金币`);
5060
+ result.push(`💻 计算机专家:应战者PK失败时不损失金币`);
4784
5061
  } else if (isWin) {
4785
5062
  result.push(`💰 您从对方的口袋里抢夺了${goldTransfer}枚金币`);
4786
5063
  } else {
4787
5064
  result.push(`💸 您从口袋里拿出了${goldTransfer}枚金币上交给对方`);
4788
5065
  }
4789
5066
  if (mp3Effect) {
4790
- result.push(`💿 MP3播放器生效:${initiatorRankname} 主动发起的PK失败时上交的金币减少50%`);
5067
+ result.push(`💿 MP3播放器:挑战者PK失败时上交的金币减少50%`);
4791
5068
  }
4792
5069
  if (initiatorCareer?.group === "辛迪加海盗") {
4793
- result.push(`🔴 辛迪加海盗阵营加成:${initiatorRankname} 获得1枚红晶`);
5070
+ result.push(`🔴 辛迪加海盗:+1枚红晶`);
4794
5071
  }
4795
5072
  if (isWin && initiatorCareer?.career === "辛迪加财务经理") {
4796
- result.push(`💰 辛迪加财务经理职业加成:${initiatorRankname} 额外获得1枚红晶`);
5073
+ result.push(`💰 辛迪加财务经理:+1枚红晶`);
4797
5074
  }
4798
5075
  result.push(`📅 剩余挑战次数:${config.dailyPKLimit - (initiatorPK.todayCount + 1)}`);
4799
5076
  return result.join("\n");
@@ -4804,7 +5081,7 @@ ${items.join("、")}
4804
5081
  });
4805
5082
  ctx.command("ggcevo/pk榜 [page]", "查看玩家PK排行榜").usage("输入 pk榜 [页码] 查看对应页的排行榜,每页10条").action(async ({ session }, page) => {
4806
5083
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
4807
- if (!profile) return "🔒 需要先绑定游戏句柄";
5084
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
4808
5085
  const pageNum = parseInt(page) || 1;
4809
5086
  if (pageNum < 1) return "请输入有效的页码。";
4810
5087
  const offset = (pageNum - 1) * 10;
@@ -4841,13 +5118,28 @@ ${items.join("、")}
4841
5118
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
4842
5119
  const [techData] = await ctx.database.get("ggcevo_tech", { handle, techId: 2 }).catch(() => [{ level: 0 }]);
4843
5120
  const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
4844
- const techLevel = techData?.level || 0;
4845
- const isCareerMatch = Spacestationtechnology.find((t) => t.techId === 2).careerNames.includes(careerData?.career);
4846
- const BASE_DISCOUNTS = [0, 0, 0, 0, 0];
4847
- const CAREER_DISCOUNTS = [0, 0, 10, 15, 20];
4848
- const baseDiscount = techLevel > 0 ? BASE_DISCOUNTS[techLevel - 1] : 0;
4849
- const careerDiscount = isCareerMatch ? CAREER_DISCOUNTS[techLevel - 1] : 0;
4850
- const techDiscount = Math.max(baseDiscount, careerDiscount);
5121
+ const group = careerData?.group || "";
5122
+ const discountDetails = [];
5123
+ let techDiscount = 0;
5124
+ if (group === "人类联盟") {
5125
+ const techLevel = techData?.level || 0;
5126
+ if (techLevel > 0) {
5127
+ const isCareerMatch = Spacestationtechnology.find((t) => t.techId === 2).careerNames.includes(careerData?.career);
5128
+ const BASE_DISCOUNTS = [0, 0, 0, 0, 0];
5129
+ const CAREER_DISCOUNTS = [0, 0, 10, 15, 20];
5130
+ const baseDiscount = techLevel > 0 ? BASE_DISCOUNTS[techLevel - 1] : 0;
5131
+ const careerDiscount = isCareerMatch ? CAREER_DISCOUNTS[techLevel - 1] : 0;
5132
+ techDiscount = Math.max(baseDiscount, careerDiscount);
5133
+ if (techDiscount > 0) {
5134
+ discountDetails.push(`⚙️ 武器系统 Lv${techLevel}:${techDiscount}%折扣`);
5135
+ }
5136
+ }
5137
+ }
5138
+ let weaponSpecialistDiscount = 0;
5139
+ if (careerData?.career === "武器中士") {
5140
+ weaponSpecialistDiscount = 20;
5141
+ discountDetails.push(`🎖️ 武器中士:20%折扣`);
5142
+ }
4851
5143
  const activeWish = await ctx.database.get("ggcevo_Wish_Record", {
4852
5144
  handle,
4853
5145
  wishname: "蚱蜢优购",
@@ -4855,16 +5147,12 @@ ${items.join("、")}
4855
5147
  endTime: { $gte: /* @__PURE__ */ new Date() },
4856
5148
  isused: false
4857
5149
  }).then((records) => records[0]);
4858
- const grasshopperDiscount = activeWish ? 20 : 0;
4859
- let totalDiscount = techDiscount + grasshopperDiscount;
4860
- totalDiscount = Math.min(totalDiscount, 100);
4861
- const discountDetails = [];
4862
- if (techDiscount > 0) {
4863
- discountDetails.push(`武器系统 Lv${techLevel}:${techDiscount}%`);
4864
- }
5150
+ let grasshopperDiscount = activeWish ? 20 : 0;
4865
5151
  if (grasshopperDiscount > 0) {
4866
- discountDetails.push(`蚱蜢优购:${grasshopperDiscount}%`);
5152
+ discountDetails.push(`🦗 蚱蜢优购:${grasshopperDiscount}%折扣`);
4867
5153
  }
5154
+ let totalDiscount = techDiscount + weaponSpecialistDiscount + grasshopperDiscount;
5155
+ totalDiscount = Math.min(totalDiscount, 100);
4868
5156
  const typeStats = Object.values(weaponConfig).filter((weapon) => weapon.price !== 0).reduce((stats, weapon) => {
4869
5157
  stats[weapon.type] = (stats[weapon.type] || 0) + 1;
4870
5158
  return stats;
@@ -4873,12 +5161,11 @@ ${items.join("、")}
4873
5161
  return [
4874
5162
  "🏪 咕咕武器库分类 🏪",
4875
5163
  '使用 "武器库 类型名称" 查看详细列表',
5164
+ totalDiscount > 0 && `💰 当前折扣:
5165
+ ${discountDetails.length ? `${discountDetails.join("\n")}` : ""}`,
4876
5166
  "====================",
4877
5167
  ...Object.entries(typeStats).map(([typeName, count]) => `▸ ${typeName} (${count}种)`),
4878
- "====================",
4879
- totalDiscount > 0 && `
4880
- 🔧 当前购买折扣:
4881
- ${discountDetails.length ? ` ${discountDetails.join(" \n ")}` : ""}`
5168
+ "===================="
4882
5169
  ].filter(Boolean).join("\n");
4883
5170
  }
4884
5171
  if (!Object.keys(typeStats).includes(type)) {
@@ -4895,21 +5182,21 @@ ${Object.keys(typeStats).join("、")}`;
4895
5182
  `基础伤害:${config2.damage}`,
4896
5183
  `价格:${actualPrice}金币${totalDiscount > 0 ? ` (原价${config2.price})` : ""}`,
4897
5184
  specialEffect,
4898
- // 新增特殊效果显示
4899
5185
  "特性:",
4900
5186
  tagEffectsDesc,
4901
- `描述:${config2.description}`
5187
+ `描述:${config2.description}`,
5188
+ "------------------"
4902
5189
  ].filter(Boolean).join("\n");
4903
5190
  });
4904
5191
  return [
4905
5192
  `🏪 咕咕武器库 - ${type} 🏪`,
4906
- "使用“购买 武器名称”指令进行购买",
4907
- totalDiscount > 0 && `🔧 当前购买折扣:
4908
- ${discountDetails.length ? ` ${discountDetails.join(" \n ")}` : ""}`,
5193
+ '使用"购买 武器名称"指令进行购买',
5194
+ totalDiscount > 0 && `💰 当前折扣:
5195
+ ${discountDetails.length ? `${discountDetails.join("\n")}` : ""}`,
4909
5196
  "====================",
4910
5197
  ...items,
4911
5198
  items.length === 0 ? "⚠️ 该分类下暂无可用武器" : ""
4912
- ].filter(Boolean).join("\n\n");
5199
+ ].filter(Boolean).join("\n");
4913
5200
  });
4914
5201
  ctx.command("ggcevo/爆破库 [type]").usage("输入“爆破库”查看分类,或“爆破库 类型”查看详细物品").action(async ({ session }, type) => {
4915
5202
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
@@ -4941,7 +5228,8 @@ ${validTypes.join("、")}`;
4941
5228
  `类型:${item.type}`,
4942
5229
  `价格:${item.price}金币`,
4943
5230
  `效果:${item.effects}`,
4944
- `描述:${item.description}`
5231
+ `描述:${item.description}`,
5232
+ "------------------"
4945
5233
  ].join("\n"));
4946
5234
  return [
4947
5235
  `💣 爆破装备库 - ${type} 💣`,
@@ -4949,14 +5237,14 @@ ${validTypes.join("、")}`;
4949
5237
  "====================",
4950
5238
  ...items,
4951
5239
  items.length === 0 ? "⚠️ 该分类下暂无可用物品" : ""
4952
- ].join("\n\n");
5240
+ ].join("\n");
4953
5241
  });
4954
5242
  ctx.command("ggcevo/购买 <item>").action(async ({ session }, item) => {
4955
5243
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
4956
- if (!profile) return "🔒 需要先绑定游戏句柄";
5244
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
4957
5245
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
4958
5246
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
4959
- if (existingEntries.length > 0) return "⛔ 您已被列入黑名单";
5247
+ if (existingEntries.length > 0) return "⛔ 您已被列入黑名单。";
4960
5248
  const allItems = { ...weaponConfig, ...SyndicatedItems };
4961
5249
  if (!item) return "请输入“购买 物品名称”来购买所需物品。";
4962
5250
  const config2 = allItems[item];
@@ -5015,7 +5303,7 @@ ${validTypes.join("、")}`;
5015
5303
  if ((signInfo?.totalRewards || 0) < actualPrice) {
5016
5304
  let priceInfo = `需要 ${actualPrice} 金币`;
5017
5305
  if (discountDetails.length > 0) {
5018
- priceInfo += `(原价 ${config2.price})`;
5306
+ priceInfo += `(原价${config2.price})`;
5019
5307
  }
5020
5308
  return `❌ 金币不足,${priceInfo}`;
5021
5309
  }
@@ -5062,7 +5350,7 @@ ${validTypes.join("、")}`;
5062
5350
  `;
5063
5351
  message += `花费 ${actualPrice} 金币`;
5064
5352
  if (discountDetails.length > 0) {
5065
- message += `(原价 ${config2.price} 金币)
5353
+ message += `(原价${config2.price} 金币)
5066
5354
  折扣明细:
5067
5355
  ▸ ${discountDetails.join("\n▸ ")}`;
5068
5356
  }
@@ -5080,7 +5368,7 @@ ${validTypes.join("、")}`;
5080
5368
  });
5081
5369
  ctx.command("ggcevo/武器仓库").action(async ({ session }) => {
5082
5370
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
5083
- if (!profile) return "🔒 需要先绑定游戏句柄";
5371
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
5084
5372
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
5085
5373
  const weapons = await ctx.database.get("ggcevo_equipment", {
5086
5374
  handle
@@ -5112,11 +5400,11 @@ ${validTypes.join("、")}`;
5112
5400
  });
5113
5401
  ctx.command("ggcevo/装备 <weapon>").action(async ({ session }, weapon) => {
5114
5402
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
5115
- if (!profile) return "🔒 需要先绑定游戏句柄";
5403
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
5116
5404
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
5117
5405
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
5118
5406
  if (existingEntries.length > 0) {
5119
- return `⛔ 您已被列入黑名单`;
5407
+ return `⛔ 您已被列入黑名单。`;
5120
5408
  }
5121
5409
  if (!weapon) return "请输入“装备 武器名称”来装备一把你拥有的武器。";
5122
5410
  if (!weaponConfig[weapon]) return "武器名称错误,请输入“装备 武器名称”来装备一把你拥有的武器。";
@@ -5146,10 +5434,10 @@ ${validTypes.join("、")}`;
5146
5434
  });
5147
5435
  ctx.command("ggcevo/升级 <target>", "升级武器或科技").action(async ({ session }, target) => {
5148
5436
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
5149
- if (!profile) return "🔒 需要先绑定游戏句柄";
5437
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
5150
5438
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
5151
5439
  if ((await ctx.database.get("ggcevo_blacklist", { handle })).length) {
5152
- return "⛔ 您已被列入黑名单";
5440
+ return "⛔ 您已被列入黑名单。";
5153
5441
  }
5154
5442
  if (!target) {
5155
5443
  return generateUpgradePriceList(handle);
@@ -5167,10 +5455,10 @@ ${validTypes.join("、")}`;
5167
5455
  });
5168
5456
  ctx.command("ggcevo/改装 <weapon> [mod]", "安装武器模块").action(async ({ session }, weapon, mod) => {
5169
5457
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
5170
- if (!profile) return "🔒 需要先绑定游戏句柄";
5458
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
5171
5459
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
5172
5460
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
5173
- if (existingEntries.length > 0) return "⛔ 您已被列入黑名单";
5461
+ if (existingEntries.length > 0) return "⛔ 您已被列入黑名单。";
5174
5462
  const isValidWeapon = weapon && weaponConfig[weapon]?.id !== void 0;
5175
5463
  const processModInstallation = /* @__PURE__ */ __name(async () => {
5176
5464
  const modInfo = modConfig[mod];
@@ -5216,7 +5504,7 @@ ${validTypes.join("、")}`;
5216
5504
  const actualCost = Math.floor(modInfo.cost * (1 - discountRate / 100));
5217
5505
  const [signInfo] = await ctx.database.get("ggcevo_sign", { handle });
5218
5506
  if ((signInfo?.totalRewards || 0) < actualCost) {
5219
- return `需要 ${actualCost} 金币,当前持有:${signInfo?.totalRewards || 0}`;
5507
+ return `改装需要 ${actualCost} 金币,当前持有:${signInfo?.totalRewards || 0}`;
5220
5508
  }
5221
5509
  await ctx.database.set(
5222
5510
  "ggcevo_equipment",
@@ -5226,13 +5514,15 @@ ${validTypes.join("、")}`;
5226
5514
  await ctx.database.set("ggcevo_sign", { handle }, {
5227
5515
  totalRewards: signInfo.totalRewards - actualCost
5228
5516
  });
5229
- const discountMsg = discountRate > 0 ? `武器升级平台 Lv${techLevel} 折扣:${discountRate}%` : "";
5230
5517
  return [
5231
5518
  `✅ ${weapon} 成功安装 ${mod}!`,
5232
- discountMsg,
5233
- `花费金币:${actualCost}${discountRate > 0 ? `(原价${modInfo.cost})` : ""}`,
5519
+ `花费金币:${actualCost}${discountRate > 0 ? ` (原价${modInfo.cost})` : ""}`,
5520
+ discountRate > 0 && [
5521
+ "折扣明细:",
5522
+ `⚙️ 武器升级平台 Lv${techLevel}:${discountRate}%`
5523
+ ].join("\n"),
5234
5524
  `改装槽:${equipment.installedMods.length + 1}/${equipment.modificationSlots}`
5235
- ].join("\n");
5525
+ ].filter(Boolean).join("\n");
5236
5526
  }, "processModInstallation");
5237
5527
  const showModList = /* @__PURE__ */ __name(async () => {
5238
5528
  const [techData] = await ctx.database.get("ggcevo_tech", { handle, techId: 3 }).catch(() => [{ level: 0 }]);
@@ -5252,8 +5542,8 @@ ${validTypes.join("、")}`;
5252
5542
  return [
5253
5543
  `【${name2}】${config2.isExclusive ? ` (专属:${config2.exclusiveTo})` : ""}`,
5254
5544
  `价格:${actualPrice}金币${discountRate > 0 ? ` (原价${config2.cost})` : ""}`,
5255
- `效果:${config2.effect.replace(/▸/g, "▸ ")}`,
5256
- config2.isExclusive ? "※ 每个武器只能安装一个专属模块" : ""
5545
+ `效果:${config2.effect}`,
5546
+ "------------------"
5257
5547
  ].filter(Boolean).join("\n");
5258
5548
  }, "formatMod");
5259
5549
  const baseUniversalDiscount = [5, 10][techLevel - 1] || 0;
@@ -5265,20 +5555,23 @@ ${validTypes.join("、")}`;
5265
5555
  return [
5266
5556
  `🛠️ ${weapon} 专属模块 🛠️`,
5267
5557
  "使用「改装 武器名称 模块名称」安装",
5268
- exclusiveDiscountRate > 0 && `🔧 当前专属模块折扣:${exclusiveDiscountRate}% (武器升级平台 Lv${techLevel})`,
5558
+ "※ 每个武器只能安装一个专属模块",
5559
+ exclusiveDiscountRate > 0 && `💰 当前专属模块折扣:
5560
+ ⚙️ 武器升级平台 Lv${techLevel}:${exclusiveDiscountRate}%`,
5269
5561
  "====================",
5270
- exclusiveMods.length ? exclusiveMods.join("\n\n") : "该武器暂无专属模块"
5271
- ].filter(Boolean).join("\n\n");
5562
+ exclusiveMods.length ? exclusiveMods.join("\n") : "该武器暂无专属模块"
5563
+ ].filter(Boolean).join("\n");
5272
5564
  } else {
5273
5565
  const universalMods = Object.entries(modConfig).filter(([_, m]) => !m.isExclusive).map(([name2, cfg]) => formatMod(name2, cfg));
5274
5566
  return [
5275
5567
  "🛠️ 通用武器模块 🛠️",
5276
5568
  "使用「改装 武器名称 模块名称」安装通用模块",
5277
- "输入「改装 武器名称」查询武器的专属模块",
5278
- universalDiscountRate > 0 && `🔧 当前通用模块折扣:${universalDiscountRate}% (武器升级平台 Lv${techLevel})`,
5569
+ "使用「改装 武器名称」查询武器专属模块",
5570
+ universalDiscountRate > 0 && `💰 当前通用模块折扣:
5571
+ ⚙️ 武器升级平台 Lv${techLevel}:${universalDiscountRate}%`,
5279
5572
  "====================",
5280
- universalMods.join("\n\n")
5281
- ].filter(Boolean).join("\n\n");
5573
+ universalMods.join("\n")
5574
+ ].filter(Boolean).join("\n");
5282
5575
  }
5283
5576
  }, "showModList");
5284
5577
  if (mod) {
@@ -5289,10 +5582,10 @@ ${validTypes.join("、")}`;
5289
5582
  });
5290
5583
  ctx.command("ggcevo/拆卸 <weapon> <mod>", "卸载武器模块,专属模块返还50%金币,通用模块返还80%金币").action(async ({ session }, weapon, mod) => {
5291
5584
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
5292
- if (!profile) return "🔒 需要先绑定游戏句柄";
5585
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
5293
5586
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
5294
5587
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
5295
- if (existingEntries.length > 0) return "⛔ 您已被列入黑名单";
5588
+ if (existingEntries.length > 0) return "⛔ 您已被列入黑名单。";
5296
5589
  const weaponId = weaponConfig[weapon]?.id;
5297
5590
  if (!weaponId) return "❌ 请输入“拆卸 武器名称 模块名称”\n注意:专属模块返还50%金币,通用模块返还80%金币";
5298
5591
  const modInfo = modConfig[mod];
@@ -5334,10 +5627,10 @@ ${validTypes.join("、")}`;
5334
5627
  let scatterBroadcast = null;
5335
5628
  let cleanerRewardBroadcast = null;
5336
5629
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
5337
- if (!profile) return "🔒 需要先绑定游戏句柄";
5630
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
5338
5631
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
5339
5632
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
5340
- if (existingEntries.length > 0) return "⛔ 您已被列入黑名单";
5633
+ if (existingEntries.length > 0) return "⛔ 您已被列入黑名单。";
5341
5634
  const getActiveBossNames = /* @__PURE__ */ __name(async () => {
5342
5635
  const activeBosses2 = await ctx.database.get("ggcevo_boss", { isActive: true });
5343
5636
  return activeBosses2.map((b) => b.name).join(",");
@@ -5500,12 +5793,14 @@ ${validTypes.join("、")}`;
5500
5793
  "🏆 伤害排行榜奖励:",
5501
5794
  ...rewardMessages
5502
5795
  ];
5503
- cleanerRewardBroadcast = await getCleanerRewardBroadcast(
5504
- ctx,
5505
- targetBoss,
5506
- handle,
5507
- session.username
5508
- );
5796
+ if (!(equippedWeapon.installedMods?.includes("光束曲射晶片") && weaponName === "碎骨步枪") && !(weaponName === "中子步枪")) {
5797
+ cleanerRewardBroadcast = await getCleanerRewardBroadcast(
5798
+ ctx,
5799
+ targetBoss,
5800
+ handle,
5801
+ session.username
5802
+ );
5803
+ }
5509
5804
  } else {
5510
5805
  await ctx.database.set(
5511
5806
  "ggcevo_boss",
@@ -5551,12 +5846,14 @@ ${validTypes.join("、")}`;
5551
5846
  }
5552
5847
  }
5553
5848
  bossEventBroadcast = broadcastMessages2;
5554
- cleanerRewardBroadcast = await getCleanerRewardBroadcast(
5555
- ctx,
5556
- targetBoss,
5557
- handle,
5558
- session.username
5559
- );
5849
+ if (!(equippedWeapon.installedMods?.includes("光束曲射晶片") && weaponName === "碎骨步枪") && !(weaponName === "中子步枪")) {
5850
+ cleanerRewardBroadcast = await getCleanerRewardBroadcast(
5851
+ ctx,
5852
+ targetBoss,
5853
+ handle,
5854
+ session.username
5855
+ );
5856
+ }
5560
5857
  }
5561
5858
  } else {
5562
5859
  await ctx.database.set(
@@ -5580,13 +5877,12 @@ ${validTypes.join("、")}`;
5580
5877
  techId: 4
5581
5878
  });
5582
5879
  let techBonusPercent = 0;
5583
- if (securityTech && securityTech.level >= 1) {
5880
+ if (securityTech && securityTech.level >= 1 && careerData?.group === "人类联盟") {
5584
5881
  const techLevel = securityTech.level - 1;
5585
5882
  const securityConfig = Spacestationtechnology.find((t) => t.techId === 4);
5586
5883
  const isEligibleForCareerBonus = securityConfig?.careerNames.includes(career);
5587
5884
  techBonusPercent = isEligibleForCareerBonus ? SECURITY_BONUS_MAPPING.career[techLevel] : SECURITY_BONUS_MAPPING.base[techLevel];
5588
5885
  }
5589
- const techMessage = techBonusPercent ? ` + ${techBonusPercent}% (${securityTech.level}级安防系统${career ? ` + ${career}职业加成` : ""})` : "";
5590
5886
  let careerMultiplier = 0;
5591
5887
  let careerMessage = "";
5592
5888
  let redcrystalMessage = "";
@@ -5645,17 +5941,19 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
5645
5941
  isDefeated ? `🎉 恭喜,已成功击败 ${targetBoss.name}!` : ""
5646
5942
  ].filter((line) => line).join("\n");
5647
5943
  await session.send(resultMessage);
5944
+ const isScatterAttack = equippedWeapon.installedMods?.includes("光束曲射晶片") && weaponName === "碎骨步枪" || weaponName === "中子步枪";
5648
5945
  const broadcastMessages = [];
5649
5946
  const groupId = [...config2.groupId];
5650
5947
  if (scatterBroadcast) {
5651
5948
  const scatterMsg = Array.isArray(scatterBroadcast) ? scatterBroadcast.join("\n") : scatterBroadcast;
5652
- broadcastMessages.push(scatterMsg);
5949
+ broadcastMessages.push(`✨ 散射攻击结果
5950
+ ${scatterMsg}`);
5653
5951
  }
5654
5952
  if (bossEventBroadcast) {
5655
5953
  const bossMsg = Array.isArray(bossEventBroadcast) ? bossEventBroadcast.join("\n") : bossEventBroadcast;
5656
5954
  broadcastMessages.push(bossMsg);
5657
5955
  }
5658
- if (cleanerRewardBroadcast && cleanerRewardBroadcast.length > 0) {
5956
+ if (!isScatterAttack && cleanerRewardBroadcast && cleanerRewardBroadcast.length > 0) {
5659
5957
  broadcastMessages.push(cleanerRewardBroadcast.join("\n"));
5660
5958
  }
5661
5959
  if (broadcastMessages.length > 0) {
@@ -5668,10 +5966,10 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
5668
5966
  const parseList = /* @__PURE__ */ __name((str) => str ? str.split(",").map((s) => s.trim()).filter(Boolean) : [], "parseList");
5669
5967
  const tags = parseList(options.tags);
5670
5968
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
5671
- if (!profile) return "🔒 需要先绑定游戏句柄";
5969
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
5672
5970
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
5673
5971
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
5674
- if (existingEntries.length > 0) return "⛔ 您已被列入黑名单";
5972
+ if (existingEntries.length > 0) return "⛔ 您已被列入黑名单。";
5675
5973
  const [equippedWeapon] = await ctx.database.get("ggcevo_equipment", {
5676
5974
  handle,
5677
5975
  equipped: true
@@ -5751,7 +6049,7 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
5751
6049
  const mainBossHpBar = createHpBar(mainBoss.HP, bossGroup.main.maxHP);
5752
6050
  const result = [
5753
6051
  `🔴 主宰:${mainBoss.name}`,
5754
- `❤️ ${mainBossHpBar} (${mainBoss.HP}/${bossGroup.main.maxHP})`
6052
+ `${mainBossHpBar} (${mainBoss.HP}/${bossGroup.main.maxHP})`
5755
6053
  ];
5756
6054
  if (bossGroup.main.energy > 0) {
5757
6055
  result.push(`⚡ 能量:${mainBoss.energy}/1000`);
@@ -5780,8 +6078,8 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
5780
6078
  const minionConfig = bossGroup.minions.find((m) => m.name === minion.name);
5781
6079
  const minionHpBar = createHpBar(minion.HP, minionConfig?.maxHP || 1e3);
5782
6080
  const minionInfo = [
5783
- `👤 ${minion.name}`,
5784
- `❤️ ${minionHpBar} (${minion.HP}/${minionConfig?.maxHP || "未知"})`
6081
+ `❤️ ${minion.name}`,
6082
+ `${minionHpBar} (${minion.HP}/${minionConfig?.maxHP || "未知"})`
5785
6083
  ];
5786
6084
  if (minionConfig && minionConfig.energy > 0) {
5787
6085
  minionInfo.push(`⚡ 能量:${minion.energy}/1000`);
@@ -5845,11 +6143,11 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
5845
6143
  ctx.command("ggcevo/祈愿").action(async (argv) => {
5846
6144
  const session = argv.session;
5847
6145
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
5848
- if (!profile) return "🔒 需要先绑定游戏句柄";
6146
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
5849
6147
  const { regionId, realmId, profileId } = profile;
5850
6148
  const handle = `${regionId}-S2-${realmId}-${profileId}`;
5851
6149
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
5852
- if (existingEntries.length > 0) return "⛔ 您已被列入黑名单";
6150
+ if (existingEntries.length > 0) return "⛔ 您已被列入黑名单。";
5853
6151
  const [sign] = await ctx.database.get("ggcevo_sign", { handle });
5854
6152
  if (!sign || sign.totalRewards < 50) return "需要50金币进行祈愿,您的金币不足。";
5855
6153
  const now = /* @__PURE__ */ new Date();
@@ -5922,12 +6220,12 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
5922
6220
  });
5923
6221
  ctx.command("ggcevo/兑换金币", "使用兑换券兑换金币").action(async ({ session }) => {
5924
6222
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
5925
- if (!profile) return "🔒 需要先绑定游戏句柄";
6223
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
5926
6224
  const { regionId, realmId, profileId } = profile;
5927
6225
  const handle = `${regionId}-S2-${realmId}-${profileId}`;
5928
6226
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
5929
6227
  if (existingEntries.length > 0) {
5930
- return `⛔ 您已被列入黑名单`;
6228
+ return `⛔ 您已被列入黑名单。`;
5931
6229
  }
5932
6230
  await session.send(`请输入你要使用多少张兑换券来兑换金币?(请在30秒内回复数字,回复“0”为取消兑换)
5933
6231
  注意:1张兑换券=2000金币`);
@@ -5961,11 +6259,11 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
5961
6259
  });
5962
6260
  ctx.command("ggcevo/兑换红晶", "使用金币兑换红晶").action(async ({ session }) => {
5963
6261
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
5964
- if (!profile) return "🔒 需要先绑定游戏句柄";
6262
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
5965
6263
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
5966
6264
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
5967
6265
  if (existingEntries.length > 0) {
5968
- return `⛔ 您已被列入黑名单`;
6266
+ return `⛔ 您已被列入黑名单。`;
5969
6267
  }
5970
6268
  const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
5971
6269
  if (!careerData || careerData.group !== "辛迪加海盗") {
@@ -6001,12 +6299,12 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
6001
6299
  });
6002
6300
  ctx.command("ggcevo/加入 <faction>", "加入阵营").alias("加入阵营").action(async ({ session }, faction) => {
6003
6301
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
6004
- if (!profile) return "🔒 需要先绑定游戏句柄";
6302
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
6005
6303
  const { regionId, realmId, profileId } = profile;
6006
6304
  const handle = `${regionId}-S2-${realmId}-${profileId}`;
6007
6305
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
6008
6306
  if (existingEntries.length > 0) {
6009
- return `⛔ 您已被列入黑名单`;
6307
+ return `⛔ 您已被列入黑名单。`;
6010
6308
  }
6011
6309
  const validFactions = ["人类联盟", "辛迪加海盗"];
6012
6310
  if (!faction) return `请输入“加入 阵营名称”加入对应阵营
@@ -6067,11 +6365,11 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
6067
6365
  });
6068
6366
  ctx.command("ggcevo/转职 [profession]", "转职系统").action(async ({ session }, profession) => {
6069
6367
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
6070
- if (!profile) return "🔒 需要先绑定游戏句柄";
6368
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
6071
6369
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
6072
6370
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
6073
6371
  if (existingEntries.length > 0) {
6074
- return `⛔ 您已被列入黑名单`;
6372
+ return `⛔ 您已被列入黑名单。`;
6075
6373
  }
6076
6374
  const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
6077
6375
  if (!careerData) return "请先加入阵营后使用转职功能。";
@@ -6151,7 +6449,7 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
6151
6449
  const [profile] = await ctx.database.get("sc2arcade_player", {
6152
6450
  userId: session.userId
6153
6451
  });
6154
- if (!profile) return "🔒 需要先绑定游戏句柄";
6452
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
6155
6453
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
6156
6454
  const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
6157
6455
  if (!careerData) return "您尚未加入任何阵营。";
@@ -6194,7 +6492,7 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
6194
6492
  });
6195
6493
  ctx.command("ggcevo/黑市 [type]", "辛迪加海盗专属黑市").usage("输入“黑市”查看类型,或“黑市 类型”查看详细").action(async ({ session }, type) => {
6196
6494
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
6197
- if (!profile) return "🔒 需要先绑定游戏句柄";
6495
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
6198
6496
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
6199
6497
  const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
6200
6498
  if (!careerData || careerData.group !== "辛迪加海盗") {
@@ -6210,13 +6508,16 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
6210
6508
  });
6211
6509
  if (!type) {
6212
6510
  return [
6213
- "🏴☠️ 辛迪加黑市 🏴☠️",
6511
+ "🏴 辛迪加黑市 🏴",
6214
6512
  '使用 "黑市 类型名称" 查看详细信息',
6513
+ // 添加计算机专家提示 - 优化为带emoji的分行显示
6514
+ isComputerExpert ? [
6515
+ "💰 当前折扣:",
6516
+ "💻 计算机专家:设备工具类物品50%折扣"
6517
+ ].join("\n") : "",
6215
6518
  "====================",
6216
6519
  ...Object.entries(typeStats).map(([typeName, count]) => `▸ ${typeName} (${count}种)`),
6217
- "====================",
6218
- // 添加计算机专家提示
6219
- isComputerExpert ? "💳 计算机专家可享受设备工具类物品50%折扣!" : ""
6520
+ "===================="
6220
6521
  ].join("\n");
6221
6522
  }
6222
6523
  const normalizedType = Object.keys(typeStats).find((t) => t === type);
@@ -6239,7 +6540,7 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
6239
6540
  }
6240
6541
  infoBlocks.push(
6241
6542
  `描述:${config2.description}`,
6242
- "──────────────"
6543
+ "------------------"
6243
6544
  );
6244
6545
  return infoBlocks.join("\n");
6245
6546
  }),
@@ -6263,26 +6564,33 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
6263
6564
  infoBlocks.push(
6264
6565
  `特殊效果:${item.effects}`,
6265
6566
  `描述:${item.description}`,
6266
- "──────────────"
6567
+ "------------------"
6267
6568
  );
6268
6569
  return infoBlocks.join("\n");
6269
6570
  })
6270
6571
  ];
6572
+ let discountInfo = [];
6573
+ if (isComputerExpert && normalizedType === "设备工具") {
6574
+ discountInfo = [
6575
+ "💰 当前折扣:",
6576
+ "💻 计算机专家:设备工具类物品50%折扣"
6577
+ ];
6578
+ }
6271
6579
  return [
6272
6580
  `🏴☠️ 辛迪加黑市 - ${normalizedType} 🏴☠️`,
6273
- "使用“订购 物品名称”进行购买(仅消耗红晶)",
6274
- // 计算机专家专属提示
6275
- isComputerExpert && normalizedType === "设备工具" ? "💳 计算机专家可享受50%折扣!" : "",
6581
+ '使用"订购 物品名称"进行购买(仅消耗红晶)',
6582
+ // 显示折扣信息(如果有)
6583
+ ...discountInfo,
6276
6584
  "====================",
6277
6585
  ...items
6278
- ].filter(Boolean).join("\n\n");
6586
+ ].filter(Boolean).join("\n");
6279
6587
  });
6280
6588
  ctx.command("ggcevo/订购 <item>").action(async ({ session }, item) => {
6281
6589
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
6282
- if (!profile) return "🔒 需要先绑定游戏句柄";
6590
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
6283
6591
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
6284
6592
  if (await ctx.database.get("ggcevo_blacklist", { handle }).then((r) => r.length)) {
6285
- return "⛔ 您已被列入黑名单";
6593
+ return "⛔ 您已被列入黑名单。";
6286
6594
  }
6287
6595
  const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
6288
6596
  if (!careerData || careerData.group !== "辛迪加海盗") {
@@ -6347,44 +6655,50 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
6347
6655
  }], ["handle", "itemId"]);
6348
6656
  }
6349
6657
  });
6350
- let discountInfo = "";
6351
- if (discountApplied) {
6352
- discountInfo = `
6353
- 💳 计算机专家职业加成:设备工具类物品50%折扣`;
6354
- }
6355
- if (isWeapon) {
6356
- const equippedStatus = await ctx.database.get("ggcevo_equipment", {
6357
- handle,
6358
- weaponId: itemConfig2.id
6359
- }).then((r) => r[0]?.equipped ? "已自动装备武器" : "需手动装备武器");
6360
- return [
6361
- `✅ 成功订购【${item}】!`,
6362
- `消耗红晶:${finalCost}${discountInfo}`,
6363
- `装备状态:${equippedStatus}`,
6364
- '输入 "武器仓库" 管理武器'
6365
- ].join("\n");
6366
- } else {
6367
- const currentStock = await ctx.database.get("ggcevo_warehouse", {
6368
- handle,
6369
- itemId: itemConfig2.id
6370
- }).then((r) => r[0]?.quantity || 1);
6371
- let priceInfo = `消耗红晶:${finalCost}`;
6372
- if (isComputerExpertDiscount) {
6373
- priceInfo += `(原价${originalPrice})`;
6658
+ const buildResponse = /* @__PURE__ */ __name(async () => {
6659
+ const discountLines = [];
6660
+ if (discountApplied) {
6661
+ discountLines.push("💻 计算机专家:设备工具类物品50%折扣");
6374
6662
  }
6375
- priceInfo += discountInfo;
6376
- return [
6377
- `✅ 成功订购【${item}】x1!`,
6378
- priceInfo,
6379
- `当前库存:${currentStock}件`,
6380
- '输入 "仓库" 查看所有物品'
6381
- ].join("\n");
6382
- }
6663
+ const priceInfo = [
6664
+ `消耗红晶:${finalCost}${discountApplied ? ` (原价${originalPrice})` : ""}`
6665
+ ];
6666
+ if (discountApplied) {
6667
+ priceInfo.push("折扣明细:");
6668
+ priceInfo.push(...discountLines);
6669
+ }
6670
+ if (isWeapon) {
6671
+ const equippedStatus = await ctx.database.get("ggcevo_equipment", {
6672
+ handle,
6673
+ weaponId: itemConfig2.id
6674
+ }).then((r) => r[0]?.equipped ? "已自动装备武器" : "需手动装备武器");
6675
+ return [
6676
+ `✅ 成功订购【${item}】!`,
6677
+ ...priceInfo,
6678
+ // 价格和折扣信息显示在一起
6679
+ `装备状态:${equippedStatus}`,
6680
+ '输入 "武器仓库" 管理武器'
6681
+ ].filter(Boolean).join("\n");
6682
+ } else {
6683
+ const currentStock = await ctx.database.get("ggcevo_warehouse", {
6684
+ handle,
6685
+ itemId: itemConfig2.id
6686
+ }).then((r) => r[0]?.quantity || 1);
6687
+ return [
6688
+ `✅ 成功订购【${item}】x1!`,
6689
+ ...priceInfo,
6690
+ // 价格和折扣信息显示在一起
6691
+ `当前库存:${currentStock}件`,
6692
+ '输入 "仓库" 查看所有物品'
6693
+ ].filter(Boolean).join("\n");
6694
+ }
6695
+ }, "buildResponse");
6696
+ return await buildResponse();
6383
6697
  });
6384
6698
  ctx.command("ggcevo/仓库").action(async (argv) => {
6385
6699
  const session = argv.session;
6386
6700
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
6387
- if (!profile) return "🔒 需要先绑定游戏句柄";
6701
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
6388
6702
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
6389
6703
  const [items, signData, careerData] = await Promise.all([
6390
6704
  ctx.database.get("ggcevo_warehouse", { handle }),
@@ -6428,10 +6742,10 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
6428
6742
  ctx.command("ggcevo/使用 [itemName] [target]").action(async (argv, itemName, target) => {
6429
6743
  const session = argv.session;
6430
6744
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
6431
- if (!profile) return "🔒 需要先绑定游戏句柄";
6745
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
6432
6746
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
6433
6747
  if (await ctx.database.get("ggcevo_blacklist", { handle }).then((r) => r.length)) {
6434
- return "⛔ 您已被列入黑名单";
6748
+ return "⛔ 您已被列入黑名单。";
6435
6749
  }
6436
6750
  try {
6437
6751
  if (!itemName) return "请输入“使用 物品名称 (可选目标)”使用仓库中的物品。";
@@ -6458,9 +6772,8 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
6458
6772
  );
6459
6773
  return [
6460
6774
  `✅ 成功使用 ${itemNameConfirmed}`,
6461
- `├ 剩余数量:${newQuantity}`,
6462
- `└ 效果触发:${effectResult.message}`,
6463
- "─".repeat(14)
6775
+ `剩余数量:${newQuantity}`,
6776
+ `效果触发:${effectResult.message}`
6464
6777
  ].join("\n");
6465
6778
  } catch (error) {
6466
6779
  ctx.logger("GGCEVO").error(error);
@@ -6469,7 +6782,7 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
6469
6782
  });
6470
6783
  ctx.command("ggcevo/科技 [techName]", "查看空间站科技信息").usage("输入“科技”查看列表,或“科技 科技名称”查看详细信息").action(async ({ session }, techName) => {
6471
6784
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
6472
- if (!profile) return "🔒 需要先绑定游戏句柄";
6785
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
6473
6786
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
6474
6787
  const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
6475
6788
  if (!careerData || careerData.group !== "人类联盟") {
@@ -6484,11 +6797,13 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
6484
6797
  return [
6485
6798
  "🛰️ 空间站科技系统 🛰️",
6486
6799
  '使用 "科技 科技名称" 查看详细信息',
6800
+ isIntelligenceOfficer ? [
6801
+ "💰 当前折扣:",
6802
+ "🎖️ 情报副官:20%"
6803
+ ].join("\n") : "",
6487
6804
  "====================",
6488
6805
  ...techList,
6489
- "====================",
6490
- isIntelligenceOfficer && "※ 情报副官享受20%升级折扣"
6491
- // 新增折扣提示
6806
+ "===================="
6492
6807
  ].filter(Boolean).join("\n");
6493
6808
  }
6494
6809
  const tech = Spacestationtechnology.find(
@@ -6509,22 +6824,29 @@ ${Spacestationtechnology.map((t) => t.techname).join("、")}`;
6509
6824
  "------------------"
6510
6825
  ].join("\n");
6511
6826
  });
6827
+ let discountInfo = [];
6828
+ if (isIntelligenceOfficer) {
6829
+ discountInfo = [
6830
+ "💰 当前折扣:",
6831
+ "🎖️ 情报副官:20%"
6832
+ ];
6833
+ }
6512
6834
  return [
6513
6835
  `🛠️ ${tech.techname} 科技详情 🛠️`,
6514
6836
  `最大可升级等级:${romanNumerals[tech.maxLevel]}`,
6515
6837
  '使用 "升级 科技名称" 进行升级',
6838
+ ...discountInfo,
6839
+ // 插入折扣信息
6516
6840
  "====================",
6517
- ...techDetails,
6518
- isIntelligenceOfficer && "※ 情报副官享受20%升级折扣"
6519
- // 新增折扣提示
6841
+ ...techDetails
6520
6842
  ].filter(Boolean).join("\n");
6521
6843
  });
6522
6844
  ctx.command("ggcevo/挖矿").action(async ({ session }) => {
6523
6845
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
6524
- if (!profile) return "🔒 需要先绑定游戏句柄";
6846
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
6525
6847
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
6526
6848
  if (await ctx.database.get("ggcevo_blacklist", { handle }).then((r) => r.length)) {
6527
- return "⛔ 您已被列入黑名单";
6849
+ return "⛔ 您已被列入黑名单。";
6528
6850
  }
6529
6851
  const [career] = await ctx.database.get("ggcevo_careers", { handle });
6530
6852
  if (!career || career.group !== "人类联盟") {
@@ -6631,7 +6953,8 @@ ${Spacestationtechnology.map((t) => t.techname).join("、")}`;
6631
6953
  `类型: ${task2.type}`,
6632
6954
  `目标: ${task2.target}次`,
6633
6955
  `奖励: ${task2.price}金币`,
6634
- `进度: ${completionStatus}`
6956
+ `进度: ${completionStatus}`,
6957
+ "------------------"
6635
6958
  ].join("\n"));
6636
6959
  }
6637
6960
  return [
@@ -6640,7 +6963,7 @@ ${Spacestationtechnology.map((t) => t.techname).join("、")}`;
6640
6963
  "====================",
6641
6964
  ...taskList,
6642
6965
  "===================="
6643
- ].join("\n\n");
6966
+ ].join("\n");
6644
6967
  }
6645
6968
  const task = Object.entries(Tasklist).find(
6646
6969
  ([taskName]) => taskName === name2
@@ -6661,10 +6984,10 @@ ${Spacestationtechnology.map((t) => t.techname).join("、")}`;
6661
6984
  `任务奖励: ${task.price}金币`,
6662
6985
  `当前进度: ${progress}/${task.target}`,
6663
6986
  `累计完成: ${completions}次`,
6664
- "-------------------",
6987
+ "------------------",
6665
6988
  "任务描述:",
6666
6989
  task.description,
6667
- "-------------------",
6990
+ "------------------",
6668
6991
  "完成条件:",
6669
6992
  task.condition,
6670
6993
  "====================",
@@ -6676,7 +6999,7 @@ ${Spacestationtechnology.map((t) => t.techname).join("、")}`;
6676
6999
  if (!profile) return "⚠️ 需要先绑定游戏句柄";
6677
7000
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
6678
7001
  if (await ctx.database.get("ggcevo_blacklist", { handle }).then((r) => r.length)) {
6679
- return "⛔ 您已被列入黑名单";
7002
+ return "⛔ 您已被列入黑名单。";
6680
7003
  }
6681
7004
  const taskEntry = Object.entries(Tasklist).find(
6682
7005
  ([taskName2]) => taskName2.includes(name2)