#============================================================================== # ■ RGSS3 回復コマンド Ver1.01a by 星潟 #------------------------------------------------------------------------------ # スキル画面を経由させず、パーティメンバーのスキルを用いて # 高速で全員を全回復させる機能を追加します。 #------------------------------------------------------------------------------ # イベントコマンドから呼び出す場合 # イベントコマンドのスクリプトで下記のように記入して下さい。 # # healer_select #------------------------------------------------------------------------------ # 呼び出す際に、誰も回復コマンド用スキルが使用出来ない場合 # 指定したIDのスイッチがONになります。(出来る場合はOFFになります) # これを利用して、イベントとして呼び出した場合は # スイッチを用いた条件分岐を行い # 誰も回復コマンド用スキルを使用できない場合に # 「誰も回復出来ない!」等のメッセージを流す事が可能です。 # # 当方の特定ボタン対応コモンイベントと組み合わせる事で # マップ上で簡単に呼び出せる回復コマンドを実装出来ます。 #============================================================================== # Ver1.01 回復コマンドシーンへの遷移と終了時トランジション速度を # 超高速化する機能を追加しました。 # Ver1.01a 一般公開。説明文加筆と初期設定値のみ変更。 #============================================================================== module Heal_Command #回復コマンド時の使用スキル設定を行います。 #0の場合はスキルのメモ欄に<回復コマンド不可>と書かれたスキルは #回復スキルであっても回復コマンド時に使用しなくなります。 #1の場合はスキルのメモ欄に<回復コマンド用>と書かれたスキルのみを #回復コマンド時に使用しなくなります。 Type = 0 #メニューコマンドに追加するかを指定します。 #trueで追加、falseで追加しない。 Menu = false #メニューコマンドに追加する場合の #回復コマンドの名称を指定します。 NAME = "回復" #回復コマンド不可の設定用キーワードを指定します。 Word1 = "回復コマンド不可" #回復コマンド用の設定用キーワードを指定します。 Word2 = "回復コマンド用" #ヘルプウィンドウの内容を設定します。 #回復可能な場合(\nは改行を示します。\C等は、\\Cとして使用すれば使えます) Text1 = "誰で回復を行うかを選択して下さい。\n十字キーで選択、決定キーで決定、キャンセルキーで終了。" #全員MP不足な場合(\nは改行を示します。\C等は、\\Cとして使用すれば使えます) Text2 = "\\C[10]MP不足で誰も回復ができません。\\C[0]\nキャンセルキーで終了して下さい。" #誰もダメージを受けていない場合(\nは改行を示します。\C等は、\\Cとして使用すれば使えます) Text3 = "\\C[3]誰もダメージを受けていません。\\C[0]\nキャンセルキーで終了して下さい。" #実行中表示ウィンドウに表示するテキスト Text4 = "現在、回復処理中です。" #HP表示ウィンドウ上部に表示するテキスト Text5 = "パーティメンバーの状態" #ヒーラー選択時におまかせの項目を先頭に追加するかどうかを指定します。 #最もMP効率の良いキャラクターで回復を行います。 #状況によって、二名以上が回復を行う事もあります。 #(全体のHPが全回復する前に最もMP効率の良いキャラクターのMPが尽きた場合) #0で最初に追加、1で最後に追加、それ以外で追加しません。 Omakase = 0 #おまかせモードの名称を決定します。 Om_Name = "おまかせ(MP効率重視)" #回復コマンドで回復を行った際にSEを演奏するか否かを設定します。 #trueで演奏、falseで演奏しません。 Heal_SE = true #消費MP0のスキルだった場合の倍率。(とにかく大きめで) MP0_Skill = 1000000000000000 #『スキル整理』を導入している場合のみtrueにする事で #整理済みスキルを回復コマンドで使用しなくなります。 AB_SSS2 = false #誰も回復コマンド用スキルを使用できない場合に #自動的にON/OFFが切り替わるスイッチIDを指定します。 #イベントコマンドのスクリプトから呼び出した際に #このスイッチを使って「誰も使えなかった時」の条件分岐を行う事が出来ます。 SWITCH = 21 #回復コマンドシーンへの遷移と終了時トランジション速度を高速化します。 TRAN_ZERO = true end class Game_Temp attr_accessor :healer_hash attr_accessor :healer_actor attr_accessor :healer_actors attr_accessor :heal_c_array attr_accessor :heal_c_skills attr_accessor :heal_command_transition_zero #-------------------------------------------------------------------------- # オブジェクト初期化 #-------------------------------------------------------------------------- alias initialize_healer initialize def initialize initialize_healer @healer_array = [0,0] make_heal_c_skills @healer_actors = [] end #-------------------------------------------------------------------------- # 回復コマンドで用いるスキルIDの配列を用意。 #-------------------------------------------------------------------------- def make_heal_c_skills @heal_c_skills = [] $data_skills.each {|s| @heal_c_skills.push(s.id) if s && s.damage.recover? && !s.heal_command_seal?} end end class Game_Actor < Game_Battler #-------------------------------------------------------------------------- # スキル整理用 #-------------------------------------------------------------------------- def healer_mode_check(skill) true end end class Game_Party < Game_Unit #-------------------------------------------------------------------------- # 回復コマンド内での処理 #-------------------------------------------------------------------------- def heal_command #空の配列を作成する。 array = [] #最高回復効率の値を用意しておく。 #初期値は0。 best_heal_value = 0 #ヒーラーの判定を行う。 #指定がある場合はそのキャラクターに限定する。 healer_members = $game_temp.healer_actor != 0 ? [$game_actors[$game_temp.healer_actor]] : $game_temp.healer_actors #メンバー別に判定を行う。 healer_members.each {|m| #使用可能なスキルを取得。 ss = m.usable_skills #追加スキルタイプを取得。 ast = m.added_skill_types #使用可能なスキル別に判定を行う。 $game_temp.heal_c_skills.each {|s_id| #スキルデータを取得。 s = $data_skills[s_id] #スキルタイプが追加されていない場合は飛ばす。 next unless ast.include?(s.stype_id) #スキル整理用処理 next unless m.healer_mode_check(s) #使用可能なスキルに含まれていない場合は飛ばす。 next unless ss.include?(s) #行動を作成する。 m.make_actions #行動にスキルをセットする。 m.actions[0].set_skill(s.id) #スキルを評価する。 m.actions[0].evaluate_item #消費MPを取得。 cost = m.skill_mp_cost(s) #消費MPが0より大きい場合、評価値を浮動小数点数に変換した上で、消費MPで除算。 #そうでない場合は、MP消費なしで使用できるものとみなし、大きな数で乗算を行う。 value = cost > 0 ? m.actions[0].value.to_f / cost : m.actions[0].value * Heal_Command::MP0_Skill #最高回復効率の値を下回る場合は飛ばす。 next if best_heal_value > value #最高回復効率の値を更新する。 best_heal_value = value #使用者のアクターID、スキルID、行動対象、回復効率で配列を作成する。 array = [m.id, s.id, m.actions[0].target_index, value] } #行動を消去する。 m.clear_actions } #配列が空、もしくは回復効率が0以下の場合は #空の配列を返す。 return [] if array.empty? or array[3] <= 0.0 #配列を返す。 array end #-------------------------------------------------------------------------- # ヒーラーチェック #-------------------------------------------------------------------------- def healer_check #空のハッシュを用意。 hash = {} #行動可能なメンバー別に処理。 movable_members.each {|m| #2つのフラグを初期化。 flag1 = false flag2 = false #追加スキルタイプを取得。 ast = m.added_skill_types #使用可能なスキル別に処理。 $game_temp.heal_c_skills.each {|s_id| #スキルデータを取得。 s = $data_skills[s_id] #スキルタイプが追加されていない場合は飛ばす。 next unless ast.include?(s.stype_id) #スキル整理用処理 next unless m.healer_mode_check(s) #覚えているスキルに含まれていない場合は飛ばす。 next unless m.skills.include?(s) #回復スキルが使用可能なキャラクターとしてのフラグを立てる。 flag1 = true #該当スキルが使用可能でない場合は飛ばす。 next unless m.usable?(s) #フラグ2がfalseのままの場合は #回復コマンド用スキルを覚えていて使えるキャラクターとしてハッシュを更新。 hash[hash.size] = [m.id,true] unless flag2 #フラグ2をtrueに。 flag2 = true #配列にアクターIDを加え、次のアクターの処理へ移る。 break } #フラグ1がtrueでなおかつflag2がfalseの場合 #回復コマンド用スキルを覚えているが使えないキャラクターとしてハッシュを更新。 hash[hash.size] = [m.id,false] if flag1 && !flag2 } #ハッシュを返す。 hash end end class RPG::UsableItem #-------------------------------------------------------------------------- # 回復コマンド時に使用しないスキルを指定 #-------------------------------------------------------------------------- def heal_command_seal? #キャッシュが存在する場合はキャッシュを返す。 return @heal_command_seal if @heal_command_seal != nil #回復コマンドのタイプ別に分岐。 case Heal_Command::Type #特定スキルを禁止するタイプの場合 when 0;@heal_command_seal = self.note.include?("<" + Heal_Command::Word1 + ">") #特定スキルのみを許可するタイプの場合 when 1;@heal_command_seal = !self.note.include?("<" + Heal_Command::Word2 + ">") #本来ありえないが、その他の場合 else;@heal_command_seal = false end #データを返す。 @heal_command_seal end end class Scene_HealCommand < Scene_ItemBase #-------------------------------------------------------------------------- # 開始処理 #-------------------------------------------------------------------------- def start #スーパークラスの処理を実行。 super #ヒーラーウィンドウを作成。 create_healer_window #アクターウィンドウを作成。 create_help_window #実行中ウィンドウを作成。 create_execute_window end #-------------------------------------------------------------------------- # アクターウィンドウの作成 #-------------------------------------------------------------------------- def create_actor_window @actor_window = Window_MenuActor_Mini.new end #-------------------------------------------------------------------------- # ヒーラーウィンドウの作成 #-------------------------------------------------------------------------- def create_healer_window @healer_window = Window_Healer.new($game_party.healer_check) @healer_window.set_handler(:ok, method(:actor_select)) @healer_window.set_handler(:cancel, method(:return_scene)) end #-------------------------------------------------------------------------- # 実行中ウィンドウの作成 #-------------------------------------------------------------------------- def create_execute_window w = 400 h = 48 x = (Graphics.width - w) / 2 y = (Graphics.height - h) / 2 @execute_window = Window_Base.new(x,y,w,h) @execute_window.draw_text(@execute_window.contents.rect,Heal_Command::Text4,1) @execute_window.hide end #-------------------------------------------------------------------------- # ヘルプウィンドウの作成 #-------------------------------------------------------------------------- def create_help_window @help_window = Window_Help.new(2) help_update end def help_update @healer_window.full_h = true $game_party.members.each {|m| @healer_window.full_h = false if m.hp < m.mhp} if @healer_window.usable @help_window.set_text(@healer_window.full_h ? Heal_Command::Text3 : Heal_Command::Text1) else @help_window.set_text(Heal_Command::Text2) end end def actor_select $game_temp.healer_actor = @healer_window.healer heal_execute end def heal_execute return @healer_window.activate unless @healer_window.execute_ok #効果量が0になる(全回復する・スキルが使用できなくなる)まで #処理を繰り返す。 @execute_window.show update_basic update_basic loop do #回復コマンドの配列を準備。 array = $game_party.heal_command #配列が空の場合処理を中断。 break if array.empty? #配列を元にデータをセットする。 data_set(array) #スキルを使用させる。 use_item end #回復フラグを用意。 flag = 1 #誰か一人でも全回復していない場合はフラグを0にする。 $game_party.members.each {|m| if m.hp_rate < 1.0 flag = 0 break end } #設定が有効な場合のみSEを鳴らす。 Sound.play_use_skill if Heal_Command::Heal_SE #ウィンドウの更新。 @healer_window.actors_hash = $game_party.healer_check @healer_window.clear_command_list @healer_window.make_command_list help_update @healer_window.refresh @actor_window.refresh(true) @healer_window.activate @execute_window.hide end #-------------------------------------------------------------------------- # データセット #-------------------------------------------------------------------------- def data_set(array) #配列を元に、アクター、アイテム、対象を設定する。 @actor = $game_actors[array[0]] @item = $data_skills[array[1]] @actor_window.index = array[2] end #-------------------------------------------------------------------------- # アイテムの使用者を取得 #-------------------------------------------------------------------------- def user #設定されたアクター。 @actor end #-------------------------------------------------------------------------- # 現在選択されているアイテムの取得 #-------------------------------------------------------------------------- def item #設定されたアイテム。 @item end #-------------------------------------------------------------------------- # アイテム使用時の SE 演奏 #-------------------------------------------------------------------------- def play_se_for_item end end class Window_MenuActor_Mini < Window_Base attr_accessor :index def initialize super(Graphics.width / 2,72,width,height) contents.font.size = 20 refresh(true) end def refresh(flag = false) return unless flag contents.clear change_color(system_color) draw_text(0,0,contents.width,line_height,Heal_Command::Text5,1) $game_party.members.each_with_index {|a,i| y = line_height * (i + 1) change_color(hp_color(a)) draw_text(4,y,contents.width - 126,line_height,a.name) draw_actor_hp(a, contents.width - 130, y, 130)} end def width Graphics.width / 2 end def height Graphics.height - 72 end end class Window_Healer < Window_Command attr_accessor :actors_hash attr_accessor :usable attr_accessor :full_h def initialize(hash) #アクター配列を保存しておく。 @actors_hash = hash #ウィンドウを作成。 super(0, 72) refresh end #-------------------------------------------------------------------------- # ウィンドウ幅の取得 #-------------------------------------------------------------------------- def window_width Graphics.width / 2 end #-------------------------------------------------------------------------- # ウィンドウ高さの取得 #-------------------------------------------------------------------------- def window_height Graphics.height - 72 end #-------------------------------------------------------------------------- # 項目を描画する矩形の取得(テキスト用) #-------------------------------------------------------------------------- def item_rect_for_text(index) rect = item_rect(index) rect.x += 4 rect.width -= 126 rect end def make_command_list #おまかせコマンドを追加する場合は追加する。 @usable = nil @actors_hash.each_value {|array| next unless array[1] @usable = true;break} add_command("", nil, @usable, 0) if Heal_Command::Omakase == 0 #アクター配列内の要素毎にコマンドにアクター名を追加。 $game_temp.healer_actors = [] @actors_hash.each_value do |array| add_command($game_actors[array[0]].name, nil, array[1], array[0]) if $game_actors[array[0]] $game_temp.healer_actors.push($game_actors[array[0]]) end add_command("", nil, @usable, 0) if Heal_Command::Omakase == 1 end #-------------------------------------------------------------------------- # リフレッシュ #-------------------------------------------------------------------------- def refresh contents.clear contents.font.size = 20 draw_all_items end def draw_all_items super @list.each_with_index {|hash, i| if hash[:ext] == 0 draw_text(4,line_height * i,contents.width - 4,line_height,Heal_Command::Om_Name) next end draw_actor_mp($game_actors[hash[:ext]], contents.width - 134, line_height * i, 130)} end def healer @list[@index][:ext] end def execute_ok @usable && !@full_h end end class Game_Interpreter #-------------------------------------------------------------------------- # ヒールコマンド実行 #-------------------------------------------------------------------------- def healer_select hash = $game_party.healer_check $game_switches[Heal_Command::SWITCH] = hash.size == 0 #ヒールコマンドの使用者がいない場合は実行しない。 return if hash.size == 0 #トランジション超高速化が有効な場合 #トランジション超高速化フラグを立てる。 $game_temp.heal_command_transition_zero = true if Heal_Command::TRAN_ZERO $game_temp.healer_hash = hash #ヒールコマンドの実行。 SceneManager.call(Scene_HealCommand) end end if Heal_Command::Menu class Window_MenuCommand < Window_Command #-------------------------------------------------------------------------- # 独自コマンドの追加用 #-------------------------------------------------------------------------- alias add_original_commands_heal_command add_original_commands def add_original_commands add_original_commands_heal_command add_command(Heal_Command::NAME, :heal_command, heal_command_usable) end def heal_command_usable hash = $game_party.healer_check $game_switches[Heal_Command::SWITCH] = hash.size == 0 return false if hash.size == 0 $game_temp.healer_hash = hash true end end class Scene_Menu < Scene_MenuBase #-------------------------------------------------------------------------- # コマンドウィンドウの作成 #-------------------------------------------------------------------------- alias create_command_window_heal_command create_command_window def create_command_window create_command_window_heal_command @command_window.set_handler(:heal_command, method(:command_heal)) end #-------------------------------------------------------------------------- # コマンド[回復コマンド] #-------------------------------------------------------------------------- def command_heal SceneManager.call(Scene_HealCommand) end end end #スキル整理 if Heal_Command::AB_SSS2 class Game_Actor < Game_Battler #-------------------------------------------------------------------------- # 回復コマンドでの処理の場合のみ、整理済みスキルは使用しない。 #-------------------------------------------------------------------------- def healer_mode_check(skill) #回復コマンドの処理でなおかつ整理済みの場合はfalseを返す。 !@skill_seal.include?(skill.id) end end end #トランジション超高速化 if Heal_Command::TRAN_ZERO class Scene_HealCommand < Scene_ItemBase #-------------------------------------------------------------------------- # トランジション速度の取得 #-------------------------------------------------------------------------- def transition_speed 0 end end class Scene_Map < Scene_Base #-------------------------------------------------------------------------- # トランジション速度の取得 #-------------------------------------------------------------------------- alias transition_speed_heal_command_transition_zero transition_speed def transition_speed #トランジション超高速化フラグを取得。 flag = $game_temp.heal_command_transition_zero #トランジション超高速化フラグの消去。 $game_temp.heal_command_transition_zero = nil #取得したフラグが有効なら0、そうでない場合は本来の値を返す。 flag ? 0 : transition_speed_heal_command_transition_zero end end end