Project1

标题: 如何让战斗恢复量与变量挂钩? [打印本页]

作者: 奶油Da蛋糕    时间: 2009-8-18 15:40
标题: 如何让战斗恢复量与变量挂钩?
使用增益、恢复、减益特技时受魅力属性的影响。
比如:魅力每增加0.8,恢复量+1,魅力每增加1,使用封印特技的命中率+0.2%。
(在数据库中,封印特技的命中率是固定的,并且恢复量是受威力影响的。)
作者: 越前リョーマ    时间: 2009-8-18 15:54
公共事件。
作者: 迅羽    时间: 2009-8-18 17:14
提示: 作者被禁止或删除 内容自动屏蔽
作者: 后知后觉    时间: 2009-8-18 19:51
Game_Battler 3
作者: 奶油Da蛋糕    时间: 2009-8-18 20:18
本帖最后由 奶油Da蛋糕 于 2009-8-18 20:30 编辑
Game_Battler 3
后知后觉 发表于 2009-8-18 19:51


    # 第一命中判定
    @actor = $game_party.actors#[@actor_index]
    hit = skill.hit + $data_actors[@actor.id].max_dex_stars * 0.002
    if skill.atk_f > 0
      hit *= user.hit / 100
    end
    hit_result = (rand(100) < hit)

不知道这样会不会生效呢。
作者: 后知后觉    时间: 2009-8-18 22:05
本帖最后由 后知后觉 于 2009-8-18 22:10 编辑

有没有用你自己运行下不就知道了么.....
请问你的 @actor_index 是从哪里弄来的?
你可别告诉我是Scene_Battle 里的那个 @actor_index

看看这个特技效果应用的方法的定义的首行吧
  def skill_effect(user, skill)

user 就是使用 后面这个 skill 的人
所以没有必要再去获取一次这个@actor
而这个特技是对谁使用的呢 是对 self 使用的
还有就是 $game_xxx和$data_xxx的关系
$data_xxx是数据库的内容 在默认情况下
$data_xxx的东西在游戏运行的时候是不会发生任何改变的
会发生改变的是$game_xxx
$game_xxx的东西需要获取初始化数据的时候就是从$data_xxx读取的
作者: 奶油Da蛋糕    时间: 2009-8-19 11:20
  1.     # 第一命中判定
  2.     hit = skill.hit + $data_actors[@actor.id].max_dex_stars * 0.002
  3.     if skill.atk_f > 0
  4.       hit *= user.hit / 100
  5.     end
  6.     hit_result = (rand(100) < hit)
复制代码
您的意思是说这样就可以了吧?
关于魅力值的变量,是我从加点系统中找到的。
加点系统中并没有出现过$game_XXX的东西。
$temp_dex要么是这个,$data_actors[@actor.id].max_dex_stars要么就是这个。
  1.        # 将角色点数实际加上
  2.        @actor.str += $temp_str
  3.        @actor.dex += $temp_dex
  4.        @actor.agi += $temp_agi
  5.        @actor.int += $temp_int
  6.        @actor.maxhp += $temp_hp
  7.        @actor.maxsp += $temp_sp
  8.        @actor.maxhp = $data_actors[@actor.id].max_hp_stars if @actor.maxhp >= $data_actors[@actor.id].max_hp_stars and $data_actors[@actor.id].max_hp_stars != 0
  9.        @actor.maxsp = $data_actors[@actor.id].max_sp_stars if @actor.maxsp >= $data_actors[@actor.id].max_sp_stars and $data_actors[@actor.id].max_sp_stars != 0
  10.        @actor.str = $data_actors[@actor.id].max_str_stars if @actor.str >= $data_actors[@actor.id].max_str_stars and $data_actors[@actor.id].max_str_stars != 0
  11.        @actor.dex = $data_actors[@actor.id].max_dex_stars if @actor.dex >= $data_actors[@actor.id].max_dex_stars and $data_actors[@actor.id].max_dex_stars != 0
  12.        @actor.agi = $data_actors[@actor.id].max_agi_stars if @actor.agi >= $data_actors[@actor.id].max_agi_stars and $data_actors[@actor.id].max_agi_stars != 0
  13.        @actor.int = $data_actors[@actor.id].max_int_stars if @actor.int >= $data_actors[@actor.id].max_int_stars and $data_actors[@actor.id].max_int_stars != 0
复制代码
经过测试,在我给角色用加点系统增加了500点魅力之后,使用命中率为70%的封印两次均以失败告终。按理而言,500*0.2%=100%。那么命中率高达170%,为何还会失败呢。
作者: 后知后觉    时间: 2009-8-19 12:37
本帖最后由 后知后觉 于 2009-8-19 12:39 编辑

