koishi-plugin-ggcevo-game 1.3.62 → 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 +590 -288
  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 = [
@@ -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
  };
@@ -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];
@@ -4589,7 +4860,7 @@ ${items.join("、")}
4589
4860
  const hasProtection = diffInDays < 30;
4590
4861
  const isPKDisabled = targetPKRecord && !targetPKRecord.enable;
4591
4862
  if ((isNewPlayer || isPKDisabled) && hasProtection) {
4592
- return `🛡️ 该玩家是人类联盟成员,尚在30天保护期内(剩余${30 - diffInDays}天),无法挑战`;
4863
+ return `🛡️ 该玩家是人类联盟成员,当前处于30天保护期内(剩余${30 - diffInDays}天),无法PK`;
4593
4864
  }
4594
4865
  }
4595
4866
  let initiatorPK;
@@ -4783,23 +5054,23 @@ ${items.join("、")}
4783
5054
  `🎰 金币变动:${stealPercentage}%`
4784
5055
  ];
4785
5056
  if (targetCareer.group === "人类联盟" && isWin) {
4786
- result.push(`🛡️ 人类联盟保护:${targetRankname} 被动应战的PK失败时仅损失1%的金币`);
5057
+ result.push(`🛡️ 人类联盟:应战者PK失败时仅损失1%的金币`);
4787
5058
  }
4788
5059
  if (computerExpertProtection) {
4789
- result.push(`💻 计算机专家职业加成:${targetRankname} 被动应战的PK失败时不损失金币`);
5060
+ result.push(`💻 计算机专家:应战者PK失败时不损失金币`);
4790
5061
  } else if (isWin) {
4791
5062
  result.push(`💰 您从对方的口袋里抢夺了${goldTransfer}枚金币`);
4792
5063
  } else {
4793
5064
  result.push(`💸 您从口袋里拿出了${goldTransfer}枚金币上交给对方`);
4794
5065
  }
4795
5066
  if (mp3Effect) {
4796
- result.push(`💿 MP3播放器生效:${initiatorRankname} 主动发起的PK失败时上交的金币减少50%`);
5067
+ result.push(`💿 MP3播放器:挑战者PK失败时上交的金币减少50%`);
4797
5068
  }
4798
5069
  if (initiatorCareer?.group === "辛迪加海盗") {
4799
- result.push(`🔴 辛迪加海盗阵营加成:${initiatorRankname} 获得1枚红晶`);
5070
+ result.push(`🔴 辛迪加海盗:+1枚红晶`);
4800
5071
  }
4801
5072
  if (isWin && initiatorCareer?.career === "辛迪加财务经理") {
4802
- result.push(`💰 辛迪加财务经理职业加成:${initiatorRankname} 额外获得1枚红晶`);
5073
+ result.push(`💰 辛迪加财务经理:+1枚红晶`);
4803
5074
  }
4804
5075
  result.push(`📅 剩余挑战次数:${config.dailyPKLimit - (initiatorPK.todayCount + 1)}`);
4805
5076
  return result.join("\n");
@@ -4810,7 +5081,7 @@ ${items.join("、")}
4810
5081
  });
4811
5082
  ctx.command("ggcevo/pk榜 [page]", "查看玩家PK排行榜").usage("输入 pk榜 [页码] 查看对应页的排行榜,每页10条").action(async ({ session }, page) => {
4812
5083
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
4813
- if (!profile) return "🔒 需要先绑定游戏句柄";
5084
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
4814
5085
  const pageNum = parseInt(page) || 1;
4815
5086
  if (pageNum < 1) return "请输入有效的页码。";
4816
5087
  const offset = (pageNum - 1) * 10;
@@ -4860,14 +5131,14 @@ ${items.join("、")}
4860
5131
  const careerDiscount = isCareerMatch ? CAREER_DISCOUNTS[techLevel - 1] : 0;
4861
5132
  techDiscount = Math.max(baseDiscount, careerDiscount);
4862
5133
  if (techDiscount > 0) {
4863
- discountDetails.push(`⚙️ 武器系统 Lv${techLevel}:${techDiscount}%`);
5134
+ discountDetails.push(`⚙️ 武器系统 Lv${techLevel}:${techDiscount}%折扣`);
4864
5135
  }
4865
5136
  }
4866
5137
  }
