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

Project1

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

[已经解决] Game_Battler3中关于技能判定

[复制链接]

Lv3.寻梦者

梦石
0
星屑
1513
在线时间
1448 小时
注册时间
2010-10-22
帖子
1011
跳转到指定楼层
1
发表于 2012-3-10 13:58:29 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
最近两天在研究被动技能,脚本在判断攻击方/被攻击方是否学会某一技能时常常出错,但有时又能正常运行,请求各位帮忙优化一下...


下面是脚本:
  1. #==============================================================================
  2. # ■ Game_Battler (分割定义 3)
  3. #------------------------------------------------------------------------------
  4. #  处理战斗者的类。这个类作为 Game_Actor 类与 Game_Enemy 类的
  5. # 超级类来使用。
  6. #==============================================================================

  7. class Game_Battler
  8.   #--------------------------------------------------------------------------
  9.   # ● 可以使用特技的判定
  10.   #     skill_id : 特技 ID
  11.   #--------------------------------------------------------------------------
  12.   def skill_can_use?(skill_id)
  13.     # SP 不足的情况下不能使用
  14.     if $data_skills[skill_id].sp_cost > self.sp
  15.       return false
  16.     end
  17.     # 战斗不能的情况下不能使用
  18.     if dead?
  19.       return false
  20.     end
  21.     # 沉默状态的情况下、物理特技以外的特技不能使用
  22.     if $data_skills[skill_id].atk_f == 0 and self.restriction == 1
  23.       return false
  24.     end
  25.     # 获取可以使用的时机
  26.     occasion = $data_skills[skill_id].occasion
  27.     # 战斗中的情况下
  28.     if $game_temp.in_battle
  29.       # [平时] 或者是 [战斗中] 可以使用
  30.       return (occasion == 0 or occasion == 1)
  31.     # 不是战斗中的情况下
  32.     else
  33.       # [平时] 或者是 [菜单中] 可以使用
  34.       return (occasion == 0 or occasion == 2)
  35.     end
  36.   end
  37.   #--------------------------------------------------------------------------
  38.   # ● 应用通常攻击效果
  39.   #     attacker : 攻击者 (battler)
  40.   #--------------------------------------------------------------------------
  41.   def attack_effect(attacker)
  42.     # 清除会心一击标志
  43.     self.critical = false
  44.     # 第一命中判定
  45.     hit_result = (rand(100) < attacker.hit)
  46.     # 命中的情况下
  47.     if hit_result == true
  48.       # 计算基本伤害
  49.       atk = [attacker.atk - self.pdef / 2, 0].max
  50.       self.damage = atk * (20 + attacker.str) / 20
  51.       # 属性修正
  52.       self.damage *= elements_correct(attacker.element_set)
  53.       self.damage /= 100
  54.       # 伤害符号正确的情况下
  55.       if self.damage > 0
  56.         # 会心一击修正
  57.         if rand(100) < 4 * attacker.dex / self.agi
  58.           self.damage *= 2
  59.           self.critical = true
  60.         end
  61.         # 防御修正
  62.         if self.guarding?
  63.           self.damage /= 2
  64.         end
  65.       end
  66.       # 分散
  67.       if self.damage.abs > 0
  68.         amp = [self.damage.abs * 15 / 100, 1].max
  69.         self.damage += rand(amp+1) + rand(amp+1) - amp
  70.       end
  71.       # 第二命中判定
  72.       eva = 8 * self.agi / attacker.dex + self.eva
  73.       hit = self.damage < 0 ? 100 : 100 - eva
  74.       hit = self.cant_evade? ? 100 : hit
  75.       hit_result = (rand(100) < hit)
  76.     end
  77.     # 命中的情况下
  78.     if hit_result == true
  79.       # 状态冲击解除
  80.       remove_states_shock
  81.       # HP 的伤害计算
  82.       #==========================================================================
  83.       #若果攻击方学会以下几种技能的场合,普通攻击带有吸血效果。_learn?
  84.       #107嗜血补元 219死肉之体
  85.       if attacker.skills.include?(107) or attacker.skills.include?(219)
  86.         attacker.hp += self.damage/10 #10%吸血效果
  87.         end
  88.       if attacker.states.include?(64) && self.states.include?(65) #寄生者受到宿主攻击的场合
  89.          attacker.hp -= self.damage*2 #攻击方(宿主)受到两倍伤害
  90.        end
  91.       #若果对象状态包括以下几种的场合,物理攻击的过程中会被吸收魔力。
  92.       #88嗜魔之体
  93.       if self.states.include?(88)
  94.         attacker.sp -= self.damage/10 #攻击方受到伤害值10%的魔力流失
  95.         end
  96.       #若果对象状态包括以下几种的场合,物理攻击失败。
  97.       #50虚无之体 56影潜 68影狙 95雾化 219伏杀
  98.       if self.states.include?(50)or self.states.include?(56)or self.states.include?(68)or self.states.include?(95)or self.states.include?(219)
  99.         self.damage = "Miss"
  100.       else
  101.         self.hp -= self.damage#对象正常情况下受到的物理伤害
  102.         end
  103.       #=======================================================================
  104.       # 状态变化
  105.       @state_changed = false
  106.       states_plus(attacker.plus_state_set)
  107.       states_minus(attacker.minus_state_set)
  108.     # Miss 的情况下
  109.     else
  110.       # 伤害设置为 "Miss"
  111.       self.damage = "Miss"
  112.       # 清除会心一击标志
  113.       self.critical = false
  114.     end
  115.     # 过程结束
  116.     return true
  117.   end
  118.   #--------------------------------------------------------------------------
  119.   # ● 应用特技效果
  120.   #     user  : 特技的使用者 (battler)
  121.   #     skill : 特技
  122.   #--------------------------------------------------------------------------
  123.   def skill_effect(user, skill)
  124.     # 清除会心一击标志
  125.     self.critical = false
  126.     # 特技的效果范围是 HP 1 以上的己方、自己的 HP 为 0、
  127.     # 或者特技的效果范围是 HP 0 的己方、自己的 HP 为 1 以上的情况下
  128.     if ((skill.scope == 3 or skill.scope == 4) and self.hp == 0) or
  129.        ((skill.scope == 5 or skill.scope == 6) and self.hp >= 1)
  130.       # 过程结束
  131.       return false
  132.     end
  133.     # 清除有效标志
  134.     effective = false
  135.     # 公共事件 ID 是有效的情况下,设置为有效标志
  136.     effective |= skill.common_event_id > 0
  137.     # 第一命中判定
  138.     hit = skill.hit
  139.     if skill.atk_f > 0
  140.       hit *= user.hit / 100
  141.     end
  142.     hit_result = (rand(100) < hit)
  143.     # 不确定的特技的情况下设置为有效标志
  144.     effective |= hit < 100
  145.     # 命中的情况下
  146.     if hit_result == true
  147.       # 计算威力
  148.       power = skill.power + user.atk * skill.atk_f / 100
  149.       if power > 0
  150.         power -= self.pdef * skill.pdef_f / 200
  151.         power -= self.mdef * skill.mdef_f / 200
  152.         power = [power, 0].max
  153.       end
  154.       # 计算倍率
  155.       rate = 20
  156.       rate += (user.str * skill.str_f / 100)
  157.       rate += (user.dex * skill.dex_f / 100)
  158.       rate += (user.agi * skill.agi_f / 100)
  159.       rate += (user.int * skill.int_f / 100)
  160.       # 计算基本伤害
  161.       self.damage = power * rate / 20
  162.       # 属性修正
  163.       self.damage *= elements_correct(skill.element_set)
  164.       self.damage /= 100
  165.       # 伤害符号正确的情况下
  166.       if self.damage > 0
  167.         # 防御修正
  168.         if self.guarding?
  169.           self.damage /= 2
  170.         end
  171.       end
  172.       # 分散
  173.       if skill.variance > 0 and self.damage.abs > 0
  174.         amp = [self.damage.abs * skill.variance / 100, 1].max
  175.         self.damage += rand(amp+1) + rand(amp+1) - amp
  176.       end
  177.       # 第二命中判定
  178.       eva = 8 * self.agi / user.dex + self.eva
  179.       hit = self.damage < 0 ? 100 : 100 - eva * skill.eva_f / 100
  180.       hit = self.cant_evade? ? 100 : hit
  181.       hit_result = (rand(100) < hit)
  182.       # 不确定的特技的情况下设置为有效标志
  183.       effective |= hit < 100
  184.     end
  185.     # 命中的情况下
  186.     if hit_result == true
  187.       # 威力 0 以外的物理攻击的情况下
  188.       if skill.power != 0 and skill.atk_f > 0
  189.         # 状态冲击解除
  190.         remove_states_shock
  191.         # 设置有效标志
  192.         effective = true
  193.       end
  194.       # HP 的伤害减法运算
  195.       last_hp = self.hp
  196.       #===================================================================
  197.       #若果对象状态包括以下几种的场合,技能攻击失败。
  198.       #50虚无之体 56影潜 68影狙 95雾化 219伏杀
  199.       if self.states.include?(50)or self.states.include?(56)or self.states.include?(68)or self.states.include?(95)or self.states.include?(219)
  200.         self.damage = 0
  201.       end
  202.       #if skill.id==88 #吸魔技能ID
  203.         #self.sp -= self.damage
  204.         #user.sp += self.damage
  205.         #self.damage = 0
  206.         #end
  207.       if skill.id==107 or skill.id==448#吸血技能ID
  208.         self.hp -= self.damage
  209.         user.hp += self.damage/2 #附带50%吸血效果
  210.       else
  211.       self.hp -= self.damage#正常情况下的伤害计算
  212.       end
  213.       if skill.id==454 #寄生技能
  214.         user.add_state(65) #附加寄生者状态  
  215.         end
  216.       if user.states.include?(64) && self.states.include?(65) #寄生者受到宿主攻击的场合
  217.          user.hp -= self.damage*2 #攻击方受到两倍伤害
  218.         end
  219.       #====================================================================
  220.       effective |= self.hp != last_hp
  221.       # 状态变化
  222.       @state_changed = false
  223.       effective |= states_plus(skill.plus_state_set)
  224.       effective |= states_minus(skill.minus_state_set)
  225.       # 威力为 0 的场合
  226.       if skill.power == 0
  227.         # 伤害设置为空的字串
  228.         self.damage = ""
  229.         # 状态没有变化的情况下
  230.         unless @state_changed
  231.           # 伤害设置为 "Miss"
  232.           self.damage = "Miss"
  233.         end
  234.       end
  235.     # Miss 的情况下
  236.     else
  237.       # 伤害设置为 "Miss"
  238.       self.damage = "Miss"
  239.     end
  240.     # 不在战斗中的情况下
  241.     unless $game_temp.in_battle
  242.       # 伤害设置为 nil
  243.       self.damage = nil
  244.     end
  245.     # 过程结束
  246.     return effective
  247.   end
  248.   #--------------------------------------------------------------------------
  249.   # ● 应用物品效果
  250.   #     item : 物品
  251.   #--------------------------------------------------------------------------
  252.   def item_effect(item)
  253.     # 清除会心一击标志
  254.     self.critical = false
  255.     # 物品的效果范围是 HP 1 以上的己方、自己的 HP 为 0、
  256.     # 或者物品的效果范围是 HP 0 的己方、自己的 HP 为 1 以上的情况下
  257.     if ((item.scope == 3 or item.scope == 4) and self.hp == 0) or
  258.        ((item.scope == 5 or item.scope == 6) and self.hp >= 1)
  259.       # 过程结束
  260.       return false
  261.     end
  262.     # 清除有效标志
  263.     effective = false
  264.     # 公共事件 ID 是有效的情况下,设置为有效标志
  265.     effective |= item.common_event_id > 0
  266.     # 命中判定
  267.     hit_result = (rand(100) < item.hit)
  268.     # 不确定的特技的情况下设置为有效标志
  269.     effective |= item.hit < 100
  270.     # 命中的情况
  271.     if hit_result == true
  272.       # 计算回复量
  273.       recover_hp = maxhp * item.recover_hp_rate / 100 + item.recover_hp
  274.       recover_sp = maxsp * item.recover_sp_rate / 100 + item.recover_sp
  275.       if recover_hp < 0
  276.         recover_hp += self.pdef * item.pdef_f / 20
  277.         recover_hp += self.mdef * item.mdef_f / 20
  278.         recover_hp = [recover_hp, 0].min
  279.       end
  280.       # 属性修正
  281.       recover_hp *= elements_correct(item.element_set)
  282.       recover_hp /= 100
  283.       recover_sp *= elements_correct(item.element_set)
  284.       recover_sp /= 100
  285.       # 分散
  286.       if item.variance > 0 and recover_hp.abs > 0
  287.         amp = [recover_hp.abs * item.variance / 100, 1].max
  288.         recover_hp += rand(amp+1) + rand(amp+1) - amp
  289.       end
  290.       if item.variance > 0 and recover_sp.abs > 0
  291.         amp = [recover_sp.abs * item.variance / 100, 1].max
  292.         recover_sp += rand(amp+1) + rand(amp+1) - amp
  293.       end
  294.       # 回复量符号为负的情况下
  295.       if recover_hp < 0
  296.         # 防御修正
  297.         if self.guarding?
  298.           recover_hp /= 2
  299.         end
  300.       end
  301.       # HP 回复量符号的反转、设置伤害值
  302.       self.damage = -recover_hp
  303.       # HP 以及 SP 的回复
  304.       last_hp = self.hp
  305.       last_sp = self.sp
  306.       self.hp += recover_hp
  307.       self.sp += recover_sp
  308.       effective |= self.hp != last_hp
  309.       effective |= self.sp != last_sp
  310.       # 状态变化
  311.       @state_changed = false
  312.       effective |= states_plus(item.plus_state_set)
  313.       effective |= states_minus(item.minus_state_set)
  314.       # 能力上升值有效的情况下
  315.       if item.parameter_type > 0 and item.parameter_points != 0
  316.         # 能力值的分支
  317.         case item.parameter_type
  318.         when 1  # MaxHP
  319.           @maxhp_plus += item.parameter_points
  320.         when 2  # MaxSP
  321.           @maxsp_plus += item.parameter_points
  322.         when 3  # 力量
  323.           @str_plus += item.parameter_points
  324.         when 4  # 灵巧
  325.           @dex_plus += item.parameter_points
  326.         when 5  # 速度
  327.           @agi_plus += item.parameter_points
  328.         when 6  # 魔力
  329.           @int_plus += item.parameter_points
  330.         end
  331.         # 设置有效标志
  332.         effective = true
  333.       end
  334.       # HP 回复率与回复量为 0 的情况下
  335.       if item.recover_hp_rate == 0 and item.recover_hp == 0
  336.         # 设置伤害为空的字符串
  337.         self.damage = ""
  338.         # SP 回复率与回复量为 0、能力上升值无效的情况下
  339.         if item.recover_sp_rate == 0 and item.recover_sp == 0 and
  340.            (item.parameter_type == 0 or item.parameter_points == 0)
  341.           # 状态没有变化的情况下
  342.           unless @state_changed
  343.             # 伤害设置为 "Miss"
  344.             self.damage = "Miss"
  345.           end
  346.         end
  347.       end
  348.     # Miss 的情况下
  349.     else
  350.       # 伤害设置为 "Miss"
  351.       self.damage = "Miss"
  352.     end
  353.     # 不在战斗中的情况下
  354.     unless $game_temp.in_battle
  355.       # 伤害设置为 nil
  356.       self.damage = nil
  357.     end
  358.     # 过程结束
  359.     return effective
  360.   end
  361.   #--------------------------------------------------------------------------
  362.   # ● 应用连续伤害效果
  363.   #--------------------------------------------------------------------------
  364.   def slip_damage_effect
  365.     # 设置伤害
  366. #===========================================================================
  367.     #以下状态为对精力产生效果
  368.     #81聚气 89掌控
  369.   if self.state?(81) or self.state?(89)
  370.     if self.state?(81) #聚气
  371.       self.damage -= self.maxsp / 20 #聚气持续恢复5%精力
  372.       end
  373.     if self.state?(89) #掌控
  374.       self.damage = self.maxsp / 100 #掌控持续散失1%精力
  375.     end
  376.    
  377.     # 分散
  378.     if self.damage.abs > 0
  379.       amp = [self.damage.abs * 15 / 100, 1].max
  380.       self.damage += rand(amp+1) + rand(amp+1) - amp
  381.     end
  382.     # SP 的伤害减法运算
  383.     self.sp -= self.damage
  384.     #以下状态为对体能产生效果
  385.     #80缓疗
  386.   else
  387.     if self.state?(80) #缓疗
  388.     self.damage = -self.maxhp / 10#缓疗持续恢复10%体能
  389.   else
  390.     self.damage = self.maxhp / 10#持续失去10%体能
  391.     end
  392.     # 分散
  393.     if self.damage.abs > 0
  394.       amp = [self.damage.abs * 15 / 100, 1].max
  395.       self.damage += rand(amp+1) + rand(amp+1) - amp
  396.     end
  397.     # HP 的伤害减法运算
  398.     self.hp -= self.damage
  399.     end
  400. #===========================================================================
  401.     # 过程结束
  402.     return true
  403.   end
  404.   #--------------------------------------------------------------------------
  405.   # ● 属性修正计算
  406.   #     element_set : 属性
  407.   #--------------------------------------------------------------------------
  408.   def elements_correct(element_set)
  409.     # 無属性的情况
  410.     if element_set == []
  411.       # 返回 100
  412.       return 100
  413.     end
  414.     # 在被赋予的属性中返回最弱的
  415.     # ※过程 element_rate 是、本类以及继承的 Game_Actor
  416.     #   和 Game_Enemy 类的定义
  417.     weakest = -100
  418.     for i in element_set
  419.       weakest = [weakest, self.element_rate(i)].max
  420.     end
  421.     return weakest
  422.   end
  423. end
