Minecraft リソースパック UI解析 6日目
UIの検証
前回はファイルのコメントの削除をしたので、改めて検索プログラムを活用して検証を進めていきたいと思います。また、この回は検証のみをするのでまとめ回は次回行います。
結局プログラム
MinecraftのWin10版を持っていれば必要なかったのですが、iOS版しかもっていなかったので作業を効率化するために自動でパックを作るプログラムを書きます。
今まで使ってきたファイルとは別のファイルに書きました。
流れ:manifest書き換え・ZIP化・名前変更
これをiOS端末から共有する... まあまあ時短にはなった。
鍛冶台のUIをいじったときの挙動の変化の記録
それぞれの検証は初期状態から一つだけ動かした対照実験になっている。あくまでもiOS版の検証である。機種によって動作が異なる場合がある。
プロパティを一つずつ削除したりして検証をしています。中には検証の必要がないということで飛ばしているものもあります。検証の記録が読者の方々の役に立てば幸いです。
Minecraftのバージョン:v1.16.201
- ui/smithing_table_screen.jsonのみで動作するか -> 問題なく動作
- 継承をつなぎ合わせて元を調べる -> smithing_table_screenが元
- (2)よりファイル名が元になる可能性あり -> ファイル名が正しく、かつ元の名称が正しくないと実行されない。
- (3)より元もまたどこからか継承されている可能性あり -> 元を継承するものはなかった。
- ファイル名は_ui_defs.jsonからインポートしている可能性あり -> _ui_defsを書き換えて(3)と同様に試してみたが実行されなかった。
- smithing_table_screen@common.inventory_screenの話
- $close_on_player_hurt|defaultの値をfalseに変更 -> ダメージ時にuiが閉じなくなる
- close_on_player_hurtの値をfalseに変更 -> 上と同様
- (7),(8)より$~|default変数は変更しない方がよい、かつ初期値は普通の変数は$~|defaultが代入される
- requiresを削除 -> uiがすべて消えた状態になる 他のファイルよりUIプロフィール(pocketかクラシック)の二種類だけではない
- $screen_contentを削除 -> uiなし、影のみで操作不能
- $screen_contentの値をpocket版に変更 -> pocket版になる
- $screen_bg_contentを削除 -> ui周りの影が消える
- smithing_table_panelの話
- typeを削除、typeの値をimageに変更 -> 変化なし(見やすさ? もしくは特定の部品にしか必要ない?)
- container_gamepad_helpersを削除 -> 変化なし(継承元の確認が必要)
- flying_item_rendererを削除 -> アイテムの移動アニメーションが消えた
- selected_item_details_factoryを削除 -> アイテム説明欄が消えた
- root_panelを削除 -> (11)と同様 uiなし、影のみで操作不能
- flying_item_renderer内layerを1に変更 -> アイテムの移動アニメーションが消えた(uiのwindowの後ろに隠れた可能性大)
- flying_item_renderer内layerを2に変更 -> アイテムの移動アニメーションがインベントリやホットバーの後ろで存在 (20)の仮定は正しかった また、controls内は上から順に表示される可能性あり -> 順番を変えても変化なし
- root_panel内common_panelを削除 -> uiのwindow部分のみ消えた 機能は存在
- smithing_table_screen_inventoryを削除 -> uiのwindow部分のみになる 機能なし
- inventory_selected_icon_buttonを削除 -> 変化なし(継承元の確認が必要)
- gamepad_cursorを削除 -> 変化なし(その他の機種用?)
- smithing_table_screen_inventory内top_half_panelを削除 -> インベントリ、ホットバーのみになる
- inventory_panel_bottom_half_with_labelを削除 -> インベントリが消える ホットバーは存在
- hotbar_gridを削除 -> ホットバーが消える インベントリは存在
- inventory_take_progress_icon_buttonを削除 -> 変化なし(継承元の確認が必要)
- top_half_pannelの話
- anchor_fromの値を変更(値は他のファイルから収集) ->
- anchor_toの値を変更(値は他のファイルから収集) ->
- sizeの値を[ "50% - 14px", "25% - 14px" ]に変更 ->
- sizeの値を[ "100% - 0px", "50% - 0px" ]に変更 ->
- offsetの値を[ 0, 0 ]に変更 ->
- sizeの値を[ "100%", "100%" ]、offsetの値を[ 0, 0 ]に変更 ->
- レイアウトの話
- size, offset, anchorの値から検証 ->
- (38)について 赤はsize,青はoffset、upgrade_labelの位置が少しずれているように見える
- upgrade_labelのanchorをtop_leftに、offsetを[ 0, 0 ]に変更 ->
- よって、(40)は正しい
- upgrade_labelのtext -> リソースパックのtextsに記述あり
- bindingsとは -> Minecraftの内部パラメータと別のパラメータを結び付けるもの?(推測) bindingsの中にoverrideの記述があるため
- ボタン(ネザライトツールの出てくるところ)と動作の話
- ※再掲 iOS版での仕様なのでWin10版とは違う可能性あり
- 通常状態の挙動
- クリック(長押しから離すものも含む):アイテムの取り出し、アイテム説明欄の表示
- ダブルクリック:できない(一回目で動作が始まるため)
- 長押し:アイテム説明欄の表示
- smithing_table_output_slot_buttonについて ブロックを一つだけ残すと順に
- 通常通り, 反応なし×7, ダブルクリックで同様の動作, 反応なし×2
- iOSで必要な部分は一つ目ということが分かった。ただ、他のUIではスタックアイテムなど鍛冶台とは異なる部分が多いので要検証。
次回やること
今回の検証でuiがどのように構築されているかがある程度理解できました。次回は今回の検証のまとめを書こうを思います。
Minecraft リソースパック UI解析 5日目
コメント削除ツールの作成
今回はコメントが悪さをしたので、重大なミスが出る前に先にコメントを削除したファイルを作成します。前回話した通り、コメント(//と/*~*/)は削除、改行はそのままにしておくという形にします。また、追加でスキップ("~"と'~')では中身にコメントタグがあっても削除しないようにします。今回のプログラムは他のプログラムでも使えるように一般化しておきます。
deleteComment(text, commentTags=None, skipTags=None)
今回は一般化したプログラムをかくので、ファイルパスを関数の外でやるようにします。
deleteComment関数は引数に元のテキストとコメント・スキップタグを入力、返り値はコメントを削除したテキストになります。コメント・スキップタグは[["//","\n"],["/*","*/"]]のように二重配列で書きます。
コメントの削除
それでは早速コメントを削除したファイルを作成します。
ディレクトリはcommentDeleted_uiにします。中のフォルダも予め作成しておかないとエラーになるので先に作っておきましょう。作成したら実行しましょう。
実行後はuiフォルダと同じようなファイルができます。中身はちゃんとコメントが削除されているようです。
このプログラムはうまく生成されていればもう必要ないので削除しておきましょう。deleteComment関数も今後使う予定はありませんが、一応残しておきます。
その他ツールの修正
これでコメントがないファイルを作成できたので検索ツールの検索ディレクトリをcommentDeleted_uiに変更しましょう。
これでコメントを含まないファイルで検索されます。こっちの関数も一般化した方がよかったのかな...?
次回やること
次回からはプログラミングはしばらく休んでファイルをいじっては導入して挙動を調べようと思います。挙動を調べる上でuiのわかりやすいものということで最初は鍛冶台を見ていきます。
Minecraft リソースパック UI解析 4日目
今度こその解析回
前回まででようやくテストが終わり、やっとツールを使い始めます。まずは$、@、#が使われている付近の単語を集約したファイルを作っていきます。
$が使われているもの
_global_variables.jsonファイルに定義してます感がすごいものがあり、それを見る限り$はおそらくグローバル変数なのだろうと分かります。なので飛ばします。
@が使われているもの
付近の単語を集約するときはuiSearchSandwichを使えばよいでしょう。
結果は4万行もあるようです。データの多くはnamespace.keyという形式の単語になっています。プログラムを書いたことのある人はすぐに気づいたのではないでしょうか。ドットで区切ってnamespaceごとのの出現回数を集計してみましょう。
100個越えのものもあるようで、commonにという単語が目立ちます。一方で、257行目になぜか何も書かれていないのです。ひとつ前の行で改行されたと考えるのが自然に考えられます。よく見たら単語にじゃないような...検索してみましょう。
ui/hud_screen.jsonの1589行目を見てみると、// Wrap in panel so @mixed_tooltip_helper doesn't override bindsと書かれていました。コメントに書かれているものが影響したようです。
やはりコメントは削除した方がよさそうです...
#が使われているもの
先ほどの出力では見づらかったので、 囲まれたものが10個以上の時の条件を付けて出力しました。
ただ、見た感じではゲームの変数なのかなという程度にしかわかりませんでした。とりあえず今は$はリソースパックの変数で#がゲームの変数という程度の解釈にとどめておこうと思います。また分かったら追記しておきます。
次回やること
次回はコメントを削除しようと思います。コメント(//と/*~*/)は削除、改行はそのままにしておくという形にしたいと思います。改行をそのままにしておくことでコメント削除前のファイルと比較ができるようにしておきます。
Minecraft リソースパック UI解析 3日目
まずはプログラムのテスト
まずは前回やる予定だったプログラムのテストをしていきます。テストの方法は何度か実行しておかしな結果が出ないか確認する程度にします。本番のデータでもある程度おかしな点はわかるはずだから...
resultView(path, mode, *text)
こいつが使えないとほかの関数のテストがしづらいので先にやります。
pathは作業フォルダ/resultText.txtを指定します。基本的には変えません。
問題なく動作したはずです。後の2つはこの関数を使います。
uiSearchPhrase(phrase)
引数にはuiフォルダの中から適当に選んだものを使用します。今回はui/account_banned_screen.json内の23行・Hammer_animationと、ui/inventory_screen.json内の18行・gamepad_helper_yで試しています。
一つ目はは {'ui/account_banned_screen.json': [19, 23]}、二つ目は{'ui/emote_wheel_screen.json': [227], 'ui/feed_screen.json': [982, 982], ...}
計23個一致し、問題なく動作しました。
uiSearchSandwich(startTag, endTag)
今回は試しにnamespaceを取得してみましょう。
ファイル名と照らし合わせて合致していることが分かり、問題なく動作しました。
次回やること
次回こそ前々回に話した$、@、#の解析を始めます。前回作ったツールはうまく処理すればそれなりに使えるものなので、しっかり活用していきます。
Minecraft リソースパック UI解析 2日目
ツールの作成回
今回はプログラム・プログラムで使用するデータの作成が中心になります。前回の記事を見ていない方はそちらを先にご覧ください。
ファイルのパスのリストの作成
前回作成したMinecraft.pyをテキストエディタ、またはプログラム開発環境で開いて次のコードを実行してください。
作業フォルダにui_path_list.jsonというファイルが追加されているはずです。これはuiフォルダ内のファイルのパスのリストです。
※_ui_defs.jsonというファイルに同じようなデータがありますが、足りないデータ等があるためプログラムからファイルを作成してください。
検索ツールの作成
ここでは検索ツールを二種類作成します。
- 単語の位置検索ツール
- 開始タグと終了タグを用いたツール
- 結果をファイルに保存するツール(おまけ)
1は文字列のあったファイル・位置を列挙し、2はタグで囲まれた文字列を列挙するものとなってます。言葉だけでは理解しづらいですが、コードを読めば理解しやすいかもしれません。3はコマンドラインでは見づらい上、保存が面倒なのでファイル名を変えれば保存しておけるように作成します。
uiSearchPhrase関数は引数に検索する文字列を入力、返り値は {ファイル名:[行,...],...} という形の辞書型になっています。
uiSearchSandwich関数は引数に開始タグと終了タグ、返り値は {ファイル名:[[行,タグ内文字列],...],...} という形の辞書型になっています。
resultView関数は引数にパスと方法、文字列(または辞書)で、パスのファイルに結果などを書き込みます。方法は"clear"か"append"が入ります。
次回やること
今回思っていたより多くなってしまい、作成したツールをテストできていないので次回は先にテストをして、それから前回話した$や@、#の扱いについて調べていくつもりです。
※プログラムの文法については簡単なものしか用いていないので解説はしません。もしわかりづらいところがあればPythonのリファレンスを参照してください。
Minecraft リソースパック UI解析 1日目
UI解析の手法
私は今回から始めるMinecraft統合版のUI解析にはPythonを使用します。ただし、Pythonが得意とするAIの分野を活用するのではなく、コードの書きやすさを目的に使用します。また、解析終了後はUI生成ツールを作成することを目標とする。
Pythonでやること
- 検索し、項目をリスト化するツールを作成する
- ある程度目星がついたものに関して、ツールを使って単純作業を任せる
- (できたら)UI生成ツールを作成
使用するもの
-
Minecraft用アドオン | Minecraft にあるバニラのリソースパック*1
- Python 3.8 (Pythonのインストール手順はここでは解説しません)
- VisualStudioCode (なくてもよいが解説中に登場する可能性がある)
- Minecraft 統合版
※これらのものはのちに変更する場合があります
作業フォルダの作成
解析の前段階として、まずはMinecraft公式サイトのリソースパックをダウンロード・解凍して中のuiフォルダを作業フォルダにコピーします。このサイトでは編集時点で最新バージョンであった1.16.20を使用しています。そこにMinecraft.pyというファイルを作成します。今後の作業ではMinecraft.pyに書き込むことになります。
UIのデータをのぞいてみる
まず目につくであろうものはコメントだろう。JSONファイルにはコメントという概念が存在せず、VSCodeなどの統合開発環境で読み込むとエラーになる。嫌でも目に付く。
前座はこれくらいにしてデータ本体に目を向けると、キーや値に$や@がよく使われ、#が少々使われていることがわかる。コメントに書かれていることからも多少は何の項目かがわかるだろう。今後もしかするとプログラムを走らせる上でコメントが邪魔になる可能性があるので削除したファイルを作成するかもしれない...
次回やること
$や@、#がどのように使われているのかを詳しく調べるために検索ツールを作成・実行する。次回はプログラムが中心になるかも...
*1:resource packs のテンプレート