Project1

标题: 请问伤害公式怎么设置才能防止低属性打出0伤害 [打印本页]

作者: 237274783    时间: 2021-4-4 21:05
标题: 请问伤害公式怎么设置才能防止低属性打出0伤害
普通自身参数—敌方参数,属性低于敌方就是0伤害,有什么办法给技能设置一个不受参数和元素抵抗影响的保底伤害?属性低的情况下给个保底伤害。
作者: 中华国哥    时间: 2021-4-4 21:58
Math.max((a.atk - b.def),1)
保底1点伤害。
作者: alexncf125    时间: 2021-4-4 22:16
本帖最后由 alexncf125 于 2021-4-4 22:25 编辑
中华国哥 发表于 2021-4-4 21:58
Math.max((a.atk - b.def),1)
保底1点伤害。


这样写並不会保底
Math.max((a.atk - b.def),1)只代表源码的红字部分
蓝字的部分仍是有可能会把伤害修正成0的说

源码:
Game_Action.prototype.makeDamageValue = function(target, critical) {
    var item = this.item();
    var baseValue = this.evalDamageFormula(target);
    var value = baseValue * this.calcElementRate(target);
    if (this.isPhysical()) {
        value *= target.pdr;
    }
    if (this.isMagical()) {
        value *= target.mdr;
    }
    if (baseValue < 0) {
        value *= target.rec;
    }
    if (critical) {
        value = this.applyCritical(value);
    }
    value = this.applyVariance(value, item.damage.variance);
    value = this.applyGuard(value, target);
    value = Math.round(value)
;
    return value;
};
作者: 石林尘影    时间: 2021-4-4 22:32
本帖最后由 石林尘影 于 2021-4-11 17:55 编辑

这个回答仅供参考,将伤害值为0时赋值为1.
单独修改某些技能的最低伤害,可在相应伤害下单独添加条件语句。

rpg_objects第1660行左右,Game_Action.prototype.apply下,
            var value = this.makeDamageValue(target, result.critical);
            if (value == 0) {
                //最小伤害为1
                value = 1;
            }
            this.executeDamage(target, value);
作者: 白嫩白嫩的    时间: 2021-4-5 14:30
以前看过类似的帖子,答案跟国哥给的差不多,不过是在公式最后面写的是   + 1

a.atk - b.def +1

类似这样的
作者: 蹲厕所的女孩    时间: 2021-4-8 16:03
三楼说的是对的,计算公式里写的伤害是最先计算出来的,之后还会经过蓝字部分的代码处理,那些是计算目标单位的抗性的,比如物理抗性是0%的敌人,那么你这个技能只要是物理伤害,就算Max了1,也还是打的0点伤害,因为这个值要乘敌人的物理抗性才是最终的结果,甚至防御指令那个技能也会影响最后的伤害。按照楼主说的想法不考虑这些抗性,应该是想要真实伤害的保底值,无论敌人有什么效果都要至少有1点伤害的话,那就得做成真实伤害了。

有几个思路,一个是在技能的备注里加meta,然后通过这段代码的最后,识别一下该技能是否拥有这个meta,如果有的话再来在代码里把最后的value那个变量Math.max一下就行了。

第二个是看敌人会不会有防御这个能力了,如果没有的话,可以直接把技能设置成真实伤害,就不会计算物理抗性和魔法抗性了,因为图中蓝色的代码部分会把伤害处理成0的只有这两个抗性,把数据库中技能的命中类型设置成必定命中,那么这个技能就是真实伤害了,不会考虑对方的物理和魔法抗性,当然这个方法的缺点就是这整个技能都是真实伤害了,而不是保底伤害是真实伤害。

还有一个方法是直接在技能的效果里面加一个HP恢复,然后值给负的,比如保底1就恢复-1,这样也是能够不计算抗性的,但这也有缺点,因为原理是恢复,所以会计算怪物的“药理知识”这个属性,虽然我觉得大部分怪都不会有这个属性,如果有的话,那么这个伤害就会乘上药理知识的比率,还有另一个问题就是这种方式的保底伤害属于附加伤害,也就是说敌人不仅会受到公式的正常伤害,还会受到这个保底伤害,相当于给这个技能增加了一个真实伤害的基础值吧。

我暂时只能想到这么多了,看具体楼主需求怎么取舍,可以参考一下这些。
作者: 蹲厕所的女孩    时间: 2021-4-8 16:18
另外还可以参考一下war3的那种护甲机制,计算伤害时,护甲是抵消百分比的伤害,而不是单纯的atk-def,这样就不会造成属性过低伤害是0的情况了。
作者: RyanYe    时间: 2021-5-12 10:51
楼主还是要先明确下自身的需求
如果对方有buff或者闪避之类的,也不能打出0伤害吗
还是普通情况下
如果是普通的话,用2楼的足以
如果不是的话,就复杂一些需要改写代码
作者: qwer_run    时间: 2021-5-12 20:45
可否利用公共事件进行外部打击?




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1