プログラミング・動画編集 備忘録

プログラミングや動画編集についての備忘録です

Morrowind Mod エディター製作 - 2

前回までの状況

こちらの段階では1ファイル読込んで、そのまま保存する形式だった。
Morrowind始めました - プログラミング・動画編集 備忘録

このため、Morrowind.esm を直接編集して結果を確認していたが、マスターファイルを直接いじるとどこで何が起こるかわからない。
この時点で一応マージ処理として指定したファイルでIDが一致するものを上書するようにもしていたが、Modファイルは上書する情報のみを書き出すようにしたい。

というわけで、複数のModファイルを読込み、後から読込んだもので上書が発生したものだけを出力できるようにする事を目指した。

現在の状況

ファイル選択

こんな感じの画面で、フォルダを選択してそこにあるESM,ESPファイルをリストアップし、選択する形式。

f:id:rrryutaro:20200718153549p:plain
ファイル選択画面
上から順番に読込まれるので、順番を変更する場合はドラッグ&ドロップで変更する。
画像での順番は正しいかまではわからない。

選択したファイルの読込

こちらの定義に沿って読込むように構造をJSONで定義している。
Tes3Mod:Mod File Format - The Unofficial Elder Scrolls Pages (UESP)

    {
      "RecordName": "GMST",
      "Description": "ゲーム設定",
      "IsShow": true,
      "IsEdit": true,
      "UniqueKeyFieldName": "NAME",
      "Fields": [
        {
          "CountType": "Required",
          "FieldName": "NAME",
          "DataType": "string",
          "Description": "ゲーム設定の名称",
          "IsShow": true,
          "IsEdit": false
        },

メイン画面

f:id:rrryutaro:20200718154907p:plain
メイン画面

タブは編集するレコードによって分けていく。現在は全てを共通で処理する「全体」と最も重要なダイアログでの会話のやり取りなどの「情報」のタブまで。
「全体」の左ペインはツリービューにしているが、レコード種別毎の項目を並べているだけ。主従関係のレコードを表そうかと考えたが、タブで分ける事にしている。
右ペインの上部がそのレコード種別内の各レコードで検索指定で絞り込まれる。
画面上のCLDTはさらに構造体なのでちゃんと表示するには個別の調整が必要だが、目的は翻訳でデータを改造したいわけではないので、こうした項目はJSONでのレコード定義上で非表示にするなどで対処していく予定。
右ペインの中央部が、競合しているModファイルでの個別の値。
右ペインの下部が、テキスト編集用。データグリッド上のセルでも編集できるが見やすくするため。

なお、ツリーのノードに表示している項目は、次のようなJSONファイルで定義している。日本語の翻訳はGoogle翻訳と一部をそれらしく変更した次のようなJSONで定義。

    {
      "No": 2,
      "Type": "GMST",
      "Descriptions": [
        {
          "Lang": "ENG",
          "Description": "Game Setting"
        },
        {
          "Lang": "JPN",
          "Description": "ゲーム設定"
        }
      ]
    },

メイン画面情報タブ

f:id:rrryutaro:20200718165234p:plain
メイン画面情報タブ

左ペインはダイアログのID。ダイアログはDIALINFOが対となっており、DIALがダイアログトピックで関連する応答を集約するためにあり、IDとダイアログの種別の情報。
その後にINFOのダイアログ応答が続き、INFO以外のレコードが来るまで、そのダイアログ応答の括りとなる。
左ペインはそのダイアログ応答のIDを並べているだけで、今の所これが必要か微妙。
右ペイン上部が左ペインのダイアログ応答をクリックするか、検索文字列と一致するすべてのダイアログ応答を表示する。
今の所表示できる項目全てを表示しているが、翻訳に必要なのはNAMEフィールドとBNAMフィールドなので、この辺はレコード定義を今後調整する。
右ペイン中央部は競合。下部が選択したセルのテキスト。

0x40@)の扱い
f:id:rrryutaro:20200718172111p:plain
0x40が含まれる日本語文字

画面上では「ご・嫌よう」と表示されているが、これについては文字コードの特別な調整が必要らしい。
調べてもちゃんとした情報を見つけられなかったが、0x40@)には特別な意味があるようで、これを含む文字は0x40を置き換えるルールにしている模様。
当初調査で色々とバイナリエディタ上で変更をかけて、固有名詞なども変換をしてみた。
例えば、最初に出会うNPCFargothを「ファーゴス」としたり、Vvardenfell「ヴァーデンフェル」としてみた。
結果、Fargothに関わるジャーナルを開いた瞬間CTD (Crash To Desktop)を起こしたり、Vvardenfellは最初にSolstheim ソルスセイムに関する情報を聞けて、Solstheimの文字列はリンクしているのだが、このリンクが表示されなくなった。

いずれにしても、2バイトコード内で0x40が含まれるものは置き換え(おそらく0xff)が必要な模様。(でもは違うらしい?)

競合解決について

ファイルを開いて即新規保存すれば、競合解決した結果を出力できる状態ではあるので、全てのModを集約することはできる。

今後について

編集についてはまだレコード定義を調整したりなどが必要なのでまずはその辺を調整して翻訳しやすくする。
Google翻訳の利用はこちらの検証で使える事がわかったので、自動化まではしなくても、翻訳中に簡単に参考できるような機能を組み込みたい。
あとは、インポートとエクスポートは選択したレコードの種類単位でインポートして、まとめて編集してエクスポートするなどしたい。
例えば、武器などの名称はこの手の方法でまとめて編集をかけられれば楽になるかと思う。
固有名詞を変更してどのような影響があるかはゲームを進めて確かめてみる。