refactor(hero): 重构技能触发与属性系统,使用运行时解析缓存
1. 重构英雄属性组件,将静态配置与运行时缓存分离,新增runtime_前缀的运行时解析字段 2. 移除旧的evolve进化配置处理逻辑,改为通过等级解析器动态获取当前等级生效的技能与属性 3. 统一怪物与英雄的技能触发逻辑,均使用运行时缓存字段 4. 更新测试模式配置结构,适配新的分组+等级数组配置格式 5. 优化技能描述生成逻辑,支持新的等级配置结构
This commit is contained in:
@@ -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));
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user