4867
5138
  let weaponSpecialistDiscount = 0;
4868
5139
  if (careerData?.career === "武器中士") {
4869
5140
  weaponSpecialistDiscount = 20;
4870
- discountDetails.push(`🎖️ 武器中士:20%`);
5141
+ discountDetails.push(`🎖️ 武器中士:20%折扣`);
4871
5142
  }
4872
5143
  const activeWish = await ctx.database.get("ggcevo_Wish_Record", {
4873
5144
  handle,
@@ -4878,7 +5149,7 @@ ${items.join("、")}
4878
5149
  }).then((records) => records[0]);
4879
5150
  let grasshopperDiscount = activeWish ? 20 : 0;
4880
5151
  if (grasshopperDiscount > 0) {
4881
- discountDetails.push(`🦗 蚱蜢优购:${grasshopperDiscount}%`);
5152
+ discountDetails.push(`🦗 蚱蜢优购:${grasshopperDiscount}%折扣`);
4882
5153
  }
4883
5154
  let totalDiscount = techDiscount + weaponSpecialistDiscount + grasshopperDiscount;
4884
5155
  totalDiscount = Math.min(totalDiscount, 100);
@@ -4970,10 +5241,10 @@ ${validTypes.join("、")}`;
4970
5241
  });
4971
5242
  ctx.command("ggcevo/购买 <item>").action(async ({ session }, item) => {
4972
5243
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
4973
- if (!profile) return "🔒 需要先绑定游戏句柄";
5244
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
4974
5245
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
4975
5246
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
4976
- if (existingEntries.length > 0) return "⛔ 您已被列入黑名单";
5247
+ if (existingEntries.length > 0) return "⛔ 您已被列入黑名单。";
4977
5248
  const allItems = { ...weaponConfig, ...SyndicatedItems };
4978
5249
  if (!item) return "请输入“购买 物品名称”来购买所需物品。";
4979
5250
  const config2 = allItems[item];
@@ -5032,7 +5303,7 @@ ${validTypes.join("、")}`;
5032
5303
  if ((signInfo?.totalRewards || 0) < actualPrice) {
5033
5304
  let priceInfo = `需要 ${actualPrice} 金币`;
5034
5305
  if (discountDetails.length > 0) {
5035
- priceInfo += `(原价 ${config2.price})`;
5306
+ priceInfo += `(原价${config2.price})`;
5036
5307
  }
5037
5308
  return `❌ 金币不足,${priceInfo}`;
5038
5309
  }
@@ -5079,7 +5350,7 @@ ${validTypes.join("、")}`;
5079
5350
  `;
5080
5351
  message += `花费 ${actualPrice} 金币`;
5081
5352
  if (discountDetails.length > 0) {
5082
- message += `(原价 ${config2.price} 金币)
5353
+ message += `(原价${config2.price} 金币)
5083
5354
  折扣明细:
5084
5355
  ▸ ${discountDetails.join("\n▸ ")}`;
5085
5356
  }
@@ -5097,7 +5368,7 @@ ${validTypes.join("、")}`;
5097
5368
  });
