refactor: 重构天赋系统与技能触发逻辑

1.  重构天赋系统架构:将天赋加成与触发修正统一收敛到 HeroAttrsComp.applyTalent
2.  新增天赋触发修正字段:talent_t_num_reduce 与 talent_extra_trigger_chance
3.  重构天赋加点逻辑:统一 1 点/级,新增软前置校验
4.  优化天赋UI组件:改为编辑器静态配置驱动,重构层位展示逻辑
5.  修复技能触发判定:在 SkillTriggerHelper 中应用天赋触发修正
6.  调整天赋配置结构:改为 5 层递进解锁,新增 L4/L5 专属触发修正配置
This commit is contained in:
panFD
2026-09-19 11:20:55 +08:00
parent f53c4293df
commit 707e25e73f
11 changed files with 12833 additions and 7245 deletions

View File

@@ -9,7 +9,7 @@ import { GameScoreStats } from "./config/HeroAttrs";
import { mLogger } from "./Logger";
import { gameDataSync } from "./GameDataSync";
import { HERO_UPGRADE_NEED_FRAGMENTS } from "./config/GameSet";
import { TalentSet, TALENT_LEVEL_MAX, getTalentLevelExp, getTalentUpgradeCost, isTalentTierUnlocked } from "./config/TalentSet";
import { TalentSet, TALENT_LEVEL_MAX, getTalentLevelExp, isTalentPrereqMet, isTalentTierUnlocked } from "./config/TalentSet";
import { ScoreRankList, ScoreTier, getRankByScore } from "./config/ScoreRankSet";
import { RANK_REWARDS, STAGE_REWARDS, RewardItem, pickRandomHeroUuid } from "./config/RewardSet";
@@ -694,7 +694,7 @@ export class SingletonModuleComp extends ecs.Comp {
/**
* 消耗天赋点升级天赋(升级即激活,下一局生效)
* @param uuid 天赋 uuid
* @returns 是否升级成功(天赋不存在/已满级/阶位未解锁/点数不足时返回 false)
* @returns 是否升级成功(天赋不存在/已满级/层位未解锁/前置未满足/点数不足时返回 false)
*/
upgradeTalent(uuid: number): boolean {
const cfg = TalentSet[uuid];
@@ -702,11 +702,13 @@ export class SingletonModuleComp extends ecs.Comp {
if (!this.data.talents) this.data.talents = {};
const curLv = this.getTalentLv(uuid);
if (curLv >= cfg.max_lv) return false;
// 阶位解锁:二/三阶天赋要求前一阶累计投入点数达标(一阶恒解锁)
// 层位解锁:第 N 层天赋要求第 N-1 层累计投入点数达标(第 1 层恒解锁)
if (!isTalentTierUnlocked(this.data.talents, cfg.tier)) return false;
const cost = getTalentUpgradeCost(cfg.tier);
if (cost < 0 || this.getTalentPoints() < cost) return false;
this.data.talent_points -= cost;
// 软前置:前置天赋等级需达标(仅限制加点)
if (!isTalentPrereqMet(this.data.talents, cfg)) return false;
// 统一 1 点/级
if (this.getTalentPoints() < 1) return false;
this.data.talent_points -= 1;
this.data.talents[uuid] = curLv + 1;
gameDataSync.markDataDirty();
oops.message.dispatchEvent(GameEvent.TALENT_UPDATE);
@@ -715,17 +717,13 @@ export class SingletonModuleComp extends ecs.Comp {
/**
* 重置所有天赋等级并退还全部已消耗天赋点(看广告入口)
* Why: 退还点数按"升到当前等级的累计消耗"计算,与升级消耗表严格对账,避免点数膨胀/缩水。
* Why: 统一 1 点/级后退还点数 = 等级总和,与升级消耗严格对账,避免点数膨胀/缩水。
*/
resetTalents(): void {
if (!this.data.talents) this.data.talents = {};
let refund = 0;
for (const key in this.data.talents) {
const lv = this.data.talents[key];
for (let i = 0; i < lv; i++) {
const c = getTalentUpgradeCost(i);
if (c > 0) refund += c;
}
refund += this.data.talents[key];
}
this.data.talents = {};
this.data.talent_points = (this.data.talent_points ?? 0) + refund;