koishi-plugin-ggcevo-game 1.4.2 → 1.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/careersystem/careers.d.ts +0 -1
- package/lib/database.d.ts +0 -1
- package/lib/index.js +305 -203
- package/lib/weapons.d.ts +2 -1
- package/package.json +1 -1
|
@@ -11,7 +11,6 @@ export declare const syndicatePirateConfig: {
|
|
|
11
11
|
effect: string;
|
|
12
12
|
requirements: string;
|
|
13
13
|
Jobtransfer: boolean;
|
|
14
|
-
costcoins: number;
|
|
15
14
|
costredcrystal: number;
|
|
16
15
|
}[];
|
|
17
16
|
export declare function checkTransferRequirements(ctx: Context, handle: string, profession: string): Promise<{
|
package/lib/database.d.ts
CHANGED
package/lib/index.js
CHANGED
|
@@ -162,7 +162,7 @@ var weaponConfig = {
|
|
|
162
162
|
category: "能量武器",
|
|
163
163
|
damage: 25,
|
|
164
164
|
description: "一种经过改造的电动工具,可对近距离的目标放出高压电",
|
|
165
|
-
specialeffect: "
|
|
165
|
+
specialeffect: "攻击消耗目标200点能量",
|
|
166
166
|
price: 750,
|
|
167
167
|
redCrystalCost: 10,
|
|
168
168
|
isantiair: true,
|
|
@@ -206,7 +206,7 @@ var weaponConfig = {
|
|
|
206
206
|
category: "能量武器",
|
|
207
207
|
damage: 30,
|
|
208
208
|
description: "面对护盾目标而开发的武器",
|
|
209
|
-
specialeffect: "
|
|
209
|
+
specialeffect: "攻击无视护盾目标50%的减伤效果",
|
|
210
210
|
price: 1050,
|
|
211
211
|
redCrystalCost: 15,
|
|
212
212
|
isantiair: true,
|
|
@@ -220,7 +220,7 @@ var weaponConfig = {
|
|
|
220
220
|
id: 13,
|
|
221
221
|
type: "实弹武器",
|
|
222
222
|
category: "实弹武器",
|
|
223
|
-
damage:
|
|
223
|
+
damage: 30,
|
|
224
224
|
description: "这种强大的钻头是由那些想把矿工SCV上的大螺丝用作武器的人创造的",
|
|
225
225
|
specialeffect: "",
|
|
226
226
|
price: 1e3,
|
|
@@ -236,9 +236,9 @@ var weaponConfig = {
|
|
|
236
236
|
id: 14,
|
|
237
237
|
type: "能量武器",
|
|
238
238
|
category: "能量武器",
|
|
239
|
-
damage:
|
|
239
|
+
damage: 32,
|
|
240
240
|
description: "一种原型能量武器,能够发射强大的脉冲",
|
|
241
|
-
specialeffect: "",
|
|
241
|
+
specialeffect: "攻击不会触发目标的叠层技能",
|
|
242
242
|
price: 1500,
|
|
243
243
|
redCrystalCost: 15,
|
|
244
244
|
isantiair: true,
|
|
@@ -251,10 +251,11 @@ var weaponConfig = {
|
|
|
251
251
|
damage: 88,
|
|
252
252
|
description: "一件传奇武器",
|
|
253
253
|
specialeffect: "",
|
|
254
|
-
price:
|
|
254
|
+
price: 7500,
|
|
255
255
|
redCrystalCost: 150,
|
|
256
256
|
isantiair: true,
|
|
257
257
|
tagEffects: {
|
|
258
|
+
"生物": 2,
|
|
258
259
|
"护盾": 0.5,
|
|
259
260
|
"重甲": 0.5
|
|
260
261
|
}
|
|
@@ -263,10 +264,10 @@ var weaponConfig = {
|
|
|
263
264
|
id: 102,
|
|
264
265
|
type: "能量武器",
|
|
265
266
|
category: "传奇武器",
|
|
266
|
-
damage:
|
|
267
|
+
damage: 50,
|
|
267
268
|
description: "一件传奇武器",
|
|
268
|
-
specialeffect: "",
|
|
269
|
-
price:
|
|
269
|
+
specialeffect: "攻击暴击率80%",
|
|
270
|
+
price: 7500,
|
|
270
271
|
redCrystalCost: 150,
|
|
271
272
|
isantiair: true,
|
|
272
273
|
tagEffects: {
|
|
@@ -280,7 +281,7 @@ var weaponConfig = {
|
|
|
280
281
|
damage: 80,
|
|
281
282
|
description: "这是传说中的武器",
|
|
282
283
|
specialeffect: "",
|
|
283
|
-
price:
|
|
284
|
+
price: 7500,
|
|
284
285
|
redCrystalCost: 150,
|
|
285
286
|
isantiair: false,
|
|
286
287
|
tagEffects: {
|
|
@@ -292,10 +293,10 @@ var weaponConfig = {
|
|
|
292
293
|
id: 104,
|
|
293
294
|
type: "实弹武器",
|
|
294
295
|
category: "传奇武器",
|
|
295
|
-
damage:
|
|
296
|
+
damage: 120,
|
|
296
297
|
description: "一件传奇武器",
|
|
297
298
|
specialeffect: "",
|
|
298
|
-
price:
|
|
299
|
+
price: 7500,
|
|
299
300
|
redCrystalCost: 150,
|
|
300
301
|
isantiair: true,
|
|
301
302
|
tagEffects: {
|
|
@@ -308,8 +309,8 @@ var weaponConfig = {
|
|
|
308
309
|
category: "传奇武器",
|
|
309
310
|
damage: 100,
|
|
310
311
|
description: "优雅而独特的武器",
|
|
311
|
-
specialeffect: "",
|
|
312
|
-
price:
|
|
312
|
+
specialeffect: "无视目标100%的减伤效果",
|
|
313
|
+
price: 7500,
|
|
313
314
|
redCrystalCost: 150,
|
|
314
315
|
isantiair: false,
|
|
315
316
|
tagEffects: {}
|
|
@@ -320,8 +321,8 @@ var weaponConfig = {
|
|
|
320
321
|
category: "传奇武器",
|
|
321
322
|
damage: 100,
|
|
322
323
|
description: "一件传奇武器",
|
|
323
|
-
specialeffect: "",
|
|
324
|
-
price:
|
|
324
|
+
specialeffect: "攻击消耗目标500点能量",
|
|
325
|
+
price: 7500,
|
|
325
326
|
redCrystalCost: 150,
|
|
326
327
|
isantiair: true,
|
|
327
328
|
tagEffects: {
|
|
@@ -332,10 +333,10 @@ var weaponConfig = {
|
|
|
332
333
|
id: 107,
|
|
333
334
|
type: "能量武器",
|
|
334
335
|
category: "传奇武器",
|
|
335
|
-
damage:
|
|
336
|
+
damage: 60,
|
|
336
337
|
description: "一件传奇武器",
|
|
337
|
-
specialeffect: "",
|
|
338
|
-
price:
|
|
338
|
+
specialeffect: "攻击无视目标80%的减伤效果",
|
|
339
|
+
price: 7500,
|
|
339
340
|
redCrystalCost: 150,
|
|
340
341
|
isantiair: true,
|
|
341
342
|
tagEffects: {
|
|
@@ -346,10 +347,10 @@ var weaponConfig = {
|
|
|
346
347
|
id: 108,
|
|
347
348
|
type: "能量武器",
|
|
348
349
|
category: "传奇武器",
|
|
349
|
-
damage:
|
|
350
|
+
damage: 90,
|
|
350
351
|
description: "一件传奇武器",
|
|
351
352
|
specialeffect: "",
|
|
352
|
-
price:
|
|
353
|
+
price: 7500,
|
|
353
354
|
redCrystalCost: 150,
|
|
354
355
|
isantiair: true,
|
|
355
356
|
tagEffects: {
|
|
@@ -372,9 +373,9 @@ var modConfig = {
|
|
|
372
373
|
exclusiveTo: "",
|
|
373
374
|
isExclusive: false
|
|
374
375
|
},
|
|
375
|
-
"
|
|
376
|
+
"破甲模块": {
|
|
376
377
|
cost: 2750,
|
|
377
|
-
effect: "
|
|
378
|
+
effect: "攻击无视目标20%的减伤效果",
|
|
378
379
|
exclusiveTo: "",
|
|
379
380
|
isExclusive: false
|
|
380
381
|
},
|
|
@@ -540,11 +541,11 @@ var spaceStationCrewConfig = [
|
|
|
540
541
|
effect: "",
|
|
541
542
|
requirements: "",
|
|
542
543
|
Jobtransfer: false,
|
|
543
|
-
costcoins:
|
|
544
|
+
costcoins: 2e3
|
|
544
545
|
},
|
|
545
546
|
{
|
|
546
547
|
professionName: "情报副官",
|
|
547
|
-
effect: "升级空间站科技享有
|
|
548
|
+
effect: "升级空间站科技享有15%的折扣",
|
|
548
549
|
requirements: "至少一个空间站科技等级≥3级",
|
|
549
550
|
Jobtransfer: true,
|
|
550
551
|
costcoins: 3e3
|
|
@@ -584,7 +585,6 @@ var syndicatePirateConfig = [
|
|
|
584
585
|
effect: "能量武器攻击伤害+20%; 解锁MK-4激光步枪(传奇)购买权限",
|
|
585
586
|
requirements: "至少拥有一把3级及以上等级的能量武器",
|
|
586
587
|
Jobtransfer: true,
|
|
587
|
-
costcoins: 0,
|
|
588
588
|
costredcrystal: 30
|
|
589
589
|
},
|
|
590
590
|
{
|
|
@@ -592,23 +592,20 @@ var syndicatePirateConfig = [
|
|
|
592
592
|
effect: "当有异形被击败时获得红晶(击败者获得双倍红晶); 每次攻击额外获得红晶",
|
|
593
593
|
requirements: "当期伤害榜前二十名",
|
|
594
594
|
Jobtransfer: true,
|
|
595
|
-
costcoins: 0,
|
|
596
595
|
costredcrystal: 20
|
|
597
596
|
},
|
|
598
597
|
{
|
|
599
598
|
professionName: "枪手",
|
|
600
|
-
effect: "武器等级上限为7
|
|
601
|
-
requirements: "
|
|
602
|
-
Jobtransfer:
|
|
603
|
-
|
|
604
|
-
costredcrystal: 30
|
|
599
|
+
effect: "武器等级上限为7级; 升级武器享有10%的折扣; 解锁M4AE脉冲步枪(传奇)购买权限",
|
|
600
|
+
requirements: "至少拥有一把6级及以上等级的武器",
|
|
601
|
+
Jobtransfer: true,
|
|
602
|
+
costredcrystal: 40
|
|
605
603
|
},
|
|
606
604
|
{
|
|
607
605
|
professionName: "猩红杀手",
|
|
608
606
|
effect: "使用“侦察步枪”造成的伤害+15%; 解锁DSR-55反器材步枪(传奇)购买权限",
|
|
609
607
|
requirements: "“侦察步枪”武器等级≥3级",
|
|
610
608
|
Jobtransfer: true,
|
|
611
|
-
costcoins: 0,
|
|
612
609
|
costredcrystal: 30
|
|
613
610
|
},
|
|
614
611
|
{
|
|
@@ -616,7 +613,6 @@ var syndicatePirateConfig = [
|
|
|
616
613
|
effect: "热能武器攻击伤害+20%; 解锁龙息霰弹枪(传奇)购买权限",
|
|
617
614
|
requirements: "至少拥有一把3级及以上等级的热能武器",
|
|
618
615
|
Jobtransfer: true,
|
|
619
|
-
costcoins: 0,
|
|
620
616
|
costredcrystal: 30
|
|
621
617
|
},
|
|
622
618
|
{
|
|
@@ -624,15 +620,13 @@ var syndicatePirateConfig = [
|
|
|
624
620
|
effect: "每日签到能额外获得红晶; 主动发起的PK对战结果为胜利时,额外奖励1红晶",
|
|
625
621
|
requirements: "当月累计签到14天及以上",
|
|
626
622
|
Jobtransfer: true,
|
|
627
|
-
costcoins: 0,
|
|
628
623
|
costredcrystal: 25
|
|
629
624
|
},
|
|
630
625
|
{
|
|
631
626
|
professionName: "计算机专家",
|
|
632
627
|
effect: "黑市订购设备工具类物品享有50%折扣; 被动应战的PK对战结果为失败时,不会损失金币",
|
|
633
|
-
requirements: "
|
|
628
|
+
requirements: "仓库中至少拥有一个黑市订购的设备工具类物品",
|
|
634
629
|
Jobtransfer: true,
|
|
635
|
-
costcoins: 0,
|
|
636
630
|
costredcrystal: 30
|
|
637
631
|
},
|
|
638
632
|
{
|
|
@@ -640,7 +634,6 @@ var syndicatePirateConfig = [
|
|
|
640
634
|
effect: "可以使用红晶升级独特的辛迪加空间站科技",
|
|
641
635
|
requirements: "",
|
|
642
636
|
Jobtransfer: false,
|
|
643
|
-
costcoins: 2e3,
|
|
644
637
|
costredcrystal: 10
|
|
645
638
|
},
|
|
646
639
|
{
|
|
@@ -648,23 +641,20 @@ var syndicatePirateConfig = [
|
|
|
648
641
|
effect: "",
|
|
649
642
|
requirements: "",
|
|
650
643
|
Jobtransfer: false,
|
|
651
|
-
costcoins: 2e3,
|
|
652
644
|
costredcrystal: 10
|
|
653
645
|
},
|
|
654
646
|
{
|
|
655
647
|
professionName: "破坏者",
|
|
656
|
-
effect: "",
|
|
657
|
-
requirements: "",
|
|
658
|
-
Jobtransfer:
|
|
659
|
-
|
|
660
|
-
costredcrystal: 10
|
|
648
|
+
effect: "黑市订购爆破物类物品享有50%折扣",
|
|
649
|
+
requirements: "仓库中至少拥有一个黑市订购的爆破物类物品",
|
|
650
|
+
Jobtransfer: true,
|
|
651
|
+
costredcrystal: 25
|
|
661
652
|
},
|
|
662
653
|
{
|
|
663
654
|
professionName: "征募官",
|
|
664
655
|
effect: "",
|
|
665
656
|
requirements: "",
|
|
666
657
|
Jobtransfer: false,
|
|
667
|
-
costcoins: 2e3,
|
|
668
658
|
costredcrystal: 10
|
|
669
659
|
},
|
|
670
660
|
{
|
|
@@ -672,7 +662,6 @@ var syndicatePirateConfig = [
|
|
|
672
662
|
effect: "你只是一个炮灰",
|
|
673
663
|
requirements: "无",
|
|
674
664
|
Jobtransfer: false,
|
|
675
|
-
costcoins: 0,
|
|
676
665
|
costredcrystal: 0
|
|
677
666
|
}
|
|
678
667
|
];
|
|
@@ -754,6 +743,22 @@ async function checkTransferRequirements(ctx, handle, profession) {
|
|
|
754
743
|
};
|
|
755
744
|
}
|
|
756
745
|
;
|
|
746
|
+
case "枪手":
|
|
747
|
+
const hasLevel6Weapon = weapons.some((weapon) => weapon.level >= 6);
|
|
748
|
+
return {
|
|
749
|
+
success: hasLevel6Weapon,
|
|
750
|
+
message: hasLevel6Weapon ? "" : "需要至少拥有一把6级及以上等级的武器"
|
|
751
|
+
};
|
|
752
|
+
case "破坏者":
|
|
753
|
+
const warehouseItems = await ctx.database.get("ggcevo_warehouse", { handle });
|
|
754
|
+
const blackMarketExplosives = Object.values(SyndicatedItems).filter((item) => item.type === "爆破物" && item.redCrystalCost > 0).map((item) => item.id);
|
|
755
|
+
const hasExplosive = warehouseItems.some(
|
|
756
|
+
(item) => blackMarketExplosives.includes(item.itemId) && item.quantity > 0
|
|
757
|
+
);
|
|
758
|
+
return {
|
|
759
|
+
success: hasExplosive,
|
|
760
|
+
message: hasExplosive ? "" : "需要仓库中拥有一个从黑市订购的爆破物类物品"
|
|
761
|
+
};
|
|
757
762
|
case "清洁工":
|
|
758
763
|
if (!mainBoss) return { success: false, message: "当前暂无伤害榜。" };
|
|
759
764
|
const cleanTop20 = await ctx.database.select("ggcevo_boss_damage").where({ bossGroupId: mainBoss.groupId }).orderBy("totalDamage", "desc").limit(20).execute();
|
|
@@ -768,9 +773,9 @@ async function checkTransferRequirements(ctx, handle, profession) {
|
|
|
768
773
|
message: `需要当月累计签到14天及以上(当前${signData?.monthlyDays || 0}天)`
|
|
769
774
|
};
|
|
770
775
|
case "计算机专家": {
|
|
771
|
-
const
|
|
776
|
+
const warehouseItems2 = await ctx.database.get("ggcevo_warehouse", { handle });
|
|
772
777
|
const blackMarketDeviceTools = Object.values(SyndicatedItems).filter((item) => item.type === "设备工具" && item.redCrystalCost > 0).map((item) => item.id);
|
|
773
|
-
const hasDeviceTool =
|
|
778
|
+
const hasDeviceTool = warehouseItems2.some(
|
|
774
779
|
(item) => blackMarketDeviceTools.includes(item.itemId) && item.quantity > 0
|
|
775
780
|
);
|
|
776
781
|
return {
|
|
@@ -848,19 +853,19 @@ var Spacestationtechnology = [
|
|
|
848
853
|
level: 3,
|
|
849
854
|
cost: 2550,
|
|
850
855
|
description: "提升空间站武器等级,升级武器享有15%的折扣",
|
|
851
|
-
careerBonus: "武器中士/情报副官: 升级武器享有30
|
|
856
|
+
careerBonus: "武器中士/情报副官: 升级武器享有30%的折扣"
|
|
852
857
|
},
|
|
853
858
|
{
|
|
854
859
|
level: 4,
|
|
855
860
|
cost: 3950,
|
|
856
861
|
description: "提升空间站武器等级,升级武器享有20%的折扣",
|
|
857
|
-
careerBonus: "武器中士/情报副官: 在升级武器享有40
|
|
862
|
+
careerBonus: "武器中士/情报副官: 在升级武器享有40%的折扣"
|
|
858
863
|
},
|
|
859
864
|
{
|
|
860
865
|
level: 5,
|
|
861
866
|
cost: 4650,
|
|
862
|
-
description: "提升空间站武器等级,升级武器享有25
|
|
863
|
-
careerBonus: "武器中士/情报副官: 升级武器享有50%的折扣;
|
|
867
|
+
description: "提升空间站武器等级,升级武器享有25%的折扣",
|
|
868
|
+
careerBonus: "武器中士/情报副官: 升级武器享有50%的折扣; 解锁传奇武器购买权限1次"
|
|
864
869
|
}
|
|
865
870
|
]
|
|
866
871
|
},
|
|
@@ -919,7 +924,7 @@ var Spacestationtechnology = [
|
|
|
919
924
|
level: 5,
|
|
920
925
|
cost: 5350,
|
|
921
926
|
description: "完全恢复空间站安防系统,攻击获得的金币+25%",
|
|
922
|
-
careerBonus: "警卫员下士/警卫长/情报副官: 攻击获得的金币+50%;
|
|
927
|
+
careerBonus: "警卫员下士/警卫长/情报副官: 攻击获得的金币+50%; 获得一次打开安全军械库防爆门的权限,可以随机获得一把传奇武器"
|
|
923
928
|
}
|
|
924
929
|
]
|
|
925
930
|
}
|
|
@@ -1912,14 +1917,31 @@ async function handleTechUpgrade(ctx, handle, target) {
|
|
|
1912
1917
|
let discountDetails = [];
|
|
1913
1918
|
if (careerData.career === "情报副官") {
|
|
1914
1919
|
discountApplied = true;
|
|
1915
|
-
actualCost = Math.floor(originalCost * 0.
|
|
1916
|
-
discountDetails.push("🎖️ 情报副官:
|
|
1920
|
+
actualCost = Math.floor(originalCost * 0.85);
|
|
1921
|
+
discountDetails.push("🎖️ 情报副官:15%折扣");
|
|
1917
1922
|
}
|
|
1918
1923
|
const [signInfo] = await ctx.database.get("ggcevo_sign", { handle });
|
|
1919
1924
|
if (signInfo?.totalRewards < actualCost) {
|
|
1920
1925
|
const priceHint = discountApplied ? ` (原价${originalCost}金币)` : "";
|
|
1921
1926
|
return `❌ 金币不足!需要${actualCost}金币${priceHint},您当前拥有:${signInfo?.totalRewards || 0}金币`;
|
|
1922
1927
|
}
|
|
1928
|
+
let permissionGrantInfo = null;
|
|
1929
|
+
if (tech.techname === "武器系统" && currentLevel === 4 && nextLevel === 5) {
|
|
1930
|
+
permissionGrantInfo = {
|
|
1931
|
+
type: "武器系统",
|
|
1932
|
+
field: "legendarypermissions",
|
|
1933
|
+
amount: 1,
|
|
1934
|
+
message: "🎉 解锁传奇武器购买权限1次!"
|
|
1935
|
+
};
|
|
1936
|
+
}
|
|
1937
|
+
if (tech.techname === "安防系统" && currentLevel === 4 && nextLevel === 5) {
|
|
1938
|
+
permissionGrantInfo = {
|
|
1939
|
+
type: "安防系统",
|
|
1940
|
+
field: "explosiondoorauthority",
|
|
1941
|
+
amount: 1,
|
|
1942
|
+
message: "🔓 解锁安全军械库防爆门权限1次!"
|
|
1943
|
+
};
|
|
1944
|
+
}
|
|
1923
1945
|
await ctx.database.withTransaction(async () => {
|
|
1924
1946
|
await ctx.database.set("ggcevo_sign", { handle }, {
|
|
1925
1947
|
totalRewards: signInfo.totalRewards - actualCost
|
|
@@ -1929,6 +1951,14 @@ async function handleTechUpgrade(ctx, handle, target) {
|
|
|
1929
1951
|
techId: tech.techId,
|
|
1930
1952
|
level: nextLevel
|
|
1931
1953
|
}], ["handle", "techId"]);
|
|
1954
|
+
if (permissionGrantInfo) {
|
|
1955
|
+
const [permissionRecord] = await ctx.database.get("ggcevo_purchasepermissions", { handle });
|
|
1956
|
+
const currentValue = permissionRecord?.[permissionGrantInfo.field] || 0;
|
|
1957
|
+
await ctx.database.upsert("ggcevo_purchasepermissions", [{
|
|
1958
|
+
handle,
|
|
1959
|
+
[permissionGrantInfo.field]: currentValue + permissionGrantInfo.amount
|
|
1960
|
+
}], ["handle"]);
|
|
1961
|
+
}
|
|
1932
1962
|
});
|
|
1933
1963
|
let discountInfo = [];
|
|
1934
1964
|
if (discountApplied) {
|
|
@@ -1938,13 +1968,23 @@ async function handleTechUpgrade(ctx, handle, target) {
|
|
|
1938
1968
|
];
|
|
1939
1969
|
}
|
|
1940
1970
|
const costInfo = discountApplied ? `💰 花费金币:${actualCost} (原价${originalCost})` : `💰 花费金币:${actualCost}`;
|
|
1971
|
+
let permissionMessage = [];
|
|
1972
|
+
if (permissionGrantInfo) {
|
|
1973
|
+
const [permissionRecord] = await ctx.database.get("ggcevo_purchasepermissions", { handle });
|
|
1974
|
+
const newValue = permissionRecord?.[permissionGrantInfo.field] || permissionGrantInfo.amount;
|
|
1975
|
+
permissionMessage.push(
|
|
1976
|
+
permissionGrantInfo.message
|
|
1977
|
+
);
|
|
1978
|
+
}
|
|
1941
1979
|
return [
|
|
1942
1980
|
`✅ ${tech.techname} 升级至 Lv.${nextLevel}`,
|
|
1943
1981
|
costInfo,
|
|
1944
1982
|
...discountInfo,
|
|
1945
|
-
//
|
|
1983
|
+
// 折扣信息
|
|
1946
1984
|
`📝 ${levelData.description}`,
|
|
1947
|
-
`💼 ${levelData.careerBonus}
|
|
1985
|
+
`💼 ${levelData.careerBonus}`,
|
|
1986
|
+
...permissionMessage
|
|
1987
|
+
// 权限解锁信息
|
|
1948
1988
|
].filter(Boolean).join("\n");
|
|
1949
1989
|
}
|
|
1950
1990
|
__name(handleTechUpgrade, "handleTechUpgrade");
|
|
@@ -1954,15 +1994,21 @@ async function handleWeaponUpgrade(ctx, handle, target) {
|
|
|
1954
1994
|
handle,
|
|
1955
1995
|
weaponId: weaponData.id
|
|
1956
1996
|
});
|
|
1997
|
+
const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
|
|
1957
1998
|
if (!equipment) return "❌ 您尚未获得该武器";
|
|
1958
|
-
|
|
1959
|
-
|
|
1999
|
+
const maxLevel = careerData?.career === "枪手" ? 7 : 6;
|
|
2000
|
+
if (equipment.level >= maxLevel) return `❌ 该武器已达最高等级(Lv.${maxLevel})`;
|
|
2001
|
+
const BASE_COST = [1050, 1450, 1850, 2250, 2650, 3050, 3450];
|
|
1960
2002
|
const baseCost = BASE_COST[equipment.level];
|
|
1961
2003
|
const weaponTechConfig = Spacestationtechnology.find((t) => t.techId === 2);
|
|
1962
|
-
const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
|
|
1963
2004
|
let techLevel = 0;
|
|
1964
2005
|
let totalDiscount = 0;
|
|
1965
2006
|
const discountDetails = [];
|
|
2007
|
+
const isGunslinger = careerData?.career === "枪手";
|
|
2008
|
+
if (isGunslinger) {
|
|
2009
|
+
totalDiscount += 10;
|
|
2010
|
+
discountDetails.push("🔫 枪手:10%折扣");
|
|
2011
|
+
}
|
|
1966
2012
|
if (careerData?.group === "人类联盟") {
|
|
1967
2013
|
const [weaponTech] = await ctx.database.get("ggcevo_tech", { handle, techId: 2 }).catch(() => [{ level: 0 }]);
|
|
1968
2014
|
techLevel = Math.min(Math.max(weaponTech?.level || 0, 0), 5);
|
|
@@ -1992,6 +2038,8 @@ async function handleWeaponUpgrade(ctx, handle, target) {
|
|
|
1992
2038
|
const priceInfo2 = totalDiscount > 0 ? `需要${actualCost}金币(原价${baseCost}金币)` : `需要${actualCost}金币`;
|
|
1993
2039
|
return `❌ ${priceInfo2},您当前拥有:${signInfo?.totalRewards || 0}金币`;
|
|
1994
2040
|
}
|
|
2041
|
+
const newLevel = equipment.level + 1;
|
|
2042
|
+
const newModSlots = Math.floor(newLevel / 3) + 1;
|
|
1995
2043
|
await ctx.database.withTransaction(async () => {
|
|
1996
2044
|
await ctx.database.set("ggcevo_sign", { handle }, {
|
|
1997
2045
|
totalRewards: signInfo.totalRewards - actualCost
|
|
@@ -2000,8 +2048,8 @@ async function handleWeaponUpgrade(ctx, handle, target) {
|
|
|
2000
2048
|
"ggcevo_equipment",
|
|
2001
2049
|
{ handle, weaponId: weaponData.id },
|
|
2002
2050
|
{
|
|
2003
|
-
level:
|
|
2004
|
-
modificationSlots:
|
|
2051
|
+
level: newLevel,
|
|
2052
|
+
modificationSlots: newModSlots
|
|
2005
2053
|
}
|
|
2006
2054
|
);
|
|
2007
2055
|
if (activeWish) {
|
|
@@ -2012,7 +2060,6 @@ async function handleWeaponUpgrade(ctx, handle, target) {
|
|
|
2012
2060
|
);
|
|
2013
2061
|
}
|
|
2014
2062
|
});
|
|
2015
|
-
const newLevel = equipment.level + 1;
|
|
2016
2063
|
const damage = (weaponData.damage * (1 + 0.1 * newLevel)).toFixed(1);
|
|
2017
2064
|
let msg = `${target} 升级成功!Lv.${newLevel}`;
|
|
2018
2065
|
const priceInfo = totalDiscount > 0 ? `
|
|
@@ -2022,12 +2069,12 @@ async function handleWeaponUpgrade(ctx, handle, target) {
|
|
|
2022
2069
|
if (discountDetails.length > 0) {
|
|
2023
2070
|
msg += `
|
|
2024
2071
|
💰 折扣明细:
|
|
2025
|
-
${discountDetails.join("\n▸ ")}`;
|
|
2072
|
+
▸ ${discountDetails.join("\n▸ ")}`;
|
|
2026
2073
|
}
|
|
2027
2074
|
msg += `
|
|
2028
2075
|
💥 伤害:${damage}`;
|
|
2029
2076
|
msg += `
|
|
2030
|
-
🔧 改装槽:${
|
|
2077
|
+
🔧 改装槽:${newModSlots}个`;
|
|
2031
2078
|
return msg;
|
|
2032
2079
|
}
|
|
2033
2080
|
__name(handleWeaponUpgrade, "handleWeaponUpgrade");
|
|
@@ -2042,55 +2089,94 @@ async function checkFoxBlessing(ctx, handle) {
|
|
|
2042
2089
|
}
|
|
2043
2090
|
__name(checkFoxBlessing, "checkFoxBlessing");
|
|
2044
2091
|
async function generateUpgradePriceList(ctx, handle) {
|
|
2045
|
-
const [techData] = await ctx.database.get("ggcevo_tech", { handle, techId: 2 }).catch(() => [{ level: 0 }]);
|
|
2046
2092
|
const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
|
|
2047
|
-
const
|
|
2048
|
-
const
|
|
2049
|
-
|
|
2050
|
-
|
|
2051
|
-
|
|
2052
|
-
|
|
2053
|
-
|
|
2054
|
-
|
|
2055
|
-
|
|
2093
|
+
const isGunslinger = careerData?.career === "枪手";
|
|
2094
|
+
const isAlliance = careerData?.group === "人类联盟";
|
|
2095
|
+
let techLevel = 0;
|
|
2096
|
+
let techDiscountRate = 0;
|
|
2097
|
+
let hasTechDiscount = false;
|
|
2098
|
+
if (isAlliance) {
|
|
2099
|
+
const [techData] = await ctx.database.get("ggcevo_tech", { handle, techId: 2 }).catch(() => [{ level: 0 }]);
|
|
2100
|
+
const weaponTechConfig = Spacestationtechnology.find((t) => t.techId === 2);
|
|
2101
|
+
techLevel = Math.min(techData?.level || 0, 5);
|
|
2102
|
+
const isCareerMatch = weaponTechConfig?.careerNames.includes(careerData?.career);
|
|
2103
|
+
const BASE_DISCOUNTS = [5, 10, 15, 20, 25];
|
|
2104
|
+
const CAREER_DISCOUNTS = [10, 20, 30, 40, 50];
|
|
2105
|
+
const baseDiscount = techLevel > 0 ? BASE_DISCOUNTS[techLevel - 1] : 0;
|
|
2106
|
+
const careerDiscount = isCareerMatch ? CAREER_DISCOUNTS[techLevel - 1] : 0;
|
|
2107
|
+
techDiscountRate = Math.max(baseDiscount, careerDiscount);
|
|
2108
|
+
hasTechDiscount = techDiscountRate > 0;
|
|
2109
|
+
}
|
|
2056
2110
|
const foxBlessing = await checkFoxBlessing(ctx, handle);
|
|
2057
2111
|
const foxDiscount = foxBlessing ? 20 : 0;
|
|
2058
2112
|
const hasFoxDiscount = foxDiscount > 0;
|
|
2059
|
-
const
|
|
2060
|
-
const
|
|
2061
|
-
|
|
2113
|
+
const gunslingerDiscount = isGunslinger ? 10 : 0;
|
|
2114
|
+
const hasGunslingerDiscount = isGunslinger;
|
|
2115
|
+
const BASE_COST = [1050, 1450, 1850, 2250, 2650, 3050, 3450];
|
|
2116
|
+
const maxLevel = isGunslinger ? 7 : 6;
|
|
2117
|
+
const priceDetails = [];
|
|
2118
|
+
for (let i = 0; i < maxLevel; i++) {
|
|
2119
|
+
const level = `${i}→${i + 1}`;
|
|
2120
|
+
let baseCost = BASE_COST[i];
|
|
2062
2121
|
let finalPrice = baseCost;
|
|
2063
|
-
|
|
2064
|
-
|
|
2065
|
-
|
|
2066
|
-
|
|
2122
|
+
let discountsApplied = [];
|
|
2123
|
+
let totalDiscount = 0;
|
|
2124
|
+
if (isGunslinger) {
|
|
2125
|
+
totalDiscount += gunslingerDiscount;
|
|
2126
|
+
discountsApplied.push(`${gunslingerDiscount}% (枪手)`);
|
|
2127
|
+
}
|
|
2128
|
+
if (isAlliance && hasTechDiscount) {
|
|
2129
|
+
totalDiscount += techDiscountRate;
|
|
2130
|
+
discountsApplied.push(`${techDiscountRate}% (科技)`);
|
|
2131
|
+
}
|
|
2132
|
+
if (hasFoxDiscount) {
|
|
2133
|
+
totalDiscount += foxDiscount;
|
|
2134
|
+
discountsApplied.push(`${foxDiscount}% (灵狐)`);
|
|
2135
|
+
}
|
|
2136
|
+
if (totalDiscount > 0) {
|
|
2067
2137
|
totalDiscount = Math.min(totalDiscount, 100);
|
|
2068
|
-
finalPrice = Math.floor(baseCost * (
|
|
2138
|
+
finalPrice = Math.floor(baseCost * (100 - totalDiscount) / 100);
|
|
2069
2139
|
}
|
|
2070
2140
|
const showOriginal = finalPrice < baseCost;
|
|
2071
|
-
|
|
2072
|
-
|
|
2073
|
-
|
|
2074
|
-
|
|
2075
|
-
|
|
2141
|
+
const levelInfo = `等级 ${level.padEnd(5)}`;
|
|
2142
|
+
const priceInfo = `▸ 价格: ${finalPrice.toString().padStart(4)}${showOriginal ? ` (原价${baseCost})` : ""}`;
|
|
2143
|
+
let discountDetail = "";
|
|
2144
|
+
if (discountsApplied.length > 0) {
|
|
2145
|
+
discountDetail = ` - 折扣总计: ${totalDiscount}% [${discountsApplied.join(", ")}]`;
|
|
2146
|
+
}
|
|
2147
|
+
priceDetails.push(`${levelInfo}
|
|
2148
|
+
${priceInfo}`);
|
|
2149
|
+
}
|
|
2076
2150
|
const discountNotice = [];
|
|
2077
|
-
if (hasTechDiscount || hasFoxDiscount) {
|
|
2151
|
+
if (hasTechDiscount || hasFoxDiscount || hasGunslingerDiscount) {
|
|
2078
2152
|
discountNotice.push("💰 当前折扣:");
|
|
2079
2153
|
}
|
|
2080
|
-
if (
|
|
2154
|
+
if (isGunslinger) {
|
|
2155
|
+
discountNotice.push(`🔫 枪手:10%升级武器折扣`);
|
|
2156
|
+
}
|
|
2157
|
+
if (isAlliance && hasTechDiscount) {
|
|
2081
2158
|
discountNotice.push(`⚙️ 武器系统 Lv${techLevel}:${techDiscountRate}%折扣`);
|
|
2082
2159
|
}
|
|
2083
2160
|
if (hasFoxDiscount) {
|
|
2084
2161
|
discountNotice.push(`🦊 灵狐升运:20%折扣`);
|
|
2085
2162
|
}
|
|
2086
|
-
if (!hasTechDiscount && !hasFoxDiscount) {
|
|
2087
|
-
|
|
2163
|
+
if (!hasTechDiscount && !hasFoxDiscount && !hasGunslingerDiscount) {
|
|
2164
|
+
if (isAlliance) {
|
|
2165
|
+
discountNotice.push("💡 提示:升级武器系统可获得折扣");
|
|
2166
|
+
} else if (careerData?.group === "辛迪加海盗") {
|
|
2167
|
+
discountNotice.push("💡 提示:转职为枪手可获得20%折扣");
|
|
2168
|
+
} else {
|
|
2169
|
+
discountNotice.push("💡 提示:加入人类联盟或辛迪加海盗可获得折扣");
|
|
2170
|
+
}
|
|
2171
|
+
}
|
|
2172
|
+
if (isGunslinger) {
|
|
2173
|
+
discountNotice.push("🔝 枪手特权:武器等级上限提升至7级");
|
|
2088
2174
|
}
|
|
2089
2175
|
return [
|
|
2090
2176
|
"⚡ 武器升级价格表 ⚡",
|
|
2177
|
+
`武器等级上限: ${maxLevel}级(${isGunslinger ? "枪手职业特权" : "普通玩家"})`,
|
|
2091
2178
|
"使用「升级 武器名称」对武器进行等级升级",
|
|
2092
2179
|
...discountNotice,
|
|
2093
|
-
// 现在折扣信息前有标题
|
|
2094
2180
|
"====================",
|
|
2095
2181
|
...priceDetails,
|
|
2096
2182
|
"===================="
|
|
@@ -3012,10 +3098,10 @@ var PassiveHandler = {
|
|
|
3012
3098
|
}
|
|
3013
3099
|
return null;
|
|
3014
3100
|
}, "handleCriticalHit"),
|
|
3015
|
-
//
|
|
3101
|
+
// 破甲模块效果处理
|
|
3016
3102
|
handleCorrosionModule: /* @__PURE__ */ __name((installedMods) => {
|
|
3017
3103
|
if (!installedMods) return 0;
|
|
3018
|
-
return installedMods.includes("
|
|
3104
|
+
return installedMods.includes("破甲模块") ? 0.2 : 0;
|
|
3019
3105
|
}, "handleCorrosionModule"),
|
|
3020
3106
|
// 粒子相位枪效果处理
|
|
3021
3107
|
handleParticlePhaseEffect: /* @__PURE__ */ __name((targetBoss, weaponName) => {
|
|
@@ -3064,7 +3150,7 @@ var PassiveHandler = {
|
|
|
3064
3150
|
messages.push(`⚡ 【粒子相位枪】特效:无视护盾目标${particleEffect * 100}%减伤效果`);
|
|
3065
3151
|
}
|
|
3066
3152
|
if (corrosionEffect > 0) {
|
|
3067
|
-
messages.push(`⚡
|
|
3153
|
+
messages.push(`⚡ 【破甲模块】生效:无视目标${corrosionEffect * 100}%减伤效果`);
|
|
3068
3154
|
}
|
|
3069
3155
|
messages.push(
|
|
3070
3156
|
`⚡ 减伤系数由${(originalMultiplier * 100).toFixed(0)}% → ${(effectiveMultiplier * 100).toFixed(0)}%`
|
|
@@ -3789,10 +3875,10 @@ async function calculateRewards(ctx, handle, username, totalDamage) {
|
|
|
3789
3875
|
let careerMessage = "";
|
|
3790
3876
|
if (career === "警卫员下士") {
|
|
3791
3877
|
careerMultiplier = 50;
|
|
3792
|
-
careerMessage = "
|
|
3878
|
+
careerMessage = "🛡️ 警卫员下士:+50%金币";
|
|
3793
3879
|
} else if (career === "警卫长") {
|
|
3794
3880
|
careerMultiplier = 100;
|
|
3795
|
-
careerMessage = "
|
|
3881
|
+
careerMessage = "🛡️ 警卫长:+100%金币";
|
|
3796
3882
|
}
|
|
3797
3883
|
const totalBonusPercent = careerMultiplier + techBonusPercent;
|
|
3798
3884
|
const totalBonusFactor = 1 + totalBonusPercent / 100;
|
|
@@ -3803,7 +3889,7 @@ async function calculateRewards(ctx, handle, username, totalDamage) {
|
|
|
3803
3889
|
handle,
|
|
3804
3890
|
redcrystal: (careerData?.redcrystal || 0) + 1
|
|
3805
3891
|
}], ["handle"]);
|
|
3806
|
-
redcrystalMessage = "🔴
|
|
3892
|
+
redcrystalMessage = "🔴 清洁工:+1枚红晶";
|
|
3807
3893
|
}
|
|
3808
3894
|
return {
|
|
3809
3895
|
finalReward,
|
|
@@ -4168,8 +4254,7 @@ function apply(ctx, config) {
|
|
|
4168
4254
|
ctx.model.extend("ggcevo_purchasepermissions", {
|
|
4169
4255
|
handle: "string",
|
|
4170
4256
|
legendarypermissions: "unsigned",
|
|
4171
|
-
explosiondoorauthority: "unsigned"
|
|
4172
|
-
syndicatelegendspermissions: "unsigned"
|
|
4257
|
+
explosiondoorauthority: "unsigned"
|
|
4173
4258
|
}, {
|
|
4174
4259
|
primary: "handle"
|
|
4175
4260
|
});
|
|
@@ -5732,7 +5817,7 @@ ${items.join("、")}
|
|
|
5732
5817
|
result.push(`🔴 辛迪加海盗:+1枚红晶`);
|
|
5733
5818
|
}
|
|
5734
5819
|
if (isWin && initiatorCareer?.career === "辛迪加财务经理") {
|
|
5735
|
-
result.push(
|
|
5820
|
+
result.push(`🎖️ 辛迪加财务经理:+1枚红晶`);
|
|
5736
5821
|
}
|
|
5737
5822
|
result.push(`📅 剩余挑战次数:${config.dailyPKLimit - (initiatorPK.todayCount + 1)}`);
|
|
5738
5823
|
return result.join("\n");
|
|
@@ -5774,33 +5859,17 @@ ${items.join("、")}
|
|
|
5774
5859
|
pageNum < totalPages ? `输入 pk榜 ${pageNum + 1} 查看下一页` : "已是最后一页"
|
|
5775
5860
|
].join("\n");
|
|
5776
5861
|
});
|
|
5777
|
-
ctx.command("ggcevo/武器库 [category]").usage("
|
|
5862
|
+
ctx.command("ggcevo/武器库 [category]").usage('输入"武器库"查看类型,或"武器库 类型"查看详细武器信息').action(async ({ session }, category) => {
|
|
5778
5863
|
const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
|
|
5779
5864
|
if (!profile) return "⚠️ 需要先绑定游戏句柄";
|
|
5780
5865
|
const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
|
|
5781
|
-
const [techData] = await ctx.database.get("ggcevo_tech", { handle, techId: 2 }).catch(() => [{ level: 0 }]);
|
|
5782
5866
|
const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
|
|
5783
|
-
const group = careerData?.group || "";
|
|
5784
5867
|
const discountDetails = [];
|
|
5785
|
-
let
|
|
5786
|
-
if (group === "人类联盟") {
|
|
5787
|
-
const techLevel = techData?.level || 0;
|
|
5788
|
-
if (techLevel > 0) {
|
|
5789
|
-
const isCareerMatch = Spacestationtechnology.find((t) => t.techId === 2).careerNames.includes(careerData?.career);
|
|
5790
|
-
const BASE_DISCOUNTS = [0, 0, 0, 0, 0];
|
|
5791
|
-
const CAREER_DISCOUNTS = [0, 0, 10, 15, 20];
|
|
5792
|
-
const baseDiscount = techLevel > 0 ? BASE_DISCOUNTS[techLevel - 1] : 0;
|
|
5793
|
-
const careerDiscount = isCareerMatch ? CAREER_DISCOUNTS[techLevel - 1] : 0;
|
|
5794
|
-
techDiscount = Math.max(baseDiscount, careerDiscount);
|
|
5795
|
-
if (techDiscount > 0) {
|
|
5796
|
-
discountDetails.push(`⚙️ 武器系统 Lv${techLevel}:${techDiscount}%折扣`);
|
|
5797
|
-
}
|
|
5798
|
-
}
|
|
5799
|
-
}
|
|
5800
|
-
let weaponSpecialistDiscount = 0;
|
|
5868
|
+
let totalDiscount = 0;
|
|
5801
5869
|
if (careerData?.career === "武器中士") {
|
|
5802
|
-
weaponSpecialistDiscount = 20;
|
|
5803
|
-
|
|
5870
|
+
const weaponSpecialistDiscount = 20;
|
|
5871
|
+
totalDiscount += weaponSpecialistDiscount;
|
|
5872
|
+
discountDetails.push(`🎖️ 武器中士:${weaponSpecialistDiscount}%折扣`);
|
|
5804
5873
|
}
|
|
5805
5874
|
const activeWish = await ctx.database.get("ggcevo_Wish_Record", {
|
|
5806
5875
|
handle,
|
|
@@ -5809,11 +5878,11 @@ ${items.join("、")}
|
|
|
5809
5878
|
endTime: { $gte: /* @__PURE__ */ new Date() },
|
|
5810
5879
|
isused: false
|
|
5811
5880
|
}).then((records) => records[0]);
|
|
5812
|
-
|
|
5813
|
-
|
|
5881
|
+
if (activeWish) {
|
|
5882
|
+
const grasshopperDiscount = 20;
|
|
5883
|
+
totalDiscount += grasshopperDiscount;
|
|
5814
5884
|
discountDetails.push(`🦗 蚱蜢优购:${grasshopperDiscount}%折扣`);
|
|
5815
5885
|
}
|
|
5816
|
-
let totalDiscount = techDiscount + weaponSpecialistDiscount + grasshopperDiscount;
|
|
5817
5886
|
totalDiscount = Math.min(totalDiscount, 100);
|
|
5818
5887
|
const categoryStats = Object.values(weaponConfig).filter((weapon) => weapon.price !== 0).reduce((stats, weapon) => {
|
|
5819
5888
|
stats[weapon.category] = (stats[weapon.category] || 0) + 1;
|
|
@@ -5834,8 +5903,12 @@ ${discountDetails.length ? `${discountDetails.join("\n")}` : ""}`,
|
|
|
5834
5903
|
return `无效武器分类,可用分类:
|
|
5835
5904
|
${Object.keys(categoryStats).join("、")}`;
|
|
5836
5905
|
}
|
|
5906
|
+
const isLegendaryCategory = category === "传奇武器";
|
|
5837
5907
|
const items = Object.entries(weaponConfig).filter(([_, config2]) => config2.category === category && config2.price !== 0).map(([name2, config2]) => {
|
|
5838
|
-
const
|
|
5908
|
+
const shouldApplyDiscount = !isLegendaryCategory && config2.category !== "传奇武器";
|
|
5909
|
+
const displayPrice = shouldApplyDiscount ? Math.floor(config2.price * (100 - totalDiscount) / 100) : config2.price;
|
|
5910
|
+
const showOriginalPrice = shouldApplyDiscount && totalDiscount > 0;
|
|
5911
|
+
const priceDisplay = showOriginalPrice ? `${displayPrice}金币 (原价${config2.price})` : `${displayPrice}金币`;
|
|
5839
5912
|
let tagEffectsDesc = "▸ 无特殊加成效果";
|
|
5840
5913
|
if (config2.tagEffects && Object.keys(config2.tagEffects).length > 0) {
|
|
5841
5914
|
tagEffectsDesc = Object.entries(config2.tagEffects).map(([tag, multiplier]) => `▸ 对${tag}目标造成${(multiplier * 100).toFixed(0)}%伤害`).join("\n");
|
|
@@ -5843,22 +5916,24 @@ ${Object.keys(categoryStats).join("、")}`;
|
|
|
5843
5916
|
const specialEffect = config2.specialeffect ? `特殊效果:${config2.specialeffect}` : "";
|
|
5844
5917
|
return [
|
|
5845
5918
|
`【${name2}】`,
|
|
5846
|
-
|
|
5919
|
+
`武器类型:${config2.type}`,
|
|
5847
5920
|
`基础伤害:${config2.damage}`,
|
|
5848
|
-
`价格:${
|
|
5921
|
+
`价格:${priceDisplay}`,
|
|
5849
5922
|
specialEffect,
|
|
5850
5923
|
"特性:",
|
|
5851
5924
|
tagEffectsDesc,
|
|
5852
|
-
// 确保tagEffects为空时也显示"无特殊加成效果"
|
|
5853
5925
|
`描述:${config2.description}`,
|
|
5854
5926
|
"------------------"
|
|
5855
5927
|
].filter(Boolean).join("\n");
|
|
5856
5928
|
});
|
|
5929
|
+
const shouldShowDiscountInfo = totalDiscount > 0 && !isLegendaryCategory;
|
|
5930
|
+
const discountInfo = shouldShowDiscountInfo ? `💰 当前折扣:
|
|
5931
|
+
${discountDetails.length ? `${discountDetails.join("\n")}` : ""}` : null;
|
|
5857
5932
|
return [
|
|
5858
5933
|
`🏪 咕咕武器库 - ${category} 🏪`,
|
|
5859
5934
|
'使用"购买 武器名称"指令进行购买',
|
|
5860
|
-
|
|
5861
|
-
|
|
5935
|
+
discountInfo,
|
|
5936
|
+
// 传奇武器分类时不显示此信息
|
|
5862
5937
|
"====================",
|
|
5863
5938
|
...items,
|
|
5864
5939
|
items.length === 0 ? "⚠️ 该分类下暂无可用武器" : ""
|
|
@@ -5930,46 +6005,48 @@ ${validTypes.join("、")}`;
|
|
|
5930
6005
|
if (!permissions || permissions.legendarypermissions <= 0) {
|
|
5931
6006
|
return '❌ 购买传奇武器需要"传奇武器购买权限",您当前没有购买权限。';
|
|
5932
6007
|
}
|
|
6008
|
+
const [careerData2] = await ctx.database.get("ggcevo_careers", { handle });
|
|
6009
|
+
const [weaponTech] = await ctx.database.get("ggcevo_tech", { handle, techId: 2 });
|
|
6010
|
+
if (!careerData2 || careerData2.group !== "人类联盟") {
|
|
6011
|
+
return '❌ 购买传奇武器需要在"人类联盟"阵营。';
|
|
6012
|
+
}
|
|
6013
|
+
const weaponSystemLevel = weaponTech?.level || 0;
|
|
6014
|
+
if (weaponSystemLevel < 5) {
|
|
6015
|
+
return `❌ 购买传奇武器需要将武器系统升级到5级(当前等级:${weaponSystemLevel})。`;
|
|
6016
|
+
}
|
|
6017
|
+
if (!careerData2.career || !["情报副官", "武器中士"].includes(careerData2.career)) {
|
|
6018
|
+
return `❌ 购买传奇武器需要成为"情报副官"或"武器中士"(当前职业:${careerData2.career || "无"})。`;
|
|
6019
|
+
}
|
|
5933
6020
|
}
|
|
5934
6021
|
const [signInfo] = await ctx.database.get("ggcevo_sign", { handle });
|
|
5935
6022
|
const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
|
|
5936
|
-
const [weaponTech] = await ctx.database.get("ggcevo_tech", { handle, techId: 2 });
|
|
5937
6023
|
let totalDiscount = 0;
|
|
5938
6024
|
let discountDetails = [];
|
|
5939
|
-
|
|
5940
|
-
|
|
5941
|
-
|
|
5942
|
-
|
|
5943
|
-
|
|
5944
|
-
|
|
5945
|
-
|
|
5946
|
-
|
|
5947
|
-
|
|
5948
|
-
|
|
5949
|
-
|
|
5950
|
-
|
|
5951
|
-
totalDiscount +=
|
|
5952
|
-
discountDetails.push(
|
|
5953
|
-
`武器系统 Lv${techLevel}${isQualifiedCareer ? "(职业加成)" : ""}:${techDiscount}%折扣`
|
|
5954
|
-
);
|
|
6025
|
+
let activeWish = null;
|
|
6026
|
+
if (!isLegendaryWeapon) {
|
|
6027
|
+
if (isWeapon) {
|
|
6028
|
+
activeWish = await ctx.database.get("ggcevo_Wish_Record", {
|
|
6029
|
+
handle,
|
|
6030
|
+
wishname: "蚱蜢优购",
|
|
6031
|
+
startTime: { $lte: /* @__PURE__ */ new Date() },
|
|
6032
|
+
endTime: { $gte: /* @__PURE__ */ new Date() },
|
|
6033
|
+
isused: false
|
|
6034
|
+
}).then((records) => records[0] || null);
|
|
6035
|
+
if (activeWish) {
|
|
6036
|
+
const wishDiscount = 20;
|
|
6037
|
+
totalDiscount += wishDiscount;
|
|
6038
|
+
discountDetails.push(`🦗 蚱蜢优购:${wishDiscount}%折扣`);
|
|
5955
6039
|
}
|
|
5956
6040
|
}
|
|
5957
|
-
|
|
5958
|
-
|
|
5959
|
-
|
|
5960
|
-
|
|
5961
|
-
|
|
5962
|
-
endTime: { $gte: /* @__PURE__ */ new Date() },
|
|
5963
|
-
isused: false
|
|
5964
|
-
}).then((records) => records[0]) : null;
|
|
5965
|
-
if (activeWish) {
|
|
5966
|
-
const wishDiscount = 20;
|
|
5967
|
-
totalDiscount += wishDiscount;
|
|
5968
|
-
discountDetails.push(`蚱蜢优购祈愿生效:${wishDiscount}%折扣`);
|
|
6041
|
+
if (isWeapon && careerData?.career === "武器中士") {
|
|
6042
|
+
const specialistDiscount = 20;
|
|
6043
|
+
totalDiscount += specialistDiscount;
|
|
6044
|
+
discountDetails.push(`🎖️ 武器中士:${specialistDiscount}%折扣`);
|
|
6045
|
+
}
|
|
5969
6046
|
totalDiscount = Math.min(totalDiscount, 100);
|
|
5970
6047
|
}
|
|
5971
6048
|
let actualPrice = config2.price;
|
|
5972
|
-
if (totalDiscount > 0) {
|
|
6049
|
+
if (!isLegendaryWeapon && totalDiscount > 0) {
|
|
5973
6050
|
actualPrice = Math.floor(config2.price * (100 - totalDiscount) / 100);
|
|
5974
6051
|
actualPrice = Math.max(actualPrice, 1);
|
|
5975
6052
|
}
|
|
@@ -5977,6 +6054,8 @@ ${validTypes.join("、")}`;
|
|
|
5977
6054
|
let priceInfo = `需要 ${actualPrice} 金币`;
|
|
5978
6055
|
if (discountDetails.length > 0) {
|
|
5979
6056
|
priceInfo += `(原价${config2.price})`;
|
|
6057
|
+
} else if (isLegendaryWeapon) {
|
|
6058
|
+
priceInfo = `需要 ${actualPrice} 金币 (传奇武器无折扣)`;
|
|
5980
6059
|
}
|
|
5981
6060
|
return `❌ 金币不足,${priceInfo}`;
|
|
5982
6061
|
}
|
|
@@ -6036,11 +6115,12 @@ ${validTypes.join("、")}`;
|
|
|
6036
6115
|
const [permissions] = await ctx.database.get("ggcevo_purchasepermissions", { handle });
|
|
6037
6116
|
message += `
|
|
6038
6117
|
扣除 1 次传奇武器购买权限,剩余次数:${permissions?.legendarypermissions || 0}`;
|
|
6039
|
-
}
|
|
6040
|
-
if (discountDetails.length > 0) {
|
|
6118
|
+
} else if (discountDetails.length > 0) {
|
|
6041
6119
|
message += `(原价${config2.price} 金币)
|
|
6042
6120
|
折扣明细:
|
|
6043
6121
|
▸ ${discountDetails.join("\n▸ ")}`;
|
|
6122
|
+
} else {
|
|
6123
|
+
message += ` (原价${config2.price} 金币)`;
|
|
6044
6124
|
}
|
|
6045
6125
|
if (isWeapon) {
|
|
6046
6126
|
if (isAutoEquipped) {
|
|
@@ -6999,6 +7079,7 @@ ${validTypes.join("、")}`;
|
|
|
6999
7079
|
return "🚫 该功能需要【辛迪加海盗】阵营权限";
|
|
7000
7080
|
}
|
|
7001
7081
|
const isComputerExpert = careerData.career === "计算机专家";
|
|
7082
|
+
const isSaboteur = careerData.career === "破坏者";
|
|
7002
7083
|
const categoryStats = {};
|
|
7003
7084
|
Object.values(weaponConfig).filter((config2) => config2.redCrystalCost > 0).forEach((weapon) => {
|
|
7004
7085
|
categoryStats[weapon.category] = (categoryStats[weapon.category] || 0) + 1;
|
|
@@ -7007,12 +7088,19 @@ ${validTypes.join("、")}`;
|
|
|
7007
7088
|
categoryStats[item.type] = (categoryStats[item.type] || 0) + 1;
|
|
7008
7089
|
});
|
|
7009
7090
|
if (!category) {
|
|
7091
|
+
const discountLines = [];
|
|
7092
|
+
if (isComputerExpert) {
|
|
7093
|
+
discountLines.push("💻 计算机专家:设备工具类物品50%折扣");
|
|
7094
|
+
}
|
|
7095
|
+
if (isSaboteur) {
|
|
7096
|
+
discountLines.push("💣 破坏者:爆破物类物品50%折扣");
|
|
7097
|
+
}
|
|
7010
7098
|
return [
|
|
7011
7099
|
"🏴 辛迪加黑市 🏴",
|
|
7012
7100
|
'使用 "黑市 分类名称" 查看详细信息',
|
|
7013
|
-
|
|
7101
|
+
discountLines.length ? [
|
|
7014
7102
|
"💰 当前折扣:",
|
|
7015
|
-
|
|
7103
|
+
...discountLines
|
|
7016
7104
|
].join("\n") : "",
|
|
7017
7105
|
"====================",
|
|
7018
7106
|
...Object.entries(categoryStats).map(([catName, count]) => `▸ ${catName} (${count}种)`),
|
|
@@ -7023,13 +7111,12 @@ ${validTypes.join("、")}`;
|
|
|
7023
7111
|
if (!normalizedCategory) return `无效分类,可用:${Object.keys(categoryStats).join("、")}`;
|
|
7024
7112
|
const items = [
|
|
7025
7113
|
...Object.entries(weaponConfig).filter(
|
|
7026
|
-
([_, config2]) => config2.category === normalizedCategory &&
|
|
7027
|
-
config2.redCrystalCost > 0
|
|
7114
|
+
([_, config2]) => config2.category === normalizedCategory && config2.redCrystalCost > 0
|
|
7028
7115
|
).map(([name2, config2]) => {
|
|
7029
7116
|
const infoBlocks = [
|
|
7030
7117
|
`【${name2}】`,
|
|
7031
|
-
|
|
7032
|
-
|
|
7118
|
+
`武器类型:${config2.type}`,
|
|
7119
|
+
`基础伤害:${config2.damage}`,
|
|
7033
7120
|
`订购价:${config2.redCrystalCost}红晶`
|
|
7034
7121
|
];
|
|
7035
7122
|
if (config2.specialeffect) {
|
|
@@ -7047,17 +7134,28 @@ ${validTypes.join("、")}`;
|
|
|
7047
7134
|
return infoBlocks.join("\n");
|
|
7048
7135
|
}),
|
|
7049
7136
|
...Object.entries(SyndicatedItems).filter(
|
|
7050
|
-
([_, item]) => item.type === normalizedCategory &&
|
|
7051
|
-
item.redCrystalCost > 0
|
|
7137
|
+
([_, item]) => item.type === normalizedCategory && item.redCrystalCost > 0
|
|
7052
7138
|
).map(([name2, item]) => {
|
|
7053
|
-
|
|
7139
|
+
let finalPrice = item.redCrystalCost;
|
|
7140
|
+
let discountApplied = false;
|
|
7141
|
+
let discountType = "";
|
|
7142
|
+
if (isSaboteur && normalizedCategory === "爆破物") {
|
|
7143
|
+
finalPrice = Math.floor(item.redCrystalCost * 0.5);
|
|
7144
|
+
discountApplied = true;
|
|
7145
|
+
discountType = "破坏者";
|
|
7146
|
+
} else if (isComputerExpert && normalizedCategory === "设备工具") {
|
|
7147
|
+
finalPrice = Math.floor(item.redCrystalCost * 0.5);
|
|
7148
|
+
discountApplied = true;
|
|
7149
|
+
discountType = "计算机专家";
|
|
7150
|
+
}
|
|
7054
7151
|
const infoBlocks = [
|
|
7055
7152
|
`【${name2}】`,
|
|
7056
7153
|
`物品类型:${item.type}`
|
|
7057
7154
|
];
|
|
7058
|
-
if (
|
|
7155
|
+
if (discountApplied) {
|
|
7059
7156
|
infoBlocks.push(
|
|
7060
|
-
`订购价:${finalPrice}红晶 (原价${item.redCrystalCost})
|
|
7157
|
+
`订购价:${finalPrice}红晶 (原价${item.redCrystalCost})`,
|
|
7158
|
+
`折扣:${discountType}专属50%折扣`
|
|
7061
7159
|
);
|
|
7062
7160
|
} else {
|
|
7063
7161
|
infoBlocks.push(
|
|
@@ -7073,14 +7171,19 @@ ${validTypes.join("、")}`;
|
|
|
7073
7171
|
})
|
|
7074
7172
|
];
|
|
7075
7173
|
let discountInfo = [];
|
|
7076
|
-
if (
|
|
7174
|
+
if (isSaboteur && normalizedCategory === "爆破物") {
|
|
7175
|
+
discountInfo = [
|
|
7176
|
+
"💰 当前折扣:",
|
|
7177
|
+
"💣 破坏者:爆破物类物品50%折扣"
|
|
7178
|
+
];
|
|
7179
|
+
} else if (isComputerExpert && normalizedCategory === "设备工具") {
|
|
7077
7180
|
discountInfo = [
|
|
7078
7181
|
"💰 当前折扣:",
|
|
7079
7182
|
"💻 计算机专家:设备工具类物品50%折扣"
|
|
7080
7183
|
];
|
|
7081
7184
|
}
|
|
7082
7185
|
return [
|
|
7083
|
-
|
|
7186
|
+
`🏴 辛迪加黑市 - ${normalizedCategory} 🏴`,
|
|
7084
7187
|
'使用"订购 物品名称"进行购买(仅消耗红晶)',
|
|
7085
7188
|
...discountInfo,
|
|
7086
7189
|
"====================",
|
|
@@ -7106,22 +7209,35 @@ ${validTypes.join("、")}`;
|
|
|
7106
7209
|
if (!itemConfig2.redCrystalCost) return "⛔ 该物品不可订购";
|
|
7107
7210
|
const isLegendaryWeapon = isWeapon && itemConfig2.category === "传奇武器";
|
|
7108
7211
|
if (isLegendaryWeapon) {
|
|
7109
|
-
|
|
7110
|
-
|
|
7111
|
-
|
|
7212
|
+
if (item === "MK-4激光步枪" && careerData.career !== "能量武器专家") {
|
|
7213
|
+
return "❌ 购买MK-4激光步枪需要【能量武器专家】职业。";
|
|
7214
|
+
} else if (item === "DSR-55反器材步枪" && careerData.career !== "猩红杀手") {
|
|
7215
|
+
return "❌ 购买DSR-55反器材步枪需要【猩红杀手】职业。";
|
|
7216
|
+
} else if (item === "龙息霰弹枪" && careerData.career !== "纵火狂") {
|
|
7217
|
+
return "❌ 购买龙息霰弹枪需要【纵火狂】职业。";
|
|
7218
|
+
} else if (item === "M4AE脉冲步枪" && careerData.career !== "枪手") {
|
|
7219
|
+
return "❌ 购买M4AE脉冲步枪需要【枪手】职业。";
|
|
7220
|
+
} else if (item !== "MK-4激光步枪" && item !== "DSR-55反器材步枪" && item !== "龙息霰弹枪" && item !== "M4AE脉冲步枪") {
|
|
7221
|
+
return "❌ 未知的传奇武器或未开放购买权限";
|
|
7112
7222
|
}
|
|
7113
7223
|
}
|
|
7114
7224
|
let isComputerExpertDiscount = false;
|
|
7225
|
+
let isSaboteurDiscount = false;
|
|
7115
7226
|
let originalPrice = itemConfig2.redCrystalCost;
|
|
7116
7227
|
let finalCost = originalPrice;
|
|
7117
7228
|
let discountApplied = false;
|
|
7229
|
+
if (!isWeapon && itemConfig2.type === "爆破物" && careerData.career === "破坏者") {
|
|
7230
|
+
finalCost = Math.floor(originalPrice * 0.5);
|
|
7231
|
+
isSaboteurDiscount = true;
|
|
7232
|
+
discountApplied = true;
|
|
7233
|
+
}
|
|
7118
7234
|
if (!isWeapon && itemConfig2.type === "设备工具" && careerData.career === "计算机专家") {
|
|
7119
7235
|
finalCost = Math.floor(originalPrice * 0.5);
|
|
7120
7236
|
isComputerExpertDiscount = true;
|
|
7121
7237
|
discountApplied = true;
|
|
7122
7238
|
}
|
|
7123
7239
|
if ((careerData.redcrystal || 0) < finalCost) {
|
|
7124
|
-
const discountMessage =
|
|
7240
|
+
const discountMessage = discountApplied ? `(原价${originalPrice})` : "";
|
|
7125
7241
|
return `❌ 红晶不足!需要:${finalCost}${discountMessage} 当前拥有红晶:${careerData.redcrystal}`;
|
|
7126
7242
|
}
|
|
7127
7243
|
if (isWeapon) {
|
|
@@ -7136,16 +7252,6 @@ ${validTypes.join("、")}`;
|
|
|
7136
7252
|
await ctx.database.set("ggcevo_careers", { handle }, {
|
|
7137
7253
|
redcrystal: careerData.redcrystal - finalCost
|
|
7138
7254
|
});
|
|
7139
|
-
if (isLegendaryWeapon) {
|
|
7140
|
-
const [permissionRecord] = await ctx.database.get("ggcevo_purchasepermissions", { handle });
|
|
7141
|
-
if (!permissionRecord || permissionRecord.syndicatelegendspermissions <= 0) {
|
|
7142
|
-
throw new Error("辛迪加传奇武器购买权限不足");
|
|
7143
|
-
}
|
|
7144
|
-
const remaining = permissionRecord.syndicatelegendspermissions - 1;
|
|
7145
|
-
await ctx.database.set("ggcevo_purchasepermissions", { handle }, {
|
|
7146
|
-
syndicatelegendspermissions: remaining
|
|
7147
|
-
});
|
|
7148
|
-
}
|
|
7149
7255
|
if (isWeapon) {
|
|
7150
7256
|
await ctx.database.create("ggcevo_equipment", {
|
|
7151
7257
|
handle,
|
|
@@ -7177,13 +7283,11 @@ ${validTypes.join("、")}`;
|
|
|
7177
7283
|
}
|
|
7178
7284
|
});
|
|
7179
7285
|
const buildResponse = /* @__PURE__ */ __name(async () => {
|
|
7180
|
-
let permissionMessage = [];
|
|
7181
|
-
if (isLegendaryWeapon) {
|
|
7182
|
-
const [permissions] = await ctx.database.get("ggcevo_purchasepermissions", { handle });
|
|
7183
|
-
permissionMessage.push(`扣除 1 次辛迪加传奇武器购买权限,剩余次数:${permissions?.syndicatelegendspermissions || 0}`);
|
|
7184
|
-
}
|
|
7185
7286
|
const discountLines = [];
|
|
7186
|
-
if (
|
|
7287
|
+
if (isSaboteurDiscount) {
|
|
7288
|
+
discountLines.push("💣 破坏者:爆破物类物品50%折扣");
|
|
7289
|
+
}
|
|
7290
|
+
if (isComputerExpertDiscount) {
|
|
7187
7291
|
discountLines.push("💻 计算机专家:设备工具类物品50%折扣");
|
|
7188
7292
|
}
|
|
7189
7293
|
const priceInfo = [
|
|
@@ -7193,9 +7297,8 @@ ${validTypes.join("、")}`;
|
|
|
7193
7297
|
const equippedStatus = isAutoEquipped ? "已自动装备武器" : "需手动装备武器";
|
|
7194
7298
|
return [
|
|
7195
7299
|
`✅ 成功订购【${item}】!`,
|
|
7196
|
-
...permissionMessage,
|
|
7197
7300
|
...priceInfo,
|
|
7198
|
-
|
|
7301
|
+
discountLines.length ? `折扣明细:
|
|
7199
7302
|
▸ ${discountLines.join("\n▸ ")}` : "",
|
|
7200
7303
|
`装备状态:${equippedStatus}`,
|
|
7201
7304
|
'输入 "武器仓库" 管理武器'
|
|
@@ -7207,9 +7310,8 @@ ${validTypes.join("、")}`;
|
|
|
7207
7310
|
}).then((r) => r[0]?.quantity || 1);
|
|
7208
7311
|
return [
|
|
7209
7312
|
`✅ 成功订购【${item}】x1!`,
|
|
7210
|
-
...permissionMessage,
|
|
7211
7313
|
...priceInfo,
|
|
7212
|
-
|
|
7314
|
+
discountLines.length ? `折扣明细:
|
|
7213
7315
|
▸ ${discountLines.join("\n▸ ")}` : "",
|
|
7214
7316
|
`当前库存:${currentStock}件`,
|
|
7215
7317
|
'输入 "仓库" 查看所有物品'
|
|
@@ -7322,7 +7424,7 @@ ${validTypes.join("、")}`;
|
|
|
7322
7424
|
'使用 "科技 科技名称" 查看详细信息',
|
|
7323
7425
|
isIntelligenceOfficer ? [
|
|
7324
7426
|
"💰 当前折扣:",
|
|
7325
|
-
"🎖️ 情报副官:
|
|
7427
|
+
"🎖️ 情报副官:15%"
|
|
7326
7428
|
].join("\n") : "",
|
|
7327
7429
|
"====================",
|
|
7328
7430
|
...techList,
|
|
@@ -7336,7 +7438,7 @@ ${validTypes.join("、")}`;
|
|
|
7336
7438
|
${Spacestationtechnology.map((t) => t.techname).join("、")}`;
|
|
7337
7439
|
const techDetails = tech.levels.map((level) => {
|
|
7338
7440
|
const originalCost = level.cost;
|
|
7339
|
-
const discountedCost = isIntelligenceOfficer ? Math.floor(originalCost * 0.
|
|
7441
|
+
const discountedCost = isIntelligenceOfficer ? Math.floor(originalCost * 0.85) : originalCost;
|
|
7340
7442
|
const costDesc = isIntelligenceOfficer ? `▸ 升级花费:${discountedCost}金币 (原价${originalCost})` : `▸ 升级花费:${originalCost}金币`;
|
|
7341
7443
|
return [
|
|
7342
7444
|
`✦ 等级 ${romanNumerals[level.level]}`,
|
package/lib/weapons.d.ts
CHANGED
|
@@ -220,6 +220,7 @@ export declare const weaponConfig: {
|
|
|
220
220
|
redCrystalCost: number;
|
|
221
221
|
isantiair: boolean;
|
|
222
222
|
tagEffects: {
|
|
223
|
+
生物: number;
|
|
223
224
|
护盾: number;
|
|
224
225
|
重甲: number;
|
|
225
226
|
};
|
|
@@ -337,7 +338,7 @@ export declare const modConfig: {
|
|
|
337
338
|
exclusiveTo: string;
|
|
338
339
|
isExclusive: boolean;
|
|
339
340
|
};
|
|
340
|
-
|
|
341
|
+
破甲模块: {
|
|
341
342
|
cost: number;
|
|
342
343
|
effect: string;
|
|
343
344
|
exclusiveTo: string;
|