Project1

标题: 【XP】普通攻击消耗物品的问题 [打印本页]

作者: mzr1996    时间: 2011-12-7 22:44
标题: 【XP】普通攻击消耗物品的问题
本帖最后由 月夜神音 于 2011-12-15 13:24 编辑

就像如果装备了手枪,有子弹就发射子弹,没有子弹就拿枪上去砸那种效果。
貌似有一个《远程系职业攻击消耗品》,但是里面的范例失效了。所以请教一下。


作者: 小白玩家    时间: 2011-12-8 09:54
本帖最后由 小白玩家 于 2011-12-8 09:56 编辑
  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 += rand(amp+1) + rand(amp+1) - amp
  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 /= 2
  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
复制代码
附范例

远程系.zip

204 KB, 下载次数: 141






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