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