koishi-plugin-ggcevo-game 1.4.74 → 1.4.76

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.
@@ -2,6 +2,7 @@ export interface BattleStatistics {
2
2
  name: string;
3
3
  hpChange: number;
4
4
  energyChange: number;
5
+ armorChange: number;
5
6
  tagsAdded: string[];
6
7
  tagsRemoved: string[];
7
8
  skillsAdded: string[];
@@ -398,7 +399,7 @@ export declare const BattleEffectProcessor: {
398
399
  name: string;
399
400
  updates: Partial<BattleStatistics>;
400
401
  } | null;
401
- buffMultiplier: number;
402
+ armorReduction: number;
402
403
  layerAdded: boolean;
403
404
  } | null;
404
405
  handleColdEffect: (targetBoss: any, weaponName: string) => {
@@ -501,13 +502,24 @@ export declare const BattleEffectProcessor: {
501
502
  messages: string[];
502
503
  buffMultiplier?: undefined;
503
504
  };
504
- handleBurrowAmbush: (targetBoss: any, nestlingNames?: string[]) => {
505
+ handleBurrowAmbush: (targetBoss: any, activeBosses: any[], nestlingNames?: string[]) => {
505
506
  messages: string[];
506
507
  targetUpdates: {
507
508
  name: any;
508
- updates: Partial<BattleStatistics>;
509
+ updates: {
510
+ skillsRemoved: string[];
511
+ };
509
512
  };
510
- spawnNewBossMark: string;
513
+ spawnNewBossMark?: undefined;
514
+ } | {
515
+ messages: string[];
516
+ targetUpdates: {
517
+ name: any;
518
+ updates: {
519
+ skillsRemoved: string[];
520
+ };
521
+ };
522
+ spawnNewBossMark: string[];
511
523
  };
512
524
  handleWeakeningSpit: (targetBoss: any, activeBosses: any[]) => any;
513
525
  handleHealingSwarm: (targetBoss: any, activeBosses: any[]) => {
@@ -553,6 +565,14 @@ export declare const BattleEffectProcessor: {
553
565
  messages: string[];
554
566
  spawnNewBossMark: string;
555
567
  };
568
+ handlePulseRifleEffect: (weaponName: string, targetBoss: any) => {
569
+ pulseGrenadeTriggered: boolean;
570
+ targetUpdates: {
571
+ name: string;
572
+ updates: Partial<BattleStatistics>;
573
+ } | null;
574
+ messages: string[];
575
+ };
556
576
  };
557
577
  /**
558
578
  * 统一处理所有被动效果(包含伤害修正、免疫检查、状态更新等)
@@ -51,4 +51,4 @@ export declare function testAttackFunction(ctx: Context, session: any, handle: s
51
51
  passiveMessages: string[];
52
52
  ignoreMessage: any[];
53
53
  }>;
54
- export declare function createNestlingBosses(ctx: any, nestlingName: string): Promise<any>;
54
+ export declare function createNestlingBosses(ctx: any, nestlingNames: string | string[]): Promise<any[]>;
package/lib/database.d.ts CHANGED
@@ -122,12 +122,15 @@ export interface WeaponInventory {
122
122
  installedMods: string[];
123
123
  equipped: boolean;
124
124
  comboCount: number;
125
+ pityCounter: number;
125
126
  }
126
127
  export interface BossInfo {
127
128
  name: string;
128
129
  groupId: number;
129
130
  type: string;
130
131
  HP: number;
132
+ energy: number;
133
+ armor: number;
131
134
  tags: string[];
132
135
  skills: string[];
133
136
  skillStacks: number;
@@ -135,7 +138,6 @@ export interface BossInfo {
135
138
  statusLayers: number;
136
139
  radiationLayers: number;
137
140
  coldLayers: number;
138
- energy: number;
139
141
  lastWeaponName: string;
140
142
  isActive: boolean;
141
143
  respawnTime: Date;
package/lib/index.js CHANGED
@@ -148,7 +148,7 @@ var weaponConfig = {
148
148
  damage: 25,
149
149
  armorDamageReduction: 1,
150
150
  description: "喷射稳定的液氮恒流,对长时间接触者造成致命的损伤",
151
- specialeffect: "攻击使目标叠加[寒冷]层数,每层使其受到的伤害提高2.5%(上限50%)",
151
+ specialeffect: "攻击时为目标附加[寒冷]效果,每层使目标受到的伤害提高2.5%(最多提高50%)",
152
152
  price: 775,
153
153
  redCrystalCost: 7,
154
154
  isantiair: false,
@@ -165,7 +165,7 @@ var weaponConfig = {
165
165
  damage: 24,
166
166
  armorDamageReduction: 0.5,
167
167
  description: "一种经过改造的电动工具,可对近距离的目标放出高压电",
168
- specialeffect: "攻击消耗目标200点能量",
168
+ specialeffect: "每次攻击消耗目标200点能量值",
169
169
  price: 750,
170
170
  redCrystalCost: 7,
171
171
  isantiair: true,
@@ -181,7 +181,7 @@ var weaponConfig = {
181
181
  damage: 27,
182
182
  armorDamageReduction: 0.75,
183
183
  description: "一种高度危险性的武器,设计用辐射照射并伤害敌人",
184
- specialeffect: "攻击使无机械标签的[生物]目标叠加[辐射]层数,每层使其受到的伤害提高2.5%(上限50%)",
184
+ specialeffect: "攻击无[机械]标签的[生物]目标时附加[辐射]效果,每层使目标受到的伤害提高2.5%(最多提高50%)",
185
185
  price: 825,
186
186
  redCrystalCost: 8,
187
187
  isantiair: true,
@@ -197,7 +197,7 @@ var weaponConfig = {
197
197
  damage: 27,
198
198
  armorDamageReduction: 0,
199
199
  description: "激光步枪的变种,采用折射技术升级",
200
- specialeffect: "触发散射攻击,对非主目标造成120%基础伤害",
200
+ specialeffect: "攻击触发散射,对次要目标造成120%基础伤害",
201
201
  price: 1450,
202
202
  redCrystalCost: 14,
203
203
  isantiair: true,
@@ -212,7 +212,7 @@ var weaponConfig = {
212
212
  damage: 29,
213
213
  armorDamageReduction: 0.75,
214
214
  description: "面对护盾目标而开发的武器",
215
- specialeffect: "攻击[护盾]目标时无视50%减伤",
215
+ specialeffect: "[护盾]目标无视50%伤害减免",
216
216
  price: 1050,
217
217
  redCrystalCost: 10,
218
218
  isantiair: true,
@@ -244,7 +244,7 @@ var weaponConfig = {
244
244
  damage: 36,
245
245
  armorDamageReduction: 1,
246
246
  description: "一种原型能量武器,能够发射强大的脉冲",
247
- specialeffect: "攻击使目标技能层数减少2",
247
+ specialeffect: "攻击减少目标2层技能层数",
248
248
  price: 1500,
249
249
  redCrystalCost: 15,
250
250
  isantiair: true,
@@ -351,12 +351,12 @@ var weaponConfig = {
351
351
  damage: 80,
352
352
  armorDamageReduction: -1,
353
353
  description: "一件传奇武器",
354
- specialeffect: "暴击率+25%;若连续3次攻击没暴击,则下一次攻击必定暴击",
354
+ specialeffect: "暴击率提高25%;连续3次未暴击时,下次攻击必定暴击",
355
355
  price: 6400,
356
356
  redCrystalCost: 200,
357
357
  isantiair: true,
358
358
  tagEffects: {
359
- "重甲": 1.75
359
+ "重甲": 1.5
360
360
  }
361
361
  },
362
362
  "龙息霰弹枪": {
@@ -398,7 +398,7 @@ var weaponConfig = {
398
398
  damage: 100,
399
399
  armorDamageReduction: 0,
400
400
  description: "优雅而独特的武器",
401
- specialeffect: "无视100%减伤",
401
+ specialeffect: "无视目标100%伤害减免",
402
402
  price: 6400,
403
403
  redCrystalCost: 200,
404
404
  isantiair: false,
@@ -411,7 +411,7 @@ var weaponConfig = {
411
411
  damage: 100,
412
412
  armorDamageReduction: 1,
413
413
  description: "一件传奇武器",
414
- specialeffect: "攻击消耗目标500点能量",
414
+ specialeffect: "攻击触发散射,对次要目标造成30%基础伤害;每次攻击消耗目标500点能量值",
415
415
  price: 6400,
416
416
  redCrystalCost: 200,
417
417
  isantiair: true,
@@ -426,7 +426,7 @@ var weaponConfig = {
426
426
  damage: 80,
427
427
  armorDamageReduction: 0,
428
428
  description: "一件传奇武器",
429
- specialeffect: "每次攻击有33%概率发射一枚特殊的榴弹,造成50%的额外伤害,并减少目标0.25护甲;若连续2次攻击没发射榴弹,则下一次攻击必定发射",
429
+ specialeffect: "无法暴击;无视50%伤害减免;33%几率发射脉冲榴弹,额外造成50%伤害并降低目标0.5护甲值",
430
430
  price: 6400,
431
431
  redCrystalCost: 200,
432
432
  isantiair: true,
@@ -455,21 +455,21 @@ var weaponConfig = {
455
455
  var modConfig = {
456
456
  "动能增幅": {
457
457
  cost: 1750,
458
- effect: "伤害+15%",
458
+ effect: "伤害提高15%",
459
459
  // 规范术语
460
460
  exclusiveTo: "",
461
461
  isExclusive: false
462
462
  },
463
463
  "棱镜水晶": {
464
- cost: 2250,
465
- effect: "暴击率+10%",
464
+ cost: 2050,
465
+ effect: "暴击率提升10%",
466
466
  // 保持原描述
467
467
  exclusiveTo: "",
468
468
  isExclusive: false
469
469
  },
470
470
  "破甲模块": {
471
471
  cost: 1250,
472
- effect: "无视10%减伤",
472
+ effect: "无视目标10%伤害减免",
473
473
  // 术语统一
474
474
  exclusiveTo: "",
475
475
  isExclusive: false
@@ -477,43 +477,37 @@ var modConfig = {
477
477
  // 专属模组修改
478
478
  "裂甲核心": {
479
479
  cost: 750,
480
- effect: "伤害+40%,无视40%减伤",
481
- // 统一伤害/防御描述
480
+ effect: "伤害提高40%,无视目标40%伤害减免",
482
481
  exclusiveTo: "高斯步枪",
483
482
  isExclusive: true
484
483
  },
485
484
  "棱镜超载核心": {
486
- cost: 2550,
487
- effect: "暴击率+20%;若连续4次攻击没暴击,则下一次攻击必定暴击",
488
- // 保持原描述
485
+ cost: 2250,
486
+ effect: "暴击率提升20%;连续4次未暴击时,下次攻击必定暴击",
489
487
  exclusiveTo: "激光步枪",
490
488
  isExclusive: true
491
489
  },
492
490
  "助燃核心": {
493
491
  cost: 2550,
494
492
  effect: "对[惧热]目标造成300%伤害,对[生物]目标造成200%伤害",
495
- // 规范标签引用和效果描述
496
493
  exclusiveTo: "焚烧枪",
497
494
  isExclusive: true
498
495
  },
499
496
  "光束曲射晶片": {
500
497
  cost: 2750,
501
- effect: "触发散射攻击,对非主目标造成100%基础伤害",
502
- // 明确机制命名
498
+ effect: "攻击触发散射,对次要目标造成100%基础伤害",
503
499
  exclusiveTo: "碎骨步枪",
504
500
  isExclusive: true
505
501
  },
506
502
  "金刚石瞄准镜": {
507
503
  cost: 2250,
508
- effect: "无视20%减伤",
509
- // 术语统一
504
+ effect: "无视目标20%伤害减免",
510
505
  exclusiveTo: "侦察步枪",
511
506
  isExclusive: true
512
507
  },
513
508
  "微型聚变核心": {
514
509
  cost: 2750,
515
- effect: "连续攻击叠加[伤害提升],每层提高7.5%伤害(上限6层)",
516
- // 机制命名和数值规范化
510
+ effect: "连续攻击叠加[聚变]效果,每层提高7.5%伤害(最多6层)",
517
511
  exclusiveTo: "聚变磁轨枪",
518
512
  isExclusive: true
519
513
  }
@@ -1506,7 +1500,7 @@ var bossPool = [
1506
1500
  {
1507
1501
  name: "巢穴雷兽",
1508
1502
  type: "子代",
1509
- maxHP: 4e3,
1503
+ maxHP: 2500,
1510
1504
  maxShield: 0,
1511
1505
  maxEnergy: 0,
1512
1506
  armor: 15,
@@ -1518,7 +1512,7 @@ var bossPool = [
1518
1512
  {
1519
1513
  name: "巢穴战士",
1520
1514
  type: "子代",
1521
- maxHP: 2e3,
1515
+ maxHP: 1500,
1522
1516
  maxShield: 0,
1523
1517
  maxEnergy: 0,
1524
1518
  armor: 4,
@@ -1530,7 +1524,7 @@ var bossPool = [
1530
1524
  {
1531
1525
  name: "巢穴甲虫",
1532
1526
  type: "子代",
1533
- maxHP: 3e3,
1527
+ maxHP: 2e3,
1534
1528
  maxShield: 0,
1535
1529
  maxEnergy: 0,
1536
1530
  armor: 10,
@@ -1551,6 +1545,8 @@ function updateStatsByName(name2, updates) {
1551
1545
  // 键与 name 一致
1552
1546
  hpChange: 0,
1553
1547
  energyChange: 0,
1548
+ armorChange: 0,
1549
+ // 新增字段初始化
1554
1550
  tagsAdded: [],
1555
1551
  tagsRemoved: [],
1556
1552
  skillsAdded: [],
@@ -1573,6 +1569,7 @@ function updateStatsByName(name2, updates) {
1573
1569
  statusLayersChanged: existing.statusLayersChanged + (updates.statusLayersChanged ?? 0),
1574
1570
  radiationLayersChange: existing.radiationLayersChange + (updates.radiationLayersChange ?? 0),
1575
1571
  coldLayersChange: existing.coldLayersChange + (updates.coldLayersChange ?? 0),
1572
+ armorChange: existing.armorChange + (updates.armorChange ?? 0),
1576
1573
  // 数组类型:合并(新增内容追加到现有数组)
1577
1574
  tagsAdded: [...existing.tagsAdded, ...updates.tagsAdded ?? []],
1578
1575
  tagsRemoved: [...existing.tagsRemoved, ...updates.tagsRemoved ?? []],
@@ -3042,12 +3039,8 @@ var BattleEffectProcessor = {
3042
3039
  const messages = [];
3043
3040
  let layerAdded = false;
3044
3041
  const currentLayers = targetBoss.radiationLayers || 0;
3045
- const effectiveLayers = Math.min(currentLayers, 20);
3046
- const buffMultiplier = effectiveLayers * 0.025;
3047
- if (effectiveLayers > 0) {
3048
- messages.push(`☢️ 【辐射】:当前${currentLayers}层,受到的伤害+${(effectiveLayers * 2.5).toFixed(1)}%`);
3049
- if (currentLayers > 20) {
3050
- }
3042
+ const armorReduction = currentLayers * 0.05;
3043
+ if (currentLayers > 0) {
3051
3044
  }
3052
3045
  let targetUpdates = null;
3053
3046
  if (weaponName === "伽马枪" && // 使用伽马枪
@@ -3056,18 +3049,20 @@ var BattleEffectProcessor = {
3056
3049
  targetUpdates = {
3057
3050
  name: targetBoss.name,
3058
3051
  updates: {
3059
- radiationLayersChange: 1
3052
+ radiationLayersChange: 1,
3060
3053
  // 辐射层数增加1
3054
+ armorChange: -0.05
3055
+ // 同时削减0.05护甲值(永久生效)
3061
3056
  }
3062
3057
  };
3063
3058
  const newLayers = currentLayers + 1;
3064
- messages.push(`☢️ 【伽马枪】武器效果:获得1层「辐射」`);
3059
+ messages.push(`☢️ 【伽马枪】武器效果:获得1层「辐射」并削减0.05护甲值`);
3065
3060
  layerAdded = true;
3066
3061
  }
3067
3062
  return {
3068
3063
  messages,
3069
3064
  targetUpdates,
3070
- buffMultiplier,
3065
+ armorReduction,
3071
3066
  layerAdded
3072
3067
  // 返回层数增加标记
3073
3068
  };
@@ -3428,29 +3423,41 @@ var BattleEffectProcessor = {
3428
3423
  const messages = [`🐛 【虫巢思维】生效:存在${livingNestlings}只巢穴子代,受到的伤害-${nerfMultiplier * 100}%`];
3429
3424
  return { nerfMultiplier, messages };
3430
3425
  }, "handleHiveMind"),
3431
- // 爆虫伏击 - 血量低于50%时,立即随机孵化1只巢穴子代并移除技能
3432
- handleBurrowAmbush: /* @__PURE__ */ __name(function(targetBoss, nestlingNames = ["巢穴雷兽", "巢穴战士", "巢穴甲虫"]) {
3426
+ // 爆虫伏击 - 血量低于50%时,立即孵化巢穴子代直至上限(生效后移除)
3427
+ handleBurrowAmbush: /* @__PURE__ */ __name(function(targetBoss, activeBosses, nestlingNames = ["巢穴雷兽", "巢穴战士", "巢穴甲虫"]) {
3433
3428
  if (!targetBoss.skills.includes("爆虫伏击")) return null;
3434
3429
  const maxHP = getMaxHPByName(targetBoss.name);
3435
3430
  const hpPercent = targetBoss.HP / maxHP;
3436
3431
  if (hpPercent >= 0.5) return null;
3437
- const randomBossName = nestlingNames[Math.floor(Math.random() * nestlingNames.length)];
3438
- const messages = [
3439
- `🕳️ 【爆虫伏击】触发:生命值≤50%,需要孵化1只${randomBossName}`,
3440
- `🕳️ 【爆虫伏击】技能移除`
3441
- ];
3432
+ const existingTypes = activeBosses.filter((boss) => boss.isActive && nestlingNames.includes(boss.name)).map((boss) => boss.name);
3433
+ const needSpawn = nestlingNames.filter(
3434
+ (name2) => !existingTypes.includes(name2)
3435
+ // 当前尚未存在
3436
+ );
3437
+ if (needSpawn.length === 0) {
3438
+ return {
3439
+ messages: [
3440
+ "🕳️ 【爆虫伏击】触发:生命值≤50%,但所有巢穴子代已存在,无需孵化",
3441
+ "🕳️ 【爆虫伏击】技能移除"
3442
+ ],
3443
+ targetUpdates: {
3444
+ name: targetBoss.name,
3445
+ updates: { skillsRemoved: ["爆虫伏击"] }
3446
+ }
3447
+ };
3448
+ }
3449
+ const spawnMessages = needSpawn.map(
3450
+ (name2) => `🕳️ 【爆虫伏击】触发:孵化1只${name2}`
3451
+ );
3452
+ spawnMessages.push("🕳️ 【爆虫伏击】技能移除");
3442
3453
  return {
3443
- messages,
3454
+ messages: spawnMessages,
3444
3455
  targetUpdates: {
3445
- // 添加目标boss更新数据
3446
3456
  name: targetBoss.name,
3447
- updates: {
3448
- skillsRemoved: ["爆虫伏击"]
3449
- // 移除此技能
3450
- }
3457
+ updates: { skillsRemoved: ["爆虫伏击"] }
3451
3458
  },
3452
- spawnNewBossMark: randomBossName
3453
- // 返回生成标记
3459
+ spawnNewBossMark: needSpawn
3460
+ // 返回需要孵化的子代名称数组
3454
3461
  };
3455
3462
  }, "handleBurrowAmbush"),
3456
3463
  // 虚弱喷吐 - 孵化场存活时减伤80%,死亡时增伤20%
@@ -3463,7 +3470,7 @@ var BattleEffectProcessor = {
3463
3470
  if (hatcheryExists) {
3464
3471
  effect = { nerfMultiplier: 0.8, messages: ["🤢 【虚弱喷吐】生效:孵化场存活,受到的伤害-80%"] };
3465
3472
  } else {
3466
- effect = { buffMultiplier: 0.2, messages: ["☠️ 【虚弱喷吐】生效:孵化场死亡,受到的伤害+20%"] };
3473
+ effect = { buffMultiplier: 0, messages: [] };
3467
3474
  }
3468
3475
  return effect;
3469
3476
  }, "handleWeakeningSpit"),
@@ -3512,7 +3519,7 @@ var BattleEffectProcessor = {
3512
3519
  }, "handleHealingSwarm"),
3513
3520
  // 释放信息素 - 所有存活巢穴子代减伤20%
3514
3521
  handleReleasePheromones: /* @__PURE__ */ __name(function(targetBoss) {
3515
- if (!targetBoss.name.includes("巢穴雷兽") && !targetBoss.name.includes("巢穴战士") && !targetBoss.name.includes("巢穴甲虫") && !targetBoss.name.includes("孵化场")) return null;
3522
+ if (!targetBoss.name.includes("巢穴雷兽") && !targetBoss.name.includes("巢穴战士") && !targetBoss.name.includes("巢穴甲虫") && !targetBoss.name.includes("孵化场") && !targetBoss.name.includes("虫群女王")) return null;
3516
3523
  const messages = [`🌬️ 【释放信息素】生效:受到的伤害-20%`];
3517
3524
  const nerfMultiplier = 0.2;
3518
3525
  return { messages, nerfMultiplier };
@@ -3591,7 +3598,30 @@ var BattleEffectProcessor = {
3591
3598
  messages: [`🥚 【孵化】触发:成功孵化1只${randomBossName}`],
3592
3599
  spawnNewBossMark: randomBossName
3593
3600
  };
3594
- }, "handleHatching")
3601
+ }, "handleHatching"),
3602
+ // M4AE脉冲步枪特殊效果处理
3603
+ handlePulseRifleEffect: /* @__PURE__ */ __name(function(weaponName, targetBoss) {
3604
+ const messages = [];
3605
+ let targetUpdates = null;
3606
+ let pulseGrenadeTriggered = false;
3607
+ if (weaponName !== "M4AE脉冲步枪") return null;
3608
+ if (Math.random() < 0.33) {
3609
+ pulseGrenadeTriggered = true;
3610
+ targetUpdates = {
3611
+ name: targetBoss.name,
3612
+ updates: {
3613
+ armorChange: -0.5
3614
+ // 负值表示削减护甲
3615
+ }
3616
+ };
3617
+ messages.push(`💥 【脉冲榴弹】触发:额外造成50%伤害,削减目标0.5点护甲值`);
3618
+ } else return null;
3619
+ return {
3620
+ pulseGrenadeTriggered,
3621
+ targetUpdates,
3622
+ messages
3623
+ };
3624
+ }, "handlePulseRifleEffect")
3595
3625
  };
