rmva吧 关注:1,964贴子:7,804
  • 9回复贴,共1

新手向 利用伤害公式实现有趣的效果

只看楼主收藏回复

rmva的伤害公式很有潜力,即使不动用脚本,光伤害公式就可以满足大部分技能的设计需求
我也是最近在做一款传统RPG,技能系统做的比较复杂,实现了不少奇奇怪怪的东西,有感而发。
系统自带的公式的标准模式是 a.atk*2-b.def
顾名思义 攻击力的2倍减防御力就是伤害
我们现在看看怎么去打破这种固定的模式


1楼2022-06-12 19:00回复
    从最简单开始看
    1、我想要个技能无视对方防御 那么公式直接是 a.atk*2
    2、我想要那些固定伤害的暗器,例如扔圣水,燃烧瓶,霹雳子,既无视防御力,也和使用者的能力无关
    那就更加简单,我直接在公式里填 60 加上15%的离散度的话 那就是造成51~69点伤害
    3、传统的加法公式,一旦防御过高,伤害就会变成0,防御力接近临界点时,伤害会急剧下降
    如果我们不想看到0伤害,不妨改成乘法公式 举例说 a.atk* a.atk/(a.atk+b.def)
    攻击力的平方去除以自身攻击力目标防御,这样伤害曲线就会变得很平滑
    100攻打0防就是100点伤害
    100攻击打100防,伤害降为50
    100攻打300防 也有25伤害
    需要整体调整数值的话,把攻击的平方这里再乘个系数就可以
    4、我要一个技能,就打掉对方的20%血,无视别的东西,那直接在公式里填 b.mhp*0.2即可
    如果我说,boss必须免疫这种技能,那只需要把添加一个自定义攻击属性(原本是火雷冰水什么的)
    让boss免疫这个属性,或者对这个自定义属性有百分比减免就行
    以上这些最简单,下面我们来看稍微难一点点的


    2楼2022-06-12 19:28
    回复
      1、我现在想要做一个真实一些的拳击游戏,随着选手体力降低,自身攻击的威力也会变小
      把原本的公式乘以系数a.hp/a.mhp*(a.atk*2-b.def),前者是当前血量,后者是最大血量,
      当技能的发动者满血时 *1 只剩半血就成了*0.5
      但是这样也有那么一丢丢问题,当我只剩一个血皮时,这个技能伤害就几乎没有了。
      于是我们可以用公式改进 这这样写 2/a.hp/a.mhp*(a.atk*2-b.def)+2/(a.atk*2-b.def)
      这样就变成了,至少有一半伤害和攻击者血量无关,满血时*1 空血*0.5
      把这个例子反过来,现在我不要现实里的拳击手了,我要一个狂战士,自己血越低伤害越高
      只需要前半部分变成2-a.hp/a.mhp 满血时伤害系数是2-1 半血时候成了2-0.5 空血就是2倍伤害
      2、我要一个技能,类似于“法力燃烧” 也不需要脚本,对有蓝的目标伤害更高
      (atk+b.mp)-b.def 将对方的剩余法力值也算成我的攻击力,数值太夸张乘以系数去调整即可
      这样对没有蓝的敌人伤害就不理想,就是那么简单
      3、大于号小于号,也可以用
      我要一个技能叫斩杀,如果目标血量不到四分之一则秒杀,否则无效
      使用A?B:C的表达,?前面是判定条件,意思就是条件A是否满足,满足就用B公式,不满足用C公式
      那么 b.hp*(b.hp>b.mhp*0.25? 0:1) 意思应该好理解
      造成目标现有血量的伤害(秒杀) 然后乘以一个系数 如果目标当前血量大于25%则*0 否则*1


      3楼2022-06-12 20:08
      回复
        只要记住了A?B:C这个判定表达,我们可以实现一大堆东西
        这个式子还可以延伸
        比如A?B?C:D:E 意思是满足A执行C 满足B执行D 都不满足执行E
        下面我们看看这东西能怎么用


        4楼2022-06-12 20:16
        回复
          脑洞大的人利用这个判断式可以做太多东西了
          我脑洞有限,套用现有游戏的一些技能来举例吧
          1、我有一个盗贼,盗贼会潜行,有一个技能是偷袭敌人
          如果盗贼让对方看到,偷袭效果就差,那么假设我的潜行状态为第20号状态
          公式可以这样写 (a.atk*4-b.def)*(a.state?(20)?2:1)
          意思是,如果盗贼自身在20号潜行状态下,伤害*2,没有这个状态就*1
          是否处于某状态的判定是 a.state?(n)? 目标就是b.state?(n)?
          这个非常好用,比如10号状态是被冻结 处于这种状态下的人 被火烧就没有那么疼了
          (a.mat*2-b.mdf)*(b.stast?(10)?0.5*1) 然后所有火系魔法都用这样的公式
          烧冻结的目标只有一半伤害
          2、这种判定式,冒号前后不一定要用1啊0.5啊之类的数字,冒号两边也可以都是公式
          具体运用举例 我有一个坦克角色,这个角色会防御姿态,降低攻击力提升防御,设为5号状态
          坦克角色有个盾击技能,盾击伤害我们可以这样写,如果没有防御姿态,用攻击力结算,如果在防御姿态下,盾击时用防御力当成攻击力来用
          a.state?(5)? a.def*5-b.def : (a.atk*5-b.def)
          3、多个条件的判断举例
          我要做个龙珠里的悟空,有超1超2超3 三种变身
          给个技能就是踢一脚,普通状态下,就计算攻击力
          超一时把敏捷也算成攻击力,超二时连防御力都算成攻击力,超3就自身血量也算成攻击力
          看起来很复杂其实用公式就可以 我们设定超1是11号状态 超2是12号 超3是13号
          a.state?(11)? a.state?(12)? a.state?(13)? a.atk+a.agi : a.atk+a.agi+a.def : a.atk+a.def+a.agi+a.hp :a.atk
          一个公式就搞定了


          5楼2022-06-12 20:53
          回复
            下面说进阶一些的运用
            结合状态效果,公共事件,配合公式去实现技能


            6楼2022-06-12 21:01
            回复
              我现在要做一个爆发手段的技能,用了这个技能以后,让自己下一次攻击怎么怎么样
              如果是机器人大战,那么就是热血,下一击伤害加倍
              如果是魔兽世界,那么可以是冷血,下一击一定暴击
              想得简单一点的话,热血状态攻击力*200%
              就行,但是。。。攻击力加倍和伤害加倍,因公式而已是不一样的。
              所以我们还是要用上面的 N号状态判定去实现
              那么接下来还要面对一个问题,有人可能会说,下一击伤害翻倍的话,让那个状态持续2个回合就行
              第一个回合加状态,下回合放大招,这样的话逻辑还是不一样的,下一击≠下个回合
              如果我们需要:只要我不动手那个状态就一直在,出手了状态就没了
              其实有思路也很简单,做一个公共事件,事件中把那个状态移除,然后把那个角色所有伤害型技能释放时都触发那个公共事件即可。
              2,利用公共事件暗中换技能,例:我有一个法师,正常的火球不会暴击,给了自己30号状态的BUFF后,下一个火球不消耗MP而且会暴击,那么在加30号状态的这个技能上去触发事件,事件中忘记掉原先的火球,在下一行的技能就设一个会暴击且不耗蓝的火球,这个特殊火球释放的时候,再触发公共事件把这个技能忘记,学会原来的火球,就实现了,不过需要注意的是,这种偷换技能,两个技能ID要临接,不然位置换掉就被玩家看出来其实不是一个技能了。


              7楼2022-06-12 21:20
              回复
                另外伤害公式里,除了判断状态以外
                判断开关 判断装备 都是可以用的


                8楼2022-06-12 21:22
                回复
                  哇,大佬


                  IP属地:广东来自Android客户端9楼2022-06-16 15:43
                  回复
                    补充一下很重要很重要的一点,实测下来RMVA的公式用除法很容易出问题
                    很多小伙伴应该也发现了
                    表示血量比例的话,a.hp/a.mhp这个表达经常无效,可改用a.hp_rate
                    其他用到除法的地方,如果有问题,想办法用乘法来解决
                    例如需要除以5的时候,写成*0.2肯定不会出问题


                    10楼2022-06-17 00:36
                    回复