中断セーブ
[概要]
メニュー「ゲーム終了」に一時保存機能を追加します。
中断時のデータはタイトル画面から再開でき、一度再開すると消滅します。
[スクリプト]
#============================================================================== # ++ 中断セーブ ver. 1.00 ++ # Script by パラ犬 # http://2d6.parasite.jp/ #------------------------------------------------------------------------------ # メニューの「ゲーム終了」に中断セーブ機能を追加します。 # 中断セーブデータは一度呼び出すと消滅します。 #============================================================================== module PARA_RESTART # メニューに表示する文字 MENU_COMMAND_NAME = "中断セーブ" # タイトル画面に表示する文字 TITLE_COMMAND_NAME = "中断データから再開" # 中断時の戻り先( 0:ゲーム終了 1:タイトル画面 ) RETURN_SCENE = 1 # 確認メッセージ DIALOG1 = "一時保存して中断" # セーブして中断 DIALOG2 = "一時保存しないで中断" # セーブしないで中断 DIALOG3 = "キャンセル" # 戻る # ファイル名 FILENAME = "SaveTemp.rxdata" end #============================================================================== # ■ Scene_End #============================================================================== class Scene_End #-------------------------------------------------------------------------- # ● メイン処理 #-------------------------------------------------------------------------- def main # コマンドウィンドウを作成 s1 = PARA_RESTART::DIALOG1 s2 = PARA_RESTART::DIALOG2 s3 = PARA_RESTART::DIALOG3 @command_window = Window_Command.new(192, [s1, s2, s3]) @command_window.x = 320 - @command_window.width / 2 @command_window.y = 240 - @command_window.height / 2 # トランジション実行 Graphics.transition # メインループ loop do # ゲーム画面を更新 Graphics.update # 入力情報を更新 Input.update # フレーム更新 update # 画面が切り替わったらループを中断 if $scene != self break end end # トランジション準備 Graphics.freeze # ウィンドウを解放 @command_window.dispose # タイトル画面に切り替え中の場合 if $scene.is_a?(Scene_Title) # 画面をフェードアウト Graphics.transition Graphics.freeze end end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update # コマンドウィンドウを更新 @command_window.update # B ボタンが押された場合 if Input.trigger?(Input::B) # キャンセル SE を演奏 $game_system.se_play($data_system.cancel_se) # メニュー画面に切り替え $scene = Scene_Menu.new(5) return end # C ボタンが押された場合 if Input.trigger?(Input::C) # コマンドウィンドウのカーソル位置で分岐 case @command_window.index when 0 # セーブして中断 command_save_and_end when 1 # セーブしないで中断 command_no_save_and_end when 2 # やめる command_cancel end return end end #-------------------------------------------------------------------------- # ○ コマンド [セーブして中断] 選択時の処理 #-------------------------------------------------------------------------- def command_save_and_end # セーブデータの書き込み file = File.open(PARA_RESTART::FILENAME, "wb") write_save_data(file) file.close # 中断処理(セーブしないで中断と共通) command_no_save_and_end end #-------------------------------------------------------------------------- # ○ コマンド [セーブしないで中断] 選択時の処理 #-------------------------------------------------------------------------- def command_no_save_and_end case PARA_RESTART::RETURN_SCENE when 0 # ゲーム終了 command_shutdown when 1 # タイトル画面 command_to_title end end #-------------------------------------------------------------------------- # ○ セーブデータの書き込み # file : 書き込み用ファイルオブジェクト (オープン済み) #-------------------------------------------------------------------------- def write_save_data(file) # セーブファイル描画用のキャラクターデータを作成 characters = [] for i in 0...$game_party.actors.size actor = $game_party.actors[i] characters.push([actor.character_name, actor.character_hue]) end # セーブファイル描画用のキャラクターデータを書き込む Marshal.dump(characters, file) # プレイ時間計測用のフレームカウントを書き込む Marshal.dump(Graphics.frame_count, file) # セーブ回数を 1 増やす $game_system.save_count += 1 # マジックナンバーを保存する # (エディタで保存するたびにランダムな値に書き換えられる) $game_system.magic_number = $data_system.magic_number # 各種ゲームオブジェクトを書き込む Marshal.dump($game_system, file) Marshal.dump($game_switches, file) Marshal.dump($game_variables, file) Marshal.dump($game_self_switches, file) Marshal.dump($game_screen, file) Marshal.dump($game_actors, file) Marshal.dump($game_party, file) Marshal.dump($game_troop, file) Marshal.dump($game_map, file) Marshal.dump($game_player, file) end end #============================================================================== # ■ Scene_Menu #============================================================================== class Scene_Menu #-------------------------------------------------------------------------- # ● メイン処理 #-------------------------------------------------------------------------- def main # コマンドウィンドウを作成 s1 = $data_system.words.item s2 = $data_system.words.skill s3 = $data_system.words.equip s4 = "ステータス" s5 = "セーブ" s6 = PARA_RESTART::MENU_COMMAND_NAME @command_window = Window_Command.new(160, [s1, s2, s3, s4, s5, s6]) @command_window.index = @menu_index # パーティ人数が 0 人の場合 if $game_party.actors.size == 0 # アイテム、スキル、装備、ステータスを無効化 @command_window.disable_item(0) @command_window.disable_item(1) @command_window.disable_item(2) @command_window.disable_item(3) end # セーブ禁止の場合 if $game_system.save_disabled # セーブを無効にする @command_window.disable_item(4) end # プレイ時間ウィンドウを作成 @playtime_window = Window_PlayTime.new @playtime_window.x = 0 @playtime_window.y = 224 # 歩数ウィンドウを作成 @steps_window = Window_Steps.new @steps_window.x = 0 @steps_window.y = 320 # ゴールドウィンドウを作成 @gold_window = Window_Gold.new @gold_window.x = 0 @gold_window.y = 416 # ステータスウィンドウを作成 @status_window = Window_MenuStatus.new @status_window.x = 160 @status_window.y = 0 # トランジション実行 Graphics.transition # メインループ loop do # ゲーム画面を更新 Graphics.update # 入力情報を更新 Input.update # フレーム更新 update # 画面が切り替わったらループを中断 if $scene != self break end end # トランジション準備 Graphics.freeze # ウィンドウを解放 @command_window.dispose @playtime_window.dispose @steps_window.dispose @gold_window.dispose @status_window.dispose end end #============================================================================== # ■ Scene_Title #------------------------------------------------------------------------------ # タイトル画面の処理を行うクラスです。 #============================================================================== class Scene_Title #-------------------------------------------------------------------------- # ● メイン処理 #-------------------------------------------------------------------------- def main # 戦闘テストの場合 if $BTEST battle_test return end # データベースをロード $data_actors = load_data("Data/Actors.rxdata") $data_classes = load_data("Data/Classes.rxdata") $data_skills = load_data("Data/Skills.rxdata") $data_items = load_data("Data/Items.rxdata") $data_weapons = load_data("Data/Weapons.rxdata") $data_armors = load_data("Data/Armors.rxdata") $data_enemies = load_data("Data/Enemies.rxdata") $data_troops = load_data("Data/Troops.rxdata") $data_states = load_data("Data/States.rxdata") $data_animations = load_data("Data/Animations.rxdata") $data_tilesets = load_data("Data/Tilesets.rxdata") $data_common_events = load_data("Data/CommonEvents.rxdata") $data_system = load_data("Data/System.rxdata") # システムオブジェクトを作成 $game_system = Game_System.new # タイトルグラフィックを作成 @sprite = Sprite.new @sprite.bitmap = RPG::Cache.title($data_system.title_name) # コマンドウィンドウを作成 s1 = "ニューゲーム" s2 = "コンティニュー" s3 = "シャットダウン" s4 = PARA_RESTART::TITLE_COMMAND_NAME @command_window = Window_Command.new(192, [s1, s2 ,s4 ,s3]) @command_window.back_opacity = 160 @command_window.x = 320 - @command_window.width / 2 @command_window.y = 288 # コンティニュー有効判定 # セーブファイルがひとつでも存在するかどうかを調べる # 有効なら @continue_enabled を true、無効なら false にする @continue_enabled = false for i in 0..3 if FileTest.exist?("Save#{i+1}.rxdata") @continue_enabled = true end end # コンティニューが有効な場合、カーソルをコンティニューに合わせる # 無効な場合、コンティニューの文字をグレー表示にする if @continue_enabled @command_window.index = 1 else @command_window.disable_item(1) end # 中断データ有効判定 # 中断セーブファイルが存在するかどうかを調べる # 有効なら @restart_enabled を true、無効なら false にする @restart_enabled = false if FileTest.exist?(PARA_RESTART::FILENAME) @restart_enabled = true end # コンティニューが有効な場合、カーソルをコンティニューに合わせる # 無効な場合、コンティニューの文字をグレー表示にする if @restart_enabled @command_window.index = 2 else @command_window.disable_item(2) end # タイトル BGM を演奏 $game_system.bgm_play($data_system.title_bgm) # ME、BGS の演奏を停止 Audio.me_stop Audio.bgs_stop # トランジション実行 Graphics.transition # メインループ loop do # ゲーム画面を更新 Graphics.update # 入力情報を更新 Input.update # フレーム更新 update # 画面が切り替わったらループを中断 if $scene != self break end end # トランジション準備 Graphics.freeze # コマンドウィンドウを解放 @command_window.dispose # タイトルグラフィックを解放 @sprite.bitmap.dispose @sprite.dispose end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update # コマンドウィンドウを更新 @command_window.update # C ボタンが押された場合 if Input.trigger?(Input::C) # コマンドウィンドウのカーソル位置で分岐 case @command_window.index when 0 # ニューゲーム command_new_game when 1 # コンティニュー command_continue when 2 # 再開 command_restart when 3 # シャットダウン command_shutdown end end end #-------------------------------------------------------------------------- # ○ コマンド : 再開 #-------------------------------------------------------------------------- def command_restart # コンティニューが無効の場合 unless @restart_enabled # ブザー SE を演奏 $game_system.se_play($data_system.buzzer_se) return end # 決定 SE を演奏 $game_system.se_play($data_system.decision_se) # ファイルが存在しない場合 unless FileTest.exist?(PARA_RESTART::FILENAME) # ブザー SE を演奏 $game_system.se_play($data_system.buzzer_se) return end # テンポラリオブジェクトを再作成 $game_temp = Game_Temp.new # セーブデータの読み込み file = File.open(PARA_RESTART::FILENAME, "rb") read_save_data(file) file.close # ファイルの削除 File.delete(PARA_RESTART::FILENAME) # BGM、BGS を復帰 $game_system.bgm_play($game_system.playing_bgm) $game_system.bgs_play($game_system.playing_bgs) # マップを更新 (並列イベント実行) $game_map.update # マップ画面に切り替え $scene = Scene_Map.new end #-------------------------------------------------------------------------- # ○ セーブデータの読み込み # file : 読み込み用ファイルオブジェクト (オープン済み) #-------------------------------------------------------------------------- def read_save_data(file) # セーブファイル描画用のキャラクターデータを読み込む characters = Marshal.load(file) # プレイ時間計測用のフレームカウントを読み込む Graphics.frame_count = Marshal.load(file) # 各種ゲームオブジェクトを読み込む $game_system = Marshal.load(file) $game_switches = Marshal.load(file) $game_variables = Marshal.load(file) $game_self_switches = Marshal.load(file) $game_screen = Marshal.load(file) $game_actors = Marshal.load(file) $game_party = Marshal.load(file) $game_troop = Marshal.load(file) $game_map = Marshal.load(file) $game_player = Marshal.load(file) # マジックナンバーがセーブ時と異なる場合 # (エディタで編集が加えられている場合) if $game_system.magic_number != $data_system.magic_number # マップをリロード $game_map.setup($game_map.map_id) $game_player.center($game_player.x, $game_player.y) end # パーティメンバーをリフレッシュ $game_party.refresh end end
[差分ファイル]
・
タイトル画面カスタマイズ 併用化パッチ
・
タイトル画面カスタマイズ
で、中断セーブのメニューコマンドに
画像を使えるようにします。
[更新履歴]
2007/5/3 ver.1.00
公開。
戻る