Project1
标题:
【经验交流】用公式模拟元素伤害(包括多元素的乘算)
[打印本页]
作者:
catxiaolang
时间:
2024-1-30 13:37
标题:
【经验交流】用公式模拟元素伤害(包括多元素的乘算)
本帖最后由 catxiaolang 于 2024-2-1 08:21 编辑
原本是发帖提问,现已自行解决,转化为经验交流帖,主贴保留原问题,解决方案在2楼
=========================【原帖】=========================
visu技能状态核心可以使状态产生基于公式的持续伤害,
visu元素状态核心可以将一名角色的所有动作强制附魔成该元素。
然而经测试发现,这里所说的“角色所有动作”并不包括状态的持续伤害。
visu提供的持续伤害状态并不拥有元素属性。
由于不知道Yanfly团队未来是否会更新对该功能的支持,
出于使用需要,我试着将持续伤害受到元素伤害和承伤倍率的影响也写进公式,
得知了以下几个相关函数:
加算,默认值为0
user.getDealtElementPlus(x)
target.elementPlus(x)
乘算,默认值为1
user.getDealtElementRate(x)
target.elementRate(x)
额外加算,默认值为0
user.getDealtElementFlat(x)
target.elementFlat(x)
试着将这些函数所代表的综合影响写进伤害公式,
将公式结构变成:
基础伤害 * 使用者元素伤害倍率 * 受伤者元素承伤倍率
就像这样(以ID为15的元素,伤害系数为1.0mat的技能为例):
a.mat * ((1 + user.getDealtElementPlus(15)) * user.getDealtElementRate(15) + user.getDealtElementFlat(15)) * ((1 + target.elementPlus(15)) * target.elementRate(15) + target.elementFlat(15))
然而这样写存在两个问题:
1.忽略了强制倍率(备注标签<Force Received Element id Rate: x%>和及其它相关变体)对伤害的影响,
这导致直接伤害和持续伤害呈现两种截然不同的结果,
我希望改善这种状况,但是我不知道强制倍率在脚本中的写法;
2.这样写使得公式变得过长,想知道MZ或Visu中是否存在用于直接表示承伤比例和伤害倍率最终计算结果的函数。
作者:
catxiaolang
时间:
2024-1-31 10:25
本帖最后由 catxiaolang 于 2024-2-1 14:50 编辑
target.elementRate(x)表示的便是RPGmaker的【属性有效度】,即承伤倍率。
如果你的游戏设计中,一个技能包含多种元素,并且它们是以乘算计算的(类似宝可梦对弱点倍率的计算),可以在伤害公式后面乘以以下模块
【未使用插件时】
在伤害公式后乘以以下模块:
b.elementRate(x)
(x替换为希望附加的元素id,可以以此方法多次附加不同元素)
它的原理是把对元素有效度的计算从游戏机制移到公式中,
【注意】如果用此方法,则不要再把该技能(或物品)设置成这个元素(否则会重复计算)
【使用了Visu元素状态核心时】
在伤害公式后乘以以下内容:
((1 + a.getDealtElementPlus(x)) * a.getDealtElementRate(x) + a.getDealtElementFlat(x)) * b.elementRate(x)
(x替换为希望附加的元素id,比原版多的部分是计算攻击者的元素增伤,这部分是由三种加成规则构成的,所以看起来比较复杂)
如果用于visu技能状态核心提供的持续伤害功能,在写法上需要把a.替换为user.,把b.替换为target.
就像这样:
((1 + user.getDealtElementPlus(x)) * user.getDealtElementRate(x) + user.getDealtElementFlat(x)) * target.elementRate(x)
【补充说明】
这个方法并不是完美的,它仅仅只实现对伤害的模拟,它无法正确处理元素吸收和元素反射(如果有的话)。
对元素免疫则只能处理以该元素有效度为0%的方式实现的情况。
这仅仅只是一个学习阶段中的心得交流,如果有更好的方法非常欢迎指教。
===========【原帖中伤害公式的优化】===========
user.mat * ((1 + user.getDealtElementPlus(15)) * user.getDealtElementRate(15) + user.getDealtElementFlat(15)) * target.elementRate(15)
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1