koishi-plugin-ggcevo-game 1.4.2 → 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/database.d.ts CHANGED
@@ -184,5 +184,4 @@ export interface purchasepermissions {
184
184
  handle: string;
185
185
  legendarypermissions: number;
186
186
  explosiondoorauthority: number;
187
- syndicatelegendspermissions: number;
188
187
  }
package/lib/index.js CHANGED
@@ -162,7 +162,7 @@ var weaponConfig = {
162
162
  category: "能量武器",
163
163
  damage: 25,
164
164
  description: "一种经过改造的电动工具,可对近距离的目标放出高压电",
165
- specialeffect: "攻击拥有能量的目标将会消耗其200点能量",
165
+ specialeffect: "攻击消耗目标200点能量",
166
166
  price: 750,
167
167
  redCrystalCost: 10,
168
168
  isantiair: true,
@@ -206,7 +206,7 @@ var weaponConfig = {
206
206
  category: "能量武器",
207
207
  damage: 30,
208
208
  description: "面对护盾目标而开发的武器",
209
- specialeffect: "攻击护盾目标,无视其50%的减伤效果",
209
+ specialeffect: "攻击无视护盾目标50%的减伤效果",
210
210
  price: 1050,
211
211
  redCrystalCost: 15,
212
212
  isantiair: true,
@@ -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,9 +236,9 @@ var weaponConfig = {
236
236
  id: 14,
237
237
  type: "能量武器",
238
238
  category: "能量武器",
239
- damage: 30,
239
+ damage: 32,
240
240
  description: "一种原型能量武器,能够发射强大的脉冲",
241
- specialeffect: "",
241
+ specialeffect: "攻击不会触发目标的叠层技能",
242
242
  price: 1500,
243
243
  redCrystalCost: 15,
244
244
  isantiair: true,
@@ -251,10 +251,11 @@ var weaponConfig = {
251
251
  damage: 88,
252
252
  description: "一件传奇武器",
253
253
  specialeffect: "",
254
- price: 6400,
254
+ price: 7500,
255
255
  redCrystalCost: 150,
256
256
  isantiair: true,
257
257
  tagEffects: {
258
+ "生物": 2,
258
259
  "护盾": 0.5,
259
260
  "重甲": 0.5
260
261
  }
@@ -263,10 +264,10 @@ var weaponConfig = {
263
264
  id: 102,
264
265
  type: "能量武器",
265
266
  category: "传奇武器",
266
- damage: 36,
267
+ damage: 50,
267
268
  description: "一件传奇武器",
268
- specialeffect: "",
269
- price: 6400,
269
+ specialeffect: "攻击暴击率80%",
270
+ price: 7500,
270
271
  redCrystalCost: 150,
271
272
  isantiair: true,
272
273
  tagEffects: {
@@ -280,7 +281,7 @@ var weaponConfig = {
280
281
  damage: 80,
281
282
  description: "这是传说中的武器",
282
283
  specialeffect: "",
283
- price: 6400,
284
+ price: 7500,
284
285
  redCrystalCost: 150,
285
286
  isantiair: false,
286
287
  tagEffects: {
@@ -292,10 +293,10 @@ 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
- price: 6400,
299
+ price: 7500,
299
300
  redCrystalCost: 150,
300
301
  isantiair: true,
301
302
  tagEffects: {
@@ -308,8 +309,8 @@ var weaponConfig = {
308
309
  category: "传奇武器",
309
310
  damage: 100,
310
311
  description: "优雅而独特的武器",
311
- specialeffect: "",
312
- price: 6400,
312
+ specialeffect: "无视目标100%的减伤效果",
313
+ price: 7500,
313
314
  redCrystalCost: 150,
314
315
  isantiair: false,
315
316
  tagEffects: {}
@@ -320,8 +321,8 @@ var weaponConfig = {
320
321
  category: "传奇武器",
321
322
  damage: 100,
322
323
  description: "一件传奇武器",
323
- specialeffect: "",
324
- price: 6400,
324
+ specialeffect: "攻击消耗目标500点能量",
325
+ price: 7500,
325
326
  redCrystalCost: 150,
326
327
  isantiair: true,
327
328
  tagEffects: {
@@ -332,10 +333,10 @@ var weaponConfig = {
332
333
  id: 107,
333
334
  type: "能量武器",
334
335
  category: "传奇武器",
335
- damage: 30,
336
+ damage: 60,
336
337
  description: "一件传奇武器",
337
- specialeffect: "",
338
- price: 6400,
338
+ specialeffect: "攻击无视目标80%的减伤效果",
339
+ price: 7500,
339
340
  redCrystalCost: 150,
340
341
  isantiair: true,
341
342
  tagEffects: {
@@ -346,10 +347,10 @@ 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
- price: 6400,
353
+ price: 7500,
353
354
  redCrystalCost: 150,
354
355
  isantiair: true,
355
356
  tagEffects: {
@@ -372,9 +373,9 @@ var modConfig = {
372
373
  exclusiveTo: "",
373
374
  isExclusive: false
374
375
  },
375
- "穿蚀模块": {
376
+ "破甲模块": {
376
377
  cost: 2750,
377
- effect: "攻击时无视目标10%的减伤效果",
378
+ effect: "攻击无视目标20%的减伤效果",
378
379
  exclusiveTo: "",
379
380
  isExclusive: false
380
381
  },
@@ -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 {
@@ -848,19 +853,19 @@ var Spacestationtechnology = [
848
853
  level: 3,
849
854
  cost: 2550,
850
855
  description: "提升空间站武器等级,升级武器享有15%的折扣",
851
- careerBonus: "武器中士/情报副官: 升级武器享有30%的折扣; 购买武器享有10%的折扣(非传奇)"
856
+ careerBonus: "武器中士/情报副官: 升级武器享有30%的折扣"
852
857
  },
853
858
  {
854
859
  level: 4,
855
860
  cost: 3950,
856
861
  description: "提升空间站武器等级,升级武器享有20%的折扣",
857
- careerBonus: "武器中士/情报副官: 在升级武器享有40%的折扣; 购买武器享有15%的折扣(非传奇)"
862
+ careerBonus: "武器中士/情报副官: 在升级武器享有40%的折扣"
858
863
  },
859
864
  {
860
865
  level: 5,
861
866
  cost: 4650,
862
- description: "提升空间站武器等级,升级武器享有25%的折扣; 解锁购买传奇武器权限(仅限一把)",
863
- careerBonus: "武器中士/情报副官: 升级武器享有50%的折扣; 购买武器享有20%的折扣(非传奇); 解锁购买传奇武器权限(仅限一把),并且享有20%的折扣"
867
+ description: "提升空间站武器等级,升级武器享有25%的折扣",
868
+ careerBonus: "武器中士/情报副官: 升级武器享有50%的折扣; 解锁传奇武器购买权限1次"
864
869
  }
865
870
  ]
866
871
  },
@@ -919,7 +924,7 @@ var Spacestationtechnology = [
919
924
  level: 5,
920
925
  cost: 5350,
921
926
  description: "完全恢复空间站安防系统,攻击获得的金币+25%",
922
- careerBonus: "警卫员下士/警卫长/情报副官: 攻击获得的金币+50%; 打开安全军械库防爆门,随机获得一把传奇武器"
927
+ careerBonus: "警卫员下士/警卫长/情报副官: 攻击获得的金币+50%; 获得一次打开安全军械库防爆门的权限,可以随机获得一把传奇武器"
923
928
  }
924
929
  ]
925
930
  }
@@ -1912,14 +1917,31 @@ 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) {
1920
1925
  const priceHint = discountApplied ? ` (原价${originalCost}金币)` : "";
1921
1926
  return `❌ 金币不足!需要${actualCost}金币${priceHint},您当前拥有:${signInfo?.totalRewards || 0}金币`;
1922
1927
  }
1928
+ let permissionGrantInfo = null;
1929
+ if (tech.techname === "武器系统" && currentLevel === 4 && nextLevel === 5) {
1930
+ permissionGrantInfo = {
1931
+ type: "武器系统",
1932
+ field: "legendarypermissions",
1933
+ amount: 1,
1934
+ message: "🎉 解锁传奇武器购买权限1次!"
1935
+ };
1936
+ }
1937
+ if (tech.techname === "安防系统" && currentLevel === 4 && nextLevel === 5) {
1938
+ permissionGrantInfo = {
1939
+ type: "安防系统",
1940
+ field: "explosiondoorauthority",
1941
+ amount: 1,
1942
+ message: "🔓 解锁安全军械库防爆门权限1次!"
1943
+ };
1944
+ }
1923
1945
  await ctx.database.withTransaction(async () => {
1924
1946
  await ctx.database.set("ggcevo_sign", { handle }, {
1925
1947
  totalRewards: signInfo.totalRewards - actualCost
@@ -1929,6 +1951,14 @@ async function handleTechUpgrade(ctx, handle, target) {
1929
1951
  techId: tech.techId,
1930
1952
  level: nextLevel
1931
1953
  }], ["handle", "techId"]);
1954
+ if (permissionGrantInfo) {
1955
+ const [permissionRecord] = await ctx.database.get("ggcevo_purchasepermissions", { handle });
1956
+ const currentValue = permissionRecord?.[permissionGrantInfo.field] || 0;
1957
+ await ctx.database.upsert("ggcevo_purchasepermissions", [{
1958
+ handle,
1959
+ [permissionGrantInfo.field]: currentValue + permissionGrantInfo.amount
1960
+ }], ["handle"]);
1961
+ }
1932
1962
  });
1933
1963
  let discountInfo = [];
1934
1964
  if (discountApplied) {
@@ -1938,13 +1968,23 @@ async function handleTechUpgrade(ctx, handle, target) {
1938
1968
  ];
1939
1969
  }
1940
1970
  const costInfo = discountApplied ? `💰 花费金币:${actualCost} (原价${originalCost})` : `💰 花费金币:${actualCost}`;
1971
+ let permissionMessage = [];
1972
+ if (permissionGrantInfo) {
1973
+ const [permissionRecord] = await ctx.database.get("ggcevo_purchasepermissions", { handle });
1974
+ const newValue = permissionRecord?.[permissionGrantInfo.field] || permissionGrantInfo.amount;
1975
+ permissionMessage.push(
1976
+ permissionGrantInfo.message
1977
+ );
1978
+ }
1941
1979
  return [
1942
1980
  `✅ ${tech.techname} 升级至 Lv.${nextLevel}`,
1943
1981
  costInfo,
1944
1982
  ...discountInfo,
1945
- // 插入折扣明细
1983
+ // 折扣信息
1946
1984
  `📝 ${levelData.description}`,
1947
- `💼 ${levelData.careerBonus}`
1985
+ `💼 ${levelData.careerBonus}`,
1986
+ ...permissionMessage
1987
+ // 权限解锁信息
1948
1988
  ].filter(Boolean).join("\n");
1949
1989
  }
1950
1990
  __name(handleTechUpgrade, "handleTechUpgrade");
@@ -1954,15 +1994,21 @@ async function handleWeaponUpgrade(ctx, handle, target) {
1954
1994
  handle,
1955
1995
  weaponId: weaponData.id
1956
1996
  });
1997
+ const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
1957
1998
  if (!equipment) return "❌ 您尚未获得该武器";
1958
- if (equipment.level >= 6) return " 该武器已达最高等级";
1959
- 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];
1960
2002
  const baseCost = BASE_COST[equipment.level];
1961
2003
  const weaponTechConfig = Spacestationtechnology.find((t) => t.techId === 2);
1962
- const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
1963
2004
  let techLevel = 0;
1964
2005
  let totalDiscount = 0;
1965
2006
  const discountDetails = [];
2007
+ const isGunslinger = careerData?.career === "枪手";
2008
+ if (isGunslinger) {
2009
+ totalDiscount += 10;
2010
+ discountDetails.push("🔫 枪手:10%折扣");
2011
+ }
1966
2012
  if (careerData?.group === "人类联盟") {
1967
2013
  const [weaponTech] = await ctx.database.get("ggcevo_tech", { handle, techId: 2 }).catch(() => [{ level: 0 }]);
1968
2014
  techLevel = Math.min(Math.max(weaponTech?.level || 0, 0), 5);
@@ -1992,6 +2038,8 @@ async function handleWeaponUpgrade(ctx, handle, target) {
1992
2038
  const priceInfo2 = totalDiscount > 0 ? `需要${actualCost}金币(原价${baseCost}金币)` : `需要${actualCost}金币`;
1993
2039
  return `❌ ${priceInfo2},您当前拥有:${signInfo?.totalRewards || 0}金币`;
1994
2040
  }
2041
+ const newLevel = equipment.level + 1;
2042
+ const newModSlots = Math.floor(newLevel / 3) + 1;
1995
2043
  await ctx.database.withTransaction(async () => {
1996
2044
  await ctx.database.set("ggcevo_sign", { handle }, {
1997
2045
  totalRewards: signInfo.totalRewards - actualCost
@@ -2000,8 +2048,8 @@ async function handleWeaponUpgrade(ctx, handle, target) {
2000
2048
  "ggcevo_equipment",
2001
2049
  { handle, weaponId: weaponData.id },
2002
2050
  {
2003
- level: equipment.level + 1,
2004
- modificationSlots: Math.floor((equipment.level + 1) / 3) + 1
2051
+ level: newLevel,
2052
+ modificationSlots: newModSlots
2005
2053
  }
2006
2054
  );
2007
2055
  if (activeWish) {
@@ -2012,7 +2060,6 @@ async function handleWeaponUpgrade(ctx, handle, target) {
2012
2060
  );
2013
2061
  }
2014
2062
  });
2015
- const newLevel = equipment.level + 1;
2016
2063
  const damage = (weaponData.damage * (1 + 0.1 * newLevel)).toFixed(1);
2017
2064
  let msg = `${target} 升级成功!Lv.${newLevel}`;
2018
2065
  const priceInfo = totalDiscount > 0 ? `
@@ -2022,12 +2069,12 @@ async function handleWeaponUpgrade(ctx, handle, target) {
2022
2069
  if (discountDetails.length > 0) {
2023
2070
  msg += `
2024
2071
  💰 折扣明细:
2025
- ${discountDetails.join("\n▸ ")}`;
2072
+ ${discountDetails.join("\n▸ ")}`;
2026
2073
  }
2027
2074
  msg += `
2028
2075
  💥 伤害:${damage}`;
2029
2076
  msg += `
2030
- 🔧 改装槽:${Math.floor(newLevel / 3) + 1}个`;
2077
+ 🔧 改装槽:${newModSlots}个`;
2031
2078
  return msg;
2032
2079
  }
2033
2080
  __name(handleWeaponUpgrade, "handleWeaponUpgrade");
@@ -2042,55 +2089,94 @@ async function checkFoxBlessing(ctx, handle) {
2042
2089
  }
2043
2090
  __name(checkFoxBlessing, "checkFoxBlessing");
2044
2091
  async function generateUpgradePriceList(ctx, handle) {
2045
- const [techData] = await ctx.database.get("ggcevo_tech", { handle, techId: 2 }).catch(() => [{ level: 0 }]);
2046
2092
  const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
2047
- const weaponTechConfig = Spacestationtechnology.find((t) => t.techId === 2);
2048
- const techLevel = Math.min(techData?.level || 0, 5);
2049
- const isCareerMatch = weaponTechConfig.careerNames.includes(careerData?.career);
2050
- const BASE_DISCOUNTS = [5, 10, 15, 20, 25];
2051
- const CAREER_DISCOUNTS = [10, 20, 30, 40, 50];
2052
- const baseDiscount = techLevel > 0 ? BASE_DISCOUNTS[techLevel - 1] : 0;
2053
- const careerDiscount = isCareerMatch ? CAREER_DISCOUNTS[techLevel - 1] : 0;
2054
- const techDiscountRate = Math.max(baseDiscount, careerDiscount);
2055
- 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
+ }
2056
2110
  const foxBlessing = await checkFoxBlessing(ctx, handle);
2057
2111
  const foxDiscount = foxBlessing ? 20 : 0;
2058
2112
  const hasFoxDiscount = foxDiscount > 0;
2059
- const BASE_COST = [1050, 1450, 1850, 2250, 2650, 3050];
2060
- const priceDetails = BASE_COST.map((baseCost, index) => {
2061
- 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];
2062
2121
  let finalPrice = baseCost;
2063
- if (hasTechDiscount || hasFoxDiscount) {
2064
- let totalDiscount = 0;
2065
- if (hasTechDiscount) totalDiscount += techDiscountRate;
2066
- 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) {
2067
2137
  totalDiscount = Math.min(totalDiscount, 100);
2068
- finalPrice = Math.floor(baseCost * (1 - totalDiscount / 100));
2138
+ finalPrice = Math.floor(baseCost * (100 - totalDiscount) / 100);
2069
2139
  }
2070
2140
  const showOriginal = finalPrice < baseCost;
2071
- return [
2072
- `等级 ${level.padEnd(5)}`,
2073
- `▸ 价格: ${finalPrice.toString().padStart(4)}${showOriginal ? ` (原价${baseCost})` : ""}`
2074
- ].join("\n");
2075
- });
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
+ }
2076
2150
  const discountNotice = [];
2077
- if (hasTechDiscount || hasFoxDiscount) {
2151
+ if (hasTechDiscount || hasFoxDiscount || hasGunslingerDiscount) {
2078
2152
  discountNotice.push("💰 当前折扣:");
2079
2153
  }
2080
- if (hasTechDiscount) {
2154
+ if (isGunslinger) {
2155
+ discountNotice.push(`🔫 枪手:10%升级武器折扣`);
2156
+ }
2157
+ if (isAlliance && hasTechDiscount) {
2081
2158
  discountNotice.push(`⚙️ 武器系统 Lv${techLevel}:${techDiscountRate}%折扣`);
2082
2159
  }
2083
2160
  if (hasFoxDiscount) {
2084
2161
  discountNotice.push(`🦊 灵狐升运:20%折扣`);
2085
2162
  }
2086
- if (!hasTechDiscount && !hasFoxDiscount) {
2087
- 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级");
2088
2174
  }
2089
2175
  return [
2090
2176
  "⚡ 武器升级价格表 ⚡",
2177
+ `武器等级上限: ${maxLevel}级(${isGunslinger ? "枪手职业特权" : "普通玩家"})`,
2091
2178
  "使用「升级 武器名称」对武器进行等级升级",
2092
2179
  ...discountNotice,
2093
- // 现在折扣信息前有标题
2094
2180
  "====================",
2095
2181
  ...priceDetails,
2096
2182
  "===================="
@@ -3012,10 +3098,10 @@ var PassiveHandler = {
3012
3098
  }
3013
3099
  return null;
3014
3100
  }, "handleCriticalHit"),
3015
- // 穿蚀模块效果处理
3101
+ // 破甲模块效果处理
3016
3102
  handleCorrosionModule: /* @__PURE__ */ __name((installedMods) => {
3017
3103
  if (!installedMods) return 0;
3018
- return installedMods.includes("穿蚀模块") ? 0.1 : 0;
3104
+ return installedMods.includes("破甲模块") ? 0.2 : 0;
3019
3105
  }, "handleCorrosionModule"),
3020
3106
  // 粒子相位枪效果处理
3021
3107
  handleParticlePhaseEffect: /* @__PURE__ */ __name((targetBoss, weaponName) => {
@@ -3064,7 +3150,7 @@ var PassiveHandler = {
3064
3150
  messages.push(`⚡ 【粒子相位枪】特效:无视护盾目标${particleEffect * 100}%减伤效果`);
3065
3151
  }
3066
3152
  if (corrosionEffect > 0) {
3067
- messages.push(`⚡ 【穿蚀模块】生效:无视目标${corrosionEffect * 100}%减伤效果`);
3153
+ messages.push(`⚡ 【破甲模块】生效:无视目标${corrosionEffect * 100}%减伤效果`);
3068
3154
  }
3069
3155
  messages.push(
3070
3156
  `⚡ 减伤系数由${(originalMultiplier * 100).toFixed(0)}% → ${(effectiveMultiplier * 100).toFixed(0)}%`
@@ -3789,10 +3875,10 @@ async function calculateRewards(ctx, handle, username, totalDamage) {
3789
3875
  let careerMessage = "";
3790
3876
  if (career === "警卫员下士") {
3791
3877
  careerMultiplier = 50;
3792
- careerMessage = "(+50% 警卫员下士职业加成)";
3878
+ careerMessage = "🛡️ 警卫员下士:+50%金币";
3793
3879
  } else if (career === "警卫长") {
3794
3880
  careerMultiplier = 100;
3795
- careerMessage = "(+100% 警卫长职业加成)";
3881
+ careerMessage = "🛡️ 警卫长:+100%金币";
3796
3882
  }
3797
3883
  const totalBonusPercent = careerMultiplier + techBonusPercent;
3798
3884
  const totalBonusFactor = 1 + totalBonusPercent / 100;
@@ -3803,7 +3889,7 @@ async function calculateRewards(ctx, handle, username, totalDamage) {
3803
3889
  handle,
3804
3890
  redcrystal: (careerData?.redcrystal || 0) + 1
3805
3891
  }], ["handle"]);
3806
- redcrystalMessage = "🔴 清洁工职业加成:获得1枚红晶";
3892
+ redcrystalMessage = "🔴 清洁工:+1枚红晶";
3807
3893
  }
3808
3894
  return {
3809
3895
  finalReward,
@@ -4168,8 +4254,7 @@ function apply(ctx, config) {
4168
4254
  ctx.model.extend("ggcevo_purchasepermissions", {
4169
4255
  handle: "string",
4170
4256
  legendarypermissions: "unsigned",
4171
- explosiondoorauthority: "unsigned",
4172
- syndicatelegendspermissions: "unsigned"
4257
+ explosiondoorauthority: "unsigned"
4173
4258
  }, {
4174
4259
  primary: "handle"
4175
4260
  });
@@ -5732,7 +5817,7 @@ ${items.join("、")}
5732
5817
  result.push(`🔴 辛迪加海盗:+1枚红晶`);
5733
5818
  }
5734
5819
  if (isWin && initiatorCareer?.career === "辛迪加财务经理") {
5735
- result.push(`💰 辛迪加财务经理:+1枚红晶`);
5820
+ result.push(`🎖️ 辛迪加财务经理:+1枚红晶`);
5736
5821
  }
5737
5822
  result.push(`📅 剩余挑战次数:${config.dailyPKLimit - (initiatorPK.todayCount + 1)}`);
5738
5823
  return result.join("\n");
@@ -5774,33 +5859,17 @@ ${items.join("、")}
5774
5859
  pageNum < totalPages ? `输入 pk榜 ${pageNum + 1} 查看下一页` : "已是最后一页"
5775
5860
  ].join("\n");
5776
5861
  });
5777
- ctx.command("ggcevo/武器库 [category]").usage("输入“武器库”查看类型,或“武器库 类型”查看详细武器信息").action(async ({ session }, category) => {
5862
+ ctx.command("ggcevo/武器库 [category]").usage('输入"武器库"查看类型,或"武器库 类型"查看详细武器信息').action(async ({ session }, category) => {
5778
5863
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
5779
5864
  if (!profile) return "⚠️ 需要先绑定游戏句柄";
5780
5865
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
5781
- const [techData] = await ctx.database.get("ggcevo_tech", { handle, techId: 2 }).catch(() => [{ level: 0 }]);
5782
5866
  const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
5783
- const group = careerData?.group || "";
5784
5867
  const discountDetails = [];
5785
- let techDiscount = 0;
5786
- if (group === "人类联盟") {
5787
- const techLevel = techData?.level || 0;
5788
- if (techLevel > 0) {
5789
- const isCareerMatch = Spacestationtechnology.find((t) => t.techId === 2).careerNames.includes(careerData?.career);
5790
- const BASE_DISCOUNTS = [0, 0, 0, 0, 0];
5791
- const CAREER_DISCOUNTS = [0, 0, 10, 15, 20];
5792
- const baseDiscount = techLevel > 0 ? BASE_DISCOUNTS[techLevel - 1] : 0;
5793
- const careerDiscount = isCareerMatch ? CAREER_DISCOUNTS[techLevel - 1] : 0;
5794
- techDiscount = Math.max(baseDiscount, careerDiscount);
5795
- if (techDiscount > 0) {
5796
- discountDetails.push(`⚙️ 武器系统 Lv${techLevel}:${techDiscount}%折扣`);
5797
- }
5798
- }
5799
- }
5800
- let weaponSpecialistDiscount = 0;
5868
+ let totalDiscount = 0;
5801
5869
  if (careerData?.career === "武器中士") {
5802
- weaponSpecialistDiscount = 20;
5803
- discountDetails.push(`🎖️ 武器中士:20%折扣`);
5870
+ const weaponSpecialistDiscount = 20;
5871
+ totalDiscount += weaponSpecialistDiscount;
5872
+ discountDetails.push(`🎖️ 武器中士:${weaponSpecialistDiscount}%折扣`);
5804
5873
  }
5805
5874
  const activeWish = await ctx.database.get("ggcevo_Wish_Record", {
5806
5875
  handle,
@@ -5809,11 +5878,11 @@ ${items.join("、")}
5809
5878
  endTime: { $gte: /* @__PURE__ */ new Date() },
5810
5879
  isused: false
5811
5880
  }).then((records) => records[0]);
5812
- let grasshopperDiscount = activeWish ? 20 : 0;
5813
- if (grasshopperDiscount > 0) {
5881
+ if (activeWish) {
5882
+ const grasshopperDiscount = 20;
5883
+ totalDiscount += grasshopperDiscount;
5814
5884
  discountDetails.push(`🦗 蚱蜢优购:${grasshopperDiscount}%折扣`);
5815
5885
  }
5816
- let totalDiscount = techDiscount + weaponSpecialistDiscount + grasshopperDiscount;
5817
5886
  totalDiscount = Math.min(totalDiscount, 100);
5818
5887
  const categoryStats = Object.values(weaponConfig).filter((weapon) => weapon.price !== 0).reduce((stats, weapon) => {
5819
5888
  stats[weapon.category] = (stats[weapon.category] || 0) + 1;
@@ -5834,8 +5903,12 @@ ${discountDetails.length ? `${discountDetails.join("\n")}` : ""}`,
5834
5903
  return `无效武器分类,可用分类:
5835
5904
  ${Object.keys(categoryStats).join("、")}`;
5836
5905
  }
5906
+ const isLegendaryCategory = category === "传奇武器";
5837
5907
  const items = Object.entries(weaponConfig).filter(([_, config2]) => config2.category === category && config2.price !== 0).map(([name2, config2]) => {
5838
- const actualPrice = Math.floor(config2.price * (100 - totalDiscount) / 100);
5908
+ const shouldApplyDiscount = !isLegendaryCategory && config2.category !== "传奇武器";
5909
+ const displayPrice = shouldApplyDiscount ? Math.floor(config2.price * (100 - totalDiscount) / 100) : config2.price;
5910
+ const showOriginalPrice = shouldApplyDiscount && totalDiscount > 0;
5911
+ const priceDisplay = showOriginalPrice ? `${displayPrice}金币 (原价${config2.price})` : `${displayPrice}金币`;
5839
5912
  let tagEffectsDesc = "▸ 无特殊加成效果";
5840
5913
  if (config2.tagEffects && Object.keys(config2.tagEffects).length > 0) {
5841
5914
  tagEffectsDesc = Object.entries(config2.tagEffects).map(([tag, multiplier]) => `▸ 对${tag}目标造成${(multiplier * 100).toFixed(0)}%伤害`).join("\n");
@@ -5843,22 +5916,24 @@ ${Object.keys(categoryStats).join("、")}`;
5843
5916
  const specialEffect = config2.specialeffect ? `特殊效果:${config2.specialeffect}` : "";
5844
5917
  return [
5845
5918
  `【${name2}】`,
5846
- `攻击类型:${config2.type}`,
5919
+ `武器类型:${config2.type}`,
5847
5920
  `基础伤害:${config2.damage}`,
5848
- `价格:${actualPrice}金币${totalDiscount > 0 ? ` (原价${config2.price})` : ""}`,
5921
+ `价格:${priceDisplay}`,
5849
5922
  specialEffect,
5850
5923
  "特性:",
5851
5924
  tagEffectsDesc,
5852
- // 确保tagEffects为空时也显示"无特殊加成效果"
5853
5925
  `描述:${config2.description}`,
5854
5926
  "------------------"
5855
5927
  ].filter(Boolean).join("\n");
5856
5928
  });
5929
+ const shouldShowDiscountInfo = totalDiscount > 0 && !isLegendaryCategory;
5930
+ const discountInfo = shouldShowDiscountInfo ? `💰 当前折扣:
5931
+ ${discountDetails.length ? `${discountDetails.join("\n")}` : ""}` : null;
5857
5932
  return [
5858
5933
  `🏪 咕咕武器库 - ${category} 🏪`,
5859
5934
  '使用"购买 武器名称"指令进行购买',
5860
- totalDiscount > 0 && `💰 当前折扣:
5861
- ${discountDetails.length ? `${discountDetails.join("\n")}` : ""}`,
5935
+ discountInfo,
5936
+ // 传奇武器分类时不显示此信息
5862
5937
  "====================",
5863
5938
  ...items,
5864
5939
  items.length === 0 ? "⚠️ 该分类下暂无可用武器" : ""
@@ -5930,46 +6005,48 @@ ${validTypes.join("、")}`;
5930
6005
  if (!permissions || permissions.legendarypermissions <= 0) {
5931
6006
  return '❌ 购买传奇武器需要"传奇武器购买权限",您当前没有购买权限。';
5932
6007
  }
6008
+ const [careerData2] = await ctx.database.get("ggcevo_careers", { handle });
6009
+ const [weaponTech] = await ctx.database.get("ggcevo_tech", { handle, techId: 2 });
6010
+ if (!careerData2 || careerData2.group !== "人类联盟") {
6011
+ return '❌ 购买传奇武器需要在"人类联盟"阵营。';
6012
+ }
6013
+ const weaponSystemLevel = weaponTech?.level || 0;
6014
+ if (weaponSystemLevel < 5) {
6015
+ return `❌ 购买传奇武器需要将武器系统升级到5级(当前等级:${weaponSystemLevel})。`;
6016
+ }
6017
+ if (!careerData2.career || !["情报副官", "武器中士"].includes(careerData2.career)) {
6018
+ return `❌ 购买传奇武器需要成为"情报副官"或"武器中士"(当前职业:${careerData2.career || "无"})。`;
6019
+ }
5933
6020
  }
5934
6021
  const [signInfo] = await ctx.database.get("ggcevo_sign", { handle });
5935
6022
  const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
5936
- const [weaponTech] = await ctx.database.get("ggcevo_tech", { handle, techId: 2 });
5937
6023
  let totalDiscount = 0;
5938
6024
  let discountDetails = [];
5939
- if (isWeapon && careerData?.group === "人类联盟") {
5940
- const techDiscountTable = {
5941
- 3: [0, 10],
5942
- 4: [0, 15],
5943
- 5: [0, 20]
5944
- };
5945
- const techLevel = weaponTech?.level || 0;
5946
- if (techLevel >= 3) {
5947
- const [baseDisc, careerDisc] = techDiscountTable[Math.min(techLevel, 5)] || [0, 0];
5948
- const isQualifiedCareer = careerData?.career && Spacestationtechnology.find((t) => t.techId === 2)?.careerNames.includes(careerData.career);
5949
- const techDiscount = isQualifiedCareer ? Math.max(baseDisc, careerDisc) : baseDisc;
5950
- if (techDiscount > 0) {
5951
- totalDiscount += techDiscount;
5952
- discountDetails.push(
5953
- `武器系统 Lv${techLevel}${isQualifiedCareer ? "(职业加成)" : ""}:${techDiscount}%折扣`
5954
- );
6025
+ let activeWish = null;
6026
+ if (!isLegendaryWeapon) {
6027
+ if (isWeapon) {
6028
+ activeWish = await ctx.database.get("ggcevo_Wish_Record", {
6029
+ handle,
6030
+ wishname: "蚱蜢优购",
6031
+ startTime: { $lte: /* @__PURE__ */ new Date() },
6032
+ endTime: { $gte: /* @__PURE__ */ new Date() },
6033
+ isused: false
6034
+ }).then((records) => records[0] || null);
6035
+ if (activeWish) {
6036
+ const wishDiscount = 20;
6037
+ totalDiscount += wishDiscount;
6038
+ discountDetails.push(`🦗 蚱蜢优购:${wishDiscount}%折扣`);
5955
6039
  }
5956
6040
  }
5957
- }
5958
- const activeWish = isWeapon ? await ctx.database.get("ggcevo_Wish_Record", {
5959
- handle,
5960
- wishname: "蚱蜢优购",
5961
- startTime: { $lte: /* @__PURE__ */ new Date() },
5962
- endTime: { $gte: /* @__PURE__ */ new Date() },
5963
- isused: false
5964
- }).then((records) => records[0]) : null;
5965
- if (activeWish) {
5966
- const wishDiscount = 20;
5967
- totalDiscount += wishDiscount;
5968
- discountDetails.push(`蚱蜢优购祈愿生效:${wishDiscount}%折扣`);
6041
+ if (isWeapon && careerData?.career === "武器中士") {
6042
+ const specialistDiscount = 20;
6043
+ totalDiscount += specialistDiscount;
6044
+ discountDetails.push(`🎖️ 武器中士:${specialistDiscount}%折扣`);
6045
+ }
5969
6046
  totalDiscount = Math.min(totalDiscount, 100);
5970
6047
  }
5971
6048
  let actualPrice = config2.price;
5972
- if (totalDiscount > 0) {
6049
+ if (!isLegendaryWeapon && totalDiscount > 0) {
5973
6050
  actualPrice = Math.floor(config2.price * (100 - totalDiscount) / 100);
5974
6051
  actualPrice = Math.max(actualPrice, 1);
5975
6052
  }
@@ -5977,6 +6054,8 @@ ${validTypes.join("、")}`;
5977
6054
  let priceInfo = `需要 ${actualPrice} 金币`;
5978
6055
  if (discountDetails.length > 0) {
5979
6056
  priceInfo += `(原价${config2.price})`;
6057
+ } else if (isLegendaryWeapon) {
6058
+ priceInfo = `需要 ${actualPrice} 金币 (传奇武器无折扣)`;
5980
6059
  }
5981
6060
  return `❌ 金币不足,${priceInfo}`;
5982
6061
  }
@@ -6036,11 +6115,12 @@ ${validTypes.join("、")}`;
6036
6115
  const [permissions] = await ctx.database.get("ggcevo_purchasepermissions", { handle });
6037
6116
  message += `
6038
6117
  扣除 1 次传奇武器购买权限,剩余次数:${permissions?.legendarypermissions || 0}`;
6039
- }
6040
- if (discountDetails.length > 0) {
6118
+ } else if (discountDetails.length > 0) {
6041
6119
  message += `(原价${config2.price} 金币)
6042
6120
  折扣明细:
6043
6121
  ▸ ${discountDetails.join("\n▸ ")}`;
6122
+ } else {
6123
+ message += ` (原价${config2.price} 金币)`;
6044
6124
  }
6045
6125
  if (isWeapon) {
6046
6126
  if (isAutoEquipped) {
@@ -6999,6 +7079,7 @@ ${validTypes.join("、")}`;
6999
7079
  return "🚫 该功能需要【辛迪加海盗】阵营权限";
7000
7080
  }
7001
7081
  const isComputerExpert = careerData.career === "计算机专家";
7082
+ const isSaboteur = careerData.career === "破坏者";
7002
7083
  const categoryStats = {};
7003
7084
  Object.values(weaponConfig).filter((config2) => config2.redCrystalCost > 0).forEach((weapon) => {
7004
7085
  categoryStats[weapon.category] = (categoryStats[weapon.category] || 0) + 1;
@@ -7007,12 +7088,19 @@ ${validTypes.join("、")}`;
7007
7088
  categoryStats[item.type] = (categoryStats[item.type] || 0) + 1;
7008
7089
  });
7009
7090
  if (!category) {
7091
+ const discountLines = [];
7092
+ if (isComputerExpert) {
7093
+ discountLines.push("💻 计算机专家:设备工具类物品50%折扣");
7094
+ }
7095
+ if (isSaboteur) {
7096
+ discountLines.push("💣 破坏者:爆破物类物品50%折扣");
7097
+ }
7010
7098
  return [
7011
7099
  "🏴 辛迪加黑市 🏴",
7012
7100
  '使用 "黑市 分类名称" 查看详细信息',
7013
- isComputerExpert ? [
7101
+ discountLines.length ? [
7014
7102
  "💰 当前折扣:",
7015
- "💻 计算机专家:设备工具类物品50%折扣"
7103
+ ...discountLines
7016
7104
  ].join("\n") : "",
7017
7105
  "====================",
7018
7106
  ...Object.entries(categoryStats).map(([catName, count]) => `▸ ${catName} (${count}种)`),
@@ -7023,13 +7111,12 @@ ${validTypes.join("、")}`;
7023
7111
  if (!normalizedCategory) return `无效分类,可用:${Object.keys(categoryStats).join("、")}`;
7024
7112
  const items = [
7025
7113
  ...Object.entries(weaponConfig).filter(
7026
- ([_, config2]) => config2.category === normalizedCategory && // 使用 category 代替 type
7027
- config2.redCrystalCost > 0
7114
+ ([_, config2]) => config2.category === normalizedCategory && config2.redCrystalCost > 0
7028
7115
  ).map(([name2, config2]) => {
7029
7116
  const infoBlocks = [
7030
7117
  `【${name2}】`,
7031
- `攻击类型:${config2.type}`,
7032
- // 保留攻击类型显示
7118
+ `武器类型:${config2.type}`,
7119
+ `基础伤害:${config2.damage}`,
7033
7120
  `订购价:${config2.redCrystalCost}红晶`
7034
7121
  ];
7035
7122
  if (config2.specialeffect) {
@@ -7047,17 +7134,28 @@ ${validTypes.join("、")}`;
7047
7134
  return infoBlocks.join("\n");
7048
7135
  }),
7049
7136
  ...Object.entries(SyndicatedItems).filter(
7050
- ([_, item]) => item.type === normalizedCategory && // 爆破物仍然使用 type
7051
- item.redCrystalCost > 0
7137
+ ([_, item]) => item.type === normalizedCategory && item.redCrystalCost > 0
7052
7138
  ).map(([name2, item]) => {
7053
- 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
+ }
7054
7151
  const infoBlocks = [
7055
7152
  `【${name2}】`,
7056
7153
  `物品类型:${item.type}`
7057
7154
  ];
7058
- if (isComputerExpert && normalizedCategory === "设备工具") {
7155
+ if (discountApplied) {
7059
7156
  infoBlocks.push(
7060
- `订购价:${finalPrice}红晶 (原价${item.redCrystalCost})`
7157
+ `订购价:${finalPrice}红晶 (原价${item.redCrystalCost})`,
7158
+ `折扣:${discountType}专属50%折扣`
7061
7159
  );
7062
7160
  } else {
7063
7161
  infoBlocks.push(
@@ -7073,14 +7171,19 @@ ${validTypes.join("、")}`;
7073
7171
  })
7074
7172
  ];
7075
7173
  let discountInfo = [];
7076
- if (isComputerExpert && normalizedCategory === "设备工具") {
7174
+ if (isSaboteur && normalizedCategory === "爆破物") {
7175
+ discountInfo = [
7176
+ "💰 当前折扣:",
7177
+ "💣 破坏者:爆破物类物品50%折扣"
7178
+ ];
7179
+ } else if (isComputerExpert && normalizedCategory === "设备工具") {
7077
7180
  discountInfo = [
7078
7181
  "💰 当前折扣:",
7079
7182
  "💻 计算机专家:设备工具类物品50%折扣"
7080
7183
  ];
7081
7184
  }
7082
7185
  return [
7083
- `🏴☠️ 辛迪加黑市 - ${normalizedCategory} 🏴☠️`,
7186
+ `🏴 辛迪加黑市 - ${normalizedCategory} 🏴`,
7084
7187
  '使用"订购 物品名称"进行购买(仅消耗红晶)',
7085
7188
  ...discountInfo,
7086
7189
  "====================",
@@ -7106,22 +7209,35 @@ ${validTypes.join("、")}`;
7106
7209
  if (!itemConfig2.redCrystalCost) return "⛔ 该物品不可订购";
7107
7210
  const isLegendaryWeapon = isWeapon && itemConfig2.category === "传奇武器";
7108
7211
  if (isLegendaryWeapon) {
7109
- const [permissions] = await ctx.database.get("ggcevo_purchasepermissions", { handle });
7110
- if (!permissions || permissions.syndicatelegendspermissions <= 0) {
7111
- return '❌ 购买传奇武器需要"辛迪加传奇武器购买权限",您当前没有购买权限。';
7212
+ if (item === "MK-4激光步枪" && careerData.career !== "能量武器专家") {
7213
+ return "❌ 购买MK-4激光步枪需要【能量武器专家】职业。";
7214
+ } else if (item === "DSR-55反器材步枪" && careerData.career !== "猩红杀手") {
7215
+ return "❌ 购买DSR-55反器材步枪需要【猩红杀手】职业。";
7216
+ } else if (item === "龙息霰弹枪" && careerData.career !== "纵火狂") {
7217
+ return "❌ 购买龙息霰弹枪需要【纵火狂】职业。";
7218
+ } else if (item === "M4AE脉冲步枪" && careerData.career !== "枪手") {
7219
+ return "❌ 购买M4AE脉冲步枪需要【枪手】职业。";
7220
+ } else if (item !== "MK-4激光步枪" && item !== "DSR-55反器材步枪" && item !== "龙息霰弹枪" && item !== "M4AE脉冲步枪") {
7221
+ return "❌ 未知的传奇武器或未开放购买权限";
7112
7222
  }
7113
7223
  }
7114
7224
  let isComputerExpertDiscount = false;
7225
+ let isSaboteurDiscount = false;
7115
7226
  let originalPrice = itemConfig2.redCrystalCost;
7116
7227
  let finalCost = originalPrice;
7117
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
+ }
7118
7234
  if (!isWeapon && itemConfig2.type === "设备工具" && careerData.career === "计算机专家") {
7119
7235
  finalCost = Math.floor(originalPrice * 0.5);
7120
7236
  isComputerExpertDiscount = true;
7121
7237
  discountApplied = true;
7122
7238
  }
7123
7239
  if ((careerData.redcrystal || 0) < finalCost) {
7124
- const discountMessage = isComputerExpertDiscount ? `(原价${originalPrice})` : "";
7240
+ const discountMessage = discountApplied ? `(原价${originalPrice})` : "";
7125
7241
  return `❌ 红晶不足!需要:${finalCost}${discountMessage} 当前拥有红晶:${careerData.redcrystal}`;
7126
7242
  }
7127
7243
  if (isWeapon) {
@@ -7136,16 +7252,6 @@ ${validTypes.join("、")}`;
7136
7252
  await ctx.database.set("ggcevo_careers", { handle }, {
7137
7253
  redcrystal: careerData.redcrystal - finalCost
7138
7254
  });
7139
- if (isLegendaryWeapon) {
7140
- const [permissionRecord] = await ctx.database.get("ggcevo_purchasepermissions", { handle });
7141
- if (!permissionRecord || permissionRecord.syndicatelegendspermissions <= 0) {
7142
- throw new Error("辛迪加传奇武器购买权限不足");
7143
- }
7144
- const remaining = permissionRecord.syndicatelegendspermissions - 1;
7145
- await ctx.database.set("ggcevo_purchasepermissions", { handle }, {
7146
- syndicatelegendspermissions: remaining
7147
- });
7148
- }
7149
7255
  if (isWeapon) {
7150
7256
  await ctx.database.create("ggcevo_equipment", {
7151
7257
  handle,
@@ -7177,13 +7283,11 @@ ${validTypes.join("、")}`;
7177
7283
  }
7178
7284
  });
7179
7285
  const buildResponse = /* @__PURE__ */ __name(async () => {
7180
- let permissionMessage = [];
7181
- if (isLegendaryWeapon) {
7182
- const [permissions] = await ctx.database.get("ggcevo_purchasepermissions", { handle });
7183
- permissionMessage.push(`扣除 1 次辛迪加传奇武器购买权限,剩余次数:${permissions?.syndicatelegendspermissions || 0}`);
7184
- }
7185
7286
  const discountLines = [];
7186
- if (discountApplied) {
7287
+ if (isSaboteurDiscount) {
7288
+ discountLines.push("💣 破坏者:爆破物类物品50%折扣");
7289
+ }
7290
+ if (isComputerExpertDiscount) {
7187
7291
  discountLines.push("💻 计算机专家:设备工具类物品50%折扣");
7188
7292
  }
7189
7293
  const priceInfo = [
@@ -7193,9 +7297,8 @@ ${validTypes.join("、")}`;
7193
7297
  const equippedStatus = isAutoEquipped ? "已自动装备武器" : "需手动装备武器";
7194
7298
  return [
7195
7299
  `✅ 成功订购【${item}】!`,
7196
- ...permissionMessage,
7197
7300
  ...priceInfo,
7198
- discountApplied ? `折扣明细:
7301
+ discountLines.length ? `折扣明细:
7199
7302
  ▸ ${discountLines.join("\n▸ ")}` : "",
7200
7303
  `装备状态:${equippedStatus}`,
7201
7304
  '输入 "武器仓库" 管理武器'
@@ -7207,9 +7310,8 @@ ${validTypes.join("、")}`;
7207
7310
  }).then((r) => r[0]?.quantity || 1);
7208
7311
  return [
7209
7312
  `✅ 成功订购【${item}】x1!`,
7210
- ...permissionMessage,
7211
7313
  ...priceInfo,
7212
- discountApplied ? `折扣明细:
7314
+ discountLines.length ? `折扣明细:
7213
7315
  ▸ ${discountLines.join("\n▸ ")}` : "",
7214
7316
  `当前库存:${currentStock}件`,
7215
7317
  '输入 "仓库" 查看所有物品'
@@ -7322,7 +7424,7 @@ ${validTypes.join("、")}`;
7322
7424
  '使用 "科技 科技名称" 查看详细信息',
7323
7425
  isIntelligenceOfficer ? [
7324
7426
  "💰 当前折扣:",
7325
- "🎖️ 情报副官:20%"
7427
+ "🎖️ 情报副官:15%"
7326
7428
  ].join("\n") : "",
7327
7429
  "====================",
7328
7430
  ...techList,
@@ -7336,7 +7438,7 @@ ${validTypes.join("、")}`;
7336
7438
  ${Spacestationtechnology.map((t) => t.techname).join("、")}`;
7337
7439
  const techDetails = tech.levels.map((level) => {
7338
7440
  const originalCost = level.cost;
7339
- const discountedCost = isIntelligenceOfficer ? Math.floor(originalCost * 0.8) : originalCost;
7441
+ const discountedCost = isIntelligenceOfficer ? Math.floor(originalCost * 0.85) : originalCost;
7340
7442
  const costDesc = isIntelligenceOfficer ? `▸ 升级花费:${discountedCost}金币 (原价${originalCost})` : `▸ 升级花费:${originalCost}金币`;
7341
7443
  return [
7342
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
  };
@@ -337,7 +338,7 @@ export declare const modConfig: {
337
338
  exclusiveTo: string;
338
339
  isExclusive: boolean;
339
340
  };
340
- 穿蚀模块: {
341
+ 破甲模块: {
341
342
  cost: number;
342
343
  effect: string;
343
344
  exclusiveTo: string;
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.2",
4
+ "version": "1.4.4",
5
5
  "main": "lib/index.js",
6
6
  "typings": "lib/index.d.ts",
7
7
  "files": [