koishi-plugin-ggcevo-game 1.4.3 → 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/index.js +175 -92
- package/lib/weapons.d.ts +1 -0
- 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/index.js
CHANGED
|
@@ -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,7 +236,7 @@ var weaponConfig = {
|
|
|
236
236
|
id: 14,
|
|
237
237
|
type: "能量武器",
|
|
238
238
|
category: "能量武器",
|
|
239
|
-
damage:
|
|
239
|
+
damage: 32,
|
|
240
240
|
description: "一种原型能量武器,能够发射强大的脉冲",
|
|
241
241
|
specialeffect: "攻击不会触发目标的叠层技能",
|
|
242
242
|
price: 1500,
|
|
@@ -255,6 +255,7 @@ var weaponConfig = {
|
|
|
255
255
|
redCrystalCost: 150,
|
|
256
256
|
isantiair: true,
|
|
257
257
|
tagEffects: {
|
|
258
|
+
"生物": 2,
|
|
258
259
|
"护盾": 0.5,
|
|
259
260
|
"重甲": 0.5
|
|
260
261
|
}
|
|
@@ -292,7 +293,7 @@ var weaponConfig = {
|
|
|
292
293
|
id: 104,
|
|
293
294
|
type: "实弹武器",
|
|
294
295
|
category: "传奇武器",
|
|
295
|
-
damage:
|
|
296
|
+
damage: 120,
|
|
296
297
|
description: "一件传奇武器",
|
|
297
298
|
specialeffect: "",
|
|
298
299
|
price: 7500,
|
|
@@ -308,7 +309,7 @@ var weaponConfig = {
|
|
|
308
309
|
category: "传奇武器",
|
|
309
310
|
damage: 100,
|
|
310
311
|
description: "优雅而独特的武器",
|
|
311
|
-
specialeffect: "",
|
|
312
|
+
specialeffect: "无视目标100%的减伤效果",
|
|
312
313
|
price: 7500,
|
|
313
314
|
redCrystalCost: 150,
|
|
314
315
|
isantiair: false,
|
|
@@ -332,7 +333,7 @@ var weaponConfig = {
|
|
|
332
333
|
id: 107,
|
|
333
334
|
type: "能量武器",
|
|
334
335
|
category: "传奇武器",
|
|
335
|
-
damage:
|
|
336
|
+
damage: 60,
|
|
336
337
|
description: "一件传奇武器",
|
|
337
338
|
specialeffect: "攻击无视目标80%的减伤效果",
|
|
338
339
|
price: 7500,
|
|
@@ -346,7 +347,7 @@ var weaponConfig = {
|
|
|
346
347
|
id: 108,
|
|
347
348
|
type: "能量武器",
|
|
348
349
|
category: "传奇武器",
|
|
349
|
-
damage:
|
|
350
|
+
damage: 90,
|
|
350
351
|
description: "一件传奇武器",
|
|
351
352
|
specialeffect: "",
|
|
352
353
|
price: 7500,
|
|
@@ -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 {
|
|
@@ -1912,8 +1917,8 @@ 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) {
|
|
@@ -1989,15 +1994,21 @@ async function handleWeaponUpgrade(ctx, handle, target) {
|
|
|
1989
1994
|
handle,
|
|
1990
1995
|
weaponId: weaponData.id
|
|
1991
1996
|
});
|
|
1997
|
+
const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
|
|
1992
1998
|
if (!equipment) return "❌ 您尚未获得该武器";
|
|
1993
|
-
|
|
1994
|
-
|
|
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];
|
|
1995
2002
|
const baseCost = BASE_COST[equipment.level];
|
|
1996
2003
|
const weaponTechConfig = Spacestationtechnology.find((t) => t.techId === 2);
|
|
1997
|
-
const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
|
|
1998
2004
|
let techLevel = 0;
|
|
1999
2005
|
let totalDiscount = 0;
|
|
2000
2006
|
const discountDetails = [];
|
|
2007
|
+
const isGunslinger = careerData?.career === "枪手";
|
|
2008
|
+
if (isGunslinger) {
|
|
2009
|
+
totalDiscount += 10;
|
|
2010
|
+
discountDetails.push("🔫 枪手:10%折扣");
|
|
2011
|
+
}
|
|
2001
2012
|
if (careerData?.group === "人类联盟") {
|
|
2002
2013
|
const [weaponTech] = await ctx.database.get("ggcevo_tech", { handle, techId: 2 }).catch(() => [{ level: 0 }]);
|
|
2003
2014
|
techLevel = Math.min(Math.max(weaponTech?.level || 0, 0), 5);
|
|
@@ -2027,6 +2038,8 @@ async function handleWeaponUpgrade(ctx, handle, target) {
|
|
|
2027
2038
|
const priceInfo2 = totalDiscount > 0 ? `需要${actualCost}金币(原价${baseCost}金币)` : `需要${actualCost}金币`;
|
|
2028
2039
|
return `❌ ${priceInfo2},您当前拥有:${signInfo?.totalRewards || 0}金币`;
|
|
2029
2040
|
}
|
|
2041
|
+
const newLevel = equipment.level + 1;
|
|
2042
|
+
const newModSlots = Math.floor(newLevel / 3) + 1;
|
|
2030
2043
|
await ctx.database.withTransaction(async () => {
|
|
2031
2044
|
await ctx.database.set("ggcevo_sign", { handle }, {
|
|
2032
2045
|
totalRewards: signInfo.totalRewards - actualCost
|
|
@@ -2035,8 +2048,8 @@ async function handleWeaponUpgrade(ctx, handle, target) {
|
|
|
2035
2048
|
"ggcevo_equipment",
|
|
2036
2049
|
{ handle, weaponId: weaponData.id },
|
|
2037
2050
|
{
|
|
2038
|
-
level:
|
|
2039
|
-
modificationSlots:
|
|
2051
|
+
level: newLevel,
|
|
2052
|
+
modificationSlots: newModSlots
|
|
2040
2053
|
}
|
|
2041
2054
|
);
|
|
2042
2055
|
if (activeWish) {
|
|
@@ -2047,7 +2060,6 @@ async function handleWeaponUpgrade(ctx, handle, target) {
|
|
|
2047
2060
|
);
|
|
2048
2061
|
}
|
|
2049
2062
|
});
|
|
2050
|
-
const newLevel = equipment.level + 1;
|
|
2051
2063
|
const damage = (weaponData.damage * (1 + 0.1 * newLevel)).toFixed(1);
|
|
2052
2064
|
let msg = `${target} 升级成功!Lv.${newLevel}`;
|
|
2053
2065
|
const priceInfo = totalDiscount > 0 ? `
|
|
@@ -2057,12 +2069,12 @@ async function handleWeaponUpgrade(ctx, handle, target) {
|
|
|
2057
2069
|
if (discountDetails.length > 0) {
|
|
2058
2070
|
msg += `
|
|
2059
2071
|
💰 折扣明细:
|
|
2060
|
-
${discountDetails.join("\n▸ ")}`;
|
|
2072
|
+
▸ ${discountDetails.join("\n▸ ")}`;
|
|
2061
2073
|
}
|
|
2062
2074
|
msg += `
|
|
2063
2075
|
💥 伤害:${damage}`;
|
|
2064
2076
|
msg += `
|
|
2065
|
-
🔧 改装槽:${
|
|
2077
|
+
🔧 改装槽:${newModSlots}个`;
|
|
2066
2078
|
return msg;
|
|
2067
2079
|
}
|
|
2068
2080
|
__name(handleWeaponUpgrade, "handleWeaponUpgrade");
|
|
@@ -2077,55 +2089,94 @@ async function checkFoxBlessing(ctx, handle) {
|
|
|
2077
2089
|
}
|
|
2078
2090
|
__name(checkFoxBlessing, "checkFoxBlessing");
|
|
2079
2091
|
async function generateUpgradePriceList(ctx, handle) {
|
|
2080
|
-
const [techData] = await ctx.database.get("ggcevo_tech", { handle, techId: 2 }).catch(() => [{ level: 0 }]);
|
|
2081
2092
|
const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
|
|
2082
|
-
const
|
|
2083
|
-
const
|
|
2084
|
-
|
|
2085
|
-
|
|
2086
|
-
|
|
2087
|
-
|
|
2088
|
-
|
|
2089
|
-
|
|
2090
|
-
|
|
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
|
+
}
|
|
2091
2110
|
const foxBlessing = await checkFoxBlessing(ctx, handle);
|
|
2092
2111
|
const foxDiscount = foxBlessing ? 20 : 0;
|
|
2093
2112
|
const hasFoxDiscount = foxDiscount > 0;
|
|
2094
|
-
const
|
|
2095
|
-
const
|
|
2096
|
-
|
|
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];
|
|
2097
2121
|
let finalPrice = baseCost;
|
|
2098
|
-
|
|
2099
|
-
|
|
2100
|
-
|
|
2101
|
-
|
|
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) {
|
|
2102
2137
|
totalDiscount = Math.min(totalDiscount, 100);
|
|
2103
|
-
finalPrice = Math.floor(baseCost * (
|
|
2138
|
+
finalPrice = Math.floor(baseCost * (100 - totalDiscount) / 100);
|
|
2104
2139
|
}
|
|
2105
2140
|
const showOriginal = finalPrice < baseCost;
|
|
2106
|
-
|
|
2107
|
-
|
|
2108
|
-
|
|
2109
|
-
|
|
2110
|
-
|
|
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
|
+
}
|
|
2111
2150
|
const discountNotice = [];
|
|
2112
|
-
if (hasTechDiscount || hasFoxDiscount) {
|
|
2151
|
+
if (hasTechDiscount || hasFoxDiscount || hasGunslingerDiscount) {
|
|
2113
2152
|
discountNotice.push("💰 当前折扣:");
|
|
2114
2153
|
}
|
|
2115
|
-
if (
|
|
2154
|
+
if (isGunslinger) {
|
|
2155
|
+
discountNotice.push(`🔫 枪手:10%升级武器折扣`);
|
|
2156
|
+
}
|
|
2157
|
+
if (isAlliance && hasTechDiscount) {
|
|
2116
2158
|
discountNotice.push(`⚙️ 武器系统 Lv${techLevel}:${techDiscountRate}%折扣`);
|
|
2117
2159
|
}
|
|
2118
2160
|
if (hasFoxDiscount) {
|
|
2119
2161
|
discountNotice.push(`🦊 灵狐升运:20%折扣`);
|
|
2120
2162
|
}
|
|
2121
|
-
if (!hasTechDiscount && !hasFoxDiscount) {
|
|
2122
|
-
|
|
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级");
|
|
2123
2174
|
}
|
|
2124
2175
|
return [
|
|
2125
2176
|
"⚡ 武器升级价格表 ⚡",
|
|
2177
|
+
`武器等级上限: ${maxLevel}级(${isGunslinger ? "枪手职业特权" : "普通玩家"})`,
|
|
2126
2178
|
"使用「升级 武器名称」对武器进行等级升级",
|
|
2127
2179
|
...discountNotice,
|
|
2128
|
-
// 现在折扣信息前有标题
|
|
2129
2180
|
"====================",
|
|
2130
2181
|
...priceDetails,
|
|
2131
2182
|
"===================="
|
|
@@ -3824,10 +3875,10 @@ async function calculateRewards(ctx, handle, username, totalDamage) {
|
|
|
3824
3875
|
let careerMessage = "";
|
|
3825
3876
|
if (career === "警卫员下士") {
|
|
3826
3877
|
careerMultiplier = 50;
|
|
3827
|
-
careerMessage = "
|
|
3878
|
+
careerMessage = "🛡️ 警卫员下士:+50%金币";
|
|
3828
3879
|
} else if (career === "警卫长") {
|
|
3829
3880
|
careerMultiplier = 100;
|
|
3830
|
-
careerMessage = "
|
|
3881
|
+
careerMessage = "🛡️ 警卫长:+100%金币";
|
|
3831
3882
|
}
|
|
3832
3883
|
const totalBonusPercent = careerMultiplier + techBonusPercent;
|
|
3833
3884
|
const totalBonusFactor = 1 + totalBonusPercent / 100;
|
|
@@ -3838,7 +3889,7 @@ async function calculateRewards(ctx, handle, username, totalDamage) {
|
|
|
3838
3889
|
handle,
|
|
3839
3890
|
redcrystal: (careerData?.redcrystal || 0) + 1
|
|
3840
3891
|
}], ["handle"]);
|
|
3841
|
-
redcrystalMessage = "
|
|
3892
|
+
redcrystalMessage = "🔴 清洁工:+1枚红晶";
|
|
3842
3893
|
}
|
|
3843
3894
|
return {
|
|
3844
3895
|
finalReward,
|
|
@@ -7028,6 +7079,7 @@ ${validTypes.join("、")}`;
|
|
|
7028
7079
|
return "🚫 该功能需要【辛迪加海盗】阵营权限";
|
|
7029
7080
|
}
|
|
7030
7081
|
const isComputerExpert = careerData.career === "计算机专家";
|
|
7082
|
+
const isSaboteur = careerData.career === "破坏者";
|
|
7031
7083
|
const categoryStats = {};
|
|
7032
7084
|
Object.values(weaponConfig).filter((config2) => config2.redCrystalCost > 0).forEach((weapon) => {
|
|
7033
7085
|
categoryStats[weapon.category] = (categoryStats[weapon.category] || 0) + 1;
|
|
@@ -7036,12 +7088,19 @@ ${validTypes.join("、")}`;
|
|
|
7036
7088
|
categoryStats[item.type] = (categoryStats[item.type] || 0) + 1;
|
|
7037
7089
|
});
|
|
7038
7090
|
if (!category) {
|
|
7091
|
+
const discountLines = [];
|
|
7092
|
+
if (isComputerExpert) {
|
|
7093
|
+
discountLines.push("💻 计算机专家:设备工具类物品50%折扣");
|
|
7094
|
+
}
|
|
7095
|
+
if (isSaboteur) {
|
|
7096
|
+
discountLines.push("💣 破坏者:爆破物类物品50%折扣");
|
|
7097
|
+
}
|
|
7039
7098
|
return [
|
|
7040
7099
|
"🏴 辛迪加黑市 🏴",
|
|
7041
7100
|
'使用 "黑市 分类名称" 查看详细信息',
|
|
7042
|
-
|
|
7101
|
+
discountLines.length ? [
|
|
7043
7102
|
"💰 当前折扣:",
|
|
7044
|
-
|
|
7103
|
+
...discountLines
|
|
7045
7104
|
].join("\n") : "",
|
|
7046
7105
|
"====================",
|
|
7047
7106
|
...Object.entries(categoryStats).map(([catName, count]) => `▸ ${catName} (${count}种)`),
|
|
@@ -7052,14 +7111,11 @@ ${validTypes.join("、")}`;
|
|
|
7052
7111
|
if (!normalizedCategory) return `无效分类,可用:${Object.keys(categoryStats).join("、")}`;
|
|
7053
7112
|
const items = [
|
|
7054
7113
|
...Object.entries(weaponConfig).filter(
|
|
7055
|
-
([_, config2]) => config2.category === normalizedCategory &&
|
|
7056
|
-
config2.redCrystalCost > 0
|
|
7114
|
+
([_, config2]) => config2.category === normalizedCategory && config2.redCrystalCost > 0
|
|
7057
7115
|
).map(([name2, config2]) => {
|
|
7058
7116
|
const infoBlocks = [
|
|
7059
7117
|
`【${name2}】`,
|
|
7060
7118
|
`武器类型:${config2.type}`,
|
|
7061
|
-
// 保留攻击类型显示
|
|
7062
|
-
// +++ 为武器类物品添加基础伤害显示 +++
|
|
7063
7119
|
`基础伤害:${config2.damage}`,
|
|
7064
7120
|
`订购价:${config2.redCrystalCost}红晶`
|
|
7065
7121
|
];
|
|
@@ -7078,17 +7134,28 @@ ${validTypes.join("、")}`;
|
|
|
7078
7134
|
return infoBlocks.join("\n");
|
|
7079
7135
|
}),
|
|
7080
7136
|
...Object.entries(SyndicatedItems).filter(
|
|
7081
|
-
([_, item]) => item.type === normalizedCategory &&
|
|
7082
|
-
item.redCrystalCost > 0
|
|
7137
|
+
([_, item]) => item.type === normalizedCategory && item.redCrystalCost > 0
|
|
7083
7138
|
).map(([name2, item]) => {
|
|
7084
|
-
|
|
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
|
+
}
|
|
7085
7151
|
const infoBlocks = [
|
|
7086
7152
|
`【${name2}】`,
|
|
7087
7153
|
`物品类型:${item.type}`
|
|
7088
7154
|
];
|
|
7089
|
-
if (
|
|
7155
|
+
if (discountApplied) {
|
|
7090
7156
|
infoBlocks.push(
|
|
7091
|
-
`订购价:${finalPrice}红晶 (原价${item.redCrystalCost})
|
|
7157
|
+
`订购价:${finalPrice}红晶 (原价${item.redCrystalCost})`,
|
|
7158
|
+
`折扣:${discountType}专属50%折扣`
|
|
7092
7159
|
);
|
|
7093
7160
|
} else {
|
|
7094
7161
|
infoBlocks.push(
|
|
@@ -7104,14 +7171,19 @@ ${validTypes.join("、")}`;
|
|
|
7104
7171
|
})
|
|
7105
7172
|
];
|
|
7106
7173
|
let discountInfo = [];
|
|
7107
|
-
if (
|
|
7174
|
+
if (isSaboteur && normalizedCategory === "爆破物") {
|
|
7175
|
+
discountInfo = [
|
|
7176
|
+
"💰 当前折扣:",
|
|
7177
|
+
"💣 破坏者:爆破物类物品50%折扣"
|
|
7178
|
+
];
|
|
7179
|
+
} else if (isComputerExpert && normalizedCategory === "设备工具") {
|
|
7108
7180
|
discountInfo = [
|
|
7109
7181
|
"💰 当前折扣:",
|
|
7110
7182
|
"💻 计算机专家:设备工具类物品50%折扣"
|
|
7111
7183
|
];
|
|
7112
7184
|
}
|
|
7113
7185
|
return [
|
|
7114
|
-
|
|
7186
|
+
`🏴 辛迪加黑市 - ${normalizedCategory} 🏴`,
|
|
7115
7187
|
'使用"订购 物品名称"进行购买(仅消耗红晶)',
|
|
7116
7188
|
...discountInfo,
|
|
7117
7189
|
"====================",
|
|
@@ -7143,21 +7215,29 @@ ${validTypes.join("、")}`;
|
|
|
7143
7215
|
return "❌ 购买DSR-55反器材步枪需要【猩红杀手】职业。";
|
|
7144
7216
|
} else if (item === "龙息霰弹枪" && careerData.career !== "纵火狂") {
|
|
7145
7217
|
return "❌ 购买龙息霰弹枪需要【纵火狂】职业。";
|
|
7146
|
-
} else if (item
|
|
7218
|
+
} else if (item === "M4AE脉冲步枪" && careerData.career !== "枪手") {
|
|
7219
|
+
return "❌ 购买M4AE脉冲步枪需要【枪手】职业。";
|
|
7220
|
+
} else if (item !== "MK-4激光步枪" && item !== "DSR-55反器材步枪" && item !== "龙息霰弹枪" && item !== "M4AE脉冲步枪") {
|
|
7147
7221
|
return "❌ 未知的传奇武器或未开放购买权限";
|
|
7148
7222
|
}
|
|
7149
7223
|
}
|
|
7150
7224
|
let isComputerExpertDiscount = false;
|
|
7225
|
+
let isSaboteurDiscount = false;
|
|
7151
7226
|
let originalPrice = itemConfig2.redCrystalCost;
|
|
7152
7227
|
let finalCost = originalPrice;
|
|
7153
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
|
+
}
|
|
7154
7234
|
if (!isWeapon && itemConfig2.type === "设备工具" && careerData.career === "计算机专家") {
|
|
7155
7235
|
finalCost = Math.floor(originalPrice * 0.5);
|
|
7156
7236
|
isComputerExpertDiscount = true;
|
|
7157
7237
|
discountApplied = true;
|
|
7158
7238
|
}
|
|
7159
7239
|
if ((careerData.redcrystal || 0) < finalCost) {
|
|
7160
|
-
const discountMessage =
|
|
7240
|
+
const discountMessage = discountApplied ? `(原价${originalPrice})` : "";
|
|
7161
7241
|
return `❌ 红晶不足!需要:${finalCost}${discountMessage} 当前拥有红晶:${careerData.redcrystal}`;
|
|
7162
7242
|
}
|
|
7163
7243
|
if (isWeapon) {
|
|
@@ -7204,7 +7284,10 @@ ${validTypes.join("、")}`;
|
|
|
7204
7284
|
});
|
|
7205
7285
|
const buildResponse = /* @__PURE__ */ __name(async () => {
|
|
7206
7286
|
const discountLines = [];
|
|
7207
|
-
if (
|
|
7287
|
+
if (isSaboteurDiscount) {
|
|
7288
|
+
discountLines.push("💣 破坏者:爆破物类物品50%折扣");
|
|
7289
|
+
}
|
|
7290
|
+
if (isComputerExpertDiscount) {
|
|
7208
7291
|
discountLines.push("💻 计算机专家:设备工具类物品50%折扣");
|
|
7209
7292
|
}
|
|
7210
7293
|
const priceInfo = [
|
|
@@ -7215,7 +7298,7 @@ ${validTypes.join("、")}`;
|
|
|
7215
7298
|
return [
|
|
7216
7299
|
`✅ 成功订购【${item}】!`,
|
|
7217
7300
|
...priceInfo,
|
|
7218
|
-
|
|
7301
|
+
discountLines.length ? `折扣明细:
|
|
7219
7302
|
▸ ${discountLines.join("\n▸ ")}` : "",
|
|
7220
7303
|
`装备状态:${equippedStatus}`,
|
|
7221
7304
|
'输入 "武器仓库" 管理武器'
|
|
@@ -7228,7 +7311,7 @@ ${validTypes.join("、")}`;
|
|
|
7228
7311
|
return [
|
|
7229
7312
|
`✅ 成功订购【${item}】x1!`,
|
|
7230
7313
|
...priceInfo,
|
|
7231
|
-
|
|
7314
|
+
discountLines.length ? `折扣明细:
|
|
7232
7315
|
▸ ${discountLines.join("\n▸ ")}` : "",
|
|
7233
7316
|
`当前库存:${currentStock}件`,
|
|
7234
7317
|
'输入 "仓库" 查看所有物品'
|
|
@@ -7341,7 +7424,7 @@ ${validTypes.join("、")}`;
|
|
|
7341
7424
|
'使用 "科技 科技名称" 查看详细信息',
|
|
7342
7425
|
isIntelligenceOfficer ? [
|
|
7343
7426
|
"💰 当前折扣:",
|
|
7344
|
-
"🎖️ 情报副官:
|
|
7427
|
+
"🎖️ 情报副官:15%"
|
|
7345
7428
|
].join("\n") : "",
|
|
7346
7429
|
"====================",
|
|
7347
7430
|
...techList,
|
|
@@ -7355,7 +7438,7 @@ ${validTypes.join("、")}`;
|
|
|
7355
7438
|
${Spacestationtechnology.map((t) => t.techname).join("、")}`;
|
|
7356
7439
|
const techDetails = tech.levels.map((level) => {
|
|
7357
7440
|
const originalCost = level.cost;
|
|
7358
|
-
const discountedCost = isIntelligenceOfficer ? Math.floor(originalCost * 0.
|
|
7441
|
+
const discountedCost = isIntelligenceOfficer ? Math.floor(originalCost * 0.85) : originalCost;
|
|
7359
7442
|
const costDesc = isIntelligenceOfficer ? `▸ 升级花费:${discountedCost}金币 (原价${originalCost})` : `▸ 升级花费:${originalCost}金币`;
|
|
7360
7443
|
return [
|
|
7361
7444
|
`✦ 等级 ${romanNumerals[level.level]}`,
|
package/lib/weapons.d.ts
CHANGED