koishi-plugin-ggcevo-game 1.4.3 → 1.4.4

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.
@@ -11,7 +11,6 @@ export declare const syndicatePirateConfig: {
11
11
  effect: string;
12
12
  requirements: string;
13
13
  Jobtransfer: boolean;
14
- costcoins: number;
15
14
  costredcrystal: number;
16
15
  }[];
17
16
  export declare function checkTransferRequirements(ctx: Context, handle: string, profession: string): Promise<{
package/lib/index.js CHANGED
@@ -220,7 +220,7 @@ var weaponConfig = {
220
220
  id: 13,
221
221
  type: "实弹武器",
222
222
  category: "实弹武器",
223
- damage: 25,
223
+ damage: 30,
224
224
  description: "这种强大的钻头是由那些想把矿工SCV上的大螺丝用作武器的人创造的",
225
225
  specialeffect: "",
226
226
  price: 1e3,
@@ -236,7 +236,7 @@ var weaponConfig = {
236
236
  id: 14,
237
237
  type: "能量武器",
238
238
  category: "能量武器",
239
- damage: 30,
239
+ damage: 32,
240
240
  description: "一种原型能量武器,能够发射强大的脉冲",
241
241
  specialeffect: "攻击不会触发目标的叠层技能",
242
242
  price: 1500,
@@ -255,6 +255,7 @@ var weaponConfig = {
255
255
  redCrystalCost: 150,
256
256
  isantiair: true,
257
257
  tagEffects: {
258
+ "生物": 2,
258
259
  "护盾": 0.5,
259
260
  "重甲": 0.5
260
261
  }
@@ -292,7 +293,7 @@ var weaponConfig = {
292
293
  id: 104,
293
294
  type: "实弹武器",
294
295
  category: "传奇武器",
295
- damage: 145,
296
+ damage: 120,
296
297
  description: "一件传奇武器",
297
298
  specialeffect: "",
298
299
  price: 7500,
@@ -308,7 +309,7 @@ var weaponConfig = {
308
309
  category: "传奇武器",
309
310
  damage: 100,
310
311
  description: "优雅而独特的武器",
311
- specialeffect: "",
312
+ specialeffect: "无视目标100%的减伤效果",
312
313
  price: 7500,
313
314
  redCrystalCost: 150,
314
315
  isantiair: false,
@@ -332,7 +333,7 @@ var weaponConfig = {
332
333
  id: 107,
333
334
  type: "能量武器",
334
335
  category: "传奇武器",
335
- damage: 50,
336
+ damage: 60,
336
337
  description: "一件传奇武器",
337
338
  specialeffect: "攻击无视目标80%的减伤效果",
338
339
  price: 7500,
@@ -346,7 +347,7 @@ var weaponConfig = {
346
347
  id: 108,
347
348
  type: "能量武器",
348
349
  category: "传奇武器",
349
- damage: 110,
350
+ damage: 90,
350
351
  description: "一件传奇武器",
351
352
  specialeffect: "",
352
353
  price: 7500,
@@ -540,11 +541,11 @@ var spaceStationCrewConfig = [
540
541
  effect: "",
541
542
  requirements: "",
542
543
  Jobtransfer: false,
543
- costcoins: 3e3
544
+ costcoins: 2e3
544
545
  },
545
546
  {
546
547
  professionName: "情报副官",
547
- effect: "升级空间站科技享有20%的折扣",
548
+ effect: "升级空间站科技享有15%的折扣",
548
549
  requirements: "至少一个空间站科技等级≥3级",
549
550
  Jobtransfer: true,
550
551
  costcoins: 3e3
@@ -584,7 +585,6 @@ var syndicatePirateConfig = [
584
585
  effect: "能量武器攻击伤害+20%; 解锁MK-4激光步枪(传奇)购买权限",
585
586
  requirements: "至少拥有一把3级及以上等级的能量武器",
586
587
  Jobtransfer: true,
587
- costcoins: 0,
588
588
  costredcrystal: 30
589
589
  },
590
590
  {
@@ -592,23 +592,20 @@ var syndicatePirateConfig = [
592
592
  effect: "当有异形被击败时获得红晶(击败者获得双倍红晶); 每次攻击额外获得红晶",
593
593
  requirements: "当期伤害榜前二十名",
594
594
  Jobtransfer: true,
595
- costcoins: 0,
596
595
  costredcrystal: 20
597
596
  },
598
597
  {
599
598
  professionName: "枪手",
600
- effect: "武器等级上限为7",
601
- requirements: "拥有2把武器等级为6的武器",
602
- Jobtransfer: false,
603
- costcoins: 0,
604
- costredcrystal: 30
599
+ effect: "武器等级上限为7级; 升级武器享有10%的折扣; 解锁M4AE脉冲步枪(传奇)购买权限",
600
+ requirements: "至少拥有一把6级及以上等级的武器",
601
+ Jobtransfer: true,
602
+ costredcrystal: 40
605
603
  },
606
604
  {
607
605
  professionName: "猩红杀手",
608
606
  effect: "使用“侦察步枪”造成的伤害+15%; 解锁DSR-55反器材步枪(传奇)购买权限",
609
607
  requirements: "“侦察步枪”武器等级≥3级",
610
608
  Jobtransfer: true,
611
- costcoins: 0,
612
609
  costredcrystal: 30
613
610
  },
614
611
  {
@@ -616,7 +613,6 @@ var syndicatePirateConfig = [
616
613
  effect: "热能武器攻击伤害+20%; 解锁龙息霰弹枪(传奇)购买权限",
617
614
  requirements: "至少拥有一把3级及以上等级的热能武器",
618
615
  Jobtransfer: true,
619
- costcoins: 0,
620
616
  costredcrystal: 30
621
617
  },
622
618
  {
@@ -624,15 +620,13 @@ var syndicatePirateConfig = [
624
620
  effect: "每日签到能额外获得红晶; 主动发起的PK对战结果为胜利时,额外奖励1红晶",
625
621
  requirements: "当月累计签到14天及以上",
626
622
  Jobtransfer: true,
627
- costcoins: 0,
628
623
  costredcrystal: 25
629
624
  },
630
625
  {
631
626
  professionName: "计算机专家",
632
627
  effect: "黑市订购设备工具类物品享有50%折扣; 被动应战的PK对战结果为失败时,不会损失金币",
633
- requirements: "仓库中拥有一个黑市订购的设备工具类物品",
628
+ requirements: "仓库中至少拥有一个黑市订购的设备工具类物品",
634
629
  Jobtransfer: true,
635
- costcoins: 0,
636
630
  costredcrystal: 30
637
631
  },
638
632
  {
@@ -640,7 +634,6 @@ var syndicatePirateConfig = [
640
634
  effect: "可以使用红晶升级独特的辛迪加空间站科技",
641
635
  requirements: "",
642
636
  Jobtransfer: false,
643
- costcoins: 2e3,
644
637
  costredcrystal: 10
645
638
  },
646
639
  {
@@ -648,23 +641,20 @@ var syndicatePirateConfig = [
648
641
  effect: "",
649
642
  requirements: "",
650
643
  Jobtransfer: false,
651
- costcoins: 2e3,
652
644
  costredcrystal: 10
653
645
  },
654
646
  {
655
647
  professionName: "破坏者",
656
- effect: "",
657
- requirements: "",
658
- Jobtransfer: false,
659
- costcoins: 2e3,
660
- costredcrystal: 10
648
+ effect: "黑市订购爆破物类物品享有50%折扣",
649
+ requirements: "仓库中至少拥有一个黑市订购的爆破物类物品",
650
+ Jobtransfer: true,
651
+ costredcrystal: 25
661
652
  },
662
653
  {
663
654
  professionName: "征募官",
664
655
  effect: "",
665
656
  requirements: "",
666
657
  Jobtransfer: false,
667
- costcoins: 2e3,
668
658
  costredcrystal: 10
669
659
  },
670
660
  {
@@ -672,7 +662,6 @@ var syndicatePirateConfig = [
672
662
  effect: "你只是一个炮灰",
673
663
  requirements: "无",
674
664
  Jobtransfer: false,
675
- costcoins: 0,
676
665
  costredcrystal: 0
677
666
  }
678
667
  ];
@@ -754,6 +743,22 @@ async function checkTransferRequirements(ctx, handle, profession) {
754
743
  };
755
744
  }
756
745
  ;
746
+ case "枪手":
747
+ const hasLevel6Weapon = weapons.some((weapon) => weapon.level >= 6);
748
+ return {
749
+ success: hasLevel6Weapon,
750
+ message: hasLevel6Weapon ? "" : "需要至少拥有一把6级及以上等级的武器"
751
+ };
752
+ case "破坏者":
753
+ const warehouseItems = await ctx.database.get("ggcevo_warehouse", { handle });
754
+ const blackMarketExplosives = Object.values(SyndicatedItems).filter((item) => item.type === "爆破物" && item.redCrystalCost > 0).map((item) => item.id);
755
+ const hasExplosive = warehouseItems.some(
756
+ (item) => blackMarketExplosives.includes(item.itemId) && item.quantity > 0
757
+ );
758
+ return {
759
+ success: hasExplosive,
760
+ message: hasExplosive ? "" : "需要仓库中拥有一个从黑市订购的爆破物类物品"
761
+ };
757
762
  case "清洁工":
758
763
  if (!mainBoss) return { success: false, message: "当前暂无伤害榜。" };
759
764
  const cleanTop20 = await ctx.database.select("ggcevo_boss_damage").where({ bossGroupId: mainBoss.groupId }).orderBy("totalDamage", "desc").limit(20).execute();
@@ -768,9 +773,9 @@ async function checkTransferRequirements(ctx, handle, profession) {
768
773
  message: `需要当月累计签到14天及以上(当前${signData?.monthlyDays || 0}天)`
769
774
  };
770
775
  case "计算机专家": {
771
- const warehouseItems = await ctx.database.get("ggcevo_warehouse", { handle });
776
+ const warehouseItems2 = await ctx.database.get("ggcevo_warehouse", { handle });
772
777
  const blackMarketDeviceTools = Object.values(SyndicatedItems).filter((item) => item.type === "设备工具" && item.redCrystalCost > 0).map((item) => item.id);
773
- const hasDeviceTool = warehouseItems.some(
778
+ const hasDeviceTool = warehouseItems2.some(
774
779
  (item) => blackMarketDeviceTools.includes(item.itemId) && item.quantity > 0
775
780
  );
776
781
  return {
@@ -1912,8 +1917,8 @@ async function handleTechUpgrade(ctx, handle, target) {
1912
1917
  let discountDetails = [];
1913
1918
  if (careerData.career === "情报副官") {
1914
1919
  discountApplied = true;
1915
- actualCost = Math.floor(originalCost * 0.8);
1916
- discountDetails.push("🎖️ 情报副官:20%折扣");
1920
+ actualCost = Math.floor(originalCost * 0.85);
1921
+ discountDetails.push("🎖️ 情报副官:15%折扣");
1917
1922
  }
1918
1923
  const [signInfo] = await ctx.database.get("ggcevo_sign", { handle });
1919
1924
  if (signInfo?.totalRewards < actualCost) {
@@ -1989,15 +1994,21 @@ async function handleWeaponUpgrade(ctx, handle, target) {
1989
1994
  handle,
1990
1995
  weaponId: weaponData.id
1991
1996
  });
1997
+ const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
1992
1998
  if (!equipment) return "❌ 您尚未获得该武器";
1993
- if (equipment.level >= 6) return " 该武器已达最高等级";
1994
- const BASE_COST = [1050, 1450, 1850, 2250, 2650, 3050];
1999
+ const maxLevel = careerData?.career === "枪手" ? 7 : 6;
2000
+ if (equipment.level >= maxLevel) return `❌ 该武器已达最高等级(Lv.${maxLevel})`;
2001
+ const BASE_COST = [1050, 1450, 1850, 2250, 2650, 3050, 3450];
1995
2002
  const baseCost = BASE_COST[equipment.level];
1996
2003
  const weaponTechConfig = Spacestationtechnology.find((t) => t.techId === 2);
1997
- const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
1998
2004
  let techLevel = 0;
1999
2005
  let totalDiscount = 0;
2000
2006
  const discountDetails = [];
2007
+ const isGunslinger = careerData?.career === "枪手";
2008
+ if (isGunslinger) {
2009
+ totalDiscount += 10;
2010
+ discountDetails.push("🔫 枪手:10%折扣");
2011
+ }
2001
2012
  if (careerData?.group === "人类联盟") {
2002
2013
  const [weaponTech] = await ctx.database.get("ggcevo_tech", { handle, techId: 2 }).catch(() => [{ level: 0 }]);
2003
2014
  techLevel = Math.min(Math.max(weaponTech?.level || 0, 0), 5);
@@ -2027,6 +2038,8 @@ async function handleWeaponUpgrade(ctx, handle, target) {
2027
2038
  const priceInfo2 = totalDiscount > 0 ? `需要${actualCost}金币(原价${baseCost}金币)` : `需要${actualCost}金币`;
2028
2039
  return `❌ ${priceInfo2},您当前拥有:${signInfo?.totalRewards || 0}金币`;
2029
2040
  }
2041
+ const newLevel = equipment.level + 1;
2042
+ const newModSlots = Math.floor(newLevel / 3) + 1;
2030
2043
  await ctx.database.withTransaction(async () => {
2031
2044
  await ctx.database.set("ggcevo_sign", { handle }, {
2032
2045
  totalRewards: signInfo.totalRewards - actualCost
@@ -2035,8 +2048,8 @@ async function handleWeaponUpgrade(ctx, handle, target) {
2035
2048
  "ggcevo_equipment",
2036
2049
  { handle, weaponId: weaponData.id },
2037
2050
  {
2038
- level: equipment.level + 1,
2039
- modificationSlots: Math.floor((equipment.level + 1) / 3) + 1
2051
+ level: newLevel,
2052
+ modificationSlots: newModSlots
2040
2053
  }
2041
2054
  );
2042
2055
  if (activeWish) {
@@ -2047,7 +2060,6 @@ async function handleWeaponUpgrade(ctx, handle, target) {
2047
2060
  );
2048
2061
  }
2049
2062
  });
2050
- const newLevel = equipment.level + 1;
2051
2063
  const damage = (weaponData.damage * (1 + 0.1 * newLevel)).toFixed(1);
2052
2064
  let msg = `${target} 升级成功!Lv.${newLevel}`;
2053
2065
  const priceInfo = totalDiscount > 0 ? `
@@ -2057,12 +2069,12 @@ async function handleWeaponUpgrade(ctx, handle, target) {
2057
2069
  if (discountDetails.length > 0) {
2058
2070
  msg += `
2059
2071
  💰 折扣明细:
2060
- ${discountDetails.join("\n▸ ")}`;
2072
+ ${discountDetails.join("\n▸ ")}`;
2061
2073
  }
2062
2074
  msg += `
2063
2075
  💥 伤害:${damage}`;
2064
2076
  msg += `
2065
- 🔧 改装槽:${Math.floor(newLevel / 3) + 1}个`;
2077
+ 🔧 改装槽:${newModSlots}个`;
2066
2078
  return msg;
2067
2079
  }
2068
2080
  __name(handleWeaponUpgrade, "handleWeaponUpgrade");
@@ -2077,55 +2089,94 @@ async function checkFoxBlessing(ctx, handle) {
2077
2089
  }
2078
2090
  __name(checkFoxBlessing, "checkFoxBlessing");
2079
2091
  async function generateUpgradePriceList(ctx, handle) {
2080
- const [techData] = await ctx.database.get("ggcevo_tech", { handle, techId: 2 }).catch(() => [{ level: 0 }]);
2081
2092
  const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
2082
- const weaponTechConfig = Spacestationtechnology.find((t) => t.techId === 2);
2083
- const techLevel = Math.min(techData?.level || 0, 5);
2084
- const isCareerMatch = weaponTechConfig.careerNames.includes(careerData?.career);
2085
- const BASE_DISCOUNTS = [5, 10, 15, 20, 25];
2086
- const CAREER_DISCOUNTS = [10, 20, 30, 40, 50];
2087
- const baseDiscount = techLevel > 0 ? BASE_DISCOUNTS[techLevel - 1] : 0;
2088
- const careerDiscount = isCareerMatch ? CAREER_DISCOUNTS[techLevel - 1] : 0;
2089
- const techDiscountRate = Math.max(baseDiscount, careerDiscount);
2090
- const hasTechDiscount = techDiscountRate > 0;
2093
+ const isGunslinger = careerData?.career === "枪手";
2094
+ const isAlliance = careerData?.group === "人类联盟";
2095
+ let techLevel = 0;
2096
+ let techDiscountRate = 0;
2097
+ let hasTechDiscount = false;
2098
+ if (isAlliance) {
2099
+ const [techData] = await ctx.database.get("ggcevo_tech", { handle, techId: 2 }).catch(() => [{ level: 0 }]);
2100
+ const weaponTechConfig = Spacestationtechnology.find((t) => t.techId === 2);
2101
+ techLevel = Math.min(techData?.level || 0, 5);
2102
+ const isCareerMatch = weaponTechConfig?.careerNames.includes(careerData?.career);
2103
+ const BASE_DISCOUNTS = [5, 10, 15, 20, 25];
2104
+ const CAREER_DISCOUNTS = [10, 20, 30, 40, 50];
2105
+ const baseDiscount = techLevel > 0 ? BASE_DISCOUNTS[techLevel - 1] : 0;
2106
+ const careerDiscount = isCareerMatch ? CAREER_DISCOUNTS[techLevel - 1] : 0;
2107
+ techDiscountRate = Math.max(baseDiscount, careerDiscount);
2108
+ hasTechDiscount = techDiscountRate > 0;
2109
+ }
2091
2110
  const foxBlessing = await checkFoxBlessing(ctx, handle);
2092
2111
  const foxDiscount = foxBlessing ? 20 : 0;
2093
2112
  const hasFoxDiscount = foxDiscount > 0;
2094
- const BASE_COST = [1050, 1450, 1850, 2250, 2650, 3050];
2095
- const priceDetails = BASE_COST.map((baseCost, index) => {
2096
- const level = `${index}→${index + 1}`;
2113
+ const gunslingerDiscount = isGunslinger ? 10 : 0;
2114
+ const hasGunslingerDiscount = isGunslinger;
2115
+ const BASE_COST = [1050, 1450, 1850, 2250, 2650, 3050, 3450];
2116
+ const maxLevel = isGunslinger ? 7 : 6;
2117
+ const priceDetails = [];
2118
+ for (let i = 0; i < maxLevel; i++) {
2119
+ const level = `${i}→${i + 1}`;
2120
+ let baseCost = BASE_COST[i];
2097
2121
  let finalPrice = baseCost;
2098
- if (hasTechDiscount || hasFoxDiscount) {
2099
- let totalDiscount = 0;
2100
- if (hasTechDiscount) totalDiscount += techDiscountRate;
2101
- if (hasFoxDiscount) totalDiscount += foxDiscount;
2122
+ let discountsApplied = [];
2123
+ let totalDiscount = 0;
2124
+ if (isGunslinger) {
2125
+ totalDiscount += gunslingerDiscount;
2126
+ discountsApplied.push(`${gunslingerDiscount}% (枪手)`);
2127
+ }
2128
+ if (isAlliance && hasTechDiscount) {
2129
+ totalDiscount += techDiscountRate;
2130
+ discountsApplied.push(`${techDiscountRate}% (科技)`);
2131
+ }
2132
+ if (hasFoxDiscount) {
2133
+ totalDiscount += foxDiscount;
2134
+ discountsApplied.push(`${foxDiscount}% (灵狐)`);
2135
+ }
2136
+ if (totalDiscount > 0) {
2102
2137
  totalDiscount = Math.min(totalDiscount, 100);
2103
- finalPrice = Math.floor(baseCost * (1 - totalDiscount / 100));
2138
+ finalPrice = Math.floor(baseCost * (100 - totalDiscount) / 100);
2104
2139
  }
2105
2140
  const showOriginal = finalPrice < baseCost;
2106
- return [
2107
- `等级 ${level.padEnd(5)}`,
2108
- `▸ 价格: ${finalPrice.toString().padStart(4)}${showOriginal ? ` (原价${baseCost})` : ""}`
2109
- ].join("\n");
2110
- });
2141
+ const levelInfo = `等级 ${level.padEnd(5)}`;
2142
+ const priceInfo = `▸ 价格: ${finalPrice.toString().padStart(4)}${showOriginal ? ` (原价${baseCost})` : ""}`;
2143
+ let discountDetail = "";
2144
+ if (discountsApplied.length > 0) {
2145
+ discountDetail = ` - 折扣总计: ${totalDiscount}% [${discountsApplied.join(", ")}]`;
2146
+ }
2147
+ priceDetails.push(`${levelInfo}
2148
+ ${priceInfo}`);
2149
+ }
2111
2150
  const discountNotice = [];
2112
- if (hasTechDiscount || hasFoxDiscount) {
2151
+ if (hasTechDiscount || hasFoxDiscount || hasGunslingerDiscount) {
2113
2152
  discountNotice.push("💰 当前折扣:");
2114
2153
  }
2115
- if (hasTechDiscount) {
2154
+ if (isGunslinger) {
2155
+ discountNotice.push(`🔫 枪手:10%升级武器折扣`);
2156
+ }
2157
+ if (isAlliance && hasTechDiscount) {
2116
2158
  discountNotice.push(`⚙️ 武器系统 Lv${techLevel}:${techDiscountRate}%折扣`);
2117
2159
  }
2118
2160
  if (hasFoxDiscount) {
2119
2161
  discountNotice.push(`🦊 灵狐升运:20%折扣`);
2120
2162
  }
2121
- if (!hasTechDiscount && !hasFoxDiscount) {
2122
- discountNotice.push("💡 提示:加入人类联盟并升级武器系统可获得折扣");
2163
+ if (!hasTechDiscount && !hasFoxDiscount && !hasGunslingerDiscount) {
2164
+ if (isAlliance) {
2165
+ discountNotice.push("💡 提示:升级武器系统可获得折扣");
2166
+ } else if (careerData?.group === "辛迪加海盗") {
2167
+ discountNotice.push("💡 提示:转职为枪手可获得20%折扣");
2168
+ } else {
2169
+ discountNotice.push("💡 提示:加入人类联盟或辛迪加海盗可获得折扣");
2170
+ }
2171
+ }
2172
+ if (isGunslinger) {
2173
+ discountNotice.push("🔝 枪手特权:武器等级上限提升至7级");
2123
2174
  }
2124
2175
  return [
2125
2176
  "⚡ 武器升级价格表 ⚡",
2177
+ `武器等级上限: ${maxLevel}级(${isGunslinger ? "枪手职业特权" : "普通玩家"})`,
2126
2178
  "使用「升级 武器名称」对武器进行等级升级",
2127
2179
  ...discountNotice,
2128
- // 现在折扣信息前有标题
2129
2180
  "====================",
2130
2181
  ...priceDetails,
2131
2182
  "===================="
@@ -3824,10 +3875,10 @@ async function calculateRewards(ctx, handle, username, totalDamage) {
3824
3875
  let careerMessage = "";
3825
3876
  if (career === "警卫员下士") {
3826
3877
  careerMultiplier = 50;
3827
- careerMessage = "(警卫员下士:金币+50%)";
3878
+ careerMessage = "🛡️ 警卫员下士:+50%金币";
3828
3879
  } else if (career === "警卫长") {
3829
3880
  careerMultiplier = 100;
3830
- careerMessage = "(警卫长:金币+100%)";
3881
+ careerMessage = "🛡️ 警卫长:+100%金币";
3831
3882
  }
3832
3883
  const totalBonusPercent = careerMultiplier + techBonusPercent;
3833
3884
  const totalBonusFactor = 1 + totalBonusPercent / 100;
@@ -3838,7 +3889,7 @@ async function calculateRewards(ctx, handle, username, totalDamage) {
3838
3889
  handle,
3839
3890
  redcrystal: (careerData?.redcrystal || 0) + 1
3840
3891
  }], ["handle"]);
3841
- redcrystalMessage = "🎖️ 清洁工:+1枚红晶";
3892
+ redcrystalMessage = "🔴 清洁工:+1枚红晶";
3842
3893
  }
3843
3894
  return {
3844
3895
  finalReward,
@@ -7028,6 +7079,7 @@ ${validTypes.join("、")}`;
7028
7079
  return "🚫 该功能需要【辛迪加海盗】阵营权限";
7029
7080
  }
7030
7081
  const isComputerExpert = careerData.career === "计算机专家";
7082
+ const isSaboteur = careerData.career === "破坏者";
7031
7083
  const categoryStats = {};
7032
7084
  Object.values(weaponConfig).filter((config2) => config2.redCrystalCost > 0).forEach((weapon) => {
7033
7085
  categoryStats[weapon.category] = (categoryStats[weapon.category] || 0) + 1;
@@ -7036,12 +7088,19 @@ ${validTypes.join("、")}`;
7036
7088
  categoryStats[item.type] = (categoryStats[item.type] || 0) + 1;
7037
7089
  });
7038
7090
  if (!category) {
7091
+ const discountLines = [];
7092
+ if (isComputerExpert) {
7093
+ discountLines.push("💻 计算机专家:设备工具类物品50%折扣");
7094
+ }
7095
+ if (isSaboteur) {
7096
+ discountLines.push("💣 破坏者:爆破物类物品50%折扣");
7097
+ }
7039
7098
  return [
7040
7099
  "🏴 辛迪加黑市 🏴",
7041
7100
  '使用 "黑市 分类名称" 查看详细信息',
7042
- isComputerExpert ? [
7101
+ discountLines.length ? [
7043
7102
  "💰 当前折扣:",
7044
- "💻 计算机专家:设备工具类物品50%折扣"
7103
+ ...discountLines
7045
7104
  ].join("\n") : "",
7046
7105
  "====================",
7047
7106
  ...Object.entries(categoryStats).map(([catName, count]) => `▸ ${catName} (${count}种)`),
@@ -7052,14 +7111,11 @@ ${validTypes.join("、")}`;
7052
7111
  if (!normalizedCategory) return `无效分类,可用:${Object.keys(categoryStats).join("、")}`;
7053
7112
  const items = [
7054
7113
  ...Object.entries(weaponConfig).filter(
7055
- ([_, config2]) => config2.category === normalizedCategory && // 使用 category 代替 type
7056
- config2.redCrystalCost > 0
7114
+ ([_, config2]) => config2.category === normalizedCategory && config2.redCrystalCost > 0
7057
7115
  ).map(([name2, config2]) => {
7058
7116
  const infoBlocks = [
7059
7117
  `【${name2}】`,
7060
7118
  `武器类型:${config2.type}`,
7061
- // 保留攻击类型显示
7062
- // +++ 为武器类物品添加基础伤害显示 +++
7063
7119
  `基础伤害:${config2.damage}`,
7064
7120
  `订购价:${config2.redCrystalCost}红晶`
7065
7121
  ];
@@ -7078,17 +7134,28 @@ ${validTypes.join("、")}`;
7078
7134
  return infoBlocks.join("\n");
7079
7135
  }),
7080
7136
  ...Object.entries(SyndicatedItems).filter(
7081
- ([_, item]) => item.type === normalizedCategory && // 爆破物仍然使用 type
7082
- item.redCrystalCost > 0
7137
+ ([_, item]) => item.type === normalizedCategory && item.redCrystalCost > 0
7083
7138
  ).map(([name2, item]) => {
7084
- const finalPrice = isComputerExpert && normalizedCategory === "设备工具" ? Math.floor(item.redCrystalCost * 0.5) : item.redCrystalCost;
7139
+ let finalPrice = item.redCrystalCost;
7140
+ let discountApplied = false;
7141
+ let discountType = "";
7142
+ if (isSaboteur && normalizedCategory === "爆破物") {
7143
+ finalPrice = Math.floor(item.redCrystalCost * 0.5);
7144
+ discountApplied = true;
7145
+ discountType = "破坏者";
7146
+ } else if (isComputerExpert && normalizedCategory === "设备工具") {
7147
+ finalPrice = Math.floor(item.redCrystalCost * 0.5);
7148
+ discountApplied = true;
7149
+ discountType = "计算机专家";
7150
+ }
7085
7151
  const infoBlocks = [
7086
7152
  `【${name2}】`,
7087
7153
  `物品类型:${item.type}`
7088
7154
  ];
7089
- if (isComputerExpert && normalizedCategory === "设备工具") {
7155
+ if (discountApplied) {
7090
7156
  infoBlocks.push(
7091
- `订购价:${finalPrice}红晶 (原价${item.redCrystalCost})`
7157
+ `订购价:${finalPrice}红晶 (原价${item.redCrystalCost})`,
7158
+ `折扣:${discountType}专属50%折扣`
7092
7159
  );
7093
7160
  } else {
7094
7161
  infoBlocks.push(
@@ -7104,14 +7171,19 @@ ${validTypes.join("、")}`;
7104
7171
  })
7105
7172
  ];
7106
7173
  let discountInfo = [];
7107
- if (isComputerExpert && normalizedCategory === "设备工具") {
7174
+ if (isSaboteur && normalizedCategory === "爆破物") {
7175
+ discountInfo = [
7176
+ "💰 当前折扣:",
7177
+ "💣 破坏者:爆破物类物品50%折扣"
7178
+ ];
7179
+ } else if (isComputerExpert && normalizedCategory === "设备工具") {
7108
7180
  discountInfo = [
7109
7181
  "💰 当前折扣:",
7110
7182
  "💻 计算机专家:设备工具类物品50%折扣"
7111
7183
  ];
7112
7184
  }
7113
7185
  return [
7114
- `🏴☠️ 辛迪加黑市 - ${normalizedCategory} 🏴☠️`,
7186
+ `🏴 辛迪加黑市 - ${normalizedCategory} 🏴`,
7115
7187
  '使用"订购 物品名称"进行购买(仅消耗红晶)',
7116
7188
  ...discountInfo,
7117
7189
  "====================",
@@ -7143,21 +7215,29 @@ ${validTypes.join("、")}`;
7143
7215
  return "❌ 购买DSR-55反器材步枪需要【猩红杀手】职业。";
7144
7216
  } else if (item === "龙息霰弹枪" && careerData.career !== "纵火狂") {
7145
7217
  return "❌ 购买龙息霰弹枪需要【纵火狂】职业。";
7146
- } else if (item !== "MK-4激光步枪" && item !== "DSR-55反器材步枪" && item !== "龙息霰弹枪") {
7218
+ } else if (item === "M4AE脉冲步枪" && careerData.career !== "枪手") {
7219
+ return "❌ 购买M4AE脉冲步枪需要【枪手】职业。";
7220
+ } else if (item !== "MK-4激光步枪" && item !== "DSR-55反器材步枪" && item !== "龙息霰弹枪" && item !== "M4AE脉冲步枪") {
7147
7221
  return "❌ 未知的传奇武器或未开放购买权限";
7148
7222
  }
7149
7223
  }
7150
7224
  let isComputerExpertDiscount = false;
7225
+ let isSaboteurDiscount = false;
7151
7226
  let originalPrice = itemConfig2.redCrystalCost;
7152
7227
  let finalCost = originalPrice;
7153
7228
  let discountApplied = false;
7229
+ if (!isWeapon && itemConfig2.type === "爆破物" && careerData.career === "破坏者") {
7230
+ finalCost = Math.floor(originalPrice * 0.5);
7231
+ isSaboteurDiscount = true;
7232
+ discountApplied = true;
7233
+ }
7154
7234
  if (!isWeapon && itemConfig2.type === "设备工具" && careerData.career === "计算机专家") {
7155
7235
  finalCost = Math.floor(originalPrice * 0.5);
7156
7236
  isComputerExpertDiscount = true;
7157
7237
  discountApplied = true;
7158
7238
  }
7159
7239
  if ((careerData.redcrystal || 0) < finalCost) {
7160
- const discountMessage = isComputerExpertDiscount ? `(原价${originalPrice})` : "";
7240
+ const discountMessage = discountApplied ? `(原价${originalPrice})` : "";
7161
7241
  return `❌ 红晶不足!需要:${finalCost}${discountMessage} 当前拥有红晶:${careerData.redcrystal}`;
7162
7242
  }
7163
7243
  if (isWeapon) {
@@ -7204,7 +7284,10 @@ ${validTypes.join("、")}`;
7204
7284
  });
7205
7285
  const buildResponse = /* @__PURE__ */ __name(async () => {
7206
7286
  const discountLines = [];
7207
- if (discountApplied) {
7287
+ if (isSaboteurDiscount) {
7288
+ discountLines.push("💣 破坏者:爆破物类物品50%折扣");
7289
+ }
7290
+ if (isComputerExpertDiscount) {
7208
7291
  discountLines.push("💻 计算机专家:设备工具类物品50%折扣");
7209
7292
  }
7210
7293
  const priceInfo = [
@@ -7215,7 +7298,7 @@ ${validTypes.join("、")}`;
7215
7298
  return [
7216
7299
  `✅ 成功订购【${item}】!`,
7217
7300
  ...priceInfo,
7218
- discountApplied ? `折扣明细:
7301
+ discountLines.length ? `折扣明细:
7219
7302
  ▸ ${discountLines.join("\n▸ ")}` : "",
7220
7303
  `装备状态:${equippedStatus}`,
7221
7304
  '输入 "武器仓库" 管理武器'
@@ -7228,7 +7311,7 @@ ${validTypes.join("、")}`;
7228
7311
  return [
7229
7312
  `✅ 成功订购【${item}】x1!`,
7230
7313
  ...priceInfo,
7231
- discountApplied ? `折扣明细:
7314
+ discountLines.length ? `折扣明细:
7232
7315
  ▸ ${discountLines.join("\n▸ ")}` : "",
7233
7316
  `当前库存:${currentStock}件`,
7234
7317
  '输入 "仓库" 查看所有物品'
@@ -7341,7 +7424,7 @@ ${validTypes.join("、")}`;
7341
7424
  '使用 "科技 科技名称" 查看详细信息',
7342
7425
  isIntelligenceOfficer ? [
7343
7426
  "💰 当前折扣:",
7344
- "🎖️ 情报副官:20%"
7427
+ "🎖️ 情报副官:15%"
7345
7428
  ].join("\n") : "",
7346
7429
  "====================",
7347
7430
  ...techList,
@@ -7355,7 +7438,7 @@ ${validTypes.join("、")}`;
7355
7438
  ${Spacestationtechnology.map((t) => t.techname).join("、")}`;
7356
7439
  const techDetails = tech.levels.map((level) => {
7357
7440
  const originalCost = level.cost;
7358
- const discountedCost = isIntelligenceOfficer ? Math.floor(originalCost * 0.8) : originalCost;
7441
+ const discountedCost = isIntelligenceOfficer ? Math.floor(originalCost * 0.85) : originalCost;
7359
7442
  const costDesc = isIntelligenceOfficer ? `▸ 升级花费:${discountedCost}金币 (原价${originalCost})` : `▸ 升级花费:${originalCost}金币`;
7360
7443
  return [
7361
7444
  `✦ 等级 ${romanNumerals[level.level]}`,
package/lib/weapons.d.ts CHANGED
@@ -220,6 +220,7 @@ export declare const weaponConfig: {
220
220
  redCrystalCost: number;
221
221
  isantiair: boolean;
222
222
  tagEffects: {
223
+ 生物: number;
223
224
  护盾: number;
224
225
  重甲: number;
225
226
  };
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.4.3",
4
+ "version": "1.4.4",
5
5
  "main": "lib/index.js",
6
6
  "typings": "lib/index.d.ts",
7
7
  "files": [