koishi-plugin-ggcevo-game 1.3.3 → 1.3.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.
Files changed (2) hide show
  1. package/lib/index.js +189 -65
  2. package/package.json +1 -1
package/lib/index.js CHANGED
@@ -300,6 +300,7 @@ function apply(ctx, config) {
300
300
  description: "标准配置武器,中距离作战利器",
301
301
  price: 100,
302
302
  redCrystalCost: 2,
303
+ isantiair: true,
303
304
  tagEffects: {
304
305
  "轻甲": 1.5
305
306
  // 对轻甲目标造成150%伤害
@@ -312,6 +313,7 @@ function apply(ctx, config) {
312
313
  description: "先进激光武器,远距离精准打击",
313
314
  price: 300,
314
315
  redCrystalCost: 5,
316
+ isantiair: true,
315
317
  tagEffects: {
316
318
  "重甲": 1.5,
317
319
  // 对重甲目标造成150%伤害
@@ -325,6 +327,7 @@ function apply(ctx, config) {
325
327
  description: "基于热能的强大武器,烧烬一切",
326
328
  price: 450,
327
329
  redCrystalCost: 5,
330
+ isantiair: false,
328
331
  tagEffects: {
329
332
  "惧热": 2,
330
333
  "生物": 1.5,
@@ -338,6 +341,7 @@ function apply(ctx, config) {
338
341
  description: "由激光步枪改良而来,高效的对重甲武器",
339
342
  price: 850,
340
343
  redCrystalCost: 15,
344
+ isantiair: true,
341
345
  tagEffects: {
342
346
  "重甲": 2,
343
347
  "机械": 0.5,
@@ -351,6 +355,7 @@ function apply(ctx, config) {
351
355
  description: "一种改造后的采矿切割机,有效对抗重甲目标",
352
356
  price: 150,
353
357
  redCrystalCost: 2,
358
+ isantiair: true,
354
359
  tagEffects: {
355
360
  "重甲": 1.5,
356
361
  "建筑": 1.5,
@@ -364,6 +369,7 @@ function apply(ctx, config) {
364
369
  description: "近距离攻击武器,专为遭遇战设计使用",
365
370
  price: 325,
366
371
  redCrystalCost: 5,
372
+ isantiair: false,
367
373
  tagEffects: {
368
374
  "轻甲": 1.5,
369
375
  "重甲": 0.8
@@ -376,6 +382,7 @@ function apply(ctx, config) {
376
382
  description: "用于隐秘射击的最佳武器,但是无法穿透护甲",
377
383
  price: 550,
378
384
  redCrystalCost: 10,
385
+ isantiair: true,
379
386
  tagEffects: {
380
387
  "轻甲": 0.5,
381
388
  "重甲": 0.2
@@ -388,6 +395,7 @@ function apply(ctx, config) {
388
395
  description: "喷射稳定的液氮恒流,对长时间接触者造成致命的损伤",
389
396
  price: 775,
390
397
  redCrystalCost: 10,
398
+ isantiair: false,
391
399
  tagEffects: {
392
400
  "惧寒": 2,
393
401
  "灵能": 1.5
@@ -400,6 +408,7 @@ function apply(ctx, config) {
400
408
  description: "一种经过改造的电动工具,可对近距离的目标放出高压电",
401
409
  price: 750,
402
410
  redCrystalCost: 10,
411
+ isantiair: true,
403
412
  tagEffects: {
404
413
  "机械": 2,
405
414
  "建筑": 1.5
@@ -412,6 +421,7 @@ function apply(ctx, config) {
412
421
  description: "一种高度危险性的武器,设计用辐射照射并伤害敌人",
413
422
  price: 825,
414
423
  redCrystalCost: 15,
424
+ isantiair: true,
415
425
  tagEffects: {
416
426
  "生物": 1.2
417
427
  }
@@ -433,6 +443,14 @@ function apply(ctx, config) {
433
443
  price: 75,
434
444
  redCrystalCost: 0,
435
445
  effects: "对非建筑目标使用后,重置其技能计数"
446
+ },
447
+ "CRED-17": {
448
+ id: 3,
449
+ type: "设备工具",
450
+ description: "一个小型辛迪加机器人,可以破坏电子银行账户",
451
+ price: 0,
452
+ redCrystalCost: 60,
453
+ effects: "此物品存放于仓库,仅在您是辛迪加海盗阵营时生效。每日签到金币奖励+50%,每拥有100金币,增加1%(至多增加100%)。"
436
454
  }
437
455
  };
438
456
  const modConfig = {
@@ -763,7 +781,7 @@ function apply(ctx, config) {
763
781
  effect: "升级空间站科技花费的金币是原价的80%",
764
782
  requirements: "将一个空间站科技升至3级或以上",
765
783
  Jobtransfer: true,
766
- costcoins: 5e3
784
+ costcoins: 4e3
767
785
  },
768
786
  {
769
787
  professionName: "总工程师",
@@ -922,13 +940,13 @@ function apply(ctx, config) {
922
940
  level: 4,
923
941
  cost: 4250,
924
942
  description: "提高挖矿效率,每日签到金币奖励+20%",
925
- careerBonus: "深空矿工/情报副官: 每日签到金币奖励+40%; 解锁太空“挖矿”权限; 建造矿罗协同挖矿,效率提高20%"
943
+ careerBonus: "深空矿工/情报副官: 每日签到金币奖励+40%; 解锁太空“挖矿”权限; 建造矿骡协同挖矿,效率提高20%"
926
944
  },
927
945
  {
928
946
  level: 5,
929
947
  cost: 5375,
930
948
  description: "提高挖矿效率,每日签到金币奖励+25%",
931
- careerBonus: "深空矿工/情报副官: 每日签到金币奖励+50%; 解锁太空“挖矿”权限; 建造矿罗协同挖矿,效率提高40%"
949
+ careerBonus: "深空矿工/情报副官: 每日签到金币奖励+50%; 解锁太空“挖矿”权限; 建造矿骡协同挖矿,效率提高40%"
932
950
  }
933
951
  ]
934
952
  },
@@ -987,7 +1005,7 @@ function apply(ctx, config) {
987
1005
  level: 2,
988
1006
  cost: 1e3,
989
1007
  description: "重启高级武器改装站,武器改装通用模块享有10%的折扣",
990
- careerBonus: "武器中士/情报副官: 武器改装通用模块享有20%的折扣,武器改装专属模块享有10%的折扣"
1008
+ careerBonus: "武器中士/情报副官: 武器改装通用模块享有20%的折扣; 武器改装专属模块享有10%的折扣"
991
1009
  }
992
1010
  ]
993
1011
  }
@@ -2091,6 +2109,12 @@ function apply(ctx, config) {
2091
2109
  message: `成功使用 ${itemName},已重置 ${target} 的技能计数`
2092
2110
  };
2093
2111
  }
2112
+ if (itemConfig2.id === 3) {
2113
+ return {
2114
+ success: false,
2115
+ message: `此物品无需使用,存放于仓库即刻生效。`
2116
+ };
2117
+ }
2094
2118
  return {
2095
2119
  success: true,
2096
2120
  message: `${itemName} 效果已生效(开发中)`
@@ -2155,15 +2179,22 @@ function apply(ctx, config) {
2155
2179
  const baseCost = BASE_COST[equipment.level];
2156
2180
  const weaponTechConfig = Spacestationtechnology.find((t) => t.techId === 2);
2157
2181
  const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
2158
- const [weaponTech] = await ctx.database.get("ggcevo_tech", { handle, techId: 2 }).catch(() => [{ level: 0 }]);
2159
- const techLevel = Math.min(Math.max(weaponTech?.level || 0, 0), 5);
2160
- const isCareerMatch = weaponTechConfig?.careerNames.includes(careerData?.career);
2161
- const BASE_DISCOUNTS = [5, 10, 15, 20, 25];
2162
- const CAREER_DISCOUNTS = [10, 20, 30, 40, 50];
2163
- const baseDiscount = techLevel > 0 ? BASE_DISCOUNTS[techLevel - 1] : 0;
2164
- const careerDiscount = isCareerMatch && techLevel > 0 ? CAREER_DISCOUNTS[techLevel - 1] : 0;
2165
- const weaponDiscount = Math.max(baseDiscount, careerDiscount) / 100;
2166
- let discountedCost = baseCost * (1 - weaponDiscount);
2182
+ let discountedCost;
2183
+ let weaponDiscount;
2184
+ let techLevel;
2185
+ let baseDiscount;
2186
+ let careerDiscount;
2187
+ if (careerData.group === "人类联盟") {
2188
+ const [weaponTech] = await ctx.database.get("ggcevo_tech", { handle, techId: 2 }).catch(() => [{ level: 0 }]);
2189
+ techLevel = Math.min(Math.max(weaponTech?.level || 0, 0), 5);
2190
+ const isCareerMatch = weaponTechConfig?.careerNames.includes(careerData?.career);
2191
+ const BASE_DISCOUNTS = [5, 10, 15, 20, 25];
2192
+ const CAREER_DISCOUNTS = [10, 20, 30, 40, 50];
2193
+ baseDiscount = techLevel > 0 ? BASE_DISCOUNTS[techLevel - 1] : 0;
2194
+ careerDiscount = isCareerMatch && techLevel > 0 ? CAREER_DISCOUNTS[techLevel - 1] : 0;
2195
+ weaponDiscount = Math.max(baseDiscount, careerDiscount) / 100;
2196
+ discountedCost = baseCost * (1 - weaponDiscount);
2197
+ }
2167
2198
  const activeWish = await checkFoxBlessing(handle);
2168
2199
  if (activeWish) {
2169
2200
  discountedCost *= 0.8;
@@ -2228,6 +2259,66 @@ function apply(ctx, config) {
2228
2259
  }).then((records) => records[0]);
2229
2260
  }
2230
2261
  __name(checkFoxBlessing, "checkFoxBlessing");
2262
+ async function generateUpgradePriceList(handle) {
2263
+ const [techData] = await ctx.database.get("ggcevo_tech", { handle, techId: 2 }).catch(() => [{ level: 0 }]);
2264
+ const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
2265
+ const weaponTechConfig = Spacestationtechnology.find((t) => t.techId === 2);
2266
+ const techLevel = Math.min(techData?.level || 0, 5);
2267
+ const isCareerMatch = weaponTechConfig.careerNames.includes(careerData?.career);
2268
+ const BASE_DISCOUNTS = [5, 10, 15, 20, 25];
2269
+ const CAREER_DISCOUNTS = [10, 20, 30, 40, 50];
2270
+ const baseDiscount = techLevel > 0 ? BASE_DISCOUNTS[techLevel - 1] : 0;
2271
+ const careerDiscount = isCareerMatch ? CAREER_DISCOUNTS[techLevel - 1] : 0;
2272
+ const techDiscountRate = Math.max(baseDiscount, careerDiscount);
2273
+ const hasTechDiscount = techDiscountRate > 0;
2274
+ const foxBlessing = await checkFoxBlessing(handle);
2275
+ const foxDiscount = foxBlessing ? 20 : 0;
2276
+ const hasFoxDiscount = foxDiscount > 0;
2277
+ const BASE_COST = [1050, 1450, 1850, 2250, 2650, 3050];
2278
+ const priceDetails = BASE_COST.map((baseCost, index) => {
2279
+ const level = `${index}→${index + 1}`;
2280
+ let finalPrice = baseCost;
2281
+ let discountTips = [];
2282
+ if (hasTechDiscount || hasFoxDiscount) {
2283
+ let discounted = baseCost;
2284
+ if (hasTechDiscount) {
2285
+ discounted *= 1 - techDiscountRate / 100;
2286
+ discountTips.push(`科技折扣 ${techDiscountRate}%`);
2287
+ }
2288
+ if (hasFoxDiscount) {
2289
+ discounted *= 0.8;
2290
+ discountTips.push(`灵狐折扣 20%`);
2291
+ }
2292
+ finalPrice = Math.floor(discounted);
2293
+ }
2294
+ const totalDiscount = hasTechDiscount || hasFoxDiscount ? Math.round(100 - finalPrice / baseCost * 100) : 0;
2295
+ return [
2296
+ `等级 ${level.padEnd(5)}`,
2297
+ ...totalDiscount > 0 ? [
2298
+ `▸ 价格: ${finalPrice.toString().padStart(4)} (原价 ${baseCost})`
2299
+ ] : []
2300
+ ].join("\n");
2301
+ });
2302
+ const discountNotice = [];
2303
+ if (hasTechDiscount) {
2304
+ discountNotice.push(`🔧 武器系统 Lv${techLevel} (${techDiscountRate}% 折扣)`);
2305
+ }
2306
+ if (hasFoxDiscount) {
2307
+ discountNotice.push("🦊 灵狐升运生效中 (20% 折扣)");
2308
+ }
2309
+ if (!hasTechDiscount && !hasFoxDiscount) {
2310
+ discountNotice.push("💡 提示:加入人类联盟并升级武器系统可获得折扣");
2311
+ }
2312
+ return [
2313
+ "⚡ 武器升级价格表 ⚡",
2314
+ ...discountNotice,
2315
+ "====================",
2316
+ ...priceDetails,
2317
+ "====================",
2318
+ "使用「升级 武器名称」进行具体升级"
2319
+ ].join("\n");
2320
+ }
2321
+ __name(generateUpgradePriceList, "generateUpgradePriceList");
2231
2322
  ctx.command("ggcevo/抽奖").action(async (argv) => {
2232
2323
  const session = argv.session;
2233
2324
  let winCount = 0;
@@ -2434,7 +2525,6 @@ ${itemDetails.join("\n")}`;
2434
2525
  });
2435
2526
  let tickets = 3;
2436
2527
  let points = getRandomInt(20, 40);
2437
- let effectMessage = "";
2438
2528
  if (monthlyDays === 7) {
2439
2529
  tickets = 4;
2440
2530
  } else if (monthlyDays === 14) {
@@ -2454,42 +2544,52 @@ ${itemDetails.join("\n")}`;
2454
2544
  points = getRandomInt(100, 200);
2455
2545
  }
2456
2546
  let redCrystal = 0;
2547
+ let effectMessage = "";
2548
+ let bonusMessage = "";
2457
2549
  let careerCrystalMessage = "";
2550
+ let cred17Message = "";
2551
+ let allianceBonusMessage = "";
2458
2552
  const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
2459
- let miningBonus = 0;
2460
- let miningMessage = "";
2461
- const BASE_BONUS = [5, 10, 15, 20, 25];
2462
- const CAREER_BONUS = [10, 20, 30, 40, 50];
2463
- const miningTechConfig = Spacestationtechnology.find((t) => t.techId === 1);
2464
- if (miningTechConfig) {
2465
- const [userMiningTech] = await ctx.database.get("ggcevo_tech", {
2466
- handle,
2467
- techId: 1
2468
- }).catch(() => [{ level: 0 }]);
2469
- const techLevel = Math.min(Math.max(userMiningTech?.level || 0, 0), 5);
2470
- const baseBonus = techLevel > 0 ? BASE_BONUS[techLevel - 1] : 0;
2471
- let careerTechBonus = 0;
2472
- if (careerData?.career && miningTechConfig.careerNames.includes(careerData.career)) {
2473
- careerTechBonus = techLevel > 0 ? CAREER_BONUS[techLevel - 1] : 0;
2474
- }
2475
- miningBonus = Math.max(baseBonus, careerTechBonus);
2476
- if (miningBonus > 0) {
2477
- miningMessage = `
2553
+ if (careerData.group === "人类联盟") {
2554
+ const baseAllianceBonus = 0.2;
2555
+ points = Math.round(points * (1 + baseAllianceBonus));
2556
+ allianceBonusMessage = `
2557
+ 🏛️ 人类联盟基础加成:金币+${baseAllianceBonus * 100}%`;
2558
+ let miningBonus = 0;
2559
+ let miningMessage = "";
2560
+ const BASE_BONUS = [5, 10, 15, 20, 25];
2561
+ const CAREER_BONUS = [10, 20, 30, 40, 50];
2562
+ const miningTechConfig = Spacestationtechnology.find((t) => t.techId === 1);
2563
+ if (miningTechConfig) {
2564
+ const [userMiningTech] = await ctx.database.get("ggcevo_tech", {
2565
+ handle,
2566
+ techId: 1
2567
+ }).catch(() => [{ level: 0 }]);
2568
+ const techLevel = Math.min(Math.max(userMiningTech?.level || 0, 0), 5);
2569
+ const baseBonus = techLevel > 0 ? BASE_BONUS[techLevel - 1] : 0;
2570
+ let careerTechBonus = 0;
2571
+ if (careerData?.career && miningTechConfig.careerNames.includes(careerData.career)) {
2572
+ careerTechBonus = techLevel > 0 ? CAREER_BONUS[techLevel - 1] : 0;
2573
+ }
2574
+ miningBonus = Math.max(baseBonus, careerTechBonus);
2575
+ if (miningBonus > 0) {
2576
+ miningMessage = `
2478
2577
  ⚙️ 采掘系统 Lv${techLevel} 金币加成:+${miningBonus}%`;
2578
+ }
2479
2579
  }
2480
- }
2481
- let minerBonus = 0;
2482
- let minerMessage = "";
2483
- if (careerData?.career === "深空矿工") {
2484
- minerBonus = 50;
2485
- minerMessage = `
2580
+ let minerBonus = 0;
2581
+ let minerMessage = "";
2582
+ if (careerData?.career === "深空矿工") {
2583
+ minerBonus = 50;
2584
+ minerMessage = `
2486
2585
  ⛏️ 深空矿工职业加成:金币+50%`;
2586
+ }
2587
+ const totalBonus = miningBonus + minerBonus;
2588
+ if (totalBonus > 0) {
2589
+ points = Math.round(points * (1 + totalBonus / 100));
2590
+ }
2591
+ bonusMessage = miningMessage + minerMessage;
2487
2592
  }
2488
- const totalBonus = miningBonus + minerBonus;
2489
- if (totalBonus > 0) {
2490
- points = Math.round(points * (1 + totalBonus / 100));
2491
- }
2492
- const bonusMessage = miningMessage + minerMessage;
2493
2593
  if (careerData?.group === "辛迪加海盗" && careerData.career === "辛迪加财务经理") {
2494
2594
  if (monthlyDays < 7) {
2495
2595
  redCrystal = 1;
@@ -2505,11 +2605,23 @@ ${itemDetails.join("\n")}`;
2505
2605
  careerCrystalMessage = `
2506
2606
  ⚓ 辛迪加财务经理职业加成:获得 ${redCrystal} 红晶`;
2507
2607
  }
2608
+ if (careerData?.group === "辛迪加海盗") {
2609
+ const [cred17Item] = await ctx.database.get("ggcevo_warehouse", { handle, itemId: 3 });
2610
+ if (cred17Item?.quantity >= 1) {
2611
+ const currentGold = record?.totalRewards || 0;
2612
+ const additionalBonus = Math.min(Math.floor(currentGold / 100), 100);
2613
+ const totalBonus = 0.5 + additionalBonus * 0.01;
2614
+ points = Math.round(points * (1 + totalBonus));
2615
+ cred17Message = `
2616
+ 💎 CRED-17生效:签到奖励+50%,当前金币${currentGold}(+${additionalBonus}%),总计加成+${(totalBonus * 100).toFixed(0)}%`;
2617
+ }
2618
+ }
2508
2619
  if (meowEffect) {
2509
2620
  tickets *= 2;
2510
2621
  points *= 2;
2511
2622
  effectMessage = "\n🐾 喵喵财源祈愿生效,获得双倍奖励(金币和咕咕币)!";
2512
2623
  }
2624
+ effectMessage += cred17Message;
2513
2625
  await ctx.database.withTransaction(async () => {
2514
2626
  await ctx.database.upsert("ggcevo_sign", [{
2515
2627
  handle,
@@ -2531,7 +2643,7 @@ ${itemDetails.join("\n")}`;
2531
2643
  });
2532
2644
  return `签到成功!本月累计签到${monthlyDays}天,获得:
2533
2645
  💰 金币 x ${points}
2534
- 🪙 咕咕币 x ${tickets}` + (effectMessage || "") + bonusMessage + (careerCrystalMessage || "");
2646
+ 🪙 咕咕币 x ${tickets}` + (effectMessage || "") + allianceBonusMessage + (bonusMessage || "") + (careerCrystalMessage || "");
2535
2647
  } catch (error) {
2536
2648
  console.error("签到命令时发生错误:", error);
2537
2649
  return "服务器繁忙,请稍后尝试。";
@@ -3941,9 +4053,9 @@ ${achievementList.join("\n")}`;
3941
4053
  '使用 "武器库 类型名称" 查看详细列表',
3942
4054
  "====================",
3943
4055
  ...Object.entries(typeStats).map(([typeName, count]) => `▸ ${typeName} (${count}种)`),
4056
+ "====================",
3944
4057
  discountRate > 0 && `
3945
- 💡 当前购买折扣:${discountRate}%(武器系统 Lv${techLevel})`,
3946
- "===================="
4058
+ 🔧 当前购买折扣:${discountRate}% (武器系统 Lv${techLevel})`
3947
4059
  ].filter(Boolean).join("\n");
3948
4060
  }
3949
4061
  if (!Object.keys(typeStats).includes(type)) {
@@ -3957,7 +4069,7 @@ ${Object.keys(typeStats).join("、")}`;
3957
4069
  `【${name2}】`,
3958
4070
  `类型:${config2.type}`,
3959
4071
  `基础伤害:${config2.damage}`,
3960
- `价格:${actualPrice}金币${discountRate > 0 ? ` (原价${config2.price}, 折扣${discountRate}%)` : ""}`,
4072
+ `价格:${actualPrice}金币${discountRate > 0 ? ` (原价${config2.price})` : ""}`,
3961
4073
  "特性:",
3962
4074
  tagEffectsDesc,
3963
4075
  `描述:${config2.description}`
@@ -3966,7 +4078,7 @@ ${Object.keys(typeStats).join("、")}`;
3966
4078
  return [
3967
4079
  `🏪 咕咕武器库 - ${type} 🏪`,
3968
4080
  "使用“购买 武器名称”命令进行购买",
3969
- discountRate > 0 && `🔧 当前应用折扣:武器系统 Lv${techLevel} ${discountRate}%`,
4081
+ discountRate > 0 && `🔧 当前购买折扣:${discountRate}% (武器系统 Lv${techLevel})`,
3970
4082
  "====================",
3971
4083
  ...items,
3972
4084
  items.length === 0 ? "⚠️ 该分类下暂无可用武器" : ""
@@ -4036,15 +4148,14 @@ ${validTypes.join("、")}`;
4036
4148
  const [weaponTech] = await ctx.database.get("ggcevo_tech", { handle, techId: 2 });
4037
4149
  let discountDetails = [];
4038
4150
  let totalDiscount = 0;
4039
- if (isWeapon) {
4151
+ if (isWeapon && careerData.group === "人类联盟") {
4040
4152
  const techDiscountTable = {
4041
- 2: [0, 10],
4042
- 3: [0, 15],
4043
- 4: [0, 20],
4044
- 5: [0, 25]
4153
+ 3: [0, 10],
4154
+ 4: [0, 15],
4155
+ 5: [0, 20]
4045
4156
  };
4046
4157
  const techLevel = weaponTech?.level || 0;
4047
- if (techLevel >= 2) {
4158
+ if (techLevel >= 3) {
4048
4159
  const [baseDisc, careerDisc] = techDiscountTable[Math.min(techLevel, 5)] || [0, 0];
4049
4160
  const isQualifiedCareer = careerData?.career && Spacestationtechnology.find((t) => t.techId === 2)?.careerNames.includes(careerData.career);
4050
4161
  const techDiscount = isQualifiedCareer ? Math.max(baseDisc, careerDisc) : baseDisc;
@@ -4213,7 +4324,9 @@ ${validTypes.join("、")}`;
4213
4324
  if ((await ctx.database.get("ggcevo_blacklist", { handle })).length) {
4214
4325
  return "❌ 拒绝访问,您已被列入黑名单";
4215
4326
  }
4216
- if (!target) return "⚠️ 请输入要升级的武器或科技名称(升级科技需要加入人类联盟阵营)";
4327
+ if (!target) {
4328
+ return generateUpgradePriceList(handle);
4329
+ }
4217
4330
  const isTech = Spacestationtechnology.some(
4218
4331
  (t) => t.techname === target || t.techname == target
4219
4332
  );
@@ -4223,7 +4336,7 @@ ${validTypes.join("、")}`;
4223
4336
  } else if (isWeapon) {
4224
4337
  return handleWeaponUpgrade(handle, target);
4225
4338
  }
4226
- return `❌ 未找到 "${target}" 对应的武器或科技`;
4339
+ return `❌ 未找到 "${target}" 对应的武器或科技(科技仅限人类联盟阵营升级)`;
4227
4340
  });
4228
4341
  ctx.command("ggcevo/改装 <weapon> [mod]", "安装武器模块").action(async ({ session }, weapon, mod) => {
4229
4342
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
@@ -4256,12 +4369,14 @@ ${validTypes.join("、")}`;
4256
4369
  const techLevel = techData?.level || 0;
4257
4370
  const isCareerMatch = Spacestationtechnology.find((t) => t.techId === 3).careerNames.includes(careerData?.career);
4258
4371
  let discountRate = 0;
4259
- if (modInfo.isExclusive) {
4260
- if (techLevel >= 2 && isCareerMatch) discountRate = 10;
4261
- } else {
4262
- const baseDiscount = [5, 10][techLevel - 1] || 0;
4263
- const careerDiscount = techLevel >= 1 && isCareerMatch ? [10, 20][techLevel - 1] : 0;
4264
- discountRate = Math.max(baseDiscount, careerDiscount);
4372
+ if (careerData.group === "人类联盟") {
4373
+ if (modInfo.isExclusive) {
4374
+ if (techLevel >= 2 && isCareerMatch) discountRate = 10;
4375
+ } else {
4376
+ const baseDiscount = [5, 10][techLevel - 1] || 0;
4377
+ const careerDiscount = techLevel >= 1 && isCareerMatch ? [10, 20][techLevel - 1] : 0;
4378
+ discountRate = Math.max(baseDiscount, careerDiscount);
4379
+ }
4265
4380
  }
4266
4381
  const actualCost = Math.floor(modInfo.cost * (1 - discountRate / 100));
4267
4382
  const [signInfo] = await ctx.database.get("ggcevo_sign", { handle });
@@ -4301,16 +4416,21 @@ ${validTypes.join("、")}`;
4301
4416
  const actualPrice = Math.floor(config2.cost * (1 - discountRate / 100));
4302
4417
  return [
4303
4418
  `【${name2}】${config2.isExclusive ? ` (专属:${config2.exclusiveTo})` : ""}`,
4304
- `价格:${actualPrice}金币${discountRate > 0 ? ` (原价${config2.cost}, 折扣${discountRate}%)` : ""}`,
4419
+ `价格:${actualPrice}金币${discountRate > 0 ? ` (原价${config2.cost})` : ""}`,
4305
4420
  `效果:${config2.effect.replace(/▸/g, "▸ ")}`,
4306
4421
  config2.isExclusive ? "※ 每个武器只能安装一个专属模块" : ""
4307
4422
  ].filter(Boolean).join("\n");
4308
4423
  }, "formatMod");
4424
+ const baseUniversalDiscount = [5, 10][techLevel - 1] || 0;
4425
+ const careerUniversalDiscount = techLevel >= 1 && isCareerMatch ? [10, 20][techLevel - 1] : 0;
4426
+ const universalDiscountRate = Math.max(baseUniversalDiscount, careerUniversalDiscount);
4427
+ const exclusiveDiscountRate = techLevel >= 2 && isCareerMatch ? 10 : 0;
4309
4428
  if (isValidWeapon) {
4310
4429
  const exclusiveMods = Object.entries(modConfig).filter(([_, m]) => m.isExclusive && m.exclusiveTo === weapon).map(([name2, cfg]) => formatMod(name2, cfg));
4311
4430
  return [
4312
4431
  `🛠️ ${weapon} 专属模块 🛠️`,
4313
4432
  "使用「改装 武器名称 模块名称」安装",
4433
+ exclusiveDiscountRate > 0 && `🔧 当前专属模块折扣:${exclusiveDiscountRate}% (武器升级平台 Lv${techLevel})`,
4314
4434
  "====================",
4315
4435
  exclusiveMods.length ? exclusiveMods.join("\n\n") : "该武器暂无专属模块"
4316
4436
  ].join("\n\n");
@@ -4319,6 +4439,7 @@ ${validTypes.join("、")}`;
4319
4439
  return [
4320
4440
  "🛠️ 通用武器模块 🛠️",
4321
4441
  "使用「改装 武器名称 模块名称」安装专属模块",
4442
+ universalDiscountRate > 0 && `🔧 当前通用模块折扣:${universalDiscountRate}% (武器升级平台 Lv${techLevel})`,
4322
4443
  "====================",
4323
4444
  universalMods.join("\n\n")
4324
4445
  ].join("\n\n");
@@ -4375,6 +4496,9 @@ ${validTypes.join("、")}`;
4375
4496
  if (!equippedWeapon) return "请先输入“装备 武器名称”后再攻击。";
4376
4497
  const weaponConfigEntry = Object.entries(weaponConfig).find(([_, c]) => c.id === equippedWeapon.weaponId);
4377
4498
  const [weaponName, weaponData] = weaponConfigEntry;
4499
+ if (!weaponData.isantiair && targetBoss.groupId === 5) {
4500
+ return "您装备的武器无法攻击空中目标!";
4501
+ }
4378
4502
  const { damage: baseDamage, hasCrit, effectMessage } = await calculateTotalDamage(ctx, session, equippedWeapon, targetBoss);
4379
4503
  const activeBosses = await ctx.database.get("ggcevo_boss", { isActive: true });
4380
4504
  if (!activeBosses.length) return "当前没有存活的异形,请等待1小时后刷新。";
@@ -4525,8 +4649,8 @@ ${validTypes.join("、")}`;
4525
4649
  `触发效果:
4526
4650
  ${effectMessage.join("\n")}`
4527
4651
  ] : [],
4528
- `造成伤害:${initialDamage}${hasCrit ? "(✨ 暴击)" : ""}`,
4529
4652
  ...healMessages,
4653
+ `造成伤害:${initialDamage}${hasCrit ? "(✨ 暴击)" : ""}`,
4530
4654
  // 修改金币显示行
4531
4655
  `获得金币:${finalReward}${careerMessage}`,
4532
4656
  `目标剩余HP:${Math.max(currentHP, 0)}/${maxHP}`,
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.3",
4
+ "version": "1.3.4",
5
5
  "main": "lib/index.js",
6
6
  "typings": "lib/index.d.ts",
7
7
  "files": [