5098
5369
  ctx.command("ggcevo/武器仓库").action(async ({ session }) => {
5099
5370
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
5100
- if (!profile) return "🔒 需要先绑定游戏句柄";
5371
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
5101
5372
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
5102
5373
  const weapons = await ctx.database.get("ggcevo_equipment", {
5103
5374
  handle
@@ -5129,11 +5400,11 @@ ${validTypes.join("、")}`;
5129
5400
  });
5130
5401
  ctx.command("ggcevo/装备 <weapon>").action(async ({ session }, weapon) => {
5131
5402
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
5132
- if (!profile) return "🔒 需要先绑定游戏句柄";
5403
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
5133
5404
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
5134
5405
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
5135
5406
  if (existingEntries.length > 0) {
5136
- return `⛔ 您已被列入黑名单`;
5407
+ return `⛔ 您已被列入黑名单。`;
5137
5408
  }
5138
5409
  if (!weapon) return "请输入“装备 武器名称”来装备一把你拥有的武器。";
5139
5410
  if (!weaponConfig[weapon]) return "武器名称错误,请输入“装备 武器名称”来装备一把你拥有的武器。";
@@ -5163,10 +5434,10 @@ ${validTypes.join("、")}`;
5163
5434
  });
5164
5435
  ctx.command("ggcevo/升级 <target>", "升级武器或科技").action(async ({ session }, target) => {
5165
5436
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
5166
- if (!profile) return "🔒 需要先绑定游戏句柄";
5437
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
5167
5438
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
5168
5439
  if ((await ctx.database.get("ggcevo_blacklist", { handle })).length) {
5169
- return "⛔ 您已被列入黑名单";
5440
+ return "⛔ 您已被列入黑名单。";
5170
5441
  }
5171
5442
  if (!target) {
5172
5443
  return generateUpgradePriceList(handle);
@@ -5184,10 +5455,10 @@ ${validTypes.join("、")}`;
5184
5455
  });
5185
5456
  ctx.command("ggcevo/改装 <weapon> [mod]", "安装武器模块").action(async ({ session }, weapon, mod) => {
5186
5457
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
5187
- if (!profile) return "🔒 需要先绑定游戏句柄";
5458
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
5188
5459
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
5189
5460
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
5190
- if (existingEntries.length > 0) return "⛔ 您已被列入黑名单";
5461
+ if (existingEntries.length > 0) return "⛔ 您已被列入黑名单。";
5191
5462
  const isValidWeapon = weapon && weaponConfig[weapon]?.id !== void 0;
5192
5463
  const processModInstallation = /* @__PURE__ */ __name(async () => {
5193
5464
  const modInfo = modConfig[mod];
@@ -5311,10 +5582,10 @@ ${validTypes.join("、")}`;
5311
5582
  });
5312
5583
  ctx.command("ggcevo/拆卸 <weapon> <mod>", "卸载武器模块,专属模块返还50%金币,通用模块返还80%金币").action(async ({ session }, weapon, mod) => {
5313
5584
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
5314
- if (!profile) return "🔒 需要先绑定游戏句柄";
5585
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
5315
5586
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
5316
5587
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
5317
- if (existingEntries.length > 0) return "⛔ 您已被列入黑名单";
5588
+ if (existingEntries.length > 0) return "⛔ 您已被列入黑名单。";
5318
5589
  const weaponId = weaponConfig[weapon]?.id;
5319
5590
  if (!weaponId) return "❌ 请输入“拆卸 武器名称 模块名称”\n注意:专属模块返还50%金币,通用模块返还80%金币";
5320
5591
  const modInfo = modConfig[mod];
@@ -5356,10 +5627,10 @@ ${validTypes.join("、")}`;
5356
5627
  let scatterBroadcast = null;
5357
5628
  let cleanerRewardBroadcast = null;
5358
5629
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
5359
- if (!profile) return "🔒 需要先绑定游戏句柄";
5630
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
5360
5631
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
5361
5632
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
5362
- if (existingEntries.length > 0) return "⛔ 您已被列入黑名单";
5633
+ if (existingEntries.length > 0) return "⛔ 您已被列入黑名单。";
5363
5634
  const getActiveBossNames = /* @__PURE__ */ __name(async () => {
5364
5635
  const activeBosses2 = await ctx.database.get("ggcevo_boss", { isActive: true });
5365
5636
  return activeBosses2.map((b) => b.name).join(",");
@@ -5522,12 +5793,14 @@ ${validTypes.join("、")}`;
5522
5793
  "🏆 伤害排行榜奖励:",
5523
5794
  ...rewardMessages
5524
5795
  ];
5525
- cleanerRewardBroadcast = await getCleanerRewardBroadcast(
5526
- ctx,
5527
- targetBoss,
5528
- handle,
5529
- session.username
5530
- );
5796
+ if (!(equippedWeapon.installedMods?.includes("光束曲射晶片") && weaponName === "碎骨步枪") && !(weaponName === "中子步枪")) {
5797
+ cleanerRewardBroadcast = await getCleanerRewardBroadcast(
5798
+ ctx,
5799
+ targetBoss,
5800
+ handle,
5801
+ session.username
5802
+ );
5803
+ }
5531
5804
  } else {
5532
5805
  await ctx.database.set(
5533
5806
  "ggcevo_boss",
@@ -5573,12 +5846,14 @@ ${validTypes.join("、")}`;
5573
5846
  }
5574
5847
  }
5575
5848
  bossEventBroadcast = broadcastMessages2;
5576
- cleanerRewardBroadcast = await getCleanerRewardBroadcast(
5577
- ctx,
5578
- targetBoss,
5579
- handle,
5580
- session.username
5581
- );
5849
+ if (!(equippedWeapon.installedMods?.includes("光束曲射晶片") && weaponName === "碎骨步枪") && !(weaponName === "中子步枪")) {
5850
+ cleanerRewardBroadcast = await getCleanerRewardBroadcast(
5851
+ ctx,
5852
+ targetBoss,
5853
+ handle,
5854
+ session.username
5855
+ );
5856
+ }
5582
5857
  }
5583
5858
  } else {
5584
5859
  await ctx.database.set(
@@ -5666,17 +5941,19 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
5666
5941
  isDefeated ? `🎉 恭喜,已成功击败 ${targetBoss.name}!` : ""
5667
5942
  ].filter((line) => line).join("\n");
5668
5943
  await session.send(resultMessage);
5944
+ const isScatterAttack = equippedWeapon.installedMods?.includes("光束曲射晶片") && weaponName === "碎骨步枪" || weaponName === "中子步枪";
5669
5945
  const broadcastMessages = [];
5670
5946
  const groupId = [...config2.groupId];
5671
5947
  if (scatterBroadcast) {
5672
5948
  const scatterMsg = Array.isArray(scatterBroadcast) ? scatterBroadcast.join("\n") : scatterBroadcast;
5673
- broadcastMessages.push(scatterMsg);
5949
+ broadcastMessages.push(`✨ 散射攻击结果
5950
+ ${scatterMsg}`);
5674
5951
  }
5675
5952
  if (bossEventBroadcast) {
5676
5953
  const bossMsg = Array.isArray(bossEventBroadcast) ? bossEventBroadcast.join("\n") : bossEventBroadcast;
5677
5954
  broadcastMessages.push(bossMsg);
5678
5955
  }
5679
- if (cleanerRewardBroadcast && cleanerRewardBroadcast.length > 0) {
5956
+ if (!isScatterAttack && cleanerRewardBroadcast && cleanerRewardBroadcast.length > 0) {
5680
5957
  broadcastMessages.push(cleanerRewardBroadcast.join("\n"));
5681
5958
  }
5682
5959
  if (broadcastMessages.length > 0) {
@@ -5689,10 +5966,10 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
5689
5966
  const parseList = /* @__PURE__ */ __name((str) => str ? str.split(",").map((s) => s.trim()).filter(Boolean) : [], "parseList");
5690
5967
  const tags = parseList(options.tags);
5691
5968
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
5692
- if (!profile) return "🔒 需要先绑定游戏句柄";
5969
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
5693
5970
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
5694
5971
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
5695
- if (existingEntries.length > 0) return "⛔ 您已被列入黑名单";
5972
+ if (existingEntries.length > 0) return "⛔ 您已被列入黑名单。";
5696
5973
  const [equippedWeapon] = await ctx.database.get("ggcevo_equipment", {
5697
5974
  handle,
5698
5975
  equipped: true
@@ -5772,7 +6049,7 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
5772
6049
  const mainBossHpBar = createHpBar(mainBoss.HP, bossGroup.main.maxHP);
5773
6050
  const result = [
5774
6051
  `🔴 主宰:${mainBoss.name}`,
5775
- `❤️ ${mainBossHpBar} (${mainBoss.HP}/${bossGroup.main.maxHP})`
6052
+ `${mainBossHpBar} (${mainBoss.HP}/${bossGroup.main.maxHP})`
5776
6053
  ];
5777
6054
  if (bossGroup.main.energy > 0) {
5778
6055
  result.push(`⚡ 能量:${mainBoss.energy}/1000`);
@@ -5801,8 +6078,8 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
5801
6078
  const minionConfig = bossGroup.minions.find((m) => m.name === minion.name);
5802
6079
  const minionHpBar = createHpBar(minion.HP, minionConfig?.maxHP || 1e3);
5803
6080
  const minionInfo = [
5804
- `👤 ${minion.name}`,
5805
- `❤️ ${minionHpBar} (${minion.HP}/${minionConfig?.maxHP || "未知"})`
6081
+ `❤️ ${minion.name}`,
6082
+ `${minionHpBar} (${minion.HP}/${minionConfig?.maxHP || "未知"})`
5806
6083
  ];
5807
6084
  if (minionConfig && minionConfig.energy > 0) {
5808
6085
  minionInfo.push(`⚡ 能量:${minion.energy}/1000`);
@@ -5866,11 +6143,11 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
5866
6143
  ctx.command("ggcevo/祈愿").action(async (argv) => {
5867
6144
  const session = argv.session;
5868
6145
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
5869
- if (!profile) return "🔒 需要先绑定游戏句柄";
6146
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
5870
6147
  const { regionId, realmId, profileId } = profile;
5871
6148
  const handle = `${regionId}-S2-${realmId}-${profileId}`;
5872
6149
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
5873
- if (existingEntries.length > 0) return "⛔ 您已被列入黑名单";
6150
+ if (existingEntries.length > 0) return "⛔ 您已被列入黑名单。";
5874
6151
  const [sign] = await ctx.database.get("ggcevo_sign", { handle });
5875
6152
  if (!sign || sign.totalRewards < 50) return "需要50金币进行祈愿,您的金币不足。";
5876
6153
  const now = /* @__PURE__ */ new Date();
@@ -5943,12 +6220,12 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
5943
6220
  });
5944
6221
  ctx.command("ggcevo/兑换金币", "使用兑换券兑换金币").action(async ({ session }) => {
5945
6222
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
5946
- if (!profile) return "🔒 需要先绑定游戏句柄";
6223
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
5947
6224
  const { regionId, realmId, profileId } = profile;
5948
6225
  const handle = `${regionId}-S2-${realmId}-${profileId}`;
5949
6226
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
5950
6227
  if (existingEntries.length > 0) {
5951
- return `⛔ 您已被列入黑名单`;
6228
+ return `⛔ 您已被列入黑名单。`;
5952
6229
  }
5953
6230
  await session.send(`请输入你要使用多少张兑换券来兑换金币?(请在30秒内回复数字,回复“0”为取消兑换)
5954
6231
  注意:1张兑换券=2000金币`);
@@ -5982,11 +6259,11 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
5982
6259
  });
5983
6260
  ctx.command("ggcevo/兑换红晶", "使用金币兑换红晶").action(async ({ session }) => {
5984
6261
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
5985
- if (!profile) return "🔒 需要先绑定游戏句柄";
6262
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
5986
6263
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
5987
6264
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
5988
6265
  if (existingEntries.length > 0) {
5989
- return `⛔ 您已被列入黑名单`;
6266
+ return `⛔ 您已被列入黑名单。`;
5990
6267
  }
5991
6268
  const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
5992
6269
  if (!careerData || careerData.group !== "辛迪加海盗") {
@@ -6022,12 +6299,12 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
6022
6299
  });
6023
6300
  ctx.command("ggcevo/加入 <faction>", "加入阵营").alias("加入阵营").action(async ({ session }, faction) => {
6024
6301
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
6025
- if (!profile) return "🔒 需要先绑定游戏句柄";
6302
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
6026
6303
  const { regionId, realmId, profileId } = profile;
6027
6304
  const handle = `${regionId}-S2-${realmId}-${profileId}`;
6028
6305
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
6029
6306
  if (existingEntries.length > 0) {
6030
- return `⛔ 您已被列入黑名单`;
6307
+ return `⛔ 您已被列入黑名单。`;
6031
6308
  }
6032
6309
  const validFactions = ["人类联盟", "辛迪加海盗"];
6033
6310
  if (!faction) return `请输入“加入 阵营名称”加入对应阵营
@@ -6088,11 +6365,11 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
6088
6365
  });
6089
6366
  ctx.command("ggcevo/转职 [profession]", "转职系统").action(async ({ session }, profession) => {
6090
6367
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
6091
- if (!profile) return "🔒 需要先绑定游戏句柄";
6368
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
6092
6369
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
6093
6370
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
6094
6371
  if (existingEntries.length > 0) {
6095
- return `⛔ 您已被列入黑名单`;
6372
+ return `⛔ 您已被列入黑名单。`;
6096
6373
  }
6097
6374
  const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
6098
6375
  if (!careerData) return "请先加入阵营后使用转职功能。";
@@ -6172,7 +6449,7 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
6172
6449
  const [profile] = await ctx.database.get("sc2arcade_player", {
6173
6450
  userId: session.userId
6174
6451
  });
6175
- if (!profile) return "🔒 需要先绑定游戏句柄";
6452
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
6176
6453
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
6177
6454
  const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
6178
6455
  if (!careerData) return "您尚未加入任何阵营。";
@@ -6215,7 +6492,7 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
6215
6492
  });
6216
6493
  ctx.command("ggcevo/黑市 [type]", "辛迪加海盗专属黑市").usage("输入“黑市”查看类型,或“黑市 类型”查看详细").action(async ({ session }, type) => {
6217
6494
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
6218
- if (!profile) return "🔒 需要先绑定游戏句柄";
6495
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
6219
6496
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
6220
6497
  const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
6221
6498
  if (!careerData || careerData.group !== "辛迪加海盗") {
@@ -6231,13 +6508,16 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
6231
6508
  });
6232
6509
  if (!type) {
6233
6510
  return [
6234
- "🏴☠️ 辛迪加黑市 🏴☠️",
6511
+ "🏴 辛迪加黑市 🏴",
6235
6512
  '使用 "黑市 类型名称" 查看详细信息',
6513
+ // 添加计算机专家提示 - 优化为带emoji的分行显示
6514
+ isComputerExpert ? [
6515
+ "💰 当前折扣:",
6516
+ "💻 计算机专家:设备工具类物品50%折扣"
6517
+ ].join("\n") : "",
6236
6518
  "====================",
6237
6519
  ...Object.entries(typeStats).map(([typeName, count]) => `▸ ${typeName} (${count}种)`),
6238
- "====================",
6239
- // 添加计算机专家提示
6240
- isComputerExpert ? "💳 计算机专家可享受设备工具类物品50%折扣!" : ""
6520
+ "===================="
6241
6521
  ].join("\n");
6242
6522
  }
6243
6523
  const normalizedType = Object.keys(typeStats).find((t) => t === type);
@@ -6260,7 +6540,7 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
6260
6540
  }
6261
6541
  infoBlocks.push(
6262
6542
  `描述:${config2.description}`,
6263
- "──────────────"
6543
+ "------------------"
6264
6544
  );
6265
6545
  return infoBlocks.join("\n");
6266
6546
  }),
@@ -6284,26 +6564,33 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
6284
6564
  infoBlocks.push(
6285
6565
  `特殊效果:${item.effects}`,
6286
6566
  `描述:${item.description}`,
6287
- "──────────────"
6567
+ "------------------"
6288
6568
  );
6289
6569
  return infoBlocks.join("\n");
6290
6570
  })
