跳到主要内容

PRD-064 元素克制与抗性

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

1. 背景与目标​

元素系统为数值对抗增加克制维度。元素克制、抗性、穿透、PvE/PvP 系数适合用 Lua 配置,便于赛季平衡。

目标

  • 5 元素:火、冰、雷、毒、神圣,互相克制。
  • 元素攻击/抗性/穿透参与伤害结算,但不替代主属性。
  • PvE 与 PvP 使用不同系数,避免一套数值通吃。

2. 核心规则​

2.1 克制关系​

攻击元素克制被克制
火冰雷
冰雷火
雷毒冰
毒神圣雷
神圣火毒
  • 克制伤害 ×1.2,被克制 ×0.85,其余 ×1.0。
  • 双元素技能按主元素计算,副元素提供 30% 加成。

2.2 抗性与穿透​

有效抗性 = max(-50%, 抗性 - 穿透)
元素伤害 = 基础伤害 × 元素系数 × (1 - 有效抗性)
  • 抗性上限 75%,穿透上限 50%。
  • 抗性可为负,负抗性增加伤害。

2.3 PvE/PvP​

  • PvE 元素系数 ×1.0;PvP 元素系数 ×0.6。
  • BOSS 可配置元素免疫/吸收/反射。
  • 元素状态(灼烧/冰冻/感电/中毒)由 Buff 系统实现。

3. 服务端设计​

3.1 Lua 脚本设计​

-- lua/numeric/element.lua
Element = {
counter = { fire="ice", ice="thunder", thunder="poison", poison="holy", holy="fire" },
pvp_rate = 0.6,
resist_cap = 0.75,
pierce_cap = 0.5,
}

function OnCalcElement(ctx, attacker, target, element, base)
local counter = Element.counter[element]
local target_element = ctx:GetElement(target)
local rate = 1.0
if counter == target_element then rate = 1.2
elseif Element.counter[target_element] == element then rate = 0.85 end
local resist = math.max(-0.5, ctx:GetResist(target, element) - ctx:GetPierce(attacker, element))
resist = math.min(resist, Element.resist_cap)
local pvp = ctx:IsPvP(attacker, target) and Element.pvp_rate or 1.0
return base * rate * (1 - resist) * pvp
end
  • 元素系数/克制表由脚本加载,C++ 结算时调用一次。
  • 抗性/穿透来自属性快照,不在结算中查库。
  • 元素状态由 Buff 系统挂载,脚本不直接改 HP。

3.2 协议​

方向协议说明
S→CSC_ElementInfo元素攻击/抗性/穿透
S→CSC_ElementDamage元素伤害/克制提示

3.3 竞技平衡​

  • 竞技场可禁用元素克制或降低系数。
  • 元素抗性装备/宝石计入战力,设上限。
  • 新元素上线需提供免费洗点/转换。

4. 客户端设计​

  • 角色面板显示元素攻击/抗性/穿透。
  • 伤害飘字颜色区分元素,克制显示“克制”提示。
  • 目标面板显示元素弱点/抗性。
  • 元素状态图标与层数。
  • 装备/宝石元素属性对比。

5. 配置与 Lua 接口​

配置说明
counter克制表
pvp_ratePvP 系数
resist_cap抗性上限
pierce_cap穿透上限
element_status元素状态

Lua 接口:GetElement、GetResist、GetPierce、IsPvP、CalcElementDamage。

6. 边界与异常​

场景处理
元素未配置按无元素 1.0 计算
抗性溢出夹到上限
穿透超过抗性允许负抗性,夹到 -50%
元素免疫伤害 0,显示“免疫”
脚本异常回退无元素计算,记录日志

7. 验收标准​

  • 五元素克制/被克制/无关系系数正确。
  • 抗性/穿透/上限/负抗性计算正确。
  • PvE/PvP 系数正确。
  • 元素状态与 Buff 联动正确。
  • 客户端提示与服务端一致。