feat: 新增天赋系统,实现局外天赋养成与战斗属性加成

- 新增天赋配置表与相关枚举、数据结构
- 新增全局单例的天赋数据管理接口,支持升级、重置、点数管理
- 新增天赋属性加成结算逻辑,支持全局天赋与职业专精天赋
- 新增治疗强化、buff强化属性与对应天赋支持
- 新增天赋更新事件,同步UI与战斗数据
- 在英雄加载、升级流程中接入天赋加成计算
This commit is contained in:
panFD
2026-08-24 22:58:27 +08:00
parent 61e33ff754
commit 2fc085c3aa
9 changed files with 416 additions and 3 deletions

View File

@@ -13,6 +13,7 @@ import { Attrs } from "../common/config/HeroAttrs";
import { MoveComp } from "./MoveComp";
import { mLogger } from "../common/Logger";
import { FieldSkillType } from "../common/config/SkillSet";
import { applyTalentBonuses } from "../common/config/TalentSet";
/** 英雄实体:负责英雄节点创建、属性初始化、入场动画与销毁流程 */
@ecs.register(`Hero`)
@@ -194,6 +195,12 @@ export class Hero extends ecs.Entity {
model.ap += apExtra;
}
// 天赋加成层:基础天赋全局生效,专精天赋按职业过滤(仅英雄生效,怪物跳过)
// Why: 放在成长/bonus 之后、光环乘区之后,以基础快照为基数叠加,避免与乘区叠加成乘法膨胀
if (model.fac === FacSet.HERO) {
applyTalentBonuses(model, smc.getTalentLevels(), model.role);
}
// 缓存技能射程等派生数据,减少战斗帧内重复计算
model.updateSkillDistanceCache();

View File

@@ -89,7 +89,9 @@ export class HeroAttrsComp extends ecs.Comp {
puncture_chance: number = 0; // 穿透概率
puncture_dmg_bonus: number = 0; // 穿透后伤害增量(百分点,乘算加成)
wfuny: number = 0; // 风怒
vulnerable_res: number = 0; // 易伤抗性(百分比减免易伤附加伤害)
vulnerable_res: number = 0; // 易伤抗性(百分比减免易伤附加伤害)
heal_power: number = 0; // 治疗强化(百分点;放大该英雄施放技能的治疗量,辅助专精天赋写入)
buff_power: number = 0; // buff 强化(百分点;放大该英雄施加的友方 buff 数值,辅助专精天赋写入)
revived_count: number = 0; // 已复活次数
invincible_time: number = 0;// 无敌时间
@@ -660,6 +662,8 @@ export class HeroAttrsComp extends ecs.Comp {
this.puncture_dmg_bonus = 0;
this.wfuny = 0;
this.vulnerable_res = 0;
this.heal_power = 0;
this.buff_power = 0;
this.boom = false;
// 重置技能距离缓存

View File

@@ -16,6 +16,7 @@ import { SkillTriggerHelper } from "./SkillTriggerHelper";
import { MissionEconomy } from "../map/MissionEconomy";
import { mLogger } from "../common/Logger";
import { buffManager } from "./BuffManager";
import { BuffList } from "../common/config/BuffSet";
/**
* ==================== 自动施法系统 ====================
@@ -527,7 +528,8 @@ export class SCastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate
}
if (kind === SkillKind.Heal && sAp !== 0) {
const addHp = Math.floor(sAp * _cAttrsComp.ap / 100);
// 治疗强化(heal_power,百分点):辅助专精天赋写入,放大施法者的治疗量
const addHp = Math.floor(sAp * _cAttrsComp.ap / 100 * (1 + _cAttrsComp.heal_power / 100));
model.add_hp(addHp);
target.health(addHp);
if (_cAttrsComp.fac === FacSet.HERO) {
@@ -547,6 +549,17 @@ export class SCastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate
const buffOverrides: { value?: number; duration?: number } = {};
if (config.buff_value !== undefined) buffOverrides.value = config.buff_value;
if (config.buff_duration !== undefined) buffOverrides.duration = config.buff_duration;
// buff 强化(buff_power,百分点):辅助专精天赋写入,按施法者放大 buff 数值。
// 基准值优先取技能 buff_value,未配置时反查 BuffList(modifiers[0].value 优先,其次 tick.damage_or_heal)
if (_cAttrsComp.buff_power > 0) {
const buffCfg = BuffList[config.timed_buff_id];
const baseValue = config.buff_value
?? buffCfg?.modifiers?.[0]?.value
?? buffCfg?.tick?.damage_or_heal;
if (baseValue !== undefined) {
buffOverrides.value = Math.floor(baseValue * (1 + _cAttrsComp.buff_power / 100));
}
}
buffManager.applyBuff(
target.ent,
config.timed_buff_id,
@@ -558,7 +571,8 @@ export class SCastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate
}
// 永久 buff 统一按百分比结算:攻击/生命按基础值相对放大,其余按百分点累加
const totalBuffValue = config.ap;
// buff 强化(buff_power,百分点):辅助专精天赋写入,按施法者放大永久 buff 数值
const totalBuffValue = config.ap * (1 + _cAttrsComp.buff_power / 100);
switch (config.buff_type) {
case Attrs.ap: {