feat: 新增麻痹控制机制,优化击晕与技能CD逻辑
1. 新增麻痹控制相关属性、buff配置与逻辑实现 2. 调整击晕时长与CD削减机制,优化技能CD更新逻辑 3. 修正多个技能预制件的参数与动画配置 4. 扩展控制类型检测与游戏配置项
This commit is contained in:
@@ -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;
|
||||
@@ -197,33 +198,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 +245,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 +256,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;
|
||||
@@ -518,6 +529,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);
|
||||
|
||||
Reference in New Issue
Block a user