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/boss/BattleEffectProcessor.d.ts +1 -1
- package/lib/database.d.ts +17 -0
- package/lib/index.js +536 -195
- package/lib/utils.d.ts +6 -0
- package/lib/weapons.d.ts +27 -0
- package/package.json +2 -2
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: "
|
|
720
|
+
requirements: "当期伤害榜累计造成200及以上伤害",
|
|
694
721
|
Jobtransfer: true,
|
|
695
|
-
costcoins:
|
|
722
|
+
costcoins: 3e3
|
|
696
723
|
},
|
|
697
724
|
{
|
|
698
725
|
professionName: "警卫长",
|
|
699
|
-
effect: "攻击伤害+5
|
|
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%;
|
|
707
|
-
requirements: "
|
|
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
|
|
807
|
-
requirements: "
|
|
833
|
+
effect: "使用红晶升级物品享有50%的折扣;升级物品时有50%的概率获得双倍加成;购买光剑(传奇)享有50%的折扣",
|
|
834
|
+
requirements: "仓库中至少拥有一个升级5次及以上的物品",
|
|
808
835
|
Jobtransfer: true,
|
|
809
|
-
costredcrystal:
|
|
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:
|
|
830
|
-
costredcrystal:
|
|
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:
|
|
886
|
-
message:
|
|
887
|
-
// 消息提示更新为前二十名
|
|
908
|
+
success: totalDamage >= 200,
|
|
909
|
+
message: `需要当期伤害榜累计造成200及以上伤害(当前${totalDamage})`
|
|
888
910
|
};
|
|
889
911
|
}
|
|
890
912
|
case "武器中士":
|
|
891
|
-
|
|
913
|
+
hasLevel6Weapon = weapons.some((weapon) => weapon.level >= 6);
|
|
892
914
|
return {
|
|
893
|
-
success:
|
|
894
|
-
message:
|
|
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
|
-
|
|
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:
|
|
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: "
|
|
1072
|
-
careerBonus: "
|
|
1096
|
+
description: "提升空间站武器等级,购买I类及以下武器享有25%的折扣",
|
|
1097
|
+
careerBonus: "购买I类及以下武器额外享有25%的折扣"
|
|
1073
1098
|
},
|
|
1074
1099
|
{
|
|
1075
1100
|
level: 2,
|
|
1076
1101
|
cost: 1500,
|
|
1077
|
-
description: "
|
|
1078
|
-
careerBonus: "
|
|
1102
|
+
description: "提升空间站武器等级,购买II类及以下武器享有25%的折扣",
|
|
1103
|
+
careerBonus: "购买II类及以下武器额外享有25%的折扣"
|
|
1079
1104
|
},
|
|
1080
1105
|
{
|
|
1081
1106
|
level: 3,
|
|
1082
1107
|
cost: 2550,
|
|
1083
|
-
description: "
|
|
1084
|
-
careerBonus: "
|
|
1108
|
+
description: "提升空间站武器等级,购买III类武器享有25%的折扣",
|
|
1109
|
+
careerBonus: "购买III类及以下武器额外享有25%的折扣"
|
|
1085
1110
|
},
|
|
1086
1111
|
{
|
|
1087
1112
|
level: 4,
|
|
1088
1113
|
cost: 3950,
|
|
1089
|
-
description: "
|
|
1090
|
-
careerBonus: "
|
|
1114
|
+
description: "提升空间站武器等级,购买IV类及以下武器享有25%的折扣",
|
|
1115
|
+
careerBonus: "购买IV类及以下武器额外享有25%的折扣"
|
|
1091
1116
|
},
|
|
1092
1117
|
{
|
|
1093
1118
|
level: 5,
|
|
1094
1119
|
cost: 4650,
|
|
1095
|
-
description: "
|
|
1096
|
-
careerBonus: "
|
|
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(`🔥
|
|
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 = [
|
|
5787
|
-
const CAREER_DISCOUNTS = [
|
|
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 = [
|
|
5876
|
-
const CAREER_DISCOUNTS = [
|
|
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
|
-
|
|
6298
|
+
const broadcastMessages = [];
|
|
6299
|
+
let cleanerBaseReward = 0;
|
|
6252
6300
|
if (["巢穴雷兽", "巢穴战士", "巢穴甲虫"].includes(bossName)) {
|
|
6253
|
-
|
|
6301
|
+
cleanerBaseReward = 2;
|
|
6254
6302
|
} else {
|
|
6255
|
-
|
|
6303
|
+
cleanerBaseReward = bossType === "主宰" ? 10 : 5;
|
|
6256
6304
|
}
|
|
6257
6305
|
const allCleaners = await ctx.database.get("ggcevo_careers", {
|
|
6258
6306
|
career: "清洁工"
|
|
6259
6307
|
});
|
|
6260
|
-
|
|
6261
|
-
|
|
6262
|
-
|
|
6263
|
-
|
|
6264
|
-
|
|
6265
|
-
|
|
6266
|
-
|
|
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
|
-
|
|
6269
|
-
|
|
6270
|
-
redcrystal: (cleaner.redcrystal || 0) + rewardAmount
|
|
6271
|
-
}], ["handle"]);
|
|
6321
|
+
const cleanerMessage = `🧹 清洁工职业因清理 ${bossName} 尸体,获得 ${cleanerBaseReward} 红晶${cleanerKillerBonus ? ` (击败者 ${killerName} 获得双倍奖励)` : ""}`;
|
|
6322
|
+
broadcastMessages.push(cleanerMessage);
|
|
6272
6323
|
}
|
|
6273
|
-
|
|
6274
|
-
|
|
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
|
|
7409
|
+
const groupIds = [...config.groupId];
|
|
7312
7410
|
if (totalBosses === 0) {
|
|
7313
7411
|
const firstBoss = await activateNextBossGroup(ctx);
|
|
7314
|
-
await ctx.broadcast(
|
|
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
|
-
|
|
7320
|
-
|
|
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
|
-
|
|
7330
|
-
|
|
7331
|
-
|
|
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("
|
|
7359
|
-
const lastdate = ggcmap[0].
|
|
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("
|
|
7409
|
-
|
|
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("
|
|
7964
|
-
const lastdate = ggcmap[0].
|
|
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("
|
|
8014
|
-
|
|
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("
|
|
8042
|
-
const lastdate = ggcmap[0].
|
|
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
|
-
|
|
9055
|
-
|
|
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
|
-
|
|
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
|
-
|
|
9087
|
-
|
|
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
|
-
|
|
9090
|
-
|
|
9091
|
-
|
|
9092
|
-
|
|
9093
|
-
|
|
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
|
-
|
|
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
|
-
]
|
|
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 [
|
|
9207
|
-
|
|
9208
|
-
|
|
9209
|
-
if (
|
|
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
|
-
|
|
9216
|
-
|
|
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
|
-
|
|
9229
|
-
|
|
9230
|
-
|
|
9231
|
-
|
|
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
|
|
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
|
-
|
|
9243
|
-
|
|
9244
|
-
|
|
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 (
|
|
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
|
-
|
|
9543
|
+
${discountDetails.join("\n")}`;
|
|
9318
9544
|
} else {
|
|
9319
9545
|
message += `花费 ${actualPrice} 金币`;
|
|
9320
9546
|
}
|
|
9321
9547
|
if (isLegendaryWeapon) {
|
|
9322
|
-
if (
|
|
9323
|
-
const [permissions] = await ctx.database.get("ggcevo_permissions", { handle });
|
|
9548
|
+
if (willConsumePermission) {
|
|
9324
9549
|
message += `
|
|
9325
|
-
扣除 1 次传奇武器购买权限,剩余次数:${
|
|
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
|
|
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
|
-
|
|
9424
|
-
|
|
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
|
|
9669
|
+
return handleWeaponUpgrade(ctx, handle, target);
|
|
9433
9670
|
});
|
|
9434
|
-
ctx.command("ggcevo
|
|
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
|
-
`💡
|
|
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
|
|
12139
|
+
const discountNotice = [];
|
|
11914
12140
|
if (isCommander) {
|
|
11915
|
-
|
|
11916
|
-
"💰
|
|
11917
|
-
"▸ 🎖️
|
|
12141
|
+
discountNotice.push(
|
|
12142
|
+
"💰 指挥官职业效果:",
|
|
12143
|
+
"▸ 🎖️ 升级费用:50%折扣",
|
|
12144
|
+
"▸ ⚡ 升级加成:50%概率触发双倍提升"
|
|
11918
12145
|
);
|
|
11919
12146
|
}
|
|
11920
12147
|
const msgLines = [
|
|
11921
12148
|
"💎 可升级物品列表",
|
|
11922
|
-
...
|
|
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
|
|
12186
|
+
const baseUpgradeValue = Math.floor(
|
|
11965
12187
|
Math.random() * (upgradeConfig.maxUpgrade - upgradeConfig.minUpgrade + 1)
|
|
11966
12188
|
) + upgradeConfig.minUpgrade;
|
|
11967
|
-
|
|
11968
|
-
|
|
11969
|
-
|
|
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:
|
|
12213
|
+
bonus: totalBonus,
|
|
12214
|
+
upgrades: warehouseItem.upgrades + 1
|
|
11980
12215
|
}], ["handle", "itemId"]);
|
|
11981
|
-
|
|
11982
|
-
|
|
11983
|
-
-
|
|
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. 每个赛季持续
|
|
12483
|
+
3. 每个赛季持续60天(即2个月)
|
|
12143
12484
|
`.trim();
|
|
12144
12485
|
});
|
|
12145
12486
|
}
|