koishi-plugin-ggcevo-game 1.3.15 → 1.3.16

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 +129 -97
  2. package/package.json +1 -1
package/lib/index.js CHANGED
@@ -450,7 +450,7 @@ function apply(ctx, config) {
450
450
  description: "一个小型辛迪加机器人,可以破坏电子银行账户",
451
451
  price: 0,
452
452
  redCrystalCost: 60,
453
- effects: "此物品存放于仓库,仅在您是辛迪加海盗阵营时生效。每日签到金币奖励+50%,每拥有100金币,增加1%(至多增加100%)。"
453
+ effects: "此物品存放于仓库,仅在处于辛迪加海盗阵营时生效。每日签到金币奖励+50%,每拥有100金币,增加1%(至多增加100%)。"
454
454
  }
455
455
  };
456
456
  const modConfig = {
@@ -625,7 +625,7 @@ function apply(ctx, config) {
625
625
  },
626
626
  "辐射": {
627
627
  effect: 0,
628
- description: "受到伽马枪攻击时会积累辐射层数,每层使受到的伤害增加1%"
628
+ description: "受到伽马枪攻击时会积累辐射层数,每层使受到的伤害增加1%(至多增加100%)"
629
629
  }
630
630
  };
631
631
  const defineBoss = /* @__PURE__ */ __name((config2) => config2, "defineBoss");
