#◆◇◆◇◆ 強くてニューゲームスクリプト ver 1.01 ◇◆◇◆◇ # 全マスタースクリプト共通スクリプト # サポート掲示板 http://www2.ezbbs.net/21/minto-aaa/ # by みんと =begin ■ 更新履歴 ○ ver 1.01(2009/03/22) deep_copyの入れ忘れを修正 ○ ver 1.00(2009/03/22) 公開 ■ 説明 クリア時のデータを継承してニューゲームをはじめます。 継承できるデータは ・資金 ・所持アイテム(装備品) ・アクターデータ ・指定スイッチの内容 ・指定変数の内容 です。 各データにON、OFFが設定できます。 強くてニューゲーム用のクリアデータの出力は、 イベントコマンドの「スクリプト」で ClearData.data_out と入力してください。 ゲームをクリアしているかどうかの取得は ClearData.game_clear? と入力してください。 イベントコマンドの「条件分岐⇒スクリプト」で クリアしている場合の内容が設定できます。 コンバート画面に移行するには イベントコマンドの「スクリプト」で ClearData.convert と入力してください。 コンバート画面のインターフェイスはメニュー画面をそのまま使用しています。 ですので、メニュー画面の改造等にも対応しています。 =end #============================================================================== # ☆ MINTO #------------------------------------------------------------------------------ # 様々なフラグを扱うメインモジュールです。 #============================================================================== module MINTO # 強くてニューゲームスクリプトを有効化 ( true で有効 / false で無効 ) RGSS["強くてニューゲームスクリプト"] = true end # 強くてニューゲームスクリプトが有効な場合に以降の処理を実行する if MINTO::RGSS["強くてニューゲームスクリプト"] == true then #============================================================================== # ☆ カスタマイズ #------------------------------------------------------------------------------ # 機能のカスタマイズをここで行います。 #============================================================================== module ClearData #-------------------------------------------------------------------------- # ● 引き継ぐ要素の取得 #-------------------------------------------------------------------------- def self.get_convert_data # 変更しない @convert_data = {} # 資金の引き継ぎフラグ( true で有効 / false で無効 ) @convert_data["資金引き継ぎ"] = true # 所持アイテムの引き継ぎフラグ @convert_data["所持アイテム引き継ぎ"] = true # アクターデータの引き継ぎフラグ @convert_data["アクターデータ引き継ぎ"] = true # 指定スイッチの引き継ぎ # 配列式で記入したIDのスイッチの内容を引き継ぎます # 不要なら空配列([])を設定してください @convert_data["スイッチ引き継ぎ"] = [1, 10] # 指定変数の引き継ぎ # 配列式で記入したIDの変数の内容を引き継ぎます # 不要なら空配列を設定してください @convert_data["変数引き継ぎ"] = [1, 10] end end #============================================================================== # ■ ClearData #------------------------------------------------------------------------------ #  クリアデータを扱うモジュールです。 # Game_ClearDataクラスのインスタンスを扱い、実際の処理を行います。 #============================================================================== module ClearData #-------------------------------------------------------------------------- # ● データの引き継ぎ #-------------------------------------------------------------------------- def self.convert # コンバート中フラグを有効にする $game_temp.convert_new = true # データを設定 self.get_convert_data # クリアデータファイルが存在する場合 if self.game_clear? == true then # オブジェクトを保存 game_party = $game_party.deep_copy frame_count = Graphics.frame_count # 対象データを一時的に書き換える $game_party = @file.save_data[4].deep_copy Graphics.frame_count = @file.save_data[5] # トランジション準備 Graphics.freeze # メニュー画面に移行 scene = Scene_Menu.new scene.main # トランジション実行 Graphics.transition # 対象データを戻す $game_party = game_party.deep_copy Graphics.frame_count = frame_count # パーティーをリフレッシュ $game_party.refresh # データを引き継がない場合 unless $game_temp.convert then # コンバート中フラグをクリア $game_temp.convert_new = false # メソッドを返す return end # 資金引き継ぎが有効な場合 if @convert_data["資金引き継ぎ"] == true then # 資金を引き継ぐ $game_party.gold = @file.save_data[4].gold end # 所持アイテム引き継ぎが有効な場合 if @convert_data["所持アイテム引き継ぎ"] == true then # 所持アイテムを引き継ぐ $game_party.items = @file.save_data[4].items $game_party.weapons = @file.save_data[4].weapons $game_party.armors = @file.save_data[4].armors end # アクターデータ引き継ぎが有効な場合 if @convert_data["アクターデータ引き継ぎ"] == true then # 資金を引き継ぐ $game_actors = @file.save_data[3] # パーティーをリフレッシュ $game_party.refresh end # 指定スイッチ引き継ぎが有効な場合 if @convert_data["スイッチ引き継ぎ"].size >= 1 then # ループ処理 for id in @convert_data["スイッチ引き継ぎ"] do # 指定スイッチを引き継ぐ $game_switches[id] = @file.save_data[1][id] end end # 指定変数引き継ぎが有効な場合 if @convert_data["変数引き継ぎ"].size >= 1 then # ループ処理 for id in @convert_data["変数引き継ぎ"] do # 指定変数を引き継ぐ $game_variables[id] = @file.save_data[2][id] end end end # コンバート中フラグをクリア $game_temp.convert_new = false # メソッドを返す return end #-------------------------------------------------------------------------- # ● ゲームクリア済みフラグの取得 #-------------------------------------------------------------------------- def self.game_clear? # クリアデータファイルが存在する場合 if FileTest.exist?("clear_data.rxdata") == true then # クリアデータのロード @file = load_data("clear_data.rxdata") # クリアデータファイルが正しいオブジェクトの場合 if @file.is_a?(Game_ClearData) == true then # フラグを返す return true end end # フラグを返す return false end #-------------------------------------------------------------------------- # ● クリアデータ作成 #-------------------------------------------------------------------------- def self.data_out # クリアデータを作成 data = Game_ClearData.new # クリアデータの書き込み file = File.open("clear_data.rxdata", "wb") Marshal.dump(data, file) file.close end end #============================================================================== # ■ Object #------------------------------------------------------------------------------ #  全てのクラスのスーパークラス。オブジェクトの一般的な振舞いを定義します。 #============================================================================== class Object #-------------------------------------------------------------------------- # ● 深い複製の作成 #-------------------------------------------------------------------------- def dec # Marshalもモジュールを経由して、完全な複製を作成 return Marshal.load(Marshal.dump(self)) end #-------------------------------------------------------------------------- # ● 深い複製の作成 #-------------------------------------------------------------------------- def deep_copy # Marshalもモジュールを経由して、完全な複製を作成 return Marshal.load(Marshal.dump(self)) end end #============================================================================== # ■ Game_Temp #------------------------------------------------------------------------------ #  セーブデータに含まれない、一時的なデータを扱うクラスです。このクラスのイン # スタンスは $game_temp で参照されます。 #============================================================================== class Game_Temp #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :convert_new # コンバート中フラグ attr_accessor :convert # コンバートフラグ end #============================================================================== # ■ Game_Party #------------------------------------------------------------------------------ #  パーティを扱うクラスです。ゴールドやアイテムなどの情報が含まれます。このク # ラスのインスタンスは $game_party で参照されます。 #============================================================================== class Game_Party #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :actors # アクター attr_accessor :gold # ゴールド attr_accessor :items # アイテム attr_accessor :weapons # 武器 attr_accessor :armors # 防具 end #============================================================================== # ■ Game_ClearData #------------------------------------------------------------------------------ #  クリアデータを扱うクラスです。 # データセーブ時に生成され、必要な情報を保存します。 #============================================================================== class Game_ClearData #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :save_data # セーブデータ #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize @save_data = [] @save_data[0] = $game_system.deep_copy @save_data[1] = $game_switches.deep_copy @save_data[2] = $game_variables.deep_copy @save_data[3] = $game_actors.deep_copy @save_data[4] = $game_party.deep_copy @save_data[5] = Graphics.frame_count end end #============================================================================== # ■ Window_Base #------------------------------------------------------------------------------ #  ゲーム中のすべてのウィンドウのスーパークラスです。 #============================================================================== class Window_Base < Window #-------------------------------------------------------------------------- # ● オブジェクト初期化 # x : ウィンドウの X 座標 # y : ウィンドウの Y 座標 # width : ウィンドウの幅 # height : ウィンドウの高さ #-------------------------------------------------------------------------- alias :initialize_nwe_game2 :initialize def initialize(x, y, width, height) # 元の処理を実行 initialize_nwe_game2(x, y, width, height) # コンバート中の場合 if $game_temp != nil and $game_temp.convert_new == true then # ウィンドウを最前面に表示 self.z += 9999 end end end #============================================================================== # ■ Window_Selectable #------------------------------------------------------------------------------ #  カーソルの移動やスクロールの機能を持つウィンドウクラスです。 #============================================================================== class Window_Selectable < Window_Base #-------------------------------------------------------------------------- # ● オブジェクト初期化 # x : ウィンドウの X 座標 # y : ウィンドウの Y 座標 # width : ウィンドウの幅 # height : ウィンドウの高さ #-------------------------------------------------------------------------- alias :initialize_nwe_game :initialize def initialize(x, y, width, height) # 元の処理を実行 initialize_nwe_game(x, y, width, height) # コマンドウィンドウ以外の場合 unless self.class.to_s.include?("Command") # メソッドを返す return end # コンバート中の場合 if $game_temp != nil and $game_temp.convert_new == true then # ウィンドウを不可視にする self.visible = false end end end #============================================================================== # ■ Window_Convert_Command #------------------------------------------------------------------------------ #  コンバート画面でコマンドを表示するウィンドウです。 #============================================================================== class Window_Convert_Command < Window_Selectable #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize super(0, 0, 256, 128) self.contents = Bitmap.new(width - 32, height - 32) self.active = true self.visible = true self.index = 1 self.z += 100 self.index = 0 self.opacity = 160 @last_index = self.index centering @data = ["継承してはじめる", "普通にはじめる"] @item_max = 2 @column_max = 1 refresh end #-------------------------------------------------------------------------- # ● ウィンドウのセンタリング #-------------------------------------------------------------------------- def centering # ウィンドウを画面の中央に配置する self.x = (640 - self.width) / 2 self.y = (480 - self.height) / 2 end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh item_set for i in 0...@item_max draw_item(i, i == self.index) end end #-------------------------------------------------------------------------- # ● 項目の描画 #-------------------------------------------------------------------------- def item_set # テキストを取得 text = "このデータを継承してゲームをはじめます。" self.width = self.contents.text_size(text).width + 32 # 古いコンテンツを解放 if self.contents != nil then self.contents.dispose self.contents = nil end self.contents = Bitmap.new(width - 32, height - 32) self.contents.font.color = normal_color self.contents.draw_text(0, 0, self.width - 32, 24, text) self.contents.draw_text(0, 24, self.width - 32, 24, "よろしいですか?") centering end #-------------------------------------------------------------------------- # ● 項目の描写 # index : 項目のインデックス # active : アクティブフラグ #-------------------------------------------------------------------------- def draw_item(index, active) # カーソルの幅を計算 cursor_width = self.width - 32 # カーソルの座標を計算 x = 4 # 描写色を設定 if active self.contents.font.color = system_color else self.contents.font.color = normal_color end rect = Rect.new(x + 16, 48 + (index * 24), cursor_width, 24) self.contents.fill_rect(rect, Color.new(0, 0, 0, 0)) self.contents.draw_text(rect, @data[index]) end #-------------------------------------------------------------------------- # ● カーソルの矩形更新 #-------------------------------------------------------------------------- def update_cursor_rect # ウィンドウがアクティブでない場合 unless self.active then self.cursor_rect.empty return end # カーソル位置が 0 未満の場合 if @index < 0 then self.cursor_rect.empty return end # カーソルの座標を計算 x = 4 y = 48 * 1 + (@index * 24) # カーソルの矩形を更新 self.cursor_rect.set(x, y, 192, 24) end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update super # 項目が変更された場合 if @last_index != self.index draw_item(@last_index, false) draw_item(self.index, true) @last_index = self.index end end end #============================================================================== # ■ Scene_Menu #------------------------------------------------------------------------------ #  メニュー画面の処理を行うクラスです。 #============================================================================== class Scene_Menu #-------------------------------------------------------------------------- # ● メイン処理 #-------------------------------------------------------------------------- alias :main_nwe_game :main def main # コンバート中の場合 if $game_temp.convert_new == true then # コンバートコマンドウィンドウを作成 @convert_command_window = Window_Convert_Command.new end # 元の処理を実行 main_nwe_game # コンバート中の場合 if $game_temp.convert_new == true then # コンバートコマンドウィンドウを解放 @convert_command_window.dispose end end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- alias :update_nwe_game :update def update # コンバート中の場合 if $game_temp.convert_new == true then # ループ処理 loop do # ゲーム画面を更新 Graphics.update # 入力情報を更新 Input.update # コンバートコマンドウィンドウを更新 @convert_command_window.update # C ボタンが押された場合 if Input.trigger?(Input::C) # 決定 SE を演奏 $game_system.se_play($data_system.decision_se) # コンバートコマンドウィンドウが不可視の場合 unless @convert_command_window.visible then # コンバートコマンドウィンドウを有効にする @convert_command_window.visible = true @convert_command_window.active = true else # コンバートフラグを代入 $game_temp.convert = (@convert_command_window.index == 0) # ループから抜ける break end end end # メソッドを返す return end # 元の処理を実行 update_nwe_game end end end