我已经说得很清楚了 user 就是使用特技的人 没有必要再去用data_actors获取一次
而且你那样写也是错误的,你根本就不知道什么叫对象
在上面我也说了$data_xxx是数据库,默认情况下根本不会在游戏里发生变化
hit = skill.hit + user.max_dex_stars * 2 / 1000
这个max_dex_stars 默认里没有,是不是你自己想要的数据我不清楚
hit = skill.hit + user.dex * 2 / 1000
可能是这样
作者: 奶油Da蛋糕    时间: 2009-8-19 14:50
我已经说得很清楚了 user 就是使用特技的人 没有必要再去用data_actors获取一次
而且你那样写也是错误的,你根本就不知道什么叫对象
在上面我也说了$data_xxx是数据库,默认情况下根本不会在游戏里发生变化
hit = sk ...
后知后觉 发表于 2009-8-19 12:37


    # 第一命中判定
    hit = skill.hit + (user.dex * 2 / 10) / 1.2
    if skill.atk_f > 0
      hit *=     end


先谢谢后知后觉大大了。
这样设置之后,如果灵巧是300点的话,hit就等于特技本身的命中率+(300*0.2)/1.2=70+50=120
然后hit *=user.hit / 100 ,命中率就是1.2,120%。
按理来说不会有失误发生。
但是,在测试中,300灵巧的角色在使用特技“幻雾迷朦”,有70%几率使对方陷入昏睡状态三回合。使用此特技后,仍然有很严重的失误现象,真正的命中率似乎连70%都达不到。
作者: 后知后觉    时间: 2009-8-19 16:20
本帖最后由 后知后觉 于 2009-8-19 17:19 编辑

user.hit 是状态追加的命中率
当状态没有追加命中率的时候  user.hit 是 100

而且这个第一命中率并不是状态命中率
而且那一行要这样写才比较合适
hit = skill.hit + (user.dex * 2 / 10) * 10 / 12

除了第一命中还有个第二命中
当第一命中成立的时候才会计算第二命中
当第二命中成立的时候才会计算状态变化
把这3个几率要同时发生才会附加状态
第一命中是技能的命中,也就是数据库-特技 里设置的那个命中
而第二命中是用攻击方的灵巧和对象方的速度来进行的比较
而状态变化是个固定的数组
[0,100,80,60,40,20,0]
     A   B   C   D   E  F

      # 状态变化
      @state_changed = false
      effective |= states_plus(skill.plus_state_set)
      effective |= states_minus(skill.minus_state_set)

全局搜索 def states_plus
可以找到那个数组
作者: 奶油Da蛋糕    时间: 2009-8-19 18:43
哦,原来状态是额外算命中几率的。
您的意思就是说,状态需要计算3次命中率。
普通非状态特技只需要计算2次命中率。
必须全部都等于true才算命中。是这个意思吗?
按照原来计算的,我测试的时候300灵巧,如果特技的命中率是70%,那么第一命中一定会通过。
  1.       # 第二命中判定
  2.       eva = 8 * self.agi / user.dex + self.eva
  3.       hit = self.damage < 0 ? 100 : 100 - eva * skill.eva_f / 100
  4.       hit = self.cant_evade? ? 100 : hit
  5.       hit_result = (rand(100) < hit)
  6.       # 不确定的特技的情况下设置为有效标志
  7.       effective |= hit < 100
  8.     end
复制代码
意思我们一句一句来分析。
eva = 8 * self.agi / user.dex + self.eva
回避 = 8 * 自己的速度 / 使用者的灵巧 + 自己的回避
hit = self.damage < 0 ? 100 : 100 - eva * skill.eva_f / 100
命中率 = 自己的威力 < 0 吗?如果是,就100。:否则 100 - 之前算出的回避。
OK,下面的我也看不懂了,不过问题就出来了。
经过我的测试,我那存档300灵巧,加上一个命中率70%,威力为-100的恢复特技。
第一命中率应该是可以完全超过100%的。
而第二命中命中率 = 自己的威力 < 0 吗?如果是,就100。
由于恢复招式威力是负数,所以无论如何,命中率都是100%。
按照您的意思,只要恢复类招式通过这两个命中率返回true就可以命中了吧?
但是,经过我的测试,推气过宫的特技的命中率仍然接近70%,仍然有可能不命中。
意思也就是说第一命中并没有生效?
作者: 奶油Da蛋糕    时间: 2009-8-19 19:18
我终于明白哪里的问题了。
....下面有重定义。。。。
写了半天都不会生效。。。
用了6R主站上的潜伏于发作脚本
作者: 后知后觉    时间: 2009-8-19 19:40
self 应该解释为 【对象方】,
又或者是 【调用这个方法的对象】,
比较好理解一些~




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