| 
 | 
 
 本帖最后由 大老虎阿#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
 
 
  复制代码 
 
 
 |   
		
 
 
 
 |