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

Project1

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

[已经解决] 关于攻击消耗道具脚本的问题

[复制链接]

Lv3.寻梦者

梦石
0
星屑
1433
在线时间
1705 小时
注册时间
2011-8-17
帖子
818
跳转到指定楼层
1
 楼主| 发表于 2013-1-21 20:34:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 黑舞嗜 于 2013-1-24 11:18 编辑

用了这个“远程系职业攻击消耗品”的脚本发现一个问题,就是如果没有装备武器的话268行出错,求脚本大神指点,如果可以让角色只能更换武器不能卸载武器也行

这个脚本的说明是数据库职业后面加上数字这个数字就是消耗的道具id,然后武器后面加上的数字是当前武器没有远程属性的时候播放的动画id

对于这个出错我的理解是,268行直接判断角色当前武器是否有远程属性而没有考虑角色有没有装备武器
所以我的思路是:
在此判定前先判断角色是否有装备武器,如果没有,直接播放数据库中制定的一个攻击动画

没有很复杂吧?召唤一下大神@Wind2010
  1. #==============================================================================
  2. # ■ 远程系职业攻击消耗品                                    EDIT BY:亿万星辰
  3. #------------------------------------------------------------------------------
  4. #  远程系的职业,如弓箭手、枪手等,使用普通攻击或物理攻击时,都会消耗一些特定
  5. #   的消耗品。
  6. #==============================================================================

  7. # 远程系的属性,数据库系统里填加。
  8. # 对应的远程系职业把此属性设置为A,对应的远程系使用的技能,此属性勾选。

  9. $STARS_远程属性 = 17
  10. module RPG
  11.   class Class
  12.     def name
  13.       if @element_ranks[$STARS_远程属性] == 1
  14.         return @name.split(/,/)[0]
  15.       else
  16.         return @name
  17.       end
  18.     end
  19.     def arrow_id
  20.       if @element_ranks[$STARS_远程属性] == 1
  21.         return @name.split(/,/)[1].to_i
  22.       else
  23.         return 0
  24.       end
  25.     end
  26.   end
  27.   class Weapon
  28.     def name
  29.       if @element_set.include?($STARS_远程属性)
  30.         return @name.split(/,/)[0]
  31.       else
  32.         return @name
  33.       end
  34.     end
  35.     def animation2_id(flag = false)
  36.       if flag
  37.         return @name.split(/,/)[1].to_i
  38.       else
  39.         return @animation2_id
  40.       end
  41.     end
  42.   end
  43. end

  44. class Game_Battler
  45.   #--------------------------------------------------------------------------
  46.   # ● 可以使用特技的判定
  47.   #     skill_id : 特技 ID
  48.   #--------------------------------------------------------------------------
  49.   def skill_can_use?(skill_id)
  50.     # SP 不足的情况下不能使用
  51.     if $data_skills[skill_id].sp_cost > self.sp
  52.       return false
  53.     end
  54.     # 战斗不能的情况下不能使用
  55.     if dead?
  56.       return false
  57.     end
  58.     # 沉默状态的情况下、物理特技以外的特技不能使用
  59.     if $data_skills[skill_id].atk_f == 0 and self.restriction == 1
  60.       return false
  61.     end
  62.     if self.is_a?(Game_Actor) and
  63.       $data_skills[skill_id].element_set.include?($STARS_远程属性) and
  64.       $game_party.item_number($data_classes[self.class_id].arrow_id) == 0
  65.       return false
  66.     end
  67.     # 获取可以使用的时机
  68.     occasion = $data_skills[skill_id].occasion
  69.     # 战斗中的情况下
  70.     if $game_temp.in_battle
  71.       # [平时] 或者是 [战斗中] 可以使用
  72.       return (occasion == 0 or occasion == 1)
  73.     # 不是战斗中的情况下
  74.     else
  75.       # [平时] 或者是 [菜单中] 可以使用
  76.       return (occasion == 0 or occasion == 2)
  77.     end
  78.   end
  79.   #--------------------------------------------------------------------------
  80.   # ● 应用通常攻击效果
  81.   #     attacker : 攻击者 (battler)
  82.   #--------------------------------------------------------------------------
  83.   def attack_effect(attacker)
  84.     # 清除会心一击标志
  85.     self.critical = false
  86.     # 第一命中判定
  87.     hit_result = (rand(100) < attacker.hit)
  88.     # 命中的情况下
  89.     if hit_result == true
  90.       # 计算基本伤害
  91.       atk = [attacker.atk - self.pdef / 2, 0].max
  92.       self.damage = atk * (20 + attacker.str) / 20
  93.       # 属性修正
  94.       self.damage *= elements_correct(attacker.element_set)
  95.       self.damage /= 100
  96.       # 伤害符号正确的情况下
  97.       if self.damage > 0
  98.         # 会心一击修正
  99.         if rand(100) < 4 * attacker.dex / self.agi
  100.           self.damage *= 2
  101.           self.critical = true
  102.         end
  103.         # 防御修正
  104.         if self.guarding?
  105.           self.damage /= 2
  106.         end
  107.       end
  108.       # 分散
  109.       if self.damage.abs > 0
  110.         amp = [self.damage.abs * 15 / 100, 1].max
  111.         self.damage += 0
  112.       end
  113.       # 第二命中判定
  114.       eva = 8 * self.agi / attacker.dex + self.eva
  115.       hit = self.damage < 0 ? 100 : 100 - eva
  116.       hit = self.cant_evade? ? 100 : hit
  117.       hit_result = (rand(100) < hit)
  118.     end
  119.     # 命中的情况下
  120.     if hit_result == true
  121.       # 状态冲击解除
  122.       remove_states_shock
  123.       # HP 的伤害计算
  124.       if attacker.is_a?(Game_Actor) and $data_classes[attacker.class_id].element_ranks[$STARS_远程属性] == 1
  125.         if $game_party.item_number($data_classes[attacker.class_id].arrow_id) == 0
  126.           self.damage +=  attacker.int
  127.         else
  128.           $game_party.lose_item($data_classes[attacker.class_id].arrow_id, 1)
  129.         end
  130.       end
  131.       self.hp -= self.damage
  132.       # 状态变化
  133.       @state_changed = false
  134.       states_plus(attacker.plus_state_set)
  135.       states_minus(attacker.minus_state_set)
  136.     # Miss 的情况下
  137.     else
  138.       # 伤害设置为 "Miss"
  139.       self.damage = "Miss"
  140.       # 清除会心一击标志
  141.       self.critical = false
  142.     end
  143.     # 过程结束
  144.     return true
  145.   end
  146.   #--------------------------------------------------------------------------
  147.   # ● 应用特技效果
  148.   #     user  : 特技的使用者 (battler)
  149.   #     skill : 特技
  150.   #--------------------------------------------------------------------------
  151.   def skill_effect(user, skill)
  152.     # 清除会心一击标志
  153.     self.critical = false
  154.     # 特技的效果范围是 HP 1 以上的己方、自己的 HP 为 0、
  155.     # 或者特技的效果范围是 HP 0 的己方、自己的 HP 为 1 以上的情况下
  156.     if ((skill.scope == 3 or skill.scope == 4) and self.hp == 0) or
  157.        ((skill.scope == 5 or skill.scope == 6) and self.hp >= 1)
  158.       # 过程结束
  159.       return false
  160.     end
  161.     # 清除有效标志
  162.     effective = false
  163.     # 公共事件 ID 是有效的情况下,设置为有效标志
  164.     effective |= skill.common_event_id > 0
  165.     # 第一命中判定
  166.     hit = skill.hit
  167.     if skill.atk_f > 0
  168.       hit *= user.hit / 100
  169.     end
  170.     hit_result = (rand(100) < hit)
  171.     # 不确定的特技的情况下设置为有效标志
  172.     effective |= hit < 100
  173.     # 命中的情况下
  174.     if hit_result == true
  175.       # 计算威力
  176.       power = skill.power + user.atk * skill.atk_f / 100
  177.       if power > 0
  178.         power -= self.pdef * skill.pdef_f / 200
  179.         power -= self.mdef * skill.mdef_f / 200
  180.         power = [power, 0].max
  181.       end
  182.       # 计算倍率
  183.       rate = 20
  184.       rate += (user.str * skill.str_f / 100)
  185.       rate += (user.dex * skill.dex_f / 100)
  186.       rate += (user.agi * skill.agi_f / 100)
  187.       rate += (user.int * skill.int_f / 100)
  188.       # 计算基本伤害
  189.       self.damage = power * rate / 20
  190.       # 属性修正
  191.       self.damage *= elements_correct(skill.element_set)
  192.       self.damage /= 100
  193.       # 伤害符号正确的情况下
  194.       if self.damage > 0
  195.         # 防御修正
  196.         if self.guarding?
  197.           self.damage /= 2
  198.         end
  199.       end
  200.       # 分散
  201.       if skill.variance > 0 and self.damage.abs > 0
  202.         amp = [self.damage.abs * skill.variance / 100, 1].max
  203.         self.damage += rand(amp+1) + rand(amp+1) - amp
  204.       end
  205.       # 第二命中判定
  206.       eva = 8 * self.agi / user.dex + self.eva
  207.       hit = self.damage < 0 ? 100 : 100 - eva * skill.eva_f / 100
  208.       hit = self.cant_evade? ? 100 : hit
  209.       hit_result = (rand(100) < hit)
  210.       # 不确定的特技的情况下设置为有效标志
  211.       effective |= hit < 100
  212.     end
  213.     # 命中的情况下
  214.     if hit_result == true
  215.       # 威力 0 以外的物理攻击的情况下
  216.       if skill.power != 0 and skill.atk_f > 0
  217.         # 状态冲击解除
  218.         remove_states_shock
  219.         # 设置有效标志
  220.         effective = true
  221.       end
  222.       # HP 的伤害减法运算
  223.       last_hp = self.hp
  224.       self.hp -= self.damage
  225.       if user.is_a?(Game_Actor) and
  226.         skill.element_set.include?($STARS_远程属性)
  227.         $game_party.lose_item($data_classes[user.class_id].arrow_id, 1)
  228.       end
  229.       effective |= self.hp != last_hp
  230.       # 状态变化
  231.       @state_changed = false
  232.       effective |= states_plus(skill.plus_state_set)
  233.       effective |= states_minus(skill.minus_state_set)
  234.       # 威力为 0 的场合
  235.       if skill.power == 0
  236.         # 伤害设置为空的字串
  237.         self.damage = ""
  238.         # 状态没有变化的情况下
  239.         unless @state_changed
  240.           # 伤害设置为 "Miss"
  241.           self.damage = "Miss"
  242.         end
  243.       end
  244.     # Miss 的情况下
  245.     else
  246.       # 伤害设置为 "Miss"
  247.       self.damage = "Miss"
  248.     end
  249.     # 不在战斗中的情况下
  250.     unless $game_temp.in_battle
  251.       # 伤害设置为 nil
  252.       self.damage = nil
  253.     end
  254.     # 过程结束
  255.     return effective
  256.   end
  257. end

  258. class Game_Actor < Game_Battler
  259.   #--------------------------------------------------------------------------
  260.   # ● 普通攻击 获取对像方动画 ID
  261.   #--------------------------------------------------------------------------
  262.   def animation2_id
  263.     weapon = $data_weapons[@weapon_id]
  264.     if weapon.element_set.include?($STARS_远程属性)
  265.       ani = weapon != nil ? weapon.animation2_id($game_party.item_number($data_classes[@class_id].arrow_id) == 0) : 0
  266.     else
  267.       ani = weapon != nil ? weapon.animation2_id : 0
  268.     end
  269.     return ani
  270.   end
  271. end
复制代码
roguelike求生RPG研发中....

Lv3.寻梦者

梦石
0
星屑
1433
在线时间
1705 小时
注册时间
2011-8-17
帖子
818
2
 楼主| 发表于 2013-1-23 19:34:24 | 只看该作者
召唤大神啊啊啊@Wind2010
真心无奈啊
roguelike求生RPG研发中....
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1433
在线时间
1705 小时
注册时间
2011-8-17
帖子
818
3
 楼主| 发表于 2013-1-24 11:17:43 | 只看该作者
好吧...自己搞定了...结贴..

点评

咋解决的?  发表于 2014-5-6 19:10
roguelike求生RPG研发中....
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-12-22 21:47

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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