#============================================================================== # ■ RGSS3 スキル切り替え Ver1.04 by 星潟 #------------------------------------------------------------------------------ # スキルに切り替えIDを設定し、ボタンを押すことで # 該当スキルを切り替えIDに指定したスキルに切り替えます。 # これを利用して、スキルの単体/全体化等のシステムを # 作成する事ができるようになります。 #------------------------------------------------------------------------------ # ★設定方法 #  スキルのメモ欄に<スキル切り替え:30>を指定。 #  このように設定されたスキルは、カーソルを合わせて # Zボタン(キーボードのDキー)を押す事で、スキルID30に変更されます。 # なお、スキルID30には、切り替え前のスキルIDがスキル切り替えIDとして # 自動的に登録されます。 #------------------------------------------------------------------------------ # ※複数スキルに対して同じ切り替えIDを指定しないようにして下さい。 #------------------------------------------------------------------------------ # Ver1.01 ヘルプウィンドウが即座に切り替わらない不具合を修正。 #------------------------------------------------------------------------------ # Ver1.02 通常攻撃についても切り替えが行えるように変更。 #------------------------------------------------------------------------------ # Ver1.03 不具合修正。 #------------------------------------------------------------------------------ # Ver1.04 競合しにくいように一部処理を変更。 #============================================================================== module S_SWITCHING #スキル切り替えのID指定用文字列を指定。 WORD = "スキル切り替え" #切り替えを行うためのボタンを指定。 #初期配置は:Z(キーボードのDキー) KEY = :Z #スキルウィンドウを開く度に切り替えを初期化するか否かの設定を行う。 #trueで含む/falseで含まない ERASE = true #自動戦闘時にスキル切り替えによって得られるスキルも含むか否かの設定を行う。 #trueで含む/falseで含まない AUTO = true #自動戦闘時にスキル切り替えによって得られる通常攻撃も含むか否かの設定を行う。 #trueで含む/falseで含まない AUTO2 = true end class Game_Temp attr_accessor :at_ats_change #-------------------------------------------------------------------------- # オブジェクト初期化 #-------------------------------------------------------------------------- alias initialize_ats_change initialize def initialize #本来の処理を実行。 initialize_ats_change #一時データを用意。 @at_ats_change = nil end end class RPG::Skill < RPG::UsableItem attr_accessor :skill_switching #-------------------------------------------------------------------------- # スキル変更 #-------------------------------------------------------------------------- def skill_switching #キャッシュがある場合はキャッシュを返す。 return @skill_switching if @skill_switching != nil #メモ欄からデータを取得。 data = self.note.scan(/<#{S_SWITCHING::WORD}[::](\S+)>/).flatten #スキル変更データを取得。 @skill_switching = (data != nil && !data.empty?) ? data[0].to_i : 0 #スキル変更先のスキル変更データを自身のスキルIDに設定する。 $data_skills[@skill_switching].skill_switching = self.id if @skill_switching != 0 #データを返す。 @skill_switching end end class Game_BattlerBase #-------------------------------------------------------------------------- # 通常攻撃のスキル ID を取得 #-------------------------------------------------------------------------- alias attack_skill_id_ats_change attack_skill_id def attack_skill_id i = attack_skill_id_ats_change return i if !self.actor? $game_temp.at_ats_change == self.id ? $data_skills[i].skill_switching : i end end class Game_Actor < Game_Battler #-------------------------------------------------------------------------- # 通常攻撃のスキル変更が可能か? #-------------------------------------------------------------------------- def attack_change_ok? #通常攻撃スキルに切り替え用データが設定されている場合は可能とする。 $data_skills[attack_skill_id].skill_switching != 0 end def sw_s_id_change(item_id) #変更中スキルデータがnilの場合は配列を作成する。 @sw_s_id = [] if @sw_s_id == nil #スキル変更IDを取得する。 ssw_id = $data_skills[item_id].skill_switching #変更中スキルデータの内容を変更する。 @sw_s_id.include?(ssw_id) ? @sw_s_id.delete(ssw_id) : @sw_s_id.push(ssw_id) @sw_s_id.include?(item_id) ? @sw_s_id.delete(item_id) : @sw_s_id.push(item_id) end def sw_s_id #変更中スキルデータがnilの場合は配列を作成する。 @sw_s_id = [] if @sw_s_id == nil #変更中スキルデータを返す。 @sw_s_id end def sw_s_id_erase #空の配列を作成する。 @sw_s_id = [] end if S_SWITCHING::AUTO alias make_action_list_skill_switching make_action_list def make_action_list #本来の処理を実行。 list = make_action_list_skill_switching #スキルを覚えていない場合はこれまでのリストを返す。 return list if skills.empty? #空の配列を作成。 sw_s_array = [] #変更スキルIDを配列に加える。 skills.each {|s| sw_s_array.push($data_skills[s.skill_switching]) if s.skill_switching != 0} #変更スキルが存在しない場合はこれまでのリストを返す。 return list if sw_s_array.empty? #変更スキルIDの中から使用可能な物を選択する。 sw_s_array = sw_s_array.select {|skill| usable?(skill) } #変更スキルを評価してリストに加える。 sw_s_array.each do |skill| list.push(Game_Action.new(self).set_skill(skill.id).evaluate) end #リストを返す。 list end end if S_SWITCHING::AUTO2 #-------------------------------------------------------------------------- # 行動リスト #-------------------------------------------------------------------------- alias make_action_list_skill_switching2 make_action_list def make_action_list #本来の処理を実行。 list = make_action_list_skill_switching2 #通常攻撃のスキル変更が不可能な場合は飛ばす。 return list if attack_change_ok? #変更後のスキルIDを取得。 s = $data_skills[$data_skills[attack_skill_id].skill_switching] #変更後のスキルが使用出来ない場合は飛ばす。 return list unless usable?(s) #行動リストに変更後のスキルを追加。 list.push(Game_Action.new(self).set_skill(s.id).evaluate) #リストを返す。 list end end end class Window_ActorCommand < Window_Command #-------------------------------------------------------------------------- # 攻撃コマンドをリストに追加 #-------------------------------------------------------------------------- alias add_attack_command_ats_change add_attack_command def add_attack_command #アクターが存在し、アクターIDが変更対象のアクターIDと同じ場合は #そのアクターの攻撃部分のコマンド名を変更後のスキル名に変更する。 if @actor && $game_temp.at_ats_change == @actor.id add_command($data_skills[@actor.attack_skill_id].name, :attack, @actor.attack_usable?) else add_attack_command_ats_change end end #-------------------------------------------------------------------------- # 決定やキャンセルなどのハンドリング処理 #-------------------------------------------------------------------------- alias process_handling_ats_change process_handling unless $! def process_handling #開いており、アクティブ状態でなければ飛ばす。 return unless open? && active #本来の処理を実行。 process_handling_ats_change #指定されたボタンが押されている時、変更を実行。 ats_change if Input.trigger?(S_SWITCHING::KEY) end #-------------------------------------------------------------------------- # 攻撃スキルの変更 #-------------------------------------------------------------------------- def ats_change #コマンドシンボルが攻撃出ない場合は飛ばす。 return unless current_data[:symbol] == :attack #攻撃スキルが変更出来ない場合は飛ばす。 return unless @actor.attack_change_ok? #SEを演奏。 Sound.play_ok #攻撃ID変更対象の場合は、変更対象情報を消去し #そうでない場合は攻撃ID変更対象とする。 if $game_temp.at_ats_change == @actor.id $game_temp.at_ats_change = nil else $game_temp.at_ats_change = @actor.id end #本来の処理を実行。 setup(@actor) end end class Window_SkillList < Window_Selectable alias make_item_list_skill_switching make_item_list def make_item_list #本来の処理を実行する。 make_item_list_skill_switching #スキルリストを書き換える。 @data.each_with_index {|s, i| next if s == nil @data[i] = $data_skills[s.skill_switching] if @actor.sw_s_id.include?(s.id)} end def skill_switching #スキルが存在しない場合は飛ばす。 return if item == nil #スキル変更IDが指定されていない場合は飛ばす。 return if item.skill_switching == 0 #音を鳴らす。 Sound.play_ok #スキルを切り替える。 @actor.sw_s_id_change(item.id) #リフレッシュを行う。 refresh select(@data.index(item)) #ヘルプウィンドウの描写を行う。 update_help if @help_window != nil end #-------------------------------------------------------------------------- # 決定やキャンセルなどのハンドリング処理 #-------------------------------------------------------------------------- alias process_handling_skill_switching process_handling unless $! def process_handling #本来の処理を実行する。 process_handling_skill_switching #動かせない場合は飛ばす。 return unless open? && active #適切なキーが押されている場合は変更処理を行う。 return process_skill_switching if ok_enabled? && Input.trigger?(S_SWITCHING::KEY) end #-------------------------------------------------------------------------- # 決定ボタンが押されたときの処理 #-------------------------------------------------------------------------- def process_skill_switching #スキル変更処理を行う。 call_skill_switching end #-------------------------------------------------------------------------- # スキル変更 #-------------------------------------------------------------------------- def call_skill_switching #スキル変更処理を行う。 call_handler(:skill_switching) end end class Scene_MenuBase < Scene_Base #-------------------------------------------------------------------------- # 開始処理 #-------------------------------------------------------------------------- alias start_skill_switching start def start #本来の処理を実行する。 start_skill_switching #設定に応じてスキル変更データを消去する。 @actor.sw_s_id_erase if S_SWITCHING::ERASE && @actor != nil end end class Scene_Skill < Scene_ItemBase #-------------------------------------------------------------------------- # アイテムウィンドウの作成 #-------------------------------------------------------------------------- alias create_item_window_skill_switching create_item_window def create_item_window #本来の処理を実行する。 create_item_window_skill_switching #スキル変更のハンドラを設定する。 @item_window.set_handler(:skill_switching, method(:on_skill_switching)) end def on_skill_switching #スキルウィンドウのスキル変更を行う。 @item_window.skill_switching end end class Scene_Battle < Scene_Base #-------------------------------------------------------------------------- # アクターコマンド選択の開始 #-------------------------------------------------------------------------- alias start_actor_command_selection_at_s_change start_actor_command_selection def start_actor_command_selection_at_s_change #攻撃スキル変更対象情報を削除。 $game_temp.at_ats_change = nil #本来の処理を実行。 start_actor_command_selection_at_s_change end #-------------------------------------------------------------------------- # 次のコマンド入力へ #-------------------------------------------------------------------------- alias next_command_at_s_change next_command def next_command #攻撃スキル変更対象情報を削除。 $game_temp.at_ats_change = nil #本来の処理を実行。 next_command_at_s_change end #-------------------------------------------------------------------------- # 前のコマンド入力へ #-------------------------------------------------------------------------- alias prior_command_at_s_change prior_command def prior_command #攻撃スキル変更対象情報を削除。 $game_temp.at_ats_change = nil #本来の処理を実行。 prior_command_at_s_change end #-------------------------------------------------------------------------- # アクターコマンドウィンドウの作成 #-------------------------------------------------------------------------- alias create_actor_command_window_at_s_change create_actor_command_window def create_actor_command_window #本来の処理を実行。 create_actor_command_window_at_s_change #攻撃スキル変更用のハンドラを設定。 @actor_command_window.set_handler(:ats_change, nil) end #-------------------------------------------------------------------------- # 敵キャラ選択の開始 #-------------------------------------------------------------------------- alias select_enemy_selection_at_s_change select_enemy_selection def select_enemy_selection #アクターを取得。 actor = BattleManager.actor #アクターが攻撃スキル変更対象であり、行動内容が攻撃スキルの場合は分岐。 if $game_temp.at_ats_change == actor.id && actor.input.item == $data_skills[actor.attack_skill_id] #スキル情報を取得。 skill = $data_skills[actor.attack_skill_id] #スキルに選択が不要な場合は次のアクターへ。 if !skill.need_selection? next_command #スキルが敵を選択する必要がある場合は敵の選択へ。 elsif skill.for_opponent? #本来の処理を実行。 select_enemy_selection_at_s_change #それ以外の場合は味方の選択へ。 else select_actor_selection end else #本来の処理を実行。 select_enemy_selection_at_s_change end end #-------------------------------------------------------------------------- # コマンド[スキル] #-------------------------------------------------------------------------- alias command_skill_skill_switching command_skill def command_skill #設定に応じてスキル変更データを消去する。 BattleManager.actor.sw_s_id_erase if S_SWITCHING::ERASE #本来の処理を実行する。 command_skill_skill_switching end #-------------------------------------------------------------------------- # スキルウィンドウの作成 #-------------------------------------------------------------------------- alias create_skill_window_skill_switching create_skill_window def create_skill_window #本来の処理を実行する。 create_skill_window_skill_switching #スキル変更のハンドラを設定する。 @skill_window.set_handler(:skill_switching, method(:on_skill_switching)) end def on_skill_switching #スキルウィンドウのスキル変更を行う。 @skill_window.skill_switching end end #以下、自動戦闘時のスキル封印/スキル整理スクリプトと併用時の処理を行う。 class Scene_Skill < Scene_ItemBase if defined? AB_SSS #-------------------------------------------------------------------------- # スキルシール #-------------------------------------------------------------------------- def pss return if item == nil Sound.play_ok s_id = item.id @actor.auto_skill_seal = [] if @actor.auto_skill_seal == nil if @actor.auto_skill_seal.include?(s_id) @actor.auto_skill_seal.delete(s_id) @actor.auto_skill_seal.delete($data_skills[s_id].skill_switching) if $data_skills[s_id].skill_switching != 0 else @actor.auto_skill_seal.push(s_id) @actor.auto_skill_seal.push($data_skills[s_id].skill_switching) if $data_skills[s_id].skill_switching != 0 end @item_window.refresh end end if defined? AB_SSS2 #-------------------------------------------------------------------------- # スキル整理 #-------------------------------------------------------------------------- def pss2 return if item == nil if !item.seal_seal? Sound.play_ok s_id = item.id @actor.skill_seal = [] if @actor.skill_seal == nil if @actor.skill_seal.include?(s_id) or ($data_skills[s_id].skill_switching != 0 && @actor.skill_seal.include?($data_skills[s_id].skill_switching)) @actor.skill_seal.delete(s_id) @actor.skill_seal.delete($data_skills[s_id].skill_switching) if $data_skills[s_id].skill_switching != 0 else @actor.skill_seal.push(s_id) @actor.skill_seal.push($data_skills[s_id].skill_switching) if $data_skills[s_id].skill_switching != 0 end @item_window.refresh @item_window.index -= 1 if item == nil @item_window.index = 0 if @item_window.index < 0 @help_window.set_item(item) @help_window.refresh else Sound.play_buzzer end end end end class Scene_Battle < Scene_Base if defined? AB_SSS #-------------------------------------------------------------------------- # スキルシール #-------------------------------------------------------------------------- def pss return if @skill_window.item == nil Sound.play_ok s_id = @skill_window.item.id chara = @skill_window.actor chara.auto_skill_seal = [] if chara.auto_skill_seal == nil if chara.auto_skill_seal.include?(s_id) chara.auto_skill_seal.delete(s_id) chara.auto_skill_seal.delete($data_skills[s_id].skill_switching) if $data_skills[s_id].skill_switching != 0 else chara.auto_skill_seal.push(s_id) chara.auto_skill_seal.push($data_skills[s_id].skill_switching) if $data_skills[s_id].skill_switching != 0 end @skill_window.refresh end end end