@@ -744,28 +744,28 @@ function apply(ctx, config) {
744
744
  {
745
745
  professionName: "深空矿工",
746
746
  effect: "每日签到获得的金币收益增加50%",
747
- requirements: "当月累计签到14天",
747
+ requirements: "当月累计签到7天及以上",
748
748
  Jobtransfer: true,
749
749
  costcoins: 1500
750
750
  },
751
751
  {
752
752
  professionName: "警卫员下士",
753
753
  effect: "攻击获得的金币增加50%",
754
- requirements: "当期伤害榜攻击次数达到6次",
754
+ requirements: "当期伤害榜累计攻击4次及以上",
755
755
  Jobtransfer: true,
756
756
  costcoins: 2e3
757
757
  },
758
758
  {
759
759
  professionName: "警卫长",
760
760
  effect: "攻击伤害+5%,攻击获得的金币增加100%",
761
- requirements: "职业为警卫员下士并且当前伤害榜前3",
761
+ requirements: "当期伤害榜前十名",
762
762
  Jobtransfer: true,
763
763
  costcoins: 3e3
764
764
  },
765
765
  {
766
766
  professionName: "武器中士",
767
767
  effect: "攻击伤害+15%",
768
- requirements: "当期伤害榜造成300点伤害",
768
+ requirements: "当期伤害榜累计造成100及以上伤害",
769
769
  Jobtransfer: true,
770
770
  costcoins: 2e3
771
771
  },
@@ -779,7 +779,7 @@ function apply(ctx, config) {
779
779
  {
780
780
  professionName: "情报副官",
781
781
  effect: "升级空间站科技花费的金币是原价的80%",
782
- requirements: "将一个空间站科技升至3级或以上",
782
+ requirements: "至少一个空间站科技等级≥3",
783
783
  Jobtransfer: true,
784
784
  costcoins: 3e3
785
785
  },
@@ -815,8 +815,8 @@ function apply(ctx, config) {
815
815
  const syndicatePirateConfig = [
816
816
  {
817
817
  professionName: "能量武器专家",
818
- effect: "能量武器攻击伤害+20%,解锁MK-4激光步枪(传奇)购买权限",
819
- requirements: "拥有一把3级或以上等级的能量武器",
818
+ effect: "能量武器攻击伤害+20%; 解锁MK-4激光步枪(传奇)购买权限",
819
+ requirements: "至少拥有一把3级及以上等级的能量武器",
820
820
  Jobtransfer: true,
821
821
  costcoins: 0,
822
822
  costredcrystal: 30
@@ -824,7 +824,7 @@ function apply(ctx, config) {
824
824
  {
825
825
  professionName: "清洁工",
826
826
  effect: "击败主宰能够根据排名获得红晶; 每次攻击额外获得红晶",
827
- requirements: "当期伤害榜排名前3",
827
+ requirements: "当期伤害榜前二十名",
828
828
  Jobtransfer: true,
829
829
  costcoins: 0,
830
830
  costredcrystal: 20
@@ -839,16 +839,16 @@ function apply(ctx, config) {
839
839
  },
840
840
  {
841
841
  professionName: "猩红杀手",
842
- effect: "使用“侦查步枪”造成的伤害增加15%",
843
- requirements: "“侦查步枪”武器等级为6",
844
- Jobtransfer: false,
842
+ effect: "使用“侦查步枪”造成的伤害+15%; 解锁DSR-55反器材步枪(传奇)购买权限",
843
+ requirements: "“侦查步枪”武器等级≥3",
844
+ Jobtransfer: true,
845
845
  costcoins: 0,
846
- costredcrystal: 20
846
+ costredcrystal: 30
847
847
  },
848
848
  {
849
849
  professionName: "纵火狂",
850
- effect: "热能武器攻击伤害+20%,解锁龙息散弹枪(传奇)购买权限",
851
- requirements: "拥有一把3级或以上等级的热能武器",
850
+ effect: "热能武器攻击伤害+20%; 解锁龙息散弹枪(传奇)购买权限",
851
+ requirements: "至少拥有一把3级及以上等级的热能武器",
852
852
  Jobtransfer: true,
853
853
  costcoins: 0,
854
854
  costredcrystal: 30
@@ -856,7 +856,7 @@ function apply(ctx, config) {
856
856
  {
857
857
  professionName: "辛迪加财务经理",
858
858
  effect: "每日签到能额外获得红晶",
859
- requirements: "当月累计签到21天",
859
+ requirements: "当月累计签到14天及以上",
860
860
  Jobtransfer: true,
861
861
  costcoins: 0,
862
862
  costredcrystal: 45
@@ -1063,7 +1063,7 @@ function apply(ctx, config) {
1063
1063
  return passiveEffect;
1064
1064
  }
1065
1065
  __name(calculatePassiveEffects, "calculatePassiveEffects");
1066
- async function calculateCareerBonus(ctx2, handle, currentDamage, weaponType) {
1066
+ async function calculateCareerBonus(ctx2, handle, currentDamage, weaponType, weaponId) {
1067
1067
  const [careerData] = await ctx2.database.get("ggcevo_careers", { handle });
1068
1068
  const career = careerData?.career;
1069
1069
  const faction = careerData?.group;
@@ -1092,6 +1092,14 @@ function apply(ctx, config) {
1092
1092
  message = "⚠️ 纵火狂:未装备热能武器,加成未生效";
1093
1093
  }
1094
1094
  }
1095
+ if (faction === "辛迪加海盗" && career === "猩红杀手") {
1096
+ if (weaponId === 7) {
1097
+ multiplier *= 1.15;
1098
+ message = "⚡ 职业加成:猩红杀手(侦查步枪伤害+15%)";
1099
+ } else {
1100
+ message = "⚠️ 猩红杀手:未装备侦查步枪,加成未生效";
1101
+ }
1102
+ }
1095
1103
  return {
1096
1104
  damage: currentDamage * multiplier,
1097
1105
  message: message || void 0
@@ -1113,6 +1121,7 @@ function apply(ctx, config) {
1113
1121
  const weaponConfigEntry = Object.entries(weaponConfig).find(([_, c]) => c.id === equippedWeapon.weaponId);
1114
1122
  const [weaponName, weaponData] = weaponConfigEntry;
1115
1123
  const weaponType = weaponData.type;
1124
+ const weaponId = weaponData.id;
1116
1125
  let damage = weaponData.damage * (1 + 0.1 * equippedWeapon.level);
1117
1126
  const [critRhythmEffect] = await ctx2.database.get("ggcevo_Wish_Record", {
1118
1127
  handle,
@@ -1127,7 +1136,7 @@ function apply(ctx, config) {
1127
1136
  );
1128
1137
  damage *= 1 + totalModAdd;
1129
1138
  if (critRhythmEffect) {
1130
- effectMessage.push("🎵 暴击韵律祈愿生效(暴击率+20%)");
1139
+ effectMessage.push("🎵 暴击韵律祈愿生效(武器暴击率+20%)");
1131
1140
  }
1132
1141
  const tagMultiplier = await calculateTagMultiplier(weaponData, finalTags, equippedWeapon);
1133
1142
  damage *= 1 + tagMultiplier;
@@ -1137,8 +1146,9 @@ function apply(ctx, config) {
1137
1146
  ctx2,
1138
1147
  handle,
1139
1148
  damage,
1140
- weaponType
1149
+ weaponType,
1141
1150
  // 新增参数
1151
+ weaponId
1142
1152
  );
1143
1153
  damage = careerDamage;
1144
1154
  if (careerMessage) effectMessage.push(careerMessage);
@@ -1331,7 +1341,7 @@ function apply(ctx, config) {
1331
1341
  const groupId = [...config.groupId];
1332
1342
  if (totalBosses === 0) {
1333
1343
  await activateNextBossGroup();
1334
- await ctx.broadcast(groupId, `🔄 咕咕PVE系统已初始化,首个主宰已登场!`);
1344
+ await ctx.broadcast(groupId, `🔄 咕咕之战系统已初始化,首个主宰已登场!`);
1335
1345
  return;
1336
1346
  }
1337
1347
  const now = /* @__PURE__ */ new Date();
@@ -1491,7 +1501,7 @@ function apply(ctx, config) {
1491
1501
  const newDamage = Math.floor(initialDamage * 0.5);
1492
1502
  return {
1493
1503
  initialDamage: newDamage,
1494
- messages: ["🛡️ 【感染空间站】生效:空间站哨枪塔存活,伤害减少50%"]
1504
+ messages: ["🛡️ 【感染空间站】生效:空间站哨枪塔存活,受到的伤害减少50%"]
1495
1505
  };
1496
1506
  }
1497
1507
  return null;
@@ -1605,6 +1615,9 @@ function apply(ctx, config) {
1605
1615
  }, "handleStructuralArmor"),
1606
1616
  // 处理吸血相关效果(加法减伤 + 独立增伤)
1607
1617
  handleBloodEffects: /* @__PURE__ */ __name(function(targetBoss, initialDamage, currentHP, maxHP) {
1618
+ if (!targetBoss.skills.includes("吸血唾液")) {
1619
+ return null;
1620
+ }
1608
1621
  let messages = [];
1609
1622
  let newDamage = initialDamage;
1610
1623
  const bloodStacks = targetBoss.Skillcountpoints || 0;
@@ -1612,23 +1625,26 @@ function apply(ctx, config) {
1612
1625
  if (targetBoss.skills.includes("吸血唾液")) {
1613
1626
  totalReduction += bloodStacks * 0.05;
1614
1627
  if (bloodStacks > 0) {
1615
- messages.push(`🩸 【吸血唾液】技能生效:本次攻击减伤${bloodStacks * 5}%`);
1628
+ messages.push(`🩸 【吸血唾液】技能生效:受到的伤害-${bloodStacks * 5}%`);
1616
1629
  }
1617
1630
  }
1618
1631
  if (targetBoss.skills.includes("嗜血狂暴") && currentHP / maxHP < 0.5) {
1619
1632
  totalReduction += 0.2;
1620
- messages.push(`🔥 【嗜血狂暴】技能生效:血量低于50%,本次攻击额外减伤20%`);
1633
+ messages.push(`🔥 【嗜血狂暴】技能生效:血量低于50%,进入狂暴状态,受到的伤害-20%`);
1621
1634
  }
1622
1635
  if (totalReduction > 0) {
1623
1636
  newDamage = Math.floor(initialDamage * (1 - totalReduction));
1624
1637
  }
1625
1638
  if (targetBoss.skills.includes("吐血") && bloodStacks < 1) {
1626
1639
  newDamage = Math.floor(newDamage * 1.1);
1627
- messages.push(`💔 【吐血】技能生效:无“吸血”层数受到伤害+10%`);
1640
+ messages.push(`💔 【吐血】技能生效:无“吸血”层数,受到的伤害+10%`);
1628
1641
  }
1629
1642
  return newDamage !== initialDamage ? { initialDamage: newDamage, messages } : null;
1630
1643
  }, "handleBloodEffects"),
1631
1644
  handleBloodCount: /* @__PURE__ */ __name(async function(ctx2, targetBoss, currentHP, maxHP) {
1645
+ if (!targetBoss.skills.includes("吸血唾液")) {
1646
+ return null;
1647
+ }
1632
1648
  let messages = [];
1633
1649
  let updatedHP = currentHP;
1634
1650
  const oldStacks = targetBoss.Skillcountpoints || 0;
@@ -1636,7 +1652,7 @@ function apply(ctx, config) {
1636
1652
  const heal = Math.floor(maxHP * 0.2);
1637
1653
  updatedHP = Math.min(currentHP + heal, maxHP);
1638
1654
  await ctx2.database.set("ggcevo_boss", { name: targetBoss.name }, { Skillcountpoints: 0 });
1639
- messages.push(`🍽️ 【进食】技能生效:回复20%最大生命值(+${heal}HP),层数清零`);
1655
+ messages.push(`🍽️ 【进食】技能生效:自身回复20%最大生命值(+${heal}HP),“吸血”层数清零`);
1640
1656
  return { updatedHP, messages };
1641
1657
  }
1642
1658
  let newStacks = oldStacks + 1;
@@ -1656,11 +1672,23 @@ function apply(ctx, config) {
1656
1672
  if (weaponName !== "伽马枪") return null;
1657
1673
  const messages = [];
1658
1674
  const isNewRadiation = !targetBoss.skills.includes("辐射");
1675
+ const newSkills = isNewRadiation ? [...targetBoss.skills, "辐射"] : targetBoss.skills;
1676
+ const newVulnerability = isNewRadiation ? 1 : Math.min(targetBoss.Vulnerability + 1, 100);
1677
+ let layerMsg;
1678
+ if (isNewRadiation) {
1679
+ layerMsg = `☢️ 获得【辐射】效果`;
1680
+ } else {
1681
+ if (newVulnerability === targetBoss.Vulnerability) {
1682
+ layerMsg = `☢️ 辐射层数已达上限(100层)`;
1683
+ } else {
1684
+ const addedLayers = newVulnerability - targetBoss.Vulnerability;
1685
+ layerMsg = `☢️ 辐射层数+${addedLayers}`;
1686
+ }
1687
+ }
1659
1688
  await ctx2.database.set("ggcevo_boss", { name: targetBoss.name }, {
1660
- skills: isNewRadiation ? [...targetBoss.skills, "辐射"] : targetBoss.skills,
1661
- Vulnerability: isNewRadiation ? 1 : targetBoss.Vulnerability + 1
1689
+ skills: newSkills,
1690
+ Vulnerability: newVulnerability
1662
1691
  });
1663
- const layerMsg = isNewRadiation ? `☢️ 获得【辐射】效果` : `☢️ 辐射层数+1`;
1664
1692
  messages.push(`${targetBoss.name} ${layerMsg}`);
1665
1693
  return { messages };
1666
1694
  }, "handleGammaRadiation"),
@@ -1678,7 +1706,7 @@ function apply(ctx, config) {
1678
1706
  return {
1679
1707
  damage: amplifiedDamage,
1680
1708
  messages: radiationLayers > 0 ? [
1681
- `☢️ 【辐射】效果触发:当前${radiationLayers}层辐射,本次攻击受到伤害+${radiationLayers}%`
1709
+ `☢️ 【辐射】效果触发:当前${radiationLayers}层辐射,受到的伤害+${radiationLayers}%`
1682
1710
  ] : []
1683
1711
  };
1684
1712
  }, "calculateRadiationDamage"),
@@ -1968,42 +1996,39 @@ function apply(ctx, config) {
1968
1996
  switch (profession) {
1969
1997
  case "深空矿工":
1970
1998
  return {
1971
- success: signData?.monthlyDays >= 14,
1972
- message: `需要当月签到14天(当前${signData?.monthlyDays || 0}天)`
1999
+ success: signData?.monthlyDays >= 7,
2000
+ message: `需要当月累计签到7天及以上(当前${signData?.monthlyDays || 0}天)`
1973
2001
  };
1974
2002
  case "警卫员下士":
1975
2003
  if (!mainBoss) return { success: false, message: "当前暂无伤害榜。" };
1976
2004
  return {
1977
- success: totalAttack >= 6,
1978
- message: `需要累计攻击6次(当前${totalAttack}次)`
2005
+ success: totalAttack >= 4,
2006
+ message: `需要当期伤害榜累计攻击4次及以上(当前${totalAttack}次)`
1979
2007
  };
1980
2008
  case "警卫长": {
1981
2009
  if (careerData?.career !== "警卫员下士") {
1982
2010
  return { success: false, message: "需要当前职业为警卫员下士" };
1983
2011
  }
1984
2012
  if (!mainBoss) return { success: false, message: "当前暂无伤害榜。" };
1985
- const top3 = await ctx2.database.select("ggcevo_boss_damage").where({
1986
- bossGroupId: mainBoss?.groupId,
1987
- handle
1988
- }).orderBy("totalDamage", "desc").limit(3).execute();
1989
- const isInTop3 = top3.some((r) => r.handle === handle);
2013
+ const top10 = await ctx2.database.select("ggcevo_boss_damage").where({ bossGroupId: mainBoss.groupId }).orderBy("totalDamage", "desc").limit(10).execute();
2014
+ const isInTop10 = top10.some((r) => r.handle === handle);
1990
2015
  return {
1991
- success: isInTop3,
1992
- message: "需要当前伤害榜前三名"
2016
+ success: isInTop10,
2017
+ message: "需要当期伤害榜前十名"
1993
2018
  };
1994
2019
  }
1995
2020
  case "武器中士":
1996
2021
  if (!mainBoss) return { success: false, message: "当前暂无伤害榜。" };
1997
2022
  return {
1998
- success: totalDamage >= 300,
1999
- message: `需要累计造成300伤害(当前${totalDamage})`
2023
+ success: totalDamage >= 100,
2024
+ message: `需要当期伤害榜累计造成100及以上伤害(当前${totalDamage})`
2000
2025
  };
2001
2026
  case "情报副官":
2002
2027
  const techs = await ctx2.database.get("ggcevo_tech", { handle });
2003
2028
  const hasValidTech = techs.some((t) => t.level >= 3);
2004
2029
  return {
2005
2030
  success: hasValidTech,
2006
- message: hasValidTech ? "" : "需要至少一个科技等级≥3级"
2031
+ message: hasValidTech ? "" : "需要至少一个空间站科技等级≥3级"
2007
2032
  };
2008
2033
  case "能量武器专家":
2009
2034
  const hasEnergyWeapon = weapons.some((weapon) => {
@@ -2012,7 +2037,7 @@ function apply(ctx, config) {
2012
2037
  });
2013
2038
  return {
2014
2039
  success: hasEnergyWeapon,
2015
- message: `需要拥有一把3级及以上等级的能量武器`
2040
+ message: `需要至少拥有一把3级及以上等级的能量武器`
2016
2041
  };
2017
2042
  case "纵火狂":
2018
2043
  const hasthermalWeapon = weapons.some((weapon) => {
@@ -2021,22 +2046,29 @@ function apply(ctx, config) {
2021
2046
  });
2022
2047
  return {
2023
2048
  success: hasthermalWeapon,
2024
- message: `需要拥有一把3级及以上等级的热能武器`
2049
+ message: `需要至少拥有一把3级及以上等级的热能武器`
2025
2050
  };
2051
+ case "猩红杀手":
2052
+ {
2053
+ const scoutRifle = weapons.find((weapon) => weapon.weaponId === 7);
2054
+ return {
2055
+ success: !!scoutRifle,
2056
+ message: scoutRifle ? "" : "需要“侦查步枪”武器等级≥3"
2057
+ };
2058
+ }
2059
+ ;
2026
2060
  case "清洁工":
2027
2061
  if (!mainBoss) return { success: false, message: "当前暂无伤害榜。" };
2028
- const cleanTop3 = await ctx2.database.select("ggcevo_boss_damage").where({
2029
- bossGroupId: mainBoss.groupId
2030
- }).orderBy("totalDamage", "desc").limit(3).execute();
2031
- const isCleanTop3 = cleanTop3.some((r) => r.handle === handle);
2062
+ const cleanTop20 = await ctx2.database.select("ggcevo_boss_damage").where({ bossGroupId: mainBoss.groupId }).orderBy("totalDamage", "desc").limit(20).execute();
2063
+ const isInTop20 = cleanTop20.some((r) => r.handle === handle);
2032
2064
  return {
2033
- success: isCleanTop3,
2034
- message: "需要当前主宰伤害榜前三名"
2065
+ success: isInTop20,
2066
+ message: "需要当期伤害榜前二十名"
2035
2067
  };
2036
2068
  case "辛迪加财务经理":
2037
2069
  return {
2038
- success: signData?.monthlyDays >= 21,
2039
- message: `需要当月累计签到21天(当前${signData?.monthlyDays || 0}天)`
2070
+ success: signData?.monthlyDays >= 14,
2071
+ message: `需要当月累计签到14天及以上(当前${signData?.monthlyDays || 0}天)`
2040
2072
  };
2041
2073
  default:
2042
2074
  return { success: false, message: "未知职业要求" };
@@ -2321,7 +2353,7 @@ function apply(ctx, config) {
2321
2353
  let hiddenWinCount = 0;
2322
2354
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
2323
2355
  if (!profile) {
2324
- return "您暂未绑定句柄。";
2356
+ return "🔒 需要先绑定游戏句柄。";
2325
2357
  }
2326
2358
  const { regionId, realmId, profileId } = profile;
2327
2359
  const handle = `${regionId}-S2-${realmId}-${profileId}`;
@@ -2360,7 +2392,7 @@ function apply(ctx, config) {
2360
2392
  const session = argv.session;
2361
2393
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
2362
2394
  if (!profile) {
2363
- return "您暂未绑定句柄。";
2395
+ return "🔒 需要先绑定游戏句柄。";
2364
2396
  }
2365
2397
  const { regionId, realmId, profileId } = profile;
2366
2398
  const handle = `${regionId}-S2-${realmId}-${profileId}`;
@@ -2393,7 +2425,7 @@ function apply(ctx, config) {
2393
2425
  let hiddenWinCount = 0;
2394
2426
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
2395
2427
  if (!profile) {
2396
- return "您暂未绑定句柄。";
2428
+ return "🔒 需要先绑定游戏句柄。";
2397
2429
  }
2398
2430
  const { regionId, realmId, profileId } = profile;
2399
2431
  const handle = `${regionId}-S2-${realmId}-${profileId}`;
@@ -2431,7 +2463,7 @@ function apply(ctx, config) {
2431
2463
  const session = argv.session;
2432
2464
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
2433
2465
  if (!profile) {
2434
- return "您暂未绑定句柄。";
2466
+ return "🔒 需要先绑定游戏句柄。";
2435
2467
  }
2436
2468
  const { regionId, realmId, profileId } = profile;
2437
2469
  const handle = `${regionId}-S2-${realmId}-${profileId}`;
@@ -2446,7 +2478,7 @@ function apply(ctx, config) {
2446
2478
  ctx.command("ggcevo/背包").action(async (argv) => {
2447
2479
  const session = argv.session;
2448
2480
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
2449
- if (!profile) return "您暂未绑定句柄。";
2481
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
2450
2482
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
2451
2483
  const items = await ctx.database.get("ggcevo_backpack", { handle });
2452
2484
  const validItems = items.filter((item) => item.quantity > 0);
@@ -2467,7 +2499,7 @@ ${itemDetails.join("\n")}`;
2467
2499
  const session = argv.session;
2468
2500
  let latestTime;
2469
2501
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
2470
- if (!profile) return "您暂未绑定句柄。";
2502
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
2471
2503
  const { regionId, realmId, profileId } = profile;
2472
2504
  const handle = `${regionId}-S2-${realmId}-${profileId}`;
2473
2505
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
@@ -2649,7 +2681,7 @@ ${itemDetails.join("\n")}`;
2649
2681
  try {
2650
2682
  const session = argv.session;
2651
2683
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
2652
- if (!profile) return "您暂未绑定句柄。";
2684
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
2653
2685
  const { regionId, realmId, profileId } = profile;
2654
2686
  const handle = `${regionId}-S2-${realmId}-${profileId}`;
2655
2687
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
@@ -2704,7 +2736,7 @@ ${itemDetails.join("\n")}`;
2704
2736
  ctx.command("ggcevo/签到记录").action(async (argv) => {
2705
2737
  const session = argv.session;
2706
2738
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
2707
- if (!profile) return "您暂未绑定句柄。";
2739
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
2708
2740
  const { regionId, realmId, profileId } = profile;
2709
2741
  const handle = `${regionId}-S2-${realmId}-${profileId}`;
2710
2742
  const [record] = await ctx.database.get("ggcevo_sign", { handle });
@@ -2729,7 +2761,7 @@ ${itemDetails.join("\n")}`;
2729
2761
  ctx.guild().command("ggcevo/每月津贴").action(async (argv) => {
2730
2762
  const session = argv.session;
2731
2763
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
2732
- if (!profile) return "您暂未绑定句柄。";
2764
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
2733
2765
  const { regionId, realmId, profileId } = profile;
2734
2766
  const handle = `${regionId}-S2-${realmId}-${profileId}`;
2735
2767
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
@@ -2783,7 +2815,7 @@ ${itemDetails.join("\n")}`;
2783
2815
  itemIdToName[item.id] = name3;
2784
2816
  }
2785
2817
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
2786
- if (!profile) return "您暂未绑定句柄。";
2818
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
2787
2819
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
2788
2820
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
2789
2821
  if (existingEntries.length > 0) return "❌ 拒绝访问,您已被列入黑名单。";
@@ -3184,7 +3216,7 @@ ${itemDetails.join("\n")}`;
3184
3216
  if (!player) {
3185
3217
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
3186
3218
  if (!profile) {
3187
- return "您暂未绑定句柄。";
3219
+ return "🔒 需要先绑定游戏句柄。";
3188
3220
  }
3189
3221
  const { regionId, realmId, profileId } = profile;
3190
3222
  const handle = `${regionId}-S2-${realmId}-${profileId}`;
@@ -3300,7 +3332,7 @@ ${itemDetails.join("\n")}`;
3300
3332
  let handle;
3301
3333
  if (!user) {
3302
3334
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
3303
- if (!profile) return "您暂未绑定句柄。";
3335
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
3304
3336
  handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
3305
3337
  } else {
3306
3338
  const parsedUser = import_koishi.h.parse(user)[0];
@@ -3349,7 +3381,7 @@ ${itemDetails.join("\n")}`;
3349
3381
  ctx.command("ggcevo/兑换", "兑换物品").action(async ({ session }) => {
3350
3382
  try {
3351
3383
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
3352
- if (!profile) return "您暂未绑定句柄";
3384
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
3353
3385
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
3354
3386
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
3355
3387
  if (existingEntries.length > 0) {
@@ -3465,7 +3497,7 @@ ${items.join("、")}
3465
3497
  });
3466
3498
  ctx.command("ggcevo/兑换记录").action(async ({ session }) => {
3467
3499
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
3468
- if (!profile) return "您暂未绑定句柄";
3500
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
3469
3501
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
3470
3502
  const exchanges = await ctx.database.get("ggcevo_exchange", { handle });
3471
3503
  if (!exchanges.length) return "您暂无兑换记录";
@@ -3484,7 +3516,7 @@ ${output}`;
3484
3516
  });
3485
3517
  ctx.command("ggcevo/兑换扭蛋币").action(async ({ session }) => {
3486
3518
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
3487
- if (!profile) return "您暂未绑定句柄。";
3519
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
3488
3520
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
3489
3521
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
3490
3522
  if (existingEntries.length > 0) {
@@ -3514,7 +3546,7 @@ ${output}`;
3514
3546
  const session = argv.session;
3515
3547
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
3516
3548
  if (!profile) {
3517
- return "您暂未绑定句柄。";
3549
+ return "🔒 需要先绑定游戏句柄。";
3518
3550
  }
3519
3551
  const { regionId, realmId, profileId } = profile;
3520
3552
  const handle = `${regionId}-S2-${realmId}-${profileId}`;
@@ -3606,7 +3638,7 @@ ${output}`;
3606
3638
  ctx.command("ggcevo/成就").action(async ({ session }) => {
3607
3639
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
3608
3640
  if (!profile) {
3609
- return "您暂未绑定句柄。";
3641
+ return "🔒 需要先绑定游戏句柄。";
3610
3642
  }
3611
3643
  const { regionId, realmId, profileId } = profile;
3612
3644
  const achievements = await ctx.database.get("ggcevo_achievements", {
@@ -3631,7 +3663,7 @@ ${achievementList.join("\n")}`;
3631
3663
  const session = argv.session;
3632
3664
  const output = [];
3633
3665
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
3634
- if (!profile) return "您暂未绑定句柄。";
3666
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
3635
3667
  const { regionId, realmId, profileId } = profile;
3636
3668
  const handle = `${regionId}-S2-${realmId}-${profileId}`;
3637
3669
  output.push(`🎮 游戏句柄:${handle}
@@ -3765,7 +3797,7 @@ ${achievementList.join("\n")}`;
3765
3797
  const session = argv.session;
3766
3798
  if (!user) return "缺少参数,请输入“pk @指定pk玩家”。";
3767
3799
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
3768
- if (!profile) return "您暂未绑定句柄。";
3800
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
3769
3801
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
3770
3802
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
3771
3803
  if (existingEntries.length > 0) {
@@ -3980,7 +4012,7 @@ ${achievementList.join("\n")}`;
3980
4012
  });
3981
4013
  ctx.command("ggcevo/切换pk", "切换玩家对战状态").alias("切换pk状态").action(async ({ session }) => {
3982
4014
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
3983
- if (!profile) return "您暂未绑定句柄。";
4015
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
3984
4016
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
3985
4017
  const [pkRecord] = await ctx.database.get("ggcevo_pk", { handle }) || [null];
3986
4018
  const currentState = pkRecord?.enable ?? true;
@@ -4122,7 +4154,7 @@ ${validTypes.join("、")}`;
4122
4154
  });
4123
4155
  ctx.command("ggcevo/购买 <item>").action(async ({ session }, item) => {
4124
4156
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
4125
- if (!profile) return "您暂未绑定句柄。";
4157
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
4126
4158
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
4127
4159
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
4128
4160
  if (existingEntries.length > 0) return "❌ 拒绝访问,您已被列入黑名单。";
@@ -4248,7 +4280,7 @@ ${validTypes.join("、")}`;
4248
4280
  });
4249
4281
  ctx.command("ggcevo/武器仓库").action(async ({ session }) => {
4250
4282
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
4251
- if (!profile) return "您暂未绑定句柄";
4283
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
4252
4284
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
4253
4285
  const weapons = await ctx.database.get("ggcevo_equipment", {
4254
4286
  handle
@@ -4280,7 +4312,7 @@ ${validTypes.join("、")}`;
4280
4312
  });
4281
4313
  ctx.command("ggcevo/装备 <weapon>").action(async ({ session }, weapon) => {
4282
4314
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
4283
- if (!profile) return "您暂未绑定句柄。";
4315
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
4284
4316
  if (!weapon) return "请输入“装备 武器名称”来装备一把你拥有的武器。";
4285
4317
  if (!weaponConfig[weapon]) return "请输入“装备 武器名称”来装备一把你拥有的武器。";
4286
4318
  const config2 = weaponConfig[weapon];
@@ -4314,7 +4346,7 @@ ${validTypes.join("、")}`;
4314
4346
  });
4315
4347
  ctx.command("ggcevo/升级 <target>", "升级武器或科技").action(async ({ session }, target) => {
4316
4348
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
4317
- if (!profile) return " 您暂未绑定句柄";
4349
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
4318
4350
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
4319
4351
  if ((await ctx.database.get("ggcevo_blacklist", { handle })).length) {
4320
4352
  return "❌ 拒绝访问,您已被列入黑名单";
@@ -4335,7 +4367,7 @@ ${validTypes.join("、")}`;
4335
4367
  });
4336
4368
  ctx.command("ggcevo/改装 <weapon> [mod]", "安装武器模块").action(async ({ session }, weapon, mod) => {
4337
4369
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
4338
- if (!profile) return "您暂未绑定句柄";
4370
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
4339
4371
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
4340
4372
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
4341
4373
  if (existingEntries.length > 0) return "❌ 拒绝访问,您已被列入黑名单";
@@ -4428,7 +4460,7 @@ ${validTypes.join("、")}`;
4428
4460
  exclusiveDiscountRate > 0 && `🔧 当前专属模块折扣:${exclusiveDiscountRate}% (武器升级平台 Lv${techLevel})`,
4429
4461
  "====================",
4430
4462
  exclusiveMods.length ? exclusiveMods.join("\n\n") : "该武器暂无专属模块"
4431
- ].join("\n\n");
4463
+ ].filter(Boolean).join("\n\n");
4432
4464
  } else {
4433
4465
  const universalMods = Object.entries(modConfig).filter(([_, m]) => !m.isExclusive).map(([name2, cfg]) => formatMod(name2, cfg));
4434
4466
  return [
@@ -4437,7 +4469,7 @@ ${validTypes.join("、")}`;
4437
4469
  universalDiscountRate > 0 && `🔧 当前通用模块折扣:${universalDiscountRate}% (武器升级平台 Lv${techLevel})`,
4438
4470
  "====================",
4439
4471
  universalMods.join("\n\n")
4440
- ].join("\n\n");
4472
+ ].filter(Boolean).join("\n\n");
4441
4473
  }
4442
4474
  }, "showModList");
4443
4475
  if (mod) {
@@ -4468,7 +4500,7 @@ ${validTypes.join("、")}`;
4468
4500
  请攻击当前存活的异形:${activeNames || "无"}。`;
4469
4501
  }
4470
4502
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
4471
- if (!profile) return "您暂未绑定句柄。";
4503
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
4472
4504
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
4473
4505
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
4474
4506
  if (existingEntries.length > 0) return "❌ 拒绝访问,您已被列入黑名单。";
@@ -4674,7 +4706,7 @@ ${effectMessage.join("\n")}`
4674
4706
  const tags = parseList(options.tags);
4675
4707
  const passives = parseList(options.passives);
4676
4708
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
4677
- if (!profile) return "您暂未绑定句柄。";
4709
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
4678
4710
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
4679
4711
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
4680
4712
  if (existingEntries.length > 0) return "❌ 拒绝访问,您已被列入黑名单。";
@@ -4815,7 +4847,7 @@ ${effectMessage.join("\n")}`
4815
4847
  ctx.command("ggcevo/祈愿").action(async (argv) => {
4816
4848
  const session = argv.session;
4817
4849
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
4818
- if (!profile) return "您暂未绑定句柄。";
4850
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
4819
4851
  const { regionId, realmId, profileId } = profile;
4820
4852
  const handle = `${regionId}-S2-${realmId}-${profileId}`;
4821
4853
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
@@ -4892,7 +4924,7 @@ ${effectMessage.join("\n")}`
4892
4924
  });
4893
4925
  ctx.command("兑换金币", "使用兑换券兑换金币").action(async ({ session }) => {
4894
4926
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
4895
- if (!profile) return "您暂未绑定句柄。";
4927
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
4896
4928
  const { regionId, realmId, profileId } = profile;
4897
4929
  const handle = `${regionId}-S2-${realmId}-${profileId}`;
4898
4930
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
@@ -4931,7 +4963,7 @@ ${effectMessage.join("\n")}`
4931
4963
  });
4932
4964
  ctx.command("兑换红晶", "使用金币兑换红晶").action(async ({ session }) => {
4933
4965
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
4934
- if (!profile) return "⚠️ 需要先绑定游戏句柄";
4966
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
4935
4967
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
4936
4968
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
4937
4969
  if (existingEntries.length > 0) {
@@ -4971,7 +5003,7 @@ ${effectMessage.join("\n")}`
4971
5003
  });
4972
5004
  ctx.command("ggcevo/加入 <faction>", "加入阵营").alias("加入阵营").action(async ({ session }, faction) => {
4973
5005
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
4974
- if (!profile) return "您暂未绑定句柄。";
5006
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
4975
5007
  const { regionId, realmId, profileId } = profile;
4976
5008
  const handle = `${regionId}-S2-${realmId}-${profileId}`;
4977
5009
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
@@ -5040,7 +5072,7 @@ ${effectMessage.join("\n")}`
5040
5072
  });
5041
5073
  ctx.command("ggcevo/转职 [profession]", "转职系统").action(async ({ session }, profession) => {
5042
5074
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
5043
- if (!profile) return "您暂未绑定句柄。";
5075
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
5044
5076
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
5045
5077
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
5046
5078
  if (existingEntries.length > 0) {
@@ -5125,7 +5157,7 @@ ${effectMessage.join("\n")}`
5125
5157
  const [profile] = await ctx.database.get("sc2arcade_player", {
5126
5158
  userId: session.userId
5127
5159
  });
5128
- if (!profile) return "您暂未绑定游戏句柄。";
5160
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
5129
5161
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
5130
5162
  const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
5131
5163
  if (!careerData) return "您尚未加入任何阵营。";
@@ -5164,7 +5196,7 @@ ${effectMessage.join("\n")}`
5164
5196
  });
5165
5197
  ctx.command("ggcevo/黑市 [type]", "辛迪加海盗专属黑市").usage("输入“黑市”查看类型,或“黑市 类型”查看详细").action(async ({ session }, type) => {
5166
5198
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
5167
- if (!profile) return "⚠️ 需要先绑定游戏句柄";
5199
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
5168
5200
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
5169
5201
  const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
5170
5202
  if (!careerData || careerData.group !== "辛迪加海盗") {
@@ -5233,7 +5265,7 @@ ${effectMessage.join("\n")}`
5233
5265
  });
5234
5266
  ctx.command("ggcevo/订购 <item>").action(async ({ session }, item) => {
5235
5267
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
5236
- if (!profile) return "⚠️ 需要先绑定游戏句柄";
5268
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
5237
5269
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
5238
5270
  if (await ctx.database.get("ggcevo_blacklist", { handle }).then((r) => r.length)) {
5239
5271
  return "❌ 拒绝访问,您已被列入黑名单";
@@ -5319,7 +5351,7 @@ ${effectMessage.join("\n")}`
5319
5351
  ctx.command("ggcevo/仓库").action(async (argv) => {
5320
5352
  const session = argv.session;
5321
5353
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
5322
- if (!profile) return "您暂未绑定句柄。";
5354
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
5323
5355
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
5324
5356
  const [items, signData, careerData] = await Promise.all([
5325
5357
  ctx.database.get("ggcevo_warehouse", { handle }),
@@ -5362,7 +5394,7 @@ ${effectMessage.join("\n")}`
5362
5394
  ctx.command("ggcevo/使用 [itemName] [target]").action(async (argv, itemName, target) => {
5363
5395
  const session = argv.session;
5364
5396
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
5365
- if (!profile) return "🔒 需要先绑定游戏句柄";
5397
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
5366
5398
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
5367
5399
  if (await ctx.database.get("ggcevo_blacklist", { handle }).then((r) => r.length)) {
5368
5400
  return "⛔ 您已被列入黑名单";
@@ -5402,7 +5434,7 @@ ${effectMessage.join("\n")}`
5402
5434
  });
5403
5435
  ctx.command("ggcevo/科技 [techName]", "查看空间站科技信息").usage("输入“科技”查看列表,或“科技 科技名称”查看详细信息").action(async ({ session }, techName) => {
5404
5436
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
5405
- if (!profile) return "🔒 需要先绑定游戏句柄";
5437
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
5406
5438
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
5407
5439
  const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
5408
5440
  if (!careerData || careerData.group !== "人类联盟") {
@@ -5450,7 +5482,7 @@ ${Spacestationtechnology.map((t) => t.techname).join("、")}`;
5450
5482
  return new Date(utcDate.getTime() + chinaOffset);
5451
5483
  }, "convertUTCtoChinaTime");
5452
5484
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
5453
- if (!profile) return "🔒 需要先绑定游戏句柄";
5485
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
5454
5486
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
5455
5487
  if (await ctx.database.get("ggcevo_blacklist", { handle }).then((r) => r.length)) {
5456
5488
  return "⛔ 您已被列入黑名单";
@@ -5472,7 +5504,7 @@ ${Spacestationtechnology.map((t) => t.techname).join("、")}`;
5472
5504
  startTime: /* @__PURE__ */ new Date()
5473
5505
  // 记录当前时间为开始时间
5474
5506
  });
5475
- return "⛏️ 挖矿作业已开始,至少1小时后可收获";
5507
+ return "⛏️ 挖矿作业已开始,至少1小时后可收获。";
5476
5508
  }
5477
5509
  const nowtime = /* @__PURE__ */ new Date();
5478
5510
  const chinaStart = convertUTCtoChinaTime2(record.startTime);
@@ -5525,7 +5557,7 @@ ${Spacestationtechnology.map((t) => t.techname).join("、")}`;
5525
5557
  `🕒 开始时间:${record.startTime.toLocaleString("zh-CN", { hour12: false })}`,
5526
5558
  `⏱️ 结束时间:${nowtime.toLocaleString("zh-CN", { hour12: false })}`,
5527
5559
  `⏳ 持续时间:${formatTime(duration)}`,
5528
- ...tech.level >= 3 ? (
5560
+ ...tech.level >= 4 ? (
5529
5561
  // 仅当科技等级≥3时显示加成信息
5530
5562
  [`🔧 科技加成(Lv.${tech.level}):+${multiplier * 100}%`]
5531
5563
  ) : [],
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "koishi-plugin-ggcevo-game",
3
3
  "description": "《星际争霸2》咕咕虫-evolved地图的专属游戏助手插件,集成天梯排行、抽奖系统、签到福利、兑换商城等丰富功能。",
4
- "version": "1.3.15",
4
+ "version": "1.3.16",
5
5
  "main": "lib/index.js",
6
6
  "typings": "lib/index.d.ts",
7
7
  "files": [