跳到主要内容

PRD-054 天赋树与属性点

文档编号:PRD-054
版本:v1.0
状态:已通过
适用端:服务端 / 客户端
脚本挂载:lua/numeric/talent.lua

1. 背景与目标​

天赋树提供职业内的数值分支与 Build 差异。节点效果、前置、重置成本适合用 Lua 配置,便于赛季调整。

目标

  • 每职业 3 系天赋,每系 5 层,节点主动/被动混合。
  • 天赋点来自等级与成就,重置有成本。
  • 支持双天赋预设,脱战切换。

2. 核心规则​

2.1 点数与层级​

  • 角色 10 级起每级 1 点,满级 60 点,额外 10 点来自成就。
  • 每系第 N 层需在该系投入 5×N 点才能解锁。
  • 终极天赋需该系投入 40 点。
  • 单个节点最多 5 级,效果线性/阶梯配置。

2.2 重置与预设​

  • 重置消耗金币/道具,返还全部点数。
  • 脱战可切换预设,战斗中禁止。
  • 预设 2 套,解锁第二套需道具。
  • 重置/切换后立即重算属性与技能。

2.3 数值约束​

  • 天赋提供的百分比加成与其他来源乘算,设总上限。
  • 同一效果不叠加,取最高值。
  • 天赋不得提供无敌/免控等破坏竞技的效果(特殊节点需评审)。

3. 服务端设计​

3.1 Lua 脚本设计​

-- lua/numeric/talent.lua
Talent = {
trees = { "arms", "fury", "protection" },
max_points = 70,
reset_cost = { gold = 100000 },
presets = 2,
}

function OnLearn(ctx, role, node_id)
local node = ctx:GetTalentNode(node_id)
if not ctx:CanLearn(role, node_chain(node)) then
return ctx:Fail(role, "前置/点数不足")
end
if ctx:GetSpent(role) + 1 > Talent.max_points then
return ctx:Fail(role, "天赋点不足")
end
ctx:AddTalent(role, node_id, 1)
ctx:RecalcAttributes(role)
end

function OnReset(ctx, role)
if ctx:InCombat(role) then return ctx:Fail(role, "战斗中无法重置") end
if not ctx:Consume(role, Talent.reset_cost) then
return ctx:Fail(role, "资源不足")
end
ctx:ClearTalents(role)
ctx:RecalcAttributes(role)
end
  • 前置链、层级、点数由脚本校验;C++ 只存节点等级。
  • 重置/切换事务:清点/扣费/重算/持久化。
  • 热更节点效果后,登录重算。

3.2 协议​

方向协议说明
C→SCS_TalentLearn学习/升级
C→SCS_TalentReset重置
C→SCS_TalentPreset切换预设
S→CSC_TalentTree树/点数/节点
S→CSC_TalentResult结果/属性变化

3.3 竞技约束​

  • 竞技场/战场内禁止重置/切预设。
  • 匹配按当前预设战力计算。
  • 赛季天赋调整需公告,必要时提供免费重置。

4. 客户端设计​

  • 天赋树三列布局,连线显示前置。
  • 节点悬停显示效果、消耗、下一级。
  • 点数/已投入/剩余显示。
  • 预设保存/切换/命名。
  • 重置确认与返还预览。

5. 配置与 Lua 接口​

配置说明
node_id节点
tree / tier系/层
max_level最大等级
require_points层级要求
effect属性/技能效果
reset_cost重置成本

Lua 接口:GetTalentNode、CanLearn、AddTalent、ClearTalents、RecalcAttributes、InCombat。

6. 边界与异常​

场景处理
点数不足/前置不满足拒绝
战斗中重置拒绝
节点被删除登录返还点数
预设引用失效节点清理并提示
热更后超上限保留但效果截断,邮件说明

7. 验收标准​

  • 三系天赋、层级、前置、点数上限正确。
  • 学习/重置/预设切换/属性重算正确。
  • 竞技场内禁止切换/重置。
  • 节点删除/热更有兜底。
  • 客户端树状态与服务端一致。