Project1

标题: 求命中回避上限下限突破的方法以及一些相关的附带问题。 [打印本页]

作者: lirn    时间: 2012-6-23 23:03
标题: 求命中回避上限下限突破的方法以及一些相关的附带问题。
新人的话不是很懂脚本,尝试弄了几天,还是不行,搜索过发觉只有一般数值突破上限,

自己姑且在脚本找到几个吧。

Game_Battler下面第

@result.missed = (@result.used && rand >= item_hit(user, item))

问题是在于,命中HIT与回避EVA还有魔法回避MEV的上下限是0-100,可以将他们的上下限突破这个数值吗?item_hit(user, item)(如果我想的是对的话)的取值范围为最大值的100范围之内,也就是命中比回避大100就是必中。

这么做是否可行?如果公式不好运用的话只突破正值,不设置负数命中与负数回避也行。

===========================================================

还有的是,假如上面可行的话,我想加一个魔法命中的数值,具体操作大概

GAME_BATTLER 75行
def mhi;  xparam(10)
GAME_BATTLER 474行
rate *=user.mhi if item.magical?       # 魔法攻击:计算成功几率的乘积

也不知道上面有没有错,而且之后,我就不懂怎么输入,可以拓展能力输入栏吗?如果不行,怎么用在注释里标明?dsu_plus_rewardpost_czw
作者: feizhaodan    时间: 2012-6-24 10:13
我怎么记得特征里的命中率可以设置100以上。
多设置几个命中率+X%就行了。
作者: lirn    时间: 2012-6-24 10:18
本帖最后由 lirn 于 2012-6-24 10:19 编辑
feizhaodan 发表于 2012-6-24 10:13
我怎么记得特征里的命中率可以设置100以上。
多设置几个命中率+X%就行了。 ...


不行,我试过了,哪怕是设置了2个100命中状态,再加上自身的,对方一个100回避,就全MISS。
作者: feizhaodan    时间: 2012-6-24 10:21
lirn 发表于 2012-6-24 10:18
不行,我试过了,哪怕是设置了2个100命中状态,再加上自身的,对方一个100回避,就全MISS。 ...

因为RM的回避和命中是分别判定的。
命中只管命中,回避只管回避。两个没关系。
作者: lirn    时间: 2012-6-24 10:24
feizhaodan 发表于 2012-6-24 10:21
因为RM的回避和命中是分别判定的。
命中只管命中,回避只管回避。两个没关系。 ...

从脚本呢公式上看,MISS的条件是回避值大于等于命中,假如命中值的上限能突破一百,那就不会出现必然回避的情况。既然必然回避,那就说明,命中值不能超过回避值100.
作者: feizhaodan    时间: 2012-6-24 10:28
  1.     @result.missed = (@result.used && rand >= item_hit(user, item))  # 命中判定
  2.     @result.evaded = ([email protected] && rand < item_eva(user, item))# 回避判定
复制代码
这是原脚本。命中和回避没有直接的关联。
第一行的判定,是随机一个数,当随机数小于道具命中*角色命中时道具命中。
第二行的判定,当道具命中时,随机数小于回避率时,被攻击方回避道具攻击。
作者: lirn    时间: 2012-6-24 11:01
本帖最后由 lirn 于 2012-6-24 11:05 编辑
feizhaodan 发表于 2012-6-24 10:28
这是原脚本。命中和回避没有直接的关联。
第一行的判定,是随机一个数,当随机数小于道具命中*角色命中时道 ...


def item_hit(user, item)
    rate = item.success_rate * 0.01         # 获取成功几率
    rate *= user.hit if item.physical?      # 物理攻击:计算成功几率的乘积   
    return rate                             # 返回计算后的成功几率
  end

HIT就是命中率

…………
我明白了你的意思了,你的意思是,命中之后再另外计算回避几率?

两个随机数是分开计算?
作者: lirn    时间: 2012-6-24 18:45
本帖最后由 lirn 于 2012-6-24 18:46 编辑
feizhaodan 发表于 2012-6-24 10:28
这是原脚本。命中和回避没有直接的关联。
第一行的判定,是随机一个数,当随机数小于道具命中*角色命中时道 ...