3596
3626
  function applyPassiveEffects(targetBoss, activeBosses, weaponName, damage, hasCrit, ignoreRate, careerData) {
3597
3627
  const messages = [];
@@ -3675,6 +3705,13 @@ function applyPassiveEffects(targetBoss, activeBosses, weaponName, damage, hasCr
3675
3705
  updateStatsByName(solarFlareResult.targetUpdates.name, solarFlareResult.targetUpdates.updates);
3676
3706
  }
3677
3707
  }
3708
+ const pulseEffect = BattleEffectProcessor.handlePulseRifleEffect(weaponName, targetBoss);
3709
+ if (pulseEffect) {
3710
+ messages.push(...pulseEffect.messages);
3711
+ if (pulseEffect.targetUpdates) {
3712
+ updateStatsByName(pulseEffect.targetUpdates.name, pulseEffect.targetUpdates.updates);
3713
+ }
3714
+ }
3678
3715
  const carpetBombResult = BattleEffectProcessor.handleCarpetBombing(targetBoss);
3679
3716
  if (carpetBombResult) {
3680
3717
  isolatedImmunityMark = carpetBombResult.tempMark || false;
@@ -3791,7 +3828,7 @@ function applyPassiveEffects(targetBoss, activeBosses, weaponName, damage, hasCr
3791
3828
  // 6. 淬毒撕咬
3792
3829
  { effect: BattleEffectProcessor.handlePoisonedBite, args: [targetBoss] },
3793
3830
  { effect: BattleEffectProcessor.handleHealingSwarm, args: [targetBoss, activeBosses] },
3794
- { effect: BattleEffectProcessor.handleBurrowAmbush, args: [targetBoss] }
3831
+ { effect: BattleEffectProcessor.handleBurrowAmbush, args: [targetBoss, activeBosses] }
3795
3832
  ];
3796
3833
  for (const effectItem of healingEffects) {
3797
3834
  processEffect(effectItem.effect, ...effectItem.args);
@@ -3836,9 +3873,6 @@ function applyPassiveEffects(targetBoss, activeBosses, weaponName, damage, hasCr
3836
3873
  const radiationResult = BattleEffectProcessor.handleRadiationEffect(targetBoss, weaponName);
3837
3874
  if (radiationResult) {
3838
3875
  messages.push(...radiationResult.messages);
3839
- if (radiationResult.buffMultiplier) {
3840
- totalBuffMultiplier += radiationResult.buffMultiplier;
3841
- }
3842
3876
  if (radiationResult.targetUpdates) {
3843
3877
  updateStatsByName(radiationResult.targetUpdates.name, radiationResult.targetUpdates.updates);
3844
3878
  }
@@ -3875,6 +3909,9 @@ function applyPassiveEffects(targetBoss, activeBosses, weaponName, damage, hasCr
3875
3909
  let adjustedNerfMultiplier = totalNerfMultiplier * (1 - ignoreRate);
3876
3910
  const damageMultiplier = 1 + totalBuffMultiplier - adjustedNerfMultiplier;
3877
3911
  finalDamage = damage * damageMultiplier;
3912
+ if (pulseEffect?.pulseGrenadeTriggered) {
3913
+ finalDamage *= 1.5;
3914
+ }
3878
3915
  if (hasCrit) {
3879
3916
  finalDamage *= 2;
3880
3917
  }
@@ -3882,11 +3919,14 @@ function applyPassiveEffects(targetBoss, activeBosses, weaponName, damage, hasCr
3882
3919
  if (careerData?.career === "猩红杀手" && weaponName === "侦察步枪") {
3883
3920
  armorDamageReduction = 1;
3884
3921
  }
3885
- armor = getArmorByName(targetBoss.name);
3922
+ armor = targetBoss.armor;
3886
3923
  if (targetBoss.name === "测试假人") {
3887
3924
  armor = targetBoss.armor;
3888
3925
  }
3889
3926
  const armorReduction = armorDamageReduction * armor;
3927
+ if (armorReduction !== 0) {
3928
+ messages.push(`护甲减伤: ${armorReduction.toFixed(2)}点`);
3929
+ }
3890
3930
  finalDamage = Math.max(Math.round(finalDamage - armorReduction), 1);
3891
3931
  const frostEvolutionResult = BattleEffectProcessor.handleFrostEvolution(
3892
3932
  targetBoss,
@@ -4207,11 +4247,11 @@ var passiveConfig = {
4207
4247
  },
4208
4248
  "爆虫伏击": {
4209
4249
  type: "",
4210
- description: "血量低于50%时,立即随机孵化1只巢穴子代(生效后移除)"
4250
+ description: "血量低于50%时,立即孵化巢穴子代直至上限(生效后移除)"
4211
4251
  },
4212
4252
  "虚弱喷吐": {
4213
4253
  type: "",
4214
- description: "当孵化场存活时,受到的伤害降低80%;孵化场死亡时,受到的伤害提高20%"
4254
+ description: "当孵化场存活时,受到的伤害降低80%"
4215
4255
  },
4216
4256
  "治愈虫群": {
4217
4257
  type: "",
@@ -4219,7 +4259,7 @@ var passiveConfig = {
4219
4259
  },
4220
4260
  "释放信息素": {
4221
4261
  type: "",
4222
- description: "所有存活的其他异形受到的伤害降低20%"
4262
+ description: "所有存活的异形受到的伤害降低20%"
4223
4263
  },
4224
4264
  "恐吓尖啸": {
4225
4265
  type: "",
@@ -4438,6 +4478,7 @@ async function activateNextBossGroup(ctx, currentBossId = null) {
4438
4478
  // 新增标签字段
4439
4479
  skills: [...nextBossGroup.main.passive],
4440
4480
  energy: nextBossGroup.main.maxEnergy,
4481
+ armor: nextBossGroup.main.armor,
4441
4482
  groupId: nextBossGroup.id,
4442
4483
  isActive: true,
4443
4484
  respawnTime: /* @__PURE__ */ new Date()
@@ -4451,6 +4492,7 @@ async function activateNextBossGroup(ctx, currentBossId = null) {
4451
4492
  // 新增标签字段
4452
4493
  skills: [...minion.passive],
4453
4494
  energy: minion.maxEnergy,
4495
+ armor: minion.armor,
4454
4496
  groupId: nextBossGroup.id,
4455
4497
  isActive: true,
4456
4498
  respawnTime: /* @__PURE__ */ new Date()
@@ -4995,14 +5037,33 @@ async function calculateTotalDamage(ctx, session, config, equippedWeapon, target
4995
5037
  __name(calculateTotalDamage, "calculateTotalDamage");
4996
5038
  async function calculateCrit(ctx, handle, equippedWeapon, weaponName) {
4997
5039
  let critRate = 0;
5040
+ const pityCounter = equippedWeapon?.pityCounter || 0;
4998
5041
  const critSources = [];
5042
+ if (weaponName === "M4AE脉冲步枪") {
5043
+ return {
5044
+ hasCrit: false,
5045
+ critSources: []
5046
+ };
5047
+ }
5048
+ if (weaponName === "MK-4激光步枪" && pityCounter >= 3) {
5049
+ return {
5050
+ hasCrit: true,
5051
+ critSources: ["🔫 MK-4激光步枪:保底暴击"]
5052
+ };
5053
+ }
5054
+ if (equippedWeapon.installedMods?.includes("棱镜超载核心") && modConfig["棱镜超载核心"]?.exclusiveTo === weaponName && pityCounter >= 4) {
5055
+ return {
5056
+ hasCrit: true,
5057
+ critSources: ["⚙️ 棱镜超载核心模组:保底暴击"]
5058
+ };
5059
+ }
4999
5060
  if (equippedWeapon.installedMods?.includes("棱镜水晶")) {
5000
5061
  critRate += 10;
5001
- critSources.push("🔼 棱镜水晶:暴击率+10%");
5062
+ critSources.push("⚙️ 棱镜水晶:暴击率+10%");
5002
5063
  }
5003
5064
  if (equippedWeapon.installedMods?.includes("棱镜超载核心") && modConfig["棱镜超载核心"]?.exclusiveTo === weaponName) {
5004
5065
  critRate += 20;
5005
- critSources.push("🔼 棱镜超载核心:暴击率+20%");
5066
+ critSources.push("⚙️ 棱镜超载核心:暴击率+20%");
5006
5067
  }
5007
5068
  const [critRhythm] = await ctx.database.get("ggcevo_wish", {
5008
5069
  handle,
@@ -5339,6 +5400,9 @@ async function handleScatterAttack(ctx, session, handle, config, equippedWeapon,
5339
5400
  } else if (weaponName === "中子步枪") {
5340
5401
  scatterEffectMessages.push("🔆 【中子步枪】触发散射攻击!");
5341
5402
  scatterRatio = 1.2;
5403
+ } else if (weaponName === "DG-3电弧步枪") {
5404
+ scatterEffectMessages.push("🔆 【DG-3电弧步枪】触发散射攻击!");
5405
+ scatterRatio = 0.3;
5342
5406
  }
5343
5407
  for (const secondaryTarget of secondaryTargets) {
5344
5408
  const damageResult = await calculateTotalDamage(
@@ -5418,11 +5482,14 @@ async function handleDeathTargets(ctx, deadTargets, killerName, killerHandle) {
5418
5482
  "🏆 伤害排行榜奖励:",
5419
5483
  ...rewardMessages
5420
5484
  );
5485
+ } else if (deadBoss.name === "巢穴雷兽" || deadBoss.name === "巢穴战士" || deadBoss.name === "巢穴甲虫") {
5486
+ await ctx.database.remove("ggcevo_boss", { name: deadBoss.name });
5421
5487
  } else {
5422
- await ctx.database.set("ggcevo_boss", { groupId: deadBoss.groupId }, {
5488
+ await ctx.database.upsert("ggcevo_boss", [{
5489
+ name: deadBoss.name,
5423
5490
  isActive: false,
5424
5491
  HP: 0
5425
- });
5492
+ }], ["name"]);
5426
5493
  }
5427
5494
  }
5428
5495
  return {
@@ -5598,6 +5665,10 @@ async function updateDatabaseWithStats(ctx, stats) {
5598
5665
  const newEnergy = boss.energy + stats.energyChange;
5599
5666
  updateData.energy = Math.max(0, Math.min(maxEnergy, newEnergy));
5600
5667
  }
5668
+ if (stats.armorChange !== 0) {
5669
+ const newarmor = boss.armor + stats.armorChange;
5670
+ updateData.armor = newarmor;
5671
+ }
5601
5672
  if (stats.skillStacksChanged !== 0) {
5602
5673
  const newStacks = boss.skillStacks + stats.skillStacksChanged;
5603
5674
  updateData.skillStacks = Math.max(0, Math.min(maxStacks, newStacks));
@@ -5650,8 +5721,8 @@ async function handleIgnoreReductionEffects(ctx, handle, weaponName, targetBoss)
5650
5721
  ignoreEffects.push(1);
5651
5722
  messages.push(`⚔️ 【光剑】武器效果:无视100%减伤效果`);
5652
5723
  } else if (weaponName === "M4AE脉冲步枪") {
5653
- ignoreEffects.push(0.8);
5654
- messages.push(`🔫 【M4AE脉冲步枪】武器效果:无视80%减伤效果`);
5724
+ ignoreEffects.push(0.5);
5725
+ messages.push(`🔫 【M4AE脉冲步枪】武器效果:无视50%减伤效果`);
5655
5726
  } else if (weaponName === "粒子相位枪" && targetBoss?.tags.includes("护盾")) {
5656
5727
  ignoreEffects.push(0.5);
5657
5728
  messages.push(`⚡ 【粒子相位枪】武器效果:无视50%减伤效果`);
@@ -5719,31 +5790,37 @@ async function testAttackFunction(ctx, session, handle, config, equippedWeapon,
5719
5790
  };
5720
5791
  }
5721
5792
  __name(testAttackFunction, "testAttackFunction");
5722
- async function createNestlingBosses(ctx, nestlingName) {
5723
- let foundMinion = null;
5724
- let groupId = null;
5725
- for (const bossGroup of bossPool) {
5726
- const minion = bossGroup.minions.find((m) => m.name === nestlingName);
5727
- if (minion) {
5728
- foundMinion = minion;
5729
- groupId = bossGroup.id;
5730
- break;
5731
- }
5732
- }
5733
- if (!foundMinion) {
5734
- throw new Error(`未知的巢穴子代名称: ${nestlingName}`);
5735
- }
5736
- return ctx.database.create("ggcevo_boss", {
5737
- name: foundMinion.name,
5738
- type: foundMinion.type,
5739
- HP: foundMinion.maxHP,
5740
- tags: foundMinion.tags,
5741
- skills: [...foundMinion.passive],
5742
- energy: foundMinion.maxEnergy,
5743
- groupId,
5744
- isActive: true,
5745
- respawnTime: /* @__PURE__ */ new Date()
5746
- });
5793
+ async function createNestlingBosses(ctx, nestlingNames) {
5794
+ const names = Array.isArray(nestlingNames) ? nestlingNames : [nestlingNames];
5795
+ const createdBosses = [];
5796
+ for (const name2 of names) {
5797
+ let foundMinion = null;
5798
+ let groupId = null;
5799
+ for (const bossGroup of bossPool) {
5800
+ const minion = bossGroup.minions.find((m) => m.name === name2);
5801
+ if (minion) {
5802
+ foundMinion = minion;
5803
+ groupId = bossGroup.id;
5804
+ break;
5805
+ }
5806
+ }
5807
+ if (!foundMinion) {
5808
+ throw new Error(`未知的巢穴子代名称: ${name2}`);
5809
+ }
5810
+ const createdBoss = await ctx.database.create("ggcevo_boss", {
5811
+ name: foundMinion.name,
5812
+ type: foundMinion.type,
5813
+ HP: foundMinion.maxHP,
5814
+ tags: foundMinion.tags,
5815
+ skills: [...foundMinion.passive],
5816
+ energy: foundMinion.maxEnergy,
5817
+ groupId,
5818
+ isActive: true,
5819
+ respawnTime: /* @__PURE__ */ new Date()
5820
+ });
5821
+ createdBosses.push(createdBoss);
5822
+ }
5823
+ return createdBosses;
5747
5824
  }
5748
5825
  __name(createNestlingBosses, "createNestlingBosses");
5749
5826
 
@@ -5928,8 +6005,9 @@ function apply(ctx, config) {
5928
6005
  modificationSlots: "unsigned",
5929
6006
  installedMods: "list",
5930
6007
  equipped: "boolean",
5931
- comboCount: "unsigned"
6008
+ comboCount: "unsigned",
5932
6009
  // 新增:记录连续攻击次数的计数器
6010
+ pityCounter: "unsigned"
5933
6011
  }, {
5934
6012
  primary: ["handle", "weaponId"]
5935
6013
  });
@@ -5939,6 +6017,7 @@ function apply(ctx, config) {
5939
6017
  type: "string",
5940
6018
  HP: "unsigned",
5941
6019
  energy: "unsigned",
6020
+ armor: "integer",
5942
6021
  tags: "list",
5943
6022
  skills: "list",
5944
6023
  skillStacks: "unsigned",
@@ -6047,6 +6126,7 @@ function apply(ctx, config) {
6047
6126
  const currentGroupId = group.groupId;
6048
6127
  await ctx.database.remove("ggcevo_boss_damage", {});
6049
6128
  await ctx.database.remove("ggcevo_boss", {});
6129
+ await ctx.database.set("ggcevo_weapons", {}, { comboCount: 0 });
6050
6130
  const newBossGroup = await activateNextBossGroup(ctx, currentGroupId);
6051
6131
  await ctx.broadcast(
6052
6132
  groupId,
@@ -7973,7 +8053,8 @@ ${validTypes.join("、")}`;
7973
8053
  level: 0,
7974
8054
  modificationSlots: 1,
7975
8055
  equipped: false,
7976
- comboCount: 0
8056
+ comboCount: 0,
8057
+ pityCounter: 0
7977
8058
  }], ["handle", "weaponId"]);
7978
8059
  const equippedCount = await ctx.database.select("ggcevo_weapons").where({ handle, equipped: true }).execute((row) => import_koishi.$.count(row.weaponId));
7979
8060
  if (equippedCount === 0) {
@@ -8414,6 +8495,21 @@ ${validTypes.join("、")}`;
8414
8495
  }, {
8415
8496
  comboCount: 0
8416
8497
  });
8498
+ if (!primaryAttackResult.hasCrit) {
8499
+ await ctx.database.set("ggcevo_weapons", {
8500
+ handle,
8501
+ weaponId: equippedWeapon.weaponId
8502
+ }, {
8503
+ pityCounter: (equippedWeapon?.pityCounter || 0) + 1
8504
+ });
8505
+ } else {
8506
+ await ctx.database.set("ggcevo_weapons", {
8507
+ handle,
8508
+ weaponId: equippedWeapon.weaponId
8509
+ }, {
8510
+ pityCounter: 0
8511
+ });
8512
+ }
8417
8513
  const resultMessage = buildResultMessage(
8418
8514
  session,
8419
8515
  weaponName,
@@ -8582,7 +8678,7 @@ ${testResult.passiveMessages.map((m) => `▸ ${m}`).join("\n")}`
8582
8678
  if (bossGroup.main.maxEnergy > 0) {
8583
8679
  result.push(`⚡ 能量:${mainBoss.energy}/1000`);
8584
8680
  }
8585
- result.push(`🛡️ 护甲:${bossGroup.main.armor || 0}`);
8681
+ result.push(`🛡️ 护甲:${mainBoss.armor || 0}`);
8586
8682
  result.push(`🏷️ 标签:${mainBoss.tags?.join("、") || "无"}`);
8587
8683
  if (mainBoss.radiationLayers > 0) {
8588
8684
  result.push(`☢️ 辐射:${mainBoss.radiationLayers}层`);
@@ -8646,7 +8742,7 @@ ${testResult.passiveMessages.map((m) => `▸ ${m}`).join("\n")}`
8646
8742
  if (minionConfig && minionConfig.maxEnergy > 0) {
8647
8743
  minionInfo.push(`⚡ 能量:${minion.energy}/1000`);
8648
8744
  }
8649
- minionInfo.push(`🛡️ 护甲:${minionConfig?.armor || 0}`);
8745
+ minionInfo.push(`🛡️ 护甲:${minion.armor || 0}`);
8650
8746
  minionInfo.push(`🏷️ 标签:${minion.tags?.join("、") || "无"}`);
8651
8747
  if (minion.radiationLayers > 0) {
8652
8748
  minionInfo.push(`☢️ 辐射:${minion.radiationLayers}层`);
@@ -8711,6 +8807,7 @@ ${testResult.passiveMessages.map((m) => `▸ ${m}`).join("\n")}`
8711
8807
  }
8712
8808
  await ctx.database.remove("ggcevo_boss_damage", {});
8713
8809
  await ctx.database.remove("ggcevo_boss", {});
8810
+ await ctx.database.set("ggcevo_weapons", {}, { comboCount: 0 });
8714
8811
  await ctx.database.create("ggcevo_boss", {
8715
8812
  name: bossConfig.main.name,
8716
8813
  type: "主宰",
@@ -8718,6 +8815,7 @@ ${testResult.passiveMessages.map((m) => `▸ ${m}`).join("\n")}`
8718
8815
  tags: bossConfig.main.tags,
8719
8816
  skills: [...bossConfig.main.passive],
8720
8817
  energy: bossConfig.main.maxEnergy,
8818
+ armor: bossConfig.main.armor,
8721
8819
  groupId: groupid,
8722
8820
  isActive: true,
8723
8821
  respawnTime: /* @__PURE__ */ new Date()
@@ -8734,6 +8832,7 @@ ${testResult.passiveMessages.map((m) => `▸ ${m}`).join("\n")}`
8734
8832
  tags: minion.tags,
8735
8833
  skills: [...minion.passive],
8736
8834
  energy: minion.maxEnergy,
8835
+ armor: minion.armor,
8737
8836
  groupId: groupid,
8738
8837
  isActive: true,
8739
8838
  respawnTime: /* @__PURE__ */ new Date()
@@ -9382,7 +9481,8 @@ ${testResult.passiveMessages.map((m) => `▸ ${m}`).join("\n")}`
9382
9481
  modificationSlots: 1,
9383
9482
  installedMods: [],
9384
9483
  equipped: false,
9385
- comboCount: 0
9484
+ comboCount: 0,
9485
+ pityCounter: 0
9386
9486
  });
9387
9487
  const equippedCount = await ctx.database.select("ggcevo_weapons").where({ handle, equipped: true }).execute((row) => import_koishi.$.count(row.weaponId));
9388
9488
  if (equippedCount === 0) {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "koishi-plugin-ggcevo-game",
3
3
  "description": "《星际争霸2》咕咕虫-evolved地图的专属游戏助手插件,集成天梯排行、抽奖系统、签到福利、兑换商城等丰富功能。",
4
- "version": "1.4.74",
4
+ "version": "1.4.76",
5
5
  "main": "lib/index.js",
6
6
  "typings": "lib/index.d.ts",
7
7
  "files": [