XPのマップデータをVXにコンバートする

RPGツクールVXはRPGツクールXPのバージョンアップ版とも言えるシステムを持っています。 しかしデフォルトではXPのマップデータをVXにインポートすることはできません。 しかしながら、RGSSの扱うマップデータ(XP:rxdata VX:rvdata)は、配列によってマップデータを保存しています。 これを利用して、XPのマップデータをVXに移植できます。

データフォーマット

RPGツクールXP(Data/Map***.rxdataの.data)

タイルIDの3次元配列です。Data[X,Y,Z] = TileID

RPGツクールVX(Data/Map***.rvdataの.data)

タイルIDの3次元配列です。Data[X,Y,Z] = TileID

---注意---
RPGツクールVXの層は、エディタ内部で勝手に決められています。 (マップチップセットAが第一層とかではなく、草原を配置した瞬間に第1層に平地、第二層に草原を配置、など) コンバートの際はこれを考慮してTileIDを決める必要があります。

RGSS

一例です。参考にしてください。

 #--------------------------------------------------------------------------
 # マップコンバート ファイル処理部
 #--------------------------------------------------------------------------
 def f_map_convert
 #マップIDの指定。IDはXPとVXで共通とする
  map_id = 1
  @mapVX = load_data(sprintf("Data/Map%03d.rvdata", map_id))
  @mapXP = load_data(sprintf("Data/Map%03d.rxdata", map_id))
  dataVX = @mapVX.data
  dataXP = @mapXP.data
  #関数により変換実行
  f_map_XP2VX(dataXP,dataVX)
  save_data(@map, sprintf("Data/Map%03d.rvdata", map_id))  
 end

まずRPGツクールVXのDataフォルダに、RPGツクールXPの変換元マップデータファイル(Map***.rxdata) を置いておく必要があります。読み込んだあと変換を行い、関数f_map_XP2VXで変換します(下に記述)。 save_dataはRGSSの組み込み関数です。

 #--------------------------------------------------------------------------
 # ● マップコンバート関数XP→VX
 #--------------------------------------------------------------------------
 def f_map_XP2VX(xp,vx)
  #全データについて変換
      for y in 0...xp.ysize
        for x in 0...xp.xsize
          #VX側データの初期化
          id_vx0 = vx[x,y,0]
          id_vx1 = vx[x,y,1]
          #XP側データの読み込み
          id_xp0 = xp[x,y,0]
          id_xp1 = xp[x,y,1]
          id_xp2 = xp[x,y,2]
          
          #VX側 2048:海 2816:平地 3200:荒地
          case id_xp0
            when 1 .. 95
              id_vx0 = 2048
            when 96 .. 143
              id_vx0 = 2816
            when 144 .. 191
              id_vx0 = 3200
          end
          
          #VX側 3008:草原 3584:砂漠 3968:雪原 
          case id_xp1
            when 192 .. 239
              id_vx1 = 3008
            when 240 .. 287
              id_vx0 = 3584
            when 288 .. 383
              id_vx0 = 3968
            end
            
          #VX側 2912:山 2864:森  
          case id_xp2
            when 336 .. 383
              id_vx1 = 2864
            when 384
              id_vx1 = 2912
          end
            
          vx[x,y,0] = id_vx0
          vx[x,y,1] = id_vx1
        end#x
      end#y  
 end

「海」のタイルIDなどはアニメーションや境界線自動生成があるので1つではありません(XP側:1〜95など)。 そのあたりをタイルIDと照合しつつ、何回か変換する必要があると思います。 不安な場合は、変換前のrvdataファイルのバックアップを取っておくと良いでしょう (可能性は低いですが、マップデータが開けなくなってしまうこともあるかもしれないので)。

RPGツクールVXはタイルIDを調べるイベントコマンドがありません。 データそのものをテキストファイルに書き出してしまう方法(下記)や、 Delusional Field様の ◆ツクールVX タイルIDテーブルが大変参考になります。

 #--------------------------------------------------------------------------
 # dataファイルをテキストに書き込み
 #--------------------------------------------------------------------------
 def f_csv_write(table_data,name)
  file = File.open(name + ".txt", 'w')
  
  for z in 0...table_data.zsize
    file.puts "Z=" + z.to_s
      for y in 0...table_data.ysize
        str = ""
        for x in 0...table_data.xsize
          if x == 0
            str = table_data[x,y,z].to_s 
          else
            str = str + "," + table_data[x,y,z].to_s
          end
        end#x
        file.puts str
      end#y
  end#z
  
  file.close  
 end