@result.missed = (@result.used && rand >= item_hit(user, item))
@result.evaded = ([email protected] && rand < item_eva(user, item))

上面那个的意思是,物品可以使用且当随机数大于等于命中时,出现MISS,下面那个是当不是MISS的情况下且随机数少于回避,则回避成功,是这样吧。
那么我这么改。

def skill_hit
   skill_hit=if rand(100).between?(item_hit(user, item)-100,item_hit(user, item)

@result.missed =false

@result.evaded = (@result.used  && skill_hit)< item_eva(user, item))

那这样可行否?当然,语法估计也是有语的,大意上这样可行不?

还有的是,在怎么弄成脚本形式?
作者: feizhaodan    时间: 2012-6-24 19:06
1,item_hit和item_eval返回的是0.xx,而不是xx%的形式。
2,其实我看不懂你想表达的是啥= =
作者: lirn    时间: 2012-6-24 19:21
本帖最后由 lirn 于 2012-6-24 22:01 编辑
feizhaodan 发表于 2012-6-24 19:06
1,item_hit和item_eval返回的是0.xx,而不是xx%的形式。
2,其实我看不懂你想表达的是啥= = ...


1:RAND产生的数字不是整数吗?
2:首先,我是把回避给取消了,无论命中如何,都不会MISS;然后设置一个数,就是从(HIT-100,HIT)之中随机取一个数,如果这个数字少于回避值,那么才表示这次攻击失效。也就是把命中跟回避挂钩起来。


对了,我是同时在用后知后觉那个横版脚本,不知道有没有影响。
作者: feizhaodan    时间: 2012-6-24 19:29
本帖最后由 feizhaodan 于 2012-6-25 12:41 编辑
lirn 发表于 2012-6-24 19:21
1:RAND产生的数字不是整数吗?
2:首先,我是把回避给取消了,无论命中如何,都不会MISS;然后设置一个 ...


1,rand后面没有(x)的时候产生的是0-1之间的随机数。
2,我明白了。大概就是
  1. @result.missed = false
  2. @result.evaded = item_eva(user,item) > (item_hit(user,item)-1+rand(item_hit(user,item)))
复制代码
第二行的解释,
  1. @result.missed = false
复制代码
这行让攻击永远发生命中判定。
  1. @result.evaded = item_eva(user,item) > ((item_hit(user,item)-1..item_hit(user,item)).to_a.sample)
复制代码
这行让回避判定变为当被攻击方的回避大于攻击方德(命中-1)这个数值到(命中)数值之间的一个随机数时,回避攻击。

是这样么?���
作者: lirn    时间: 2012-6-24 19:53
没错,不过这个之前还有个物品是否能使用的@result.used = item_test(user, item),那是不是在在前面加上@result.used &&  ?



@result.evaded = (@result.used && item_eva(user,item) > ((item_hit(user,item)-1..item_hit(user,item)).to_a.sample))


作者: feizhaodan    时间: 2012-6-24 20:06
本帖最后由 feizhaodan 于 2012-6-24 20:06 编辑
lirn 发表于 2012-6-24 19:53
没错,不过这个之前还有个物品是否能使用的@result.used = item_test(user, item),那是不是在在前面加上@r ...


是要加,但是你括号放错位置了。
这样方的话,最终将会变成
  1. true或者false > 数字
复制代码
这样。要把@result.used和其他的分开放。
作者: lirn    时间: 2012-6-24 21:58
feizhaodan 发表于 2012-6-24 20:06
是要加,但是你括号放错位置了。
这样方的话,最终将会变成这样。要把@result.used和其他的分开放。 ...



似乎不行呢。
作者: s05s0039    时间: 2012-6-25 00:12
路過。。。
招式庫有必中選項。。100迴 還是必中
作者: feizhaodan    时间: 2012-6-25 08:54
lirn 发表于 2012-6-24 21:58
似乎不行呢。

把周边脚本放上来。只给个错误提示我不知道哪里错了。
作者: lirn    时间: 2012-6-25 09:52
feizhaodan 发表于 2012-6-25 08:54
把周边脚本放上来。只给个错误提示我不知道哪里错了。