6291
6571
  ];
6572
+ let discountInfo = [];
6573
+ if (isComputerExpert && normalizedType === "设备工具") {
6574
+ discountInfo = [
6575
+ "💰 当前折扣:",
6576
+ "💻 计算机专家:设备工具类物品50%折扣"
6577
+ ];
6578
+ }
6292
6579
  return [
6293
6580
  `🏴☠️ 辛迪加黑市 - ${normalizedType} 🏴☠️`,
6294
- "使用“订购 物品名称”进行购买(仅消耗红晶)",
6295
- // 计算机专家专属提示
6296
- isComputerExpert && normalizedType === "设备工具" ? "💳 计算机专家可享受50%折扣!" : "",
6581
+ '使用"订购 物品名称"进行购买(仅消耗红晶)',
6582
+ // 显示折扣信息(如果有)
6583
+ ...discountInfo,
6297
6584
  "====================",
6298
6585
  ...items
6299
- ].filter(Boolean).join("\n\n");
6586
+ ].filter(Boolean).join("\n");
6300
6587
  });
6301
6588
  ctx.command("ggcevo/订购 <item>").action(async ({ session }, item) => {
6302
6589
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
6303
- if (!profile) return "🔒 需要先绑定游戏句柄";
6590
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
6304
6591
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
6305
6592
  if (await ctx.database.get("ggcevo_blacklist", { handle }).then((r) => r.length)) {
6306
- return "⛔ 您已被列入黑名单";
6593
+ return "⛔ 您已被列入黑名单。";
6307
6594
  }
6308
6595
  const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
6309
6596
  if (!careerData || careerData.group !== "辛迪加海盗") {
@@ -6368,44 +6655,50 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
6368
6655
  }], ["handle", "itemId"]);