复制代码
【2022.06.03】原本以为已经不可能再找回来的东西重新找回来了,原本一直念念不忘的坑终于再一次拿起铲子了。一别竟近10年,你好,我的世界我的梦。

Lv1.梦旅人

虱子

梦石
0
星屑
121
在线时间
1782 小时
注册时间
2010-6-19
帖子
3597
2
发表于 2012-3-10 19:27:21 | 只看该作者
skills类只是Game_Actor类有,Game_Enemy类并没有,它有的只是.action
分类方法:is_a?

点评

忽然间恍然大悟,用else就可以了吧! 睡了一觉人果然清醒了许多,在下不胜感激!  发表于 2012-3-11 12:45
...或者当特定为某种怪物(例如吸血蝙蝠,普通攻击也能吸血)的情况下呢?  发表于 2012-3-10 21:58
好像有点懂了,意思是如果是怪物触发了脚本的时候才会弹出错误吗?就是在判断技能之前先判断是否为角色吗?那么如果是怪物的技能呢?  发表于 2012-3-10 21:55
可否举个例子?就以下面的脚本为例,用attacker.is_a?(Game_Actor)来判断attacker是否学会107号技能...我不是很懂这个语法的表达方法...  发表于 2012-3-10 21:42
...主要是有时候会弹出错误,不是很稳定...请问有没有替代的方法? 在下现在还停留在生搬硬套的查字典阶段...  发表于 2012-3-10 20:23

