子インタプリタを保存(VXAce用) | 本棚のガチなRPG製作日記

本棚のガチなRPG製作日記

ツクールでゲームを製作していくっぽい謎の日記。
なぜか名前はばどですがツクール界では「本棚」として活動しています。

ついにサイドビュースクリプトのテスト版が出ましたね。

動作を見て、スクリプトを見ていたら自然と笑ってしまいました。もちろん悪い意味ではなく、なんか圧倒されたような感じとわくわくするのと。

敵の方にゆるやかにジャンプし、急降下してダメージを与える姿と言ったらもう…。

飛ばしアニメのループや画面シェイク、待機キャンセルも喉から手が出る的に欲しい機能だったので感動してしまいました。


まずはスクリプトをいくつかのセクションに分けて全体像を把握していこうと思います。



早くも話は変わって。

ツクール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