- 打卡等级:魔龙套勇士
- 打卡总天数:98
- 打卡月天数:22
- 打卡总奖励:11436
- 最近打卡:2025-07-22 00:17:43
管理员
本站站长
- 积分
- 7395
|
在 Hero 引擎中,新技能的伤害计算公式需要通过技能脚本(SkillXXX.txt,XXX 为技能 ID)中的逻辑代码实现,核心是结合攻击者属性、技能等级、目标属性等参数,通过自定义公式计算最终伤害。以下是具体配置方法和示例:
一、伤害计算公式的核心要素
一个完整的伤害公式通常包含以下参数,需根据技能类型(物理 / 魔法 / 道术)选择组合:
攻击者属性:物理攻击(GetAttack())、魔法攻击(GetMagic())、道术攻击(GetDao())、等级(GetLevel())、技能等级(GetSkillLevel())
目标属性:物理防御(GetTargetDefense())、魔法防御(GetTargetMagicDefense())、等级(GetTargetLevel())
技能参数:伤害系数(自定义,如DamageRate)、固定加成(FixedAdd)、等级加成系数(LevelAdd)
特殊效果:暴击倍数(CritRate)、无视防御比例(IgnoreDef)、元素伤害(如火焰 / 寒冰加成)
二、配置步骤与脚本示例
以 “烈焰冲击”(技能 ID=1001,法师魔法技能)为例,在Skill1001.txt中配置伤害公式:
1. 定义技能等级参数(基础数据)
先在各等级配置中定义公式所需的基础参数(后续公式会调用这些参数):
lua
Level 1
{
; 魔法伤害系数(1.2倍)
DamageRate = 1.2
; 技能等级每级额外加成
LevelAdd = 5
; 固定伤害加成
FixedAdd = 20
; 暴击概率(%)
CritRate = 10
; 暴击倍数
CritMulti = 1.5
; 无视魔法防御比例(%)
IgnoreMagicDef = 20
}
Level 2
{
DamageRate = 1.5
LevelAdd = 8
FixedAdd = 30
CritRate = 15
CritMulti = 1.5
IgnoreMagicDef = 30
}
; 其他等级参数类似,按平衡需求递增
2. 编写伤害计算逻辑(核心公式)
在Release模块中,通过代码实现最终伤害计算,替换默认的AreaDamage等简易函数:
lua
Release
{
; 检查释放条件(省略,同之前的技能配置)
if (TargetExist() == 0) then return 0 end
if (GetMP() < NeedMP) then return 0 end
; 1. 获取基础参数
local skillLevel = GetSkillLevel() ; 技能等级(1-5)
local magicAttack = GetMagic() ; 攻击者魔法攻击(如30-50,取平均值)
local magicAvg = (magicAttack / 2) ; 简化:取魔法攻击平均值
local targetMagicDef = GetTargetMagicDefense() ; 目标魔法防御
; 2. 计算防御减免(考虑无视防御比例)
local defReduce = targetMagicDef * (1 - IgnoreMagicDef/100) ; 实际生效的防御
local defFactor = 1 - (defReduce / (defReduce + 100)) ; 防御减免系数(非线性,避免防御过高导致伤害为0)
; 3. 基础伤害公式:(魔法攻击均值×伤害系数 + 技能等级×等级加成 + 固定加成) × 防御减免系数
local baseDamage = (magicAvg * DamageRate + skillLevel * LevelAdd + FixedAdd) * defFactor
; 4. 暴击判定(随机数≤暴击概率则触发)
local finalDamage = baseDamage
if (Random(100) <= CritRate) then
finalDamage = baseDamage * CritMulti
SendMsg 6 "触发暴击!" ; 提示暴击
end
; 5. 对目标造成最终伤害(替换默认AreaDamage)
SubHP Target, finalDamage ; 扣除目标HP
SendMsg 6 "你对" + GetTargetName() + "造成" + finalDamage + "点伤害!" ; 伤害提示
; 后续逻辑(扣除MP、播放特效等,省略)
SubMP NeedMP
PlaySound 502
return 1
}
三、不同类型技能的公式差异
1. 物理技能(如战士技能)
核心基于物理攻击和目标物理防御,公式示例:
lua
; 物理伤害公式:(物理攻击均值×系数 + 技能等级×加成) × (1 - 物理防御×减免系数)
local phyAttack = GetAttack() ; 物理攻击
local phyAvg = (phyAttack / 2)
local targetDef = GetTargetDefense() ; 目标物理防御
local baseDamage = (phyAvg * DamageRate + skillLevel * LevelAdd) * (1 - (targetDef * 0.003))
2. 道术技能(如道士毒咒)
可能结合道术攻击和持续伤害,公式示例:
lua
; 道术伤害公式:(道术攻击×系数) + (目标等级×0.5)
local daoAttack = GetDao() ; 道术攻击
local baseDamage = daoAttack * DamageRate + (GetTargetLevel() * 0.5)
; 持续伤害(每2秒触发一次)
AddState Target, 11 ; 毒状态ID=11
SetStateTime Target, 11, 10000 ; 持续10秒
四、关键函数与调试技巧
常用函数:
GetAttack():获取攻击者物理攻击(整数,如 “50-70” 返回 120,需除以 2 取均值)
GetMagic()/GetDao():获取魔法 / 道术攻击(同上)
GetTargetDefense()/GetTargetMagicDefense():获取目标防御
Random(X):生成 0-X 的随机整数(用于概率判定)
SubHP Target, X:对目标造成 X 点伤害(核心伤害执行函数)
调试方法:
游戏内使用命令@调试技能 1001强制释放技能,观察伤害数值
用SendMsg 6 "调试:基础伤害=" + baseDamage输出中间变量,排查公式问题
逐步调整系数(如DamageRate),确保不同等级 / 属性下的伤害符合预期平衡
五、注意事项
非线性防御减免:避免使用伤害=基础伤害-防御的简单公式,否则高防御目标可能免疫伤害,建议用(1 - 防御/(防御+常数))的非线性公式。
整数处理:Hero 引擎中伤害通常为整数,必要时用Int(X)函数取整(如finalDamage = Int(baseDamage))。
范围伤害分摊:若为群体技能,可在公式中加入范围系数(如finalDamage = baseDamage / 范围目标数)避免群体伤害过高。
通过以上配置,即可实现灵活可控的技能伤害计算,根据职业特性和平衡需求调整公式参数即可。
|
|