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:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user