|
本帖最后由 大老虎阿#4954 于 2023-10-27 04:21 编辑
痛点:
在技能描述里写一套技能伤害的公式,而不能让技能描述实时显示技能当前能造成伤害的实际数值。
此函数解决了以上痛点:
此函数可以允许你在物编的技能描述中使用变量,如下图:
发射8个追踪火球,对目标造成f[10 * {skill.d.ability_level} + {unit.ATTR_RESULT.attack_mag} * 0.25]法术伤害。
公式解析:
f[] 表示以实数的方式显示[]内的公式计算结果
格式标准:{来源类型.数据类型.属性名}
{skill.d.ability_level} 解释:此变量表示 技能等级
{unit.ATTR_RESULT.attack_mag} 解释:此变量表示 技能拥有者的实际法术攻击力
更多变量属性名可以自己在ECA转Lua中查看,等我有空的时候我会整理好更新到此贴里。
在游戏中显示的实际效果,如下图:
使用方法:
只需要在设置用来展示技能描述的界面控件的字符串中调用GetActualValue(args[1])并传入需要展示的技能就可以了。
此函数是返回完整的技能描述字符串。
有什么缺陷或者不懂的可以留言,我会尽量回复。
Lua代码:
- function StringCalculate(str)
- local function precedence(op)
- local prec = {
- ['+'] = 1,
- ['-'] = 1,
- ['*'] = 2,
- ['/'] = 2
- }
- return prec[op] or 0
- end
- local function apply(op, a, b)
- if op == '+' then return a + b end
- if op == '-' then return a - b end
- if op == '*' then return a * b end
- if op == '/' then return a / b end
- end
- local numbers = {}
- local ops = {}
- local i = 1
- while i <= #str do
- local c = str:sub(i, i)
- if c:match("%d") then
- local start = i
- while i <= #str and str:sub(i, i):match("[%d%.]") do
- i = i + 1
- end
- local num = str:sub(start, i - 1)
- table.insert(numbers, tonumber(num))
- elseif c:match("[%+%-%*/]") then
- while #ops > 0 and precedence(ops[#ops]) >= precedence(c) do
- local op = table.remove(ops)
- local b = table.remove(numbers)
- local a = table.remove(numbers)
- table.insert(numbers, apply(op, a, b))
- end
- table.insert(ops, c)
- i = i + 1
- elseif c == '(' then
- table.insert(ops, c)
- i = i + 1
- elseif c == ')' then
- while ops[#ops] ~= '(' do
- local op = table.remove(ops)
- local b = table.remove(numbers)
- local a = table.remove(numbers)
- table.insert(numbers, apply(op, a, b))
- end
- table.remove(ops)
- i = i + 1
- else
- i = i + 1
- end
- end
- while #ops > 0 do
- local op = table.remove(ops)
- local b = table.remove(numbers)
- local a = table.remove(numbers)
- table.insert(numbers, apply(op, a, b))
- end
- return numbers[1]
- end
- function GetActualValue(cskill)--传入参数:技能
- --技能介绍:发射追踪火球,对目标造成f[10 * {skill.d.ability_level} + {unit.ATTR_RESULT.attack_mag} * 0.25]法术伤害。
- --字符串运算说明:f[运算公式]显示为实数 d[运算公式]显示未整数
- --变量说明:{来源.类型.属性名}
- --来源:skill=技能 unit=单位
- --类型:skill.d=整数 skill.f=实数 unit.ATTR_RESULT=实际属性
- --属性名:skill.d.ability_level = 技能等级 unit.ATTR_RESULT.attack_mag = 法术攻击力
- --ECA用法:字符串变量 = 执行Lua代码 GetActualValue(args[1]) 参数1传入技能
-
- local Skill = y3.ability.get_lua_ability_from_py(cskill);
- local Unit = Skill:get_owner();--获取技能单位
- local Description = Skill:get_string_attr("description");--获取技能描述
- for FromType,ValueType,DataName in string.gmatch(Description, "{(.-)%.(.-)%.(.-)}") do
- local ValueTSID = 100000;
- local Value = 0;
- if (FromType == "skill")then
- if (ValueType == "d")then
- ValueTSID = 100002;
- Value = Skill:get_int_attr(DataName);
- elseif (ValueType == "f")then
- ValueTSID = 100000;
- Value = Skill:get_float_attr(DataName);
- end
- Description = string.gsub(Description, string.format("{%s.%s.%s}", FromType, ValueType, DataName), y3.any_var_to_str(ValueTSID, Value));
- elseif (FromType == "unit")then
- if (ValueType == "d")then
- ValueTSID = 100002;
- if (DataName == "level")then
- Value = Unit:get_level();
- end
- else
- ValueTSID = 100000;
- Value = Unit:get(ValueType,DataName);
- end
- Description = string.gsub(Description, string.format("{%s.%s.%s}", FromType, ValueType, DataName), y3.any_var_to_str(ValueTSID, Value));
- end
- end
- for ValueData in string.gmatch(Description, "d%[(.-)%]") do
- local Value = StringCalculate(ValueData);
- local DataStr = string.format("f[%s]", ValueData);
- Description = string.gsub(Description, DataStr:gsub("([^%w])", "%%%1"), y3.any_var_to_str(100002, Value));--替换对应数据
- end
- for ValueData in string.gmatch(Description, "f%[(.-)%]") do
- local Value = StringCalculate(ValueData);
- local DataStr = string.format("f[%s]", ValueData);
- Description = string.gsub(Description, DataStr:gsub("([^%w])", "%%%1"), y3.any_var_to_str(100000, Value));--替换对应数据
- end
- return Description;
- end
复制代码
|
|