feat: 新增穿透伤害加成机制与相关配置

1. 新增全局穿透伤害衰减系数配置与英雄属性字段
2. 实现穿透伤害加成的计算逻辑与增益buff
3. 补全技能与英雄配置的相关变更
4. 新增穿透伤害相关的光环与技能配置
This commit is contained in:
panFD
2026-08-11 21:44:50 +08:00
parent f251e57c3c
commit c65c8a36ab
11 changed files with 100 additions and 1482 deletions

View File

@@ -167,4 +167,11 @@ export const BuffList: Record<number, BuffConfig> = {
modifiers: [{ attr: Attrs.freeze_chance, op: ModOp.Flat, value: 5 }],
info: "冰冻概率提升 5%,持续 5 秒",
},
// 穿透伤害强化(限时)
7022: {
id: 7022, name: "穿透伤害爆发", icon: "Stat_Tripleshot",
category: BuffCategory.Buff, duration: 5, max_stack: 1,
modifiers: [{ attr: Attrs.puncture_dmg_bonus, op: ModOp.Flat, value: 30 }],
info: "穿透后伤害提升 30%,持续 5 秒",
},
};

View File

@@ -48,6 +48,8 @@ export enum FightSet {
SHIELD_MAX = 5,
WAVE_HEAL_RATE = 0.4, // 回合结束时所有英雄恢复最大生命值的比例(与 DDA 放水兜底分层:回血保节奏,放水防崩盘)
PUNCTURE_DOWN = 50,
/** 穿透伤害衰减系数单体技能命中第2个及以后目标时按此比例折算伤害 */
PUNCTURE_DMG_RATIO = 0.5,
REFRESH_COST = 2,
BASE_COST = 5,
INIT_COIN = 7, // 初始金币数

View File

@@ -36,6 +36,7 @@ export enum Attrs {
knockback_res = "knockback_res", // 击退抗性
invincible_time = "invincible_time",// 无敌时间
puncture_chance = "puncture_chance", // 穿透概率
puncture_dmg_bonus = "puncture_dmg_bonus", // 穿透后伤害增量(百分点;最终穿透系数 = PUNCTURE_DMG_RATIO * (1 + bonus/100)
wfuny = "wfuny", // 风怒
}

View File

@@ -42,6 +42,13 @@
| lv3 中档 | 72xxx | 7202 |
| lv5 高档 | 74xxx | 7402 |
### 已分配 field 光环 uuid 速查
| FieldSkillType | lv1 | lv3 | lv5 | 说明 |
|----------------|-----|-----|-----|------|
| HeroPuncture | 7009 | 7209 | 7409 | 穿刺概率 |
| HeroPunctureDmg | 7020 | 7220 | 7420 | 穿透后伤害乘算PUNCTURE_DMG_RATIO × (1 + bonus) |
## 规则 2品质-档位标准
**card_lv = 基础 1 + 能力加成**
@@ -94,6 +101,7 @@
| 复活 | 不灭、凤凰、涅槃 |
| 攻速 | 风怒、迅捷 |
| 光环 | 战歌、光环、领域 |
| 穿透伤害 | 破甲、贯甲、穿心 |
### 预设命名示例
@@ -113,6 +121,7 @@
| fstart | 攻击 | 破晓先知、战吼法师、晨光祭司 |
| fstart | 护盾 | 圣光祭司、守护贤者、壁垒法师 |
| field | 攻速 | 战歌法师、风怒先知、迅捷贤者 |
| field | 穿透伤害 | 破甲先知、贯甲贤者、穿心祭司 |
| revive | 复活 | 不灭战魂、凤凰祭司、涅槃贤者 |
## 规则 4info 描述

View File

@@ -301,6 +301,7 @@ export const FieldDescSet: Record<number, FieldDescConfig> = {
[FieldSkillType.HeroHp]: { verb: "全体最大生命", fmt: FieldValueFmt.Percent },
[FieldSkillType.HeroWindFury]: { verb: "全体风怒概率", fmt: FieldValueFmt.Percent },
[FieldSkillType.HeroPuncture]: { verb: "全体穿刺概率", fmt: FieldValueFmt.Percent },
[FieldSkillType.HeroPunctureDmg]: { verb: "全体穿透后伤害", fmt: FieldValueFmt.Percent },
[FieldSkillType.AtkCount]: { verb: "攻击触发技能次数", fmt: FieldValueFmt.Int },
[FieldSkillType.BeAtkCount]: { verb: "被攻击触发技能次数", fmt: FieldValueFmt.Int },
};

View File

@@ -216,37 +216,37 @@ export const SkillSet: Record<number, SkillConfig> = {
6001: {
uuid: 6001, name: "飞剑", sp_name: "a1", icon: "Sword-FA_WP_Main_Sword_003_PurpleSilver", TGroup: TGroup.Enemy, readyAnm: "", endAnm: "", act: "atk",
DTType: DTType.single, ap: 100, hit_count: 1, hitcd: 0.2, speed: 720, with: 0, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.Melee, is_accel: true,
RType: RType.linear, EType: EType.collision, info: "造成攻击力100%的伤害",
RType: RType.bezier, EType: EType.collision, info: "造成攻击力100%的伤害",
},
6002: {
uuid: 6002, name: "飞刀", sp_name: "a2", icon: "Sword-FA_WP_Main_Sword_009_GraySilver", TGroup: TGroup.Enemy, readyAnm: "", endAnm: "", act: "atk",
DTType: DTType.single, ap: 100, hit_count: 1, hitcd: 0.2, speed: 720, with: 0, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.Melee, is_accel: true,
RType: RType.linear, EType: EType.collision, info: "造成攻击力100%的伤害",
RType: RType.bezier, EType: EType.collision, info: "造成攻击力100%的伤害",
},
6003: {
uuid: 6003, name: "匕首", sp_name: "a3", icon: "Sword-FA_WP_Main_Sword_019_WoodSilver", TGroup: TGroup.Enemy, readyAnm: "", endAnm: "", act: "atk",
DTType: DTType.single, ap: 100, hit_count: 1, hitcd: 0.2, speed: 720, with: 0, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.Melee, is_accel: true,
RType: RType.linear, EType: EType.collision, info: "造成攻击力100%的伤害",
RType: RType.bezier, EType: EType.collision, info: "造成攻击力100%的伤害",
},
6004: {
uuid: 6004, name: "飞斧", sp_name: "a4", icon: "Axe-FA_WP_Main_Axe_004_WoodGray", TGroup: TGroup.Enemy, readyAnm: "", endAnm: "", act: "atk",
DTType: DTType.single, ap: 100, hit_count: 1, hitcd: 0.2, speed: 720, with: 0, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.Melee, is_accel: true,
RType: RType.linear, EType: EType.collision, info: "造成攻击力100%的伤害",
RType: RType.bezier, EType: EType.collision, info: "造成攻击力100%的伤害",
},
6005: {
uuid: 6005, name: "飞枪", sp_name: "a5", icon: "Spear-FA_WP_Main_Spear_010_MetalBlue", TGroup: TGroup.Enemy, readyAnm: "", endAnm: "", act: "atk",
DTType: DTType.single, ap: 100, hit_count: 1, hitcd: 0.2, speed: 720, with: 0, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.Melee, is_accel: true,
RType: RType.linear, EType: EType.collision, info: "造成攻击力100%的伤害",
RType: RType.bezier, EType: EType.collision, info: "造成攻击力100%的伤害",
},
6006: {
uuid: 6006, name: "攻击", sp_name: "atk", icon: "Stat_Attack_01", TGroup: TGroup.Enemy, readyAnm: "", endAnm: "", act: "atk",
DTType: DTType.single, ap: 100, hit_count: 1, hitcd: 0.2, speed: 720, with: 0, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.Melee, is_accel: true,
RType: RType.linear, EType: EType.collision, info: "造成攻击力100%的伤害",
RType: RType.bezier, EType: EType.collision, info: "造成攻击力100%的伤害",
},
6007: {
uuid: 6007, name: "飞棒", sp_name: "b1", icon: "Blunt-FA_WP_Main_Blunt_002_Wood", TGroup: TGroup.Enemy, readyAnm: "", endAnm: "", act: "atk",
DTType: DTType.single, ap: 100, hit_count: 1, hitcd: 0.2, speed: 720, with: 0, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.Melee, is_accel: true,
RType: RType.linear, EType: EType.collision, info: "造成攻击力100%的伤害",
RType: RType.bezier, EType: EType.collision, info: "造成攻击力100%的伤害",
},
6008: {
uuid: 6008, name: "射击", sp_name: "aw2", icon: "Stat_RangedAttack", TGroup: TGroup.Enemy, readyAnm: "", endAnm: "", act: "atk",
@@ -266,32 +266,32 @@ export const SkillSet: Record<number, SkillConfig> = {
6011: {
uuid: 6011, name: "飞锤", sp_name: "b2", icon: "Blunt-FA_WP_Main_Blunt_005_Gray", TGroup: TGroup.Enemy, readyAnm: "", endAnm: "", act: "atk",
DTType: DTType.single, ap: 100, hit_count: 1, hitcd: 0.2, speed: 720, with: 0, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.Melee, is_accel: true,
RType: RType.linear, EType: EType.collision, info: "造成攻击力100%的伤害",
RType: RType.bezier, EType: EType.collision, info: "造成攻击力100%的伤害",
},
6012: {
uuid: 6012, name: "飞斧", sp_name: "b2", icon: "Axe-FA_WP_Main_Axe_002_WoodGray", TGroup: TGroup.Enemy, readyAnm: "", endAnm: "", act: "atk",
DTType: DTType.single, ap: 100, hit_count: 1, hitcd: 0.2, speed: 720, with: 0, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.Melee, is_accel: true,
RType: RType.linear, EType: EType.collision, info: "造成攻击力100%的伤害",
RType: RType.bezier, EType: EType.collision, info: "造成攻击力100%的伤害",
},
6013: {
uuid: 6013, name: "蓝魔球", sp_name: "m1", icon: "Sub_Item-FA_WP_Sub_MagicBall_001_Blue", TGroup: TGroup.Enemy, readyAnm: "", endAnm: "", act: "atk",
DTType: DTType.single, ap: 100, hit_count: 1, hitcd: 0.2, speed: 720, with: 0, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.Melee, is_accel: true,
RType: RType.linear, EType: EType.collision, info: "造成攻击力100%的伤害",
RType: RType.bezier, EType: EType.collision, info: "造成攻击力100%的伤害",
},
6014: {
uuid: 6014, name: "紫魔球", sp_name: "m2", icon: " Sub_Item-FA_WP_Sub_MagicBall_001_Purple", TGroup: TGroup.Enemy, readyAnm: "", endAnm: "", act: "atk",
DTType: DTType.single, ap: 100, hit_count: 1, hitcd: 0.2, speed: 720, with: 0, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.Melee, is_accel: true,
RType: RType.linear, EType: EType.collision, info: "造成攻击力100%的伤害",
RType: RType.bezier, EType: EType.collision, info: "造成攻击力100%的伤害",
},
6015: {
uuid: 6015, name: "绿药瓶", sp_name: "h1", icon: "Sub_Item-FA_WP_Sub_Potion_001_Green", TGroup: TGroup.Enemy, readyAnm: "", endAnm: "", act: "atk",
DTType: DTType.single, ap: 100, hit_count: 1, hitcd: 0.2, speed: 720, with: 0, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.Melee, is_accel: true,
RType: RType.linear, EType: EType.collision, info: "造成攻击力100%的伤害",
RType: RType.bezier, EType: EType.collision, info: "造成攻击力100%的伤害",
},
6016: {
uuid: 6016, name: "红药瓶", sp_name: "h2", icon: "Sub_Item-FA_WP_Sub_Potion_001_Red", TGroup: TGroup.Enemy, readyAnm: "", endAnm: "", act: "atk",
DTType: DTType.single, ap: 100, hit_count: 1, hitcd: 0.2, speed: 720, with: 0, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.Melee, is_accel: true,
RType: RType.linear, EType: EType.collision, info: "造成攻击力100%的伤害",
RType: RType.bezier, EType: EType.collision, info: "造成攻击力100%的伤害",
},
/*** ======中阶范围攻击技能 ====
* 都带有穿刺属性至少穿透1 个目标 攻击2 个目标, 升级方向是 最多 穿透3 个攻击 4 个目标
@@ -303,7 +303,7 @@ export const SkillSet: Record<number, SkillConfig> = {
6101: {
uuid: 6101, name: "火球", sp_name: "fb-1", icon: "Stat_FireDamage", TGroup: TGroup.Enemy, readyAnm: "", endAnm: "", act: "atk",
DTType: DTType.single, stun: 0, ap: 100, hit_count: 2, hitcd: 0.3, speed: 720, with: 90, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.remote,
RType: RType.linear, EType: EType.collision, info: "造成攻击力100%的伤害, 一定几率暴击, 高阶技能",
RType: RType.bezier, EType: EType.collision, info: "造成攻击力100%的伤害, 一定几率暴击, 高阶技能",
},
//怪物法师统一使用 暗影球
6102: {
@@ -385,6 +385,11 @@ export const SkillSet: Record<number, SkillConfig> = {
DTType: DTType.single, kind: SkillKind.Support, ap: 1, hit_count: 1, hitcd: 0.2, speed: 720, with: 0, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.support,
RType: RType.fixed, EType: EType.animationEnd, buff_type: Attrs.freeze_chance, timed_buff_id: 7021, info: "全体友方冰冻概率限时提升, 持续5秒",
},
6411: {
uuid: 6411, name: "穿透伤害强化", sp_name: "buff_wind", icon: "Stat_Tripleshot", TGroup: TGroup.Team, readyAnm: "up_ap", endAnm: "", act: "atk",
DTType: DTType.single, kind: SkillKind.Support, ap: 10, hit_count: 1, hitcd: 0.2, speed: 720, with: 0, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.support,
RType: RType.fixed, EType: EType.animationEnd, buff_type: Attrs.puncture_dmg_bonus, info: "全体友方穿透后伤害提升10%(百分点), 永久生效",
},
6501: {
uuid: 6501, name: "复活", sp_name: "buff_wind", icon: "Stat_HolyDamage", TGroup: TGroup.Self, readyAnm: "up_ap", endAnm: "", act: "atk",
DTType: DTType.single, kind: SkillKind.Support, ap: 50, hit_count: 3, hitcd: 0.2, speed: 720, with: 0, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.support,
@@ -442,6 +447,11 @@ export const SkillSet: Record<number, SkillConfig> = {
uuid: 6511, name: "冰冻抗性", sp_name: "buff_wind", icon: "Stat_Freeze", TGroup: TGroup.Team, readyAnm: "up_blue", endAnm: "", act: "atk",
DTType: DTType.single, kind: SkillKind.Support, ap: 0, hit_count: 3, hitcd: 0.2, speed: 720, with: 0, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.support,
RType: RType.fixed, EType: EType.animationEnd, buff_type: Attrs.freeze_res, timed_buff_id: 7019, info: "全体友方冰冻抗性提升50%, 持续5秒",
},
6512: {
uuid: 6512, name: "穿透伤害爆发", sp_name: "buff_wind", icon: "Stat_Tripleshot", TGroup: TGroup.Team, readyAnm: "up_ap", endAnm: "", act: "atk",
DTType: DTType.single, kind: SkillKind.Support, ap: 0, hit_count: 3, hitcd: 0.2, speed: 720, with: 0, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.support,
RType: RType.fixed, EType: EType.animationEnd, buff_type: Attrs.puncture_dmg_bonus, timed_buff_id: 7022, info: "全体友方穿透后伤害提升30%, 持续5秒",
}
};
@@ -468,6 +478,7 @@ export enum FieldSkillType {
HeroPuncture = 18, // 英雄穿刺概率加成
AtkCount = 19, // 攻击触发技能次数提升
BeAtkCount = 20, // 被攻击触发技能次数提升
HeroPunctureDmg = 21, // 英雄穿透后伤害加成百分点乘算PUNCTURE_DMG_RATIO * (1 + bonus/100)
}
export interface FieldSkillConfig {
@@ -503,6 +514,7 @@ export const FieldSkillSet: Record<number, FieldSkillConfig> = {
7017: { uuid: 7017, name: "结束强化", icon: "Stat_UnitSummonIncrease_01", type: FieldSkillType.EndCount, value: 1, info: "战斗结束触发技能次数+1" },
7018: { uuid: 7018, name: "攻击强化", icon: "Stat_Attack_03", type: FieldSkillType.AtkCount, value: 1, info: "攻击触发技能次数+1" },
7019: { uuid: 7019, name: "受击强化", icon: "Stat_Armor_01", type: FieldSkillType.BeAtkCount, value: 1, info: "被攻击触发技能次数+1" },
7020: { uuid: 7020, name: "穿透强化", icon: "Stat_Tripleshot", type: FieldSkillType.HeroPunctureDmg, value: 0.1, info: "英雄穿透后伤害+10%" },
// ============ wave5 档(原值 ×2 ============
@@ -522,6 +534,8 @@ export const FieldSkillSet: Record<number, FieldSkillConfig> = {
7212: { uuid: 7212, name: "购买优惠+", icon: "Stat_KeyCapacityIncrease", type: FieldSkillType.BuyDiscount, value: 2, info: "购买卡牌费用-2金币" },
7213: { uuid: 7213, name: "刷新优惠+", icon: "Stat_RandomBonus", type: FieldSkillType.RefreshDiscount, value: 2, info: "刷新卡牌费用-2金币" },
7220: { uuid: 7220, name: "穿透强化+", icon: "Stat_Tripleshot", type: FieldSkillType.HeroPunctureDmg, value: 0.2, info: "英雄穿透后伤害+20%" },
7401: { uuid: 7401, name: "战后恢复++", icon: "Stat_PotionBoost", type: FieldSkillType.WaveHeal, value: 0.3, info: "战斗结束生命回复量+30%" },
@@ -539,4 +553,6 @@ export const FieldSkillSet: Record<number, FieldSkillConfig> = {
7411: { uuid: 7411, name: "出售强化++", icon: "Stat_GoldGainIncrease_01", type: FieldSkillType.SellGold, value: 3, info: "卖出英雄金币+3" },
7412: { uuid: 7412, name: "购买优惠++", icon: "Stat_KeyCapacityIncrease", type: FieldSkillType.BuyDiscount, value: 3, info: "购买卡牌费用-3金币" },
7413: { uuid: 7413, name: "刷新优惠++", icon: "Stat_RandomBonus", type: FieldSkillType.RefreshDiscount, value: 3, info: "刷新卡牌费用-3金币" },
7420: { uuid: 7420, name: "穿透强化++", icon: "Stat_Tripleshot", type: FieldSkillType.HeroPunctureDmg, value: 0.3, info: "英雄穿透后伤害+30%" },
};

File diff suppressed because it is too large Load Diff

View File

@@ -389,7 +389,7 @@ export const HeroInfo: Record<number, heroInfo> = {
// 5002 影袭刺客 — atking 自身攻击
5002: {
uuid: 5002, name: "影袭刺客", path: "hc1", fac: FacSet.HERO, card_lv: 1, lv: 1, type: HType.Melee, grow_type: HGrowType.Assassin, hp: 300, ap: 28,
skills: { 6001: { uuid: 6001, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Fast2].cd, ccd: 0 } },
skills: { 6003: { uuid: 6003, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Fast2].cd, ccd: 0 } },
atking: {
6401: [
{ lv: 1, s_lv: SkillLv.Lv1, t_num: 5, overrides: { TGroup: TGroup.Self, ap: 1 } },
@@ -415,7 +415,7 @@ export const HeroInfo: Record<number, heroInfo> = {
// 5004 破晓先知 — fstart 全队攻击
5004: {
uuid: 5004, name: "破晓先知", path: "hm1", fac: FacSet.HERO, card_lv: 1, lv: 1, type: HType.Long, grow_type: HGrowType.Mage, hp: 143, ap: 40,
skills: { 6001: { uuid: 6001, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Mid3].cd, ccd: 0 } },
skills: { 6013: { uuid: 6013, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Mid3].cd, ccd: 0 } },
fstart: {
6401: [
{ lv: 1, s_lv: SkillLv.Lv1, t_num: 1, overrides: { TGroup: TGroup.Team, ap: 3 } },
@@ -428,7 +428,7 @@ export const HeroInfo: Record<number, heroInfo> = {
// 5005 战歌法师 — field 攻击光环
5005: {
uuid: 5005, name: "战歌法师", path: "hm2", fac: FacSet.HERO, card_lv: 1, lv: 1, type: HType.Long, grow_type: HGrowType.Mage, hp: 143, ap: 40,
skills: { 6001: { uuid: 6001, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Mid3].cd, ccd: 0 } },
skills: { 6013: { uuid: 6013, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Mid3].cd, ccd: 0 } },
field: [
{ lv: 1, uuids: [7002] },
{ lv: 3, uuids: [7202] },
@@ -455,7 +455,7 @@ export const HeroInfo: Record<number, heroInfo> = {
// 5102 致命杀手 — atking 暴击(更高数值)
5102: {
uuid: 5102, name: "致命杀手", path: "hc2", fac: FacSet.HERO, card_lv: 2, lv: 1, type: HType.Melee, grow_type: HGrowType.Assassin, hp: 600, ap: 57,
skills: { 6001: { uuid: 6001, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Fast2].cd, ccd: 0 } },
skills: { 6003: { uuid: 6003, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Fast2].cd, ccd: 0 } },
atking: {
6403: [
{ lv: 1, s_lv: SkillLv.Lv1, t_num: 5, overrides: { TGroup: TGroup.Self, timed_buff_id: 7012, buff_value: 5, buff_duration: 5 } },
@@ -481,7 +481,7 @@ export const HeroInfo: Record<number, heroInfo> = {
// 5104 圣光祭司 — fstart 全队护盾(更高数值)
5104: {
uuid: 5104, name: "圣光祭司", path: "hm3", fac: FacSet.HERO, card_lv: 2, lv: 1, type: HType.Long, grow_type: HGrowType.Mage, hp: 287, ap: 80,
skills: { 6001: { uuid: 6001, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow1].cd, ccd: 0 } },
skills: { 6013: { uuid: 6013, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Slow1].cd, ccd: 0 } },
fstart: {
6301: [
{ lv: 1, s_lv: SkillLv.Lv1, t_num: 1, overrides: { TGroup: TGroup.Team, ap: 3 } },
@@ -494,7 +494,7 @@ export const HeroInfo: Record<number, heroInfo> = {
// 5105 风怒先知 — field 攻速光环
5105: {
uuid: 5105, name: "风怒先知", path: "hm1", fac: FacSet.HERO, card_lv: 2, lv: 1, type: HType.Long, grow_type: HGrowType.Mage, hp: 287, ap: 80,
skills: { 6001: { uuid: 6001, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Mid2].cd, ccd: 0 } },
skills: { 6013: { uuid: 6013, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Mid2].cd, ccd: 0 } },
field: [
{ lv: 1, uuids: [7006] },
{ lv: 3, uuids: [7206] },
@@ -521,7 +521,7 @@ export const HeroInfo: Record<number, heroInfo> = {
// 5202 援护射手 — atking 队友攻击(范围扩大)
5202: {
uuid: 5202, name: "援护射手", path: "ha1", fac: FacSet.HERO, card_lv: 3, lv: 1, type: HType.Long, grow_type: HGrowType.Assassin, hp: 430, ap: 120,
skills: { 6001: { uuid: 6001, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Normal2].cd, ccd: 0 } },
skills: { 6008: { uuid: 6008, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Normal2].cd, ccd: 0 } },
atking: {
6401: [
{ lv: 1, s_lv: SkillLv.Lv1, t_num: 5, overrides: { TGroup: TGroup.Team, hit_count: 1, ap: 1 } },
@@ -547,7 +547,7 @@ export const HeroInfo: Record<number, heroInfo> = {
// 5204 晨光贤者 — fstart 全队暴击(范围扩大)
5204: {
uuid: 5204, name: "晨光贤者", path: "hm2", fac: FacSet.HERO, card_lv: 3, lv: 1, type: HType.Long, grow_type: HGrowType.Mage, hp: 430, ap: 120,
skills: { 6001: { uuid: 6001, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Mid3].cd, ccd: 0 } },
skills: { 6013: { uuid: 6013, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Mid3].cd, ccd: 0 } },
fstart: {
6403: [
{ lv: 1, s_lv: SkillLv.Lv1, t_num: 1, overrides: { TGroup: TGroup.Team, timed_buff_id: 7012, buff_value: 5, buff_duration: 5 } },
@@ -560,7 +560,7 @@ export const HeroInfo: Record<number, heroInfo> = {
// 5205 精准术士 — field 暴击光环(范围扩大)
5205: {
uuid: 5205, name: "精准术士", path: "hm3", fac: FacSet.HERO, card_lv: 3, lv: 1, type: HType.Long, grow_type: HGrowType.Mage, hp: 430, ap: 120,
skills: { 6001: { uuid: 6001, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Mid2].cd, ccd: 0 } },
skills: { 6013: { uuid: 6013, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Mid2].cd, ccd: 0 } },
field: [
{ lv: 1, uuids: [7004] },
{ lv: 3, uuids: [7204] },
@@ -600,7 +600,7 @@ export const HeroInfo: Record<number, heroInfo> = {
// 5303 亡语刺客 — dead 全队暴击+暴伤(双效果)
5303: {
uuid: 5303, name: "亡语刺客", path: "hc3", fac: FacSet.HERO, card_lv: 4, lv: 1, type: HType.Melee, grow_type: HGrowType.Assassin, hp: 1200, ap: 113,
skills: { 6001: { uuid: 6001, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Fast3].cd, ccd: 0 } },
skills: { 6003: { uuid: 6003, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Fast3].cd, ccd: 0 } },
dead: {
6403: [
{ lv: 1, s_lv: SkillLv.Lv1, t_num: 1, overrides: { TGroup: TGroup.Team, timed_buff_id: 7012, buff_value: 5, buff_duration: 5 } },
@@ -618,7 +618,7 @@ export const HeroInfo: Record<number, heroInfo> = {
// 5304 战吼术士 — fstart 全队攻击+生命(双效果)
5304: {
uuid: 5304, name: "战吼术士", path: "hm1", fac: FacSet.HERO, card_lv: 4, lv: 1, type: HType.Long, grow_type: HGrowType.Mage, hp: 573, ap: 160,
skills: { 6001: { uuid: 6001, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Mid1].cd, ccd: 0 } },
skills: { 6013: { uuid: 6013, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Mid1].cd, ccd: 0 } },
fstart: {
6401: [
{ lv: 1, s_lv: SkillLv.Lv1, t_num: 1, overrides: { TGroup: TGroup.Team, ap: 5 } },
@@ -636,7 +636,7 @@ export const HeroInfo: Record<number, heroInfo> = {
// 5305 领域贤者 — field 暴伤+攻速光环(双效果)
5305: {
uuid: 5305, name: "领域贤者", path: "hm2", fac: FacSet.HERO, card_lv: 4, lv: 1, type: HType.Long, grow_type: HGrowType.Mage, hp: 573, ap: 160,
skills: { 6001: { uuid: 6001, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Mid2].cd, ccd: 0 } },
skills: { 6013: { uuid: 6013, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Mid2].cd, ccd: 0 } },
field: [
{ lv: 1, uuids: [7005, 7006] },
{ lv: 3, uuids: [7205, 7206] },
@@ -709,7 +709,7 @@ export const HeroInfo: Record<number, heroInfo> = {
// 5404 涅槃贤者 — fstart 护盾+攻击 + revive双技能
5404: {
uuid: 5404, name: "涅槃贤者", path: "hm3", fac: FacSet.HERO, card_lv: 5, lv: 1, type: HType.Long, grow_type: HGrowType.Mage, hp: 717, ap: 200,
skills: { 6001: { uuid: 6001, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Normal3].cd, ccd: 0 } },
skills: { 6013: { uuid: 6013, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Normal3].cd, ccd: 0 } },
fstart: {
6301: [
{ lv: 1, s_lv: SkillLv.Lv1, t_num: 1, overrides: { TGroup: TGroup.Team, ap: 5 } },
@@ -732,7 +732,7 @@ export const HeroInfo: Record<number, heroInfo> = {
// 5405 圣言诗人 — atking 治疗 + field 生命光环(双技能)
5405: {
uuid: 5405, name: "圣言诗人", path: "hh1", fac: FacSet.HERO, card_lv: 5, lv: 1, type: HType.Long, grow_type: HGrowType.Support, hp: 717, ap: 200,
skills: { 6001: { uuid: 6001, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Normal2].cd, ccd: 0 } },
skills: { 6015: { uuid: 6015, lv: 1, cd: AtkSpeedSet[AtkSpeedLv.Normal2].cd, ccd: 0 } },
atking: {
6302: [
{ lv: 1, s_lv: SkillLv.Lv1, t_num: 5, overrides: { TGroup: TGroup.Team, ap: 200 } },
@@ -1190,6 +1190,7 @@ function calcFieldSkillValue(field: FieldSkillConfig, hpEff: number, apEff: numb
case FieldSkillType.HeroStun:
case FieldSkillType.HeroWindFury:
case FieldSkillType.HeroPuncture:
case FieldSkillType.HeroPunctureDmg:
return field.value * scopeMul * weights.W_control * 100;
default:
return field.value * scopeMul * weights.W_control * 10;

View File

@@ -86,6 +86,7 @@ export class HeroAttrsComp extends ecs.Comp {
knockback_res: number = 0; // 击退抗性
crit_damage: number = 0; // 额外暴击伤害
puncture_chance: number = 0; // 穿透概率
puncture_dmg_bonus: number = 0; // 穿透后伤害增量(百分点,乘算加成)
wfuny: number = 0; // 风怒
revived_count: number = 0; // 已复活次数
@@ -326,6 +327,12 @@ export class HeroAttrsComp extends ecs.Comp {
return this.puncture_chance + HeroAttrsComp.getFieldPercentValue(FieldSkillType.HeroPuncture);
}
/** 英雄实时穿透伤害加成 = 基础加成 + 驻场加成。 */
public getRuntimePunctureDmgBonus(): number {
if (this.fac !== FacSet.HERO) return this.puncture_dmg_bonus;
return this.puncture_dmg_bonus + HeroAttrsComp.getFieldPercentValue(FieldSkillType.HeroPunctureDmg);
}
/** 英雄实时暴击伤害 = 基础额外暴伤 + 驻场暴伤。 */
public getRuntimeCritDamageBonus(): number {
if (this.fac !== FacSet.HERO) return this.crit_damage;
@@ -467,6 +474,13 @@ export class HeroAttrsComp extends ecs.Comp {
return base + mods.flatSum + mods.pctSum;
}
/** 最终穿透伤害加成 = 驻场实时加成 + 限时修饰(加法模型) */
public getFinalPunctureDmgBonus(): number {
const base = this.getRuntimePunctureDmgBonus();
const mods = this.aggregateTimedMods(Attrs.puncture_dmg_bonus);
return base + mods.flatSum + mods.pctSum;
}
/** 最终风怒概率 = 驻场实时风怒 + 限时修饰(加法模型) */
public getFinalWindFury(): number {
const base = this.getRuntimeWindFury();
@@ -591,6 +605,7 @@ export class HeroAttrsComp extends ecs.Comp {
this.revived_count = 0;
this.invincible_time = 0;
this.puncture_chance = 0;
this.puncture_dmg_bonus = 0;
this.wfuny = 0;
this.boom = false;

View File

@@ -218,6 +218,7 @@ export class Skill extends ecs.Entity {
sDataCom.Attrs[Attrs.knockback_chance] = cAttrsComp.getFinalKnockbackChance() + sBck;
sDataCom.Attrs[Attrs.knockback_distance] = cAttrsComp.getFinalKnockbackDistance();
sDataCom.Attrs[Attrs.puncture_chance] = cAttrsComp.getFinalPunctureChance(); // 初始化携带施法者的穿透概率
sDataCom.Attrs[Attrs.puncture_dmg_bonus] = cAttrsComp.getFinalPunctureDmgBonus(); // 初始化携带施法者的穿透伤害加成
sDataCom.s_uuid = s_uuid
sDataCom.skill_lv = Math.max(0, skill_lv);
sDataCom.fac = cAttrsComp.fac

View File

@@ -114,7 +114,7 @@ export class SkillView extends CCComp {
}
}
// 命中次数按碰撞事件统计:不依赖是否最终造成伤害
let model = targetView.ent.get(HeroAttrsComp);
if (this.debugMode) {
mLogger.log(this.debugMode, 'SkillView', `[skillView] 碰撞3`, oCol.group, seCol.group, model);
@@ -123,7 +123,7 @@ export class SkillView extends CCComp {
if (model.is_dead) return;
if (this.sData.fac == model.fac) return;
// 检查是否已经命中过这个目标(日志安全输出)
this.apply_damage(targetView)
this.apply_damage(targetView, this.sData.hit_count)
}
onAnimationFinished(){
@@ -146,17 +146,29 @@ export class SkillView extends CCComp {
}, 0);
}
}
// 仅负责伤害派发,不处理命中次数与实体销毁
apply_damage(target:HeroViewComp,is_range:boolean=false){
if(target == null) return;
/**
* 仅负责伤害派发,不处理命中次数与实体销毁
* @param target 目标英雄视图
* @param punctureIndex 当前是第几个被命中的目标1=首目标;>=2 视为穿透目标,单体技能按 FightSet.PUNCTURE_DMG_RATIO 折算伤害,范围技能不衰减)
*/
apply_damage(target: HeroViewComp, punctureIndex: number = 1) {
if (target == null) return;
// 安全检查:如果目标实体已不存在,直接返回
if (!target.ent) return;
if (!this.sData) return;
if (!this.SConf) return;
if (this.debugMode) {
const targetName = target.ent.get(HeroAttrsComp)?.hero_name ?? "未知目标";
mLogger.log(this.debugMode, 'SkillView', `[skillView] 伤害 [${this.group}][eid:${this.sData.casterEid}]的 [${this.SConf.name}]对 [${target.box_group}][${targetName}][${target.ent.eid}]`);
mLogger.log(this.debugMode, 'SkillView', `[skillView] 伤害 [${this.group}][eid:${this.sData.casterEid}]的 [${this.SConf.name}]对 [${target.box_group}][${targetName}][${target.ent.eid}]${punctureIndex}目标`);
}
// 穿透伤害衰减仅单体伤害技能DTType.single且命中第2个及以后目标时按比例折算
// 乘法模型:最终穿透系数 = PUNCTURE_DMG_RATIO * (1 + puncture_dmg_bonus/100)
// 注puncture_dmg_bonus 单位为百分点30 = +30%),与项目其他概率/加成属性保持一致
const punctureDmgBonus = this.sData.Attrs[Attrs.puncture_dmg_bonus] || 0;
const decayRatio = (this.SConf.DTType === DTType.single && punctureIndex >= 2)
? FightSet.PUNCTURE_DMG_RATIO * (1 + punctureDmgBonus / 100)
: 1;
const finalRatio = this.sData.dmg_ratio * decayRatio;
// 使用伤害队列系统处理伤害
DamageQueueHelper.addDamageToEntity(
target.ent,
@@ -164,7 +176,7 @@ export class SkillView extends CCComp {
this.sData.casterEid,
this.sData.s_uuid,
this.sData.ext_dmg,
this.sData.dmg_ratio,
finalRatio,
);
}
close_collider(){