refactor(hero): 重构技能触发与属性系统,使用运行时解析缓存

1. 重构英雄属性组件,将静态配置与运行时缓存分离,新增runtime_前缀的运行时解析字段
2. 移除旧的evolve进化配置处理逻辑,改为通过等级解析器动态获取当前等级生效的技能与属性
3. 统一怪物与英雄的技能触发逻辑,均使用运行时缓存字段
4. 更新测试模式配置结构,适配新的分组+等级数组配置格式
5. 优化技能描述生成逻辑,支持新的等级配置结构
This commit is contained in:
pan
2026-08-04 16:46:59 +08:00
parent d0971ff72c
commit 57c7934571
10 changed files with 561 additions and 489 deletions

View File

@@ -42,10 +42,10 @@ export class SkillTriggerHelper {
this.handleDead(model, view);
break;
case SkillTriggerType.FStart:
this.handleArrayTrigger(model.fstart, model, view, type);
this.handleArrayTrigger(model.runtime_fstart, model, view, type);
break;
case SkillTriggerType.FEnd:
this.handleArrayTrigger(model.fend, model, view, type);
this.handleArrayTrigger(model.runtime_fend, model, view, type);
break;
case SkillTriggerType.Atking:
this.handleAtking(model, view);
@@ -61,17 +61,17 @@ export class SkillTriggerHelper {
* 支持受【召唤强化羁绊 (SummonCount)】的多次触发加成。
*/
private static handleCall(model: HeroAttrsComp, view: HeroViewComp) {
if (!model.call || model.call.length === 0) return;
if (!model.runtime_call || model.runtime_call.length === 0) return;
let triggerCount = 1;
// 仅英雄享受加成,怪物始终只触发 1 次
if (model.fac === FacSet.HERO) {
triggerCount += FieldSkillHelper.getFieldSkillTotalValue(FieldSkillType.SummonCount);
}
triggerCount = Math.max(1, Math.floor(triggerCount)); // 确保最少触发 1 次
for (let i = 0; i < triggerCount; i++) {
this.dispatchArray(model.call, model, view, SkillTriggerType.Call);
this.dispatchArray(model.runtime_call, model, view, SkillTriggerType.Call);
}
}
@@ -80,18 +80,18 @@ export class SkillTriggerHelper {
* 支持受【亡语强化羁绊 (DeadCount)】的多次触发加成。
*/
private static handleDead(model: HeroAttrsComp, view: HeroViewComp) {
if (!model.dead || model.dead.length === 0) return;
if (!model.runtime_dead || model.runtime_dead.length === 0) return;
let triggerCount = 1;
if (model.fac === FacSet.HERO) {
triggerCount += FieldSkillHelper.getFieldSkillTotalValue(FieldSkillType.DeadCount);
// 【局内战绩评分系统】统计死亡触发技能生效次数(用于局后防守评分结算)
smc.vmdata.scores.dead_trigger_count += model.dead.length;
smc.vmdata.scores.dead_trigger_count += model.runtime_dead.length;
}
triggerCount = Math.max(1, Math.floor(triggerCount));
for (let i = 0; i < triggerCount; i++) {
this.dispatchArray(model.dead, model, view, SkillTriggerType.Dead);
this.dispatchArray(model.runtime_dead, model, view, SkillTriggerType.Dead);
}
}
@@ -100,15 +100,15 @@ export class SkillTriggerHelper {
* 判定逻辑:依据配置中的 t_num触发所需普攻次数对比当前的普攻累计次数取模判定。
*/
private static handleAtking(model: HeroAttrsComp, view: HeroViewComp) {
if (!model.atking || model.atking.length === 0) return;
if (!model.runtime_atking || model.runtime_atking.length === 0) return;
let triggerCount = 1;
if (model.fac === FacSet.HERO) {
triggerCount += FieldSkillHelper.getFieldSkillTotalValue(FieldSkillType.AtkCount);
}
triggerCount = Math.max(1, Math.floor(triggerCount));
model.atking.forEach(atkConfig => {
model.runtime_atking.forEach(atkConfig => {
// atk_count 代表已进行的普攻次数。当其余数刚好整除配置阈值时触发。
if (model.atk_count > 0 && model.atk_count % atkConfig.t_num === 0) {
for (let i = 0; i < triggerCount; i++) {
@@ -123,15 +123,15 @@ export class SkillTriggerHelper {
* 判定逻辑:依据配置中的 t_num触发所需受击次数对比当前的受击累计次数取模判定。
*/
private static handleAtked(model: HeroAttrsComp, view: HeroViewComp) {
if (!model.atked || model.atked.length === 0) return;
if (!model.runtime_atked || model.runtime_atked.length === 0) return;
let triggerCount = 1;
if (model.fac === FacSet.HERO) {
triggerCount += FieldSkillHelper.getFieldSkillTotalValue(FieldSkillType.BeAtkCount);
}
triggerCount = Math.max(1, Math.floor(triggerCount));
model.atked.forEach(atkConfig => {
model.runtime_atked.forEach(atkConfig => {
// atked_count 代表已承受的受击次数。当其余数刚好整除配置阈值时触发。
if (model.atked_count > 0 && model.atked_count % atkConfig.t_num === 0) {
for (let i = 0; i < triggerCount; i++) {
@@ -144,7 +144,7 @@ export class SkillTriggerHelper {
/**
* 通用的数组型触发器处理(适用于 FStart / FEnd 等无需额外判定的简单列表触发)
*/
private static handleArrayTrigger(configs: {s_uuid: number, t_num: number, overrides?: SkillOverrides}[] | undefined, model: HeroAttrsComp, view: HeroViewComp, type: SkillTriggerType) {
private static handleArrayTrigger(configs: { s_uuid: number, t_num: number, overrides?: SkillOverrides }[] | undefined, model: HeroAttrsComp, view: HeroViewComp, type: SkillTriggerType) {
if (!configs || configs.length === 0) return;
this.dispatchArray(configs, model, view, type);
}
@@ -152,7 +152,7 @@ export class SkillTriggerHelper {
/**
* 批量派发技能事件
*/
private static dispatchArray(configs: {s_uuid: number, t_num?: number, overrides?: SkillOverrides}[], model: HeroAttrsComp, view: HeroViewComp, type: SkillTriggerType) {
private static dispatchArray(configs: { s_uuid: number, t_num?: number, overrides?: SkillOverrides }[], model: HeroAttrsComp, view: HeroViewComp, type: SkillTriggerType) {
configs.forEach(config => this.dispatchSingle(config.s_uuid, model, view, type, config.overrides));
}