ついにサイドビュースクリプトのテスト版が出ましたね。
動作を見て、スクリプトを見ていたら自然と笑ってしまいました。もちろん悪い意味ではなく、なんか圧倒されたような感じとわくわくするのと。
敵の方にゆるやかにジャンプし、急降下してダメージを与える姿と言ったらもう…。
飛ばしアニメのループや画面シェイク、待機キャンセルも喉から手が出る的に欲しい機能だったので感動してしまいました。
まずはスクリプトをいくつかのセクションに分けて全体像を把握していこうと思います。
早くも話は変わって。
ツクールVXAceでは他のイベントから呼ばれるコモンイベントにセーブ画面を開くイベントを入れると、そこでセーブしてロードしたとき、そのコモンイベントのセーブ画面を開く以降のイベントコマンドが実行されません。VXでは実行されていたのに・・・。
これはその仕様を何とかする力技のスクリプトです。
marshal_dumpとmarshal_loadがどこで呼ばれてるのかが検索したりヘルプを見たりする限りでは謎だったので、子インタプリタを再帰的に処理するようにしてます。
素材のところの最上部またはGame_Interpreterの1個下くらいに入れるのが良さそうです。
右端に切れてるとこがありますが、消えたわけではないので問題ありません。
以下がそのスクリプトです。
#============================================================================== # ■ Game_Interpreter #------------------------------------------------------------------------------ # イベントコマンドを実行するインタプリタです。このクラスは Game_Map クラス、 # Game_Troop クラス、Game_Event クラスの内部で使用されます。 #============================================================================== class Game_Interpreter #-------------------------------------------------------------------------- # ● クリア #-------------------------------------------------------------------------- alias bado_interpreter_clear clear def clear bado_interpreter_clear @child = nil end #-------------------------------------------------------------------------- # ● オブジェクトのダンプ # ファイバーは Marshal に対応していないため自前で定義する。 # イベントの実行位置は一つ進めて保存する。 #-------------------------------------------------------------------------- def marshal_dump result = [@depth, @map_id, @event_id, @list, @index + 1, @branch] result.concat(@child.marshal_dump) if @child result end #-------------------------------------------------------------------------- # ● オブジェクトのロード # obj : marshal_dump でダンプされたオブジェクト(配列) # 多重代入でデータを復帰し、必要ならファイバーを再作成する。 #-------------------------------------------------------------------------- def marshal_load(obj, depth = 0) @depth, @map_id, @event_id, @list, @index, @branch = obj[depth * 6, 6] create_fiber return unless obj[(depth + 1) * 6] @child = Game_Interpreter.new @child.marshal_load(obj, depth + 1) end #-------------------------------------------------------------------------- # ● 実行 #-------------------------------------------------------------------------- alias bado_interpreter_run run def run @child.run if @child # 子インタプリタを先に処理 bado_interpreter_run 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.run end end end