Project1

标题: 远程消耗物,请修改一下没有指定消耗物无法攻击 [打印本页]

作者: 爆焰    时间: 2019-3-4 19:08
标题: 远程消耗物,请修改一下没有指定消耗物无法攻击
本帖最后由 爆焰 于 2019-3-4 23:04 编辑

就是指定消耗物没有了,攻击选项显示灰色无法选择

[attach]354287[/attach]
作者: KB.Driver    时间: 2019-3-4 20:44
RUBY 代码复制
  1. module Sound
  2.   def self.play_buzzer
  3.     $game_system.se_play($data_system.buzzer_se)
  4.   end
  5. end
  6.  
  7. class Game_Actor
  8.   def attack_item_enough?
  9.     return true if (item_id = $data_classes[self.class_id].arrow_id) == 0
  10.     $game_party.item_number(item_id) > 0
  11.   end
  12. end
  13.  
  14. class Scene_Battle
  15.   #--------------------------------------------------------------------------
  16.   # ● 刷新画面
  17.   #--------------------------------------------------------------------------
  18.   alias cld99_update update
  19.   def update
  20.     if @actor_command_window && @active_battler && @active_battler.is_a?(Game_Actor)
  21.       if !@active_battler.attack_item_enough?
  22.         @actor_command_window.disable_item(0)
  23.       else
  24.         @actor_command_window.refresh
  25.       end
  26.     end
  27.     cld99_update
  28.   end
  29.   #--------------------------------------------------------------------------
  30.   # ● 刷新画面 (角色命令回合 : 基本命令)
  31.   #--------------------------------------------------------------------------
  32.   alias cld99_update_phase3_basic_command update_phase3_basic_command
  33.   def update_phase3_basic_command
  34.     if Input.trigger?(Input::C)
  35.       if @actor_command_window.index == 0 #攻击
  36.         return Sound.play_buzzer if !@active_battler.attack_item_enough?
  37.       end
  38.     end
  39.     cld99_update_phase3_basic_command
  40.   end
  41.   #--------------------------------------------------------------------------
  42.   # ● 生成基本行动结果
  43.   #--------------------------------------------------------------------------
  44.   alias make_basic_action_result_for_sp_cost make_basic_action_result
  45.   def make_basic_action_result
  46.     # 攻击的情况下
  47.     if @active_battler.current_action.basic == 0
  48.       if @active_battler.is_a?(Game_Actor)
  49.         if (item_id = $data_classes[@active_battler.class_id].arrow_id) > 0
  50.           $game_party.lose_item(item_id, 1)
  51.         end
  52.       end
  53.     end
  54.     make_basic_action_result_for_sp_cost
  55.   end
  56. end



作者: 爆焰    时间: 2019-3-5 21:28
KB.Driver 发表于 2019-3-4 20:44
module Sound
  def self.play_buzzer
    $game_system.se_play($data_system.buzzer_se)


  1. $STARS_远程属性 = 17

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

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

  250. =begin
  251. class Game_Actor < Game_Battler
  252.   #--------------------------------------------------------------------------
  253.   # ● 普通攻击 获取对像方动画 ID
  254.   #--------------------------------------------------------------------------
  255.   def animation2_id
  256.     weapon = $data_weapons[@weapon_id]
  257.     if weapon.element_set.include?($STARS_远程属性)
  258.       ani = weapon != nil ? weapon.animation2_id($game_party.item_number($data_classes[@class_id].arrow_id) == 0) : 0
  259.     else
  260.       ani = weapon != nil ? weapon.animation2_id : 0
  261.     end
  262.     return ani
  263.   end
  264. end
  265. =end


  266. module Sound
  267.   def self.play_buzzer
  268.     $game_system.se_play($data_system.buzzer_se)
  269.   end
  270. end

  271. class Game_Actor
  272.   def attack_item_enough?
  273.     return true if (item_id = $data_classes[self.class_id].arrow_id) == 0
  274.     $game_party.item_number(item_id) > 0
  275.   end
  276. end

  277. class Scene_Battle
  278.   #--------------------------------------------------------------------------
  279.   # ● 刷新画面
  280.   #--------------------------------------------------------------------------
  281.   alias cld99_update update
  282.   def update
  283.     if @actor_command_window && @active_battler && @active_battler.is_a?(Game_Actor)
  284.       if !@active_battler.attack_item_enough?
  285.         @actor_command_window.disable_item(0)
  286.       else
  287.         @actor_command_window.refresh
  288.       end
  289.     end
  290.     cld99_update
  291.   end
  292.   #--------------------------------------------------------------------------
  293.   # ● 刷新画面 (角色命令回合 : 基本命令)
  294.   #--------------------------------------------------------------------------
  295.   alias cld99_update_phase3_basic_command update_phase3_basic_command
  296.   def update_phase3_basic_command
  297.     if Input.trigger?(Input::C)
  298.       if @actor_command_window.index == 0 #攻击
  299.         return Sound.play_buzzer if !@active_battler.attack_item_enough?
  300.       end
  301.     end
  302.     cld99_update_phase3_basic_command
  303.   end
  304.   #--------------------------------------------------------------------------
  305.   # ● 生成基本行动结果
  306.   #--------------------------------------------------------------------------
  307.   alias make_basic_action_result_for_sp_cost make_basic_action_result
  308.   def make_basic_action_result
  309.     # 攻击的情况下
  310.     if @active_battler.current_action.basic == 0
  311.       if @active_battler.is_a?(Game_Actor)
  312.         if (item_id = $data_classes[@active_battler.class_id].arrow_id) > 0
  313.           $game_party.lose_item(item_id, 1)
  314.         end
  315.       end
  316.     end
  317.     make_basic_action_result_for_sp_cost
  318.   end
  319. end
复制代码

作者: KB.Driver    时间: 2019-3-5 21:53
爆焰 发表于 2019-3-5 21:28

RUBY 代码复制
  1. class Weapon
  2.   def consume_item?
  3.     element_set.include?($STARS_远程属性)
  4.   end
  5. end
  6.  
  7. class Game_Actor
  8.   alias attack_item_enough_weapon attack_item_enough?
  9.   def attack_item_enough?
  10.     return true if !consuming_item?
  11.     attack_item_enough_weapon
  12.   end
  13.  
  14.   def consuming_item?
  15.     $data_weapons[@weapon_id].consume_item?
  16.   end
  17. end
  18.  
  19. class Scene_Battle
  20.   #--------------------------------------------------------------------------
  21.   # ● 生成基本行动结果
  22.   #--------------------------------------------------------------------------
  23.   alias make_basic_action_result_for_sp_cost make_basic_action_result
  24.   def make_basic_action_result
  25.     # 攻击的情况下
  26.     if @active_battler.current_action.basic == 0
  27.       if @active_battler.is_a?(Game_Actor)
  28.         if (item_id = $data_classes[@active_battler.class_id].arrow_id) > 0
  29.           $game_party.lose_item(item_id, 1) if @active_battler.consuming_item?
  30.         end
  31.       end
  32.     end
  33.     make_basic_action_result_for_sp_cost
  34.   end
  35. end


再在下面新开一格放进去
作者: 爆焰    时间: 2019-3-6 18:56
KB.Driver 发表于 2019-3-5 21:53
class Weapon
  def consume_item?
    element_set.include?($STARS_远程属性)

我照做了,可还是那样。
远程消耗物.7z (187.97 KB, 下载次数: 76)
作者: KB.Driver    时间: 2019-3-6 20:04
爆焰 发表于 2019-3-6 18:56
我照做了,可还是那样。

我下载了你这个,运行起来好像没什么问题。
是不是跟其他脚本冲突了




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