気ままなタンス*プログラミングなどのノートブック

プログラミングやRPGツクール、DTM等について、学んだことや備忘録をアウトプットとして残し、情報を必要としている誰かにとって「かゆいところに手が届く」ブログとなることを願いながら記事を書いています。

【聖剣伝説-VOM_mod】DataTable(uassetファイル)の配列に値を追加する際に変更が必要なアドレスの備忘録

スポンサーリンク

聖剣伝説 Visions of Manaのシステム系mod作成を行うにあたって、過去の聖剣伝説3 Trials of Manaの方法が活かせると思っていたが、 だいぶ違っていたため、備忘録として残しておく。

mod作成の流れについては、discordに記載があるため、リンク先を参照

ツールまとめ

  • TOMのようにuasset + uexp形式ではなく、uassetのみとなっている
  • FModelを用いて、pakファイルからuassetを抽出する
  • uassetのバイナリを編集(HxD等のツールを利用)
  • UnrealUnZenを用いて、リパック
    • フォルダ構成は下記のようにすると良い
      • target_mod_folder/VisionsofMana/Content/X21/Data/Map/DT_WorldConfig.uasset など。
        • 変更したいuassetファイルの位置によってフォルダを作成する
    • UnrealUnZenでは、Load TOCでVisions of Manaのpakchunk0-WindowsNoEditor.pakを選択(間違って上書きしないように別フォルダにコピーしておくのも良い)
    • Repack Filesで、target_mod_folder/VisionsofMana/Content/X21/Data/Mapのうち、target_mod_folderを選択し、your_mod_name_999_P.utocといったファイル名で保存する

DataTableのバイナリ構造

  • 【前提】
    • namesキーとインデックスの関係を把握している必要がある
    • 利用するファイル

      • VisionsofMana/Content/X21/Data/Map/DT_WorldConfig.uasset
      • 及び上記をFModelでJSONに出力したファイル
    • バイナリエディタで、DT_WorldConfig.uassetを開き、以下の16進数で検索するとヒットする

16進数(検索用)

71 00 00 00 00 00 00 00 0E 00 00 00 00 00 00 00 74 00 00 00 00 00 00 00 32 00 00 00 00 00 00 00 00 0E 00 00 00 40 00 00 00 00 00 00 00 69 00 00 00 00 00 00 00 5A 00 00 00 00 00 00 00 6A 00 00 00 00 00 00 00 41 00 00 00 00 00 00 00 5B 00 00 00 00 00 00 00 42 00 00 00 00 00 00 00 6B 00 00 00 00 00 00 00 43 00 00 00 00 00 00 00 5C 00 00 00 00 00 00 00 44 00 00 00 00 00 00 00 6C 00 00 00 00 00 00 00 3F 00 00 00 00 00 00 00 45 00 00 00 00 00 00 00

  • JSONファイルについては、下記の箇所が該当する

・DT_WorldConfig.uassetのDataTableに関して、以下のようなバイナリ構造となっている。

index(10進数) names HEX値 その他
[1] 113 WarpVolumeIDList 71 00 00 00 00 00 00 00 配列に格納するIDリストの始まりを表す
[2] 14 ArrayProperty 0E 00 00 00 00 00 00 00 配列であることを表す
[3] 116 - 74 00 00 00 00 00 00 00 配列の要素数バイト(4バイト) + 配列全体のバイト数(112)
[4] 50 NameProperty 32 00 00 00 00 00 00 00 00
[5] 14 - 0E 00 00 00 配列要素数(14個)
[6] 64 WARP_0003_MENU_01 40 00 00 00 00 00 00 00
[7] 105 WARP_0500_MENU_01 69 00 00 00 00 00 00 00
[8] 90 WARP_0030_MENU_01 5A 00 00 00 00 00 00 00
[9] 106 WARP_0502_MENU_01 6A 00 00 00 00 00 00 00
[10] 65 WARP_0004_MENU_01 41 00 00 00 00 00 00 00
[11] 91 WARP_0031_MENU_01 5B 00 00 00 00 00 00 00
[12] 66 WARP_0005_MENU_01 42 00 00 00 00 00 00 00
[13] 107 WARP_0503_MENU_01 6B 00 00 00 00 00 00 00
[14] 67 WARP_0006_MENU_01 43 00 00 00 00 00 00 00
[15] 92 WARP_0032_MENU_01 5C 00 00 00 00 00 00 00
[16] 68 WARP_0007_MENU_01 44 00 00 00 00 00 00 00
[17] 108 WARP_0504_MENU_01 6C 00 00 00 00 00 00 00
[18] 63 WARP_0002_MENU_01 3F 00 00 00 00 00 00 00
[19] 69 WARP_0008_MENU_01 45 00 00 00 00 00 00 00

