Project1

标题: 战斗复活的问题 [打印本页]

作者: fjm    时间: 2017-1-23 13:32
标题: 战斗复活的问题
本帖最后由 fjm 于 2017-1-24 11:30 编辑

我方角色挂了,拉起来后,当前回合不会战斗,怎样才能使其当前回合也能战斗
作者: fjm    时间: 2017-1-24 11:48
https://rpg.blue/thread-368782-1-1.html
作者: RaidenInfinity    时间: 2017-1-24 13:27
根据提供的范例大致弄出了效果:

RUBY 代码复制
  1. module BattleManager
  2.   class << self
  3.  
  4.     def revive_input_set(actor)
  5.       @revive_input = true
  6.       $game_party.members.each_with_index do |v,i|
  7.         if v.id == actor.id
  8.           @revive_actor_index = i
  9.           break
  10.         end  
  11.       end  
  12.     end
  13.  
  14.     def revive_input
  15.       @revive_input
  16.     end
  17.  
  18.     def revive_input_start
  19.       @revive_input_start
  20.     end
  21.  
  22.     def setup_revive_input
  23.       @revive_input_start = true
  24.       @actor_index = @revive_actor_index
  25.       actor.make_actions
  26.       @revive_input = false
  27.     end
  28.  
  29.     def inject_revive_actor
  30.       @action_battlers.insert(0,actor)
  31.     end
  32.  
  33.     alias :rev_next_command :next_command
  34.     def next_command
  35.       if @revive_input_start
  36.         inject_revive_actor
  37.         @revive_input_start = false
  38.         return false
  39.       end  
  40.       rev_next_command
  41.     end
  42.  
  43.     alias :rev_prior_command :prior_command
  44.     def prior_command
  45.       return false if @revive_input_start
  46.       rev_prior_command
  47.     end
  48.  
  49.     def in_turn?
  50.       return false if @revive_input_start
  51.       @phase == :turn
  52.     end
  53.  
  54.   end
  55. end
  56.  
  57. class Scene_Battle < Scene_Base
  58.  
  59.   def process_action
  60.     return if scene_changing?
  61.     if !@subject || !@subject.current_action
  62.       if BattleManager.revive_input
  63.           BattleManager.setup_revive_input
  64.           start_actor_command_selection
  65.           return
  66.       end  
  67.       @subject = BattleManager.next_subject  
  68.     end
  69.     return turn_end unless @subject
  70.     if @subject.current_action
  71.       @subject.current_action.prepare
  72.       if @subject.current_action.valid?
  73.         @status_window.open
  74.         execute_action
  75.       end
  76.       @subject.remove_current_action
  77.     end
  78.     process_action_end unless @subject.current_action
  79.   end
  80.  
  81.   def prior_command
  82.     if BattleManager.prior_command
  83.       start_actor_command_selection
  84.     elsif BattleManager.revive_input_start
  85.         @actor_command_window.activate
  86.     else  
  87.         start_party_command_selection
  88.     end
  89.   end  
  90.  
  91. end  
  92.  
  93. class Game_Actor
  94.  
  95.   def revive
  96.                 @hp = 1 if @hp == 0
  97.     return if !$game_party.in_battle
  98.     BattleManager.revive_input_set(self)
  99.         end
  100.  
  101. end


在范例内测试没问题,复活的角色会立刻获得行动机会。
作者: fjm    时间: 2017-1-24 16:25
RaidenInfinity 发表于 2017-1-24 13:27
根据提供的范例大致弄出了效果:

非常感谢,测试了下,效果出来了,可是复活的队友一旦战斗就出错,还有就是原本设置了自动战斗的队员拉起来后,
就会变回手动的了,这两个问题能解决吗

6111.jpg (26.6 KB, 下载次数: 29)

6111.jpg

作者: RaidenInfinity    时间: 2017-1-24 18:01
本帖最后由 RaidenInfinity 于 2017-1-25 20:39 编辑

自动战斗已经修正,单人多次行动复活已修正

RUBY 代码复制
  1. module BattleManager
  2.   class << self
  3.  
  4.     alias :rev_init_members :init_members
  5.     def init_members
  6.       @revive_input = []
  7.       @revive_input_start = []
  8.       @revive_actor_index = []
  9.     end
  10.  
  11.     def revive_input_set(actor)
  12.       @revive_input.push(true)
  13.       $game_party.members.each_with_index do |v,i|
  14.         if v.id == actor.id
  15.           @revive_actor_index.push(i)
  16.           break
  17.         end  
  18.       end  
  19.     end
  20.  
  21.     def revive_input
  22.       @revive_input[0]
  23.     end
  24.  
  25.     def revive_input_start
  26.       @revive_input_start[0]
  27.     end
  28.  
  29.     def setup_revive_input
  30.       @revive_input.shift
  31.       @actor_index = @revive_actor_index.shift
  32.       actor.make_actions
  33.       if actor.auto_battle?
  34.         actor.make_auto_battle_actions
  35.         inject_revive_actor
  36.       else
  37.         @revive_input_start.push(true)
  38.         SceneManager.scene.start_actor_command_selection
  39.       end
  40.     end
  41.  
  42.     def inject_revive_actor
  43.       actor.make_speed
  44.       @action_battlers.push(actor)
  45.       @action_battlers.sort! {|a,b| b.speed - a.speed }
  46.     end
  47.  
  48.     alias :rev_next_command :next_command
  49.     def next_command
  50.       if revive_input_start
  51.         inject_revive_actor
  52.         @revive_input_start.shift
  53.         return false
  54.       end  
  55.       rev_next_command
  56.     end
  57.  
  58.     alias :rev_prior_command :prior_command
  59.     def prior_command
  60.       return false if revive_input_start
  61.       rev_prior_command
  62.     end
  63.  
  64.     def in_turn?
  65.       return false if revive_input_start
  66.       @phase == :turn
  67.     end
  68.  
  69.   end
  70. end
  71.  
  72. class Scene_Battle < Scene_Base
  73.  
  74.   def process_action
  75.     return if scene_changing?
  76.     if !@subject || !@subject.current_action
  77.       if BattleManager.revive_input
  78.           BattleManager.setup_revive_input
  79.           return
  80.       end  
  81.       @subject = BattleManager.next_subject  
  82.     end
  83.     return turn_end unless @subject
  84.     if @subject.current_action
  85.       @subject.current_action.prepare
  86.       if @subject.current_action.valid?
  87.         @status_window.open
  88.         execute_action
  89.       end
  90.       @subject.remove_current_action
  91.     end
  92.     process_action_end unless @subject.current_action
  93.   end
  94.  
  95.   def prior_command
  96.     if BattleManager.prior_command
  97.       start_actor_command_selection
  98.     elsif BattleManager.revive_input_start
  99.         @actor_command_window.activate
  100.     else  
  101.         start_party_command_selection
  102.     end
  103.   end  
  104.  
  105. end  
  106.  
  107. class Game_Actor
  108.  
  109.   def revive
  110.                 @hp = 1 if @hp == 0
  111.     return if !$game_party.in_battle
  112.     BattleManager.revive_input_set(self)
  113.         end
  114.  
  115. end


必须把它放在所有插件脚本的最后面(你的工程的情况是自动战斗脚本后面)。
此外,报错用了提供的工程但还是没遇到过,所以无法确认有这个状况/顺利排除。




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