182 lines
No EOL
8.6 KiB
Ruby
182 lines
No EOL
8.6 KiB
Ruby
#==============================================================================
|
||
# ■ 共有変数スクリプト (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 |