koishi-plugin-ggcevo-game 1.3.2 → 1.3.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/index.js +190 -66
- package/package.json +1 -1
package/lib/index.js
CHANGED
|
@@ -300,6 +300,7 @@ function apply(ctx, config) {
|
|
|
300
300
|
description: "标准配置武器,中距离作战利器",
|
|
301
301
|
price: 100,
|
|
302
302
|
redCrystalCost: 2,
|
|
303
|
+
isantiair: true,
|
|
303
304
|
tagEffects: {
|
|
304
305
|
"轻甲": 1.5
|
|
305
306
|
// 对轻甲目标造成150%伤害
|
|
@@ -312,6 +313,7 @@ function apply(ctx, config) {
|
|
|
312
313
|
description: "先进激光武器,远距离精准打击",
|
|
313
314
|
price: 300,
|
|
314
315
|
redCrystalCost: 5,
|
|
316
|
+
isantiair: true,
|
|
315
317
|
tagEffects: {
|
|
316
318
|
"重甲": 1.5,
|
|
317
319
|
// 对重甲目标造成150%伤害
|
|
@@ -325,6 +327,7 @@ function apply(ctx, config) {
|
|
|
325
327
|
description: "基于热能的强大武器,烧烬一切",
|
|
326
328
|
price: 450,
|
|
327
329
|
redCrystalCost: 5,
|
|
330
|
+
isantiair: false,
|
|
328
331
|
tagEffects: {
|
|
329
332
|
"惧热": 2,
|
|
330
333
|
"生物": 1.5,
|
|
@@ -338,6 +341,7 @@ function apply(ctx, config) {
|
|
|
338
341
|
description: "由激光步枪改良而来,高效的对重甲武器",
|
|
339
342
|
price: 850,
|
|
340
343
|
redCrystalCost: 15,
|
|
344
|
+
isantiair: true,
|
|
341
345
|
tagEffects: {
|
|
342
346
|
"重甲": 2,
|
|
343
347
|
"机械": 0.5,
|
|
@@ -351,6 +355,7 @@ function apply(ctx, config) {
|
|
|
351
355
|
description: "一种改造后的采矿切割机,有效对抗重甲目标",
|
|
352
356
|
price: 150,
|
|
353
357
|
redCrystalCost: 2,
|
|
358
|
+
isantiair: true,
|
|
354
359
|
tagEffects: {
|
|
355
360
|
"重甲": 1.5,
|
|
356
361
|
"建筑": 1.5,
|
|
@@ -364,6 +369,7 @@ function apply(ctx, config) {
|
|
|
364
369
|
description: "近距离攻击武器,专为遭遇战设计使用",
|
|
365
370
|
price: 325,
|
|
366
371
|
redCrystalCost: 5,
|
|
372
|
+
isantiair: false,
|
|
367
373
|
tagEffects: {
|
|
368
374
|
"轻甲": 1.5,
|
|
369
375
|
"重甲": 0.8
|
|
@@ -376,6 +382,7 @@ function apply(ctx, config) {
|
|
|
376
382
|
description: "用于隐秘射击的最佳武器,但是无法穿透护甲",
|
|
377
383
|
price: 550,
|
|
378
384
|
redCrystalCost: 10,
|
|
385
|
+
isantiair: true,
|
|
379
386
|
tagEffects: {
|
|
380
387
|
"轻甲": 0.5,
|
|
381
388
|
"重甲": 0.2
|
|
@@ -388,6 +395,7 @@ function apply(ctx, config) {
|
|
|
388
395
|
description: "喷射稳定的液氮恒流,对长时间接触者造成致命的损伤",
|
|
389
396
|
price: 775,
|
|
390
397
|
redCrystalCost: 10,
|
|
398
|
+
isantiair: false,
|
|
391
399
|
tagEffects: {
|
|
392
400
|
"惧寒": 2,
|
|
393
401
|
"灵能": 1.5
|
|
@@ -400,6 +408,7 @@ function apply(ctx, config) {
|
|
|
400
408
|
description: "一种经过改造的电动工具,可对近距离的目标放出高压电",
|
|
401
409
|
price: 750,
|
|
402
410
|
redCrystalCost: 10,
|
|
411
|
+
isantiair: true,
|
|
403
412
|
tagEffects: {
|
|
404
413
|
"机械": 2,
|
|
405
414
|
"建筑": 1.5
|
|
@@ -407,11 +416,12 @@ function apply(ctx, config) {
|
|
|
407
416
|
},
|
|
408
417
|
"伽马枪": {
|
|
409
418
|
id: 10,
|
|
410
|
-
type: "
|
|
419
|
+
type: "热能武器",
|
|
411
420
|
damage: 24,
|
|
412
421
|
description: "一种高度危险性的武器,设计用辐射照射并伤害敌人",
|
|
413
422
|
price: 825,
|
|
414
423
|
redCrystalCost: 15,
|
|
424
|
+
isantiair: true,
|
|
415
425
|
tagEffects: {
|
|
416
426
|
"生物": 1.2
|
|
417
427
|
}
|
|
@@ -433,6 +443,14 @@ function apply(ctx, config) {
|
|
|
433
443
|
price: 75,
|
|
434
444
|
redCrystalCost: 0,
|
|
435
445
|
effects: "对非建筑目标使用后,重置其技能计数"
|
|
446
|
+
},
|
|
447
|
+
"CRED-17": {
|
|
448
|
+
id: 3,
|
|
449
|
+
type: "设备工具",
|
|
450
|
+
description: "一个小型辛迪加机器人,可以破坏电子银行账户",
|
|
451
|
+
price: 0,
|
|
452
|
+
redCrystalCost: 60,
|
|
453
|
+
effects: "此物品存放于仓库,仅在您是辛迪加海盗阵营时生效。每日签到金币奖励+50%,每拥有100金币,增加1%(至多增加100%)。"
|
|
436
454
|
}
|
|
437
455
|
};
|
|
438
456
|
const modConfig = {
|
|
@@ -763,7 +781,7 @@ function apply(ctx, config) {
|
|
|
763
781
|
effect: "升级空间站科技花费的金币是原价的80%",
|
|
764
782
|
requirements: "将一个空间站科技升至3级或以上",
|
|
765
783
|
Jobtransfer: true,
|
|
766
|
-
costcoins:
|
|
784
|
+
costcoins: 4e3
|
|
767
785
|
},
|
|
768
786
|
{
|
|
769
787
|
professionName: "总工程师",
|
|
@@ -922,13 +940,13 @@ function apply(ctx, config) {
|
|
|
922
940
|
level: 4,
|
|
923
941
|
cost: 4250,
|
|
924
942
|
description: "提高挖矿效率,每日签到金币奖励+20%",
|
|
925
|
-
careerBonus: "深空矿工/情报副官: 每日签到金币奖励+40%; 解锁太空“挖矿”权限;
|
|
943
|
+
careerBonus: "深空矿工/情报副官: 每日签到金币奖励+40%; 解锁太空“挖矿”权限; 建造矿骡协同挖矿,效率提高20%"
|
|
926
944
|
},
|
|
927
945
|
{
|
|
928
946
|
level: 5,
|
|
929
947
|
cost: 5375,
|
|
930
948
|
description: "提高挖矿效率,每日签到金币奖励+25%",
|
|
931
|
-
careerBonus: "深空矿工/情报副官: 每日签到金币奖励+50%; 解锁太空“挖矿”权限;
|
|
949
|
+
careerBonus: "深空矿工/情报副官: 每日签到金币奖励+50%; 解锁太空“挖矿”权限; 建造矿骡协同挖矿,效率提高40%"
|
|
932
950
|
}
|
|
933
951
|
]
|
|
934
952
|
},
|
|
@@ -987,7 +1005,7 @@ function apply(ctx, config) {
|
|
|
987
1005
|
level: 2,
|
|
988
1006
|
cost: 1e3,
|
|
989
1007
|
description: "重启高级武器改装站,武器改装通用模块享有10%的折扣",
|
|
990
|
-
careerBonus: "武器中士/情报副官: 武器改装通用模块享有20
|
|
1008
|
+
careerBonus: "武器中士/情报副官: 武器改装通用模块享有20%的折扣; 武器改装专属模块享有10%的折扣"
|
|
991
1009
|
}
|
|
992
1010
|
]
|
|
993
1011
|
}
|
|
@@ -2091,6 +2109,12 @@ function apply(ctx, config) {
|
|
|
2091
2109
|
message: `成功使用 ${itemName},已重置 ${target} 的技能计数`
|
|
2092
2110
|
};
|
|
2093
2111
|
}
|
|
2112
|
+
if (itemConfig2.id === 3) {
|
|
2113
|
+
return {
|
|
2114
|
+
success: false,
|
|
2115
|
+
message: `此物品无需使用,存放于仓库即刻生效。`
|
|
2116
|
+
};
|
|
2117
|
+
}
|
|
2094
2118
|
return {
|
|
2095
2119
|
success: true,
|
|
2096
2120
|
message: `${itemName} 效果已生效(开发中)`
|
|
@@ -2155,15 +2179,22 @@ function apply(ctx, config) {
|
|
|
2155
2179
|
const baseCost = BASE_COST[equipment.level];
|
|
2156
2180
|
const weaponTechConfig = Spacestationtechnology.find((t) => t.techId === 2);
|
|
2157
2181
|
const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
|
|
2158
|
-
|
|
2159
|
-
|
|
2160
|
-
|
|
2161
|
-
|
|
2162
|
-
|
|
2163
|
-
|
|
2164
|
-
|
|
2165
|
-
|
|
2166
|
-
|
|
2182
|
+
let discountedCost;
|
|
2183
|
+
let weaponDiscount;
|
|
2184
|
+
let techLevel;
|
|
2185
|
+
let baseDiscount;
|
|
2186
|
+
let careerDiscount;
|
|
2187
|
+
if (careerData.group === "人类联盟") {
|
|
2188
|
+
const [weaponTech] = await ctx.database.get("ggcevo_tech", { handle, techId: 2 }).catch(() => [{ level: 0 }]);
|
|
2189
|
+
techLevel = Math.min(Math.max(weaponTech?.level || 0, 0), 5);
|
|
2190
|
+
const isCareerMatch = weaponTechConfig?.careerNames.includes(careerData?.career);
|
|
2191
|
+
const BASE_DISCOUNTS = [5, 10, 15, 20, 25];
|
|
2192
|
+
const CAREER_DISCOUNTS = [10, 20, 30, 40, 50];
|
|
2193
|
+
baseDiscount = techLevel > 0 ? BASE_DISCOUNTS[techLevel - 1] : 0;
|
|
2194
|
+
careerDiscount = isCareerMatch && techLevel > 0 ? CAREER_DISCOUNTS[techLevel - 1] : 0;
|
|
2195
|
+
weaponDiscount = Math.max(baseDiscount, careerDiscount) / 100;
|
|
2196
|
+
discountedCost = baseCost * (1 - weaponDiscount);
|
|
2197
|
+
}
|
|
2167
2198
|
const activeWish = await checkFoxBlessing(handle);
|
|
2168
2199
|
if (activeWish) {
|
|
2169
2200
|
discountedCost *= 0.8;
|
|
@@ -2228,6 +2259,66 @@ function apply(ctx, config) {
|
|
|
2228
2259
|
}).then((records) => records[0]);
|
|
2229
2260
|
}
|
|
2230
2261
|
__name(checkFoxBlessing, "checkFoxBlessing");
|
|
2262
|
+
async function generateUpgradePriceList(handle) {
|
|
2263
|
+
const [techData] = await ctx.database.get("ggcevo_tech", { handle, techId: 2 }).catch(() => [{ level: 0 }]);
|
|
2264
|
+
const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
|
|
2265
|
+
const weaponTechConfig = Spacestationtechnology.find((t) => t.techId === 2);
|
|
2266
|
+
const techLevel = Math.min(techData?.level || 0, 5);
|
|
2267
|
+
const isCareerMatch = weaponTechConfig.careerNames.includes(careerData?.career);
|
|
2268
|
+
const BASE_DISCOUNTS = [5, 10, 15, 20, 25];
|
|
2269
|
+
const CAREER_DISCOUNTS = [10, 20, 30, 40, 50];
|
|
2270
|
+
const baseDiscount = techLevel > 0 ? BASE_DISCOUNTS[techLevel - 1] : 0;
|
|
2271
|
+
const careerDiscount = isCareerMatch ? CAREER_DISCOUNTS[techLevel - 1] : 0;
|
|
2272
|
+
const techDiscountRate = Math.max(baseDiscount, careerDiscount);
|
|
2273
|
+
const hasTechDiscount = techDiscountRate > 0;
|
|
2274
|
+
const foxBlessing = await checkFoxBlessing(handle);
|
|
2275
|
+
const foxDiscount = foxBlessing ? 20 : 0;
|
|
2276
|
+
const hasFoxDiscount = foxDiscount > 0;
|
|
2277
|
+
const BASE_COST = [1050, 1450, 1850, 2250, 2650, 3050];
|
|
2278
|
+
const priceDetails = BASE_COST.map((baseCost, index) => {
|
|
2279
|
+
const level = `${index}→${index + 1}`;
|
|
2280
|
+
let finalPrice = baseCost;
|
|
2281
|
+
let discountTips = [];
|
|
2282
|
+
if (hasTechDiscount || hasFoxDiscount) {
|
|
2283
|
+
let discounted = baseCost;
|
|
2284
|
+
if (hasTechDiscount) {
|
|
2285
|
+
discounted *= 1 - techDiscountRate / 100;
|
|
2286
|
+
discountTips.push(`科技折扣 ${techDiscountRate}%`);
|
|
2287
|
+
}
|
|
2288
|
+
if (hasFoxDiscount) {
|
|
2289
|
+
discounted *= 0.8;
|
|
2290
|
+
discountTips.push(`灵狐折扣 20%`);
|
|
2291
|
+
}
|
|
2292
|
+
finalPrice = Math.floor(discounted);
|
|
2293
|
+
}
|
|
2294
|
+
const totalDiscount = hasTechDiscount || hasFoxDiscount ? Math.round(100 - finalPrice / baseCost * 100) : 0;
|
|
2295
|
+
return [
|
|
2296
|
+
`等级 ${level.padEnd(5)}`,
|
|
2297
|
+
...totalDiscount > 0 ? [
|
|
2298
|
+
`▸ 价格: ${finalPrice.toString().padStart(4)} (原价 ${baseCost})`
|
|
2299
|
+
] : []
|
|
2300
|
+
].join("\n");
|
|
2301
|
+
});
|
|
2302
|
+
const discountNotice = [];
|
|
2303
|
+
if (hasTechDiscount) {
|
|
2304
|
+
discountNotice.push(`🔧 武器系统 Lv${techLevel} (${techDiscountRate}% 折扣)`);
|
|
2305
|
+
}
|
|
2306
|
+
if (hasFoxDiscount) {
|
|
2307
|
+
discountNotice.push("🦊 灵狐升运生效中 (20% 折扣)");
|
|
2308
|
+
}
|
|
2309
|
+
if (!hasTechDiscount && !hasFoxDiscount) {
|
|
2310
|
+
discountNotice.push("💡 提示:加入人类联盟并升级武器系统可获得折扣");
|
|
2311
|
+
}
|
|
2312
|
+
return [
|
|
2313
|
+
"⚡ 武器升级价格表 ⚡",
|
|
2314
|
+
...discountNotice,
|
|
2315
|
+
"====================",
|
|
2316
|
+
...priceDetails,
|
|
2317
|
+
"====================",
|
|
2318
|
+
"使用「升级 武器名称」进行具体升级"
|
|
2319
|
+
].join("\n");
|
|
2320
|
+
}
|
|
2321
|
+
__name(generateUpgradePriceList, "generateUpgradePriceList");
|
|
2231
2322
|
ctx.command("ggcevo/抽奖").action(async (argv) => {
|
|
2232
2323
|
const session = argv.session;
|
|
2233
2324
|
let winCount = 0;
|
|
@@ -2434,7 +2525,6 @@ ${itemDetails.join("\n")}`;
|
|
|
2434
2525
|
});
|
|
2435
2526
|
let tickets = 3;
|
|
2436
2527
|
let points = getRandomInt(20, 40);
|
|
2437
|
-
let effectMessage = "";
|
|
2438
2528
|
if (monthlyDays === 7) {
|
|
2439
2529
|
tickets = 4;
|
|
2440
2530
|
} else if (monthlyDays === 14) {
|
|
@@ -2454,42 +2544,52 @@ ${itemDetails.join("\n")}`;
|
|
|
2454
2544
|
points = getRandomInt(100, 200);
|
|
2455
2545
|
}
|
|
2456
2546
|
let redCrystal = 0;
|
|
2547
|
+
let effectMessage = "";
|
|
2548
|
+
let bonusMessage = "";
|
|
2457
2549
|
let careerCrystalMessage = "";
|
|
2550
|
+
let cred17Message = "";
|
|
2551
|
+
let allianceBonusMessage = "";
|
|
2458
2552
|
const [careerData] = await ctx.database.get("ggcevo_careers", { handle });
|
|
2459
|
-
|
|
2460
|
-
|
|
2461
|
-
|
|
2462
|
-
|
|
2463
|
-
|
|
2464
|
-
|
|
2465
|
-
|
|
2466
|
-
|
|
2467
|
-
|
|
2468
|
-
|
|
2469
|
-
|
|
2470
|
-
|
|
2471
|
-
|
|
2472
|
-
|
|
2473
|
-
|
|
2474
|
-
|
|
2475
|
-
|
|
2476
|
-
|
|
2477
|
-
|
|
2553
|
+
if (careerData.group === "人类联盟") {
|
|
2554
|
+
const baseAllianceBonus = 0.2;
|
|
2555
|
+
points = Math.round(points * (1 + baseAllianceBonus));
|
|
2556
|
+
allianceBonusMessage = `
|
|
2557
|
+
🏛️ 人类联盟基础加成:金币+${baseAllianceBonus * 100}%`;
|
|
2558
|
+
let miningBonus = 0;
|
|
2559
|
+
let miningMessage = "";
|
|
2560
|
+
const BASE_BONUS = [5, 10, 15, 20, 25];
|
|
2561
|
+
const CAREER_BONUS = [10, 20, 30, 40, 50];
|
|
2562
|
+
const miningTechConfig = Spacestationtechnology.find((t) => t.techId === 1);
|
|
2563
|
+
if (miningTechConfig) {
|
|
2564
|
+
const [userMiningTech] = await ctx.database.get("ggcevo_tech", {
|
|
2565
|
+
handle,
|
|
2566
|
+
techId: 1
|
|
2567
|
+
}).catch(() => [{ level: 0 }]);
|
|
2568
|
+
const techLevel = Math.min(Math.max(userMiningTech?.level || 0, 0), 5);
|
|
2569
|
+
const baseBonus = techLevel > 0 ? BASE_BONUS[techLevel - 1] : 0;
|
|
2570
|
+
let careerTechBonus = 0;
|
|
2571
|
+
if (careerData?.career && miningTechConfig.careerNames.includes(careerData.career)) {
|
|
2572
|
+
careerTechBonus = techLevel > 0 ? CAREER_BONUS[techLevel - 1] : 0;
|
|
2573
|
+
}
|
|
2574
|
+
miningBonus = Math.max(baseBonus, careerTechBonus);
|
|
2575
|
+
if (miningBonus > 0) {
|
|
2576
|
+
miningMessage = `
|
|
2478
2577
|
⚙️ 采掘系统 Lv${techLevel} 金币加成:+${miningBonus}%`;
|
|
2578
|
+
}
|
|
2479
2579
|
}
|
|
2480
|
-
|
|
2481
|
-
|
|
2482
|
-
|
|
2483
|
-
|
|
2484
|
-
|
|
2485
|
-
minerMessage = `
|
|
2580
|
+
let minerBonus = 0;
|
|
2581
|
+
let minerMessage = "";
|
|
2582
|
+
if (careerData?.career === "深空矿工") {
|
|
2583
|
+
minerBonus = 50;
|
|
2584
|
+
minerMessage = `
|
|
2486
2585
|
⛏️ 深空矿工职业加成:金币+50%`;
|
|
2586
|
+
}
|
|
2587
|
+
const totalBonus = miningBonus + minerBonus;
|
|
2588
|
+
if (totalBonus > 0) {
|
|
2589
|
+
points = Math.round(points * (1 + totalBonus / 100));
|
|
2590
|
+
}
|
|
2591
|
+
bonusMessage = miningMessage + minerMessage;
|
|
2487
2592
|
}
|
|
2488
|
-
const totalBonus = miningBonus + minerBonus;
|
|
2489
|
-
if (totalBonus > 0) {
|
|
2490
|
-
points = Math.round(points * (1 + totalBonus / 100));
|
|
2491
|
-
}
|
|
2492
|
-
const bonusMessage = miningMessage + minerMessage;
|
|
2493
2593
|
if (careerData?.group === "辛迪加海盗" && careerData.career === "辛迪加财务经理") {
|
|
2494
2594
|
if (monthlyDays < 7) {
|
|
2495
2595
|
redCrystal = 1;
|
|
@@ -2505,11 +2605,23 @@ ${itemDetails.join("\n")}`;
|
|
|
2505
2605
|
careerCrystalMessage = `
|
|
2506
2606
|
⚓ 辛迪加财务经理职业加成:获得 ${redCrystal} 红晶`;
|
|
2507
2607
|
}
|
|
2608
|
+
if (careerData?.group === "辛迪加海盗") {
|
|
2609
|
+
const [cred17Item] = await ctx.database.get("ggcevo_warehouse", { handle, itemId: 3 });
|
|
2610
|
+
if (cred17Item?.quantity >= 1) {
|
|
2611
|
+
const currentGold = record?.totalRewards || 0;
|
|
2612
|
+
const additionalBonus = Math.min(Math.floor(currentGold / 100), 100);
|
|
2613
|
+
const totalBonus = 0.5 + additionalBonus * 0.01;
|
|
2614
|
+
points = Math.round(points * (1 + totalBonus));
|
|
2615
|
+
cred17Message = `
|
|
2616
|
+
💎 CRED-17生效:签到奖励+50%,当前金币${currentGold}(+${additionalBonus}%),总计加成+${(totalBonus * 100).toFixed(0)}%`;
|
|
2617
|
+
}
|
|
2618
|
+
}
|
|
2508
2619
|
if (meowEffect) {
|
|
2509
2620
|
tickets *= 2;
|
|
2510
2621
|
points *= 2;
|
|
2511
2622
|
effectMessage = "\n🐾 喵喵财源祈愿生效,获得双倍奖励(金币和咕咕币)!";
|
|
2512
2623
|
}
|
|
2624
|
+
effectMessage += cred17Message;
|
|
2513
2625
|
await ctx.database.withTransaction(async () => {
|
|
2514
2626
|
await ctx.database.upsert("ggcevo_sign", [{
|
|
2515
2627
|
handle,
|
|
@@ -2531,7 +2643,7 @@ ${itemDetails.join("\n")}`;
|
|
|
2531
2643
|
});
|
|
2532
2644
|
return `签到成功!本月累计签到${monthlyDays}天,获得:
|
|
2533
2645
|
💰 金币 x ${points}
|
|
2534
|
-
🪙 咕咕币 x ${tickets}` + (effectMessage || "") + bonusMessage + (careerCrystalMessage || "");
|
|
2646
|
+
🪙 咕咕币 x ${tickets}` + (effectMessage || "") + allianceBonusMessage + (bonusMessage || "") + (careerCrystalMessage || "");
|
|
2535
2647
|
} catch (error) {
|
|
2536
2648
|
console.error("签到命令时发生错误:", error);
|
|
2537
2649
|
return "服务器繁忙,请稍后尝试。";
|
|
@@ -3941,9 +4053,9 @@ ${achievementList.join("\n")}`;
|
|
|
3941
4053
|
'使用 "武器库 类型名称" 查看详细列表',
|
|
3942
4054
|
"====================",
|
|
3943
4055
|
...Object.entries(typeStats).map(([typeName, count]) => `▸ ${typeName} (${count}种)`),
|
|
4056
|
+
"====================",
|
|
3944
4057
|
discountRate > 0 && `
|
|
3945
|
-
|
|
3946
|
-
"===================="
|
|
4058
|
+
🔧 当前购买折扣:${discountRate}% (武器系统 Lv${techLevel})`
|
|
3947
4059
|
].filter(Boolean).join("\n");
|
|
3948
4060
|
}
|
|
3949
4061
|
if (!Object.keys(typeStats).includes(type)) {
|
|
@@ -3957,7 +4069,7 @@ ${Object.keys(typeStats).join("、")}`;
|
|
|
3957
4069
|
`【${name2}】`,
|
|
3958
4070
|
`类型:${config2.type}`,
|
|
3959
4071
|
`基础伤害:${config2.damage}`,
|
|
3960
|
-
`价格:${actualPrice}金币${discountRate > 0 ? ` (原价${config2.price}
|
|
4072
|
+
`价格:${actualPrice}金币${discountRate > 0 ? ` (原价${config2.price})` : ""}`,
|
|
3961
4073
|
"特性:",
|
|
3962
4074
|
tagEffectsDesc,
|
|
3963
4075
|
`描述:${config2.description}`
|
|
@@ -3966,7 +4078,7 @@ ${Object.keys(typeStats).join("、")}`;
|
|
|
3966
4078
|
return [
|
|
3967
4079
|
`🏪 咕咕武器库 - ${type} 🏪`,
|
|
3968
4080
|
"使用“购买 武器名称”命令进行购买",
|
|
3969
|
-
discountRate > 0 && `🔧
|
|
4081
|
+
discountRate > 0 && `🔧 当前购买折扣:${discountRate}% (武器系统 Lv${techLevel})`,
|
|
3970
4082
|
"====================",
|
|
3971
4083
|
...items,
|
|
3972
4084
|
items.length === 0 ? "⚠️ 该分类下暂无可用武器" : ""
|
|
@@ -4036,15 +4148,14 @@ ${validTypes.join("、")}`;
|
|
|
4036
4148
|
const [weaponTech] = await ctx.database.get("ggcevo_tech", { handle, techId: 2 });
|
|
4037
4149
|
let discountDetails = [];
|
|
4038
4150
|
let totalDiscount = 0;
|
|
4039
|
-
if (isWeapon) {
|
|
4151
|
+
if (isWeapon && careerData.group === "人类联盟") {
|
|
4040
4152
|
const techDiscountTable = {
|
|
4041
|
-
|
|
4042
|
-
|
|
4043
|
-
|
|
4044
|
-
5: [0, 25]
|
|
4153
|
+
3: [0, 10],
|
|
4154
|
+
4: [0, 15],
|
|
4155
|
+
5: [0, 20]
|
|
4045
4156
|
};
|
|
4046
4157
|
const techLevel = weaponTech?.level || 0;
|
|
4047
|
-
if (techLevel >=
|
|
4158
|
+
if (techLevel >= 3) {
|
|
4048
4159
|
const [baseDisc, careerDisc] = techDiscountTable[Math.min(techLevel, 5)] || [0, 0];
|
|
4049
4160
|
const isQualifiedCareer = careerData?.career && Spacestationtechnology.find((t) => t.techId === 2)?.careerNames.includes(careerData.career);
|
|
4050
4161
|
const techDiscount = isQualifiedCareer ? Math.max(baseDisc, careerDisc) : baseDisc;
|
|
@@ -4213,7 +4324,9 @@ ${validTypes.join("、")}`;
|
|
|
4213
4324
|
if ((await ctx.database.get("ggcevo_blacklist", { handle })).length) {
|
|
4214
4325
|
return "❌ 拒绝访问,您已被列入黑名单";
|
|
4215
4326
|
}
|
|
4216
|
-
if (!target)
|
|
4327
|
+
if (!target) {
|
|
4328
|
+
return generateUpgradePriceList(handle);
|
|
4329
|
+
}
|
|
4217
4330
|
const isTech = Spacestationtechnology.some(
|
|
4218
4331
|
(t) => t.techname === target || t.techname == target
|
|
4219
4332
|
);
|
|
@@ -4223,7 +4336,7 @@ ${validTypes.join("、")}`;
|
|
|
4223
4336
|
} else if (isWeapon) {
|
|
4224
4337
|
return handleWeaponUpgrade(handle, target);
|
|
4225
4338
|
}
|
|
4226
|
-
return `❌ 未找到 "${target}"
|
|
4339
|
+
return `❌ 未找到 "${target}" 对应的武器或科技(科技仅限人类联盟阵营升级)`;
|
|
4227
4340
|
});
|
|
4228
4341
|
ctx.command("ggcevo/改装 <weapon> [mod]", "安装武器模块").action(async ({ session }, weapon, mod) => {
|
|
4229
4342
|
const [profile] = await ctx.database.get("sc2arcade_player", { userId: session.userId });
|
|
@@ -4256,12 +4369,14 @@ ${validTypes.join("、")}`;
|
|
|
4256
4369
|
const techLevel = techData?.level || 0;
|
|
4257
4370
|
const isCareerMatch = Spacestationtechnology.find((t) => t.techId === 3).careerNames.includes(careerData?.career);
|
|
4258
4371
|
let discountRate = 0;
|
|
4259
|
-
if (
|
|
4260
|
-
if (
|
|
4261
|
-
|
|
4262
|
-
|
|
4263
|
-
|
|
4264
|
-
|
|
4372
|
+
if (careerData.group === "人类联盟") {
|
|
4373
|
+
if (modInfo.isExclusive) {
|
|
4374
|
+
if (techLevel >= 2 && isCareerMatch) discountRate = 10;
|
|
4375
|
+
} else {
|
|
4376
|
+
const baseDiscount = [5, 10][techLevel - 1] || 0;
|
|
4377
|
+
const careerDiscount = techLevel >= 1 && isCareerMatch ? [10, 20][techLevel - 1] : 0;
|
|
4378
|
+
discountRate = Math.max(baseDiscount, careerDiscount);
|
|
4379
|
+
}
|
|
4265
4380
|
}
|
|
4266
4381
|
const actualCost = Math.floor(modInfo.cost * (1 - discountRate / 100));
|
|
4267
4382
|
const [signInfo] = await ctx.database.get("ggcevo_sign", { handle });
|
|
@@ -4301,16 +4416,21 @@ ${validTypes.join("、")}`;
|
|
|
4301
4416
|
const actualPrice = Math.floor(config2.cost * (1 - discountRate / 100));
|
|
4302
4417
|
return [
|
|
4303
4418
|
`【${name2}】${config2.isExclusive ? ` (专属:${config2.exclusiveTo})` : ""}`,
|
|
4304
|
-
`价格:${actualPrice}金币${discountRate > 0 ? ` (原价${config2.cost}
|
|
4419
|
+
`价格:${actualPrice}金币${discountRate > 0 ? ` (原价${config2.cost})` : ""}`,
|
|
4305
4420
|
`效果:${config2.effect.replace(/▸/g, "▸ ")}`,
|
|
4306
4421
|
config2.isExclusive ? "※ 每个武器只能安装一个专属模块" : ""
|
|
4307
4422
|
].filter(Boolean).join("\n");
|
|
4308
4423
|
}, "formatMod");
|
|
4424
|
+
const baseUniversalDiscount = [5, 10][techLevel - 1] || 0;
|
|
4425
|
+
const careerUniversalDiscount = techLevel >= 1 && isCareerMatch ? [10, 20][techLevel - 1] : 0;
|
|
4426
|
+
const universalDiscountRate = Math.max(baseUniversalDiscount, careerUniversalDiscount);
|
|
4427
|
+
const exclusiveDiscountRate = techLevel >= 2 && isCareerMatch ? 10 : 0;
|
|
4309
4428
|
if (isValidWeapon) {
|
|
4310
4429
|
const exclusiveMods = Object.entries(modConfig).filter(([_, m]) => m.isExclusive && m.exclusiveTo === weapon).map(([name2, cfg]) => formatMod(name2, cfg));
|
|
4311
4430
|
return [
|
|
4312
4431
|
`🛠️ ${weapon} 专属模块 🛠️`,
|
|
4313
4432
|
"使用「改装 武器名称 模块名称」安装",
|
|
4433
|
+
exclusiveDiscountRate > 0 && `🔧 当前专属模块折扣:${exclusiveDiscountRate}% (武器升级平台 Lv${techLevel})`,
|
|
4314
4434
|
"====================",
|
|
4315
4435
|
exclusiveMods.length ? exclusiveMods.join("\n\n") : "该武器暂无专属模块"
|
|
4316
4436
|
].join("\n\n");
|
|
@@ -4319,6 +4439,7 @@ ${validTypes.join("、")}`;
|
|
|
4319
4439
|
return [
|
|
4320
4440
|
"🛠️ 通用武器模块 🛠️",
|
|
4321
4441
|
"使用「改装 武器名称 模块名称」安装专属模块",
|
|
4442
|
+
universalDiscountRate > 0 && `🔧 当前通用模块折扣:${universalDiscountRate}% (武器升级平台 Lv${techLevel})`,
|
|
4322
4443
|
"====================",
|
|
4323
4444
|
universalMods.join("\n\n")
|
|
4324
4445
|
].join("\n\n");
|
|
@@ -4375,6 +4496,9 @@ ${validTypes.join("、")}`;
|
|
|
4375
4496
|
if (!equippedWeapon) return "请先输入“装备 武器名称”后再攻击。";
|
|
4376
4497
|
const weaponConfigEntry = Object.entries(weaponConfig).find(([_, c]) => c.id === equippedWeapon.weaponId);
|
|
4377
4498
|
const [weaponName, weaponData] = weaponConfigEntry;
|
|
4499
|
+
if (!weaponData.isantiair && targetBoss.groupId === 5) {
|
|
4500
|
+
return "您装备的武器无法攻击空中目标!";
|
|
4501
|
+
}
|
|
4378
4502
|
const { damage: baseDamage, hasCrit, effectMessage } = await calculateTotalDamage(ctx, session, equippedWeapon, targetBoss);
|
|
4379
4503
|
const activeBosses = await ctx.database.get("ggcevo_boss", { isActive: true });
|
|
4380
4504
|
if (!activeBosses.length) return "当前没有存活的异形,请等待1小时后刷新。";
|
|
@@ -4525,8 +4649,8 @@ ${validTypes.join("、")}`;
|
|
|
4525
4649
|
`触发效果:
|
|
4526
4650
|
${effectMessage.join("\n")}`
|
|
4527
4651
|
] : [],
|
|
4528
|
-
`造成伤害:${initialDamage}${hasCrit ? "(✨ 暴击)" : ""}`,
|
|
4529
4652
|
...healMessages,
|
|
4653
|
+
`造成伤害:${initialDamage}${hasCrit ? "(✨ 暴击)" : ""}`,
|
|
4530
4654
|
// 修改金币显示行
|
|
4531
4655
|
`获得金币:${finalReward}${careerMessage}`,
|
|
4532
4656
|
`目标剩余HP:${Math.max(currentHP, 0)}/${maxHP}`,
|