feat: 新增麻痹异常状态机制
1. 新增麻痹概率属性与相关属性计算方法 2. 为英雄普攻和技能添加麻痹触发逻辑 3. 配置闪电系技能默认30%麻痹概率 4. 更新英雄技能说明与配置参数
This commit is contained in:
@@ -32,6 +32,7 @@ export enum Attrs {
|
|||||||
freeze_res = "freeze_res", // 冰冻抗性
|
freeze_res = "freeze_res", // 冰冻抗性
|
||||||
stun_chance = "stun_chance", // 击晕概率
|
stun_chance = "stun_chance", // 击晕概率
|
||||||
stun_res = "stun_res", // 击晕抗性
|
stun_res = "stun_res", // 击晕抗性
|
||||||
|
paralyze_chance = "paralyze_chance", // 麻痹概率(百分点,雷电技能默认附带 30)
|
||||||
knockback_chance = "knockback_chance", // 击退强化(原击退概率,现转换为击退距离增量)
|
knockback_chance = "knockback_chance", // 击退强化(原击退概率,现转换为击退距离增量)
|
||||||
knockback_distance = "knockback_distance", // 击退距离强化
|
knockback_distance = "knockback_distance", // 击退距离强化
|
||||||
knockback_res = "knockback_res", // 击退抗性
|
knockback_res = "knockback_res", // 击退抗性
|
||||||
|
|||||||
@@ -150,6 +150,7 @@ export interface SkillConfig {
|
|||||||
crt?: number, // 额外暴击率
|
crt?: number, // 额外暴击率
|
||||||
frz?: number, // 额外冰冻概率
|
frz?: number, // 额外冰冻概率
|
||||||
stun?: number, // 额外击晕概率
|
stun?: number, // 额外击晕概率
|
||||||
|
para?: number, // 额外麻痹概率(雷电系技能默认 30)
|
||||||
bck?: number, // 额外击退强化(击退距离增量)
|
bck?: number, // 额外击退强化(击退距离增量)
|
||||||
buff_type?: Attrs, // Buff 类型 (单一职责)
|
buff_type?: Attrs, // Buff 类型 (单一职责)
|
||||||
timed_buff_id?: number, // 计时性 buff 配置 id(指向 BuffList),存在时走 buffManager 而非永久 add_*
|
timed_buff_id?: number, // 计时性 buff 配置 id(指向 BuffList),存在时走 buffManager 而非永久 add_*
|
||||||
@@ -168,6 +169,7 @@ export interface SkillOverrides {
|
|||||||
crt?: number;
|
crt?: number;
|
||||||
frz?: number;
|
frz?: number;
|
||||||
stun?: number;
|
stun?: number;
|
||||||
|
para?: number;
|
||||||
bck?: number;
|
bck?: number;
|
||||||
buff_type?: Attrs;
|
buff_type?: Attrs;
|
||||||
timed_buff_id?: number;
|
timed_buff_id?: number;
|
||||||
@@ -264,8 +266,8 @@ export const SkillSet: Record<number, SkillConfig> = {
|
|||||||
},
|
},
|
||||||
6013: {
|
6013: {
|
||||||
uuid: 6013, name: "闪电术", sp_name: "fb-7", icon: "Stat_FireDamage", TGroup: TGroup.Enemy, readyAnm: "", endAnm: "", act: "atk",
|
uuid: 6013, name: "闪电术", sp_name: "fb-7", 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,
|
DTType: DTType.single, stun: 0, para: 30, ap: 100, hit_count: 2, hitcd: 0.3, speed: 720, with: 90, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.remote,
|
||||||
RType: RType.fixedEnd, EType: EType.collision, info: "造成攻击力100%的伤害, 一定几率暴击, 高阶技能",
|
RType: RType.fixedEnd, EType: EType.collision, info: "造成攻击力100%的伤害, 30%概率麻痹, 高阶技能",
|
||||||
},
|
},
|
||||||
6014: {
|
6014: {
|
||||||
uuid: 6014, name: "火球术", sp_name: "fb-1", icon: "Stat_FireDamage", TGroup: TGroup.Enemy, readyAnm: "", endAnm: "", act: "atk",
|
uuid: 6014, name: "火球术", sp_name: "fb-1", icon: "Stat_FireDamage", TGroup: TGroup.Enemy, readyAnm: "", endAnm: "", act: "atk",
|
||||||
@@ -327,8 +329,8 @@ export const SkillSet: Record<number, SkillConfig> = {
|
|||||||
},
|
},
|
||||||
6106: {
|
6106: {
|
||||||
uuid: 6106, name: "闪电斩", sp_name: "atk5", icon: "Stat_Attack_01", TGroup: TGroup.Enemy, readyAnm: "", endAnm: "", act: "max0",
|
uuid: 6106, name: "闪电斩", sp_name: "atk5", icon: "Stat_Attack_01", TGroup: TGroup.Enemy, readyAnm: "", endAnm: "", act: "max0",
|
||||||
DTType: DTType.single, ap: 150, hit_count: 5, hitcd: 0.2, speed: 720, with: 0, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.Melee, is_accel: true,
|
DTType: DTType.single, para: 30, ap: 150, hit_count: 5, hitcd: 0.2, speed: 720, with: 0, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.Melee, is_accel: true,
|
||||||
RType: RType.bezier, EType: EType.collision, info: "对周围的敌人造成攻击力150%的伤害",//英雄配置技能的时候,可以疲惫触发6013闪电术
|
RType: RType.bezier, EType: EType.collision, info: "对周围的敌人造成攻击力150%的伤害, 30%概率麻痹",//英雄配置技能的时候,可以疲惫触发6013闪电术
|
||||||
},
|
},
|
||||||
// 远程群体攻击
|
// 远程群体攻击
|
||||||
6107: {
|
6107: {
|
||||||
@@ -355,8 +357,8 @@ export const SkillSet: Record<number, SkillConfig> = {
|
|||||||
},
|
},
|
||||||
6111: {
|
6111: {
|
||||||
uuid: 6111, name: "群体闪电", sp_name: "maxm3", icon: "Stat_FireDamage", TGroup: TGroup.Enemy, readyAnm: "", endAnm: "", act: "atk",
|
uuid: 6111, name: "群体闪电", sp_name: "maxm3", icon: "Stat_FireDamage", TGroup: TGroup.Enemy, readyAnm: "", endAnm: "", act: "atk",
|
||||||
DTType: DTType.single, stun: 0, ap: 100, hit_count: 1, hitcd: 0.3, speed: 720, with: 90, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.remote,
|
DTType: DTType.single, stun: 0, para: 30, ap: 100, hit_count: 1, hitcd: 0.3, speed: 720, with: 90, ready: 0.2, EAnm: 0, DAnm: "", IType: IType.remote,
|
||||||
RType: RType.fixedEnd, EType: EType.collision, info: "造成攻击力100%的伤害, 一定几率暴击, 高阶技能",
|
RType: RType.fixedEnd, EType: EType.collision, info: "造成攻击力100%的伤害, 30%概率麻痹, 高阶技能",
|
||||||
},
|
},
|
||||||
//============================= ====== 辅助技能 回合技能 ====== ==========================
|
//============================= ====== 辅助技能 回合技能 ====== ==========================
|
||||||
6301: {
|
6301: {
|
||||||
|
|||||||
@@ -411,7 +411,7 @@ export interface LvBonusEntry {
|
|||||||
export const HeroInfo: Record<number, heroInfo> = {
|
export const HeroInfo: Record<number, heroInfo> = {
|
||||||
// ========== 几何王国复刻英雄(5001~5009,依据 英雄设计指引.md) ==========
|
// ========== 几何王国复刻英雄(5001~5009,依据 英雄设计指引.md) ==========
|
||||||
|
|
||||||
// 5001 紫电魔女 — atking 击晕 + 大招 6111 群体闪电(击退/击晕)+ 攻击光环(深渊女王复刻)
|
// 5001 紫电魔女 — atking 麻痹 + 大招 6111 群体闪电(击退/麻痹)+ 攻击光环(深渊女王复刻)
|
||||||
5001: {
|
5001: {
|
||||||
uuid: 5001, name: "紫电魔女", path: "hm1", fac: FacSet.HERO, card_lv: 4, lv: 1, type: HType.Long, grow_type: HGrowType.Mage, role: HRole.Mage, hp: HERO_ROLE_BASE[HRole.Mage].hp - 5, ap: HERO_ROLE_BASE[HRole.Mage].ap + 10, def: HERO_ROLE_BASE[HRole.Mage].def,
|
uuid: 5001, name: "紫电魔女", path: "hm1", fac: FacSet.HERO, card_lv: 4, lv: 1, type: HType.Long, grow_type: HGrowType.Mage, role: HRole.Mage, hp: HERO_ROLE_BASE[HRole.Mage].hp - 5, ap: HERO_ROLE_BASE[HRole.Mage].ap + 10, def: HERO_ROLE_BASE[HRole.Mage].def,
|
||||||
skills: {
|
skills: {
|
||||||
@@ -419,30 +419,30 @@ export const HeroInfo: Record<number, heroInfo> = {
|
|||||||
// 大招:群体闪电,独立 cd,按英雄等级分档成长
|
// 大招:群体闪电,独立 cd,按英雄等级分档成长
|
||||||
6111: {
|
6111: {
|
||||||
uuid: 6111, lv: 1, cd: 8, ccd: 0,
|
uuid: 6111, lv: 1, cd: 8, ccd: 0,
|
||||||
overrides: { ap: 250, bck: 30 },
|
overrides: { ap: 250, bck: 30, para: 40 },
|
||||||
lv_entries: [
|
lv_entries: [
|
||||||
{ lv: 3, s_lv: SkillLv.Lv2, overrides: { ap: 250, bck: 60 } },
|
{ lv: 3, s_lv: SkillLv.Lv2, overrides: { ap: 250, bck: 60, para: 40 } },
|
||||||
{ lv: 5, s_lv: SkillLv.Lv3, overrides: { ap: 300, bck: 90, timed_buff_id: 7005 } },
|
{ lv: 5, s_lv: SkillLv.Lv3, overrides: { ap: 300, bck: 90, timed_buff_id: 7005, para: 50 } },
|
||||||
{ lv: 7, s_lv: SkillLv.Lv4, overrides: { ap: 400, timed_buff_id: 7004 } },
|
{ lv: 7, s_lv: SkillLv.Lv4, overrides: { ap: 400, timed_buff_id: 7025, para: 70 } },
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
atking: {
|
atking: {
|
||||||
6013: [
|
6013: [
|
||||||
{ lv: 2, s_lv: SkillLv.Lv1, t_num: 3, overrides: { timed_buff_id: 7004 } },
|
{ lv: 2, s_lv: SkillLv.Lv1, t_num: 3, overrides: { para: 100 } },
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
field: [
|
field: [
|
||||||
{ lv: 9, uuids: [{ uuid: 7002, value: 0.15 }] },
|
{ lv: 9, uuids: [{ uuid: 7002, value: 0.15 }] },
|
||||||
],
|
],
|
||||||
infos: [
|
infos: [
|
||||||
"解锁闪电术:造成攻击力100%的伤害",
|
"解锁闪电术:造成攻击力100%的伤害,30%概率麻痹",
|
||||||
"解锁群体闪电:对敌人造成攻击力250%的伤害并击退30",
|
"解锁群体闪电:对敌人造成攻击力250%的伤害并击退30,40%概率麻痹",
|
||||||
"电击精通:普攻每3次附加击晕(≈33%概率)",
|
"电击精通:普攻每3次必定麻痹目标",
|
||||||
"群体闪电强化:击退提升至60",
|
"群体闪电强化:击退提升至60",
|
||||||
"雷暴领域:群体闪电附带中毒,伤害300%且击退90",
|
"雷暴领域:群体闪电附带中毒,伤害300%且击退90,50%概率麻痹",
|
||||||
"—",
|
"—",
|
||||||
"雷霆万钧:群体闪电伤害400%且命中附加击晕",
|
"雷霆万钧:群体闪电伤害400%,命中附加麻痹(70%概率)",
|
||||||
"—",
|
"—",
|
||||||
"魔女威压:全队攻击光环+15%",
|
"魔女威压:全队攻击光环+15%",
|
||||||
],
|
],
|
||||||
@@ -493,11 +493,11 @@ export const HeroInfo: Record<number, heroInfo> = {
|
|||||||
// 大招:闪电斩,独立 cd,按英雄等级分档成长
|
// 大招:闪电斩,独立 cd,按英雄等级分档成长
|
||||||
6106: {
|
6106: {
|
||||||
uuid: 6106, lv: 1, cd: 8, ccd: 0,
|
uuid: 6106, lv: 1, cd: 8, ccd: 0,
|
||||||
overrides: { ap: 150 },
|
overrides: { ap: 150, para: 40 },
|
||||||
lv_entries: [
|
lv_entries: [
|
||||||
{ lv: 3, s_lv: SkillLv.Lv2, overrides: { ap: 150, timed_buff_id: 7006 } },
|
{ lv: 3, s_lv: SkillLv.Lv2, overrides: { ap: 150, timed_buff_id: 7006, para: 40 } },
|
||||||
{ lv: 5, s_lv: SkillLv.Lv3, overrides: { ap: 180, timed_buff_id: 7006, buff_value: -15 } },
|
{ lv: 5, s_lv: SkillLv.Lv3, overrides: { ap: 180, timed_buff_id: 7006, buff_value: -15, para: 50 } },
|
||||||
{ lv: 7, s_lv: SkillLv.Lv4, overrides: { ap: 200, hit_count: 6, bck: 40 } },
|
{ lv: 7, s_lv: SkillLv.Lv4, overrides: { ap: 200, hit_count: 6, bck: 40, para: 60 } },
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -516,12 +516,12 @@ export const HeroInfo: Record<number, heroInfo> = {
|
|||||||
],
|
],
|
||||||
infos: [
|
infos: [
|
||||||
"解锁攻击:造成攻击力100%的伤害",
|
"解锁攻击:造成攻击力100%的伤害",
|
||||||
"解锁闪电斩:对周围敌人造成攻击力150%的伤害",
|
"解锁闪电斩:对周围敌人造成攻击力150%的伤害,40%概率麻痹",
|
||||||
"三十六烦恼凤:入场释放高伤剑气(攻击力500%)",
|
"三十六烦恼凤:入场释放高伤剑气(攻击力500%)",
|
||||||
"闪电斩强化:命中降低敌方攻击",
|
"闪电斩强化:命中降低敌方攻击",
|
||||||
"罗生门:受击每4次获得2层护盾,闪电斩伤害180%且减攻强化",
|
"罗生门:受击每4次获得2层护盾,闪电斩伤害180%且减攻强化(50%概率麻痹)",
|
||||||
"—",
|
"—",
|
||||||
"炼狱鬼斩:闪电斩伤害200%,6命中并击退40",
|
"炼狱鬼斩:闪电斩伤害200%,6命中并击退40(60%概率麻痹)",
|
||||||
"—",
|
"—",
|
||||||
"攻击强化:攻击触发技能次数+1",
|
"攻击强化:攻击触发技能次数+1",
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -202,6 +202,10 @@ export class HeroAtkSystem extends ecs.ComblockSystem implements ecs.ISystemUpda
|
|||||||
const stunChance = (damageEvent.Attrs[Attrs.stun_chance] || 0) - TAttrsComp.getFinalStunRes();
|
const stunChance = (damageEvent.Attrs[Attrs.stun_chance] || 0) - TAttrsComp.getFinalStunRes();
|
||||||
const isStun = !TAttrsComp.isStun() && this.checkChance(stunChance);
|
const isStun = !TAttrsComp.isStun() && this.checkChance(stunChance);
|
||||||
|
|
||||||
|
// 麻痹判定(无麻痹抗性,仅按概率)
|
||||||
|
const paralyzeChance = damageEvent.Attrs[Attrs.paralyze_chance] || 0;
|
||||||
|
const isParalyze = !TAttrsComp.isParalyze() && this.checkChance(paralyzeChance);
|
||||||
|
|
||||||
// ✅ 触发视图层表现(伤害数字、受击动画、冰冻、击晕、击退)
|
// ✅ 触发视图层表现(伤害数字、受击动画、冰冻、击晕、击退)
|
||||||
if (targetView) {
|
if (targetView) {
|
||||||
if (isDot) {
|
if (isDot) {
|
||||||
@@ -242,6 +246,9 @@ export class HeroAtkSystem extends ecs.ComblockSystem implements ecs.ISystemUpda
|
|||||||
smc.vmdata.scores.stun_count++;
|
smc.vmdata.scores.stun_count++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (isParalyze) {
|
||||||
|
TAttrsComp.toParalyze();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 命中附带 debuff(如灼烧 DoT):仅普攻路径,复用友方 timed_buff_id 机制;
|
// 命中附带 debuff(如灼烧 DoT):仅普攻路径,复用友方 timed_buff_id 机制;
|
||||||
|
|||||||
@@ -81,6 +81,7 @@ export class HeroAttrsComp extends ecs.Comp {
|
|||||||
freeze_res: number = 0; // 冰冻抗性
|
freeze_res: number = 0; // 冰冻抗性
|
||||||
stun_chance: number = 0; // 击晕概率
|
stun_chance: number = 0; // 击晕概率
|
||||||
stun_res: number = 0; // 击晕抗性
|
stun_res: number = 0; // 击晕抗性
|
||||||
|
paralyze_chance: number = 0; // 麻痹概率(雷电技能默认 para=30,此处为基础/光环加成)
|
||||||
knockback_chance: number = 0; // 击退强化(原击退概率,现转换为击退距离增量)
|
knockback_chance: number = 0; // 击退强化(原击退概率,现转换为击退距离增量)
|
||||||
knockback_distance: number = 0; // 击退距离强化
|
knockback_distance: number = 0; // 击退距离强化
|
||||||
knockback_res: number = 0; // 击退抗性(削减击退距离增量)
|
knockback_res: number = 0; // 击退抗性(削减击退距离增量)
|
||||||
@@ -459,6 +460,12 @@ export class HeroAttrsComp extends ecs.Comp {
|
|||||||
return base + mods.flatSum + mods.pctSum;
|
return base + mods.flatSum + mods.pctSum;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** 最终麻痹概率 = 基础 + 限时修饰(加法模型),雷电技能默认再叠加技能自身 para=30 */
|
||||||
|
public getFinalParalyzeChance(): number {
|
||||||
|
const mods = this.aggregateTimedMods(Attrs.paralyze_chance);
|
||||||
|
return this.paralyze_chance + mods.flatSum + mods.pctSum;
|
||||||
|
}
|
||||||
|
|
||||||
/** 最终击退强化 = 基础击退强化 + 限时修饰(加法模型,转换为击退距离增量) */
|
/** 最终击退强化 = 基础击退强化 + 限时修饰(加法模型,转换为击退距离增量) */
|
||||||
public getFinalKnockbackChance(): number {
|
public getFinalKnockbackChance(): number {
|
||||||
const mods = this.aggregateTimedMods(Attrs.knockback_chance);
|
const mods = this.aggregateTimedMods(Attrs.knockback_chance);
|
||||||
@@ -642,6 +649,7 @@ export class HeroAttrsComp extends ecs.Comp {
|
|||||||
this.freeze_res = 0;
|
this.freeze_res = 0;
|
||||||
this.stun_chance = 0;
|
this.stun_chance = 0;
|
||||||
this.stun_res = 0;
|
this.stun_res = 0;
|
||||||
|
this.paralyze_chance = 0;
|
||||||
this.knockback_chance = 0;
|
this.knockback_chance = 0;
|
||||||
this.knockback_distance = 0;
|
this.knockback_distance = 0;
|
||||||
this.knockback_res = 0;
|
this.knockback_res = 0;
|
||||||
|
|||||||
@@ -122,6 +122,7 @@ export class SCastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate
|
|||||||
mockAttrs.critical = 0;
|
mockAttrs.critical = 0;
|
||||||
mockAttrs.freeze_chance = 0;
|
mockAttrs.freeze_chance = 0;
|
||||||
mockAttrs.stun_chance = 0;
|
mockAttrs.stun_chance = 0;
|
||||||
|
mockAttrs.paralyze_chance = 0;
|
||||||
mockAttrs.puncture_chance = 0;
|
mockAttrs.puncture_chance = 0;
|
||||||
mockAttrs.fac = FacSet.HERO;
|
mockAttrs.fac = FacSet.HERO;
|
||||||
mockAttrs.type = HType.Long; // 假定为远程,拥有较长索敌范围
|
mockAttrs.type = HType.Long; // 假定为远程,拥有较长索敌范围
|
||||||
|
|||||||
@@ -220,6 +220,7 @@ export class Skill extends ecs.Entity {
|
|||||||
const sCrt = config.crt ?? 0;
|
const sCrt = config.crt ?? 0;
|
||||||
const sFrz = config.frz ?? 0;
|
const sFrz = config.frz ?? 0;
|
||||||
const sStun = config.stun ?? 0;
|
const sStun = config.stun ?? 0;
|
||||||
|
const sPara = config.para ?? 0;
|
||||||
const sBck = config.bck ?? 0;
|
const sBck = config.bck ?? 0;
|
||||||
const sAp = config.ap;
|
const sAp = config.ap;
|
||||||
const sHit = config.hit_count;
|
const sHit = config.hit_count;
|
||||||
@@ -228,6 +229,7 @@ export class Skill extends ecs.Entity {
|
|||||||
sDataCom.Attrs[Attrs.critical_damage] = cAttrsComp.getFinalCritDamage();
|
sDataCom.Attrs[Attrs.critical_damage] = cAttrsComp.getFinalCritDamage();
|
||||||
sDataCom.Attrs[Attrs.freeze_chance] = cAttrsComp.getFinalFreezeChance() + sFrz;
|
sDataCom.Attrs[Attrs.freeze_chance] = cAttrsComp.getFinalFreezeChance() + sFrz;
|
||||||
sDataCom.Attrs[Attrs.stun_chance] = cAttrsComp.getFinalStunChance() + sStun;
|
sDataCom.Attrs[Attrs.stun_chance] = cAttrsComp.getFinalStunChance() + sStun;
|
||||||
|
sDataCom.Attrs[Attrs.paralyze_chance] = cAttrsComp.getFinalParalyzeChance() + sPara;
|
||||||
sDataCom.Attrs[Attrs.knockback_chance] = cAttrsComp.getFinalKnockbackChance() + sBck;
|
sDataCom.Attrs[Attrs.knockback_chance] = cAttrsComp.getFinalKnockbackChance() + sBck;
|
||||||
sDataCom.Attrs[Attrs.knockback_distance] = cAttrsComp.getFinalKnockbackDistance();
|
sDataCom.Attrs[Attrs.knockback_distance] = cAttrsComp.getFinalKnockbackDistance();
|
||||||
sDataCom.Attrs[Attrs.puncture_chance] = cAttrsComp.getFinalPunctureChance(); // 初始化携带施法者的穿透概率
|
sDataCom.Attrs[Attrs.puncture_chance] = cAttrsComp.getFinalPunctureChance(); // 初始化携带施法者的穿透概率
|
||||||
|
|||||||
Reference in New Issue
Block a user