周边脚本?我基本上没动什么,用的两个都是在图书馆下的,作者都是后知后觉。
作者: feizhaodan    时间: 2012-6-25 10:23
lirn 发表于 2012-6-25 09:52
周边脚本?我基本上没动什么,用的两个都是在图书馆下的,作者都是后知后觉。 ...

是出错的脚本的附近= =
作者: lirn    时间: 2012-6-25 10:38
  1. #--------------------------------------------------------------------------
  2.   # ● 应用技能/物品的效果
  3.   #--------------------------------------------------------------------------
  4.   def item_apply(user, item)
  5.     @result.clear
  6.     @result.used = item_test(user, item)
  7.     @result.missed = (@result.used && rand >= item_hit(user, item))  # 命中判定
  8.     @result.evaded = ([email protected] && rand < item_eva(user, item))# 回避判定
  9.     if @result.hit?
  10.       unless item.damage.none?
  11.         @result.critical = (rand < item_cri(user, item))
  12.         make_damage_value(user, item)
  13.         execute_damage(user)
  14.       end
  15.       item.effects.each {|effect| item_effect_apply(user, item, effect) }
  16.       item_user_effect(user, item)
  17.     end
  18.   end
复制代码
这是正常的原脚本
作者: lirn    时间: 2012-6-25 11:15
feizhaodan 发表于 2012-6-25 10:23
是出错的脚本的附近= =

替换之后

第8行,也就是@result.evaded = item_eva(user,item) > ((item_hit(user,item)-1..item_hit(user,item)).to_a.sample)

这句出错
作者: lirn    时间: 2012-6-25 17:26
feizhaodan 发表于 2012-6-25 10:23
是出错的脚本的附近= =

似乎有些可行,但是命中率有些奇怪,100命中打100回避的是百分百命中,100命中打110回避的是40%-50%命中
作者: lirn    时间: 2012-6-26 11:42
本帖最后由 lirn 于 2012-6-26 16:47 编辑
  1.   @result.missed = (@result.used && (rand+1) >= (item_hit(user,item)-item_eva(user,item)))
  2.     @result.evaded = false
复制代码
我稍微改了一下,普通攻击,技能尚未测试,大概做到了命中减回避大于100就必中,50大概是半中,25%的话每10次大概都有2-3次MISS。

为什么RAND后面要加1?,命中与回避相同的的时候,HIT-EVA应该=0吧。


出现问题了……防御也MISS了……似乎技能是必然MISS,即使对方回避率为0……错在哪里?


====================================================================

问题是大概是找到了,物理系技能返回的是回避,物理技能返回的是魔法回避,这些技能对自己也有的命中与回避也有影响,但不知道必中的类型是哪个,也不知道
  1.   def item_hit(user, item)
  2.     rate = item.success_rate * 0.01         # 取得成功率
  3.     rate *= user.hit if item.physical?      # 物理攻击:计算命中率的乘积
  4.     rate *= user.hit if item.magical?
  5.     return rate                             # 返回计算后的命中率
  6.   end
复制代码
在这个公式当中出现了问题,比如说技能成功率为50%,命中200,回避100,那么实际的计算公式是200*0.5-100=0,而不是(200-100)*0.5=50.


于是乎,改成这样,暂时还没发现问题
  1. #--------------------------------------------------------------------------
  2.   # ● 计算技能/物品的命中率
  3.   #--------------------------------------------------------------------------
  4.   def item_hit(user, item)
  5.        rate = item.success_rate * 0.01         # 取得成功率
  6.     rate *= (user.hit-eva) if item.physical?      # 物理攻击:计算命中率的乘积
  7.     rate *= (user.hit-mev) if item.magical?  #魔法攻击:计算命中率的乘积
  8.       return rate                             # 返回计算后的命中率
  9.   end
复制代码

  1.   #--------------------------------------------------------------------------
  2.   # ● 应用技能/物品的效果
  3.   #--------------------------------------------------------------------------
  4.   def item_apply(user, item)
  5.     @result.clear
  6.     @result.used = item_test(user, item)
  7.     @result.missed = (@result.used && rand >= item_hit(user, item))  # 命中判定
  8.     @result.evaded = false
复制代码

作者: lirn    时间: 2012-6-26 16:37
以后发现问题再来提问




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