koishi-plugin-ggcevo-game 1.4.15 → 1.4.17

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.
@@ -30,13 +30,14 @@ export declare function handleDeathTargets(ctx: Context, deadTargets: any[], kil
30
30
  bossBroadcast: string[];
31
31
  cleanerBroadcast: string[];
32
32
  }>;
33
- export declare function calculateRewards(ctx: Context, handle: string, username: string, totalDamage: number): Promise<{
33
+ export declare function calculateRewards(ctx: Context, handle: string, totalDamage: number): Promise<{
34
34
  finalReward: number;
35
35
  careerMessage: string;
36
36
  redcrystalMessage: string;
37
+ techMessage: string;
37
38
  }>;
38
39
  export declare function updateSignRecord(ctx: Context, handle: string, reward: number): Promise<void>;
39
- export declare function buildResultMessage(session: any, weaponName: string, targetBoss: any, primaryResult: any, scatterResult: any, totalDamage: number, finalReward: number, maxHP: number, careerMessage: string, redcrystalMessage: string): string;
40
+ export declare function buildResultMessage(session: any, weaponName: string, targetBoss: any, primaryResult: any, scatterResult: any, finalReward: number, maxHP: number, careerMessage: string, techMessage: string, redcrystalMessage: string): string;
40
41
  export declare function handleBroadcasts(ctx: Context, groupIds: string[], scatterBroadcast: string | string[] | null, bossEventBroadcast: string[] | string | null, cleanerRewardBroadcast: string[] | null, isPrimaryAttack: boolean): Promise<void>;
41
42
  export declare function applyScatterResults(ctx: Context, session: any, equippedWeapon: any, targetBoss: any, scatterResult: any): Promise<string[]>;
42
43
  export declare function updateBossDamageRecord(ctx: Context, handle: string, playerName: string, bossGroupId: number, damageAmount: number): Promise<void>;
@@ -69,7 +69,7 @@ export declare const PassiveHandler: {
69
69
  }>;
70
70
  calculateRadiationDamage: (targetBoss: any) => {
71
71
  damageMultiplier: number;
72
- messages: string[];
72
+ messages: any[];
73
73
  };
74
74
  handleColdEffect: (ctx: Context, targetBoss: any, weaponName: string) => Promise<{
75
75
  messages: string[];
@@ -77,7 +77,7 @@ export declare const PassiveHandler: {
77
77
  }>;
78
78
  calculateColdDamage: (targetBoss: any) => {
79
79
  damageMultiplier: number;
80
- messages: string[];
80
+ messages: any[];
81
81
  };
82
82
  handleConductorTagChange: (ctx: Context, targetBoss: any, currentHP: number, maxHP: number) => Promise<{
83
83
  messages: string[];
@@ -151,7 +151,7 @@ export declare const PassiveHandler: {
151
151
  damageMultiplier: number;
152
152
  messages: string[];
153
153
  };
154
- handleHunterAlien: (ctx: Context, targetBoss: any, weaponName: string) => Promise<{
154
+ handleHunterAlien: (targetBoss: any, weaponName: string, activeBosses: any[]) => Promise<{
155
155
  immune: boolean;
156
156
  messages: string[];
157
157
  damageMultiplier?: undefined;
@@ -181,7 +181,7 @@ export declare const PassiveHandler: {
181
181
  handlePulseDisruptor: (ctx: Context, targetBoss: any, weaponName: string) => Promise<{
182
182
  messages: string[];
183
183
  }>;
184
- handlePassives: (ctx: Context, handle: string, targetBoss: any, initialDamage: number, currentHP: number, maxHP: number, weaponName: string, weaponData: any, activeBosses: any[], bossGroup: any) => Promise<{
184
+ handlePassives: (ctx: Context, handle: string, targetBoss: any, initialDamage: number, currentHP: number, maxHP: number, weaponName: string, weaponData: any, bossGroup: any) => Promise<{
185
185
  currentHP: any;
186
186
  messages: any;
187
187
  skillUpdates: any[];
package/lib/index.js CHANGED
@@ -580,10 +580,10 @@ var spaceStationCrewConfig = [
580
580
  },
581
581
  {
582
582
  professionName: "舰长",
583
- effect: "pk胜利将获得对面的红晶,可以使用红晶升级联盟空间站科技",
584
- requirements: "pk总次数达10次",
585
- Jobtransfer: false,
586
- costcoins: 3e3
583
+ effect: "完成任务奖励+50%",
584
+ requirements: "累计完成4次及以上任务",
585
+ Jobtransfer: true,
586
+ costcoins: 2e3
587
587
  },
588
588
  {
589
589
  professionName: "机械化专家",
@@ -731,6 +731,18 @@ async function checkTransferRequirements(ctx, handle, profession) {
731
731
  success: totalDamage >= 100,
732
732
  message: `需要当期伤害榜累计造成100及以上伤害(当前${totalDamage})`
733
733
  };
734
+ // +++ 新增舰长检查 +++
735
+ case "舰长": {
736
+ const taskRecords = await ctx.database.get("ggcevo_task", { handle });
737
+ const totalCompletions = taskRecords.reduce(
738
+ (sum, task) => sum + (task.Completions || 0),
739
+ 0
740
+ );
741
+ return {
742
+ success: totalCompletions >= 4,
743
+ message: totalCompletions >= 4 ? "" : `需要累计完成4次及以上任务(当前${totalCompletions}次)`
744
+ };
745
+ }
734
746
  case "情报副官":
735
747
  const techs = await ctx.database.get("ggcevo_tech", { handle });
736
748
  const hasValidTech = techs.some((t) => t.level >= 3);
@@ -973,19 +985,19 @@ var Spacestationtechnology = [
973
985
  level: 3,
974
986
  cost: 2250,
975
987
  description: "升级空间站关键系统,完成任务奖励+15%",
976
- careerBonus: "完成任务奖励+30%"
988
+ careerBonus: "完成任务奖励+30%,移除签到7日以下奖励区间"
977
989
  },
978
990
  {
979
991
  level: 4,
980
992
  cost: 2950,
981
993
  description: "升级空间站关键系统,完成任务奖励+20%",
982
- careerBonus: "完成任务奖励+40%,移除签到7日以下奖励区间"
994
+ careerBonus: "完成任务奖励+40%,移除签到14日以下奖励区间"
983
995
  },
984
996
  {
985
997
  level: 5,
986
998
  cost: 3550,
987
999
  description: "升级空间站关键系统,完成任务奖励+25%",
988
- careerBonus: "完成任务奖励+50%,移除签到14日以下奖励区间"
1000
+ careerBonus: "完成任务奖励+50%,移除签到21日以下奖励区间"
989
1001
  }
990
1002
  ]
991
1003
  }
@@ -997,8 +1009,8 @@ var Tasklist = {
997
1009
  id: 1,
998
1010
  type: "可重复任务",
999
1011
  description: "利用【伽马枪】武器对异形目标造成辐射伤害",
1000
- target: 2,
1001
- price: 100,
1012
+ target: 1,
1013
+ price: 50,
1002
1014
  redCrystalCost: 0,
1003
1015
  condition: "使用伽马枪攻击异形并成功使辐射层数+1"
1004
1016
  },
@@ -1006,8 +1018,8 @@ var Tasklist = {
1006
1018
  id: 2,
1007
1019
  type: "可重复任务",
1008
1020
  description: "利用【零度之下】武器对异形目标造成寒冷伤害",
1009
- target: 2,
1010
- price: 100,
1021
+ target: 1,
1022
+ price: 50,
1011
1023
  redCrystalCost: 0,
1012
1024
  condition: "使用零度之下攻击异形并成功使寒冷层数+1"
1013
1025
  },
@@ -1953,7 +1965,7 @@ async function applyItemEffect(ctx, session, handle, itemConfig2, target) {
1953
1965
  }
1954
1966
  return {
1955
1967
  success: false,
1956
- message: `${itemName} 效果开发中,无法使用。`
1968
+ message: `${itemName} 无法使用。`
1957
1969
  };
1958
1970
  } catch (error) {
1959
1971
  console.error("物品效果处理失败:", error);
@@ -2029,11 +2041,11 @@ async function handleTechUpgrade(ctx, handle, target) {
2029
2041
  let discountInfo = [];
2030
2042
  if (discountApplied) {
2031
2043
  discountInfo = [
2032
- "折扣明细:",
2044
+ "💰 折扣明细:",
2033
2045
  ...discountDetails.map((detail) => `▸ ${detail}`)
2034
2046
  ];
2035
2047
  }
2036
- const costInfo = discountApplied ? `💰 花费金币:${actualCost} (原价${originalCost})` : `💰 花费金币:${actualCost}`;
2048
+ const costInfo = discountApplied ? `💸 花费金币:${actualCost} (原价${originalCost})` : `💸 花费金币:${actualCost}`;
2037
2049
  let permissionMessage = [];
2038
2050
  if (permissionGrantInfo) {
2039
2051
  const [permissionRecord] = await ctx.database.get("ggcevo_purchasepermissions", { handle });
@@ -2087,7 +2099,7 @@ async function handleWeaponUpgrade(ctx, handle, target) {
2087
2099
  if (weaponDiscount > 0) {
2088
2100
  totalDiscount += weaponDiscount;
2089
2101
  discountDetails.push(
2090
- `⚙️ 武器系统科技Lv${techLevel}:${weaponDiscount}%折扣`
2102
+ `⚙️ 武器系统Lv.${techLevel}:${weaponDiscount}%折扣`
2091
2103
  );
2092
2104
  }
2093
2105
  }
@@ -2129,8 +2141,8 @@ async function handleWeaponUpgrade(ctx, handle, target) {
2129
2141
  const damage = (weaponData.damage * (1 + 0.1 * newLevel)).toFixed(1);
2130
2142
  let msg = `${target} 升级成功!Lv.${newLevel}`;
2131
2143
  const priceInfo = totalDiscount > 0 ? `
2132
- 💸 消耗:${actualCost}金币 (原价${baseCost}金币)` : `
2133
- 💸 消耗:${actualCost}金币`;
2144
+ 💸 花费:${actualCost}金币 (原价${baseCost}金币)` : `
2145
+ 💸 花费:${actualCost}金币`;
2134
2146
  msg += priceInfo;
2135
2147
  if (discountDetails.length > 0) {
2136
2148
  msg += `
@@ -2218,13 +2230,13 @@ ${priceInfo}`);
2218
2230
  discountNotice.push("💰 当前折扣:");
2219
2231
  }
2220
2232
  if (isGunslinger) {
2221
- discountNotice.push(`🔫 枪手职业:10%升级武器折扣`);
2233
+ discountNotice.push(`▸ 🔫 枪手职业:10%折扣`);
2222
2234
  }
2223
2235
  if (isAlliance && hasTechDiscount) {
2224
- discountNotice.push(`⚙️ 武器系统科技Lv${techLevel}:${techDiscountRate}%折扣`);
2236
+ discountNotice.push(`▸ ⚙️ 武器系统Lv.${techLevel}:${techDiscountRate}%折扣`);
2225
2237
  }
2226
2238
  if (hasFoxDiscount) {
2227
- discountNotice.push(`🦊 灵狐升运祈愿:20%折扣`);
2239
+ discountNotice.push(`▸ 🦊 灵狐升运祈愿:20%折扣`);
2228
2240
  }
2229
2241
  if (!hasTechDiscount && !hasFoxDiscount && !hasGunslingerDiscount) {
2230
2242
  if (isAlliance) {
@@ -2236,11 +2248,11 @@ ${priceInfo}`);
2236
2248
  }
2237
2249
  }
2238
2250
  if (isGunslinger) {
2239
- discountNotice.push("🔝 枪手职业:武器等级上限提升至7级");
2251
+ discountNotice.push("🔝 枪手职业:武器等级上限提升至7级");
2240
2252
  }
2241
2253
  return [
2242
2254
  "⚡ 武器升级价格表 ⚡",
2243
- `武器等级上限: ${maxLevel}级(${isGunslinger ? "枪手职业" : "普通玩家"})`,
2255
+ `武器等级上限: ${maxLevel}级${isGunslinger ? " (枪手职业)" : ""}`,
2244
2256
  "使用「升级 武器名称」对武器进行等级升级",
2245
2257
  ...discountNotice,
2246
2258
  "====================",
@@ -2579,7 +2591,7 @@ var PassiveHandler = {
2579
2591
  await ctx.database.set("ggcevo_boss", { name: targetBoss.name }, { Skillcountpoints: newStacks });
2580
2592
  return { updatedHP, messages };
2581
2593
  }, "handleBloodCount"),
2582
- // 修改后的伽马枪辐射处理(上限10层,每层5%)
2594
+ // 修改后的伽马枪辐射处理(无限叠层,每层2.5%增伤,有效上限20层)
2583
2595
  handleGammaRadiation: /* @__PURE__ */ __name(async (ctx, targetBoss, weaponName) => {
2584
2596
  if (weaponName !== "伽马枪" || targetBoss.tags.includes("机械") || !targetBoss.tags.includes("生物")) {
2585
2597
  return null;
@@ -2587,40 +2599,40 @@ var PassiveHandler = {
2587
2599
  const messages = [];
2588
2600
  let radiationApplied = false;
2589
2601
  const currentLayers = targetBoss.Vulnerability || 0;
2590
- const maxLayers = 10;
2591
- const newLayers = Math.min(currentLayers + 1, maxLayers);
2602
+ const newLayers = currentLayers + 1;
2592
2603
  await ctx.database.set(
2593
2604
  "ggcevo_boss",
2594
2605
  { name: targetBoss.name },
2595
2606
  { Vulnerability: newLayers }
2596
2607
  );
2597
- if (newLayers === currentLayers) {
2598
- messages.push(`☢️ 【辐射】效果达到上限(10层)`);
2599
- } else {
2600
- const layerIncrease = newLayers - currentLayers;
2601
- messages.push(`☢️ ${targetBoss.name}获得${layerIncrease}层"辐射"(当前${newLayers}层)`);
2602
- radiationApplied = true;
2603
- }
2608
+ messages.push(`☢️ ${targetBoss.name}获得1层"辐射"(当前${newLayers}层)`);
2609
+ radiationApplied = true;
2604
2610
  return {
2605
2611
  messages,
2606
2612
  radiationApplied
2607
2613
  };
2608
2614
  }, "handleGammaRadiation"),
2609
- // 修改后的辐射伤害计算(每层5%增伤)
2615
+ // 修改后的辐射伤害计算(每层2.5%增伤,上限20层)
2610
2616
  calculateRadiationDamage: /* @__PURE__ */ __name((targetBoss) => {
2611
2617
  const radiationLayers = targetBoss.Vulnerability || 0;
2612
- if (radiationLayers > 0) {
2613
- return {
2614
- damageMultiplier: radiationLayers * 0.05,
2615
- // 每层5%增伤
2616
- messages: [
2617
- `☢️ 【辐射】生效:当前${radiationLayers}层辐射,受到的伤害+${radiationLayers * 5}%`
2618
- ]
2619
- };
2618
+ if (radiationLayers < 1) return null;
2619
+ const effectiveLayers = Math.min(radiationLayers, 20);
2620
+ const damageIncrease = effectiveLayers * 2.5;
2621
+ const maxIncrease = 50;
2622
+ const messages = [];
2623
+ let statusMsg = `☢️ 【辐射】生效:当前${radiationLayers}层辐射`;
2624
+ statusMsg += `,受到的伤害+${damageIncrease}%`;
2625
+ if (damageIncrease >= maxIncrease) {
2626
+ statusMsg += `(达到上限)`;
2620
2627
  }
2621
- return null;
2628
+ messages.push(statusMsg);
2629
+ return {
2630
+ damageMultiplier: effectiveLayers * 0.025,
2631
+ // 每层2.5%增伤
2632
+ messages
2633
+ };
2622
2634
  }, "calculateRadiationDamage"),
2623
- // 新增寒冷层数处理函数(类似辐射处理)
2635
+ // 修改后的寒冷处理(无限叠层,每层2.5%增伤,有效上限20层)
2624
2636
  handleColdEffect: /* @__PURE__ */ __name(async (ctx, targetBoss, weaponName) => {
2625
2637
  if (weaponName !== "零度之下") {
2626
2638
  return null;
@@ -2628,36 +2640,38 @@ var PassiveHandler = {
2628
2640
  const messages = [];
2629
2641
  let freezing = false;
2630
2642
  const currentFreezing = targetBoss.freezing || 0;
2631
- const newFreezing = Math.min(currentFreezing + 1, 10);
2643
+ const newFreezing = currentFreezing + 1;
2632
2644
  await ctx.database.set(
2633
2645
  "ggcevo_boss",
2634
2646
  { name: targetBoss.name },
2635
2647
  { freezing: newFreezing }
2636
2648
  );
2637
- if (newFreezing === currentFreezing) {
2638
- messages.push(`❄️ 【寒冷】效果达到上限(10层)`);
2639
- } else {
2640
- messages.push(`❄️ ${targetBoss.name} 获得1层"寒冷"(当前${newFreezing}层)`);
2641
- freezing = true;
2642
- }
2649
+ messages.push(`❄️ ${targetBoss.name} 获得1层"寒冷"(当前${newFreezing}层)`);
2650
+ freezing = true;
2643
2651
  return {
2644
2652
  messages,
2645
2653
  freezing
2646
2654
  };
2647
2655
  }, "handleColdEffect"),
2648
- // 寒冷伤害计算(返回增伤系数)
2656
+ // 修改后的寒冷伤害计算(每层2.5%增伤,上限20层)
2649
2657
  calculateColdDamage: /* @__PURE__ */ __name((targetBoss) => {
2650
2658
  const freezingLayers = targetBoss.freezing || 0;
2651
- if (freezingLayers > 0) {
2652
- return {
2653
- damageMultiplier: freezingLayers * 0.05,
2654
- // 每层5%增伤
2655
- messages: [
2656
- `❄️ 【寒冷】生效:当前${freezingLayers}层,受到的伤害+${freezingLayers * 5}%`
2657
- ]
2658
- };
2659
+ if (freezingLayers < 1) return null;
2660
+ const effectiveLayers = Math.min(freezingLayers, 20);
2661
+ const damageIncrease = effectiveLayers * 2.5;
2662
+ const maxIncrease = 50;
2663
+ const messages = [];
2664
+ let statusMsg = `❄️ 【寒冷】生效:当前${freezingLayers}层`;
2665
+ statusMsg += `,受到的伤害+${damageIncrease}%`;
2666
+ if (damageIncrease >= maxIncrease) {
2667
+ statusMsg += `(达到上限)`;
2659
2668
  }
2660
- return null;
2669
+ messages.push(statusMsg);
2670
+ return {
2671
+ damageMultiplier: effectiveLayers * 0.025,
2672
+ // 每层2.5%增伤
2673
+ messages
2674
+ };
2661
2675
  }, "calculateColdDamage"),
2662
2676
  // === 电能相关被动处理 ===
2663
2677
  // 处理导体标签变化(血量低时护盾->重甲)
@@ -3118,7 +3132,7 @@ var PassiveHandler = {
3118
3132
  };
3119
3133
  }, "handleHellfireBomb"),
3120
3134
  // 猎手异形处理(Hunter Alien)
3121
- handleHunterAlien: /* @__PURE__ */ __name(async function(ctx, targetBoss, weaponName) {
3135
+ handleHunterAlien: /* @__PURE__ */ __name(async function(targetBoss, weaponName, activeBosses) {
3122
3136
  if (!targetBoss.skills.includes("猎手异形")) return null;
3123
3137
  if (weaponName === "焚烧枪" || weaponName === "零度之下") {
3124
3138
  return {
@@ -3126,7 +3140,6 @@ var PassiveHandler = {
3126
3140
  messages: [`🛡️ 【猎手异形】生效:免疫${weaponName === "焚烧枪" ? "火焰" : "寒冷"}伤害`]
3127
3141
  };
3128
3142
  }
3129
- const activeBosses = await ctx.database.get("ggcevo_boss", { isActive: true });
3130
3143
  const otherAlive = activeBosses.some(
3131
3144
  (boss) => boss.groupId === targetBoss.groupId && boss.name !== targetBoss.name && boss.HP > 0
3132
3145
  );
@@ -3144,7 +3157,7 @@ var PassiveHandler = {
3144
3157
  if (currentHP / maxHP < 0.5) {
3145
3158
  return {
3146
3159
  damageMultiplier: -0.5,
3147
- messages: [`😠 【狂暴】生效:血量低于50%,受到的伤害-50%`]
3160
+ messages: [`🔥 【狂暴】生效:血量低于50%,受到的伤害-50%`]
3148
3161
  };
3149
3162
  }
3150
3163
  return null;
@@ -3279,7 +3292,7 @@ var PassiveHandler = {
3279
3292
  };
3280
3293
  }, "handlePulseDisruptor"),
3281
3294
  // 修改后的伤害处理函数
3282
- handlePassives: /* @__PURE__ */ __name(async function(ctx, handle, targetBoss, initialDamage, currentHP, maxHP, weaponName, weaponData, activeBosses, bossGroup) {
3295
+ handlePassives: /* @__PURE__ */ __name(async function(ctx, handle, targetBoss, initialDamage, currentHP, maxHP, weaponName, weaponData, bossGroup) {
3283
3296
  let messages = [];
3284
3297
  let skillUpdates = [];
3285
3298
  let buffMultiplier = 0;
@@ -3287,6 +3300,7 @@ var PassiveHandler = {
3287
3300
  let radiationApplied = false;
3288
3301
  let freezing = false;
3289
3302
  let bileStacks = 0;
3303
+ const activeBosses = await ctx.database.get("ggcevo_boss", { isActive: true });
3290
3304
  const solarFlareResult = await this.handleSolarFlare(ctx, targetBoss, weaponName);
3291
3305
  if (solarFlareResult.immune) {
3292
3306
  return {
@@ -3351,7 +3365,7 @@ var PassiveHandler = {
3351
3365
  initialDamage: 0
3352
3366
  };
3353
3367
  }
3354
- const hunterImmune = await this.handleHunterAlien(ctx, targetBoss, weaponName);
3368
+ const hunterImmune = await this.handleHunterAlien(targetBoss, weaponName, activeBosses);
3355
3369
  if (hunterImmune?.immune) {
3356
3370
  return {
3357
3371
  currentHP: targetBoss.HP,
@@ -3679,7 +3693,7 @@ async function getCleanerRewardBroadcast(ctx, boss, killerHandle, killerName) {
3679
3693
  redcrystal: (cleaner.redcrystal || 0) + rewardAmount
3680
3694
  }], ["handle"]);
3681
3695
  }
3682
- const rewardMessage = `🧹 全体清洁工因清理 ${bossName} 获得 ${baseReward} 红晶${killerBonus ? ` (致命一击双倍奖励 ${killerName})` : ""}`;
3696
+ const rewardMessage = `🧹 全体清洁工因清理 ${bossName} 获得 ${baseReward} 红晶${killerBonus ? ` (致命一击双倍奖励者:${killerName})` : ""}`;
3683
3697
  return [rewardMessage];
3684
3698
  } catch (error) {
3685
3699
  ctx.logger("ggcevo").warn("清洁工奖励发放失败", error);
@@ -3821,7 +3835,6 @@ async function handlePrimaryAttack(ctx, session, config, handle, equippedWeapon,
3821
3835
  maxHP,
3822
3836
  weaponName,
3823
3837
  weaponData,
3824
- activeBosses,
3825
3838
  bossGroup
3826
3839
  );
3827
3840
  const currentHP = passiveResult.currentHP;
@@ -3876,7 +3889,6 @@ async function handleScatterAttack(ctx, session, config, handle, equippedWeapon,
3876
3889
  getBossMaxHP(secondaryTarget.name),
3877
3890
  weaponName,
3878
3891
  weaponData,
3879
- secondaryTargets,
3880
3892
  bossGroup
3881
3893
  );
3882
3894
  const actualDamage = Math.min(passiveResult.initialDamage, secondaryTarget.HP);
@@ -4001,7 +4013,7 @@ async function handleDeathTargets(ctx, deadTargets, killerName, killerHandle) {
4001
4013
  };
4002
4014
  }
4003
4015
  __name(handleDeathTargets, "handleDeathTargets");
4004
- async function calculateRewards(ctx, handle, username, totalDamage) {
4016
+ async function calculateRewards(ctx, handle, totalDamage) {
4005
4017
  const SECURITY_BONUS_MAPPING = {
4006
4018
  base: [5, 10, 15, 20, 25],
4007
4019
  career: [10, 20, 30, 40, 50]
@@ -4013,11 +4025,13 @@ async function calculateRewards(ctx, handle, username, totalDamage) {
4013
4025
  techId: 4
4014
4026
  });
4015
4027
  let techBonusPercent = 0;
4028
+ let techMessage = "";
4016
4029
  if (securityTech && securityTech.level >= 1 && careerData?.group === "人类联盟") {
4017
4030
  const techLevel = securityTech.level - 1;
4018
4031
  const securityConfig = Spacestationtechnology.find((t) => t.techId === 4);
4019
4032
  const isEligibleForCareerBonus = securityConfig?.careerNames.includes(career);
4020
4033
  techBonusPercent = isEligibleForCareerBonus ? SECURITY_BONUS_MAPPING.career[techLevel] : SECURITY_BONUS_MAPPING.base[techLevel];
4034
+ techMessage = isEligibleForCareerBonus ? `⚙️ 安防系统Lv.${securityTech.level}:+${SECURITY_BONUS_MAPPING.career[techLevel]}%金币` : `⚙️ 安防系统Lv.${securityTech.level}:+${SECURITY_BONUS_MAPPING.base[techLevel]}%金币`;
4021
4035
  }
4022
4036
  let careerMultiplier = 0;
4023
4037
  let careerMessage = "";
@@ -4042,7 +4056,9 @@ async function calculateRewards(ctx, handle, username, totalDamage) {
4042
4056
  return {
4043
4057
  finalReward,
4044
4058
  careerMessage,
4045
- redcrystalMessage
4059
+ redcrystalMessage,
4060
+ techMessage
4061
+ // 新增:独立返回科技奖励信息
4046
4062
  };
4047
4063
  }
4048
4064
  __name(calculateRewards, "calculateRewards");
@@ -4054,7 +4070,7 @@ async function updateSignRecord(ctx, handle, reward) {
4054
4070
  }], ["handle"]);
4055
4071
  }
4056
4072
  __name(updateSignRecord, "updateSignRecord");
4057
- function buildResultMessage(session, weaponName, targetBoss, primaryResult, scatterResult, totalDamage, finalReward, maxHP, careerMessage, redcrystalMessage) {
4073
+ function buildResultMessage(session, weaponName, targetBoss, primaryResult, scatterResult, finalReward, maxHP, careerMessage, techMessage, redcrystalMessage) {
4058
4074
  const messages = [
4059
4075
  `🔥 ${session.username} 使用武器 ${weaponName} 对 ${targetBoss.name} 发起攻击!`,
4060
4076
  ...primaryResult.effectMessage.length > 0 ? [
@@ -4078,10 +4094,16 @@ ${scatterResult.scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`,
4078
4094
  ] : []
4079
4095
  );
4080
4096
  }
4097
+ const bonusMessages = [
4098
+ careerMessage ? `▸ ${careerMessage}` : "",
4099
+ techMessage ? `▸ ${techMessage}` : "",
4100
+ redcrystalMessage ? `▸ ${redcrystalMessage}` : ""
4101
+ ].filter((msg) => msg);
4081
4102
  messages.push(
4082
4103
  `获得金币:${finalReward}`,
4083
- careerMessage,
4084
- redcrystalMessage,
4104
+ `⚡ 加成效果:`,
4105
+ ...bonusMessages,
4106
+ // 使用展开运算符添加所有加▸的奖励消息
4085
4107
  `目标剩余HP:${Math.max(primaryResult.currentHP, 0)}/${maxHP}`,
4086
4108
  primaryResult.isDefeated ? `🎉 恭喜,已成功击败 ${targetBoss.name}!` : ""
4087
4109
  );
@@ -4728,7 +4750,6 @@ ${itemDetails.join("\n")}`;
4728
4750
  }
4729
4751
  const messages = [];
4730
4752
  let totalBonus = 0;
4731
- let basePoints;
4732
4753
  let tickets = 3;
4733
4754
  if (monthlyDays === 7) {
4734
4755
  tickets = 4;
@@ -4742,19 +4763,24 @@ ${itemDetails.join("\n")}`;
4742
4763
  const [systemFirmwareTech] = await ctx.database.get("ggcevo_tech", { handle, techId: 5 }).catch(() => [{ level: 0 }]);
4743
4764
  const systemFirmwareLevel = Math.min(systemFirmwareTech?.level || 0, 5);
4744
4765
  const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
4745
- const shouldApplyBonus = careerData?.group === "人类联盟" && ["舰长", "情报副官"].includes(careerData.career) && systemFirmwareLevel >= 4;
4746
- if (shouldApplyBonus) {
4747
- if (systemFirmwareLevel === 4) {
4748
- if (monthlyDays < 14) basePoints = getRandomInt(40, 60);
4749
- else if (monthlyDays < 21) basePoints = getRandomInt(60, 80);
4750
- else if (monthlyDays < 28) basePoints = getRandomInt(80, 100);
4766
+ const shouldApplyFirmwareEffect = careerData?.group === "人类联盟" && ["舰长", "情报副官"].includes(careerData.career) && systemFirmwareLevel >= 3;
4767
+ let basePoints;
4768
+ if (shouldApplyFirmwareEffect) {
4769
+ if (systemFirmwareLevel >= 5) {
4770
+ if (monthlyDays < 28) basePoints = getRandomInt(80, 100);
4751
4771
  else basePoints = getRandomInt(100, 200);
4752
- messages.push(`🛰️ 关键系统固件科技Lv4:移除签到7日以下奖励区间`);
4753
- } else if (systemFirmwareLevel === 5) {
4772
+ messages.push(`🛰️ 关键系统固件Lv.5:移除签到21日以下奖励区间`);
4773
+ } else if (systemFirmwareLevel >= 4) {
4754
4774
  if (monthlyDays < 21) basePoints = getRandomInt(60, 80);
4755
4775
  else if (monthlyDays < 28) basePoints = getRandomInt(80, 100);
4756
4776
  else basePoints = getRandomInt(100, 200);
4757
- messages.push(`🛰️ 关键系统固件科技Lv5:移除签到14日以下奖励区间`);
4777
+ messages.push(`🛰️ 关键系统固件Lv.4:移除签到14日以下奖励区间`);
4778
+ } else if (systemFirmwareLevel >= 3) {
4779
+ if (monthlyDays < 14) basePoints = getRandomInt(40, 60);
4780
+ else if (monthlyDays < 21) basePoints = getRandomInt(60, 80);
4781
+ else if (monthlyDays < 28) basePoints = getRandomInt(80, 100);
4782
+ else basePoints = getRandomInt(100, 200);
4783
+ messages.push(`🛰️ 关键系统固件Lv.3:移除签到7日以下奖励区间`);
4758
4784
  }
4759
4785
  } else {
4760
4786
  if (monthlyDays < 7) basePoints = getRandomInt(20, 40);
@@ -4780,7 +4806,7 @@ ${itemDetails.join("\n")}`;
4780
4806
  const finalBonus = Math.max(baseTechBonus, careerTechBonus);
4781
4807
  if (finalBonus > 0) {
4782
4808
  totalBonus += finalBonus / 100;
4783
- messages.push(`⚙️ 采掘系统科技Lv${techLevel}:+${finalBonus}%金币`);
4809
+ messages.push(`⚙️ 采掘系统Lv.${techLevel}:+${finalBonus}%金币`);
4784
4810
  }
4785
4811
  }
4786
4812
  if (careerData.career === "深空矿工") {
@@ -5987,9 +6013,6 @@ ${items.join("、")}
5987
6013
  `📊 胜率预测:${winRate.toFixed(1)}%`,
5988
6014
  `🎰 金币变动:${stealPercentage}%`
5989
6015
  ];
5990
- if (targetCareer.group === "人类联盟" && isWin) {
5991
- result.push(`🛡️ 人类联盟:应战者PK失败时仅损失1%的金币`);
5992
- }
5993
6016
  if (computerExpertProtection) {
5994
6017
  result.push(`💻 计算机专家职业:应战者PK失败时不损失金币`);
5995
6018
  } else if (isWin) {
@@ -5997,17 +6020,21 @@ ${items.join("、")}
5997
6020
  } else {
5998
6021
  result.push(`💸 您从口袋里拿出了${goldTransfer}枚金币上交给对方`);
5999
6022
  }
6023
+ result.push(`⚡ 加成效果:`);
6024
+ if (targetCareer.group === "人类联盟" && isWin) {
6025
+ result.push(`▸ 🛡️ 人类联盟:应战者PK失败时仅损失1%的金币`);
6026
+ }
6000
6027
  if (mp3Effect) {
6001
- result.push(`💿 MP3播放器生效:挑战者PK失败时上交的金币减少50%`);
6028
+ result.push(`▸ 💿 MP3播放器生效:挑战者PK失败时上交的金币减少50%`);
6002
6029
  }
6003
6030
  if (hornEffect) {
6004
- result.push(`📯 气喇叭生效:辛迪加海盗总部为您发放了额外${extraGold}金币奖励!`);
6031
+ result.push(`▸ 📯 气喇叭生效:辛迪加海盗总部为您发放了额外${extraGold}金币奖励!`);
6005
6032
  }
6006
6033
  if (initiatorCareer?.group === "辛迪加海盗") {
6007
- result.push(`🔴 辛迪加海盗阵营:+1枚红晶`);
6034
+ result.push(`▸ 🔴 辛迪加海盗阵营:+1枚红晶`);
6008
6035
  }
6009
6036
  if (isWin && initiatorCareer?.career === "辛迪加财务经理") {
6010
- result.push(`🎖️ 辛迪加财务经理职业:+1枚红晶`);
6037
+ result.push(`▸ 🎖️ 辛迪加财务经理职业:+1枚红晶`);
6011
6038
  }
6012
6039
  result.push(`📅 剩余挑战次数:${config.dailyPKLimit - (initiatorPK.todayCount + 1)}`);
6013
6040
  return result.join("\n");
@@ -6059,7 +6086,7 @@ ${items.join("、")}
6059
6086
  if (careerData?.career === "武器中士") {
6060
6087
  const weaponSpecialistDiscount = 20;
6061
6088
  totalDiscount += weaponSpecialistDiscount;
6062
- discountDetails.push(`🎖️ 武器中士职业:${weaponSpecialistDiscount}%折扣`);
6089
+ discountDetails.push(`▸ 🎖️ 武器中士职业:${weaponSpecialistDiscount}%折扣`);
6063
6090
  }
6064
6091
  const activeWish = await ctx.database.get("ggcevo_Wish_Record", {
6065
6092
  handle,
@@ -6071,7 +6098,7 @@ ${items.join("、")}
6071
6098
  if (activeWish) {
6072
6099
  const grasshopperDiscount = 20;
6073
6100
  totalDiscount += grasshopperDiscount;
6074
- discountDetails.push(`🦗 蚱蜢优购祈愿:${grasshopperDiscount}%折扣`);
6101
+ discountDetails.push(`▸ 🦗 蚱蜢优购祈愿:${grasshopperDiscount}%折扣`);
6075
6102
  }
6076
6103
  totalDiscount = Math.min(totalDiscount, 100);
6077
6104
  const categoryStats = Object.values(weaponConfig).filter((weapon) => weapon.price !== 0).reduce((stats, weapon) => {
@@ -6082,7 +6109,7 @@ ${items.join("、")}
6082
6109
  return [
6083
6110
  "🏪 咕咕武器库分类 🏪",
6084
6111
  '使用 "武器库 分类名称" 查看详细列表',
6085
- totalDiscount > 0 && `💰 当前折扣:
6112
+ totalDiscount > 0 && `💰 折扣明细:
6086
6113
  ${discountDetails.length ? `${discountDetails.join("\n")}` : ""}`,
6087
6114
  "====================",
6088
6115
  ...Object.entries(categoryStats).map(([catName, count]) => `▸ ${catName} (${count}种)`),
@@ -6117,7 +6144,7 @@ ${Object.keys(categoryStats).join("、")}`;
6117
6144
  ].filter(Boolean).join("\n");
6118
6145
  });
6119
6146
  const permissionNotice = isLegendaryCategory ? '⚠️ 注意:购买传奇武器需要"传奇武器购买权限"' : null;
6120
- const discountInfo = totalDiscount > 0 && !isLegendaryCategory ? `💰 当前折扣:
6147
+ const discountInfo = totalDiscount > 0 && !isLegendaryCategory ? `💰 折扣明细:
6121
6148
  ${discountDetails.length ? `${discountDetails.join("\n")}` : ""}` : null;
6122
6149
  return [
6123
6150
  `🏪 咕咕武器库 - ${category} 🏪`,
@@ -6233,13 +6260,13 @@ ${validTypes.join("、")}`;
6233
6260
  if (activeWish) {
6234
6261
  const wishDiscount = 20;
6235
6262
  totalDiscount += wishDiscount;
6236
- discountDetails.push(`🦗 蚱蜢优购祈愿:${wishDiscount}%折扣`);
6263
+ discountDetails.push(`▸ 🦗 蚱蜢优购祈愿:${wishDiscount}%折扣`);
6237
6264
  }
6238
6265
  }
6239
6266
  if (isWeapon && careerData?.career === "武器中士") {
6240
6267
  const specialistDiscount = 20;
6241
6268
  totalDiscount += specialistDiscount;
6242
- discountDetails.push(`🎖️ 武器中士职业:${specialistDiscount}%折扣`);
6269
+ discountDetails.push(`▸ 🎖️ 武器中士职业:${specialistDiscount}%折扣`);
6243
6270
  }
6244
6271
  totalDiscount = Math.min(totalDiscount, 100);
6245
6272
  }
@@ -6315,7 +6342,7 @@ ${validTypes.join("、")}`;
6315
6342
  扣除 1 次传奇武器购买权限,剩余次数:${permissions?.legendarypermissions || 0}`;
6316
6343
  } else if (discountDetails.length > 0) {
6317
6344
  message += `(原价${config2.price} 金币)
6318
- 折扣明细:
6345
+ 💰 折扣明细:
6319
6346
  ▸ ${discountDetails.join("\n▸ ")}`;
6320
6347
  } else {
6321
6348
  message += ` (原价${config2.price} 金币)`;
@@ -6484,8 +6511,8 @@ ${validTypes.join("、")}`;
6484
6511
  `✅ ${weapon} 成功安装 ${mod}!`,
6485
6512
  `花费金币:${actualCost}${discountRate > 0 ? ` (原价${modInfo.cost})` : ""}`,
6486
6513
  discountRate > 0 && [
6487
- "折扣明细:",
6488
- `⚙️ 武器升级平台科技Lv${techLevel}:${discountRate}%`
6514
+ "💰 折扣明细:",
6515
+ `▸ ⚙️ 武器升级平台Lv.${techLevel}:${discountRate}%折扣`
6489
6516
  ].join("\n"),
6490
6517
  `改装槽:${equipment.installedMods.length + 1}/${equipment.modificationSlots}`
6491
6518
  ].filter(Boolean).join("\n");
@@ -6523,7 +6550,7 @@ ${validTypes.join("、")}`;
6523
6550
  "使用「改装 武器名称 模块名称」安装",
6524
6551
  "※ 每个武器只能安装一个专属模块",
6525
6552
  exclusiveDiscountRate > 0 && `💰 当前专属模块折扣:
6526
- ⚙️ 武器升级平台科技Lv${techLevel}:${exclusiveDiscountRate}%`,
6553
+ ⚙️ 武器升级平台Lv.${techLevel}:${exclusiveDiscountRate}%折扣`,
6527
6554
  "====================",
6528
6555
  exclusiveMods.length ? exclusiveMods.join("\n") : "该武器暂无专属模块"
6529
6556
  ].filter(Boolean).join("\n");
@@ -6534,7 +6561,7 @@ ${validTypes.join("、")}`;
6534
6561
  "使用「改装 武器名称 模块名称」安装通用模块",
6535
6562
  "使用「改装 武器名称」查询武器专属模块",
6536
6563
  universalDiscountRate > 0 && `💰 当前通用模块折扣:
6537
- ⚙️ 武器升级平台科技Lv${techLevel}:${universalDiscountRate}%`,
6564
+ ⚙️ 武器升级平台Lv.${techLevel}:${universalDiscountRate}%折扣`,
6538
6565
  "====================",
6539
6566
  universalMods.join("\n")
6540
6567
  ].filter(Boolean).join("\n");
@@ -6553,9 +6580,9 @@ ${validTypes.join("、")}`;
6553
6580
  const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
6554
6581
  if (existingEntries.length > 0) return "⛔ 您已被列入黑名单。";
6555
6582
  const weaponId = weaponConfig[weapon]?.id;
6556
- if (!weaponId) return "❌ 请输入“拆卸 武器名称 模块名称”\n注意:专属模块返还50%金币,通用模块返还80%金币";
6583
+ if (!weaponId) return "❌ 请输入“拆卸 武器名称 模块名称”\n注意:通用模块返还80%金币,专属模块返还50%金币";
6557
6584
  const modInfo = modConfig[mod];
6558
- if (!modInfo) return "❌ 请输入“拆卸 武器名称 模块名称”\n注意:专属模块返还50%金币,通用模块返还80%金币";
6585
+ if (!modInfo) return "❌ 请输入“拆卸 武器名称 模块名称”\n注意:通用模块返还80%金币,专属模块返还50%金币";
6559
6586
  const refundRate = modInfo.isExclusive ? 0.5 : 0.8;
6560
6587
  const refundType = modInfo.isExclusive ? "专属模块返还50%" : "通用模块返还80%";
6561
6588
  const [equipment] = await ctx.database.get("ggcevo_equipment", {
@@ -6651,7 +6678,8 @@ ${validTypes.join("、")}`;
6651
6678
  allDeadTargets.push(targetBoss);
6652
6679
  }
6653
6680
  let scatterResult = null;
6654
- const isScatterAttack = equippedWeapon.installedMods?.includes("光束曲射晶片") && weaponName === "碎骨步枪" || weaponName === "中子步枪";
6681
+ const hasOtherBosses = activeBosses.some((b) => b.name !== targetBoss.name);
6682
+ const isScatterAttack = (equippedWeapon.installedMods?.includes("光束曲射晶片") && weaponName === "碎骨步枪" || weaponName === "中子步枪") && hasOtherBosses;
6655
6683
  if (isScatterAttack) {
6656
6684
  scatterResult = await handleScatterAttack(
6657
6685
  ctx,
@@ -6682,10 +6710,9 @@ ${validTypes.join("、")}`;
6682
6710
  const deathResults = await handleDeathTargets(ctx, allDeadTargets, session.username, handle);
6683
6711
  bossEventBroadcast = deathResults.bossBroadcast;
6684
6712
  cleanerRewardBroadcast = deathResults.cleanerBroadcast;
6685
- const { finalReward, careerMessage, redcrystalMessage } = await calculateRewards(
6713
+ const { finalReward, careerMessage, redcrystalMessage, techMessage } = await calculateRewards(
6686
6714
  ctx,
6687
6715
  handle,
6688
- session.username,
6689
6716
  totalDamage
6690
6717
  );
6691
6718
  await updateSignRecord(ctx, handle, finalReward);
@@ -6713,10 +6740,10 @@ ${validTypes.join("、")}`;
6713
6740
  targetBoss,
6714
6741
  primaryAttackResult,
6715
6742
  scatterResult,
6716
- totalDamage,
6717
6743
  finalReward,
6718
6744
  maxHP,
6719
6745
  careerMessage,
6746
+ techMessage,
6720
6747
  redcrystalMessage
6721
6748
  );
6722
6749
  await session.send(resultMessage);
@@ -7288,16 +7315,16 @@ ${validTypes.join("、")}`;
7288
7315
  if (!category) {
7289
7316
  const discountLines = [];
7290
7317
  if (isComputerExpert) {
7291
- discountLines.push("💻 计算机专家职业:设备工具类物品50%折扣");
7318
+ discountLines.push("💻 计算机专家职业:设备工具类物品50%折扣");
7292
7319
  }
7293
7320
  if (isSaboteur) {
7294
- discountLines.push("💣 破坏者职业:爆破物类物品50%折扣");
7321
+ discountLines.push("💣 破坏者职业:爆破物类物品50%折扣");
7295
7322
  }
7296
7323
  return [
7297
7324
  "🏴 辛迪加黑市 🏴",
7298
7325
  '使用 "黑市 分类名称" 查看详细信息',
7299
7326
  discountLines.length ? [
7300
- "💰 当前折扣:",
7327
+ "💰 折扣明细:",
7301
7328
  ...discountLines
7302
7329
  ].join("\n") : "",
7303
7330
  "====================",
@@ -7375,13 +7402,13 @@ ${validTypes.join("、")}`;
7375
7402
  let discountInfo = [];
7376
7403
  if (isSaboteur && normalizedCategory === "爆破物") {
7377
7404
  discountInfo = [
7378
- "💰 当前折扣:",
7379
- "💣 破坏者职业:爆破物类物品50%折扣"
7405
+ "💰 折扣明细:",
7406
+ "💣 破坏者职业:爆破物类物品50%折扣"
7380
7407
  ];
7381
7408
  } else if (isComputerExpert && normalizedCategory === "设备工具") {
7382
7409
  discountInfo = [
7383
- "💰 当前折扣:",
7384
- "💻 计算机专家职业:设备工具类物品50%折扣"
7410
+ "💰 折扣明细:",
7411
+ "💻 计算机专家职业:设备工具类物品50%折扣"
7385
7412
  ];
7386
7413
  }
7387
7414
  return [
@@ -7502,7 +7529,7 @@ ${validTypes.join("、")}`;
7502
7529
  return [
7503
7530
  `✅ 成功订购【${item}】!`,
7504
7531
  ...priceInfo,
7505
- discountLines.length ? `折扣明细:
7532
+ discountLines.length ? `💰 折扣明细:
7506
7533
  ▸ ${discountLines.join("\n▸ ")}` : "",
7507
7534
  `装备状态:${equippedStatus}`,
7508
7535
  '输入 "武器仓库" 管理武器'
@@ -7515,7 +7542,7 @@ ${validTypes.join("、")}`;
7515
7542
  return [
7516
7543
  `✅ 成功订购【${item}】x1!`,
7517
7544
  ...priceInfo,
7518
- discountLines.length ? `折扣明细:
7545
+ discountLines.length ? `💰 折扣明细:
7519
7546
  ▸ ${discountLines.join("\n▸ ")}` : "",
7520
7547
  `当前库存:${currentStock}件`,
7521
7548
  '输入 "仓库" 查看所有物品'
@@ -7602,7 +7629,7 @@ ${validTypes.join("、")}`;
7602
7629
  return [
7603
7630
  `✅ 成功使用 ${itemNameConfirmed}`,
7604
7631
  `剩余数量:${newQuantity}`,
7605
- `效果触发:${effectResult.message}`
7632
+ `触发效果:${effectResult.message}`
7606
7633
  ].join("\n");
7607
7634
  } catch (error) {
7608
7635
  ctx.logger("GGCEVO").error(error);
@@ -7627,8 +7654,8 @@ ${validTypes.join("、")}`;
7627
7654
  "🛰️ 空间站科技系统 🛰️",
7628
7655
  '使用 "科技 科技名称" 查看详细信息',
7629
7656
  isIntelligenceOfficer ? [
7630
- "💰 当前折扣:",
7631
- "🎖️ 情报副官职业:10%"
7657
+ "💰 折扣明细:",
7658
+ "🎖️ 情报副官职业:10%折扣"
7632
7659
  ].join("\n") : "",
7633
7660
  "====================",
7634
7661
  ...techList,
@@ -7655,8 +7682,8 @@ ${Spacestationtechnology.map((t) => t.techname).join("、")}`;
7655
7682
  let discountInfo = [];
7656
7683
  if (isIntelligenceOfficer) {
7657
7684
  discountInfo = [
7658
- "💰 当前折扣:",
7659
- "🎖️ 情报副官职业:10%"
7685
+ "💰 折扣明细:",
7686
+ "🎖️ 情报副官职业:10%折扣"
7660
7687
  ];
7661
7688
  }
7662
7689
  return [
@@ -7762,7 +7789,8 @@ ${Spacestationtechnology.map((t) => t.techname).join("、")}`;
7762
7789
  }
7763
7790
  reportLines.push(rewardLine);
7764
7791
  if (tech.level >= 3) {
7765
- reportLines.push(`⚙️ 采掘系统科技Lv.${tech.level}(矿骡):+${multiplier * 100}%金币`);
7792
+ reportLines.push(`⚡ 加成效果:`);
7793
+ reportLines.push(`▸ ⚙️ 采掘系统Lv.${tech.level}(矿骡):+${multiplier * 100}%金币`);
7766
7794
  }
7767
7795
  reportLines.push(`🏆 历史总挖矿收益:${record.totalMined + total}金币`);
7768
7796
  reportLines.push("💡 已自动开始下一轮挖矿");
@@ -7843,7 +7871,7 @@ ${Spacestationtechnology.map((t) => t.techname).join("、")}`;
7843
7871
  handle,
7844
7872
  taskId: taskConfig.id
7845
7873
  });
7846
- if (!taskData) return `⚠️ 您尚未开始"${taskName}"任务`;
7874
+ if (!taskData) return `⚠️ ⚠️ 任务进度不足!无法完成"${taskName}"任务`;
7847
7875
  if (taskData.progress < taskConfig.target) {
7848
7876
  return `⚠️ 任务进度不足!当前进度:${taskData.progress}/${taskConfig.target}`;
7849
7877
  }
@@ -7854,16 +7882,17 @@ ${Spacestationtechnology.map((t) => t.techname).join("、")}`;
7854
7882
  const techLevel = Math.min(systemFirmwareTech?.level || 0, 5);
7855
7883
  let baseReward = taskConfig.price;
7856
7884
  let actualReward = baseReward;
7857
- let bonusMessage = "";
7858
7885
  let bonusPercent = 0;
7859
7886
  if (techLevel > 0) {
7860
7887
  const normalBonus = [0, 5, 10, 15, 20, 25][techLevel];
7861
- const careerBonus = careerData?.group === "人类联盟" && ["舰长", "情报副官"].includes(careerData.career) ? [0, 10, 20, 30, 40, 50][techLevel] : 0;
7888
+ const careerBonus = careerData?.group === "人类联盟" && ["舰长", "情报副官"].includes(careerData?.career) ? [0, 10, 20, 30, 40, 50][techLevel] : 0;
7862
7889
  bonusPercent = Math.max(normalBonus, careerBonus);
7863
- if (bonusPercent > 0) {
7864
- actualReward = Math.round(baseReward * (1 + bonusPercent / 100));
7865
- bonusMessage = `(含科技加成 +${bonusPercent}%)`;
7866
- }
7890
+ }
7891
+ if (careerData?.group === "人类联盟" && careerData.career === "舰长") {
7892
+ bonusPercent += 50;
7893
+ }
7894
+ if (bonusPercent > 0) {
7895
+ actualReward = Math.round(baseReward * (1 + bonusPercent / 100));
7867
7896
  }
7868
7897
  await ctx.database.set("ggcevo_task", {
7869
7898
  handle,
@@ -7879,9 +7908,13 @@ ${Spacestationtechnology.map((t) => t.techname).join("、")}`;
7879
7908
  }], ["handle"]);
7880
7909
  const [updatedSignData] = await ctx.database.get("ggcevo_sign", { handle });
7881
7910
  const response = [
7882
- `🎉 恭喜您成功完成【${taskName}】任务!`,
7883
- `任务奖励:${actualReward}金币(基础值:${baseReward}金币)`
7911
+ `🎉 恭喜您成功完成【${taskName}】任务!`
7884
7912
  ];
7913
+ if (bonusPercent > 0) {
7914
+ response.push(`任务奖励:${actualReward}金币 (基础值:${baseReward}金币)`);
7915
+ } else {
7916
+ response.push(`任务奖励:${actualReward}金币`);
7917
+ }
7885
7918
  if (bonusPercent > 0) {
7886
7919
  let bonusType = "";
7887
7920
  if (careerData?.group === "人类联盟" && ["舰长", "情报副官"].includes(careerData.career)) {
@@ -7889,7 +7922,8 @@ ${Spacestationtechnology.map((t) => t.techname).join("、")}`;
7889
7922
  } else {
7890
7923
  bonusType = "(普通加成)";
7891
7924
  }
7892
- response.push(`⚙️ 关键系统固件科技Lv.${techLevel}:+${bonusPercent}%金币`);
7925
+ response.push(`⚡ 加成效果:`);
7926
+ response.push(`▸ ⚙️ 关键系统固件Lv.${techLevel}:+${bonusPercent}%金币`);
7893
7927
  }
7894
7928
  response.push(
7895
7929
  `累计完成次数:${newCompletions}次`,
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.15",
4
+ "version": "1.4.17",
5
5
  "main": "lib/index.js",
6
6
  "typings": "lib/index.d.ts",
7
7
  "files": [