koishi-plugin-ggcevo-game 1.6.14 → 1.6.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/index.js CHANGED
@@ -36,6 +36,7 @@ var weaponConfig = {
36
36
  id: 1,
37
37
  type: "实弹武器",
38
38
  category: "实弹武器",
39
+ level: 1,
39
40
  damage: 13,
40
41
  armorDamageReduction: 1,
41
42
  // 每点护甲减伤1点伤害
@@ -53,6 +54,7 @@ var weaponConfig = {
53
54
  id: 2,
54
55
  type: "能量武器",
55
56
  category: "能量武器",
57
+ level: 1,
56
58
  damage: 23,
57
59
  armorDamageReduction: 0,
58
60
  description: "先进激光武器,远距离精准打击",
@@ -68,6 +70,7 @@ var weaponConfig = {
68
70
  id: 3,
69
71
  type: "热能武器",
70
72
  category: "热能武器",
73
+ level: 1,
71
74
  damage: 23,
72
75
  armorDamageReduction: 0.25,
73
76
  description: "基于热能的强大武器,烧烬一切",
@@ -85,6 +88,7 @@ var weaponConfig = {
85
88
  id: 4,
86
89
  type: "能量武器",
87
90
  category: "能量武器",
91
+ level: 2,
88
92
  damage: 28,
89
93
  armorDamageReduction: 0,
90
94
  description: "由激光步枪改良而来,高效的对重甲武器",
@@ -100,6 +104,7 @@ var weaponConfig = {
100
104
  id: 5,
101
105
  type: "实弹武器",
102
106
  category: "实弹武器",
107
+ level: 1,
103
108
  damage: 16,
104
109
  armorDamageReduction: 1,
105
110
  description: "一种改造后的采矿切割机,有效对抗重甲目标",
@@ -117,6 +122,7 @@ var weaponConfig = {
117
122
  id: 6,
118
123
  type: "实弹武器",
119
124
  category: "实弹武器",
125
+ level: 1,
120
126
  damage: 48,
121
127
  armorDamageReduction: 4,
122
128
  description: "近距离攻击武器,专为遭遇战设计使用",
@@ -132,6 +138,7 @@ var weaponConfig = {
132
138
  id: 7,
133
139
  type: "实弹武器",
134
140
  category: "实弹武器",
141
+ level: 2,
135
142
  damage: 60,
136
143
  armorDamageReduction: 3,
137
144
  description: "用于隐秘射击的最佳武器,但是无法穿透护甲",
@@ -145,6 +152,7 @@ var weaponConfig = {
145
152
  id: 8,
146
153
  type: "热能武器",
147
154
  category: "热能武器",
155
+ level: 2,
148
156
  damage: 25,
149
157
  armorDamageReduction: 1,
150
158
  description: "喷射稳定的液氮恒流,对长时间接触者造成致命的损伤",
@@ -162,6 +170,7 @@ var weaponConfig = {
162
170
  id: 9,
163
171
  type: "能量武器",
164
172
  category: "能量武器",
173
+ level: 2,
165
174
  damage: 24,
166
175
  armorDamageReduction: 0.5,
167
176
  description: "一种经过改造的电动工具,可对近距离的目标放出高压电",
@@ -178,6 +187,7 @@ var weaponConfig = {
178
187
  id: 10,
179
188
  type: "热能武器",
180
189
  category: "热能武器",
190
+ level: 2,
181
191
  damage: 27,
182
192
  armorDamageReduction: 0.75,
183
193
  description: "一种高度危险性的武器,设计用辐射照射并伤害敌人",
@@ -194,6 +204,7 @@ var weaponConfig = {
194
204
  id: 11,
195
205
  type: "能量武器",
196
206
  category: "能量武器",
207
+ level: 3,
197
208
  damage: 27,
198
209
  armorDamageReduction: 0,
199
210
  description: "激光步枪的变种,采用折射技术升级",
@@ -209,6 +220,7 @@ var weaponConfig = {
209
220
  id: 12,
210
221
  type: "能量武器",
211
222
  category: "能量武器",
223
+ level: 3,
212
224
  damage: 29,
213
225
  armorDamageReduction: 0.75,
214
226
  description: "面对护盾目标而开发的武器",
@@ -224,6 +236,7 @@ var weaponConfig = {
224
236
  id: 13,
225
237
  type: "实弹武器",
226
238
  category: "实弹武器",
239
+ level: 3,
227
240
  damage: 32,
228
241
  armorDamageReduction: 0.5,
229
242
  description: "这种强大的钻头是由那些想把矿工SCV上的大螺丝用作武器的人创造的",
@@ -241,6 +254,7 @@ var weaponConfig = {
241
254
  id: 14,
242
255
  type: "能量武器",
243
256
  category: "能量武器",
257
+ level: 3,
244
258
  damage: 36,
245
259
  armorDamageReduction: 1,
246
260
  description: "一种原型能量武器,能够发射强大的脉冲",
@@ -254,6 +268,7 @@ var weaponConfig = {
254
268
  id: 15,
255
269
  type: "热能武器",
256
270
  category: "热能武器",
271
+ level: 4,
257
272
  damage: 60,
258
273
  armorDamageReduction: 0.5,
259
274
  description: "发射非常坚固的专属榴弹,对具有坚固防御的目标几乎没有效果",
@@ -271,6 +286,7 @@ var weaponConfig = {
271
286
  id: 16,
272
287
  type: "能量武器",
273
288
  category: "能量武器",
289
+ level: 4,
274
290
  damage: 64,
275
291
  armorDamageReduction: 4,
276
292
  description: "用于解决高生命值目标的次时代武器,擅长对付护盾耗尽或没有护甲的敌人",
@@ -287,6 +303,7 @@ var weaponConfig = {
287
303
  id: 17,
288
304
  type: "能量武器",
289
305
  category: "能量武器",
306
+ level: 4,
290
307
  damage: 60,
291
308
  armorDamageReduction: 0,
292
309
  description: "一种实验性的超级武器,能造成巨大的伤害",
@@ -300,6 +317,7 @@ var weaponConfig = {
300
317
  id: 18,
301
318
  type: "实弹武器",
302
319
  category: "实弹武器",
320
+ level: 5,
303
321
  damage: 70,
304
322
  armorDamageReduction: 0.1,
305
323
  description: "二十一世纪的武器,经过修改以减少后坐力并提高远程精度",
@@ -315,6 +333,7 @@ var weaponConfig = {
315
333
  id: 19,
316
334
  type: "能量武器",
317
335
  category: "能量武器",
336
+ level: 5,
318
337
  damage: 35,
319
338
  armorDamageReduction: 1,
320
339
  description: "这是在一位高级灵能者的帮助下,解析灵能力量制作出的高科技武器",
@@ -332,6 +351,7 @@ var weaponConfig = {
332
351
  id: 101,
333
352
  type: "能量武器",
334
353
  category: "传奇武器",
354
+ level: 6,
335
355
  damage: 88,
336
356
  armorDamageReduction: 3,
337
357
  description: "一件传奇武器",
@@ -348,6 +368,7 @@ var weaponConfig = {
348
368
  id: 102,
349
369
  type: "能量武器",
350
370
  category: "传奇武器",
371
+ level: 6,
351
372
  damage: 80,
352
373
  armorDamageReduction: -1,
353
374
  description: "一件传奇武器",
@@ -363,6 +384,7 @@ var weaponConfig = {
363
384
  id: 103,
364
385
  type: "实弹武器",
365
386
  category: "传奇武器",
387
+ level: 6,
366
388
  damage: 90,
367
389
  armorDamageReduction: 0,
368
390
  description: "这是传说中的武器",
@@ -380,6 +402,7 @@ var weaponConfig = {
380
402
  id: 104,
381
403
  type: "实弹武器",
382
404
  category: "传奇武器",
405
+ level: 6,
383
406
  damage: 125,
384
407
  armorDamageReduction: -2,
385
408
  description: "一件传奇武器",
@@ -395,6 +418,7 @@ var weaponConfig = {
395
418
  id: 105,
396
419
  type: "能量武器",
397
420
  category: "传奇武器",
421
+ level: 6,
398
422
  damage: 100,
399
423
  armorDamageReduction: 0,
400
424
  description: "优雅而独特的武器",
@@ -408,6 +432,7 @@ var weaponConfig = {
408
432
  id: 106,
409
433
  type: "能量武器",
410
434
  category: "传奇武器",
435
+ level: 6,
411
436
  damage: 100,
412
437
  armorDamageReduction: 1,
413
438
  description: "一件传奇武器",
@@ -423,6 +448,7 @@ var weaponConfig = {
423
448
  id: 107,
424
449
  type: "能量武器",
425
450
  category: "传奇武器",
451
+ level: 6,
426
452
  damage: 80,
427
453
  armorDamageReduction: 0,
428
454
  description: "一件传奇武器",
@@ -438,6 +464,7 @@ var weaponConfig = {
438
464
  id: 108,
439
465
  type: "能量武器",
440
466
  category: "传奇武器",
467
+ level: 6,
441
468
  damage: 90,
442
469
  armorDamageReduction: 0,
443
470
  description: "一件传奇武器",
@@ -690,21 +717,21 @@ var spaceStationCrewConfig = [
690
717
  {
691
718
  professionName: "警卫员下士",
692
719
  effect: "攻击获得的金币+50%",
693
- requirements: "当期伤害榜累计攻击4次及以上",
720
+ requirements: "当期伤害榜累计造成200及以上伤害",
694
721
  Jobtransfer: true,
695
- costcoins: 2e3
722
+ costcoins: 3e3
696
723
  },
697
724
  {
698
725
  professionName: "警卫长",
699
- effect: "攻击伤害+5%,攻击获得的金币+75%",
700
- requirements: "当期伤害榜前二十名;职业为警卫员下士",
726
+ effect: "攻击伤害+5%,当有异形被击败时获得金币(击败者获得双倍金币)",
727
+ requirements: "当期伤害榜累计攻击4次及以上",
701
728
  Jobtransfer: true,
702
729
  costcoins: 3e3
703
730
  },
704
731
  {
705
732
  professionName: "武器中士",
706
- effect: "攻击伤害+15%; 购买武器享有50%的折扣",
707
- requirements: "当期伤害榜累计造成100及以上伤害",
733
+ effect: "攻击伤害+15%; 购买传奇武器不消耗权限次数(可消耗权限次数半价购买传奇武器)",
734
+ requirements: "至少拥有一把6级及以上等级的武器",
708
735
  Jobtransfer: true,
709
736
  costcoins: 3e3
710
737
  },
@@ -762,7 +789,7 @@ var syndicatePirateConfig = [
762
789
  {
763
790
  professionName: "清洁工",
764
791
  effect: "当有异形被击败时获得红晶(击败者获得双倍红晶); 每次攻击额外获得红晶",
765
- requirements: "当期伤害榜前二十名",
792
+ requirements: "当期伤害榜累计攻击4次及以上",
766
793
  Jobtransfer: true,
767
794
  costredcrystal: 20
768
795
  },
@@ -803,10 +830,10 @@ var syndicatePirateConfig = [
803
830
  },
804
831
  {
805
832
  professionName: "指挥官",
806
- effect: "使用红晶升级物品享有50%的折扣;购买光剑(传奇)享有50%的折扣",
807
- requirements: "PK胜利20次及以上;非辛迪加炮灰新兵职业",
833
+ effect: "使用红晶升级物品享有50%的折扣;升级物品时有50%的概率获得双倍加成;购买光剑(传奇)享有50%的折扣",
834
+ requirements: "仓库中至少拥有一个升级5次及以上的物品",
808
835
  Jobtransfer: true,
809
- costredcrystal: 40
836
+ costredcrystal: 30
810
837
  },
811
838
  {
812
839
  professionName: "装甲兵",
@@ -825,9 +852,9 @@ var syndicatePirateConfig = [
825
852
  {
826
853
  professionName: "征募官",
827
854
  effect: "购买DG-3电弧步枪(传奇)享有50%的折扣",
828
- requirements: "",
829
- Jobtransfer: false,
830
- costredcrystal: 10
855
+ requirements: "PK胜利20次及以上",
856
+ Jobtransfer: true,
857
+ costredcrystal: 20
831
858
  },
832
859
  {
833
860
  professionName: "辛迪加炮灰新兵",
@@ -851,6 +878,7 @@ async function checkTransferRequirements(ctx, handle, profession) {
851
878
  handle,
852
879
  level: { $gte: 3 }
853
880
  });
881
+ let hasLevel6Weapon = false;
854
882
  switch (profession) {
855
883
  case "深空矿工":
856
884
  const [miningRecord] = await ctx.database.get("ggcevo_Mining", { handle });
@@ -868,30 +896,24 @@ async function checkTransferRequirements(ctx, handle, profession) {
868
896
  message: totalReturns >= 4 ? "" : `需要探索返回次数达到4次及以上(当前${totalReturns}次)`
869
897
  };
870
898
  }
871
- case "警卫员下士":
899
+ case "警卫长":
872
900
  if (!mainBoss) return { success: false, message: "当前暂无伤害榜。" };
873
901
  return {
874
902
  success: totalAttack >= 4,
875
903
  message: `需要当期伤害榜累计攻击4次及以上(当前${totalAttack}次)`
876
904
  };
877
- case "警卫长": {
878
- if (careerData?.career !== "警卫员下士") {
879
- return { success: false, message: "需要当前职业为警卫员下士" };
880
- }
905
+ case "警卫员下士": {
881
906
  if (!mainBoss) return { success: false, message: "当前暂无伤害榜。" };
882
- const top20 = await ctx.database.select("ggcevo_boss_damage").where({ bossGroupId: mainBoss.groupId }).orderBy("totalDamage", "desc").limit(20).execute();
883
- const isInTop202 = top20.some((r) => r.handle === handle);
884
907
  return {
885
- success: isInTop202,
886
- message: isInTop202 ? "" : "需要当期伤害榜前二十名"
887
- // 消息提示更新为前二十名
908
+ success: totalDamage >= 200,
909
+ message: `需要当期伤害榜累计造成200及以上伤害(当前${totalDamage})`
888
910
  };
889
911
  }
890
912
  case "武器中士":
891
- if (!mainBoss) return { success: false, message: "当前暂无伤害榜。" };
913
+ hasLevel6Weapon = weapons.some((weapon) => weapon.level >= 6);
892
914
  return {
893
- success: totalDamage >= 100,
894
- message: `需要当期伤害榜累计造成100及以上伤害(当前${totalDamage})`
915
+ success: hasLevel6Weapon,
916
+ message: hasLevel6Weapon ? "" : "需要至少拥有一把6级及以上等级的武器"
895
917
  };
896
918
  // +++ 新增舰长检查 +++
897
919
  case "舰长": {
@@ -940,7 +962,7 @@ async function checkTransferRequirements(ctx, handle, profession) {
940
962
  }
941
963
  ;
942
964
  case "枪手":
943
- const hasLevel6Weapon = weapons.some((weapon) => weapon.level >= 6);
965
+ hasLevel6Weapon = weapons.some((weapon) => weapon.level >= 6);
944
966
  return {
945
967
  success: hasLevel6Weapon,
946
968
  message: hasLevel6Weapon ? "" : "需要至少拥有一把6级及以上等级的武器"
@@ -967,14 +989,7 @@ async function checkTransferRequirements(ctx, handle, profession) {
967
989
  message: hasModifiedWeapon ? "" : "需要至少拥有一把改装了3个模块的武器"
968
990
  };
969
991
  }
970
- // +++ 新增指挥官检查 +++
971
- case "指挥官": {
972
- if (careerData?.career === "辛迪加炮灰新兵") {
973
- return {
974
- success: false,
975
- message: "非辛迪加炮灰新兵职业才能转职为指挥官"
976
- };
977
- }
992
+ case "征募官": {
978
993
  const [pkProfile] = await ctx.database.get("ggcevo_pk", { handle });
979
994
  if (!pkProfile) {
980
995
  return {
@@ -989,11 +1004,9 @@ async function checkTransferRequirements(ctx, handle, profession) {
989
1004
  }
990
1005
  case "清洁工":
991
1006
  if (!mainBoss) return { success: false, message: "当前暂无伤害榜。" };
992
- const cleanTop20 = await ctx.database.select("ggcevo_boss_damage").where({ bossGroupId: mainBoss.groupId }).orderBy("totalDamage", "desc").limit(20).execute();
993
- const isInTop20 = cleanTop20.some((r) => r.handle === handle);
994
1007
  return {
995
- success: isInTop20,
996
- message: "需要当期伤害榜前二十名"
1008
+ success: totalAttack >= 4,
1009
+ message: `需要当期伤害榜累计攻击4次及以上(当前${totalAttack}次)`
997
1010
  };
998
1011
  case "辛迪加财务经理":
999
1012
  return {
@@ -1011,6 +1024,18 @@ async function checkTransferRequirements(ctx, handle, profession) {
1011
1024
  message: hasDeviceTool ? "" : "需要仓库中拥有一个从黑市订购的设备工具物品"
1012
1025
  };
1013
1026
  }
1027
+ case "指挥官": {
1028
+ const warehouseItems2 = await ctx.database.get("ggcevo_warehouse", {
1029
+ handle
1030
+ });
1031
+ const hasUpgradedItem = warehouseItems2.some(
1032
+ (item) => (item.upgrades || 0) >= 5
1033
+ );
1034
+ return {
1035
+ success: hasUpgradedItem,
1036
+ message: hasUpgradedItem ? "" : "需要仓库中至少拥有一个升级5次及以上的物品"
1037
+ };
1038
+ }
1014
1039
  default:
1015
1040
  return { success: false, message: "未知职业要求" };
1016
1041
  }
@@ -1068,32 +1093,32 @@ var Spacestationtechnology = [
1068
1093
  {
1069
1094
  level: 1,
1070
1095
  cost: 500,
1071
- description: "提升空间站武器等级,升级武器享有5%的折扣",
1072
- careerBonus: "升级武器额外享有5%的折扣"
1096
+ description: "提升空间站武器等级,购买I类及以下武器享有25%的折扣",
1097
+ careerBonus: "购买I类及以下武器额外享有25%的折扣"
1073
1098
  },
1074
1099
  {
1075
1100
  level: 2,
1076
1101
  cost: 1500,
1077
- description: "提升空间站武器等级,升级武器享有10%的折扣",
1078
- careerBonus: "升级武器额外享有10%的折扣"
1102
+ description: "提升空间站武器等级,购买II类及以下武器享有25%的折扣",
1103
+ careerBonus: "购买II类及以下武器额外享有25%的折扣"
1079
1104
  },
1080
1105
  {
1081
1106
  level: 3,
1082
1107
  cost: 2550,
1083
- description: "提升空间站武器等级,升级武器享有15%的折扣",
1084
- careerBonus: "升级武器额外享有15%的折扣"
1108
+ description: "提升空间站武器等级,购买III类武器享有25%的折扣",
1109
+ careerBonus: "购买III类及以下武器额外享有25%的折扣"
1085
1110
  },
1086
1111
  {
1087
1112
  level: 4,
1088
1113
  cost: 3950,
1089
- description: "提升空间站武器等级,升级武器享有20%的折扣",
1090
- careerBonus: "升级武器额外享有20%的折扣"
1114
+ description: "提升空间站武器等级,购买IV类及以下武器享有25%的折扣",
1115
+ careerBonus: "购买IV类及以下武器额外享有25%的折扣"
1091
1116
  },
1092
1117
  {
1093
1118
  level: 5,
1094
1119
  cost: 4650,
1095
- description: "提升空间站武器等级,升级武器享有25%的折扣; 解锁传奇武器购买权限1次",
1096
- careerBonus: "升级武器额外享有25%的折扣; 解锁全部传奇武器购买权限(仅限武器中士)"
1120
+ description: "提升空间站武器等级,购买V类及以下武器享有25%的折扣; 获得传奇武器购买权限1次",
1121
+ careerBonus: "购买V类及以下武器额外享有25%的折扣; 升级武器享有20%的折扣"
1097
1122
  }
1098
1123
  ]
1099
1124
  },
@@ -2607,7 +2632,7 @@ var BattleEffectProcessor = {
2607
2632
  if (!isFireDamage && currentStacks < maxStacks) {
2608
2633
  updates.skillStacksChanged = 1;
2609
2634
  const newStacks = currentStacks + 1;
2610
- messages.push(`🔥 【灼烧粘液】叠层:当前${newStacks}/20层`);
2635
+ messages.push(`🔥 【灼烧粘液】生效:获得1层「灼烧粘液」`);
2611
2636
  }
2612
2637
  if (isFireDamage && currentStacks > 0) {
2613
2638
  const healAmount = currentStacks * 10;
@@ -2632,12 +2657,12 @@ var BattleEffectProcessor = {
2632
2657
  };
2633
2658
  }, "handleBurningSlime"),
2634
2659
  // 腐蚀胆汁 - 群体回复机制
2635
- handleCorrosiveBile: /* @__PURE__ */ __name(function(targetBoss, activeBosses) {
2660
+ handleCorrosiveBile: /* @__PURE__ */ __name(function(targetBoss, activeBosses, isHighStackHeal = false) {
2636
2661
  const messages = [];
2637
2662
  const otherUpdates = [];
2638
2663
  let targetUpdates = null;
2639
2664
  const requiredStacks = 10;
2640
- if (!targetBoss.skills.includes("腐蚀胆汁")) {
2665
+ if (!targetBoss.skills.includes("腐蚀胆汁") || isHighStackHeal) {
2641
2666
  return null;
2642
2667
  }
2643
2668
  const currentStacks = targetBoss.skillStacks || 0;
@@ -2811,7 +2836,7 @@ var BattleEffectProcessor = {
2811
2836
  nerfMultiplier = baseReduction + extraReduction;
2812
2837
  if (nerfMultiplier > 0) {
2813
2838
  const reductionPercent = Math.round(nerfMultiplier * 100);
2814
- const offspringMsg = hasLivingOffspring ? "(存在子代,额外加成)" : "";
2839
+ const offspringMsg = hasLivingOffspring ? "" : "";
2815
2840
  messages.push(`💣 【炼狱爆弹】生效:当前${currentStacks}层「灼烧粘液」,受到的伤害-${reductionPercent}%${offspringMsg}`);
2816
2841
  }
2817
2842
  return { nerfMultiplier, messages };
@@ -4464,7 +4489,7 @@ function applyPassiveEffects(targetBoss, activeBosses, weaponName, damage, hasCr
4464
4489
  bileDetonationTrigger = burningSlimeResult.isHighStackHeal || false;
4465
4490
  }
4466
4491
  const bileEffects = [
4467
- { effect: BattleEffectProcessor.handleCorrosiveBile, args: [targetBoss, activeBosses] },
4492
+ { effect: BattleEffectProcessor.handleCorrosiveBile, args: [targetBoss, activeBosses, bileDetonationTrigger] },
4468
4493
  { effect: BattleEffectProcessor.handleFlameBreath, args: [targetBoss, activeBosses] }
4469
4494
  ];
4470
4495
  for (const effectItem of bileEffects) {
@@ -5299,6 +5324,18 @@ var ggcevoUpdates = [
5299
5324
  - 提高“绝对零度”和“脉冲干扰”任务金币奖励,降低“破甲先锋”和“烈火燎原”任务金币奖励
5300
5325
  - 提高“自动采掘机器人”和“CRED-17”每次升级区间至5%-15%
5301
5326
  `.trim()
5327
+ },
5328
+ {
5329
+ version: "1.6.15",
5330
+ time: "2025-07-10",
5331
+ content: `
5332
+ - 重制了人类阵营的“武器中士”和“警卫长”
5333
+ - 修改了辛迪加海盗阵营的“清洁工”转职要求
5334
+ - 开放了辛迪加海盗阵营的“征募管”(半成品)转职
5335
+ - 重制了人类联盟的科技“武器系统”
5336
+ - 指令“升级”拆分成“升级科技”和“升级武器”
5337
+ - 新增“竞猜”功能
5338
+ `.trim()
5302
5339
  }
5303
5340
  ];
5304
5341
  function compareVersions(a, b) {
@@ -5783,8 +5820,8 @@ async function handleWeaponUpgrade(ctx, handle, target) {
5783
5820
  const [weaponTech] = await ctx.database.get("ggcevo_tech", { handle, techId: 2 }).catch(() => [{ level: 0 }]);
5784
5821
  techLevel = Math.min(Math.max(weaponTech?.level || 0, 0), 5);
5785
5822
  const isCareerMatch = weaponTechConfig?.careerNames.includes(careerData?.career);
5786
- const BASE_DISCOUNTS = [5, 10, 15, 20, 25];
5787
- const CAREER_DISCOUNTS = [10, 20, 30, 40, 50];
5823
+ const BASE_DISCOUNTS = [0, 0, 0, 0, 0];
5824
+ const CAREER_DISCOUNTS = [0, 0, 0, 0, 20];
5788
5825
  const baseDiscount = techLevel > 0 ? BASE_DISCOUNTS[techLevel - 1] : 0;
5789
5826
  const careerDiscount = isCareerMatch && techLevel > 0 ? CAREER_DISCOUNTS[techLevel - 1] : 0;
5790
5827
  const weaponDiscount = Math.max(baseDiscount, careerDiscount);
@@ -5872,8 +5909,8 @@ async function generateUpgradePriceList(ctx, handle) {
5872
5909
  const weaponTechConfig = Spacestationtechnology.find((t) => t.techId === 2);
5873
5910
  techLevel = Math.min(techData?.level || 0, 5);
5874
5911
  const isCareerMatch = weaponTechConfig?.careerNames.includes(careerData?.career);
5875
- const BASE_DISCOUNTS = [5, 10, 15, 20, 25];
5876
- const CAREER_DISCOUNTS = [10, 20, 30, 40, 50];
5912
+ const BASE_DISCOUNTS = [0, 0, 0, 0, 0];
5913
+ const CAREER_DISCOUNTS = [0, 0, 0, 0, 20];
5877
5914
  const baseDiscount = techLevel > 0 ? BASE_DISCOUNTS[techLevel - 1] : 0;
5878
5915
  const careerDiscount = isCareerMatch ? CAREER_DISCOUNTS[techLevel - 1] : 0;
5879
5916
  techDiscountRate = Math.max(baseDiscount, careerDiscount);
@@ -5947,7 +5984,7 @@ ${priceInfo}`);
5947
5984
  return [
5948
5985
  "⚡ 武器升级价格表 ⚡",
5949
5986
  `武器等级上限: ${maxLevel}级${isGunslinger ? " (枪手职业)" : ""}`,
5950
- "使用「升级 武器名称」对武器进行等级升级",
5987
+ "使用「升级武器 武器名称」对武器进行等级升级",
5951
5988
  ...discountNotice,
5952
5989
  "====================",
5953
5990
  ...priceDetails,
@@ -6002,6 +6039,16 @@ var legendaryDiscounts = {
6002
6039
  "外星电浆": ["装甲兵"],
6003
6040
  "核聚变重炮": ["破坏者"]
6004
6041
  };
6042
+ var GUESSING_ITEMS = [
6043
+ {
6044
+ id: 1,
6045
+ description: "猜测下一个复活主宰的名字",
6046
+ odds: 3,
6047
+ status: "open"
6048
+ }
6049
+ // 可以继续添加更多竞猜项目
6050
+ // { id: 2, description: '其他竞猜项目', odds: 2.5, status: 'closed' },
6051
+ ];
6005
6052
 
6006
6053
  // src/boss/damagecalculation.ts
6007
6054
  async function calculateTotalDamage(ctx, session, config, equippedWeapon, targetBoss, careerData) {
@@ -6248,30 +6295,65 @@ __name(calculateRankAdditive, "calculateRankAdditive");
6248
6295
  async function getCleanerRewardBroadcast(ctx, boss, killerHandle, killerName) {
6249
6296
  const bossType = boss.type;
6250
6297
  const bossName = boss.name;
6251
- let baseReward = 0;
6298
+ const broadcastMessages = [];
6299
+ let cleanerBaseReward = 0;
6252
6300
  if (["巢穴雷兽", "巢穴战士", "巢穴甲虫"].includes(bossName)) {
6253
- baseReward = 2;
6301
+ cleanerBaseReward = 2;
6254
6302
  } else {
6255
- baseReward = bossType === "主宰" ? 10 : 5;
6303
+ cleanerBaseReward = bossType === "主宰" ? 10 : 5;
6256
6304
  }
6257
6305
  const allCleaners = await ctx.database.get("ggcevo_careers", {
6258
6306
  career: "清洁工"
6259
6307
  });
6260
- if (!allCleaners.length) return [];
6261
- let killerBonus = false;
6262
- for (const cleaner of allCleaners) {
6263
- let rewardAmount = baseReward;
6264
- if (cleaner.handle === killerHandle) {
6265
- rewardAmount *= 2;
6266
- killerBonus = true;
6308
+ let cleanerKillerBonus = false;
6309
+ if (allCleaners.length > 0) {
6310
+ for (const cleaner of allCleaners) {
6311
+ let rewardAmount = cleanerBaseReward;
6312
+ if (cleaner.handle === killerHandle) {
6313
+ rewardAmount *= 2;
6314
+ cleanerKillerBonus = true;
6315
+ }
6316
+ await ctx.database.upsert("ggcevo_careers", [{
6317
+ handle: cleaner.handle,
6318
+ redcrystal: (cleaner.redcrystal || 0) + rewardAmount
6319
+ }], ["handle"]);
6267
6320
  }
6268
- await ctx.database.upsert("ggcevo_careers", [{
6269
- handle: cleaner.handle,
6270
- redcrystal: (cleaner.redcrystal || 0) + rewardAmount
6271
- }], ["handle"]);
6321
+ const cleanerMessage = `🧹 清洁工职业因清理 ${bossName} 尸体,获得 ${cleanerBaseReward} 红晶${cleanerKillerBonus ? ` (击败者 ${killerName} 获得双倍奖励)` : ""}`;
6322
+ broadcastMessages.push(cleanerMessage);
6272
6323
  }
6273
- const rewardMessage = `🧹 清洁工职业因清理 ${bossName} 获得 ${baseReward} 红晶${killerBonus ? ` (击杀者 ${killerName} 获得双倍)` : ""}`;
6274
- return [rewardMessage];
6324
+ let guardBaseReward = 0;
6325
+ if (["巢穴雷兽", "巢穴战士", "巢穴甲虫"].includes(bossName)) {
6326
+ guardBaseReward = 200;
6327
+ } else {
6328
+ guardBaseReward = bossType === "主宰" ? 1e3 : 500;
6329
+ }
6330
+ const allGuards = await ctx.database.get("ggcevo_careers", {
6331
+ career: "警卫长"
6332
+ });
6333
+ if (allGuards.length > 0) {
6334
+ const guardHandles = allGuards.map((g) => g.handle);
6335
+ const signRecords = await ctx.database.get("ggcevo_sign", {
6336
+ handle: { $in: guardHandles }
6337
+ });
6338
+ const signMap = new Map(signRecords.map((record) => [record.handle, record]));
6339
+ let guardKillerBonus = false;
6340
+ for (const guard of allGuards) {
6341
+ let rewardAmount = guardBaseReward;
6342
+ if (guard.handle === killerHandle) {
6343
+ rewardAmount *= 2;
6344
+ guardKillerBonus = true;
6345
+ }
6346
+ const currentSignRecord = signMap.get(guard.handle);
6347
+ const currentTotal = currentSignRecord?.totalRewards || 0;
6348
+ await ctx.database.upsert("ggcevo_sign", [{
6349
+ handle: guard.handle,
6350
+ totalRewards: currentTotal + rewardAmount
6351
+ }], ["handle"]);
6352
+ }
6353
+ const guardMessage = `👮 警卫长职业因 ${bossName} 阵亡,获得 ${guardBaseReward} 金币${guardKillerBonus ? ` (击败者 ${killerName} 获得双倍奖励)` : ""}`;
6354
+ broadcastMessages.push(guardMessage);
6355
+ }
6356
+ return broadcastMessages;
6275
6357
  }
6276
6358
  __name(getCleanerRewardBroadcast, "getCleanerRewardBroadcast");
6277
6359
  async function handleBossDefeatRewards(ctx, targetBoss) {
@@ -6571,7 +6653,6 @@ async function handleDeathTargets(ctx, deadTargets, killerName, killerHandle) {
6571
6653
  const now = /* @__PURE__ */ new Date();
6572
6654
  let nextRespawn = /* @__PURE__ */ new Date();
6573
6655
  const hours = now.getHours();
6574
- console.log(`当前小时:${hours}`);
6575
6656
  if (hours < 12) {
6576
6657
  nextRespawn.setHours(12, 0, 0, 0);
6577
6658
  } else {
@@ -6638,8 +6719,6 @@ async function calculateRewards(ctx, handle, totalDamage) {
6638
6719
  careerMultiplier = 50;
6639
6720
  careerMessage = "🛡️ 警卫员下士职业:+50%金币";
6640
6721
  } else if (career === "警卫长") {
6641
- careerMultiplier = 75;
6642
- careerMessage = "🛡️ 警卫长职业:+75%金币";
6643
6722
  }
6644
6723
  const totalBonusPercent = careerMultiplier + techBonusPercent;
6645
6724
  const totalBonusFactor = 1 + totalBonusPercent / 100;
@@ -7245,7 +7324,8 @@ function apply(ctx, config) {
7245
7324
  handle: "string",
7246
7325
  itemId: "unsigned",
7247
7326
  quantity: "unsigned",
7248
- bonus: "unsigned"
7327
+ bonus: "unsigned",
7328
+ upgrades: "unsigned"
7249
7329
  }, {
7250
7330
  primary: ["handle", "itemId"]
7251
7331
  });
@@ -7306,18 +7386,36 @@ function apply(ctx, config) {
7306
7386
  }, {
7307
7387
  primary: "handle"
7308
7388
  });
7389
+ ctx.model.extend("ggcevo_global_stats", {
7390
+ groupId: "string",
7391
+ updatedAt: "timestamp",
7392
+ rankdate: "timestamp"
7393
+ }, {
7394
+ primary: "groupId"
7395
+ });
7396
+ ctx.model.extend("ggcevo_guess", {
7397
+ handle: "string",
7398
+ name: "string",
7399
+ itemId: "unsigned",
7400
+ guessContent: "string",
7401
+ amount: "unsigned",
7402
+ wins: "unsigned",
7403
+ createdAt: "timestamp"
7404
+ }, {
7405
+ primary: ["handle", "itemId"]
7406
+ });
7309
7407
  ctx.setInterval(async () => {
7310
7408
  const totalBosses = await ctx.database.select("ggcevo_boss").execute((row) => import_koishi.$.count(row.name));
7311
- const groupId = [...config.groupId];
7409
+ const groupIds = [...config.groupId];
7312
7410
  if (totalBosses === 0) {
7313
7411
  const firstBoss = await activateNextBossGroup(ctx);
7314
- await ctx.broadcast(groupId, `🔄 咕咕之战系统已初始化,首个主宰【${firstBoss.name}】已登场!`);
7412
+ await ctx.broadcast(groupIds, `🔄 咕咕之战系统已初始化,首个主宰【${firstBoss.name}】已登场!`);
7315
7413
  return;
7316
7414
  }
7317
7415
  const now = /* @__PURE__ */ new Date();
7318
7416
  const expiredGroups = await ctx.database.select("ggcevo_boss").where({
7319
- type: "主宰",
7320
- respawnTime: { $lte: now },
7417
+ respawnTime: { $gt: now },
7418
+ // 修改为大于当前时间
7321
7419
  isActive: false
7322
7420
  }).execute();
7323
7421
  for (const group of expiredGroups) {
@@ -7326,10 +7424,48 @@ function apply(ctx, config) {
7326
7424
  await ctx.database.remove("ggcevo_boss", {});
7327
7425
  await ctx.database.set("ggcevo_weapons", {}, { comboCount: 0 });
7328
7426
  const newBossGroup = await activateNextBossGroup(ctx, currentGroupId);
7329
- await ctx.broadcast(
7330
- groupId,
7331
- `🔄 新的主宰【${newBossGroup.name}】组已刷新,快去挑战吧!`
7332
- );
7427
+ const nextBossName = newBossGroup.name;
7428
+ const guessingRecords = await ctx.database.get("ggcevo_guess", {
7429
+ itemId: 1
7430
+ });
7431
+ if (guessingRecords.length > 0) {
7432
+ const winners = guessingRecords.filter(
7433
+ (r) => r.guessContent === nextBossName
7434
+ );
7435
+ const winMessages = [];
7436
+ for (const winner of winners) {
7437
+ const prize = Math.floor(winner.amount * 3);
7438
+ const [signInfo] = await ctx.database.get("ggcevo_sign", {
7439
+ handle: winner.handle
7440
+ });
7441
+ if (signInfo) {
7442
+ await ctx.database.set("ggcevo_sign", { handle: winner.handle }, {
7443
+ totalRewards: signInfo.totalRewards + prize
7444
+ });
7445
+ winMessages.push(`${winner.name}: 获得${prize}金币`);
7446
+ }
7447
+ }
7448
+ await ctx.database.set("ggcevo_guess", {
7449
+ itemId: 1
7450
+ }, {
7451
+ guessContent: "",
7452
+ // 清空竞猜内容
7453
+ amount: 0
7454
+ // 重置竞猜金额
7455
+ });
7456
+ ctx.logger("ggcevo").info(`竞猜结算: ${winners.length}位玩家猜中新主宰【${nextBossName}】`);
7457
+ const broadcastMsg = [
7458
+ `🔄 新的主宰【${nextBossName}】已刷新!`,
7459
+ ...winMessages.length > 0 ? [
7460
+ `🎉 猜中新主宰的玩家:`,
7461
+ ...winMessages
7462
+ // 直接显示玩家名称和对应金额
7463
+ ] : []
7464
+ ].join("\n");
7465
+ await ctx.broadcast(groupIds, broadcastMsg);
7466
+ } else {
7467
+ await ctx.broadcast(groupIds, `🔄 新的主宰【${nextBossName}】已刷新!`);
7468
+ }
7333
7469
  }
7334
7470
  }, 60 * 1e3);
7335
7471
  ctx.setInterval(async () => {
@@ -7355,8 +7491,8 @@ function apply(ctx, config) {
7355
7491
  ctx.setInterval(async () => {
7356
7492
  if (config.autorank) {
7357
7493
  try {
7358
- const ggcmap = await ctx.database.get("sc2arcade_map", { regionId: 3, mapId: 165561 });
7359
- const lastdate = ggcmap[0].lastdate;
7494
+ const ggcmap = await ctx.database.get("ggcevo_global_stats", {});
7495
+ const lastdate = ggcmap[0].updatedAt;
7360
7496
  let currentMaxDate = new Date(lastdate);
7361
7497
  let nextCursor = null;
7362
7498
  let shouldContinue = true;
@@ -7405,8 +7541,8 @@ function apply(ctx, config) {
7405
7541
  } while (nextCursor && shouldContinue);
7406
7542
  if (pageMaxDate > currentMaxDate) {
7407
7543
  currentMaxDate = pageMaxDate;
7408
- await ctx.database.set("sc2arcade_map", { regionId: 3, mapId: 165561 }, {
7409
- lastdate: new Date(currentMaxDate.toISOString())
7544
+ await ctx.database.set("ggcevo_global_stats", {}, {
7545
+ updatedAt: new Date(currentMaxDate.toISOString())
7410
7546
  });
7411
7547
  }
7412
7548
  } catch (err) {
@@ -7960,8 +8096,8 @@ ${ticketMessage}${effectMessage}`;
7960
8096
  });
7961
8097
  ctx.command("ggcevo/胜点榜数据同步", { authority: 3 }).action(async () => {
7962
8098
  try {
7963
- const ggcmap = await ctx.database.get("sc2arcade_map", { regionId: 3, mapId: 165561 });
7964
- const lastdate = ggcmap[0].lastdate;
8099
+ const ggcmap = await ctx.database.get("ggcevo_global_stats", {});
8100
+ const lastdate = ggcmap[0].updatedAt;
7965
8101
  let currentMaxDate = new Date(lastdate);
7966
8102
  let nextCursor = null;
7967
8103
  let shouldContinue = true;
@@ -8010,8 +8146,8 @@ ${ticketMessage}${effectMessage}`;
8010
8146
  } while (nextCursor && shouldContinue);
8011
8147
  if (pageMaxDate > currentMaxDate) {
8012
8148
  currentMaxDate = pageMaxDate;
8013
- await ctx.database.set("sc2arcade_map", { regionId: 3, mapId: 165561 }, {
8014
- lastdate: new Date(currentMaxDate.toISOString())
8149
+ await ctx.database.set("ggcevo_global_stats", {}, {
8150
+ updatedAt: new Date(currentMaxDate.toISOString())
8015
8151
  });
8016
8152
  }
8017
8153
  return "✅ 胜点榜数据同步成功!";
@@ -8020,7 +8156,7 @@ ${ticketMessage}${effectMessage}`;
8020
8156
  return "服务器繁忙,请稍后尝试。";
8021
8157
  }
8022
8158
  });
8023
- ctx.command("ggcevo/胜点榜 [page]").usage("输入 胜点榜 [页码] 查看对应页的排行榜,每页10条").action(async ({ session }, page) => {
8159
+ ctx.command("ggcevo/胜点榜 [page]").alias("排行榜").usage("输入 胜点榜 [页码] 查看对应页的排行榜,每页10条").action(async ({ session }, page) => {
8024
8160
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
8025
8161
  if (!profile) return "🔒 需要先绑定游戏句柄。";
8026
8162
  const pageNum = parseInt(page) || 1;
@@ -8038,8 +8174,8 @@ ${ticketMessage}${effectMessage}`;
8038
8174
  displayName: await checkSensitiveWord(ctx, item.name) ? item.name : (item.name[0] || "") + "***"
8039
8175
  }))
8040
8176
  );
8041
- const ggcmap = await ctx.database.get("sc2arcade_map", { regionId: 3, mapId: 165561 });
8042
- const lastdate = ggcmap[0].lastdate;
8177
+ const ggcmap = await ctx.database.get("ggcevo_global_stats", {});
8178
+ const lastdate = ggcmap[0].updatedAt;
8043
8179
  const rankingText = processedRecords.map(
8044
8180
  (item, index) => `${offset + index + 1}. ${item.displayName} | 积分: ${item.rank} | 胜率: ${item.matches === 0 ? "0.00%" : (item.wins / item.matches * 100).toFixed(2) + "%"}`
8045
8181
  ).join("\n");
@@ -8213,6 +8349,14 @@ ${ticketMessage}${effectMessage}`;
8213
8349
  `;
8214
8350
  report += `- 参与玩家:${otherPlayers.length}人`;
8215
8351
  await session.send(report);
8352
+ if (session.guildId) {
8353
+ await ctx.database.upsert("ggcevo_global_stats", [{
8354
+ groupId: session.guildId,
8355
+ // 使用当前群组ID作为主键
8356
+ rankdate: /* @__PURE__ */ new Date()
8357
+ // 当前时间
8358
+ }], ["groupId"]);
8359
+ }
8216
8360
  return `${currentSeason}赛季结算数据已更新!`;
8217
8361
  function getRewardByRank(rank) {
8218
8362
  const rewards = [
@@ -9050,9 +9194,30 @@ ${protectionList}
9050
9194
  if (!profile) return "⚠️ 需要先绑定游戏句柄";
9051
9195
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
9052
9196
  const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
9197
+ const playerCareer = careerData?.career || "";
9198
+ const playerGroup = careerData?.group || "";
9199
+ const [weaponTech] = await ctx.database.get("ggcevo_tech", { handle, techId: 2 });
9200
+ const techLevel = weaponTech?.level || 0;
9201
+ const [legendaryPerm] = await ctx.database.get("ggcevo_permissions", { handle });
9202
+ const legendaryPermission = legendaryPerm?.legendarypermissions || 0;
9203
+ const techConfigData = Spacestationtechnology.find((tech) => tech.techId === 2);
9053
9204
  const discountDetails = [];
9054
- if (careerData?.career === "武器中士") {
9055
- discountDetails.push(`▸ 🎖️ 武器中士职业:50%折扣`);
9205
+ const romanLevels = {
9206
+ 1: "I",
9207
+ 2: "II",
9208
+ 3: "III",
9209
+ 4: "IV",
9210
+ 5: "V"
9211
+ };
9212
+ if (playerGroup === "人类联盟" && techLevel > 0 && techConfigData) {
9213
+ const isCareer = techConfigData.careerNames.includes(playerCareer);
9214
+ const totalDiscount = isCareer ? 50 : 25;
9215
+ const applicableLevels = [];
9216
+ for (let level = 1; level <= techLevel; level++) {
9217
+ applicableLevels.push(romanLevels[level]);
9218
+ }
9219
+ const levelRange = applicableLevels.join("、");
9220
+ discountDetails.push(`▸ 🔧 武器系统Lv${techLevel}: ${totalDiscount}%折扣 (适用${levelRange}类武器)`);
9056
9221
  }
9057
9222
  const activeWish = await ctx.database.get("ggcevo_wish", {
9058
9223
  handle,
@@ -9069,12 +9234,11 @@ ${protectionList}
9069
9234
  return stats;
9070
9235
  }, {});
9071
9236
  if (!category) {
9237
+ const discountInfo = discountDetails.length > 0 ? [`💰 当前折扣信息:`, ...discountDetails, "===================="] : [];
9072
9238
  return [
9073
9239
  "🏪 咕咕武器库分类 🏪",
9074
9240
  '使用 "武器库 分类名称" 查看详细列表',
9075
- discountDetails.length > 0 && `💰 折扣明细:
9076
- ${discountDetails.join("\n")}`,
9077
- "====================",
9241
+ ...discountInfo,
9078
9242
  ...Object.entries(categoryStats).map(([catName, count]) => `▸ ${catName} (${count}种)`),
9079
9243
  "===================="
9080
9244
  ].filter(Boolean).join("\n");
@@ -9083,15 +9247,42 @@ ${discountDetails.join("\n")}`,
9083
9247
  return `无效武器分类,可用分类:
9084
9248
  ${Object.keys(categoryStats).join("、")}`;
9085
9249
  }
9086
- const displayDiscounts = category === "传奇武器" ? discountDetails.filter((d) => !d.includes("蚱蜢优购")) : discountDetails;
9087
- const items = Object.entries(weaponConfig).filter(([_, config2]) => config2.category === category && config2.price !== 0).map(([name2, config2]) => {
9250
+ let displayDiscounts = [];
9251
+ if (category === "传奇武器" && playerCareer === "武器中士" && legendaryPermission > 0) {
9252
+ displayDiscounts.push("▸ 🎖️ 武器中士职业:50%折扣");
9253
+ } else {
9254
+ displayDiscounts = [...discountDetails];
9255
+ }
9256
+ const getWeaponDiscount = /* @__PURE__ */ __name((configLevel) => {
9257
+ const BASE_DISCOUNT = 25;
9258
+ const CAREER_DISCOUNT = 25;
9259
+ const GRASSHOPPER_DISCOUNT = 20;
9260
+ const LEGENDARY_WEAPON_MASTER_DISCOUNT = 50;
9088
9261
  let applicableDiscount = 0;
9089
- if (careerData?.career === "武器中士") {
9090
- applicableDiscount += 50;
9091
- }
9092
- if (config2.category !== "传奇武器" && activeWish) {
9093
- applicableDiscount += 20;
9262
+ const discountSources = [];
9263
+ if (category === "传奇武器") {
9264
+ if (playerCareer === "武器中士" && legendaryPermission > 0) {
9265
+ applicableDiscount += LEGENDARY_WEAPON_MASTER_DISCOUNT;
9266
+ discountSources.push(`武器中士${LEGENDARY_WEAPON_MASTER_DISCOUNT}%`);
9267
+ }
9268
+ } else {
9269
+ if (playerGroup === "人类联盟" && techLevel > 0 && configLevel <= techLevel) {
9270
+ applicableDiscount += BASE_DISCOUNT;
9271
+ discountSources.push(`科技${BASE_DISCOUNT}%`);
9272
+ }
9273
+ if (playerGroup === "人类联盟" && techConfigData?.careerNames.includes(playerCareer) && techLevel > 0 && configLevel <= techLevel) {
9274
+ applicableDiscount += CAREER_DISCOUNT;
9275
+ discountSources.push(`职业${CAREER_DISCOUNT}%`);
9276
+ }
9277
+ if (activeWish) {
9278
+ applicableDiscount += GRASSHOPPER_DISCOUNT;
9279
+ discountSources.push(`蚱蜢${GRASSHOPPER_DISCOUNT}%`);
9280
+ }
9094
9281
  }
9282
+ return { applicableDiscount, discountSources };
9283
+ }, "getWeaponDiscount");
9284
+ const items = Object.entries(weaponConfig).filter(([_, config2]) => config2.category === category && config2.price !== 0).map(([name2, config2]) => {
9285
+ const { applicableDiscount, discountSources } = getWeaponDiscount(config2.level);
9095
9286
  let priceDisplay = `${config2.price}金币`;
9096
9287
  if (applicableDiscount > 0) {
9097
9288
  const discountedPrice = Math.floor(config2.price * (100 - applicableDiscount) / 100);
@@ -9110,7 +9301,7 @@ ${Object.keys(categoryStats).join("、")}`;
9110
9301
  return `护甲减伤:${config2.armorDamageReduction}(每点护甲增加${Math.abs(config2.armorDamageReduction)}点伤害)`;
9111
9302
  }
9112
9303
  })();
9113
- return [
9304
+ const weaponInfo = [
9114
9305
  `【${name2}】`,
9115
9306
  `武器类型:${config2.type}`,
9116
9307
  `基础伤害:${config2.damage}`,
@@ -9121,14 +9312,20 @@ ${Object.keys(categoryStats).join("、")}`;
9121
9312
  tagEffectsDesc,
9122
9313
  `描述:${config2.description}`,
9123
9314
  "------------------"
9124
- ].filter(Boolean).join("\n");
9315
+ ];
9316
+ if (category !== "传奇武器") {
9317
+ weaponInfo.splice(1, 0, `武器等级:${romanLevels[config2.level]}`);
9318
+ }
9319
+ return weaponInfo.filter(Boolean).join("\n");
9125
9320
  });
9126
9321
  const permissionNotice = category === "传奇武器" ? "⚠️ 购买传奇武器要求:人类联盟阵营+武器系统5级+传奇武器购买权限" : null;
9322
+ const techUpgradeNotice = playerGroup === "人类联盟" && techLevel === 0 && category !== "传奇武器" ? "⚠️ 提示:提升武器系统等级可获得额外折扣" : "";
9127
9323
  return [
9128
9324
  `🏪 咕咕武器库 - ${category} 🏪`,
9129
9325
  '使用"购买 武器名称"指令进行购买',
9130
- displayDiscounts.length > 0 ? `💰 折扣明细:
9326
+ displayDiscounts.length > 0 ? `💰 折扣信息:
9131
9327
  ${displayDiscounts.join("\n")}` : "",
9328
+ techUpgradeNotice,
9132
9329
  permissionNotice,
9133
9330
  "====================",
9134
9331
  ...items,
@@ -9202,35 +9399,52 @@ ${validTypes.join("、")}`;
9202
9399
  });
9203
9400
  if (existingWeapon.length > 0) return `❌ 您已经拥有${item},无法重复购买`;
9204
9401
  }
9402
+ const [signInfo] = await ctx.database.get("ggcevo_sign", { handle });
9403
+ const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
9404
+ const playerGroup = careerData?.group || "";
9405
+ const playerCareer = careerData?.career || "";
9406
+ let legendaryPermission = 0;
9407
+ let hasLegendaryPermission = false;
9205
9408
  if (isLegendaryWeapon) {
9206
- const [careerData2] = await ctx.database.get("ggcevo_careers", { handle });
9207
- const [weaponTech] = await ctx.database.get("ggcevo_tech", { handle, techId: 2 });
9208
- const weaponSystemLevel = weaponTech?.level || 0;
9209
- if (!careerData2 || careerData2.group !== "人类联盟") {
9409
+ const [permissionRecord] = await ctx.database.get("ggcevo_permissions", { handle });
9410
+ legendaryPermission = permissionRecord?.legendarypermissions || 0;
9411
+ hasLegendaryPermission = legendaryPermission > 0;
9412
+ if (playerGroup !== "人类联盟") {
9210
9413
  return '❌ 购买传奇武器需要在"人类联盟"阵营。';
9211
9414
  }
9415
+ const [weaponTech2] = await ctx.database.get("ggcevo_tech", { handle, techId: 2 });
9416
+ const weaponSystemLevel = weaponTech2?.level || 0;
9212
9417
  if (weaponSystemLevel < 5) {
9213
9418
  return `❌ 购买传奇武器需要将武器系统升级到5级(当前等级:${weaponSystemLevel})。`;
9214
9419
  }
9215
- const isWeaponSpecialist = careerData2?.career === "武器中士";
9216
- if (!isWeaponSpecialist) {
9217
- const [permissions] = await ctx.database.get("ggcevo_permissions", { handle });
9218
- if (!permissions || permissions.legendarypermissions <= 0) {
9219
- return '❌ 购买传奇武器需要"传奇武器购买权限",您当前没有购买权限。';
9220
- }
9420
+ if (playerCareer !== "武器中士" && !hasLegendaryPermission) {
9421
+ return '❌ 购买传奇武器需要"传奇武器购买权限",您当前没有购买权限。';
9221
9422
  }
9222
9423
  }
9223
- const [signInfo] = await ctx.database.get("ggcevo_sign", { handle });
9224
- const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
9225
9424
  let totalDiscount = 0;
9226
9425
  let discountDetails = [];
9227
9426
  let activeWish = null;
9228
- if (isWeapon && careerData?.career === "武器中士") {
9229
- const specialistDiscount = 50;
9230
- totalDiscount += specialistDiscount;
9231
- discountDetails.push(`🎖️ 武器中士职业:${specialistDiscount}%折扣`);
9427
+ const romanLevels = {
9428
+ 1: "I",
9429
+ 2: "II",
9430
+ 3: "III",
9431
+ 4: "IV",
9432
+ 5: "V"
9433
+ };
9434
+ const [weaponTech] = await ctx.database.get("ggcevo_tech", { handle, techId: 2 });
9435
+ const techLevel = weaponTech?.level || 0;
9436
+ const techConfigData = Spacestationtechnology.find((tech) => tech.techId === 2);
9437
+ if (!isLegendaryWeapon && playerGroup === "人类联盟" && techLevel > 0 && techConfigData) {
9438
+ if (config2.level && config2.level <= techLevel) {
9439
+ const isCareerBonus = techConfigData.careerNames.includes(playerCareer);
9440
+ totalDiscount += 25;
9441
+ discountDetails.push(`▸ 🔧 武器系统Lv${techLevel}: ${isCareerBonus ? "50%" : "25%"}折扣 (适用${romanLevels[config2.level]}类武器)`);
9442
+ if (isCareerBonus) {
9443
+ totalDiscount += 25;
9444
+ }
9445
+ }
9232
9446
  }
9233
- if (!isLegendaryWeapon && isWeapon) {
9447
+ if (!isLegendaryWeapon) {
9234
9448
  activeWish = await ctx.database.get("ggcevo_wish", {
9235
9449
  handle,
9236
9450
  wishname: "蚱蜢优购",
@@ -9239,9 +9453,20 @@ ${validTypes.join("、")}`;
9239
9453
  isused: false
9240
9454
  }).then((records) => records[0] || null);
9241
9455
  if (activeWish) {
9242
- const wishDiscount = 20;
9243
- totalDiscount += wishDiscount;
9244
- discountDetails.push(`🦗 蚱蜢优购祈愿:${wishDiscount}%折扣`);
9456
+ totalDiscount += 20;
9457
+ discountDetails.push(`▸ 🦗 蚱蜢优购祈愿:20%折扣`);
9458
+ }
9459
+ }
9460
+ let willConsumePermission = false;
9461
+ if (isLegendaryWeapon) {
9462
+ if (playerCareer === "武器中士" && hasLegendaryPermission) {
9463
+ totalDiscount = 50;
9464
+ discountDetails = [`▸ 🎖️ 武器中士职业:半价购买(消耗1次权限)`];
9465
+ willConsumePermission = true;
9466
+ } else if (playerCareer === "武器中士") {
9467
+ discountDetails.push(`▸ 🎖️ 武器中士职业:原价购买`);
9468
+ } else {
9469
+ willConsumePermission = true;
9245
9470
  }
9246
9471
  }
9247
9472
  totalDiscount = Math.min(totalDiscount, 100);
@@ -9267,7 +9492,7 @@ ${validTypes.join("、")}`;
9267
9492
  isused: true
9268
9493
  });
9269
9494
  }
9270
- if (isLegendaryWeapon && careerData?.career !== "武器中士") {
9495
+ if (willConsumePermission) {
9271
9496
  const [permissionRecord] = await ctx.database.get("ggcevo_permissions", { handle });
9272
9497
  if (!permissionRecord || permissionRecord.legendarypermissions <= 0) {
9273
9498
  throw new Error("传奇武器购买权限不足");
@@ -9276,6 +9501,7 @@ ${validTypes.join("、")}`;
9276
9501
  await ctx.database.set("ggcevo_permissions", { handle }, {
9277
9502
  legendarypermissions: remaining
9278
9503
  });
9504
+ legendaryPermission = remaining;
9279
9505
  }
9280
9506
  if (isWeapon) {
9281
9507
  await ctx.database.upsert("ggcevo_weapons", [{
@@ -9314,18 +9540,17 @@ ${validTypes.join("、")}`;
9314
9540
  message += `花费 ${actualPrice} 金币 (原价${config2.price} 金币)`;
9315
9541
  message += `
9316
9542
  💰 折扣明细:
9317
- ${discountDetails.join("\n")}`;
9543
+ ${discountDetails.join("\n")}`;
9318
9544
  } else {
9319
9545
  message += `花费 ${actualPrice} 金币`;
9320
9546
  }
9321
9547
  if (isLegendaryWeapon) {
9322
- if (careerData?.career !== "武器中士") {
9323
- const [permissions] = await ctx.database.get("ggcevo_permissions", { handle });
9548
+ if (willConsumePermission) {
9324
9549
  message += `
9325
- 扣除 1 次传奇武器购买权限,剩余次数:${permissions?.legendarypermissions || 0}`;
9326
- } else {
9550
+ 扣除 1 次传奇武器购买权限,剩余次数:${legendaryPermission}`;
9551
+ } else if (playerCareer === "武器中士" && !hasLegendaryPermission) {
9327
9552
  message += `
9328
- 【武器中士特权】本次购买未消耗传奇武器权限`;
9553
+ 【武器中士特权】本次按原价购买,未消耗权限次数`;
9329
9554
  }
9330
9555
  }
9331
9556
  if (isWeapon) {
@@ -9410,7 +9635,24 @@ ${validTypes.join("、")}`;
9410
9635
  });
9411
9636
  return `您已成功装备武器 ${weapon}!`;
9412
9637
  });
9413
- ctx.command("ggcevo/升级 <target>", "升级武器或科技").action(async ({ session }, target) => {
9638
+ ctx.command("ggcevo/升级科技 <target>", "升级空间站科技").action(async ({ session }, target) => {
9639
+ const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
9640
+ if (!profile) return "🔒 需要先绑定游戏句柄。";
9641
+ const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
9642
+ if ((await ctx.database.get("ggcevo_blacklist", { handle })).length) {
9643
+ return "⛔ 您已被列入黑名单。";
9644
+ }
9645
+ if (!target) {
9646
+ return "请输入“升级科技 科技名称”来升级科技";
9647
+ }
9648
+ const tech = Spacestationtechnology.find((t) => t.techname === target);
9649
+ if (!tech) {
9650
+ const validTech = Spacestationtechnology.map((t) => t.techname).join("、");
9651
+ return `❌ 无效科技名称。可用科技: ${validTech}`;
9652
+ }
9653
+ return handleTechUpgrade(ctx, handle, target);
9654
+ });
9655
+ ctx.command("ggcevo/升级武器 <target>", "升级武器装备").alias("升级").action(async ({ session }, target) => {
9414
9656
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
9415
9657
  if (!profile) return "🔒 需要先绑定游戏句柄。";
9416
9658
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
@@ -9420,18 +9662,13 @@ ${validTypes.join("、")}`;
9420
9662
  if (!target) {
9421
9663
  return generateUpgradePriceList(ctx, handle);
9422
9664
  }
9423
- const isTech = Spacestationtechnology.some(
9424
- (t) => t.techname === target || t.techname == target
9425
- );
9426
- const isWeapon = Object.keys(weaponConfig).includes(target);
9427
- if (isTech) {
9428
- return handleTechUpgrade(ctx, handle, target);
9429
- } else if (isWeapon) {
9430
- return handleWeaponUpgrade(ctx, handle, target);
9665
+ if (!Object.keys(weaponConfig).includes(target)) {
9666
+ const validWeapons = Object.keys(weaponConfig).join("、");
9667
+ return `❌ 无效武器名称。可用武器: ${validWeapons}`;
9431
9668
  }
9432
- return `❌ 未找到 "${target}" 对应的武器或科技(科技仅限人类联盟阵营升级)`;
9669
+ return handleWeaponUpgrade(ctx, handle, target);
9433
9670
  });
9434
- ctx.command("ggcevo/改装 <weapon> [mod]", "安装武器模块").alias("改造").action(async ({ session }, weapon, mod) => {
9671
+ ctx.command("ggcevo/改装武器 <weapon> [mod]", "安装武器模块").alias("改装").action(async ({ session }, weapon, mod) => {
9435
9672
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
9436
9673
  if (!profile) return "🔒 需要先绑定游戏句柄。";
9437
9674
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
@@ -9553,7 +9790,7 @@ ${validTypes.join("、")}`;
9553
9790
  const armorMessage = isArmoredPirate ? "🔰 装甲兵职业:\n▸ 武器改装槽+1" : "";
9554
9791
  return [
9555
9792
  `🛠️ ${weapon} 专属模块 🛠️`,
9556
- "使用「改装 武器名称 模块名称」安装",
9793
+ "使用「改装武器 武器名称 模块名称」安装",
9557
9794
  "※ 每个武器只能安装一个专属模块",
9558
9795
  armorMessage,
9559
9796
  // 新增装甲兵提示
@@ -9567,8 +9804,8 @@ ${validTypes.join("、")}`;
9567
9804
  const armorMessage = isArmoredPirate ? "🔰 装甲兵职业:\n▸ 武器改装槽+1" : "";
9568
9805
  return [
9569
9806
  "🛠️ 通用武器模块 🛠️",
9570
- "使用「改装 武器名称 模块名称」安装通用模块",
9571
- "※ 使用「改装 武器名称」查询武器专属模块",
9807
+ "使用「改装武器 武器名称 模块名称」安装通用模块",
9808
+ "※ 使用「改装武器 武器名称」查询武器专属模块",
9572
9809
  armorMessage,
9573
9810
  // 新增装甲兵提示
9574
9811
  universalDiscountRate > 0 && `💰 当前通用模块折扣:`,
@@ -9816,6 +10053,8 @@ ${validTypes.join("、")}`;
9816
10053
  if (!name2) {
9817
10054
  name2 = "测试假人";
9818
10055
  }
10056
+ const parsedUser = import_koishi.h.parse(name2)[0];
10057
+ if (parsedUser && parsedUser.type === "at") return "无法指定群友为假人。";
9819
10058
  let hp = 1e4;
9820
10059
  if (typeof options.hp === "number") {
9821
10060
  hp = Math.max(1, Math.min(options.hp, 1e4));
@@ -11763,25 +12002,6 @@ ${Spacestationtechnology.map((t) => t.techname).join("、")}`;
11763
12002
  for (const [name2, data] of Object.entries(spaceship)) {
11764
12003
  shipIdToName[data.id] = name2;
11765
12004
  }
11766
- ctx.command("ggcevo/飞船").action(async ({ session }) => {
11767
- const shipList = Object.keys(spaceship).map((name2) => {
11768
- const ship = spaceship[name2];
11769
- return [
11770
- `【${name2}】`,
11771
- `- 价格: ${ship.price}金币`,
11772
- `- 挖矿加成: +${ship.miningbonus}%金币`,
11773
- `- 探索加成: +${ship.explorebonus}%金币`,
11774
- `- 特殊效果: ${ship.effect || "无"}`
11775
- ].join("\n");
11776
- });
11777
- return [
11778
- "🚀 可购买的飞船列表:",
11779
- ...shipList.map((ship) => `▸ ${ship}`),
11780
- "\n🛒 购买指令:购买飞船 [飞船名称]",
11781
- "例如:购买飞船 TX-12S隐形巡洋舰",
11782
- '\n💡 提示:购买飞船后使用"飞船信息"查看您的飞船'
11783
- ].join("\n");
11784
- });
11785
12005
  ctx.command("ggcevo/飞船信息").action(async ({ session }) => {
11786
12006
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
11787
12007
  if (!profile) return "🔒 需要先绑定游戏句柄。";
@@ -11812,6 +12032,9 @@ ${Spacestationtechnology.map((t) => t.techname).join("、")}`;
11812
12032
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
11813
12033
  if (!profile) return "🔒 需要先绑定游戏句柄。";
11814
12034
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
12035
+ if ((await ctx.database.get("ggcevo_blacklist", { handle })).length) {
12036
+ return "⛔ 您已被列入黑名单。";
12037
+ }
11815
12038
  const [signRecord] = await ctx.database.get("ggcevo_sign", { handle });
11816
12039
  if (!signRecord) return "⛔ 请先进行至少一次签到获得金币后购买飞船";
11817
12040
  const coins = signRecord.totalRewards;
@@ -11831,7 +12054,7 @@ ${Spacestationtechnology.map((t) => t.techname).join("、")}`;
11831
12054
  ...shipList.map((ship2) => `▸ ${ship2}`),
11832
12055
  "\n使用格式:购买飞船 [飞船名称]",
11833
12056
  "示例:购买飞船 TX-12S隐形巡洋舰",
11834
- `💡 当前金币余额:${coins}`
12057
+ `💡 提示:购买飞船后使用"飞船信息"查看您的飞船`
11835
12058
  ].join("\n");
11836
12059
  }
11837
12060
  const ship = spaceship[shipName];
@@ -11880,6 +12103,9 @@ ${Spacestationtechnology.map((t) => t.techname).join("、")}`;
11880
12103
  const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
11881
12104
  if (!profile) return "🔒 需要先绑定游戏句柄。";
11882
12105
  const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
12106
+ if ((await ctx.database.get("ggcevo_blacklist", { handle })).length) {
12107
+ return "⛔ 您已被列入黑名单。";
12108
+ }
11883
12109
  const [career] = await ctx.database.get("ggcevo_careers", { handle });
11884
12110
  if (!career) return "🚫 未查询到您的阵营信息";
11885
12111
  if (career.group !== "辛迪加海盗") {
@@ -11910,24 +12136,23 @@ ${Spacestationtechnology.map((t) => t.techname).join("、")}`;
11910
12136
  if (upgradableItems.length === 0) {
11911
12137
  return "🚫 当前没有可升级的物品";
11912
12138
  }
11913
- const discountNotice2 = [];
12139
+ const discountNotice = [];
11914
12140
  if (isCommander) {
11915
- discountNotice2.push(
11916
- "💰 折扣明细:",
11917
- "▸ 🎖️ 指挥官职业:50%折扣"
12141
+ discountNotice.push(
12142
+ "💰 指挥官职业效果:",
12143
+ "▸ 🎖️ 升级费用:50%折扣",
12144
+ "▸ ⚡ 升级加成:50%概率触发双倍提升"
11918
12145
  );
11919
12146
  }
11920
12147
  const msgLines = [
11921
12148
  "💎 可升级物品列表",
11922
- ...discountNotice2,
12149
+ ...discountNotice,
11923
12150
  "====================",
11924
- // 修改这里: 在物品信息中增加升级区间显示
11925
12151
  ...upgradableItems.map((item) => {
11926
12152
  return [
11927
12153
  `▸ ${item.name}:`,
11928
12154
  ` 当前升级加成: ${item.currentBonus}% / ${item.maxBonus}%`,
11929
12155
  ` 每次升级提升: ${item.upgradeRange}`,
11930
- // 新增行
11931
12156
  ` 升级消耗: ${item.cost} 红晶 ${item.discount}`
11932
12157
  ].join("\n");
11933
12158
  }),
@@ -11952,39 +12177,155 @@ ${Spacestationtechnology.map((t) => t.techname).join("、")}`;
11952
12177
  return `🚫 【${itemName}】已达到最大升级上限(${upgradeConfig.maxBonus}%)`;
11953
12178
  }
11954
12179
  let upgradeCost = upgradeConfig.upgradeCostBase;
11955
- let discountNotice = "";
11956
12180
  if (isCommander) {
11957
12181
  upgradeCost = Math.floor(upgradeCost * 0.5);
11958
- discountNotice = `
11959
- ✨ 指挥官职业生效!实际消耗: ${upgradeCost} (原价:${upgradeConfig.upgradeCostBase})`;
11960
12182
  }
11961
12183
  if (career.redcrystal < upgradeCost) {
11962
12184
  return `🚫 红晶不足!升级需要${upgradeCost}红晶,您当前有${career.redcrystal}红晶`;
11963
12185
  }
11964
- const upgradeValue = Math.floor(
12186
+ const baseUpgradeValue = Math.floor(
11965
12187
  Math.random() * (upgradeConfig.maxUpgrade - upgradeConfig.minUpgrade + 1)
11966
12188
  ) + upgradeConfig.minUpgrade;
11967
- const actualUpgrade = Math.min(
11968
- upgradeValue,
11969
- upgradeConfig.maxBonus - warehouseItem.bonus
11970
- );
12189
+ let actualUpgrade = baseUpgradeValue;
12190
+ let doubleEffect = false;
12191
+ if (isCommander && Math.random() < 0.5) {
12192
+ actualUpgrade *= 2;
12193
+ doubleEffect = true;
12194
+ actualUpgrade = Math.min(
12195
+ actualUpgrade,
12196
+ upgradeConfig.maxBonus - warehouseItem.bonus
12197
+ );
12198
+ } else {
12199
+ actualUpgrade = Math.min(
12200
+ actualUpgrade,
12201
+ upgradeConfig.maxBonus - warehouseItem.bonus
12202
+ );
12203
+ }
11971
12204
  const newRedCrystal = career.redcrystal - upgradeCost;
11972
12205
  await ctx.database.upsert("ggcevo_careers", [{
11973
12206
  handle,
11974
12207
  redcrystal: newRedCrystal
11975
12208
  }], ["handle"]);
12209
+ const totalBonus = warehouseItem.bonus + actualUpgrade;
11976
12210
  await ctx.database.upsert("ggcevo_warehouse", [{
11977
12211
  handle,
11978
12212
  itemId: itemConfig2.id,
11979
- bonus: warehouseItem.bonus + actualUpgrade
12213
+ bonus: totalBonus,
12214
+ upgrades: warehouseItem.upgrades + 1
11980
12215
  }], ["handle", "itemId"]);
11981
- const totalBonus = warehouseItem.bonus + actualUpgrade;
11982
- return `✅ 【${itemName}】升级成功!${discountNotice}
11983
- - 消耗红晶: ${upgradeCost}
11984
- - 本次提升: ${actualUpgrade}%
12216
+ return `✅ 【${itemName}】升级成功!
12217
+ - 消耗红晶: ${upgradeCost} (基础值: ${upgradeConfig.upgradeCostBase} 红晶)
12218
+ - 本次提升: ${actualUpgrade}%${doubleEffect ? ` (基础值:${baseUpgradeValue}%)` : ""}
11985
12219
  - 当前加成: ${totalBonus}%
11986
12220
  - 剩余红晶: ${newRedCrystal}`;
11987
12221
  });
12222
+ ctx.guild().command("ggcevo/init", "初始化群组全局配置", { authority: 3 }).option("reset", "-r 重置已存在配置").action(async ({ session, options }) => {
12223
+ const groupId = session.guildId;
12224
+ const now = /* @__PURE__ */ new Date();
12225
+ const existing = await ctx.database.get("ggcevo_global_stats", { groupId });
12226
+ if (existing.length > 0 && !options.reset) {
12227
+ return "配置已存在!如需重置请使用 -r 选项";
12228
+ }
12229
+ await ctx.database.upsert("ggcevo_global_stats", [{
12230
+ groupId,
12231
+ updatedAt: now,
12232
+ rankdate: now
12233
+ }]);
12234
+ return `群组 ${groupId} 配置已${existing.length ? "重置" : "初始化"}
12235
+ 排名更新时间: ${now.toLocaleString()}
12236
+ 胜点榜基准日: ${now.toLocaleDateString()}`;
12237
+ });
12238
+ ctx.command("ggcevo/竞猜 [itemId] [amount] [guess]", "参与竞猜游戏").usage('输入"竞猜"查看可竞猜项目,"竞猜 项目ID 金额 内容"进行竞猜').example("竞猜 1 500 寒冰王蛇").action(async ({ session }, itemId, amount, guess) => {
12239
+ const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
12240
+ if (!profile) return "🔒 需要先绑定游戏句柄";
12241
+ const { regionId, realmId, profileId } = profile;
12242
+ const handle = `${regionId}-S2-${realmId}-${profileId}`;
12243
+ if ((await ctx.database.get("ggcevo_blacklist", { handle })).length) {
12244
+ return "⛔ 您已被列入黑名单。";
12245
+ }
12246
+ const [signInfo] = await ctx.database.get("ggcevo_sign", { handle });
12247
+ if (!signInfo) return "⚠️ 账号数据异常,请重试";
12248
+ const userCoins = signInfo.totalRewards;
12249
+ const username = session.username;
12250
+ const availableItems = GUESSING_ITEMS.filter((item) => item.status === "open");
12251
+ if (!itemId) {
12252
+ return [
12253
+ "🎯 可参与竞猜项目 🎯",
12254
+ '使用"竞猜 项目ID 金额 内容"下注',
12255
+ "====================",
12256
+ ...availableItems.map(
12257
+ (item) => `▸ [ID:${item.id}] ${item.description} (赔率: ${item.odds}x)`
12258
+ ),
12259
+ "===================="
12260
+ ].join("\n");
12261
+ }
12262
+ const parsedItemId = parseInt(itemId);
12263
+ if (isNaN(parsedItemId)) return "⚠️ 项目ID必须是数字";
12264
+ const targetItem = availableItems.find((item) => item.id === parsedItemId);
12265
+ if (!targetItem) return "⚠️ 无效的项目ID或项目不可用";
12266
+ if (!amount && !guess) {
12267
+ const [userBet] = await ctx.database.get("ggcevo_guess", {
12268
+ handle,
12269
+ itemId: parsedItemId
12270
+ });
12271
+ const wins = userBet?.wins || 0;
12272
+ const betInfo = userBet && userBet.amount > 0 ? `已下注: ${userBet.amount}金币 (内容:${userBet.guessContent})` : "尚未下注";
12273
+ return [
12274
+ `📋 项目详情 [ID:${parsedItemId}]`,
12275
+ `描述: ${targetItem.description}`,
12276
+ `赔率: ${targetItem.odds}x`,
12277
+ `猜中次数: ${wins} 次`,
12278
+ `您的状态: ${betInfo}`
12279
+ ].join("\n");
12280
+ }
12281
+ if (!amount) return "⚠️ 请输入下注金额";
12282
+ if (!guess) return "⚠️ 请填写竞猜内容";
12283
+ const [existingBet] = await ctx.database.get("ggcevo_guess", {
12284
+ handle,
12285
+ itemId: parsedItemId,
12286
+ amount: { $gt: 0 }
12287
+ // 只查找金额大于0的未结算记录
12288
+ });
12289
+ if (existingBet) {
12290
+ return `⛔ 您已参与该项目竞猜,禁止重复下注
12291
+ 当前下注内容: ${existingBet.guessContent}
12292
+ 当前下注金额: ${existingBet.amount}金币`;
12293
+ }
12294
+ const betAmount = parseInt(amount);
12295
+ if (isNaN(betAmount) || betAmount < 1) return "⚠️ 请输入有效金额";
12296
+ if (betAmount > userCoins) return `⚠️ 金币不足,当前账户只有 ${userCoins} 金币`;
12297
+ const validBossNames = bossPool.map((pool) => pool.main.name);
12298
+ if (!validBossNames.includes(guess)) {
12299
+ return `⚠️ 无效的主宰名字,可用选项:
12300
+ ${validBossNames.join("、")}`;
12301
+ }
12302
+ const recordData = {
12303
+ handle,
12304
+ name: username,
12305
+ itemId: parsedItemId,
12306
+ guessContent: guess,
12307
+ amount: betAmount,
12308
+ createdAt: /* @__PURE__ */ new Date()
12309
+ };
12310
+ try {
12311
+ await ctx.database.upsert("ggcevo_guess", [recordData]);
12312
+ await ctx.database.set("ggcevo_sign", { handle }, {
12313
+ totalRewards: userCoins - betAmount
12314
+ });
12315
+ return [
12316
+ "✅ 竞猜成功!",
12317
+ `项目ID: ${parsedItemId}`,
12318
+ `项目描述: ${targetItem.description}`,
12319
+ `竞猜内容: "${guess}"`,
12320
+ `投入金额: ${betAmount} 金币`,
12321
+ `如猜中将获得: ${Math.floor(betAmount * targetItem.odds)} 金币`,
12322
+ "⏳ 每个项目只能下注一次"
12323
+ ].join("\n");
12324
+ } catch (e) {
12325
+ ctx.logger("ggcevo").error(e);
12326
+ return "⚠️ 竞猜提交失败,请重试";
12327
+ }
12328
+ });
11988
12329
  ctx.command("ggcevo/签到奖励").action(({}) => {
11989
12330
  return `
11990
12331
  签到咕咕币奖励:
@@ -12139,7 +12480,7 @@ PK同玩家限战:1次/日
12139
12480
  📌 重要说明:
12140
12481
  1. 结算后自动发放所有奖励
12141
12482
  2. 勋章可通过背包查看
12142
- 3. 每个赛季持续45天
12483
+ 3. 每个赛季持续60天(即2个月)
12143
12484
  `.trim();
12144
12485
  });
12145
12486
  }