6369
6656
  }
6370
6657
  });
6371
- let discountInfo = "";
6372
- if (discountApplied) {
6373
- discountInfo = `
6374
- 💳 计算机专家职业加成:设备工具类物品50%折扣`;
6375
- }
6376
- if (isWeapon) {
6377
- const equippedStatus = await ctx.database.get("ggcevo_equipment", {
6378
- handle,
6379
- weaponId: itemConfig2.id
6380
- }).then((r) => r[0]?.equipped ? "已自动装备武器" : "需手动装备武器");
6381
- return [
6382
- `✅ 成功订购【${item}】!`,
6383
- `消耗红晶:${finalCost}${discountInfo}`,
6384
- `装备状态:${equippedStatus}`,
6385
- '输入 "武器仓库" 管理武器'
6386
- ].join("\n");
6387
- } else {
6388
- const currentStock = await ctx.database.get("ggcevo_warehouse", {
6389
- handle,
6390
- itemId: itemConfig2.id
6391
- }).then((r) => r[0]?.quantity || 1);
6392
- let priceInfo = `消耗红晶:${finalCost}`;
6393
- if (isComputerExpertDiscount) {
6394
- priceInfo += `(原价${originalPrice})`;
6658
+ const buildResponse = /* @__PURE__ */ __name(async () => {
6659
+ const discountLines = [];
6660
+ if (discountApplied) {
6661
+ discountLines.push("💻 计算机专家:设备工具类物品50%折扣");
6395
6662
  }
6396
- priceInfo += discountInfo;
6397
- return [
6398
- `✅ 成功订购【${item}】x1!`,
6399
- priceInfo,
6400
- `当前库存:${currentStock}件`,
6401
- '输入 "仓库" 查看所有物品'
6402
- ].join("\n");
6403
- }
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();
6404
6697
  });
6405
6698
  ctx.command("ggcevo/仓库").action(async (argv) => {
6406
6699
  const session = argv.session;
6407
6700
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
6408
- if (!profile) return "🔒 需要先绑定游戏句柄";
6701
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
6409
6702
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
6410
6703
  const [items, signData, careerData] = await Promise.all([
6411
6704
  ctx.database.get("ggcevo_warehouse", { handle }),
@@ -6449,10 +6742,10 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
6449
6742
  ctx.command("ggcevo/使用 [itemName] [target]").action(async (argv, itemName, target) => {
6450
6743
  const session = argv.session;
6451
6744
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
6452
- if (!profile) return "🔒 需要先绑定游戏句柄";
6745
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
6453
6746
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
6454
6747
  if (await ctx.database.get("ggcevo_blacklist", { handle }).then((r) => r.length)) {
6455
- return "⛔ 您已被列入黑名单";
6748
+ return "⛔ 您已被列入黑名单。";
6456
6749
  }
6457
6750
  try {
6458
6751
  if (!itemName) return "请输入“使用 物品名称 (可选目标)”使用仓库中的物品。";
@@ -6479,9 +6772,8 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
6479
6772
  );
6480
6773
  return [
6481
6774
  `✅ 成功使用 ${itemNameConfirmed}`,
6482
- `├ 剩余数量:${newQuantity}`,
6483
- `└ 效果触发:${effectResult.message}`,
6484
- "─".repeat(14)
6775
+ `剩余数量:${newQuantity}`,
6776
+ `效果触发:${effectResult.message}`
6485
6777
  ].join("\n");
6486
6778
  } catch (error) {
6487
6779
  ctx.logger("GGCEVO").error(error);
@@ -6490,7 +6782,7 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
6490
6782
  });
6491
6783
  ctx.command("ggcevo/科技 [techName]", "查看空间站科技信息").usage("输入“科技”查看列表,或“科技 科技名称”查看详细信息").action(async ({ session }, techName) => {
6492
6784
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
6493
- if (!profile) return "🔒 需要先绑定游戏句柄";
6785
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
6494
6786
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
6495
6787
  const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
6496
6788
  if (!careerData || careerData.group !== "人类联盟") {
@@ -6505,11 +6797,13 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
6505
6797
  return [
6506
6798
  "🛰️ 空间站科技系统 🛰️",
6507
6799
  '使用 "科技 科技名称" 查看详细信息',
6800
+ isIntelligenceOfficer ? [
6801
+ "💰 当前折扣:",
6802
+ "🎖️ 情报副官:20%"
6803
+ ].join("\n") : "",
6508
6804
  "====================",
6509
6805
  ...techList,
6510
- "====================",
6511
- isIntelligenceOfficer && "※ 情报副官享受20%升级折扣"
6512
- // 新增折扣提示
6806
+ "===================="
6513
6807
  ].filter(Boolean).join("\n");
6514
6808
  }
6515
6809
  const tech = Spacestationtechnology.find(
@@ -6530,22 +6824,29 @@ ${Spacestationtechnology.map((t) => t.techname).join("、")}`;
6530
6824
  "------------------"
6531
6825
  ].join("\n");
6532
6826
  });
6827
+ let discountInfo = [];
6828
+ if (isIntelligenceOfficer) {
6829
+ discountInfo = [
6830
+ "💰 当前折扣:",
6831
+ "🎖️ 情报副官:20%"
6832
+ ];
6833
+ }
6533
6834
  return [
6534
6835
  `🛠️ ${tech.techname} 科技详情 🛠️`,
6535
6836
  `最大可升级等级:${romanNumerals[tech.maxLevel]}`,
6536
6837
  '使用 "升级 科技名称" 进行升级',
6838
+ ...discountInfo,
6839
+ // 插入折扣信息
6537
6840
  "====================",
6538
- ...techDetails,
6539
- isIntelligenceOfficer && "※ 情报副官享受20%升级折扣"
6540
- // 新增折扣提示
6841
+ ...techDetails
6541
6842
  ].filter(Boolean).join("\n");
6542
6843
  });
6543
6844
  ctx.command("ggcevo/挖矿").action(async ({ session }) => {
6544
6845
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
6545
- if (!profile) return "🔒 需要先绑定游戏句柄";
6846
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
6546
6847
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
6547
6848
  if (await ctx.database.get("ggcevo_blacklist", { handle }).then((r) => r.length)) {
6548
- return "⛔ 您已被列入黑名单";
6849
+ return "⛔ 您已被列入黑名单。";
6549
6850
  }
6550
6851
  const [career] = await ctx.database.get("ggcevo_careers", { handle });
6551
6852
  if (!career || career.group !== "人类联盟") {
@@ -6652,7 +6953,8 @@ ${Spacestationtechnology.map((t) => t.techname).join("、")}`;
6652
6953
  `类型: ${task2.type}`,
6653
6954
  `目标: ${task2.target}次`,
6654
6955
  `奖励: ${task2.price}金币`,
6655
- `进度: ${completionStatus}`
6956
+ `进度: ${completionStatus}`,
6957
+ "------------------"
6656
6958
  ].join("\n"));
6657
6959
  }
6658
6960
  return [
@@ -6661,7 +6963,7 @@ ${Spacestationtechnology.map((t) => t.techname).join("、")}`;
6661
6963
  "====================",
6662
6964
  ...taskList,
6663
6965
  "===================="
6664
- ].join("\n\n");
6966
+ ].join("\n");
6665
6967
  }
6666
6968
  const task = Object.entries(Tasklist).find(
6667
6969
  ([taskName]) => taskName === name2
@@ -6682,10 +6984,10 @@ ${Spacestationtechnology.map((t) => t.techname).join("、")}`;
6682
6984
  `任务奖励: ${task.price}金币`,
6683
6985
  `当前进度: ${progress}/${task.target}`,
6684
6986
  `累计完成: ${completions}次`,
6685
- "-------------------",
6987
+ "------------------",
6686
6988
  "任务描述:",
6687
6989
  task.description,
6688
- "-------------------",
6990
+ "------------------",
6689
6991
  "完成条件:",
6690
6992
  task.condition,
6691
6993
  "====================",
@@ -6697,7 +6999,7 @@ ${Spacestationtechnology.map((t) => t.techname).join("、")}`;
6697
6999
  if (!profile) return "⚠️ 需要先绑定游戏句柄";
6698
7000
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
6699
7001
  if (await ctx.database.get("ggcevo_blacklist", { handle }).then((r) => r.length)) {
6700
- return "⛔ 您已被列入黑名单";
7002
+ return "⛔ 您已被列入黑名单。";
6701
7003
  }
6702
7004
  const taskEntry = Object.entries(Tasklist).find(
6703
7005
  ([taskName2]) => taskName2.includes(name2)