RGSS2のマップデータ読み込み

マップデータを読み込んで配列に展開するのはこのようなコードになる。

module RPG
  class Map
    def getdata
      @data
    end
  end
  class Event
    class Page
      class Graphic
      end
      class Condition
      end
    end
  end
  class MoveRoute
  end
  class MoveCommand
  end
  class EventCommand
  end
  class SE
  end
  class BGM
  end
  class BGS
  end
end

class Table
  def self._load(data)
    ary = data.unpack("i5s*");
    count = ary.shift
    xsize = ary.shift
    ysize = ary.shift
    zsize = ary.shift
    total = ary.shift
    @table = []
    (0...zsize).each do |z|
      @table << []
      (0...ysize).each do |y|
        @table[z] << []
        @table[z][y] = ary[z * ysize * xsize + y * xsize, xsize]
      end
    end
    return @table
  end
end

d = nil
open("Map013.rvdata","rb") do |fh|
  d = Marshal.load(fh.read)
end

map = d.getdata

クラスやモジュールの定義はサンプルのマップデータに含まれているデータを読むのに必要な定義であって、ひょっとしたらファイルによって変わるかもしれない。必要であれば必要なものを追加することになる。
Tableクラスの_loadなのでほんとはTableオブジェクトを返さなければならないのだろうが、なんか面倒だったのでArrayオブジェクトを返している。行儀悪いかもしれない。でもやりたいことはできているのでよしとする。
Tableクラスとして認められているすべてのデータが読めるとは限らない。例えば要素数が0とかのTableオブジェクトをMashal.loadした場合にきちんと動くかどうかはわからない。
読めることは読めるが使うのは大変難しい。昨日のコードに突っ込んでやればそれっぽく描画することはできるが、昨日のやつは中途半端なので意図した描画ができるわけでは全くない。
まあ、作ってみたのでアップしておいたというレベルだ。
誰かの参考にでもなれば。