# -*- encoding: utf-8 -*- # # Name: 複数スロット対応クイックセーブ/ロード機能 for VX Ace 0.00a # Last-Modified: 2015/04/03 06:49:59 # Author: ping値(http://twitter/pingval) # 改変・二次配布可。ただし、改変した場合はその旨をどこかに記述してください。 # # 2015/03/24 v0.00a # ・入力拡張スクリプト導入時、SAVE_KEY, LOAD_KEYをVitrual-Keyでも指定可能にした。 # 2015/03/23 v0.00 # ・公開 # # ・クイックセーブ/ロード機能を追加します。 # ・このスクリプトだけでは1個のセーブファイルしか使用できませんが、WF-RGSS Scriptsさんの「Input 入力拡張スクリプト」または「Input-EX 入力拡張・ゲームパッド振動対応スクリプト」を導入すれば、9個あるいはそれ以上のセーブスロットを利用できるようになります。 # ・初期設定では、Shift+0~9でセーブ、Ctrl+0~9でロード。0キーは直前にクイックセーブしたファイルに対応。 # ・設置場所はInput.rb(またはInputEx.rb)よりも下にしてください。 module Pingval_QSaveLoad # 入力拡張スクリプト導入時:同時押しでのクイックセーブに割り当てるキー。VKでも指定可能。 # 入力拡張スクリプト未導入時:クイックセーブに割り当てるキー SAVE_KEY = :SHIFT # 入力拡張スクリプト導入時:同時押しでのクイックロードに割り当てるキー。VKでも指定可能。nilを指定した場合、0~9キー単体でロードを行う。 # 入力拡張スクリプト未導入時:クイックロードに割り当てるキー LOAD_KEY = :CTRL # デバッグモード時のみ有効 DEBUG_ONLY = false # @@last_qsaveload_slot を更新する行動。:save, :loadを指定可能 UPDATE_LAST_SLOT_ACTIONS = [:save] # SAVE_KEYとLOAD_KEYが同時に押された場合に優先する行動 PRECEDE_ACTION = :load # メッセージ表示(クイックセーブ時のみ) DISPLAY_MESSAGE = true # 「1」キーに対応する「Save###.rvdata2」 FIRST_SAVEFILE_INDEX = 101 # ※これより下は変更不要※ # 入力拡張スクリプトを導入済み WFRGSS_INPUT = defined?(Input.vk_trigger?) # スロットに対応するキーの定義。VKで指定する。任意のVKに変更可能。 SLOT_TABLE = !WFRGSS_INPUT ? [] : [ Input::VK_0, Input::VK_1, Input::VK_2, Input::VK_3, Input::VK_4, Input::VK_5, Input::VK_6, Input::VK_7, Input::VK_8, Input::VK_9, ] # 使用スロットの初期値 INITIAL_SLOT = 1 # 直前のセーブファイルに割り当てるスロット SLOT_FOR_LAST_SAVEFILE = 0 BASIC_KEYS = %w[DOWN LEFT RIGHT UP A B C X Y Z L R SHIFT CTRL ALT F5 F6 F7 F8 F9].map(&:intern) # METHOD_FOR_INPUT = WFRGSS_INPUT ? :press? : :trigger? end if !Pingval_QSaveLoad::DEBUG_ONLY || $TEST class Window_MapName # マップ表示機能を再利用してメッセージ表示。ただしクイックセーブ時のみ。 def qsaveload_open(text) contents.clear draw_background(contents.rect) draw_text(contents.rect, text, 1) @show_count = 150 self.contents_opacity = 0 self end end # クイックロードはいつでも可 class Scene_Base include Pingval_QSaveLoad # 直前にセーブ(やロード)を行ったスロット @@last_qsaveload_slot = INITIAL_SLOT # クイックセーブ/ロードを取得 def get_qsaveload_action def key_method(key_or_vk) if !WFRGSS_INPUT Input.trigger?(key_or_vk) elsif BASIC_KEYS.include?(key_or_vk) Input.press?(key_or_vk) else Input.vk_press?(key_or_vk) end end save = key_method(SAVE_KEY) load = LOAD_KEY.nil? || key_method(LOAD_KEY) if save && load if LOAD_KEY.nil? || PRECEDE_ACTION == :save :save else :load end elsif save :save elsif load :load else nil end end # クイックセーブ/ロードするセーブファイルのインデックスを取得 def quicksavefile_index(action=:load) if !WFRGSS_INPUT # 入力拡張スクリプトを導入していない場合、常にINITIAL_SLOT slot = INITIAL_SLOT else # 押下された中で最も小さい数字を返す(押下されていない場合はnil) slot = SLOT_TABLE.index {|vk| Input.vk_trigger?(vk)} end return if slot.nil? lastp = slot == SLOT_FOR_LAST_SAVEFILE if lastp slot = @@last_qsaveload_slot elsif UPDATE_LAST_SLOT_ACTIONS.include?(action) @@last_qsaveload_slot = slot end msg = "%s:%d" % [action == :save ? "qsave" : "qload", slot] if $TEST p msg end if DISPLAY_MESSAGE && SceneManager.scene_is?(Scene_Map) @map_name_window.qsaveload_open(msg) end # スロット番号 => セーブファイルインデックス slot + FIRST_SAVEFILE_INDEX - 2 end # クイックロード alias :pingval_qsaveload_update :update def update pingval_qsaveload_update return if get_qsaveload_action != :load idx = self.quicksavefile_index(:load) return if idx.nil? # 戦闘中ならprocess_abort BattleManager.process_abort if $game_party.in_battle # @last_savefile_indexが異常な場合、通常のセーブ/ロード画面で落ちるのを防止 begin last_idx = DataManager.instance_variable_get(:@last_savefile_index) if DataManager.load_game(idx) Sound.play_load # fadeout_all(1) $game_system.on_after_load SceneManager.goto(Scene_Map) else Sound.play_buzzer end ensure DataManager.instance_variable_set(:@last_savefile_index, last_idx) end end end # クイックセーブはマップ上のみ可 class Scene_Map include Pingval_QSaveLoad # クイックセーブ alias :pingval_qsaveload_update_scene :update_scene def update_scene pingval_qsaveload_update_scene return if get_qsaveload_action != :save idx = self.quicksavefile_index(:save) return if idx.nil? begin last_idx = DataManager.instance_variable_get(:@last_savefile_index) if DataManager.save_game(idx) Sound.play_save # return_scene else Sound.play_buzzer end ensure DataManager.instance_variable_set(:@last_savefile_index, last_idx) end end end end