#============================================================================== # ■ 共有変数スクリプト (VX Ace用) #------------------------------------------------------------------------------ # 製作者 : CanariAlternate # サイト名 : カルトの鳥篭 # サイトURL : http://canarialt.blog.fc2.com #------------------------------------------------------------------------------ # ■ 概要 : イベントコマンド「コモンイベント」にて生成される Game_Interpreter の # オブジェクトとインスタンス変数を共有する仕様にする。 # イベントコマンド「コモンイベント」でセーブを行うとロードした際に # それ以降のイベントコマンドが実行されないバグを修正する。 # Game_Interpreter のインスタンス変数(一部除く)をセーブする仕様にする。 # # ■ 必須 : なし # # ■ 位置 : 「Game_Interpreter」より下 #------------------------------------------------------------------------------ # 更新履歴 : 2012/10/05 Ver1.00 コードを共通処理スクリプトから分離 # 2013/02/19 Ver1.01 共通処理スクリプトの廃止による変更を施した。 # 2013/05/11 Ver1.02 インスタンス変数をセーブできる仕様に変更した。 # イベントコマンドが処理されないバグの修正を追加した。 #============================================================================== $imported ||= {} $imported[:CanariAlternate_InterpreterMemory] = true #============================================================================== # ■ Calt #------------------------------------------------------------------------------ #  CanariAlternateが製作したスクリプト用のモジュールです。 #============================================================================== module Calt #---------------------------------------------------------------------------- # イベントコマンド「コモンイベント」で共有しないインスタンス変数のリスト NOT_TRANSFER = [:@depth, :@map_id, :@event_id, :@list, :@index, :@branch, :@fiber, :@child] #---------------------------------------------------------------------------- end #============================================================================== # ■ Game_Interpreter #------------------------------------------------------------------------------ #  イベントコマンドを実行するインタプリタです。このクラスは Game_Map クラス、 # Game_Troop クラス、Game_Event クラスの内部で使用されます。 #============================================================================== class Game_Interpreter #-------------------------------------------------------------------------- # ● クリア [追加] #-------------------------------------------------------------------------- alias clear_InterpreterMemory clear def clear @child = nil # コモンイベントのインタプリタ clear_InterpreterMemory end #-------------------------------------------------------------------------- # ● イベントのセットアップ [追加] #-------------------------------------------------------------------------- alias setup_InterpreterMemory setup def setup(*args) ivar_data = args[-1].is_a?(IVer_Data) ? args.pop : nil setup_InterpreterMemory(*args) load_ivar_data(ivar_data) if ivar_data end #-------------------------------------------------------------------------- # ● オブジェクトのダンプ [◆再定義] #-------------------------------------------------------------------------- def marshal_dump ivar_data = create_ivar_data ivar_data[:@index] += 1 return ivar_data end #-------------------------------------------------------------------------- # ● オブジェクトのロード [◆再定義] #-------------------------------------------------------------------------- def marshal_load(ivar_data) load_ivar_data(ivar_data) create_fiber end #-------------------------------------------------------------------------- # ● イベントコマンドの実行 [追加] #-------------------------------------------------------------------------- alias execute_command_InterpreterMemory execute_command def execute_command if @child @index -= 1 # セーブ・ロードで実行位置がズレないように1つ戻しておく @child.run load_ivar_data(@child.child_ivar_data) # 変数を引き継ぐ @child = nil @index += 1 end execute_command_InterpreterMemory end #-------------------------------------------------------------------------- # ● コモンイベント [◆再定義] #-------------------------------------------------------------------------- def command_117 common_event = $data_common_events[@params[0]] if common_event @child = Game_Interpreter.new(@depth + 1) @child.setup(common_event.list, same_map? ? @event_id : 0, child_ivar_data) # 変数の引継ぎを追加 @child.run load_ivar_data(@child.child_ivar_data) # 変数を引き継ぐ @child = nil end end #-------------------------------------------------------------------------- # ● インスタンス変数のセーブデータを生成 [新規] #-------------------------------------------------------------------------- def create_ivar_data ivar_data = IVer_Data.new instance_variables.each do |variable_name| variable = instance_variable_get(variable_name) next if impossible_data?(variable) ivar_data[variable_name] = variable end return ivar_data end #-------------------------------------------------------------------------- # ● インスタンス変数のロード処理 [新規] #-------------------------------------------------------------------------- def load_ivar_data(ivar_data) ivar_data.each do |variable_name, variable| instance_variable_set(variable_name, variable) end end #-------------------------------------------------------------------------- # ● セーブ不可なデータか判定 [新規] #-------------------------------------------------------------------------- def impossible_data?(variable) return true if variable.is_a?(Fiber) return true if variable.is_a?(Sprite) return true if variable.is_a?(Bitmap) return true if variable.is_a?(Plane) return true if variable.is_a?(Viewport) return true if variable.is_a?(Window) return false end #-------------------------------------------------------------------------- # ● コモンイベント引継ぎ用のセーブデータを取得 [新規] #-------------------------------------------------------------------------- def child_ivar_data ivar_data = create_ivar_data Calt::NOT_TRANSFER.each {|variable_name| ivar_data.delete(variable_name) } return ivar_data end end #============================================================================== # ■ IVer_Data #------------------------------------------------------------------------------ #  インスタンス変数を記憶する為のクラスです。ハッシュのサブクラスです。 # セーブデータかどうかの判定にクラス判定を利用します。 #============================================================================== class IVer_Data < Hash # nothing end #============================================================================== # ■ Game_Interpreter #------------------------------------------------------------------------------ #  旧バージョンとの互換用の定義 #============================================================================== class Game_Interpreter #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :memory # 共有変数 #-------------------------------------------------------------------------- # ● クリア [追加] #-------------------------------------------------------------------------- alias clear_InterpreterMemory_old clear def clear @memory = {} # 共有変数の初期化 clear_InterpreterMemory_old end end