Compare commits
2 Commits
d6e8cb4828
...
54591c78dd
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
54591c78dd | ||
|
|
5585149b12 |
@@ -7,11 +7,11 @@
|
||||
"embeddedPlayerGroups": []
|
||||
},
|
||||
"_native": "",
|
||||
"sample": 24,
|
||||
"sample": 20,
|
||||
"speed": 1,
|
||||
"wrapMode": 1,
|
||||
"enableTrsBlending": false,
|
||||
"_duration": 0.2916666666666667,
|
||||
"_duration": 0.35,
|
||||
"_hash": 500763545,
|
||||
"_tracks": [
|
||||
{
|
||||
@@ -19,7 +19,18 @@
|
||||
}
|
||||
],
|
||||
"_exoticAnimation": null,
|
||||
"_events": [],
|
||||
"_events": [
|
||||
{
|
||||
"frame": 0.15,
|
||||
"func": "",
|
||||
"params": []
|
||||
},
|
||||
{
|
||||
"frame": 0.15,
|
||||
"func": "atk",
|
||||
"params": []
|
||||
}
|
||||
],
|
||||
"_embeddedPlayers": [],
|
||||
"_additiveSettings": {
|
||||
"__id__": 7
|
||||
@@ -69,12 +80,12 @@
|
||||
"__type__": "cc.ObjectCurve",
|
||||
"_times": [
|
||||
0,
|
||||
0.041666666666666664,
|
||||
0.08333333333333333,
|
||||
0.125,
|
||||
0.16666666666666666,
|
||||
0.20833333333333334,
|
||||
0.25
|
||||
0.05,
|
||||
0.1,
|
||||
0.15,
|
||||
0.2,
|
||||
0.25,
|
||||
0.3
|
||||
],
|
||||
"_values": [
|
||||
{
|
||||
|
||||
@@ -96,7 +96,7 @@
|
||||
"_lpos": {
|
||||
"__type__": "cc.Vec3",
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"y": -55,
|
||||
"z": 0
|
||||
},
|
||||
"_lrot": {
|
||||
@@ -137,7 +137,7 @@
|
||||
"_contentSize": {
|
||||
"__type__": "cc.Size",
|
||||
"width": 65,
|
||||
"height": 600
|
||||
"height": 330
|
||||
},
|
||||
"_anchorPoint": {
|
||||
"__type__": "cc.Vec2",
|
||||
@@ -178,7 +178,7 @@
|
||||
},
|
||||
"_type": 0,
|
||||
"_fillType": 0,
|
||||
"_sizeMode": 0,
|
||||
"_sizeMode": 1,
|
||||
"_fillCenter": {
|
||||
"__type__": "cc.Vec2",
|
||||
"x": 0,
|
||||
@@ -251,10 +251,10 @@
|
||||
"__prefab": {
|
||||
"__id__": 11
|
||||
},
|
||||
"atk_x": 20,
|
||||
"atk_y": 20,
|
||||
"atk_x": 0,
|
||||
"atk_y": 0,
|
||||
"runType": 3,
|
||||
"endType": 2,
|
||||
"endType": 0,
|
||||
"speed": 720,
|
||||
"time": 0,
|
||||
"distance": 0,
|
||||
@@ -323,7 +323,7 @@
|
||||
"_offset": {
|
||||
"__type__": "cc.Vec2",
|
||||
"x": 0,
|
||||
"y": 0
|
||||
"y": 50
|
||||
},
|
||||
"_size": {
|
||||
"__type__": "cc.Size",
|
||||
|
||||
@@ -96,7 +96,7 @@
|
||||
"_lpos": {
|
||||
"__type__": "cc.Vec3",
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"y": -30,
|
||||
"z": 0
|
||||
},
|
||||
"_lrot": {
|
||||
@@ -108,7 +108,7 @@
|
||||
},
|
||||
"_lscale": {
|
||||
"__type__": "cc.Vec3",
|
||||
"x": 1,
|
||||
"x": 0.9,
|
||||
"y": 1,
|
||||
"z": 1
|
||||
},
|
||||
@@ -137,7 +137,7 @@
|
||||
"_contentSize": {
|
||||
"__type__": "cc.Size",
|
||||
"width": 65,
|
||||
"height": 600
|
||||
"height": 330
|
||||
},
|
||||
"_anchorPoint": {
|
||||
"__type__": "cc.Vec2",
|
||||
@@ -178,7 +178,7 @@
|
||||
},
|
||||
"_type": 0,
|
||||
"_fillType": 0,
|
||||
"_sizeMode": 0,
|
||||
"_sizeMode": 1,
|
||||
"_fillCenter": {
|
||||
"__type__": "cc.Vec2",
|
||||
"x": 0,
|
||||
@@ -251,10 +251,10 @@
|
||||
"__prefab": {
|
||||
"__id__": 11
|
||||
},
|
||||
"atk_x": 20,
|
||||
"atk_y": 20,
|
||||
"atk_x": 0,
|
||||
"atk_y": 0,
|
||||
"runType": 3,
|
||||
"endType": 2,
|
||||
"endType": 0,
|
||||
"speed": 720,
|
||||
"time": 0,
|
||||
"distance": 0,
|
||||
|
||||
@@ -761,13 +761,17 @@
|
||||
"__prefab": {
|
||||
"__id__": 33
|
||||
},
|
||||
"atk_x": 20,
|
||||
"atk_x": 60,
|
||||
"atk_y": 40,
|
||||
"runType": 2,
|
||||
"endType": 0,
|
||||
"speed": 720,
|
||||
"time": 0,
|
||||
"distance": 0,
|
||||
"forceStartX": -1,
|
||||
"forceStartY": -1,
|
||||
"summon_count": 1,
|
||||
"height_offset": 0,
|
||||
"_id": ""
|
||||
},
|
||||
{
|
||||
|
||||
@@ -2120,8 +2120,8 @@
|
||||
"__prefab": {
|
||||
"__id__": 97
|
||||
},
|
||||
"atk_x": 20,
|
||||
"atk_y": 40,
|
||||
"atk_x": 0,
|
||||
"atk_y": 10,
|
||||
"runType": 2,
|
||||
"endType": 0,
|
||||
"speed": 720,
|
||||
@@ -2129,6 +2129,8 @@
|
||||
"distance": 0,
|
||||
"forceStartX": 0,
|
||||
"forceStartY": -1,
|
||||
"summon_count": 1,
|
||||
"height_offset": 0,
|
||||
"_id": ""
|
||||
},
|
||||
{
|
||||
|
||||
@@ -59,6 +59,7 @@ export const DEBUFF_ICON_MAP: Record<number, DebuffIcon> = {
|
||||
7006: DebuffIcon.AttackDebuff, // 减攻
|
||||
7007: DebuffIcon.Blood, // 出血
|
||||
7008: DebuffIcon.Penetration, // 破甲
|
||||
7025: DebuffIcon.LightningDamag, // 麻痹(雷系图标,注意 prefab 原始拼写少个 e)
|
||||
};
|
||||
|
||||
/** 易伤 buff 的 id(HeroAtkSystem 结算时按此 id 汇总易伤值) */
|
||||
@@ -79,7 +80,7 @@ export interface BuffConfig {
|
||||
modifiers?: BuffModifier[];
|
||||
tick?: BuffTickEffect;
|
||||
is_control?: boolean;
|
||||
control_kind?: 'frost' | 'stun' | 'none';
|
||||
control_kind?: 'frost' | 'stun' | 'paralyze' | 'none';
|
||||
info: string;
|
||||
}
|
||||
|
||||
@@ -107,12 +108,12 @@ export const BuffList: Record<number, BuffConfig> = {
|
||||
is_control: true, control_kind: 'frost',
|
||||
info: "冰冻目标,无法行动",
|
||||
},
|
||||
// 击晕(控制)
|
||||
// 击晕(短控:施加瞬间技能 CD 削减 20%,持续期间 CD 停止增长)
|
||||
7004: {
|
||||
id: 7004, name: "击晕", icon: "Stat_Stun",
|
||||
category: BuffCategory.Control, duration: 2, max_stack: 1,
|
||||
category: BuffCategory.Control, duration: 1, max_stack: 1,
|
||||
is_control: true, control_kind: 'stun',
|
||||
info: "击晕目标,无法行动",
|
||||
info: "击晕目标 1 秒,无法行动,技能 CD 削减 20% 并停止增长",
|
||||
},
|
||||
// 中毒(纯伤害 DoT,可叠层)
|
||||
7005: {
|
||||
@@ -242,4 +243,20 @@ export const BuffList: Record<number, BuffConfig> = {
|
||||
modifiers: [{ attr: Attrs.defense, op: ModOp.PercentAdd, value: 100 }],
|
||||
info: "防御提升 100,持续 5 秒",
|
||||
},
|
||||
|
||||
// ==================== 控制 / 麻痹系 ====================
|
||||
// 麻痹(控制:技能 CD 增长减速 50%,可被麻痹强化 buff 提升,累计达 100% 则停止增长)
|
||||
7025: {
|
||||
id: 7025, name: "麻痹", icon: "Stat_LightningDamag",
|
||||
category: BuffCategory.Control, duration: 5, max_stack: 1,
|
||||
is_control: true, control_kind: 'paralyze',
|
||||
info: "麻痹目标,技能 CD 增长减慢 50%,持续 5 秒",
|
||||
},
|
||||
// 麻痹强化(提升麻痹对技能 CD 的减速量,与麻痹基础减速按百分点叠加)
|
||||
7026: {
|
||||
id: 7026, name: "麻痹强化", icon: "Stat_LightningDamag",
|
||||
category: BuffCategory.Buff, duration: 5, max_stack: 1,
|
||||
modifiers: [{ attr: Attrs.paralyze_power, op: ModOp.PercentAdd, value: 30 }],
|
||||
info: "麻痹对技能 CD 的减速量额外提升 30%,持续 5 秒",
|
||||
},
|
||||
};
|
||||
|
||||
@@ -40,7 +40,13 @@ export enum FightSet {
|
||||
BACK_RANG = 20,//后退范围
|
||||
FiIGHT_TIME = 30,//战斗时间
|
||||
FROST_TIME = 3,//冰冻时间
|
||||
STUN_TIME = 2,//击晕时间
|
||||
STUN_TIME = 1,//击晕时间(短控:施加瞬间 CD 削减,期间 CD 停止增长)
|
||||
/** 麻痹持续时间(秒) */
|
||||
PARALYZE_TIME = 5,
|
||||
/** 麻痹对技能 CD 增长的基础减速量(百分点,可被麻痹强化 buff 提升,达 100 则停止增长) */
|
||||
PARALYZE_CD_SLOW = 50,
|
||||
/** 击晕施加瞬间的技能 CD 削减量(百分点,20 表示 ccd × 0.8) */
|
||||
STUN_CD_CUT = 20,
|
||||
SKILL_CAST_DELAY = 0.15,
|
||||
/** 多发/召唤技能每次实例化之间的间隔(秒),首个立即执行 */
|
||||
SUMMON_INTERVAL = 0.12,
|
||||
|
||||
@@ -32,6 +32,7 @@ export enum Attrs {
|
||||
freeze_res = "freeze_res", // 冰冻抗性
|
||||
stun_chance = "stun_chance", // 击晕概率
|
||||
stun_res = "stun_res", // 击晕抗性
|
||||
paralyze_chance = "paralyze_chance", // 麻痹概率(百分点,雷电技能默认附带 30)
|
||||
knockback_chance = "knockback_chance", // 击退强化(原击退概率,现转换为击退距离增量)
|
||||
knockback_distance = "knockback_distance", // 击退距离强化
|
||||
knockback_res = "knockback_res", // 击退抗性
|
||||
@@ -40,6 +41,7 @@ export enum Attrs {
|
||||
puncture_dmg_bonus = "puncture_dmg_bonus", // 穿透后伤害增量(百分点;最终穿透系数 = PUNCTURE_DMG_RATIO * (1 + bonus/100))
|
||||
wfuny = "wfuny", // 风怒
|
||||
vulnerable_res = "vulnerable_res", // 易伤抗性(百分比减免易伤附加伤害)
|
||||
paralyze_power = "paralyze_power", // 麻痹强化(百分点;提升麻痹对技能 CD 的减速量,累计达 100 则 CD 停止增长)
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -150,6 +150,7 @@ export interface SkillConfig {
|
||||
crt?: number, // 额外暴击率
|
||||
frz?: number, // 额外冰冻概率
|
||||
stun?: number, // 额外击晕概率
|
||||
para?: number, // 额外麻痹概率(雷电系技能默认 30)
|
||||
bck?: number, // 额外击退强化(击退距离增量)
|
||||
buff_type?: Attrs, // Buff 类型 (单一职责)
|
||||
timed_buff_id?: number, // 计时性 buff 配置 id(指向 BuffList),存在时走 buffManager 而非永久 add_*
|
||||
@@ -168,6 +169,7 @@ export interface SkillOverrides {
|
||||
crt?: number;
|
||||
frz?: number;
|
||||
stun?: number;
|
||||
para?: number;
|
||||
bck?: number;
|
||||
buff_type?: Attrs;
|
||||
timed_buff_id?: number;
|
||||
@@ -264,8 +266,8 @@ export const SkillSet: Record<number, SkillConfig> = {
|
||||
},
|
||||
6013: {
|
||||
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,
|
||||
RType: RType.fixedEnd, EType: EType.collision, info: "造成攻击力100%的伤害, 一定几率暴击, 高阶技能",
|
||||
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%的伤害, 30%概率麻痹, 高阶技能",
|
||||
},
|
||||
6014: {
|
||||
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: {
|
||||
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,
|
||||
RType: RType.bezier, EType: EType.collision, info: "对周围的敌人造成攻击力150%的伤害",//英雄配置技能的时候,可以疲惫触发6013闪电术
|
||||
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%的伤害, 30%概率麻痹",//英雄配置技能的时候,可以疲惫触发6013闪电术
|
||||
},
|
||||
// 远程群体攻击
|
||||
6107: {
|
||||
@@ -355,8 +357,8 @@ export const SkillSet: Record<number, SkillConfig> = {
|
||||
},
|
||||
6111: {
|
||||
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,
|
||||
RType: RType.fixedEnd, EType: EType.collision, info: "造成攻击力100%的伤害, 一定几率暴击, 高阶技能",
|
||||
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%的伤害, 30%概率麻痹, 高阶技能",
|
||||
},
|
||||
//============================= ====== 辅助技能 回合技能 ====== ==========================
|
||||
6301: {
|
||||
|
||||
@@ -411,7 +411,7 @@ export interface LvBonusEntry {
|
||||
export const HeroInfo: Record<number, heroInfo> = {
|
||||
// ========== 几何王国复刻英雄(5001~5009,依据 英雄设计指引.md) ==========
|
||||
|
||||
// 5001 紫电魔女 — atking 击晕 + 大招 6111 群体闪电(击退/击晕)+ 攻击光环(深渊女王复刻)
|
||||
// 5001 紫电魔女 — atking 麻痹 + 大招 6111 群体闪电(击退/麻痹)+ 攻击光环(深渊女王复刻)
|
||||
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,
|
||||
skills: {
|
||||
@@ -419,30 +419,30 @@ export const HeroInfo: Record<number, heroInfo> = {
|
||||
// 大招:群体闪电,独立 cd,按英雄等级分档成长
|
||||
6111: {
|
||||
uuid: 6111, lv: 1, cd: 8, ccd: 0,
|
||||
overrides: { ap: 250, bck: 30 },
|
||||
overrides: { ap: 250, bck: 30, para: 40 },
|
||||
lv_entries: [
|
||||
{ lv: 3, s_lv: SkillLv.Lv2, overrides: { ap: 250, bck: 60 } },
|
||||
{ lv: 5, s_lv: SkillLv.Lv3, overrides: { ap: 300, bck: 90, timed_buff_id: 7005 } },
|
||||
{ lv: 7, s_lv: SkillLv.Lv4, overrides: { ap: 400, timed_buff_id: 7004 } },
|
||||
{ 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, para: 50 } },
|
||||
{ lv: 7, s_lv: SkillLv.Lv4, overrides: { ap: 400, timed_buff_id: 7025, para: 70 } },
|
||||
],
|
||||
},
|
||||
},
|
||||
atking: {
|
||||
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: [
|
||||
{ lv: 9, uuids: [{ uuid: 7002, value: 0.15 }] },
|
||||
],
|
||||
infos: [
|
||||
"解锁闪电术:造成攻击力100%的伤害",
|
||||
"解锁群体闪电:对敌人造成攻击力250%的伤害并击退30",
|
||||
"电击精通:普攻每3次附加击晕(≈33%概率)",
|
||||
"解锁闪电术:造成攻击力100%的伤害,30%概率麻痹",
|
||||
"解锁群体闪电:对敌人造成攻击力250%的伤害并击退30,40%概率麻痹",
|
||||
"电击精通:普攻每3次必定麻痹目标",
|
||||
"群体闪电强化:击退提升至60",
|
||||
"雷暴领域:群体闪电附带中毒,伤害300%且击退90",
|
||||
"雷暴领域:群体闪电附带中毒,伤害300%且击退90,50%概率麻痹",
|
||||
"—",
|
||||
"雷霆万钧:群体闪电伤害400%且命中附加击晕",
|
||||
"雷霆万钧:群体闪电伤害400%,命中附加麻痹(70%概率)",
|
||||
"—",
|
||||
"魔女威压:全队攻击光环+15%",
|
||||
],
|
||||
@@ -493,11 +493,11 @@ export const HeroInfo: Record<number, heroInfo> = {
|
||||
// 大招:闪电斩,独立 cd,按英雄等级分档成长
|
||||
6106: {
|
||||
uuid: 6106, lv: 1, cd: 8, ccd: 0,
|
||||
overrides: { ap: 150 },
|
||||
overrides: { ap: 150, para: 40 },
|
||||
lv_entries: [
|
||||
{ lv: 3, s_lv: SkillLv.Lv2, overrides: { ap: 150, timed_buff_id: 7006 } },
|
||||
{ lv: 5, s_lv: SkillLv.Lv3, overrides: { ap: 180, timed_buff_id: 7006, buff_value: -15 } },
|
||||
{ lv: 7, s_lv: SkillLv.Lv4, overrides: { ap: 200, hit_count: 6, bck: 40 } },
|
||||
{ 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, para: 50 } },
|
||||
{ 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: [
|
||||
"解锁攻击:造成攻击力100%的伤害",
|
||||
"解锁闪电斩:对周围敌人造成攻击力150%的伤害",
|
||||
"解锁闪电斩:对周围敌人造成攻击力150%的伤害,40%概率麻痹",
|
||||
"三十六烦恼凤:入场释放高伤剑气(攻击力500%)",
|
||||
"闪电斩强化:命中降低敌方攻击",
|
||||
"罗生门:受击每4次获得2层护盾,闪电斩伤害180%且减攻强化",
|
||||
"罗生门:受击每4次获得2层护盾,闪电斩伤害180%且减攻强化(50%概率麻痹)",
|
||||
"—",
|
||||
"炼狱鬼斩:闪电斩伤害200%,6命中并击退40",
|
||||
"炼狱鬼斩:闪电斩伤害200%,6命中并击退40(60%概率麻痹)",
|
||||
"—",
|
||||
"攻击强化:攻击触发技能次数+1",
|
||||
],
|
||||
|
||||
@@ -110,7 +110,7 @@ class BuffManagerImpl {
|
||||
* 判断目标是否处于指定类型的控制状态下。
|
||||
* 唯一判定来源:BuffComp 中是否存在对应 control_kind 的活跃控制 buff。
|
||||
*/
|
||||
hasControl(target: ecs.Entity, kind: 'frost' | 'stun'): boolean {
|
||||
hasControl(target: ecs.Entity, kind: 'frost' | 'stun' | 'paralyze'): boolean {
|
||||
if (!target.has(BuffComp)) return false;
|
||||
const buffComp = target.get(BuffComp);
|
||||
for (const [buffId, layers] of buffComp.buffs) {
|
||||
|
||||
@@ -202,6 +202,10 @@ export class HeroAtkSystem extends ecs.ComblockSystem implements ecs.ISystemUpda
|
||||
const stunChance = (damageEvent.Attrs[Attrs.stun_chance] || 0) - TAttrsComp.getFinalStunRes();
|
||||
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 (isDot) {
|
||||
@@ -242,6 +246,9 @@ export class HeroAtkSystem extends ecs.ComblockSystem implements ecs.ISystemUpda
|
||||
smc.vmdata.scores.stun_count++;
|
||||
}
|
||||
}
|
||||
if (isParalyze) {
|
||||
TAttrsComp.toParalyze();
|
||||
}
|
||||
}
|
||||
|
||||
// 命中附带 debuff(如灼烧 DoT):仅普攻路径,复用友方 timed_buff_id 机制;
|
||||
|
||||
@@ -13,6 +13,7 @@ import { buffManager } from "./BuffManager";
|
||||
/** 控制类 buff 配置 id(对应 BuffList) */
|
||||
const BUFF_ID_FROST = 7003;
|
||||
const BUFF_ID_STUN = 7004;
|
||||
const BUFF_ID_PARALYZE = 7025;
|
||||
@ecs.register('HeroAttrs')
|
||||
export class HeroAttrsComp extends ecs.Comp {
|
||||
public debugMode: boolean = false;
|
||||
@@ -80,6 +81,7 @@ export class HeroAttrsComp extends ecs.Comp {
|
||||
freeze_res: number = 0; // 冰冻抗性
|
||||
stun_chance: number = 0; // 击晕概率
|
||||
stun_res: number = 0; // 击晕抗性
|
||||
paralyze_chance: number = 0; // 麻痹概率(雷电技能默认 para=30,此处为基础/光环加成)
|
||||
knockback_chance: number = 0; // 击退强化(原击退概率,现转换为击退距离增量)
|
||||
knockback_distance: number = 0; // 击退距离强化
|
||||
knockback_res: number = 0; // 击退抗性(削减击退距离增量)
|
||||
@@ -197,33 +199,39 @@ export class HeroAttrsComp extends ecs.Comp {
|
||||
buffManager.applyBuff(this.ent, BUFF_ID_FROST, 0, 0, { duration: FightSet.FROST_TIME * time });
|
||||
}
|
||||
|
||||
/** 施加击晕:委托 buffManager 写入 BuffComp,并清零技能 CD */
|
||||
/** 施加击晕:委托 buffManager 写入 BuffComp,并削减技能 CD(持续期间 CD 停止增长) */
|
||||
toStun(time: number = 1) {
|
||||
if (!this.ent) return;
|
||||
buffManager.applyBuff(this.ent, BUFF_ID_STUN, 0, 0, { duration: FightSet.STUN_TIME * time });
|
||||
|
||||
// 击晕时 CD 清零
|
||||
// 击晕瞬间技能 CD 削减 STUN_CD_CUT%(保留剩余进度,不再清零)
|
||||
const cutRate = 1 - FightSet.STUN_CD_CUT / 100;
|
||||
for (const key in this.skills) {
|
||||
const skill = this.skills[key];
|
||||
if (skill) {
|
||||
skill.ccd = 0;
|
||||
skill.ccd = Math.max(0, skill.ccd * cutRate);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
updateCD(dt: number) {
|
||||
// 如果处于冰冻状态,则技能 CD 暂停刷新
|
||||
if (this.isFrost()) return;
|
||||
/** 施加麻痹:委托 buffManager 写入 BuffComp,麻痹期间技能 CD 增长减速 */
|
||||
toParalyze(time: number = 1) {
|
||||
if (!this.ent) return;
|
||||
buffManager.applyBuff(this.ent, BUFF_ID_PARALYZE, 0, 0, { duration: FightSet.PARALYZE_TIME * time });
|
||||
}
|
||||
|
||||
// 如果处于击晕状态,则技能 CD 暂停刷新(且保持清零状态)
|
||||
if (this.isStun()) {
|
||||
for (const key in this.skills) {
|
||||
const skill = this.skills[key];
|
||||
if (skill) {
|
||||
skill.ccd = 0;
|
||||
}
|
||||
}
|
||||
return;
|
||||
updateCD(dt: number) {
|
||||
// 冰冻不影响 CD 值:冰冻状态下技能 CD 照常增长
|
||||
|
||||
// 击晕:CD 已在施加瞬间削减,击晕期间停止增长
|
||||
if (this.isStun()) return;
|
||||
|
||||
// 麻痹:CD 增长减速 = 基础减速 + 麻痹强化;累计达 100% 则停止增长
|
||||
let cdRate = 1;
|
||||
if (this.isParalyze()) {
|
||||
const slowPct = Math.min(100, FightSet.PARALYZE_CD_SLOW + this.getFinalParalyzePower());
|
||||
cdRate = 1 - slowPct / 100;
|
||||
if (cdRate <= 0) return;
|
||||
}
|
||||
|
||||
for (const key in this.skills) {
|
||||
@@ -238,7 +246,7 @@ export class HeroAttrsComp extends ecs.Comp {
|
||||
skill.ccd = actualCd;
|
||||
continue;
|
||||
}
|
||||
skill.ccd = Math.min(actualCd, skill.ccd + dt);
|
||||
skill.ccd = Math.min(actualCd, skill.ccd + dt * cdRate);
|
||||
}
|
||||
}
|
||||
/** 是否处于冰冻状态(统一走 BuffComp 判定) */
|
||||
@@ -249,6 +257,10 @@ export class HeroAttrsComp extends ecs.Comp {
|
||||
isStun(): boolean {
|
||||
return !!this.ent && buffManager.hasControl(this.ent, 'stun');
|
||||
}
|
||||
/** 是否处于麻痹状态(统一走 BuffComp 判定) */
|
||||
isParalyze(): boolean {
|
||||
return !!this.ent && buffManager.hasControl(this.ent, 'paralyze');
|
||||
}
|
||||
getSkillLevel(skillId: number): number {
|
||||
if (!skillId) return 0;
|
||||
return this.skills[skillId]?.lv ?? 0;
|
||||
@@ -448,6 +460,12 @@ export class HeroAttrsComp extends ecs.Comp {
|
||||
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 {
|
||||
const mods = this.aggregateTimedMods(Attrs.knockback_chance);
|
||||
@@ -518,6 +536,12 @@ export class HeroAttrsComp extends ecs.Comp {
|
||||
return this.vulnerable_res + mods.flatSum + mods.pctSum;
|
||||
}
|
||||
|
||||
/** 最终麻痹强化 = 限时修饰(加法模型),提升麻痹对技能 CD 的减速量(百分点) */
|
||||
public getFinalParalyzePower(): number {
|
||||
const mods = this.aggregateTimedMods(Attrs.paralyze_power);
|
||||
return mods.flatSum + mods.pctSum;
|
||||
}
|
||||
|
||||
/** 最终防御值 = 基础 + 限时修饰(加法模型),供除法递减减伤公式使用 */
|
||||
public getFinalDefense(): number {
|
||||
const mods = this.aggregateTimedMods(Attrs.defense);
|
||||
@@ -625,6 +649,7 @@ export class HeroAttrsComp extends ecs.Comp {
|
||||
this.freeze_res = 0;
|
||||
this.stun_chance = 0;
|
||||
this.stun_res = 0;
|
||||
this.paralyze_chance = 0;
|
||||
this.knockback_chance = 0;
|
||||
this.knockback_distance = 0;
|
||||
this.knockback_res = 0;
|
||||
|
||||
@@ -122,6 +122,7 @@ export class SCastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate
|
||||
mockAttrs.critical = 0;
|
||||
mockAttrs.freeze_chance = 0;
|
||||
mockAttrs.stun_chance = 0;
|
||||
mockAttrs.paralyze_chance = 0;
|
||||
mockAttrs.puncture_chance = 0;
|
||||
mockAttrs.fac = FacSet.HERO;
|
||||
mockAttrs.type = HType.Long; // 假定为远程,拥有较长索敌范围
|
||||
@@ -250,9 +251,11 @@ export class SCastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate
|
||||
const heroView = e.get(HeroViewComp);
|
||||
if (!heroAttrs || !heroView || !heroView.node) return;
|
||||
if (this.isOutOfBattleBounds(heroView.node.position.x)) return;
|
||||
if (heroAttrs.is_dead || heroAttrs.is_reviving || heroAttrs.isFrost()) return;
|
||||
if (heroAttrs.is_dead || heroAttrs.is_reviving) return;
|
||||
// 冰冻不影响 CD 值:冰冻/击晕期间 CD 照常刷新(击晕内部停涨),但不允许施法
|
||||
heroAttrs.updateCD(this.dt);
|
||||
heroView.cd_show();
|
||||
if (heroAttrs.isFrost() || heroAttrs.isStun()) return;
|
||||
|
||||
const castPlan = this.pickCastSkill(heroAttrs, heroView);
|
||||
if (!this.hasCastTarget(castPlan)) return;
|
||||
|
||||
@@ -220,6 +220,7 @@ export class Skill extends ecs.Entity {
|
||||
const sCrt = config.crt ?? 0;
|
||||
const sFrz = config.frz ?? 0;
|
||||
const sStun = config.stun ?? 0;
|
||||
const sPara = config.para ?? 0;
|
||||
const sBck = config.bck ?? 0;
|
||||
const sAp = config.ap;
|
||||
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.freeze_chance] = cAttrsComp.getFinalFreezeChance() + sFrz;
|
||||
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_distance] = cAttrsComp.getFinalKnockbackDistance();
|
||||
sDataCom.Attrs[Attrs.puncture_chance] = cAttrsComp.getFinalPunctureChance(); // 初始化携带施法者的穿透概率
|
||||
|
||||
Reference in New Issue
Block a user