$imported ||= {} $imported["lud_ca"] = true =begin =end module RPG module Add_Continuance_Action_Data attr_accessor:continuance_action_data CONTINUANCE_ACTION_REGEXP= "ca" CA_R_TYPE_ATTACK = "攻撃" CA_R_TG_RAND = "0|ランダム" CA_R_TG_FIX = "1|ラストターゲット|固定|継続|続行" # type 0 :通常攻撃 # 1-999:スキルのID # target 0 :ランダム # 1 :ラストターゲット CA_Data = Struct.new("CA_Data" , :type , :target , :proc ,:false_stop ,:true_stop,:retarget) end end # 自分自身がターゲットとなった時に # モジュールへターゲットとして自分自身を渡す class Game_Battler alias continuance_action_attack_effect attack_effect def attack_effect(attacker) CB::set_target_battler(self) if $imported["lud_module_CB"] continuance_action_attack_effect(attacker) end alias continuance_action_skill_effect skill_effect def skill_effect(user,skill) CB::set_target_battler(self) if $imported["lud_module_CB"] continuance_action_skill_effect(user,skill) end alias continuance_action_item_effect item_effect def item_effect(user,item) CB::set_target_battler(self) if $imported["lud_module_CB"] continuance_action_item_effect(user,item) end end # バトル時の処理 class Scene_Battle < Scene_Base alias continuance_execute_action execute_action def execute_action CB::target_battler_clear if $imported["lud_module_CB"] CB::set_active_battler(@active_battler) if $imported["lud_module_CB"] continuance_execute_action end # スタート alias continuance_action_start start def start continuance_action_start @continuance_action_counter = -1 for member in $game_party.members member.continuing = nil end end # 攻撃時の発火 alias continuance_action_execute_action_attack execute_action_attack def execute_action_attack continuance_action_execute_action_attack continuance_action_attack end # アイテム時の発火 alias continuance_action_execute_action_item execute_action_item def execute_action_item continuance_action_execute_action_item if @active_battler.continuing continuance_action_main(@active_battler.continuing) elsif @active_battler.action.item continuance_action_main(@active_battler.action.item.continuance_action_data) end end # スキル時の発火 alias continuance_action_execute_action_skill execute_action_skill def execute_action_skill continuance_action_execute_action_skill if @active_battler.continuing continuance_action_main(@active_battler.continuing) elsif @active_battler.action.skill continuance_action_main(@active_battler.action.skill.continuance_action_data) end end # 通常攻撃時のアクターの連続行動発火 # エネミーの通常攻撃では連続行動は発火しません def continuance_action_attack if @active_battler.is_a?(Game_Actor) if @active_battler.continuing continuance_action_main(@active_battler.continuing) else # 全ての武器が素手の場合ガン無視 return if @active_battler.martial_arts? # 暫定仕様 # とりあえず一番攻撃力の高い武器をメイン武器と認定し # その武器にふくまれる連続行動リストを持って次のメソッドへ移動 weapon = @active_battler.strongest_weapon continuance_action_main(weapon.continuance_action_data) end else if @active_battler.continuing continuance_action_main(@active_battler.continuing) else id = @active_battler.enemy_id continuance_action_main($data_enemies[id].continuance_action_data) end end end # 連続行動メイン処理 def continuance_action_main(ca) @active_battler.continuing = ca loop do @continuance_action_counter += 1 if ca[@continuance_action_counter] == nil @continuance_action_counter = -1 @active_battler.continuing = nil return end if eval(ca[@continuance_action_counter].proc) set_continuance_action(ca[@continuance_action_counter]) if ca[@continuance_action_counter].true_stop # 判定成功時に終了 @continuance_action_counter = ca.size + 1 end if @active_battler.action.target_index != -1 # ターゲット固定かつターゲット死亡のケースで return # 残りのアクションを消費してく。 end else if ca[@continuance_action_counter].false_stop # 判定失敗時に終了 @continuance_action_counter = ca.size + 1 end end end end # 連続行動セット def set_continuance_action(data) set_continuance_action_type(data) if data.target == 0 @active_battler.action.decide_random_target else @active_battler.action.decide_last_target if @active_battler.action.target_index == -1 if data.retarget # decide_last_targetで自動的に # バトルアクションがクリアされるため # 行動を再セット set_continuance_action_type(data) @active_battler.action.decide_random_target end end end @action_battlers.unshift(@active_battler) end #data.typeに応じて行動をセット def set_continuance_action_type(data) if data.type == 0 @active_battler.action.kind = 0 @active_battler.action.basic = 0 else @active_battler.action.kind = 1 @active_battler.action.skill_id = data.type end end # 念のためシーン終了のタイミングでパーティーメンバのフラグをへし折っとく alias continuance_action_terminate terminate def terminate continuance_action_terminate $game_party.members.each{|member|member.continuing = nil} end end #~ # ゲームバトラー及びアクターの挙動変更 #~ # continuingがnilでない場合(=連続行動中) #~ # ・skill_can_use?で強制的にtureを返す #~ # ・MPコストを0とする class Game_Battler attr_accessor:continuing #~ alias continuance_action_calc_mp_cost calc_mp_cost #~ def calc_mp_cost(skill) #~ return 0 if @continuing #~ return self.mp if skill.mp_cost_all #~ return continuance_action_calc_mp_cost(skill) #~ end end class Game_Actor < Game_Battler alias continuance_action_skill_can_use? skill_can_use? def skill_can_use?(skill) return true if @continuing return continuance_action_skill_can_use?(skill) end # 現在武器を一つでも装備しているかどうかを返す def martial_arts? ws = self.weapons #weapons result = true for w in ws if w != nil result = false break end end return result end # 装備している中で最も強力な武器を返す def strongest_weapon ws = self.weapons.compact return ws.sort{|a, b| b.atk <=> a.atk}[0] end end # 各データベース無いのオブジェクトに対しての処理 # note内の一定の書式のエリアをデータとし # Structに放り込みます。 # @continuance_action_dataはStructの配列。 module RPG module Add_Continuance_Action_Data def make_continuance_action_data @continuance_action_data = [] if @note =~ /\<#{CONTINUANCE_ACTION_REGEXP}\>(.+?)\<\/#{CONTINUANCE_ACTION_REGEXP}\>/m str = $1 while str =~ /\{(.+?)\}/m str.sub!(/\{(.+?)\}/m) {""} str2 = $1 data = CA_Data.new(0,0,"true" ,false ,false , false) if str2 =~ /type(?:|\s+| )+=(?:|\s| )+([0-9]+|#{CA_R_TYPE_ATTACK})/m # 行動のタイプ確定 n = $1 if n =~ /#{CA_R_TYPE_ATTACK}/ data.type = 0 else data.type = n.to_i end end if str2 =~ /target(?:|\s+| )+=(?:|\s+| )+(#{CA_R_TG_RAND})/ # ターゲットの確定 data.target = 0 elsif str2 =~ /target(?:|\s+| )+=(?:|\s+| )+(#{CA_R_TG_FIX})/ data.target = 1 end if str2.include?("retarget") data.retarget = true end if str2.include?("false_stop") data.false_stop = true end if str2.include?("true_stop") data.true_stop = true end if str2 =~ /(?:eval|proc|code)(?:|\s+| )+=(?:|\s+| )+(.+)/m data.proc = $1.gsub("\n"){" "} else data.proc = "true" end @continuance_action_data << data end end end end class Weapon include RPG::Add_Continuance_Action_Data end class Skill include RPG::Add_Continuance_Action_Data end class Item include RPG::Add_Continuance_Action_Data end class Enemy include RPG::Add_Continuance_Action_Data end end class Scene_Title < Scene_Base # データベースロード直後にデータベースを書き換えます。 # 後の処理が楽になるんで。 alias lud_continuance_action_load_database load_database def load_database lud_continuance_action_load_database lud_continuance_action_make_data end alias lud_continuance_action_load_bt_database load_bt_database def load_bt_database lud_continuance_action_load_bt_database lud_continuance_action_make_data end # 特定のデータベースに内のnil以外のオブジェクの特定のメソッドを実行 def lud_continuance_action_make_data ($data_skills + $data_weapons + $data_enemies + $data_items).each{|obj| obj.make_continuance_action_data if obj} end end