设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 4192|回复: 9
打印 上一主题 下一主题

[有事请教] 请问伤害公式怎么设置才能防止低属性打出0伤害

[复制链接]

Lv2.观梦者

梦石
0
星屑
373
在线时间
210 小时
注册时间
2020-6-8
帖子
36
跳转到指定楼层
1
发表于 2021-4-4 21:05:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
普通自身参数—敌方参数,属性低于敌方就是0伤害,有什么办法给技能设置一个不受参数和元素抵抗影响的保底伤害?属性低的情况下给个保底伤害。

Lv4.逐梦者

梦石
0
星屑
5217
在线时间
523 小时
注册时间
2017-9-28
帖子
151
2
发表于 2021-4-4 21:58:26 | 只看该作者
Math.max((a.atk - b.def),1)
保底1点伤害。

评分

参与人数 2+2 收起 理由
白嫩白嫩的 + 1 认可答案
89444640 + 1 我很赞同

查看全部评分

回复 支持 1 反对 0

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
24287
在线时间
5047 小时
注册时间
2016-3-8
帖子
1618
3
发表于 2021-4-4 22:16:32 | 只看该作者
本帖最后由 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;
};
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1674
在线时间
333 小时
注册时间
2021-3-20
帖子
51
4
发表于 2021-4-4 22:32:25 | 只看该作者
本帖最后由 石林尘影 于 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);
回复 支持 1 反对 0

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3453
在线时间
1159 小时
注册时间
2016-8-9
帖子
2390

开拓者

5
发表于 2021-4-5 14:30:42 | 只看该作者
以前看过类似的帖子,答案跟国哥给的差不多,不过是在公式最后面写的是   + 1

a.atk - b.def +1

类似这样的
酸酸甜甜就④哇噢
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
926
在线时间
83 小时
注册时间
2018-12-18
帖子
84
6
发表于 2021-4-8 16:03:09 | 只看该作者
三楼说的是对的,计算公式里写的伤害是最先计算出来的,之后还会经过蓝字部分的代码处理,那些是计算目标单位的抗性的,比如物理抗性是0%的敌人,那么你这个技能只要是物理伤害,就算Max了1,也还是打的0点伤害,因为这个值要乘敌人的物理抗性才是最终的结果,甚至防御指令那个技能也会影响最后的伤害。按照楼主说的想法不考虑这些抗性,应该是想要真实伤害的保底值,无论敌人有什么效果都要至少有1点伤害的话,那就得做成真实伤害了。

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

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

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

我暂时只能想到这么多了,看具体楼主需求怎么取舍,可以参考一下这些。

点评

更正一下文中说的物理抗性其实是物理受伤比率,因为文中提到的有点多就不一一修改了。  发表于 2021-4-8 16:06
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
926
在线时间
83 小时
注册时间
2018-12-18
帖子
84
7
发表于 2021-4-8 16:18:07 | 只看该作者
另外还可以参考一下war3的那种护甲机制,计算伤害时,护甲是抵消百分比的伤害,而不是单纯的atk-def,这样就不会造成属性过低伤害是0的情况了。
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
6925
在线时间
708 小时
注册时间
2021-3-5
帖子
814
8
发表于 2021-5-12 10:51:13 | 只看该作者
楼主还是要先明确下自身的需求
如果对方有buff或者闪避之类的,也不能打出0伤害吗
还是普通情况下
如果是普通的话,用2楼的足以
如果不是的话,就复杂一些需要改写代码
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
394
在线时间
49 小时
注册时间
2021-5-2
帖子
19
9
发表于 2021-5-12 20:45:23 | 只看该作者
可否利用公共事件进行外部打击?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-4-26 23:57

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表