http://rpg.blue/thread-175056-1-2.html
PVZ型塔防物一个
http://rpg.blue/thread-155199-1-2.html
RMXP技术讨论区手动认可帖,得到答案请认可
回复

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1513
在线时间
1448 小时
注册时间
2010-10-22
帖子
1011
3
 楼主| 发表于 2012-3-10 20:27:33 | 只看该作者
在下现在还停留在生搬硬套的查字典阶段...
...主要是有时候会弹出错误,不是很稳定...请问有没有替代的方法?运行通畅的时候其效果是能够发挥的,比如这一段:
  1.       #若果攻击方学会以下几种技能的场合,普通攻击带有吸血效果。_learn?

  2.       #107嗜血补元 219死肉之体

  3.       if attacker.skills.include?(107) or attacker.skills.include?(219)

  4.         attacker.hp += self.damage/10 #10%吸血效果

  5.         end
复制代码
在战斗时能够正常运行,但有时使用其他技能或者普通攻击时又会弹出错误...
是以求解。

点评

判断attacker是否为Game_Actor类,因为只有Game_Actor才有skills这个方法  发表于 2012-3-10 21:48
因为判定时attacker是Game_Enemy类,没有skills这个方法,可以用attacker.is_a?(Game_Actor)来判定  发表于 2012-3-10 21:26
【2022.06.03】原本以为已经不可能再找回来的东西重新找回来了,原本一直念念不忘的坑终于再一次拿起铲子了。一别竟近10年,你好,我的世界我的梦。
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-4-29 05:22

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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