・namesは大幅に省略するが、以下のとおりとする

index names
54 RowStruct
~
62 WARP_0001_MENU_01
63 WARP_0002_MENU_01
64 WARP_0003_MENU_01
65 WARP_0004_MENU_01
66 WARP_0005_MENU_01
67 WARP_0006_MENU_01

DataTableへの配列要素追加方法

・仮に、62 WARP_0001_MENU_01 を配列の要素として追加したい場合、以下のように変更する
 ・[3] 配列全体のバイト数に、今回追加した8バイト分を加算する・・・116+8(0x7C)
 ・[5] 配列の要素数に、1加算する・・・14+1(0x0F)
・RowStruct全体のデータサイズを表すアドレスの値に8バイト分を加算する
 ・DT_WorldConfig.uassetの場合、0xD60付近に存在する (namesの後に続く、何等かのデータの終端に存在している)
 ・9E 18 00 00 00 00 00 00 (6302)・・・6302 + 8 = 6310

→この値は、RowStruct(※)から末尾までのデータサイズと一致している必要がある。

0x189E = リトルエンディアンで、9E 18 00 00 00 00 00 00

※36 00 00 00 00 00 00 00 = 0x36 = 54 = RowStruct

index(10進数) names HEX値 その他
[1] 113 WarpVolumeIDList 71 00 00 00 00 00 00 00 配列に格納するIDリストの始まりを表す
[2] 14 ArrayProperty 0E 00 00 00 00 00 00 00 配列であることを表す
[3] 124 - 7C 00 00 00 00 00 00 00 配列の要素数バイト(4バイト) + 配列全体のバイト数(120)
[4] 50 NameProperty 32 00 00 00 00 00 00 00 00
[5] 15 - 0F 00 00 00 配列要素数(15個)
[6] 64 WARP_0003_MENU_01 40 00 00 00 00 00 00 00
[7] 105 WARP_0500_MENU_01 69 00 00 00 00 00 00 00
[8] 90 WARP_0030_MENU_01 5A 00 00 00 00 00 00 00
[9] 106 WARP_0502_MENU_01 6A 00 00 00 00 00 00 00
[10] 65 WARP_0004_MENU_01 41 00 00 00 00 00 00 00
[11] 91 WARP_0031_MENU_01 5B 00 00 00 00 00 00 00
[12] 66 WARP_0005_MENU_01 42 00 00 00 00 00 00 00
[13] 107 WARP_0503_MENU_01 6B 00 00 00 00 00 00 00
[14] 67 WARP_0006_MENU_01 43 00 00 00 00 00 00 00
[15] 92 WARP_0032_MENU_01 5C 00 00 00 00 00 00 00
[16] 68 WARP_0007_MENU_01 44 00 00 00 00 00 00 00
[17] 108 WARP_0504_MENU_01 6C 00 00 00 00 00 00 00
[18] 63 WARP_0002_MENU_01 3F 00 00 00 00 00 00 00
[19] 69 WARP_0008_MENU_01 45 00 00 00 00 00 00 00
[20] 62 WARP_0001_MENU_01 3E 00 00 00 00 00 00 00

この手順で作成したmod