koishi-plugin-ggcevo-game 1.3.62 → 1.3.64
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/index.js +746 -346
- package/package.json +1 -1
package/lib/index.js
CHANGED
|
@@ -403,7 +403,7 @@ function apply(ctx, config) {
|
|
|
403
403
|
type: "热能武器",
|
|
404
404
|
damage: 25,
|
|
405
405
|
description: "喷射稳定的液氮恒流,对长时间接触者造成致命的损伤",
|
|
406
|
-
specialeffect: "",
|
|
406
|
+
specialeffect: "攻击使目标叠加“寒冷”层数,每层使其受到的伤害+5%",
|
|
407
407
|
price: 775,
|
|
408
408
|
redCrystalCost: 10,
|
|
409
409
|
isantiair: false,
|
|
@@ -491,7 +491,7 @@ function apply(ctx, config) {
|
|
|
491
491
|
description: "一个小型辛迪加机器人,可以破坏电子银行账户",
|
|
492
492
|
price: 0,
|
|
493
493
|
redCrystalCost: 60,
|
|
494
|
-
effects: "此物品存放于仓库自动生效(阵营必须为辛迪加海盗)。每日签到金币奖励+50
|
|
494
|
+
effects: "此物品存放于仓库自动生效(阵营必须为辛迪加海盗)。每日签到金币奖励+50%,每有一名人类联盟玩家额外增加1%(至多额外增加50%)"
|
|
495
495
|
},
|
|
496
496
|
"脉冲手雷": {
|
|
497
497
|
id: 4,
|
|
@@ -526,7 +526,7 @@ function apply(ctx, config) {
|
|
|
526
526
|
// 新增专属模块
|
|
527
527
|
"裂甲核心": {
|
|
528
528
|
cost: 750,
|
|
529
|
-
effect: "伤害+40%,对重甲目标改为造成
|
|
529
|
+
effect: "伤害+40%,对重甲目标改为造成150%伤害",
|
|
530
530
|
exclusiveTo: "高斯步枪",
|
|
531
531
|
// 指定专属武器
|
|
532
532
|
isExclusive: true
|
|
@@ -680,7 +680,7 @@ function apply(ctx, config) {
|
|
|
680
680
|
},
|
|
681
681
|
"嗜血狂暴": {
|
|
682
682
|
effect: 0,
|
|
683
|
-
description: "血量低于50
|
|
683
|
+
description: "血量低于50%时,进入狂暴状态,每次受到攻击将会额外获得一层“吸血”,并且受到的伤害-20%"
|
|
684
684
|
},
|
|
685
685
|
"吐血": {
|
|
686
686
|
effect: 0,
|
|
@@ -688,15 +688,19 @@ function apply(ctx, config) {
|
|
|
688
688
|
},
|
|
689
689
|
"辐射": {
|
|
690
690
|
effect: 0,
|
|
691
|
-
description: "
|
|
691
|
+
description: "受到武器伽马枪攻击时会积累辐射层数,每层使受到的伤害增加1%(至多增加100%)"
|
|
692
|
+
},
|
|
693
|
+
"寒冷": {
|
|
694
|
+
effect: 0,
|
|
695
|
+
description: "受到武器零度之下攻击时会积累寒冷层数,每层使受到的伤害增加5%(至多增加50%)"
|
|
692
696
|
},
|
|
693
697
|
"电能导体": {
|
|
694
698
|
effect: 0,
|
|
695
|
-
description: "当血量降低到10%以下时,“护盾”标签变为“重甲”标签;
|
|
699
|
+
description: "当血量降低到10%以下时,“护盾”标签变为“重甲”标签;"
|
|
696
700
|
},
|
|
697
701
|
"超导体": {
|
|
698
702
|
effect: 0,
|
|
699
|
-
description: "当血量降低到5%以下时,“护盾”标签变为“重甲”标签;
|
|
703
|
+
description: "当血量降低到5%以下时,“护盾”标签变为“重甲”标签;"
|
|
700
704
|
},
|
|
701
705
|
"能量虹吸": {
|
|
702
706
|
effect: 0,
|
|
@@ -719,8 +723,32 @@ function apply(ctx, config) {
|
|
|
719
723
|
description: "当“能量”≥10%的时候,每次受到攻击有60%的概率回复所有存活的异形100点血量; 每拥有一层“寒冷”则降低5%的概率"
|
|
720
724
|
},
|
|
721
725
|
"能量黑洞": {
|
|
726
|
+
effect: -0.2,
|
|
727
|
+
description: "存在“能量黑洞”,受到的伤害-20%"
|
|
728
|
+
},
|
|
729
|
+
"火焰异形": {
|
|
730
|
+
effect: 0,
|
|
731
|
+
description: "免疫火焰伤害,受到火焰伤害时会回复生命值"
|
|
732
|
+
},
|
|
733
|
+
"庞兽狂暴": {
|
|
734
|
+
effect: 0,
|
|
735
|
+
description: "血量低于50%时,进入狂暴状态,受到的伤害-50%"
|
|
736
|
+
},
|
|
737
|
+
"灼烧粘液": {
|
|
722
738
|
effect: 0,
|
|
723
|
-
description: "
|
|
739
|
+
description: "受到伤害后,会获得一层“胆汁”; 若存在“胆汁”层数时受到火焰攻击,将立刻清空层数并回复X点生命值(X为“胆汁”层数 x 10)"
|
|
740
|
+
},
|
|
741
|
+
"腐蚀胆汁": {
|
|
742
|
+
effect: 0,
|
|
743
|
+
description: "当“胆汁”达到10层后,下一次受到攻击将治愈所有存活异形1000点血量并清空层数,"
|
|
744
|
+
},
|
|
745
|
+
"火焰吐息": {
|
|
746
|
+
effect: 0,
|
|
747
|
+
description: "当“胆汁”达到20层后,下一次攻击将治愈所有存活异形50%的最大生命值并清空层数"
|
|
748
|
+
},
|
|
749
|
+
"太阳耀斑": {
|
|
750
|
+
effect: 0,
|
|
751
|
+
description: "当所有子代阵亡后,自身将移除“惧寒”标签和“孤立无援”并且免疫寒冷伤害"
|
|
724
752
|
}
|
|
725
753
|
};
|
|
726
754
|
const defineBoss = /* @__PURE__ */ __name((config2) => config2, "defineBoss");
|
|
@@ -874,6 +902,27 @@ function apply(ctx, config) {
|
|
|
874
902
|
passive: asPassives(["弱化形态", "电能导体", "能量虹吸", "能量黑洞"])
|
|
875
903
|
}
|
|
876
904
|
]
|
|
905
|
+
}),
|
|
906
|
+
defineBoss({
|
|
907
|
+
main: {
|
|
908
|
+
id: 7,
|
|
909
|
+
name: "烈焰庞兽",
|
|
910
|
+
type: "主宰",
|
|
911
|
+
maxHP: 2e4,
|
|
912
|
+
energy: 0,
|
|
913
|
+
tags: asBossTags(["重甲", "生物", "惧寒", "重型", "异形"]),
|
|
914
|
+
passive: asPassives(["火焰异形", "庞兽狂暴", "灼烧粘液", "火焰吐息", "太阳耀斑"])
|
|
915
|
+
},
|
|
916
|
+
minions: [
|
|
917
|
+
{
|
|
918
|
+
name: "火焰甲虫",
|
|
919
|
+
type: "子代",
|
|
920
|
+
maxHP: 5e3,
|
|
921
|
+
energy: 0,
|
|
922
|
+
tags: asBossTags(["重甲", "生物", "惧寒", "异形"]),
|
|
923
|
+
passive: asPassives(["弱化形态", "火焰异形", "灼烧粘液", "腐蚀胆汁"])
|
|
924
|
+
}
|
|
925
|
+
]
|
|
877
926
|
})
|
|
878
927
|
];
|
|
879
928
|
const spaceStationCrewConfig = [
|
|
@@ -1203,6 +1252,15 @@ function apply(ctx, config) {
|
|
|
1203
1252
|
price: 100,
|
|
1204
1253
|
redCrystalCost: 0,
|
|
1205
1254
|
condition: "使用零度之下攻击异形并成功使寒冷层数+1"
|
|
1255
|
+
},
|
|
1256
|
+
"顾全大局": {
|
|
1257
|
+
id: 3,
|
|
1258
|
+
type: "可重复任务",
|
|
1259
|
+
description: "利用【焚烧枪】武器引爆异形目标的胆汁",
|
|
1260
|
+
target: 1,
|
|
1261
|
+
price: 200,
|
|
1262
|
+
redCrystalCost: 0,
|
|
1263
|
+
condition: "使用焚烧枪攻击异形并成功引爆≥10层的胆汁"
|
|
1206
1264
|
}
|
|
1207
1265
|
};
|
|
1208
1266
|
async function calculateTotalDamage(ctx2, session, equippedWeapon, targetBoss, options) {
|
|
@@ -1259,7 +1317,7 @@ function apply(ctx, config) {
|
|
|
1259
1317
|
__name(checkCritRhythm, "checkCritRhythm");
|
|
1260
1318
|
async function calculateTagMultiplier(weaponData, tags, equippedWeapon) {
|
|
1261
1319
|
const MOD_EFFECTS = [
|
|
1262
|
-
{ mod: "裂甲核心", tag: "重甲", value: 1.
|
|
1320
|
+
{ mod: "裂甲核心", tag: "重甲", value: 1.5 },
|
|
1263
1321
|
{ mod: "助燃核心", tag: "惧热", value: 3 },
|
|
1264
1322
|
{ mod: "助燃核心", tag: "生物", value: 2 }
|
|
1265
1323
|
];
|
|
@@ -1315,28 +1373,28 @@ function apply(ctx, config) {
|
|
|
1315
1373
|
let message = "";
|
|
1316
1374
|
if (careerData?.career === "警卫长") {
|
|
1317
1375
|
value += 0.05;
|
|
1318
|
-
message = "⚔️
|
|
1376
|
+
message = "⚔️ 警卫长:攻击伤害+5%";
|
|
1319
1377
|
}
|
|
1320
1378
|
if (careerData?.career === "武器中士") {
|
|
1321
1379
|
value += 0.15;
|
|
1322
|
-
message = "⚔️
|
|
1380
|
+
message = "⚔️ 武器中士:攻击伤害+15%";
|
|
1323
1381
|
}
|
|
1324
1382
|
if (careerData?.career === "能量武器专家") {
|
|
1325
1383
|
if (weaponType === "能量武器") {
|
|
1326
1384
|
value += 0.2;
|
|
1327
|
-
message = "⚔️
|
|
1385
|
+
message = "⚔️ 能量武器专家:能量武器攻击伤害+20%";
|
|
1328
1386
|
}
|
|
1329
1387
|
}
|
|
1330
1388
|
if (careerData?.career === "纵火狂") {
|
|
1331
1389
|
if (weaponType === "热能武器") {
|
|
1332
1390
|
value += 0.2;
|
|
1333
|
-
message = "⚔️
|
|
1391
|
+
message = "⚔️ 纵火狂:热能武器攻击伤害+20%";
|
|
1334
1392
|
}
|
|
1335
1393
|
}
|
|
1336
1394
|
if (careerData?.career === "猩红杀手") {
|
|
1337
1395
|
if (weaponId === 7) {
|
|
1338
1396
|
value += 0.15;
|
|
1339
|
-
message = "⚔️
|
|
1397
|
+
message = "⚔️ 猩红杀手:侦察步枪攻击伤害+15%";
|
|
1340
1398
|
}
|
|
1341
1399
|
}
|
|
1342
1400
|
return { value, message };
|
|
@@ -1353,7 +1411,7 @@ function apply(ctx, config) {
|
|
|
1353
1411
|
});
|
|
1354
1412
|
if (sovereign) {
|
|
1355
1413
|
value += 0.05;
|
|
1356
|
-
messages.push("👑
|
|
1414
|
+
messages.push("👑 王权增幅:攻击伤害+5%");
|
|
1357
1415
|
}
|
|
1358
1416
|
const [lament] = await ctx2.database.get("ggcevo_Wish_Record", {
|
|
1359
1417
|
handle,
|
|
@@ -1364,7 +1422,7 @@ function apply(ctx, config) {
|
|
|
1364
1422
|
if (lament) {
|
|
1365
1423
|
const levelBonus = 0.1 * (weapon.level + 1);
|
|
1366
1424
|
value += levelBonus;
|
|
1367
|
-
messages.push(`🗡️
|
|
1425
|
+
messages.push(`🗡️ 悲鸣之锋:攻击伤害+${Math.round(levelBonus * 100)}%`);
|
|
1368
1426
|
}
|
|
1369
1427
|
const [critRhythm] = await ctx2.database.get("ggcevo_Wish_Record", {
|
|
1370
1428
|
handle,
|
|
@@ -1373,7 +1431,7 @@ function apply(ctx, config) {
|
|
|
1373
1431
|
endTime: { $gte: /* @__PURE__ */ new Date() }
|
|
1374
1432
|
});
|
|
1375
1433
|
if (critRhythm) {
|
|
1376
|
-
messages.push("🎵
|
|
1434
|
+
messages.push("🎵 暴击韵律:攻击暴击率+20%");
|
|
1377
1435
|
}
|
|
1378
1436
|
return {
|
|
1379
1437
|
value,
|
|
@@ -1582,7 +1640,7 @@ function apply(ctx, config) {
|
|
|
1582
1640
|
updatedHP: Math.min(targetBoss.HP + healAmount, maxHP),
|
|
1583
1641
|
initialDamage: 0,
|
|
1584
1642
|
// 直接设置伤害为0
|
|
1585
|
-
messages: [`❄️
|
|
1643
|
+
messages: [`❄️ 【冰霜进化】生效:免疫寒冷伤害,${targetBoss.name}回复${healAmount}生命值`]
|
|
1586
1644
|
};
|
|
1587
1645
|
}
|
|
1588
1646
|
return null;
|
|
@@ -1695,7 +1753,7 @@ function apply(ctx, config) {
|
|
|
1695
1753
|
if (!effect) return null;
|
|
1696
1754
|
return {
|
|
1697
1755
|
updatedHP: effect.heal,
|
|
1698
|
-
messages: [`【${effect.skill}】生效,${targetBoss.name}
|
|
1756
|
+
messages: [`【${effect.skill}】生效,${targetBoss.name}濒死时瞬间回复${effect.heal}生命值`],
|
|
1699
1757
|
skillUpdates: [{
|
|
1700
1758
|
name: targetBoss.name,
|
|
1701
1759
|
remove: [effect.skill]
|
|
@@ -1710,7 +1768,7 @@ function apply(ctx, config) {
|
|
|
1710
1768
|
return {
|
|
1711
1769
|
damageMultiplier: -0.5,
|
|
1712
1770
|
// 50% 减伤
|
|
1713
|
-
messages: ["🛡️
|
|
1771
|
+
messages: ["🛡️ 【感染空间站】生效:空间站哨枪塔存活时,受到的伤害-50%"]
|
|
1714
1772
|
};
|
|
1715
1773
|
}
|
|
1716
1774
|
return null;
|
|
@@ -1815,10 +1873,10 @@ function apply(ctx, config) {
|
|
|
1815
1873
|
handleStructuralArmor: /* @__PURE__ */ __name((targetBoss, weaponData) => {
|
|
1816
1874
|
if (!targetBoss.skills.includes("结构装甲")) return null;
|
|
1817
1875
|
let reduction = 0.2;
|
|
1818
|
-
let msg = "
|
|
1876
|
+
let msg = "受到常规武器伤害-20%";
|
|
1819
1877
|
if (weaponData.type === "热能武器") {
|
|
1820
1878
|
reduction = 0.4;
|
|
1821
|
-
msg = "
|
|
1879
|
+
msg = "受到热能武器伤害-40%";
|
|
1822
1880
|
}
|
|
1823
1881
|
return {
|
|
1824
1882
|
damageMultiplier: -reduction,
|
|
@@ -1841,7 +1899,7 @@ function apply(ctx, config) {
|
|
|
1841
1899
|
}
|
|
1842
1900
|
if (targetBoss.skills.includes("嗜血狂暴") && currentHP / maxHP < 0.5) {
|
|
1843
1901
|
damageMultiplier -= 0.2;
|
|
1844
|
-
messages.push(`🔥
|
|
1902
|
+
messages.push(`🔥 【嗜血狂暴】生效:进入狂暴状态,受到的伤害-20%`);
|
|
1845
1903
|
}
|
|
1846
1904
|
if (targetBoss.skills.includes("吐血") && bloodStacks < 1) {
|
|
1847
1905
|
damageMultiplier += 0.2;
|
|
@@ -1874,7 +1932,7 @@ function apply(ctx, config) {
|
|
|
1874
1932
|
}
|
|
1875
1933
|
newStacks = Math.min(newStacks, 20);
|
|
1876
1934
|
if (oldStacks < 20 && newStacks >= 20) {
|
|
1877
|
-
messages.push(`🩸
|
|
1935
|
+
messages.push(`🩸 “吸血”达到${newStacks}层,下次受到攻击将触发【进食】`);
|
|
1878
1936
|
}
|
|
1879
1937
|
await ctx2.database.set("ggcevo_boss", { name: targetBoss.name }, { Skillcountpoints: newStacks });
|
|
1880
1938
|
return { updatedHP, messages };
|
|
@@ -1892,7 +1950,7 @@ function apply(ctx, config) {
|
|
|
1892
1950
|
const newLayers = hasRadiation ? Math.min(currentLayers + 1, 100) : 1;
|
|
1893
1951
|
let layerMsg;
|
|
1894
1952
|
if (!hasRadiation) {
|
|
1895
|
-
layerMsg = `☢️ ${targetBoss.name}
|
|
1953
|
+
layerMsg = `☢️ ${targetBoss.name}获得【辐射】效果(当前1层)`;
|
|
1896
1954
|
skillUpdates.push({
|
|
1897
1955
|
name: targetBoss.name,
|
|
1898
1956
|
add: ["辐射"]
|
|
@@ -1901,7 +1959,7 @@ function apply(ctx, config) {
|
|
|
1901
1959
|
} else if (newLayers === currentLayers) {
|
|
1902
1960
|
layerMsg = `☢️ 辐射层数已达上限(100层)`;
|
|
1903
1961
|
} else {
|
|
1904
|
-
layerMsg = `☢️
|
|
1962
|
+
layerMsg = `☢️ ${targetBoss.name}获得1层“辐射”(当前${newLayers}层)`;
|
|
1905
1963
|
radiationApplied = true;
|
|
1906
1964
|
}
|
|
1907
1965
|
await ctx2.database.set(
|
|
@@ -1929,29 +1987,46 @@ function apply(ctx, config) {
|
|
|
1929
1987
|
messages: radiationLayers > 0 ? [`☢️ 【辐射】生效:当前${radiationLayers}层辐射,受到的伤害+${radiationLayers}%`] : []
|
|
1930
1988
|
};
|
|
1931
1989
|
}, "calculateRadiationDamage"),
|
|
1932
|
-
//
|
|
1933
|
-
|
|
1934
|
-
|
|
1935
|
-
if (weaponName !== "零度之下" || !(targetBoss.skills.includes("电能导体") || targetBoss.skills.includes("超导体"))) {
|
|
1990
|
+
// 新增寒冷层数处理函数(类似辐射处理)
|
|
1991
|
+
handleColdEffect: /* @__PURE__ */ __name(async (ctx2, targetBoss, weaponName) => {
|
|
1992
|
+
if (weaponName !== "零度之下") {
|
|
1936
1993
|
return null;
|
|
1937
1994
|
}
|
|
1995
|
+
const messages = [];
|
|
1938
1996
|
let freezing = false;
|
|
1939
1997
|
const currentFreezing = targetBoss.freezing || 0;
|
|
1940
|
-
|
|
1941
|
-
|
|
1942
|
-
|
|
1943
|
-
|
|
1944
|
-
|
|
1945
|
-
|
|
1946
|
-
|
|
1998
|
+
const newFreezing = Math.min(currentFreezing + 1, 10);
|
|
1999
|
+
await ctx2.database.set(
|
|
2000
|
+
"ggcevo_boss",
|
|
2001
|
+
{ name: targetBoss.name },
|
|
2002
|
+
{ freezing: newFreezing }
|
|
2003
|
+
);
|
|
2004
|
+
if (newFreezing === 10 && currentFreezing < 10) {
|
|
2005
|
+
messages.push(`❄️ 【寒冷】效果达到上限(10层)`);
|
|
2006
|
+
} else {
|
|
2007
|
+
messages.push(`❄️ ${targetBoss.name} 获得1层"寒冷"(当前${newFreezing}层)`);
|
|
1947
2008
|
freezing = true;
|
|
2009
|
+
}
|
|
2010
|
+
return {
|
|
2011
|
+
messages,
|
|
2012
|
+
freezing
|
|
2013
|
+
};
|
|
2014
|
+
}, "handleColdEffect"),
|
|
2015
|
+
// 寒冷伤害计算(返回增伤系数)
|
|
2016
|
+
calculateColdDamage: /* @__PURE__ */ __name((targetBoss) => {
|
|
2017
|
+
const freezingLayers = targetBoss.freezing || 0;
|
|
2018
|
+
if (freezingLayers > 0) {
|
|
1948
2019
|
return {
|
|
1949
|
-
|
|
1950
|
-
|
|
2020
|
+
damageMultiplier: freezingLayers * 0.05,
|
|
2021
|
+
// 每层5%增伤
|
|
2022
|
+
messages: [
|
|
2023
|
+
`❄️ 【寒冷】生效:当前${freezingLayers}层,受到的伤害+${freezingLayers * 5}%`
|
|
2024
|
+
]
|
|
1951
2025
|
};
|
|
1952
2026
|
}
|
|
1953
2027
|
return null;
|
|
1954
|
-
}, "
|
|
2028
|
+
}, "calculateColdDamage"),
|
|
2029
|
+
// === 电能相关被动处理 ===
|
|
1955
2030
|
// 处理导体标签变化(血量低时护盾->重甲)
|
|
1956
2031
|
handleConductorTagChange: /* @__PURE__ */ __name(async (ctx2, targetBoss, currentHP, maxHP) => {
|
|
1957
2032
|
const triggerThreshold = targetBoss.skills.includes("超导体") ? 0.05 : 0.1;
|
|
@@ -2029,23 +2104,6 @@ function apply(ctx, config) {
|
|
|
2029
2104
|
}
|
|
2030
2105
|
return null;
|
|
2031
2106
|
}, "handlePowerSiphon"),
|
|
2032
|
-
// 处理能量黑洞减伤(基础减伤 + 寒冷增伤)
|
|
2033
|
-
handleEnergyBlackhole: /* @__PURE__ */ __name((targetBoss) => {
|
|
2034
|
-
if (!targetBoss.skills.includes("能量黑洞")) return null;
|
|
2035
|
-
const currentFreezing = targetBoss.freezing || 0;
|
|
2036
|
-
const baseReduction = 0.1;
|
|
2037
|
-
const freezingBonus = currentFreezing * 0.05;
|
|
2038
|
-
return {
|
|
2039
|
-
damageMultiplier: -baseReduction + freezingBonus,
|
|
2040
|
-
messages: [
|
|
2041
|
-
`🌀 【能量黑洞】生效:基础减伤10%`,
|
|
2042
|
-
currentFreezing > 0 ? (
|
|
2043
|
-
// 关键修改:将百分比四舍五入为整数
|
|
2044
|
-
`❄️ 寒冷(${currentFreezing}层)使受到的伤害+${Math.round(freezingBonus * 100)}%`
|
|
2045
|
-
) : ""
|
|
2046
|
-
].filter(Boolean)
|
|
2047
|
-
};
|
|
2048
|
-
}, "handleEnergyBlackhole"),
|
|
2049
2107
|
// 处理电能立场(概率免疫伤害)
|
|
2050
2108
|
handleEnergyField: /* @__PURE__ */ __name(async function(ctx2, targetBoss, weaponName, initialDamage) {
|
|
2051
2109
|
if (!targetBoss.skills.includes("电能立场") || initialDamage === 0 || weaponName === "零度之下") {
|
|
@@ -2063,7 +2121,7 @@ function apply(ctx, config) {
|
|
|
2063
2121
|
return {
|
|
2064
2122
|
immune: true,
|
|
2065
2123
|
messages: [
|
|
2066
|
-
`🛡️
|
|
2124
|
+
`🛡️ 【电能立场】生效:免疫非寒冷伤害!`
|
|
2067
2125
|
]
|
|
2068
2126
|
};
|
|
2069
2127
|
}
|
|
@@ -2077,8 +2135,8 @@ function apply(ctx, config) {
|
|
|
2077
2135
|
}
|
|
2078
2136
|
return null;
|
|
2079
2137
|
}, "getMemberConfig"),
|
|
2080
|
-
//
|
|
2081
|
-
handlePulse: /* @__PURE__ */ __name(async function(ctx2, targetBoss, activeBosses, bossGroup) {
|
|
2138
|
+
// 修改后的脉冲处理函数
|
|
2139
|
+
handlePulse: /* @__PURE__ */ __name(async function(ctx2, targetBoss, activeBosses, bossGroup, currentHP) {
|
|
2082
2140
|
if (!targetBoss.skills.includes("脉冲")) return null;
|
|
2083
2141
|
const currentEnergy = targetBoss.energy || 0;
|
|
2084
2142
|
const currentFreezing = targetBoss.freezing || 0;
|
|
@@ -2096,6 +2154,7 @@ function apply(ctx, config) {
|
|
|
2096
2154
|
);
|
|
2097
2155
|
const updates = [];
|
|
2098
2156
|
const healMessages = [];
|
|
2157
|
+
let updatedHP = currentHP;
|
|
2099
2158
|
for (const member of groupMembers) {
|
|
2100
2159
|
const memberConfig = this.getMemberConfig(member.name, bossGroup);
|
|
2101
2160
|
if (!memberConfig) continue;
|
|
@@ -2103,6 +2162,9 @@ function apply(ctx, config) {
|
|
|
2103
2162
|
const healAmount = member.type === "主宰" ? 100 : 100;
|
|
2104
2163
|
const newHP = Math.min(member.HP + healAmount, maxHP);
|
|
2105
2164
|
const actualHeal = newHP - member.HP;
|
|
2165
|
+
if (member.name === targetBoss.name) {
|
|
2166
|
+
updatedHP = newHP;
|
|
2167
|
+
}
|
|
2106
2168
|
updates.push(
|
|
2107
2169
|
ctx2.database.set(
|
|
2108
2170
|
"ggcevo_boss",
|
|
@@ -2111,16 +2173,16 @@ function apply(ctx, config) {
|
|
|
2111
2173
|
)
|
|
2112
2174
|
);
|
|
2113
2175
|
if (actualHeal > 0) {
|
|
2114
|
-
healMessages.push(`${member.name}+${actualHeal}HP
|
|
2115
|
-
} else {
|
|
2116
|
-
healMessages.push(`${member.name}生命值已满`);
|
|
2176
|
+
healMessages.push(`${member.name}+${actualHeal}HP`);
|
|
2117
2177
|
}
|
|
2118
2178
|
}
|
|
2119
2179
|
if (healMessages.length > 0) {
|
|
2120
2180
|
await Promise.all(updates);
|
|
2121
2181
|
return {
|
|
2182
|
+
newHP: updatedHP,
|
|
2183
|
+
// 返回当前目标的新HP值
|
|
2122
2184
|
messages: [
|
|
2123
|
-
`❤️
|
|
2185
|
+
`❤️ 【脉冲】生效:治疗全体异形`,
|
|
2124
2186
|
...healMessages
|
|
2125
2187
|
]
|
|
2126
2188
|
};
|
|
@@ -2169,6 +2231,225 @@ function apply(ctx, config) {
|
|
|
2169
2231
|
return null;
|
|
2170
2232
|
}
|
|
2171
2233
|
}, "handleParticlePhaseEffect"),
|
|
2234
|
+
// 庞兽狂暴处理(血量低于50%时减伤)
|
|
2235
|
+
handleGiantRage: /* @__PURE__ */ __name(function(targetBoss, currentHP, maxHP) {
|
|
2236
|
+
if (!targetBoss.skills.includes("庞兽狂暴")) return null;
|
|
2237
|
+
if (currentHP / maxHP < 0.5) {
|
|
2238
|
+
return {
|
|
2239
|
+
damageMultiplier: -0.5,
|
|
2240
|
+
messages: [`🐗 【庞兽狂暴】生效:进入狂暴状态,受到的伤害-50%`]
|
|
2241
|
+
};
|
|
2242
|
+
}
|
|
2243
|
+
return null;
|
|
2244
|
+
}, "handleGiantRage"),
|
|
2245
|
+
// 修改后的灼烧粘液处理
|
|
2246
|
+
handleBileStacking: /* @__PURE__ */ __name(async function(ctx2, targetBoss, skipStack) {
|
|
2247
|
+
if (!targetBoss.skills.includes("灼烧粘液") || skipStack) return null;
|
|
2248
|
+
const currentStacks = targetBoss.Skillcountpoints || 0;
|
|
2249
|
+
const newStacks = Math.min(currentStacks + 1, 20);
|
|
2250
|
+
let messages = [`💧 【灼烧粘液】生效:获得1层"胆汁"(当前${newStacks}层)`];
|
|
2251
|
+
if (currentStacks < 10 && newStacks >= 10) {
|
|
2252
|
+
if (targetBoss.skills.includes("腐蚀胆汁")) {
|
|
2253
|
+
messages.push(`🟢 胆汁达到10层,下次攻击将触发【腐蚀胆汁】`);
|
|
2254
|
+
}
|
|
2255
|
+
}
|
|
2256
|
+
if (currentStacks < 20 && newStacks >= 20) {
|
|
2257
|
+
if (targetBoss.skills.includes("火焰吐息")) {
|
|
2258
|
+
messages.push(`🐲 胆汁达到20层,下次攻击将触发【火焰吐息】`);
|
|
2259
|
+
}
|
|
2260
|
+
}
|
|
2261
|
+
await ctx2.database.set(
|
|
2262
|
+
"ggcevo_boss",
|
|
2263
|
+
{ name: targetBoss.name },
|
|
2264
|
+
{ Skillcountpoints: newStacks }
|
|
2265
|
+
);
|
|
2266
|
+
return { messages };
|
|
2267
|
+
}, "handleBileStacking"),
|
|
2268
|
+
// 修改后的太阳耀斑处理(每次受击检测)
|
|
2269
|
+
handleSolarFlare: /* @__PURE__ */ __name(async function(ctx2, targetBoss, weaponName) {
|
|
2270
|
+
if (!targetBoss.skills.includes("太阳耀斑") || targetBoss.type !== "主宰") {
|
|
2271
|
+
return { immune: false, messages: [] };
|
|
2272
|
+
}
|
|
2273
|
+
const messages = [];
|
|
2274
|
+
let immune = false;
|
|
2275
|
+
const minions = await ctx2.database.get("ggcevo_boss", {
|
|
2276
|
+
groupId: targetBoss.groupId,
|
|
2277
|
+
type: "子代",
|
|
2278
|
+
isActive: true
|
|
2279
|
+
});
|
|
2280
|
+
const aliveMinions = minions.filter((m) => m.HP > 0);
|
|
2281
|
+
if (aliveMinions.length === 0) {
|
|
2282
|
+
const updates = [];
|
|
2283
|
+
if (targetBoss.tags.includes("惧寒")) {
|
|
2284
|
+
const newTags = targetBoss.tags.filter((tag) => tag !== "惧寒");
|
|
2285
|
+
updates.push(
|
|
2286
|
+
ctx2.database.set(
|
|
2287
|
+
"ggcevo_boss",
|
|
2288
|
+
{ name: targetBoss.name },
|
|
2289
|
+
{ tags: newTags }
|
|
2290
|
+
)
|
|
2291
|
+
);
|
|
2292
|
+
targetBoss.tags = newTags;
|
|
2293
|
+
messages.push(`☀️ 【太阳耀斑】生效:移除"惧寒"标签`);
|
|
2294
|
+
}
|
|
2295
|
+
if (targetBoss.skills.includes("孤立无援")) {
|
|
2296
|
+
const newSkills = targetBoss.skills.filter((skill) => skill !== "孤立无援");
|
|
2297
|
+
updates.push(
|
|
2298
|
+
ctx2.database.set(
|
|
2299
|
+
"ggcevo_boss",
|
|
2300
|
+
{ name: targetBoss.name },
|
|
2301
|
+
{ skills: newSkills }
|
|
2302
|
+
)
|
|
2303
|
+
);
|
|
2304
|
+
targetBoss.skills = newSkills;
|
|
2305
|
+
messages.push(`☀️ 【太阳耀斑】生效:移除"孤立无援"技能`);
|
|
2306
|
+
}
|
|
2307
|
+
await Promise.all(updates);
|
|
2308
|
+
}
|
|
2309
|
+
if (!targetBoss.tags.includes("惧寒") && weaponName === "零度之下") {
|
|
2310
|
+
immune = true;
|
|
2311
|
+
messages.push(`☀️ 【太阳耀斑】生效:免疫寒冷伤害`);
|
|
2312
|
+
}
|
|
2313
|
+
return { immune, messages };
|
|
2314
|
+
}, "handleSolarFlare"),
|
|
2315
|
+
// 辅助函数:从配置中获取成员的最大生命值
|
|
2316
|
+
getMemberMaxHP: /* @__PURE__ */ __name(function(name2, bossGroup) {
|
|
2317
|
+
if (bossGroup.main.name === name2) return bossGroup.main.maxHP;
|
|
2318
|
+
for (const minion of bossGroup.minions) {
|
|
2319
|
+
if (minion.name === name2) return minion.maxHP;
|
|
2320
|
+
}
|
|
2321
|
+
return null;
|
|
2322
|
+
}, "getMemberMaxHP"),
|
|
2323
|
+
// 修改后的腐蚀胆汁处理函数
|
|
2324
|
+
handleCorrosiveBile: /* @__PURE__ */ __name(async function(ctx2, targetBoss, bossGroup, currentHP) {
|
|
2325
|
+
if (!targetBoss.skills.includes("腐蚀胆汁")) return null;
|
|
2326
|
+
const bileStacks = targetBoss.Skillcountpoints || 0;
|
|
2327
|
+
if (bileStacks < 10) return null;
|
|
2328
|
+
await ctx2.database.set(
|
|
2329
|
+
"ggcevo_boss",
|
|
2330
|
+
{ name: targetBoss.name },
|
|
2331
|
+
{ Skillcountpoints: 0 }
|
|
2332
|
+
);
|
|
2333
|
+
const messages = [
|
|
2334
|
+
`🟢 【腐蚀胆汁】生效:消耗10层"胆汁",治愈所有存活异形`
|
|
2335
|
+
];
|
|
2336
|
+
const updates = [];
|
|
2337
|
+
let updatedHP = currentHP;
|
|
2338
|
+
const groupMembers = await ctx2.database.get("ggcevo_boss", {
|
|
2339
|
+
groupId: targetBoss.groupId,
|
|
2340
|
+
isActive: true,
|
|
2341
|
+
HP: { $gt: 0 }
|
|
2342
|
+
});
|
|
2343
|
+
for (const member of groupMembers) {
|
|
2344
|
+
const maxHP = this.getMemberMaxHP(member.name, bossGroup);
|
|
2345
|
+
if (!maxHP) continue;
|
|
2346
|
+
const healAmount = 1e3;
|
|
2347
|
+
const newHP = Math.min(member.HP + healAmount, maxHP);
|
|
2348
|
+
const actualHeal = newHP - member.HP;
|
|
2349
|
+
if (member.name === targetBoss.name) {
|
|
2350
|
+
updatedHP = newHP;
|
|
2351
|
+
}
|
|
2352
|
+
updates.push(
|
|
2353
|
+
ctx2.database.set(
|
|
2354
|
+
"ggcevo_boss",
|
|
2355
|
+
{ name: member.name },
|
|
2356
|
+
{ HP: newHP }
|
|
2357
|
+
)
|
|
2358
|
+
);
|
|
2359
|
+
messages.push(`${member.name} 回复${actualHeal}点生命值`);
|
|
2360
|
+
}
|
|
2361
|
+
await Promise.all(updates);
|
|
2362
|
+
return { messages, currentHP: updatedHP };
|
|
2363
|
+
}, "handleCorrosiveBile"),
|
|
2364
|
+
// 修改后的火焰吐息处理函数
|
|
2365
|
+
handleFireBreath: /* @__PURE__ */ __name(async function(ctx2, targetBoss, bossGroup, currentHP) {
|
|
2366
|
+
if (!targetBoss.skills.includes("火焰吐息")) return null;
|
|
2367
|
+
const bileStacks = targetBoss.Skillcountpoints || 0;
|
|
2368
|
+
if (bileStacks < 20) return null;
|
|
2369
|
+
await ctx2.database.set(
|
|
2370
|
+
"ggcevo_boss",
|
|
2371
|
+
{ name: targetBoss.name },
|
|
2372
|
+
{ Skillcountpoints: 0 }
|
|
2373
|
+
);
|
|
2374
|
+
const messages = [
|
|
2375
|
+
`🐲 【火焰吐息】生效:消耗20层"胆汁",治愈所有存活异形50%的最大生命值`
|
|
2376
|
+
];
|
|
2377
|
+
const updates = [];
|
|
2378
|
+
let updatedHP = currentHP;
|
|
2379
|
+
const groupMembers = await ctx2.database.get("ggcevo_boss", {
|
|
2380
|
+
groupId: targetBoss.groupId,
|
|
2381
|
+
isActive: true,
|
|
2382
|
+
HP: { $gt: 0 }
|
|
2383
|
+
});
|
|
2384
|
+
for (const member of groupMembers) {
|
|
2385
|
+
const maxHP = this.getMemberMaxHP(member.name, bossGroup);
|
|
2386
|
+
if (!maxHP) continue;
|
|
2387
|
+
const healAmount = Math.floor(maxHP * 0.5);
|
|
2388
|
+
const newHP = Math.min(member.HP + healAmount, maxHP);
|
|
2389
|
+
const actualHeal = newHP - member.HP;
|
|
2390
|
+
if (member.name === targetBoss.name) {
|
|
2391
|
+
updatedHP = newHP;
|
|
2392
|
+
}
|
|
2393
|
+
updates.push(
|
|
2394
|
+
ctx2.database.set(
|
|
2395
|
+
"ggcevo_boss",
|
|
2396
|
+
{ name: member.name },
|
|
2397
|
+
{ HP: newHP }
|
|
2398
|
+
)
|
|
2399
|
+
);
|
|
2400
|
+
messages.push(`${member.name} 回复${actualHeal}点生命值`);
|
|
2401
|
+
}
|
|
2402
|
+
await Promise.all(updates);
|
|
2403
|
+
return { messages, currentHP: updatedHP };
|
|
2404
|
+
}, "handleFireBreath"),
|
|
2405
|
+
// 修改后的火焰异形处理
|
|
2406
|
+
handleFireEvolution: /* @__PURE__ */ __name(async function(ctx2, targetBoss, weaponName, initialDamage, bossGroup) {
|
|
2407
|
+
if (targetBoss.skills.includes("火焰异形") && weaponName === "焚烧枪") {
|
|
2408
|
+
const maxHP = this.getMemberMaxHP(targetBoss.name, bossGroup);
|
|
2409
|
+
if (!maxHP) return null;
|
|
2410
|
+
const healAmount = Math.min(initialDamage, maxHP - targetBoss.HP);
|
|
2411
|
+
let updatedHP = Math.min(targetBoss.HP + healAmount, maxHP);
|
|
2412
|
+
const messages = [
|
|
2413
|
+
`🔥 【火焰异形】生效:免疫火焰伤害`,
|
|
2414
|
+
healAmount > 0 ? `${targetBoss.name}回复${healAmount}点生命值` : ""
|
|
2415
|
+
].filter(Boolean);
|
|
2416
|
+
const bileResult = await this.handleBileIgnition(ctx2, targetBoss, bossGroup, updatedHP);
|
|
2417
|
+
if (bileResult) {
|
|
2418
|
+
updatedHP = bileResult.newHP;
|
|
2419
|
+
messages.push(...bileResult.messages);
|
|
2420
|
+
}
|
|
2421
|
+
return {
|
|
2422
|
+
updatedHP,
|
|
2423
|
+
initialDamage: 0,
|
|
2424
|
+
// 免疫伤害
|
|
2425
|
+
messages,
|
|
2426
|
+
bileStacks: bileResult?.bileStacks || 0
|
|
2427
|
+
};
|
|
2428
|
+
}
|
|
2429
|
+
return null;
|
|
2430
|
+
}, "handleFireEvolution"),
|
|
2431
|
+
// 修改后的灼烧粘液引爆
|
|
2432
|
+
handleBileIgnition: /* @__PURE__ */ __name(async function(ctx2, targetBoss, bossGroup, updatedHP) {
|
|
2433
|
+
if (!targetBoss.skills.includes("灼烧粘液")) return null;
|
|
2434
|
+
const bileStacks = targetBoss.Skillcountpoints || 0;
|
|
2435
|
+
if (bileStacks < 1) return null;
|
|
2436
|
+
const maxHP = this.getMemberMaxHP(targetBoss.name, bossGroup);
|
|
2437
|
+
if (!maxHP) return null;
|
|
2438
|
+
const healAmount = bileStacks * 10;
|
|
2439
|
+
const newHP = Math.min(updatedHP + healAmount, maxHP);
|
|
2440
|
+
await ctx2.database.set(
|
|
2441
|
+
"ggcevo_boss",
|
|
2442
|
+
{ name: targetBoss.name },
|
|
2443
|
+
{ Skillcountpoints: 0, HP: newHP }
|
|
2444
|
+
);
|
|
2445
|
+
return {
|
|
2446
|
+
messages: [
|
|
2447
|
+
`💥 【灼烧粘液】引爆:消耗${bileStacks}层"胆汁",${targetBoss.name}回复${healAmount}点生命值`
|
|
2448
|
+
],
|
|
2449
|
+
newHP,
|
|
2450
|
+
bileStacks
|
|
2451
|
+
};
|
|
2452
|
+
}, "handleBileIgnition"),
|
|
2172
2453
|
// 统一处理被动技能
|
|
2173
2454
|
handlePassives: /* @__PURE__ */ __name(async function(ctx2, targetBoss, initialDamage, currentHP, maxHP, weaponName, weaponData, activeBosses, bossGroup) {
|
|
2174
2455
|
let messages = [];
|
|
@@ -2176,6 +2457,16 @@ function apply(ctx, config) {
|
|
|
2176
2457
|
let totalMultiplier = 0;
|
|
2177
2458
|
let radiationApplied = false;
|
|
2178
2459
|
let freezing = false;
|
|
2460
|
+
let bileStacks = 0;
|
|
2461
|
+
const solarFlareResult = await this.handleSolarFlare(ctx2, targetBoss, weaponName);
|
|
2462
|
+
if (solarFlareResult.immune) {
|
|
2463
|
+
return {
|
|
2464
|
+
currentHP: targetBoss.HP,
|
|
2465
|
+
messages: solarFlareResult.messages,
|
|
2466
|
+
skillUpdates: [],
|
|
2467
|
+
initialDamage: 0
|
|
2468
|
+
};
|
|
2469
|
+
}
|
|
2179
2470
|
const frostEvoResult = this.handleFrostEvolution(targetBoss, weaponName, initialDamage, maxHP);
|
|
2180
2471
|
if (frostEvoResult) {
|
|
2181
2472
|
return {
|
|
@@ -2206,6 +2497,22 @@ function apply(ctx, config) {
|
|
|
2206
2497
|
};
|
|
2207
2498
|
}
|
|
2208
2499
|
}
|
|
2500
|
+
const fireEvoResult = await this.handleFireEvolution(
|
|
2501
|
+
ctx2,
|
|
2502
|
+
targetBoss,
|
|
2503
|
+
weaponName,
|
|
2504
|
+
initialDamage,
|
|
2505
|
+
bossGroup
|
|
2506
|
+
);
|
|
2507
|
+
if (fireEvoResult) {
|
|
2508
|
+
return {
|
|
2509
|
+
currentHP: fireEvoResult.updatedHP,
|
|
2510
|
+
messages: fireEvoResult.messages,
|
|
2511
|
+
skillUpdates: [],
|
|
2512
|
+
initialDamage: fireEvoResult.initialDamage,
|
|
2513
|
+
bileStacks: fireEvoResult.bileStacks
|
|
2514
|
+
};
|
|
2515
|
+
}
|
|
2209
2516
|
targetBoss.skills.forEach((skill) => {
|
|
2210
2517
|
const config2 = passiveConfig[skill];
|
|
2211
2518
|
if (config2 && config2.effect !== void 0 && config2.effect !== 0) {
|
|
@@ -2239,16 +2546,21 @@ function apply(ctx, config) {
|
|
|
2239
2546
|
totalMultiplier += powerSiphonResult.damageMultiplier;
|
|
2240
2547
|
messages.push(...powerSiphonResult.messages);
|
|
2241
2548
|
}
|
|
2242
|
-
const
|
|
2243
|
-
if (
|
|
2244
|
-
totalMultiplier +=
|
|
2245
|
-
messages.push(...
|
|
2549
|
+
const giantRageResult = this.handleGiantRage(targetBoss, currentHP, maxHP);
|
|
2550
|
+
if (giantRageResult) {
|
|
2551
|
+
totalMultiplier += giantRageResult.damageMultiplier;
|
|
2552
|
+
messages.push(...giantRageResult.messages);
|
|
2246
2553
|
}
|
|
2247
2554
|
const radiationCalc = this.calculateRadiationDamage(targetBoss);
|
|
2248
2555
|
if (radiationCalc) {
|
|
2249
2556
|
totalMultiplier += radiationCalc.damageMultiplier;
|
|
2250
2557
|
messages.push(...radiationCalc.messages);
|
|
2251
2558
|
}
|
|
2559
|
+
const coldDamageResult = this.calculateColdDamage(targetBoss);
|
|
2560
|
+
if (coldDamageResult) {
|
|
2561
|
+
totalMultiplier += coldDamageResult.damageMultiplier;
|
|
2562
|
+
messages.push(...coldDamageResult.messages);
|
|
2563
|
+
}
|
|
2252
2564
|
const particleResult = this.handleParticlePhaseEffect(
|
|
2253
2565
|
targetBoss,
|
|
2254
2566
|
weaponName,
|
|
@@ -2258,6 +2570,9 @@ function apply(ctx, config) {
|
|
|
2258
2570
|
totalMultiplier = particleResult.damageMultiplier;
|
|
2259
2571
|
messages.push(...particleResult.messages);
|
|
2260
2572
|
}
|
|
2573
|
+
if (solarFlareResult.messages.length > 0) {
|
|
2574
|
+
messages.push(...solarFlareResult.messages);
|
|
2575
|
+
}
|
|
2261
2576
|
const originalMultiplier = totalMultiplier;
|
|
2262
2577
|
if (originalMultiplier < -1) {
|
|
2263
2578
|
messages.push(`⚠️ 触发伤害保底机制:强制造成1点伤害`);
|
|
@@ -2298,10 +2613,37 @@ function apply(ctx, config) {
|
|
|
2298
2613
|
messages.push(...survivalResult.messages);
|
|
2299
2614
|
skillUpdates.push(...survivalResult.skillUpdates);
|
|
2300
2615
|
}
|
|
2301
|
-
const pulseResult = await this.handlePulse(
|
|
2616
|
+
const pulseResult = await this.handlePulse(
|
|
2617
|
+
ctx2,
|
|
2618
|
+
targetBoss,
|
|
2619
|
+
activeBosses,
|
|
2620
|
+
bossGroup,
|
|
2621
|
+
currentHP
|
|
2622
|
+
// 传入当前HP值
|
|
2623
|
+
);
|
|
2302
2624
|
if (pulseResult) {
|
|
2625
|
+
currentHP = pulseResult.newHP;
|
|
2303
2626
|
messages.push(...pulseResult.messages);
|
|
2304
2627
|
}
|
|
2628
|
+
let skipBileStacking = false;
|
|
2629
|
+
if (weaponName !== "焚烧枪") {
|
|
2630
|
+
if (targetBoss.skills.includes("腐蚀胆汁")) {
|
|
2631
|
+
const bileTriggered = await this.handleCorrosiveBile(ctx2, targetBoss, bossGroup, currentHP);
|
|
2632
|
+
if (bileTriggered) {
|
|
2633
|
+
currentHP = bileTriggered.currentHP;
|
|
2634
|
+
skipBileStacking = true;
|
|
2635
|
+
messages.push(...bileTriggered.messages);
|
|
2636
|
+
}
|
|
2637
|
+
}
|
|
2638
|
+
if (targetBoss.skills.includes("火焰吐息")) {
|
|
2639
|
+
const breathTriggered = await this.handleFireBreath(ctx2, targetBoss, bossGroup, currentHP);
|
|
2640
|
+
if (breathTriggered) {
|
|
2641
|
+
currentHP = breathTriggered.currentHP;
|
|
2642
|
+
skipBileStacking = true;
|
|
2643
|
+
messages.push(...breathTriggered.messages);
|
|
2644
|
+
}
|
|
2645
|
+
}
|
|
2646
|
+
}
|
|
2305
2647
|
const coldAdaptResult = await this.handleColdAdaptation(ctx2, targetBoss, weaponName);
|
|
2306
2648
|
if (coldAdaptResult) {
|
|
2307
2649
|
messages.push(...coldAdaptResult.messages);
|
|
@@ -2315,11 +2657,6 @@ function apply(ctx, config) {
|
|
|
2315
2657
|
if (sentryResult) {
|
|
2316
2658
|
messages.push(...sentryResult.messages);
|
|
2317
2659
|
}
|
|
2318
|
-
const freezingStackResult = await this.handleFreezingStack(ctx2, targetBoss, weaponName);
|
|
2319
|
-
if (freezingStackResult) {
|
|
2320
|
-
messages.push(...freezingStackResult.messages);
|
|
2321
|
-
freezing = freezingStackResult.freezing;
|
|
2322
|
-
}
|
|
2323
2660
|
const tagChangeResult = await this.handleConductorTagChange(ctx2, targetBoss, currentHP, maxHP);
|
|
2324
2661
|
if (tagChangeResult) {
|
|
2325
2662
|
messages.push(...tagChangeResult.messages);
|
|
@@ -2338,6 +2675,15 @@ function apply(ctx, config) {
|
|
|
2338
2675
|
skillUpdates.push(...gammaRadResult.skillUpdates);
|
|
2339
2676
|
radiationApplied = gammaRadResult.radiationApplied;
|
|
2340
2677
|
}
|
|
2678
|
+
const bileStackResult = await this.handleBileStacking(ctx2, targetBoss, skipBileStacking);
|
|
2679
|
+
if (bileStackResult) {
|
|
2680
|
+
messages.push(...bileStackResult.messages);
|
|
2681
|
+
}
|
|
2682
|
+
const coldEffectResult = await this.handleColdEffect(ctx2, targetBoss, weaponName);
|
|
2683
|
+
if (coldEffectResult) {
|
|
2684
|
+
messages.push(...coldEffectResult.messages);
|
|
2685
|
+
freezing = coldEffectResult.freezing;
|
|
2686
|
+
}
|
|
2341
2687
|
return {
|
|
2342
2688
|
currentHP,
|
|
2343
2689
|
messages,
|
|
@@ -2521,6 +2867,7 @@ function apply(ctx, config) {
|
|
|
2521
2867
|
});
|
|
2522
2868
|
if (!allCleaners.length) return [];
|
|
2523
2869
|
let killerBonus = false;
|
|
2870
|
+
let killerBonusMessage = "";
|
|
2524
2871
|
for (const cleaner of allCleaners) {
|
|
2525
2872
|
let rewardAmount = baseReward;
|
|
2526
2873
|
if (cleaner.handle === killerHandle) {
|
|
@@ -2532,13 +2879,8 @@ function apply(ctx, config) {
|
|
|
2532
2879
|
redcrystal: (cleaner.redcrystal || 0) + rewardAmount
|
|
2533
2880
|
}], ["handle"]);
|
|
2534
2881
|
}
|
|
2535
|
-
const
|
|
2536
|
-
|
|
2537
|
-
];
|
|
2538
|
-
if (killerBonus) {
|
|
2539
|
-
rewardMessages.push(`🎖️ ${killerName}(致命一击)获得双倍红晶奖励!`);
|
|
2540
|
-
}
|
|
2541
|
-
return rewardMessages;
|
|
2882
|
+
const rewardMessage = `🧹 全体清洁工因清理 ${bossName} 获得 ${baseReward} 红晶${killerBonus ? ` (致命一击奖励 ${killerName})` : ""}`;
|
|
2883
|
+
return [rewardMessage];
|
|
2542
2884
|
} catch (error) {
|
|
2543
2885
|
ctx2.logger("ggcevo").warn("清洁工奖励发放失败", error);
|
|
2544
2886
|
return [];
|
|
@@ -2550,6 +2892,10 @@ function apply(ctx, config) {
|
|
|
2550
2892
|
const extraDamages = [];
|
|
2551
2893
|
const actuallyDead = [];
|
|
2552
2894
|
let scatterBroadcast = null;
|
|
2895
|
+
const allCleanerRewards = [];
|
|
2896
|
+
let masterDeathEvent = null;
|
|
2897
|
+
const otherBroadcastMessages = [];
|
|
2898
|
+
const processedGroups = /* @__PURE__ */ new Set();
|
|
2553
2899
|
const secondaryTargets = activeBosses.filter(
|
|
2554
2900
|
(boss) => boss.name !== targetBoss.name
|
|
2555
2901
|
);
|
|
@@ -2571,7 +2917,6 @@ function apply(ctx, config) {
|
|
|
2571
2917
|
scatterEffectMessages.push(scatterMsg);
|
|
2572
2918
|
const baseDamage = weaponData.damage * (1 + 0.1 * equippedWeapon.level);
|
|
2573
2919
|
const secondaryDamage = Math.round(baseDamage * scatterRatio);
|
|
2574
|
-
const cleanerRewards = [];
|
|
2575
2920
|
for (const secondaryTarget of secondaryTargets) {
|
|
2576
2921
|
const secondaryMaxHP = getBossMaxHP(secondaryTarget.name);
|
|
2577
2922
|
let currentDamage = secondaryDamage;
|
|
@@ -2631,24 +2976,17 @@ function apply(ctx, config) {
|
|
|
2631
2976
|
redcrystal: (cleaner.redcrystal || 0) + rewardAmount
|
|
2632
2977
|
}], ["handle"]);
|
|
2633
2978
|
}
|
|
2634
|
-
let rewardMsg = `🧹 全体清洁工因清理 ${bossName}
|
|
2979
|
+
let rewardMsg = `🧹 全体清洁工因清理 ${bossName} 获得 ${baseReward} 红晶`;
|
|
2635
2980
|
if (killerBonus) {
|
|
2636
|
-
rewardMsg += `
|
|
2637
|
-
🎖️ ${playerName}(致命一击)获得双倍红晶奖励!`;
|
|
2638
|
-
}
|
|
2639
|
-
if (!scatterBroadcast) {
|
|
2640
|
-
scatterBroadcast = [];
|
|
2641
|
-
}
|
|
2642
|
-
if (Array.isArray(scatterBroadcast)) {
|
|
2643
|
-
scatterBroadcast.push(rewardMsg);
|
|
2644
|
-
} else {
|
|
2645
|
-
scatterBroadcast = [rewardMsg];
|
|
2981
|
+
rewardMsg += ` (致命一击奖励 ${playerName})`;
|
|
2646
2982
|
}
|
|
2983
|
+
allCleanerRewards.push(rewardMsg);
|
|
2647
2984
|
}
|
|
2985
|
+
const groupId = secondaryTarget.groupId;
|
|
2648
2986
|
if (secondaryTarget.type === "子代") {
|
|
2649
2987
|
if (secondaryTarget.name === "机械感染虫") {
|
|
2650
2988
|
const [mainBoss] = await ctx2.database.get("ggcevo_boss", {
|
|
2651
|
-
groupId
|
|
2989
|
+
groupId,
|
|
2652
2990
|
type: "主宰",
|
|
2653
2991
|
isActive: true
|
|
2654
2992
|
});
|
|
@@ -2656,24 +2994,18 @@ function apply(ctx, config) {
|
|
|
2656
2994
|
await ctx2.database.set("ggcevo_boss", { name: mainBoss.name }, {
|
|
2657
2995
|
skills: [...mainBoss.skills, "孤立无援"]
|
|
2658
2996
|
});
|
|
2659
|
-
|
|
2660
|
-
if (!scatterBroadcast) {
|
|
2661
|
-
scatterBroadcast = isolationMsg;
|
|
2662
|
-
} else if (Array.isArray(scatterBroadcast)) {
|
|
2663
|
-
scatterBroadcast.push(isolationMsg);
|
|
2664
|
-
} else {
|
|
2665
|
-
scatterBroadcast = [scatterBroadcast, isolationMsg];
|
|
2666
|
-
}
|
|
2997
|
+
otherBroadcastMessages.push("💥 机械感染虫已阵亡,空间站感染虫进入【孤立无援】状态,受到的伤害+20%!");
|
|
2667
2998
|
}
|
|
2668
2999
|
} else {
|
|
2669
3000
|
const remainingMinions = await ctx2.database.get("ggcevo_boss", {
|
|
2670
|
-
groupId
|
|
3001
|
+
groupId,
|
|
2671
3002
|
type: "子代",
|
|
2672
3003
|
isActive: true
|
|
2673
3004
|
});
|
|
2674
|
-
if (remainingMinions.length === 0) {
|
|
3005
|
+
if (remainingMinions.length === 0 && !processedGroups.has(groupId)) {
|
|
3006
|
+
processedGroups.add(groupId);
|
|
2675
3007
|
const [mainBoss] = await ctx2.database.get("ggcevo_boss", {
|
|
2676
|
-
groupId
|
|
3008
|
+
groupId,
|
|
2677
3009
|
type: "主宰",
|
|
2678
3010
|
isActive: true
|
|
2679
3011
|
});
|
|
@@ -2681,21 +3013,14 @@ function apply(ctx, config) {
|
|
|
2681
3013
|
await ctx2.database.set("ggcevo_boss", { name: mainBoss.name }, {
|
|
2682
3014
|
skills: [...mainBoss.skills, "孤立无援"]
|
|
2683
3015
|
});
|
|
2684
|
-
|
|
2685
|
-
if (!scatterBroadcast) {
|
|
2686
|
-
scatterBroadcast = isolationMsg;
|
|
2687
|
-
} else if (Array.isArray(scatterBroadcast)) {
|
|
2688
|
-
scatterBroadcast.push(isolationMsg);
|
|
2689
|
-
} else {
|
|
2690
|
-
scatterBroadcast = [scatterBroadcast, isolationMsg];
|
|
2691
|
-
}
|
|
3016
|
+
otherBroadcastMessages.push(`💥 所有子代已阵亡,${mainBoss.name}进入【孤立无援】状态,受到的伤害+20%!`);
|
|
2692
3017
|
}
|
|
2693
3018
|
}
|
|
2694
3019
|
}
|
|
2695
3020
|
} else if (secondaryTarget.type === "主宰") {
|
|
2696
3021
|
await ctx2.database.set(
|
|
2697
3022
|
"ggcevo_boss",
|
|
2698
|
-
{ groupId
|
|
3023
|
+
{ groupId },
|
|
2699
3024
|
{ isActive: false, HP: 0 }
|
|
2700
3025
|
);
|
|
2701
3026
|
const respawnTime = /* @__PURE__ */ new Date();
|
|
@@ -2707,25 +3032,39 @@ function apply(ctx, config) {
|
|
|
2707
3032
|
);
|
|
2708
3033
|
const { rewardMessages } = await handleBossDefeatRewards(ctx2, secondaryTarget);
|
|
2709
3034
|
await ctx2.database.remove("ggcevo_boss_damage", {
|
|
2710
|
-
bossGroupId:
|
|
3035
|
+
bossGroupId: groupId
|
|
2711
3036
|
});
|
|
2712
|
-
|
|
2713
|
-
|
|
2714
|
-
|
|
2715
|
-
|
|
2716
|
-
|
|
2717
|
-
|
|
2718
|
-
|
|
2719
|
-
|
|
2720
|
-
|
|
2721
|
-
}
|
|
2722
|
-
scatterBroadcast.push(...defeatMsg);
|
|
2723
|
-
} else {
|
|
2724
|
-
scatterBroadcast = [scatterBroadcast, ...defeatMsg];
|
|
2725
|
-
}
|
|
3037
|
+
masterDeathEvent = {
|
|
3038
|
+
name: secondaryTarget.name,
|
|
3039
|
+
rewards: [
|
|
3040
|
+
`🎯 主宰 ${secondaryTarget.name} 已被 ${session.username} 的散射伤害击败!`,
|
|
3041
|
+
`所有子代已消失,下一个主宰将在1小时后重生`,
|
|
3042
|
+
"",
|
|
3043
|
+
"🏆 伤害排行榜奖励:",
|
|
3044
|
+
...rewardMessages
|
|
3045
|
+
]
|
|
3046
|
+
};
|
|
2726
3047
|
}
|
|
2727
3048
|
}
|
|
2728
3049
|
}
|
|
3050
|
+
if (allCleanerRewards.length > 0) {
|
|
3051
|
+
const combinedRewards = `✨ 散射攻击击败奖励
|
|
3052
|
+
${allCleanerRewards.join("\n")}`;
|
|
3053
|
+
otherBroadcastMessages.push(combinedRewards);
|
|
3054
|
+
}
|
|
3055
|
+
if (masterDeathEvent) {
|
|
3056
|
+
scatterBroadcast = [
|
|
3057
|
+
...masterDeathEvent.rewards
|
|
3058
|
+
];
|
|
3059
|
+
if (otherBroadcastMessages.length > 0) {
|
|
3060
|
+
scatterBroadcast.push("", ...otherBroadcastMessages);
|
|
3061
|
+
}
|
|
3062
|
+
} else if (otherBroadcastMessages.length > 0) {
|
|
3063
|
+
scatterBroadcast = otherBroadcastMessages;
|
|
3064
|
+
}
|
|
3065
|
+
if (Array.isArray(scatterBroadcast) && scatterBroadcast.length === 1) {
|
|
3066
|
+
scatterBroadcast = scatterBroadcast[0];
|
|
3067
|
+
}
|
|
2729
3068
|
return { scatterEffectMessages, extraDamages, actuallyDead, scatterBroadcast };
|
|
2730
3069
|
}
|
|
2731
3070
|
__name(handleSecondaryTargets, "handleSecondaryTargets");
|
|
@@ -2877,7 +3216,7 @@ function apply(ctx, config) {
|
|
|
2877
3216
|
});
|
|
2878
3217
|
return {
|
|
2879
3218
|
success: true,
|
|
2880
|
-
message:
|
|
3219
|
+
message: `成功引爆${itemName},对空间站哨枪塔造成${damageValue}点伤害,获得等额金币。`
|
|
2881
3220
|
};
|
|
2882
3221
|
}
|
|
2883
3222
|
if (itemConfig2.id === 2) {
|
|
@@ -2891,7 +3230,7 @@ function apply(ctx, config) {
|
|
|
2891
3230
|
});
|
|
2892
3231
|
if (!targetboss || targetboss?.Skillcountpoints === 0 || targetboss?.tags.includes("建筑") || targetboss?.tags.includes("重型")) return {
|
|
2893
3232
|
success: false,
|
|
2894
|
-
message: "
|
|
3233
|
+
message: "您无法对目标使用(目标已死亡/目标的技能计数为0/目标拥有“建筑”或“重型”标签)。"
|
|
2895
3234
|
};
|
|
2896
3235
|
await ctx.database.set(
|
|
2897
3236
|
"ggcevo_boss",
|
|
@@ -2900,7 +3239,7 @@ function apply(ctx, config) {
|
|
|
2900
3239
|
);
|
|
2901
3240
|
return {
|
|
2902
3241
|
success: true,
|
|
2903
|
-
message:
|
|
3242
|
+
message: `成功使用${itemName},已重置${target}的技能计数。`
|
|
2904
3243
|
};
|
|
2905
3244
|
}
|
|
2906
3245
|
if (itemConfig2.id === 3 || itemConfig2.id === 5) {
|
|
@@ -2920,7 +3259,7 @@ function apply(ctx, config) {
|
|
|
2920
3259
|
});
|
|
2921
3260
|
if (!targetboss || targetboss?.energy === 0) return {
|
|
2922
3261
|
success: false,
|
|
2923
|
-
message: "
|
|
3262
|
+
message: "您无法对目标使用(目标的能量为0)。"
|
|
2924
3263
|
};
|
|
2925
3264
|
await ctx.database.set(
|
|
2926
3265
|
"ggcevo_boss",
|
|
@@ -2930,18 +3269,18 @@ function apply(ctx, config) {
|
|
|
2930
3269
|
);
|
|
2931
3270
|
return {
|
|
2932
3271
|
success: true,
|
|
2933
|
-
message:
|
|
3272
|
+
message: `成功使用${itemName},消耗${target}500点能量。`
|
|
2934
3273
|
};
|
|
2935
3274
|
}
|
|
2936
3275
|
return {
|
|
2937
3276
|
success: false,
|
|
2938
|
-
message: `${itemName}
|
|
3277
|
+
message: `${itemName} 效果开发中,无法使用。`
|
|
2939
3278
|
};
|
|
2940
3279
|
} catch (error) {
|
|
2941
3280
|
console.error("物品效果处理失败:", error);
|
|
2942
3281
|
return {
|
|
2943
3282
|
success: false,
|
|
2944
|
-
message: "⚠️
|
|
3283
|
+
message: "⚠️ 物品效果处理异常,已回滚操作。"
|
|
2945
3284
|
};
|
|
2946
3285
|
}
|
|
2947
3286
|
}
|
|
@@ -2959,14 +3298,19 @@ function apply(ctx, config) {
|
|
|
2959
3298
|
if (currentLevel >= tech.maxLevel) return `❌ ${tech.techname}已达最高等级`;
|
|
2960
3299
|
const nextLevel = currentLevel + 1;
|
|
2961
3300
|
const levelData = tech.levels.find((l) => l.level === nextLevel);
|
|
2962
|
-
let
|
|
3301
|
+
let originalCost = levelData.cost;
|
|
3302
|
+
let actualCost = originalCost;
|
|
3303
|
+
let discountApplied = false;
|
|
3304
|
+
let discountDetails = [];
|
|
2963
3305
|
if (careerData.career === "情报副官") {
|
|
2964
|
-
|
|
3306
|
+
discountApplied = true;
|
|
3307
|
+
actualCost = Math.floor(originalCost * 0.8);
|
|
3308
|
+
discountDetails.push("🎖️ 情报副官:20%折扣");
|
|
2965
3309
|
}
|
|
2966
3310
|
const [signInfo] = await ctx.database.get("ggcevo_sign", { handle });
|
|
2967
3311
|
if (signInfo?.totalRewards < actualCost) {
|
|
2968
|
-
const
|
|
2969
|
-
return `❌
|
|
3312
|
+
const priceHint = discountApplied ? ` (原价${originalCost}金币)` : "";
|
|
3313
|
+
return `❌ 金币不足!需要${actualCost}金币${priceHint},您当前拥有:${signInfo?.totalRewards || 0}金币`;
|
|
2970
3314
|
}
|
|
2971
3315
|
await ctx.database.withTransaction(async () => {
|
|
2972
3316
|
await ctx.database.set("ggcevo_sign", { handle }, {
|
|
@@ -2978,13 +3322,22 @@ function apply(ctx, config) {
|
|
|
2978
3322
|
level: nextLevel
|
|
2979
3323
|
}], ["handle", "techId"]);
|
|
2980
3324
|
});
|
|
2981
|
-
|
|
2982
|
-
|
|
2983
|
-
|
|
2984
|
-
|
|
2985
|
-
${
|
|
2986
|
-
|
|
2987
|
-
|
|
3325
|
+
let discountInfo = [];
|
|
3326
|
+
if (discountApplied) {
|
|
3327
|
+
discountInfo = [
|
|
3328
|
+
"折扣明细:",
|
|
3329
|
+
...discountDetails.map((detail) => `▸ ${detail}`)
|
|
3330
|
+
];
|
|
3331
|
+
}
|
|
3332
|
+
const costInfo = discountApplied ? `💰 花费金币:${actualCost} (原价${originalCost})` : `💰 花费金币:${actualCost}`;
|
|
3333
|
+
return [
|
|
3334
|
+
`✅ ${tech.techname} 升级至 Lv.${nextLevel}`,
|
|
3335
|
+
costInfo,
|
|
3336
|
+
...discountInfo,
|
|
3337
|
+
// 插入折扣明细
|
|
3338
|
+
`📝 ${levelData.description}`,
|
|
3339
|
+
`💼 ${levelData.careerBonus}`
|
|
3340
|
+
].filter(Boolean).join("\n");
|
|
2988
3341
|
}
|
|
2989
3342
|
__name(handleTechUpgrade, "handleTechUpgrade");
|
|
2990
3343
|
async function handleWeaponUpgrade(handle, target) {
|
|
@@ -3014,22 +3367,22 @@ ${discountHint}${costLine}
|
|
|
3014
3367
|
if (weaponDiscount > 0) {
|
|
3015
3368
|
totalDiscount += weaponDiscount;
|
|
3016
3369
|
discountDetails.push(
|
|
3017
|
-
|
|
3370
|
+
`⚙️ 武器系统 Lv${techLevel}:${weaponDiscount}%折扣`
|
|
3018
3371
|
);
|
|
3019
3372
|
}
|
|
3020
3373
|
}
|
|
3021
3374
|
const activeWish = await checkFoxBlessing(handle);
|
|
3022
3375
|
if (activeWish) {
|
|
3023
3376
|
totalDiscount += 20;
|
|
3024
|
-
discountDetails.push("
|
|
3377
|
+
discountDetails.push("🦊 灵狐升运:20%折扣");
|
|
3025
3378
|
}
|
|
3026
3379
|
totalDiscount = Math.min(totalDiscount, 100);
|
|
3027
3380
|
const discountedCost = baseCost * (100 - totalDiscount) / 100;
|
|
3028
3381
|
const actualCost = Math.floor(discountedCost);
|
|
3029
3382
|
const [signInfo] = await ctx.database.get("ggcevo_sign", { handle });
|
|
3030
3383
|
if (signInfo?.totalRewards < actualCost) {
|
|
3031
|
-
const priceInfo2 = totalDiscount > 0 ?
|
|
3032
|
-
return `❌ ${priceInfo2}
|
|
3384
|
+
const priceInfo2 = totalDiscount > 0 ? `需要${actualCost}金币(原价${baseCost}金币)` : `需要${actualCost}金币`;
|
|
3385
|
+
return `❌ ${priceInfo2},您当前拥有:${signInfo?.totalRewards || 0}金币`;
|
|
3033
3386
|
}
|
|
3034
3387
|
await ctx.database.withTransaction(async () => {
|
|
3035
3388
|
await ctx.database.set("ggcevo_sign", { handle }, {
|
|
@@ -3055,18 +3408,18 @@ ${discountHint}${costLine}
|
|
|
3055
3408
|
const damage = (weaponData.damage * (1 + 0.1 * newLevel)).toFixed(1);
|
|
3056
3409
|
let msg = `${target} 升级成功!Lv.${newLevel}`;
|
|
3057
3410
|
const priceInfo = totalDiscount > 0 ? `
|
|
3058
|
-
💸 消耗:${actualCost}金币 (原价${baseCost})` : `
|
|
3411
|
+
💸 消耗:${actualCost}金币 (原价${baseCost}金币)` : `
|
|
3059
3412
|
💸 消耗:${actualCost}金币`;
|
|
3060
3413
|
msg += priceInfo;
|
|
3061
3414
|
if (discountDetails.length > 0) {
|
|
3062
3415
|
msg += `
|
|
3063
|
-
|
|
3416
|
+
💰 折扣明细:
|
|
3064
3417
|
${discountDetails.join("\n▸ ")}`;
|
|
3065
3418
|
}
|
|
3066
3419
|
msg += `
|
|
3067
3420
|
💥 伤害:${damage}`;
|
|
3068
3421
|
msg += `
|
|
3069
|
-
|
|
3422
|
+
🔧 改装槽:${Math.floor(newLevel / 3) + 1}个`;
|
|
3070
3423
|
return msg;
|
|
3071
3424
|
}
|
|
3072
3425
|
__name(handleWeaponUpgrade, "handleWeaponUpgrade");
|
|
@@ -3109,26 +3462,30 @@ ${discountDetails.join("\n▸ ")}`;
|
|
|
3109
3462
|
const showOriginal = finalPrice < baseCost;
|
|
3110
3463
|
return [
|
|
3111
3464
|
`等级 ${level.padEnd(5)}`,
|
|
3112
|
-
`▸ 价格: ${finalPrice.toString().padStart(4)}${showOriginal ? ` (
|
|
3465
|
+
`▸ 价格: ${finalPrice.toString().padStart(4)}${showOriginal ? ` (原价${baseCost})` : ""}`
|
|
3113
3466
|
].join("\n");
|
|
3114
3467
|
});
|
|
3115
3468
|
const discountNotice = [];
|
|
3469
|
+
if (hasTechDiscount || hasFoxDiscount) {
|
|
3470
|
+
discountNotice.push("💰 当前折扣:");
|
|
3471
|
+
}
|
|
3116
3472
|
if (hasTechDiscount) {
|
|
3117
|
-
discountNotice.push(
|
|
3473
|
+
discountNotice.push(`⚙️ 武器系统 Lv${techLevel}:${techDiscountRate}%折扣`);
|
|
3118
3474
|
}
|
|
3119
3475
|
if (hasFoxDiscount) {
|
|
3120
|
-
discountNotice.push(
|
|
3476
|
+
discountNotice.push(`🦊 灵狐升运:20%折扣`);
|
|
3121
3477
|
}
|
|
3122
3478
|
if (!hasTechDiscount && !hasFoxDiscount) {
|
|
3123
3479
|
discountNotice.push("💡 提示:加入人类联盟并升级武器系统可获得折扣");
|
|
3124
3480
|
}
|
|
3125
3481
|
return [
|
|
3126
3482
|
"⚡ 武器升级价格表 ⚡",
|
|
3483
|
+
"使用「升级 武器名称」对武器进行等级升级",
|
|
3127
3484
|
...discountNotice,
|
|
3485
|
+
// 现在折扣信息前有标题
|
|
3128
3486
|
"====================",
|
|
3129
3487
|
...priceDetails,
|
|
3130
|
-
"===================="
|
|
3131
|
-
"使用「升级 武器名称」进行具体升级"
|
|
3488
|
+
"===================="
|
|
3132
3489
|
].join("\n");
|
|
3133
3490
|
}
|
|
3134
3491
|
__name(generateUpgradePriceList, "generateUpgradePriceList");
|
|
@@ -3193,18 +3550,18 @@ ${discountDetails.join("\n▸ ")}`;
|
|
|
3193
3550
|
let hiddenWinCount = 0;
|
|
3194
3551
|
const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
|
|
3195
3552
|
if (!profile) {
|
|
3196
|
-
return "🔒
|
|
3553
|
+
return "🔒 需要先绑定游戏句柄。";
|
|
3197
3554
|
}
|
|
3198
3555
|
const { regionId, realmId, profileId } = profile;
|
|
3199
3556
|
const handle = `${regionId}-S2-${realmId}-${profileId}`;
|
|
3200
3557
|
const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
|
|
3201
3558
|
if (existingEntries.length > 0) {
|
|
3202
|
-
return `⛔
|
|
3559
|
+
return `⛔ 您已被列入黑名单。`;
|
|
3203
3560
|
}
|
|
3204
3561
|
const [backpack] = await ctx.database.get("ggcevo_backpack", { handle, itemId: 1 });
|
|
3205
3562
|
const quantity = backpack?.quantity;
|
|
3206
3563
|
if (quantity < 1) {
|
|
3207
|
-
return "
|
|
3564
|
+
return "您背包内的咕咕币不足。";
|
|
3208
3565
|
}
|
|
3209
3566
|
await ctx.database.upsert("ggcevo_backpack", [{
|
|
3210
3567
|
handle,
|
|
@@ -3219,27 +3576,27 @@ ${discountDetails.join("\n▸ ")}`;
|
|
|
3219
3576
|
}
|
|
3220
3577
|
const [record] = await ctx.database.get("ggcevo_records", { handle });
|
|
3221
3578
|
return [
|
|
3222
|
-
`🎰
|
|
3223
|
-
winCount > 0 ? `🎉
|
|
3579
|
+
`🎰 您使用了${quantity}枚咕咕币`,
|
|
3580
|
+
winCount > 0 ? `🎉 其中获得${winCount}张兑换券!` : "💔 本次未获得任何兑换券",
|
|
3224
3581
|
`📊 当前保底进度:${record.pityCounter}/90`,
|
|
3225
|
-
...hiddenWinCount > 0 ? [`🎉
|
|
3582
|
+
...hiddenWinCount > 0 ? [`🎉 恭喜你抽中隐藏奖励,额外获得${hiddenWinCount}张兑换券和${hiddenWinCount}枚扭蛋币!`] : []
|
|
3226
3583
|
].join("\n");
|
|
3227
3584
|
});
|
|
3228
3585
|
ctx.command("ggcevo/单抽").action(async (argv) => {
|
|
3229
3586
|
const session = argv.session;
|
|
3230
3587
|
const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
|
|
3231
3588
|
if (!profile) {
|
|
3232
|
-
return "🔒
|
|
3589
|
+
return "🔒 需要先绑定游戏句柄。";
|
|
3233
3590
|
}
|
|
3234
3591
|
const { regionId, realmId, profileId } = profile;
|
|
3235
3592
|
const handle = `${regionId}-S2-${realmId}-${profileId}`;
|
|
3236
3593
|
const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
|
|
3237
3594
|
if (existingEntries.length > 0) {
|
|
3238
|
-
return `⛔
|
|
3595
|
+
return `⛔ 您已被列入黑名单。`;
|
|
3239
3596
|
}
|
|
3240
3597
|
const [backpack] = await ctx.database.get("ggcevo_backpack", { handle, itemId: 1 });
|
|
3241
3598
|
if (backpack?.quantity < 1) {
|
|
3242
|
-
return "
|
|
3599
|
+
return "您背包内的咕咕币不足。";
|
|
3243
3600
|
}
|
|
3244
3601
|
await ctx.database.upsert("ggcevo_backpack", [{
|
|
3245
3602
|
handle,
|
|
@@ -3251,7 +3608,7 @@ ${discountDetails.join("\n▸ ")}`;
|
|
|
3251
3608
|
const [record] = await ctx.database.get("ggcevo_records", { handle });
|
|
3252
3609
|
return [
|
|
3253
3610
|
`${result ? "🎉 获得兑换券!" : "❌ 未中奖"} 保底进度:${record.pityCounter}/90`,
|
|
3254
|
-
...HiddenAward2 ? [`🎉 恭喜你抽中隐藏奖励,额外获得
|
|
3611
|
+
...HiddenAward2 ? [`🎉 恭喜你抽中隐藏奖励,额外获得1张兑换券和1枚扭蛋币!`] : []
|
|
3255
3612
|
].join("\n");
|
|
3256
3613
|
});
|
|
3257
3614
|
ctx.command("ggcevo/十连抽").action(async (argv) => {
|
|
@@ -3259,17 +3616,17 @@ ${discountDetails.join("\n▸ ")}`;
|
|
|
3259
3616
|
let hiddenWinCount = 0;
|
|
3260
3617
|
const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
|
|
3261
3618
|
if (!profile) {
|
|
3262
|
-
return "🔒
|
|
3619
|
+
return "🔒 需要先绑定游戏句柄。";
|
|
3263
3620
|
}
|
|
3264
3621
|
const { regionId, realmId, profileId } = profile;
|
|
3265
3622
|
const handle = `${regionId}-S2-${realmId}-${profileId}`;
|
|
3266
3623
|
const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
|
|
3267
3624
|
if (existingEntries.length > 0) {
|
|
3268
|
-
return `⛔
|
|
3625
|
+
return `⛔ 您已被列入黑名单。`;
|
|
3269
3626
|
}
|
|
3270
3627
|
const [backpack] = await ctx.database.get("ggcevo_backpack", { handle, itemId: 1 });
|
|
3271
3628
|
if (backpack?.quantity < 10) {
|
|
3272
|
-
return "
|
|
3629
|
+
return "您背包内的咕咕币不足。";
|
|
3273
3630
|
}
|
|
3274
3631
|
await ctx.database.upsert("ggcevo_backpack", [{
|
|
3275
3632
|
handle,
|
|
@@ -3287,13 +3644,13 @@ ${discountDetails.join("\n▸ ")}`;
|
|
|
3287
3644
|
"十连抽结果:",
|
|
3288
3645
|
...results.map((r) => r ? "🎉 获得兑换券" : "❌ 未中奖"),
|
|
3289
3646
|
`保底进度:${record.pityCounter}/90`,
|
|
3290
|
-
...hiddenWinCount > 0 ? [`🎉
|
|
3647
|
+
...hiddenWinCount > 0 ? [`🎉 恭喜你抽中隐藏奖励,额外获得${hiddenWinCount}张兑换券和${hiddenWinCount}枚扭蛋币!`] : []
|
|
3291
3648
|
].join("\n");
|
|
3292
3649
|
});
|
|
3293
3650
|
ctx.command("ggcevo/背包").action(async (argv) => {
|
|
3294
3651
|
const session = argv.session;
|
|
3295
3652
|
const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
|
|
3296
|
-
if (!profile) return "🔒
|
|
3653
|
+
if (!profile) return "🔒 需要先绑定游戏句柄。";
|
|
3297
3654
|
const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
|
|
3298
3655
|
const items = await ctx.database.get("ggcevo_backpack", { handle });
|
|
3299
3656
|
const validItems = items.filter((item) => item.quantity > 0);
|
|
@@ -3314,11 +3671,11 @@ ${itemDetails.join("\n")}`;
|
|
|
3314
3671
|
const session = argv.session;
|
|
3315
3672
|
let latestTime;
|
|
3316
3673
|
const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
|
|
3317
|
-
if (!profile) return "🔒
|
|
3674
|
+
if (!profile) return "🔒 需要先绑定游戏句柄。";
|
|
3318
3675
|
const { regionId, realmId, profileId } = profile;
|
|
3319
3676
|
const handle = `${regionId}-S2-${realmId}-${profileId}`;
|
|
3320
3677
|
const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
|
|
3321
|
-
if (existingEntries.length > 0) return "⛔
|
|
3678
|
+
if (existingEntries.length > 0) return "⛔ 您已被列入黑名单。";
|
|
3322
3679
|
const now = /* @__PURE__ */ new Date();
|
|
3323
3680
|
const currentChinaTime = convertUTCtoChinaTime(now);
|
|
3324
3681
|
if (config.signrequire) {
|
|
@@ -3380,7 +3737,7 @@ ${itemDetails.join("\n")}`;
|
|
|
3380
3737
|
const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
|
|
3381
3738
|
if (careerData?.group === "人类联盟") {
|
|
3382
3739
|
totalBonus += 0.2;
|
|
3383
|
-
messages.push("🏛️
|
|
3740
|
+
messages.push("🏛️ 人类联盟:+20%金币");
|
|
3384
3741
|
const [userMiningTech] = await ctx.database.get("ggcevo_tech", { handle, techId: 1 }).catch(() => [{ level: 0 }]);
|
|
3385
3742
|
const techLevel = Math.min(userMiningTech?.level || 0, 5);
|
|
3386
3743
|
const miningTechConfig = Spacestationtechnology.find((t) => t.techId === 1);
|
|
@@ -3395,22 +3752,22 @@ ${itemDetails.join("\n")}`;
|
|
|
3395
3752
|
const finalBonus = Math.max(baseTechBonus, careerTechBonus);
|
|
3396
3753
|
if (finalBonus > 0) {
|
|
3397
3754
|
totalBonus += finalBonus / 100;
|
|
3398
|
-
messages.push(`⚙️ 采掘系统 Lv${techLevel}
|
|
3755
|
+
messages.push(`⚙️ 采掘系统 Lv${techLevel}:+${finalBonus}%金币`);
|
|
3399
3756
|
}
|
|
3400
3757
|
}
|
|
3401
3758
|
if (careerData.career === "深空矿工") {
|
|
3402
3759
|
totalBonus += 0.5;
|
|
3403
|
-
messages.push("
|
|
3760
|
+
messages.push("🎖️ 深空矿工:+50%金币");
|
|
3404
3761
|
}
|
|
3405
3762
|
}
|
|
3406
3763
|
if (careerData?.group === "辛迪加海盗") {
|
|
3407
3764
|
const [cred17Item] = await ctx.database.get("ggcevo_warehouse", { handle, itemId: 3 });
|
|
3408
3765
|
if (cred17Item?.quantity >= 1) {
|
|
3409
|
-
const
|
|
3410
|
-
const
|
|
3411
|
-
const credBonus = 0.5 +
|
|
3766
|
+
const humanPlayersCount = await ctx.database.select("ggcevo_careers").where({ group: "人类联盟" }).execute((row) => import_koishi.$.count(row.handle));
|
|
3767
|
+
const additionalBonus = Math.min(humanPlayersCount, 50);
|
|
3768
|
+
const credBonus = 0.5 + additionalBonus / 100;
|
|
3412
3769
|
totalBonus += credBonus;
|
|
3413
|
-
messages.push(`💎 CRED-17
|
|
3770
|
+
messages.push(`💎 CRED-17:+50%金币 (${additionalBonus}名人类联盟玩家,额外+${additionalBonus}%金币)`);
|
|
3414
3771
|
}
|
|
3415
3772
|
}
|
|
3416
3773
|
const [meowEffect] = await ctx.database.get("ggcevo_Wish_Record", {
|
|
@@ -3423,7 +3780,7 @@ ${itemDetails.join("\n")}`;
|
|
|
3423
3780
|
if (meowEffect) {
|
|
3424
3781
|
tickets *= 2;
|
|
3425
3782
|
totalBonus += 1;
|
|
3426
|
-
messages.push("🐾
|
|
3783
|
+
messages.push("🐾 喵喵财源:咕咕币+100%,金币+100%");
|
|
3427
3784
|
}
|
|
3428
3785
|
const finalPoints = Math.round(basePoints * (1 + totalBonus));
|
|
3429
3786
|
let redCrystal = 0;
|
|
@@ -3439,7 +3796,7 @@ ${itemDetails.join("\n")}`;
|
|
|
3439
3796
|
} else {
|
|
3440
3797
|
redCrystal = 5;
|
|
3441
3798
|
}
|
|
3442
|
-
messages.push(
|
|
3799
|
+
messages.push(`🎖️ 辛迪加财务经理:+${redCrystal}枚红晶`);
|
|
3443
3800
|
}
|
|
3444
3801
|
await ctx.database.withTransaction(async () => {
|
|
3445
3802
|
await ctx.database.upsert("ggcevo_sign", [{
|
|
@@ -3476,11 +3833,11 @@ ${itemDetails.join("\n")}`;
|
|
|
3476
3833
|
try {
|
|
3477
3834
|
const session = argv.session;
|
|
3478
3835
|
const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
|
|
3479
|
-
if (!profile) return "🔒
|
|
3836
|
+
if (!profile) return "🔒 需要先绑定游戏句柄。";
|
|
3480
3837
|
const { regionId, realmId, profileId } = profile;
|
|
3481
3838
|
const handle = `${regionId}-S2-${realmId}-${profileId}`;
|
|
3482
3839
|
const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
|
|
3483
|
-
if (existingEntries.length > 0) return "⛔
|
|
3840
|
+
if (existingEntries.length > 0) return "⛔ 您已被列入黑名单。";
|
|
3484
3841
|
const [record] = await ctx.database.get("ggcevo_sign", { handle });
|
|
3485
3842
|
if (!record) return "暂未查询到您的签到记录";
|
|
3486
3843
|
const lastSignChina = convertUTCtoChinaTime(record.lastSign);
|
|
@@ -3495,7 +3852,7 @@ ${itemDetails.join("\n")}`;
|
|
|
3495
3852
|
}
|
|
3496
3853
|
const costPoints = 100;
|
|
3497
3854
|
if (record.totalRewards < costPoints) {
|
|
3498
|
-
return `补签需要消耗${costPoints}
|
|
3855
|
+
return `补签需要消耗${costPoints}枚金币,您当前拥有:${record.totalRewards}枚金币`;
|
|
3499
3856
|
}
|
|
3500
3857
|
const newMonthlyDays = record.monthlyDays + 1;
|
|
3501
3858
|
let tickets = 3, points = 0;
|
|
@@ -3521,7 +3878,7 @@ ${itemDetails.join("\n")}`;
|
|
|
3521
3878
|
await ctx.database.set("ggcevo_backpack", { handle, itemId: 1 }, {
|
|
3522
3879
|
quantity: (backpack?.quantity || 0) + tickets
|
|
3523
3880
|
});
|
|
3524
|
-
const rewardsMessage = points > 0 ? `获得${points}枚金币和${tickets}
|
|
3881
|
+
const rewardsMessage = points > 0 ? `获得${points}枚金币和${tickets}枚咕咕币。` : `获得${tickets}枚咕咕币。`;
|
|
3525
3882
|
return `补签成功!本月累计签到${newMonthlyDays}天,消耗${costPoints}枚金币,${rewardsMessage}`;
|
|
3526
3883
|
} catch (error) {
|
|
3527
3884
|
console.error("补签错误:", error);
|
|
@@ -3531,13 +3888,13 @@ ${itemDetails.join("\n")}`;
|
|
|
3531
3888
|
ctx.guild().command("ggcevo/每月津贴").action(async (argv) => {
|
|
3532
3889
|
const session = argv.session;
|
|
3533
3890
|
const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
|
|
3534
|
-
if (!profile) return "🔒
|
|
3891
|
+
if (!profile) return "🔒 需要先绑定游戏句柄。";
|
|
3535
3892
|
const { regionId, realmId, profileId } = profile;
|
|
3536
3893
|
const handle = `${regionId}-S2-${realmId}-${profileId}`;
|
|
3537
3894
|
const [backpack] = await ctx.database.get("ggcevo_backpack", { handle, itemId: 1 });
|
|
3538
3895
|
const memberInfo = await session.event?.member?.roles;
|
|
3539
3896
|
if (memberInfo?.includes("member")) {
|
|
3540
|
-
return "❌
|
|
3897
|
+
return "❌ 仅限管理员和群主领取每月津贴。";
|
|
3541
3898
|
}
|
|
3542
3899
|
const now = /* @__PURE__ */ new Date();
|
|
3543
3900
|
const chinatime = convertUTCtoChinaTime(now);
|
|
@@ -3551,7 +3908,7 @@ ${itemDetails.join("\n")}`;
|
|
|
3551
3908
|
const lastYear = lastSignTime.getUTCFullYear();
|
|
3552
3909
|
const lastMonth = lastSignTime.getUTCMonth();
|
|
3553
3910
|
if (lastYear === currentYear && lastMonth === currentMonth) {
|
|
3554
|
-
return `您的本月管理津贴已领取,${currentMonth + 2}月1
|
|
3911
|
+
return `您的本月管理津贴已领取,${currentMonth + 2}月1日后可再次领取。`;
|
|
3555
3912
|
}
|
|
3556
3913
|
}
|
|
3557
3914
|
await ctx.database.upsert("ggcevo_adminbenefit", [{
|
|
@@ -3566,15 +3923,15 @@ ${itemDetails.join("\n")}`;
|
|
|
3566
3923
|
itemId: 1,
|
|
3567
3924
|
quantity: (backpack?.quantity || 0) + 50
|
|
3568
3925
|
}]);
|
|
3569
|
-
return `[管理专属]
|
|
3926
|
+
return `[管理专属] 您成功领取本月津贴,获得了50枚咕咕币!`;
|
|
3570
3927
|
});
|
|
3571
3928
|
ctx.command("ggcevo/领取 [name]").action(async (argv, name2) => {
|
|
3572
3929
|
const session = argv.session;
|
|
3573
3930
|
const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
|
|
3574
|
-
if (!profile) return "🔒
|
|
3931
|
+
if (!profile) return "🔒 需要先绑定游戏句柄。";
|
|
3575
3932
|
const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
|
|
3576
3933
|
const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
|
|
3577
|
-
if (existingEntries.length > 0) return "⛔
|
|
3934
|
+
if (existingEntries.length > 0) return "⛔ 您已被列入黑名单。";
|
|
3578
3935
|
if (!name2) {
|
|
3579
3936
|
await session.send("请在30秒内输入活动名称:");
|
|
3580
3937
|
name2 = await session.prompt(3e4);
|
|
@@ -3655,7 +4012,7 @@ ${itemDetails.join("\n")}`;
|
|
|
3655
4012
|
});
|
|
3656
4013
|
ctx.command("ggcevo/活动列表").action(async ({ session }) => {
|
|
3657
4014
|
const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
|
|
3658
|
-
if (!profile) return "🔒
|
|
4015
|
+
if (!profile) return "🔒 需要先绑定游戏句柄。";
|
|
3659
4016
|
const activities = await ctx.database.get(
|
|
3660
4017
|
"ggcevo_activity",
|
|
3661
4018
|
{ status: "进行中" },
|
|
@@ -3821,7 +4178,7 @@ ${itemDetails.join("\n")}`;
|
|
|
3821
4178
|
});
|
|
3822
4179
|
ctx.command("ggcevo/胜点榜 [page]").usage("输入 胜点榜 [页码] 查看对应页的排行榜,每页10条").action(async ({ session }, page) => {
|
|
3823
4180
|
const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
|
|
3824
|
-
if (!profile) return "🔒
|
|
4181
|
+
if (!profile) return "🔒 需要先绑定游戏句柄。";
|
|
3825
4182
|
const pageNum = parseInt(page) || 1;
|
|
3826
4183
|
if (pageNum < 1) return "请输入有效的页码。";
|
|
3827
4184
|
const offset = (pageNum - 1) * 10;
|
|
@@ -3830,7 +4187,7 @@ ${itemDetails.join("\n")}`;
|
|
|
3830
4187
|
ctx.database.select("ggcevo_rank").where({ Blacklist: false, rankseason: config.rankseason }).execute((row) => import_koishi.$.count(row.handle))
|
|
3831
4188
|
]);
|
|
3832
4189
|
const totalPages = Math.ceil(total / 10);
|
|
3833
|
-
if (pageNum > totalPages) return
|
|
4190
|
+
if (pageNum > totalPages) return `查询失败,最多有${totalPages}页`;
|
|
3834
4191
|
const processedRecords = await Promise.all(
|
|
3835
4192
|
records.map(async (item) => ({
|
|
3836
4193
|
...item,
|
|
@@ -3993,7 +4350,7 @@ ${itemDetails.join("\n")}`;
|
|
|
3993
4350
|
if (!player) {
|
|
3994
4351
|
const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
|
|
3995
4352
|
if (!profile) {
|
|
3996
|
-
return "🔒
|
|
4353
|
+
return "🔒 需要先绑定游戏句柄。";
|
|
3997
4354
|
}
|
|
3998
4355
|
const { regionId, realmId, profileId } = profile;
|
|
3999
4356
|
const handle = `${regionId}-S2-${realmId}-${profileId}`;
|
|
@@ -4009,7 +4366,7 @@ ${itemDetails.join("\n")}`;
|
|
|
4009
4366
|
) + 1;
|
|
4010
4367
|
const isSafe = await checkSensitiveWord(user.name);
|
|
4011
4368
|
const displayName = isSafe ? user.name : (user.name[0] || "") + "***";
|
|
4012
|
-
return `🎮
|
|
4369
|
+
return `🎮 咕咕排名信息 🎮
|
|
4013
4370
|
------------------------------
|
|
4014
4371
|
昵称:${displayName}
|
|
4015
4372
|
句柄:${user.handle}
|
|
@@ -4043,7 +4400,7 @@ ${itemDetails.join("\n")}`;
|
|
|
4043
4400
|
) + 1;
|
|
4044
4401
|
const isSafe = await checkSensitiveWord(user.name);
|
|
4045
4402
|
const displayName = isSafe ? user.name : (user.name[0] || "") + "***";
|
|
4046
|
-
return `🎮
|
|
4403
|
+
return `🎮 咕咕排名信息 🎮
|
|
4047
4404
|
------------------------------
|
|
4048
4405
|
昵称:${displayName}
|
|
4049
4406
|
句柄:${user.handle}
|
|
@@ -4069,7 +4426,7 @@ ${itemDetails.join("\n")}`;
|
|
|
4069
4426
|
lastSign: signData?.lastSign || /* @__PURE__ */ new Date(0),
|
|
4070
4427
|
monthlyDays: signData?.monthlyDays || 0
|
|
4071
4428
|
}]);
|
|
4072
|
-
return
|
|
4429
|
+
return `✅ 成功为 ${handle} 添加 ${parsedAmount} 金币!用户当前总数:${newTotal}`;
|
|
4073
4430
|
} else if (itemName === "红晶") {
|
|
4074
4431
|
const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
|
|
4075
4432
|
const currentRed = careerData?.redcrystal || 0;
|
|
@@ -4081,7 +4438,7 @@ ${itemDetails.join("\n")}`;
|
|
|
4081
4438
|
career: careerData?.career || "",
|
|
4082
4439
|
date: careerData?.date || /* @__PURE__ */ new Date()
|
|
4083
4440
|
}]);
|
|
4084
|
-
return
|
|
4441
|
+
return `✅ 成功为 ${handle} 添加 ${parsedAmount} 红晶!用户当前总数:${newRed}`;
|
|
4085
4442
|
} else {
|
|
4086
4443
|
const validItems = Object.keys(initDefaultItems);
|
|
4087
4444
|
if (!validItems.includes(itemName)) {
|
|
@@ -4095,7 +4452,7 @@ ${itemDetails.join("\n")}`;
|
|
|
4095
4452
|
itemId,
|
|
4096
4453
|
quantity: newQuantity
|
|
4097
4454
|
}], ["handle", "itemId"]);
|
|
4098
|
-
return
|
|
4455
|
+
return `✅ 成功为 ${handle} 添加 ${parsedAmount} 个${itemName}!用户当前总数:${newQuantity}`;
|
|
4099
4456
|
}
|
|
4100
4457
|
} catch (err) {
|
|
4101
4458
|
console.error("[给予命令错误]", err);
|
|
@@ -4109,7 +4466,7 @@ ${itemDetails.join("\n")}`;
|
|
|
4109
4466
|
let handle;
|
|
4110
4467
|
if (!user) {
|
|
4111
4468
|
const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
|
|
4112
|
-
if (!profile) return "🔒
|
|
4469
|
+
if (!profile) return "🔒 需要先绑定游戏句柄。";
|
|
4113
4470
|
handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
|
|
4114
4471
|
} else {
|
|
4115
4472
|
const parsedUser = import_koishi.h.parse(user)[0];
|
|
@@ -4158,11 +4515,11 @@ ${itemDetails.join("\n")}`;
|
|
|
4158
4515
|
ctx.command("ggcevo/兑换", "兑换物品").action(async ({ session }) => {
|
|
4159
4516
|
try {
|
|
4160
4517
|
const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
|
|
4161
|
-
if (!profile) return "🔒
|
|
4518
|
+
if (!profile) return "🔒 需要先绑定游戏句柄。";
|
|
4162
4519
|
const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
|
|
4163
4520
|
const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
|
|
4164
4521
|
if (existingEntries.length > 0) {
|
|
4165
|
-
return `⛔
|
|
4522
|
+
return `⛔ 您已被列入黑名单。`;
|
|
4166
4523
|
}
|
|
4167
4524
|
const currentSeason = config.rankseason;
|
|
4168
4525
|
const qualityGroups = {};
|
|
@@ -4243,7 +4600,7 @@ ${items.join("、")}
|
|
|
4243
4600
|
}
|
|
4244
4601
|
const [coupon] = await ctx.database.get("ggcevo_backpack", { handle, itemId });
|
|
4245
4602
|
if (!coupon || coupon.quantity < cost) {
|
|
4246
|
-
const requireMsg = petItems.has(name2) ? `需要1个${configname.quality}
|
|
4603
|
+
const requireMsg = petItems.has(name2) ? `需要1个${configname.quality}级宠物扭蛋或${configname.cost}张兑奖券` : `需要${configname.cost}张兑奖券`;
|
|
4247
4604
|
return `${requireMsg}
|
|
4248
4605
|
您当前持有:${coupon?.quantity || 0}个${couponName}`;
|
|
4249
4606
|
}
|
|
@@ -4266,7 +4623,7 @@ ${items.join("、")}
|
|
|
4266
4623
|
season: currentSeason
|
|
4267
4624
|
});
|
|
4268
4625
|
});
|
|
4269
|
-
return `🎉
|
|
4626
|
+
return `🎉 恭喜!您使用${cost}个${couponName}兑换了【${name2}】`;
|
|
4270
4627
|
} catch (error) {
|
|
4271
4628
|
console.error("兑换失败:", error);
|
|
4272
4629
|
return "兑换失败";
|
|
@@ -4274,11 +4631,11 @@ ${items.join("、")}
|
|
|
4274
4631
|
});
|
|
4275
4632
|
ctx.command("ggcevo/兑换扭蛋币").action(async ({ session }) => {
|
|
4276
4633
|
const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
|
|
4277
|
-
if (!profile) return "🔒
|
|
4634
|
+
if (!profile) return "🔒 需要先绑定游戏句柄。";
|
|
4278
4635
|
const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
|
|
4279
4636
|
const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
|
|
4280
4637
|
if (existingEntries.length > 0) {
|
|
4281
|
-
return `⛔
|
|
4638
|
+
return `⛔ 您已被列入黑名单。`;
|
|
4282
4639
|
}
|
|
4283
4640
|
await session.send(`您确定要使用3张兑换券换取一枚扭蛋币吗?(请在30秒内回复“是”确认)`);
|
|
4284
4641
|
const confirm = await session.prompt(3e4);
|
|
@@ -4286,7 +4643,7 @@ ${items.join("、")}
|
|
|
4286
4643
|
const [backpack] = await ctx.database.get("ggcevo_backpack", { handle, itemId: 3 });
|
|
4287
4644
|
const [coupon] = await ctx.database.get("ggcevo_backpack", { handle, itemId: 2 });
|
|
4288
4645
|
if (!coupon || coupon.quantity < 3) {
|
|
4289
|
-
return `兑换扭蛋币需要3张兑奖券,您当前持有:${coupon?.quantity || 0}
|
|
4646
|
+
return `兑换扭蛋币需要3张兑奖券,您当前持有:${coupon?.quantity || 0}张兑换券`;
|
|
4290
4647
|
}
|
|
4291
4648
|
await ctx.database.set(
|
|
4292
4649
|
"ggcevo_backpack",
|
|
@@ -4298,23 +4655,23 @@ ${items.join("、")}
|
|
|
4298
4655
|
itemId: 3,
|
|
4299
4656
|
quantity: (backpack?.quantity || 0) + 1
|
|
4300
4657
|
}]);
|
|
4301
|
-
return `🎉恭喜!您使用
|
|
4658
|
+
return `🎉恭喜!您使用3张兑奖券兑换了1枚扭蛋币`;
|
|
4302
4659
|
});
|
|
4303
4660
|
ctx.command("ggcevo/扭蛋").action(async (argv) => {
|
|
4304
4661
|
const session = argv.session;
|
|
4305
4662
|
const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
|
|
4306
4663
|
if (!profile) {
|
|
4307
|
-
return "🔒
|
|
4664
|
+
return "🔒 需要先绑定游戏句柄。";
|
|
4308
4665
|
}
|
|
4309
4666
|
const { regionId, realmId, profileId } = profile;
|
|
4310
4667
|
const handle = `${regionId}-S2-${realmId}-${profileId}`;
|
|
4311
4668
|
const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
|
|
4312
4669
|
if (existingEntries.length > 0) {
|
|
4313
|
-
return `⛔
|
|
4670
|
+
return `⛔ 您已被列入黑名单。`;
|
|
4314
4671
|
}
|
|
4315
4672
|
const [backpack] = await ctx.database.get("ggcevo_backpack", { handle, itemId: 3 });
|
|
4316
4673
|
if (!backpack || backpack.quantity < 1) {
|
|
4317
|
-
return
|
|
4674
|
+
return `当前扭蛋币不足,您当前拥有:${backpack?.quantity || 0}枚扭蛋币`;
|
|
4318
4675
|
}
|
|
4319
4676
|
const awardName = PetCapsuleToy();
|
|
4320
4677
|
const awardItem = Object.entries(initDefaultItems).find(
|
|
@@ -4336,7 +4693,7 @@ ${items.join("、")}
|
|
|
4336
4693
|
itemId: itemData.id,
|
|
4337
4694
|
quantity: currentQuantity + 1
|
|
4338
4695
|
}]);
|
|
4339
|
-
return `🎉
|
|
4696
|
+
return `🎉 恭喜!您获得了${itemName}`;
|
|
4340
4697
|
});
|
|
4341
4698
|
ctx.command("ggcevo/拉黑 [handle]", "添加用户到黑名单").action(async (argv, handle) => {
|
|
4342
4699
|
const session = argv.session;
|
|
@@ -4401,7 +4758,7 @@ ${items.join("、")}
|
|
|
4401
4758
|
const session = argv.session;
|
|
4402
4759
|
const output = [];
|
|
4403
4760
|
const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
|
|
4404
|
-
if (!profile) return "🔒
|
|
4761
|
+
if (!profile) return "🔒 需要先绑定游戏句柄。";
|
|
4405
4762
|
const { regionId, realmId, profileId } = profile;
|
|
4406
4763
|
const handle = `${regionId}-S2-${realmId}-${profileId}`;
|
|
4407
4764
|
output.push(`🎮 游戏句柄:${handle}
|
|
@@ -4459,7 +4816,7 @@ ${items.join("、")}
|
|
|
4459
4816
|
lottery && "抽奖",
|
|
4460
4817
|
exchanges.length && "兑换"
|
|
4461
4818
|
].filter(Boolean);
|
|
4462
|
-
output.push(`📊
|
|
4819
|
+
output.push(`📊 共查询到${existModules.length}类信息`);
|
|
4463
4820
|
return output.join("\n");
|
|
4464
4821
|
});
|
|
4465
4822
|
const processedLobbies = /* @__PURE__ */ new Set();
|
|
@@ -4534,11 +4891,11 @@ ${items.join("、")}
|
|
|
4534
4891
|
try {
|
|
4535
4892
|
const session = argv.session;
|
|
4536
4893
|
const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
|
|
4537
|
-
if (!profile) return "🔒
|
|
4894
|
+
if (!profile) return "🔒 需要先绑定游戏句柄。";
|
|
4538
4895
|
const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
|
|
4539
4896
|
const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
|
|
4540
4897
|
if (existingEntries.length > 0) {
|
|
4541
|
-
return `⛔
|
|
4898
|
+
return `⛔ 您已被列入黑名单。`;
|
|
4542
4899
|
}
|
|
4543
4900
|
if (!user) return "请输入“pk @玩家”。";
|
|
4544
4901
|
const parsedUser = import_koishi.h.parse(user)[0];
|
|
@@ -4589,7 +4946,7 @@ ${items.join("、")}
|
|
|
4589
4946
|
const hasProtection = diffInDays < 30;
|
|
4590
4947
|
const isPKDisabled = targetPKRecord && !targetPKRecord.enable;
|
|
4591
4948
|
if ((isNewPlayer || isPKDisabled) && hasProtection) {
|
|
4592
|
-
return `🛡️
|
|
4949
|
+
return `🛡️ 该玩家是人类联盟成员,当前处于30天保护期内(剩余${30 - diffInDays}天),无法PK`;
|
|
4593
4950
|
}
|
|
4594
4951
|
}
|
|
4595
4952
|
let initiatorPK;
|
|
@@ -4783,23 +5140,23 @@ ${items.join("、")}
|
|
|
4783
5140
|
`🎰 金币变动:${stealPercentage}%`
|
|
4784
5141
|
];
|
|
4785
5142
|
if (targetCareer.group === "人类联盟" && isWin) {
|
|
4786
|
-
result.push(`🛡️
|
|
5143
|
+
result.push(`🛡️ 人类联盟:应战者PK失败时仅损失1%的金币`);
|
|
4787
5144
|
}
|
|
4788
5145
|
if (computerExpertProtection) {
|
|
4789
|
-
result.push(`💻
|
|
5146
|
+
result.push(`💻 计算机专家:应战者PK失败时不损失金币`);
|
|
4790
5147
|
} else if (isWin) {
|
|
4791
5148
|
result.push(`💰 您从对方的口袋里抢夺了${goldTransfer}枚金币`);
|
|
4792
5149
|
} else {
|
|
4793
5150
|
result.push(`💸 您从口袋里拿出了${goldTransfer}枚金币上交给对方`);
|
|
4794
5151
|
}
|
|
4795
5152
|
if (mp3Effect) {
|
|
4796
|
-
result.push(`💿 MP3
|
|
5153
|
+
result.push(`💿 MP3播放器:挑战者PK失败时上交的金币减少50%`);
|
|
4797
5154
|
}
|
|
4798
5155
|
if (initiatorCareer?.group === "辛迪加海盗") {
|
|
4799
|
-
result.push(`🔴
|
|
5156
|
+
result.push(`🔴 辛迪加海盗:+1枚红晶`);
|
|
4800
5157
|
}
|
|
4801
5158
|
if (isWin && initiatorCareer?.career === "辛迪加财务经理") {
|
|
4802
|
-
result.push(`💰
|
|
5159
|
+
result.push(`💰 辛迪加财务经理:+1枚红晶`);
|
|
4803
5160
|
}
|
|
4804
5161
|
result.push(`📅 剩余挑战次数:${config.dailyPKLimit - (initiatorPK.todayCount + 1)}`);
|
|
4805
5162
|
return result.join("\n");
|
|
@@ -4810,7 +5167,7 @@ ${items.join("、")}
|
|
|
4810
5167
|
});
|
|
4811
5168
|
ctx.command("ggcevo/pk榜 [page]", "查看玩家PK排行榜").usage("输入 pk榜 [页码] 查看对应页的排行榜,每页10条").action(async ({ session }, page) => {
|
|
4812
5169
|
const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
|
|
4813
|
-
if (!profile) return "🔒
|
|
5170
|
+
if (!profile) return "🔒 需要先绑定游戏句柄。";
|
|
4814
5171
|
const pageNum = parseInt(page) || 1;
|
|
4815
5172
|
if (pageNum < 1) return "请输入有效的页码。";
|
|
4816
5173
|
const offset = (pageNum - 1) * 10;
|
|
@@ -4860,14 +5217,14 @@ ${items.join("、")}
|
|
|
4860
5217
|
const careerDiscount = isCareerMatch ? CAREER_DISCOUNTS[techLevel - 1] : 0;
|
|
4861
5218
|
techDiscount = Math.max(baseDiscount, careerDiscount);
|
|
4862
5219
|
if (techDiscount > 0) {
|
|
4863
|
-
discountDetails.push(`⚙️ 武器系统 Lv${techLevel}:${techDiscount}
|
|
5220
|
+
discountDetails.push(`⚙️ 武器系统 Lv${techLevel}:${techDiscount}%折扣`);
|
|
4864
5221
|
}
|
|
4865
5222
|
}
|
|
4866
5223
|
}
|
|
4867
5224
|
let weaponSpecialistDiscount = 0;
|
|
4868
5225
|
if (careerData?.career === "武器中士") {
|
|
4869
5226
|
weaponSpecialistDiscount = 20;
|
|
4870
|
-
discountDetails.push(`🎖️ 武器中士:20
|
|
5227
|
+
discountDetails.push(`🎖️ 武器中士:20%折扣`);
|
|
4871
5228
|
}
|
|
4872
5229
|
const activeWish = await ctx.database.get("ggcevo_Wish_Record", {
|
|
4873
5230
|
handle,
|
|
@@ -4878,7 +5235,7 @@ ${items.join("、")}
|
|
|
4878
5235
|
}).then((records) => records[0]);
|
|
4879
5236
|
let grasshopperDiscount = activeWish ? 20 : 0;
|
|
4880
5237
|
if (grasshopperDiscount > 0) {
|
|
4881
|
-
discountDetails.push(`🦗 蚱蜢优购:${grasshopperDiscount}
|
|
5238
|
+
discountDetails.push(`🦗 蚱蜢优购:${grasshopperDiscount}%折扣`);
|
|
4882
5239
|
}
|
|
4883
5240
|
let totalDiscount = techDiscount + weaponSpecialistDiscount + grasshopperDiscount;
|
|
4884
5241
|
totalDiscount = Math.min(totalDiscount, 100);
|
|
@@ -4970,10 +5327,10 @@ ${validTypes.join("、")}`;
|
|
|
4970
5327
|
});
|
|
4971
5328
|
ctx.command("ggcevo/购买 <item>").action(async ({ session }, item) => {
|
|
4972
5329
|
const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
|
|
4973
|
-
if (!profile) return "🔒
|
|
5330
|
+
if (!profile) return "🔒 需要先绑定游戏句柄。";
|
|
4974
5331
|
const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
|
|
4975
5332
|
const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
|
|
4976
|
-
if (existingEntries.length > 0) return "⛔
|
|
5333
|
+
if (existingEntries.length > 0) return "⛔ 您已被列入黑名单。";
|
|
4977
5334
|
const allItems = { ...weaponConfig, ...SyndicatedItems };
|
|
4978
5335
|
if (!item) return "请输入“购买 物品名称”来购买所需物品。";
|
|
4979
5336
|
const config2 = allItems[item];
|
|
@@ -5032,7 +5389,7 @@ ${validTypes.join("、")}`;
|
|
|
5032
5389
|
if ((signInfo?.totalRewards || 0) < actualPrice) {
|
|
5033
5390
|
let priceInfo = `需要 ${actualPrice} 金币`;
|
|
5034
5391
|
if (discountDetails.length > 0) {
|
|
5035
|
-
priceInfo += `(
|
|
5392
|
+
priceInfo += `(原价${config2.price})`;
|
|
5036
5393
|
}
|
|
5037
5394
|
return `❌ 金币不足,${priceInfo}`;
|
|
5038
5395
|
}
|
|
@@ -5079,7 +5436,7 @@ ${validTypes.join("、")}`;
|
|
|
5079
5436
|
`;
|
|
5080
5437
|
message += `花费 ${actualPrice} 金币`;
|
|
5081
5438
|
if (discountDetails.length > 0) {
|
|
5082
|
-
message += `(
|
|
5439
|
+
message += `(原价${config2.price} 金币)
|
|
5083
5440
|
折扣明细:
|
|
5084
5441
|
▸ ${discountDetails.join("\n▸ ")}`;
|
|
5085
5442
|
}
|
|
@@ -5097,7 +5454,7 @@ ${validTypes.join("、")}`;
|
|
|
5097
5454
|
});
|
|
5098
5455
|
ctx.command("ggcevo/武器仓库").action(async ({ session }) => {
|
|
5099
5456
|
const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
|
|
5100
|
-
if (!profile) return "🔒
|
|
5457
|
+
if (!profile) return "🔒 需要先绑定游戏句柄。";
|
|
5101
5458
|
const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
|
|
5102
5459
|
const weapons = await ctx.database.get("ggcevo_equipment", {
|
|
5103
5460
|
handle
|
|
@@ -5129,11 +5486,11 @@ ${validTypes.join("、")}`;
|
|
|
5129
5486
|
});
|
|
5130
5487
|
ctx.command("ggcevo/装备 <weapon>").action(async ({ session }, weapon) => {
|
|
5131
5488
|
const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
|
|
5132
|
-
if (!profile) return "🔒
|
|
5489
|
+
if (!profile) return "🔒 需要先绑定游戏句柄。";
|
|
5133
5490
|
const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
|
|
5134
5491
|
const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
|
|
5135
5492
|
if (existingEntries.length > 0) {
|
|
5136
|
-
return `⛔
|
|
5493
|
+
return `⛔ 您已被列入黑名单。`;
|
|
5137
5494
|
}
|
|
5138
5495
|
if (!weapon) return "请输入“装备 武器名称”来装备一把你拥有的武器。";
|
|
5139
5496
|
if (!weaponConfig[weapon]) return "武器名称错误,请输入“装备 武器名称”来装备一把你拥有的武器。";
|
|
@@ -5163,10 +5520,10 @@ ${validTypes.join("、")}`;
|
|
|
5163
5520
|
});
|
|
5164
5521
|
ctx.command("ggcevo/升级 <target>", "升级武器或科技").action(async ({ session }, target) => {
|
|
5165
5522
|
const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
|
|
5166
|
-
if (!profile) return "🔒
|
|
5523
|
+
if (!profile) return "🔒 需要先绑定游戏句柄。";
|
|
5167
5524
|
const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
|
|
5168
5525
|
if ((await ctx.database.get("ggcevo_blacklist", { handle })).length) {
|
|
5169
|
-
return "⛔
|
|
5526
|
+
return "⛔ 您已被列入黑名单。";
|
|
5170
5527
|
}
|
|
5171
5528
|
if (!target) {
|
|
5172
5529
|
return generateUpgradePriceList(handle);
|
|
@@ -5184,10 +5541,10 @@ ${validTypes.join("、")}`;
|
|
|
5184
5541
|
});
|
|
5185
5542
|
ctx.command("ggcevo/改装 <weapon> [mod]", "安装武器模块").action(async ({ session }, weapon, mod) => {
|
|
5186
5543
|
const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
|
|
5187
|
-
if (!profile) return "🔒
|
|
5544
|
+
if (!profile) return "🔒 需要先绑定游戏句柄。";
|
|
5188
5545
|
const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
|
|
5189
5546
|
const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
|
|
5190
|
-
if (existingEntries.length > 0) return "⛔
|
|
5547
|
+
if (existingEntries.length > 0) return "⛔ 您已被列入黑名单。";
|
|
5191
5548
|
const isValidWeapon = weapon && weaponConfig[weapon]?.id !== void 0;
|
|
5192
5549
|
const processModInstallation = /* @__PURE__ */ __name(async () => {
|
|
5193
5550
|
const modInfo = modConfig[mod];
|
|
@@ -5311,10 +5668,10 @@ ${validTypes.join("、")}`;
|
|
|
5311
5668
|
});
|
|
5312
5669
|
ctx.command("ggcevo/拆卸 <weapon> <mod>", "卸载武器模块,专属模块返还50%金币,通用模块返还80%金币").action(async ({ session }, weapon, mod) => {
|
|
5313
5670
|
const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
|
|
5314
|
-
if (!profile) return "🔒
|
|
5671
|
+
if (!profile) return "🔒 需要先绑定游戏句柄。";
|
|
5315
5672
|
const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
|
|
5316
5673
|
const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
|
|
5317
|
-
if (existingEntries.length > 0) return "⛔
|
|
5674
|
+
if (existingEntries.length > 0) return "⛔ 您已被列入黑名单。";
|
|
5318
5675
|
const weaponId = weaponConfig[weapon]?.id;
|
|
5319
5676
|
if (!weaponId) return "❌ 请输入“拆卸 武器名称 模块名称”\n注意:专属模块返还50%金币,通用模块返还80%金币";
|
|
5320
5677
|
const modInfo = modConfig[mod];
|
|
@@ -5356,10 +5713,10 @@ ${validTypes.join("、")}`;
|
|
|
5356
5713
|
let scatterBroadcast = null;
|
|
5357
5714
|
let cleanerRewardBroadcast = null;
|
|
5358
5715
|
const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
|
|
5359
|
-
if (!profile) return "🔒
|
|
5716
|
+
if (!profile) return "🔒 需要先绑定游戏句柄。";
|
|
5360
5717
|
const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
|
|
5361
5718
|
const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
|
|
5362
|
-
if (existingEntries.length > 0) return "⛔
|
|
5719
|
+
if (existingEntries.length > 0) return "⛔ 您已被列入黑名单。";
|
|
5363
5720
|
const getActiveBossNames = /* @__PURE__ */ __name(async () => {
|
|
5364
5721
|
const activeBosses2 = await ctx.database.get("ggcevo_boss", { isActive: true });
|
|
5365
5722
|
return activeBosses2.map((b) => b.name).join(",");
|
|
@@ -5438,6 +5795,7 @@ ${validTypes.join("、")}`;
|
|
|
5438
5795
|
let passiveMessages = [];
|
|
5439
5796
|
let radiationApplied = false;
|
|
5440
5797
|
let freezing = false;
|
|
5798
|
+
let bileStacks = 0;
|
|
5441
5799
|
const passiveResult = await PassiveHandler.handlePassives(
|
|
5442
5800
|
ctx,
|
|
5443
5801
|
targetBoss,
|
|
@@ -5452,8 +5810,9 @@ ${validTypes.join("、")}`;
|
|
|
5452
5810
|
currentHP = passiveResult.currentHP;
|
|
5453
5811
|
initialDamage = passiveResult.initialDamage;
|
|
5454
5812
|
passiveMessages.push(...passiveResult.messages);
|
|
5455
|
-
radiationApplied = passiveResult
|
|
5456
|
-
freezing = passiveResult
|
|
5813
|
+
radiationApplied = passiveResult?.radiationApplied || false;
|
|
5814
|
+
freezing = passiveResult?.freezing || false;
|
|
5815
|
+
bileStacks = passiveResult?.bileStacks || 0;
|
|
5457
5816
|
if (passiveResult.skillUpdates.length > 0) {
|
|
5458
5817
|
await PassiveHandler.applySkillUpdates(ctx, passiveResult.skillUpdates);
|
|
5459
5818
|
}
|
|
@@ -5494,6 +5853,17 @@ ${validTypes.join("、")}`;
|
|
|
5494
5853
|
progress: (freezingRecord?.progress || 0) + 1
|
|
5495
5854
|
}], ["handle"]);
|
|
5496
5855
|
}
|
|
5856
|
+
if (bileStacks >= 10) {
|
|
5857
|
+
const [bileStacksRecord] = await ctx.database.get("ggcevo_task", {
|
|
5858
|
+
handle,
|
|
5859
|
+
taskId: 3
|
|
5860
|
+
});
|
|
5861
|
+
await ctx.database.upsert("ggcevo_task", [{
|
|
5862
|
+
handle,
|
|
5863
|
+
taskId: 3,
|
|
5864
|
+
progress: (bileStacksRecord?.progress || 0) + 1
|
|
5865
|
+
}], ["handle"]);
|
|
5866
|
+
}
|
|
5497
5867
|
if (isDefeated) {
|
|
5498
5868
|
if (targetBoss.type === "主宰") {
|
|
5499
5869
|
await ctx.database.set(
|
|
@@ -5522,12 +5892,14 @@ ${validTypes.join("、")}`;
|
|
|
5522
5892
|
"🏆 伤害排行榜奖励:",
|
|
5523
5893
|
...rewardMessages
|
|
5524
5894
|
];
|
|
5525
|
-
|
|
5526
|
-
|
|
5527
|
-
|
|
5528
|
-
|
|
5529
|
-
|
|
5530
|
-
|
|
5895
|
+
if (!(equippedWeapon.installedMods?.includes("光束曲射晶片") && weaponName === "碎骨步枪") && !(weaponName === "中子步枪")) {
|
|
5896
|
+
cleanerRewardBroadcast = await getCleanerRewardBroadcast(
|
|
5897
|
+
ctx,
|
|
5898
|
+
targetBoss,
|
|
5899
|
+
handle,
|
|
5900
|
+
session.username
|
|
5901
|
+
);
|
|
5902
|
+
}
|
|
5531
5903
|
} else {
|
|
5532
5904
|
await ctx.database.set(
|
|
5533
5905
|
"ggcevo_boss",
|
|
@@ -5573,12 +5945,14 @@ ${validTypes.join("、")}`;
|
|
|
5573
5945
|
}
|
|
5574
5946
|
}
|
|
5575
5947
|
bossEventBroadcast = broadcastMessages2;
|
|
5576
|
-
|
|
5577
|
-
|
|
5578
|
-
|
|
5579
|
-
|
|
5580
|
-
|
|
5581
|
-
|
|
5948
|
+
if (!(equippedWeapon.installedMods?.includes("光束曲射晶片") && weaponName === "碎骨步枪") && !(weaponName === "中子步枪")) {
|
|
5949
|
+
cleanerRewardBroadcast = await getCleanerRewardBroadcast(
|
|
5950
|
+
ctx,
|
|
5951
|
+
targetBoss,
|
|
5952
|
+
handle,
|
|
5953
|
+
session.username
|
|
5954
|
+
);
|
|
5955
|
+
}
|
|
5582
5956
|
}
|
|
5583
5957
|
} else {
|
|
5584
5958
|
await ctx.database.set(
|
|
@@ -5666,17 +6040,19 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
|
|
|
5666
6040
|
isDefeated ? `🎉 恭喜,已成功击败 ${targetBoss.name}!` : ""
|
|
5667
6041
|
].filter((line) => line).join("\n");
|
|
5668
6042
|
await session.send(resultMessage);
|
|
6043
|
+
const isScatterAttack = equippedWeapon.installedMods?.includes("光束曲射晶片") && weaponName === "碎骨步枪" || weaponName === "中子步枪";
|
|
5669
6044
|
const broadcastMessages = [];
|
|
5670
6045
|
const groupId = [...config2.groupId];
|
|
5671
6046
|
if (scatterBroadcast) {
|
|
5672
6047
|
const scatterMsg = Array.isArray(scatterBroadcast) ? scatterBroadcast.join("\n") : scatterBroadcast;
|
|
5673
|
-
broadcastMessages.push(
|
|
6048
|
+
broadcastMessages.push(`✨ 散射攻击结果
|
|
6049
|
+
${scatterMsg}`);
|
|
5674
6050
|
}
|
|
5675
6051
|
if (bossEventBroadcast) {
|
|
5676
6052
|
const bossMsg = Array.isArray(bossEventBroadcast) ? bossEventBroadcast.join("\n") : bossEventBroadcast;
|
|
5677
6053
|
broadcastMessages.push(bossMsg);
|
|
5678
6054
|
}
|
|
5679
|
-
if (cleanerRewardBroadcast && cleanerRewardBroadcast.length > 0) {
|
|
6055
|
+
if (!isScatterAttack && cleanerRewardBroadcast && cleanerRewardBroadcast.length > 0) {
|
|
5680
6056
|
broadcastMessages.push(cleanerRewardBroadcast.join("\n"));
|
|
5681
6057
|
}
|
|
5682
6058
|
if (broadcastMessages.length > 0) {
|
|
@@ -5689,10 +6065,10 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
|
|
|
5689
6065
|
const parseList = /* @__PURE__ */ __name((str) => str ? str.split(",").map((s) => s.trim()).filter(Boolean) : [], "parseList");
|
|
5690
6066
|
const tags = parseList(options.tags);
|
|
5691
6067
|
const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
|
|
5692
|
-
if (!profile) return "🔒
|
|
6068
|
+
if (!profile) return "🔒 需要先绑定游戏句柄。";
|
|
5693
6069
|
const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
|
|
5694
6070
|
const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
|
|
5695
|
-
if (existingEntries.length > 0) return "⛔
|
|
6071
|
+
if (existingEntries.length > 0) return "⛔ 您已被列入黑名单。";
|
|
5696
6072
|
const [equippedWeapon] = await ctx.database.get("ggcevo_equipment", {
|
|
5697
6073
|
handle,
|
|
5698
6074
|
equipped: true
|
|
@@ -5772,7 +6148,7 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
|
|
|
5772
6148
|
const mainBossHpBar = createHpBar(mainBoss.HP, bossGroup.main.maxHP);
|
|
5773
6149
|
const result = [
|
|
5774
6150
|
`🔴 主宰:${mainBoss.name}`,
|
|
5775
|
-
|
|
6151
|
+
`${mainBossHpBar} (${mainBoss.HP}/${bossGroup.main.maxHP})`
|
|
5776
6152
|
];
|
|
5777
6153
|
if (bossGroup.main.energy > 0) {
|
|
5778
6154
|
result.push(`⚡ 能量:${mainBoss.energy}/1000`);
|
|
@@ -5790,7 +6166,7 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
|
|
|
5790
6166
|
} else {
|
|
5791
6167
|
result.push("➤ 无");
|
|
5792
6168
|
}
|
|
5793
|
-
const countingSkill = mainBoss.skills?.find((s) => ["冷适应", "岗哨机枪", "吸血唾液"].includes(s));
|
|
6169
|
+
const countingSkill = mainBoss.skills?.find((s) => ["冷适应", "岗哨机枪", "吸血唾液", "灼烧粘液"].includes(s));
|
|
5794
6170
|
if (countingSkill) {
|
|
5795
6171
|
result.push(`📈 ${countingSkill}:${mainBoss.Skillcountpoints}层`);
|
|
5796
6172
|
}
|
|
@@ -5801,8 +6177,8 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
|
|
|
5801
6177
|
const minionConfig = bossGroup.minions.find((m) => m.name === minion.name);
|
|
5802
6178
|
const minionHpBar = createHpBar(minion.HP, minionConfig?.maxHP || 1e3);
|
|
5803
6179
|
const minionInfo = [
|
|
5804
|
-
|
|
5805
|
-
|
|
6180
|
+
`❤️ ${minion.name}`,
|
|
6181
|
+
`${minionHpBar} (${minion.HP}/${minionConfig?.maxHP || "未知"})`
|
|
5806
6182
|
];
|
|
5807
6183
|
if (minionConfig && minionConfig.energy > 0) {
|
|
5808
6184
|
minionInfo.push(`⚡ 能量:${minion.energy}/1000`);
|
|
@@ -5866,11 +6242,11 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
|
|
|
5866
6242
|
ctx.command("ggcevo/祈愿").action(async (argv) => {
|
|
5867
6243
|
const session = argv.session;
|
|
5868
6244
|
const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
|
|
5869
|
-
if (!profile) return "🔒
|
|
6245
|
+
if (!profile) return "🔒 需要先绑定游戏句柄。";
|
|
5870
6246
|
const { regionId, realmId, profileId } = profile;
|
|
5871
6247
|
const handle = `${regionId}-S2-${realmId}-${profileId}`;
|
|
5872
6248
|
const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
|
|
5873
|
-
if (existingEntries.length > 0) return "⛔
|
|
6249
|
+
if (existingEntries.length > 0) return "⛔ 您已被列入黑名单。";
|
|
5874
6250
|
const [sign] = await ctx.database.get("ggcevo_sign", { handle });
|
|
5875
6251
|
if (!sign || sign.totalRewards < 50) return "需要50金币进行祈愿,您的金币不足。";
|
|
5876
6252
|
const now = /* @__PURE__ */ new Date();
|
|
@@ -5943,12 +6319,12 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
|
|
|
5943
6319
|
});
|
|
5944
6320
|
ctx.command("ggcevo/兑换金币", "使用兑换券兑换金币").action(async ({ session }) => {
|
|
5945
6321
|
const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
|
|
5946
|
-
if (!profile) return "🔒
|
|
6322
|
+
if (!profile) return "🔒 需要先绑定游戏句柄。";
|
|
5947
6323
|
const { regionId, realmId, profileId } = profile;
|
|
5948
6324
|
const handle = `${regionId}-S2-${realmId}-${profileId}`;
|
|
5949
6325
|
const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
|
|
5950
6326
|
if (existingEntries.length > 0) {
|
|
5951
|
-
return `⛔
|
|
6327
|
+
return `⛔ 您已被列入黑名单。`;
|
|
5952
6328
|
}
|
|
5953
6329
|
await session.send(`请输入你要使用多少张兑换券来兑换金币?(请在30秒内回复数字,回复“0”为取消兑换)
|
|
5954
6330
|
注意:1张兑换券=2000金币`);
|
|
@@ -5982,11 +6358,11 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
|
|
|
5982
6358
|
});
|
|
5983
6359
|
ctx.command("ggcevo/兑换红晶", "使用金币兑换红晶").action(async ({ session }) => {
|
|
5984
6360
|
const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
|
|
5985
|
-
if (!profile) return "🔒
|
|
6361
|
+
if (!profile) return "🔒 需要先绑定游戏句柄。";
|
|
5986
6362
|
const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
|
|
5987
6363
|
const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
|
|
5988
6364
|
if (existingEntries.length > 0) {
|
|
5989
|
-
return `⛔
|
|
6365
|
+
return `⛔ 您已被列入黑名单。`;
|
|
5990
6366
|
}
|
|
5991
6367
|
const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
|
|
5992
6368
|
if (!careerData || careerData.group !== "辛迪加海盗") {
|
|
@@ -6022,12 +6398,12 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
|
|
|
6022
6398
|
});
|
|
6023
6399
|
ctx.command("ggcevo/加入 <faction>", "加入阵营").alias("加入阵营").action(async ({ session }, faction) => {
|
|
6024
6400
|
const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
|
|
6025
|
-
if (!profile) return "🔒
|
|
6401
|
+
if (!profile) return "🔒 需要先绑定游戏句柄。";
|
|
6026
6402
|
const { regionId, realmId, profileId } = profile;
|
|
6027
6403
|
const handle = `${regionId}-S2-${realmId}-${profileId}`;
|
|
6028
6404
|
const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
|
|
6029
6405
|
if (existingEntries.length > 0) {
|
|
6030
|
-
return `⛔
|
|
6406
|
+
return `⛔ 您已被列入黑名单。`;
|
|
6031
6407
|
}
|
|
6032
6408
|
const validFactions = ["人类联盟", "辛迪加海盗"];
|
|
6033
6409
|
if (!faction) return `请输入“加入 阵营名称”加入对应阵营
|
|
@@ -6088,11 +6464,11 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
|
|
|
6088
6464
|
});
|
|
6089
6465
|
ctx.command("ggcevo/转职 [profession]", "转职系统").action(async ({ session }, profession) => {
|
|
6090
6466
|
const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
|
|
6091
|
-
if (!profile) return "🔒
|
|
6467
|
+
if (!profile) return "🔒 需要先绑定游戏句柄。";
|
|
6092
6468
|
const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
|
|
6093
6469
|
const existingEntries = await ctx.database.get("ggcevo_blacklist", { handle });
|
|
6094
6470
|
if (existingEntries.length > 0) {
|
|
6095
|
-
return `⛔
|
|
6471
|
+
return `⛔ 您已被列入黑名单。`;
|
|
6096
6472
|
}
|
|
6097
6473
|
const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
|
|
6098
6474
|
if (!careerData) return "请先加入阵营后使用转职功能。";
|
|
@@ -6172,7 +6548,7 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
|
|
|
6172
6548
|
const [profile] = await ctx.database.get("sc2arcade_player", {
|
|
6173
6549
|
userId: session.userId
|
|
6174
6550
|
});
|
|
6175
|
-
if (!profile) return "🔒
|
|
6551
|
+
if (!profile) return "🔒 需要先绑定游戏句柄。";
|
|
6176
6552
|
const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
|
|
6177
6553
|
const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
|
|
6178
6554
|
if (!careerData) return "您尚未加入任何阵营。";
|
|
@@ -6215,7 +6591,7 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
|
|
|
6215
6591
|
});
|
|
6216
6592
|
ctx.command("ggcevo/黑市 [type]", "辛迪加海盗专属黑市").usage("输入“黑市”查看类型,或“黑市 类型”查看详细").action(async ({ session }, type) => {
|
|
6217
6593
|
const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
|
|
6218
|
-
if (!profile) return "🔒
|
|
6594
|
+
if (!profile) return "🔒 需要先绑定游戏句柄。";
|
|
6219
6595
|
const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
|
|
6220
6596
|
const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
|
|
6221
6597
|
if (!careerData || careerData.group !== "辛迪加海盗") {
|
|
@@ -6231,13 +6607,16 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
|
|
|
6231
6607
|
});
|
|
6232
6608
|
if (!type) {
|
|
6233
6609
|
return [
|
|
6234
|
-
"
|
|
6610
|
+
"🏴 辛迪加黑市 🏴",
|
|
6235
6611
|
'使用 "黑市 类型名称" 查看详细信息',
|
|
6612
|
+
// 添加计算机专家提示 - 优化为带emoji的分行显示
|
|
6613
|
+
isComputerExpert ? [
|
|
6614
|
+
"💰 当前折扣:",
|
|
6615
|
+
"💻 计算机专家:设备工具类物品50%折扣"
|
|
6616
|
+
].join("\n") : "",
|
|
6236
6617
|
"====================",
|
|
6237
6618
|
...Object.entries(typeStats).map(([typeName, count]) => `▸ ${typeName} (${count}种)`),
|
|
6238
|
-
"===================="
|
|
6239
|
-
// 添加计算机专家提示
|
|
6240
|
-
isComputerExpert ? "💳 计算机专家可享受设备工具类物品50%折扣!" : ""
|
|
6619
|
+
"===================="
|
|
6241
6620
|
].join("\n");
|
|
6242
6621
|
}
|
|
6243
6622
|
const normalizedType = Object.keys(typeStats).find((t) => t === type);
|
|
@@ -6260,7 +6639,7 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
|
|
|
6260
6639
|
}
|
|
6261
6640
|
infoBlocks.push(
|
|
6262
6641
|
`描述:${config2.description}`,
|
|
6263
|
-
"
|
|
6642
|
+
"------------------"
|
|
6264
6643
|
);
|
|
6265
6644
|
return infoBlocks.join("\n");
|
|
6266
6645
|
}),
|
|
@@ -6284,26 +6663,33 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
|
|
|
6284
6663
|
infoBlocks.push(
|
|
6285
6664
|
`特殊效果:${item.effects}`,
|
|
6286
6665
|
`描述:${item.description}`,
|
|
6287
|
-
"
|
|
6666
|
+
"------------------"
|
|
6288
6667
|
);
|
|
6289
6668
|
return infoBlocks.join("\n");
|
|
6290
6669
|
})
|
|
6291
6670
|
];
|
|
6671
|
+
let discountInfo = [];
|
|
6672
|
+
if (isComputerExpert && normalizedType === "设备工具") {
|
|
6673
|
+
discountInfo = [
|
|
6674
|
+
"💰 当前折扣:",
|
|
6675
|
+
"💻 计算机专家:设备工具类物品50%折扣"
|
|
6676
|
+
];
|
|
6677
|
+
}
|
|
6292
6678
|
return [
|
|
6293
6679
|
`🏴☠️ 辛迪加黑市 - ${normalizedType} 🏴☠️`,
|
|
6294
|
-
"
|
|
6295
|
-
//
|
|
6296
|
-
|
|
6680
|
+
'使用"订购 物品名称"进行购买(仅消耗红晶)',
|
|
6681
|
+
// 显示折扣信息(如果有)
|
|
6682
|
+
...discountInfo,
|
|
6297
6683
|
"====================",
|
|
6298
6684
|
...items
|
|
6299
|
-
].filter(Boolean).join("\n
|
|
6685
|
+
].filter(Boolean).join("\n");
|
|
6300
6686
|
});
|
|
6301
6687
|
ctx.command("ggcevo/订购 <item>").action(async ({ session }, item) => {
|
|
6302
6688
|
const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
|
|
6303
|
-
if (!profile) return "🔒
|
|
6689
|
+
if (!profile) return "🔒 需要先绑定游戏句柄。";
|
|
6304
6690
|
const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
|
|
6305
6691
|
if (await ctx.database.get("ggcevo_blacklist", { handle }).then((r) => r.length)) {
|
|
6306
|
-
return "⛔
|
|
6692
|
+
return "⛔ 您已被列入黑名单。";
|
|
6307
6693
|
}
|
|
6308
6694
|
const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
|
|
6309
6695
|
if (!careerData || careerData.group !== "辛迪加海盗") {
|
|
@@ -6368,44 +6754,50 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
|
|
|
6368
6754
|
}], ["handle", "itemId"]);
|
|
6369
6755
|
}
|
|
6370
6756
|
});
|
|
6371
|
-
|
|
6372
|
-
|
|
6373
|
-
|
|
6374
|
-
|
|
6375
|
-
}
|
|
6376
|
-
if (isWeapon) {
|
|
6377
|
-
const equippedStatus = await ctx.database.get("ggcevo_equipment", {
|
|
6378
|
-
handle,
|
|
6379
|
-
weaponId: itemConfig2.id
|
|
6380
|
-
}).then((r) => r[0]?.equipped ? "已自动装备武器" : "需手动装备武器");
|
|
6381
|
-
return [
|
|
6382
|
-
`✅ 成功订购【${item}】!`,
|
|
6383
|
-
`消耗红晶:${finalCost}${discountInfo}`,
|
|
6384
|
-
`装备状态:${equippedStatus}`,
|
|
6385
|
-
'输入 "武器仓库" 管理武器'
|
|
6386
|
-
].join("\n");
|
|
6387
|
-
} else {
|
|
6388
|
-
const currentStock = await ctx.database.get("ggcevo_warehouse", {
|
|
6389
|
-
handle,
|
|
6390
|
-
itemId: itemConfig2.id
|
|
6391
|
-
}).then((r) => r[0]?.quantity || 1);
|
|
6392
|
-
let priceInfo = `消耗红晶:${finalCost}`;
|
|
6393
|
-
if (isComputerExpertDiscount) {
|
|
6394
|
-
priceInfo += `(原价${originalPrice})`;
|
|
6757
|
+
const buildResponse = /* @__PURE__ */ __name(async () => {
|
|
6758
|
+
const discountLines = [];
|
|
6759
|
+
if (discountApplied) {
|
|
6760
|
+
discountLines.push("💻 计算机专家:设备工具类物品50%折扣");
|
|
6395
6761
|
}
|
|
6396
|
-
priceInfo
|
|
6397
|
-
|
|
6398
|
-
|
|
6399
|
-
|
|
6400
|
-
|
|
6401
|
-
|
|
6402
|
-
|
|
6403
|
-
|
|
6762
|
+
const priceInfo = [
|
|
6763
|
+
`消耗红晶:${finalCost}${discountApplied ? ` (原价${originalPrice})` : ""}`
|
|
6764
|
+
];
|
|
6765
|
+
if (discountApplied) {
|
|
6766
|
+
priceInfo.push("折扣明细:");
|
|
6767
|
+
priceInfo.push(...discountLines);
|
|
6768
|
+
}
|
|
6769
|
+
if (isWeapon) {
|
|
6770
|
+
const equippedStatus = await ctx.database.get("ggcevo_equipment", {
|
|
6771
|
+
handle,
|
|
6772
|
+
weaponId: itemConfig2.id
|
|
6773
|
+
}).then((r) => r[0]?.equipped ? "已自动装备武器" : "需手动装备武器");
|
|
6774
|
+
return [
|
|
6775
|
+
`✅ 成功订购【${item}】!`,
|
|
6776
|
+
...priceInfo,
|
|
6777
|
+
// 价格和折扣信息显示在一起
|
|
6778
|
+
`装备状态:${equippedStatus}`,
|
|
6779
|
+
'输入 "武器仓库" 管理武器'
|
|
6780
|
+
].filter(Boolean).join("\n");
|
|
6781
|
+
} else {
|
|
6782
|
+
const currentStock = await ctx.database.get("ggcevo_warehouse", {
|
|
6783
|
+
handle,
|
|
6784
|
+
itemId: itemConfig2.id
|
|
6785
|
+
}).then((r) => r[0]?.quantity || 1);
|
|
6786
|
+
return [
|
|
6787
|
+
`✅ 成功订购【${item}】x1!`,
|
|
6788
|
+
...priceInfo,
|
|
6789
|
+
// 价格和折扣信息显示在一起
|
|
6790
|
+
`当前库存:${currentStock}件`,
|
|
6791
|
+
'输入 "仓库" 查看所有物品'
|
|
6792
|
+
].filter(Boolean).join("\n");
|
|
6793
|
+
}
|
|
6794
|
+
}, "buildResponse");
|
|
6795
|
+
return await buildResponse();
|
|
6404
6796
|
});
|
|
6405
6797
|
ctx.command("ggcevo/仓库").action(async (argv) => {
|
|
6406
6798
|
const session = argv.session;
|
|
6407
6799
|
const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
|
|
6408
|
-
if (!profile) return "🔒
|
|
6800
|
+
if (!profile) return "🔒 需要先绑定游戏句柄。";
|
|
6409
6801
|
const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
|
|
6410
6802
|
const [items, signData, careerData] = await Promise.all([
|
|
6411
6803
|
ctx.database.get("ggcevo_warehouse", { handle }),
|
|
@@ -6449,10 +6841,10 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
|
|
|
6449
6841
|
ctx.command("ggcevo/使用 [itemName] [target]").action(async (argv, itemName, target) => {
|
|
6450
6842
|
const session = argv.session;
|
|
6451
6843
|
const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
|
|
6452
|
-
if (!profile) return "🔒
|
|
6844
|
+
if (!profile) return "🔒 需要先绑定游戏句柄。";
|
|
6453
6845
|
const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
|
|
6454
6846
|
if (await ctx.database.get("ggcevo_blacklist", { handle }).then((r) => r.length)) {
|
|
6455
|
-
return "⛔
|
|
6847
|
+
return "⛔ 您已被列入黑名单。";
|
|
6456
6848
|
}
|
|
6457
6849
|
try {
|
|
6458
6850
|
if (!itemName) return "请输入“使用 物品名称 (可选目标)”使用仓库中的物品。";
|
|
@@ -6479,9 +6871,8 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
|
|
|
6479
6871
|
);
|
|
6480
6872
|
return [
|
|
6481
6873
|
`✅ 成功使用 ${itemNameConfirmed}`,
|
|
6482
|
-
|
|
6483
|
-
|
|
6484
|
-
"─".repeat(14)
|
|
6874
|
+
`剩余数量:${newQuantity}`,
|
|
6875
|
+
`效果触发:${effectResult.message}`
|
|
6485
6876
|
].join("\n");
|
|
6486
6877
|
} catch (error) {
|
|
6487
6878
|
ctx.logger("GGCEVO").error(error);
|
|
@@ -6490,7 +6881,7 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
|
|
|
6490
6881
|
});
|
|
6491
6882
|
ctx.command("ggcevo/科技 [techName]", "查看空间站科技信息").usage("输入“科技”查看列表,或“科技 科技名称”查看详细信息").action(async ({ session }, techName) => {
|
|
6492
6883
|
const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
|
|
6493
|
-
if (!profile) return "🔒
|
|
6884
|
+
if (!profile) return "🔒 需要先绑定游戏句柄。";
|
|
6494
6885
|
const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
|
|
6495
6886
|
const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
|
|
6496
6887
|
if (!careerData || careerData.group !== "人类联盟") {
|
|
@@ -6505,11 +6896,13 @@ ${scatterEffectMessages.map((m) => `▸ ${m}`).join("\n")}`
|
|
|
6505
6896
|
return [
|
|
6506
6897
|
"🛰️ 空间站科技系统 🛰️",
|
|
6507
6898
|
'使用 "科技 科技名称" 查看详细信息',
|
|
6899
|
+
isIntelligenceOfficer ? [
|
|
6900
|
+
"💰 当前折扣:",
|
|
6901
|
+
"🎖️ 情报副官:20%"
|
|
6902
|
+
].join("\n") : "",
|
|
6508
6903
|
"====================",
|
|
6509
6904
|
...techList,
|
|
6510
|
-
"===================="
|
|
6511
|
-
isIntelligenceOfficer && "※ 情报副官享受20%升级折扣"
|
|
6512
|
-
// 新增折扣提示
|
|
6905
|
+
"===================="
|
|
6513
6906
|
].filter(Boolean).join("\n");
|
|
6514
6907
|
}
|
|
6515
6908
|
const tech = Spacestationtechnology.find(
|
|
@@ -6530,22 +6923,29 @@ ${Spacestationtechnology.map((t) => t.techname).join("、")}`;
|
|
|
6530
6923
|
"------------------"
|
|
6531
6924
|
].join("\n");
|
|
6532
6925
|
});
|
|
6926
|
+
let discountInfo = [];
|
|
6927
|
+
if (isIntelligenceOfficer) {
|
|
6928
|
+
discountInfo = [
|
|
6929
|
+
"💰 当前折扣:",
|
|
6930
|
+
"🎖️ 情报副官:20%"
|
|
6931
|
+
];
|
|
6932
|
+
}
|
|
6533
6933
|
return [
|
|
6534
6934
|
`🛠️ ${tech.techname} 科技详情 🛠️`,
|
|
6535
6935
|
`最大可升级等级:${romanNumerals[tech.maxLevel]}`,
|
|
6536
6936
|
'使用 "升级 科技名称" 进行升级',
|
|
6937
|
+
...discountInfo,
|
|
6938
|
+
// 插入折扣信息
|
|
6537
6939
|
"====================",
|
|
6538
|
-
...techDetails
|
|
6539
|
-
isIntelligenceOfficer && "※ 情报副官享受20%升级折扣"
|
|
6540
|
-
// 新增折扣提示
|
|
6940
|
+
...techDetails
|
|
6541
6941
|
].filter(Boolean).join("\n");
|
|
6542
6942
|
});
|
|
6543
6943
|
ctx.command("ggcevo/挖矿").action(async ({ session }) => {
|
|
6544
6944
|
const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
|
|
6545
|
-
if (!profile) return "🔒
|
|
6945
|
+
if (!profile) return "🔒 需要先绑定游戏句柄。";
|
|
6546
6946
|
const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
|
|
6547
6947
|
if (await ctx.database.get("ggcevo_blacklist", { handle }).then((r) => r.length)) {
|
|
6548
|
-
return "⛔
|
|
6948
|
+
return "⛔ 您已被列入黑名单。";
|
|
6549
6949
|
}
|
|
6550
6950
|
const [career] = await ctx.database.get("ggcevo_careers", { handle });
|
|
6551
6951
|
if (!career || career.group !== "人类联盟") {
|
|
@@ -6652,16 +7052,16 @@ ${Spacestationtechnology.map((t) => t.techname).join("、")}`;
|
|
|
6652
7052
|
`类型: ${task2.type}`,
|
|
6653
7053
|
`目标: ${task2.target}次`,
|
|
6654
7054
|
`奖励: ${task2.price}金币`,
|
|
6655
|
-
`进度: ${completionStatus}
|
|
7055
|
+
`进度: ${completionStatus}`,
|
|
7056
|
+
"------------------"
|
|
6656
7057
|
].join("\n"));
|
|
6657
7058
|
}
|
|
6658
7059
|
return [
|
|
6659
7060
|
"📋 任务列表",
|
|
6660
7061
|
'使用"任务 任务名称"查看详细任务信息',
|
|
6661
7062
|
"====================",
|
|
6662
|
-
...taskList
|
|
6663
|
-
|
|
6664
|
-
].join("\n\n");
|
|
7063
|
+
...taskList
|
|
7064
|
+
].join("\n");
|
|
6665
7065
|
}
|
|
6666
7066
|
const task = Object.entries(Tasklist).find(
|
|
6667
7067
|
([taskName]) => taskName === name2
|
|
@@ -6682,10 +7082,10 @@ ${Spacestationtechnology.map((t) => t.techname).join("、")}`;
|
|
|
6682
7082
|
`任务奖励: ${task.price}金币`,
|
|
6683
7083
|
`当前进度: ${progress}/${task.target}`,
|
|
6684
7084
|
`累计完成: ${completions}次`,
|
|
6685
|
-
"
|
|
7085
|
+
"------------------",
|
|
6686
7086
|
"任务描述:",
|
|
6687
7087
|
task.description,
|
|
6688
|
-
"
|
|
7088
|
+
"------------------",
|
|
6689
7089
|
"完成条件:",
|
|
6690
7090
|
task.condition,
|
|
6691
7091
|
"====================",
|
|
@@ -6697,7 +7097,7 @@ ${Spacestationtechnology.map((t) => t.techname).join("、")}`;
|
|
|
6697
7097
|
if (!profile) return "⚠️ 需要先绑定游戏句柄";
|
|
6698
7098
|
const handle = `${profile.regionId}-S2-${profile.realmId}-${profile.profileId}`;
|
|
6699
7099
|
if (await ctx.database.get("ggcevo_blacklist", { handle }).then((r) => r.length)) {
|
|
6700
|
-
return "⛔
|
|
7100
|
+
return "⛔ 您已被列入黑名单。";
|
|
6701
7101
|
}
|
|
6702
7102
|
const taskEntry = Object.entries(Tasklist).find(
|
|
6703
7103
|
([taskName2]) => taskName2.includes(name2)
|