Hoi4 MOD製作 サブイデオロギーの表示のさせ方
はじめに
デフォルトのhoi4だと、サブイデオロギー名は表示してくれない。
これではせっかく細々と切り分けて作ったイデオロギー名が報われない。
という訳で、この記事ではメインイデオロギーの代わりにサブイデオロギーを表示する方法を解説していく。応用すれば、Red Floodのようにメインイデオロギーをサブイデオロギーを併置することも可能であろう(ただし、全体的なUIの調整が必要になる)。
modの作り方に関しては、わざわざ解説する気は無い。そもそも、この記事にたどり着けるならば、modの基本事項については把握しているはずである。
ちなみに、modを作る際は、hoi4をウィンドウモードで起動すると便利である。ただし、hoi4のウィンドウは拡大縮小に対応していないため、解像度を落とさないと意味がない。
今回いじるのは、外交タブだけである。サブイデオロギーを表示すべき場所は他にもある(政治タブなど)が、同様に行えばできるはずである。
基礎知識
hoi4の画面は、interfaceフォルダの.gfxファイルと.guiファイル、そして、gfxフォルダの.ddsファイルから成り立っている。
一つずつ概説しよう。
.ddsファイルは、実際の画像ファイルである。.ddsをGIMPなどで編集すれば、上に挙げたTNOやRFのように画面をおしゃれに変更することが可能である。しかし、今回のサブイデオロギーを表示する目的ではあまり関係が無い。
.gfxファイルは、スプライトタイプなどを定義するものである。スプライトタイプは画像を使いまわしやすくするために名前やサイズなどを付加するようなものだと思えばよい。これも今回はあまり関係が無い。
.guiファイルは、実際の画面構成を決定するファイルであり、今回一番重要である。.guiファイルの構成要素は大きく二つに分かれる。コンテナとエレメントである。コンテナはエレメントの集合であり、コンテナの中にコンテナを入れることもできる。一番使われるのはcontainerWindowTypeであり、これは一つのウィンドウを作り出す枠組みである。TNOの最初の国家紹介画面やスーパーイベントなどを作るのに使われている。これはドラッグすることでエレメント同士の位置関係を変えずに自由に動かすことができるが、この仕組みが成り立っているのは、それぞれのエレメントがcontainerWindowTypeの下にまとめられているおかげである。
本題
コンテナとエレメント
今回編集する外交タブも同じように一つの大きなcontainerWindowTypeからできている。外交タブを管理する.guiファイルはinterfaceフォルダ内のcountrydiplomacyview.guiである。
コードを見ていこう。著作権的に公式コードのソースを載せていいか怪しいため、ソースコードについては、各自のhoi4フォルダに入ってるものを参照してほしい。ちなみに、TNOなどでは異なる.guiファイルで外交タブを管理しているが、この記事はバニラのhoi4にのみ対応している。
countrydiplomacyviewというコンテナウィンドウが、この外交タブの親玉である。このコンテナはアニメーションを行うように設定されている。positionというのは、コンテナが隠れているときの位置であり、show_positionがコンテナが表示されるときの位置を意味している。show_animation_type=deceleratedというものがあるが、これは外交タブが呼び出される際に、最初は早くだんだん遅くというようにアニメーションするというのを意味しており、hide_animation_type = acceleratedはそのちょうど真逆である。animation_timeは言うまでもなくアニメーション時間を意味する。次のsizeは文字通りウィンドウサイズを意味している。100%%というのは、表示できる画面の割合に対して100%ということである。ここを50%%に変更すると、ウィンドウがちょうど半分になることからも分かる。verticalScrollbar = "right_vertical_slider"は文字通り右側に垂直のスライダーを追加することを意味する。外交タブの情報録の方で使用されているようだ。show_soundは外交タブを開くときの音を意味する。ここを変更すれば、自由な効果音を鳴らすことができる。backgroundは背景画像を指定する。スプライトタイプで指定する必要があり、そのddsファイルとスプライトタイプを結び付けるのは前述のgfxファイルである。
次には子コンテナウィンドウのcounty_infoがある。これは、ざっくり外交タブの1ページ目のところを統括する。今回はここ以外編集しないので、このコンテナだけを重点的に解説する。
icontypeは画像を表示するエレメントである。背景と同様にスプライトタイプを指定する必要がある。quadTextureSpriteというものもあるようだが、あまり詳しく把握していない。
instantTextboxTypeは文字を表示するエレメントである。今回の主役である。実際、国家名、イデオロギー名などはこれで表示されている。ideology_nameという名前のエレメントを見て行こう。位置はx=5,y=10となっているが、この数値はコンテナの位置に依存していることが重要である。つまり絶対位置ではなく、コンテナとの相対位置で指定されている。fontは文字フォントである。fonts.gfxに登録されているもののうち、どれかを指定する。fonts.gfxを編集し、フォント画像を用意すれば、自分でフォントを追加することも可能である。textは表示内容である。ideology_nameの場合"ideology"となっているが、これは実は関係が無い。hoi4の仕様上、ideology_nameのtextが何であろうと、その国のメインイデオロギーが代入されることになっているようなのである。つまり、ここにサブイデオロギー名を入れても無駄なのである。
ではどうすればよいのか?素朴に思いつくのが、サブイデオロギーを表示するエレメントをコンテナに追加することである。しかし、これは上手くいかない。何故ならば、外交タブというのは特殊処理がなされており、外交タブから情報を直接入手することができないからである。
上の文章を理解するためには、そもそもhoi4にサブイデオロギーを文章として取得して表示する仕組みが備わっていないことを理解する必要がある。そのため、サブイデオロギーを表示するには、かなり強引にする必要がある。
動的キーと静的キー
まず、そもそもhoi4のテキストを表示する仕組みの一つであるローカライゼーションキーについて触れる必要がある。ローカライゼーションキーはlocalisationフォルダのymlファイルに存在しており、キーとバリュー(文章)が一対一で結びついている。この結びつきは基本的に静的なものであり、ゲーム内で変更することができない。サブイデオロギーは国家によって異なり、国家毎に表示を変更しなければならないが、この時点で普通のやり方ではできないことが分かる。だが、これでは非常に不便であるため、hoi4が用意してくれている救済策がScripted Localisationである。Scripted Localisationができることは、条件に応じてキーとキーの結びつきを変更することだけである。最終的な参照に使う方のキーを動的キー、その前座として使われるキーを静的キーと呼ぶことにしよう。
この辺に関してはコードを見た方が速いだろう。という訳で、コードを載せる。
defined_text = {
name = GetSubIdeologyLoc
text = {
trigger = { has_government = democratic }
localization_key = "[GetSubIdeologyLocDemo]"
}
text = {
trigger = { has_government = communism }
localization_key = "[GetSubIdeologyLocCom]"
}
text = {
trigger = { has_government = fascism }
localization_key = "[GetSubIdeologyLocFa]"
}
text = {
trigger = { has_government = neutrality}
localization_key = "[GetSubIdeologyLocNeu]"
}
}
動的キーを作るには、まずdefined_textでブロックを作り、nameでキーの名前を定める。次に、text={}というブロックをその動的キーが取りうる値のバリエーション分作る。triggerは満たすべき条件であり、例えば一つ目ならば、「政府が民主主義ならば」という条件を意味している。この条件が満たされたとき、動的キーは"[GetSubIdeologyLocDemo]"という値を取る。ちなみに、テキストの中に"[動的キー]"とすることで、他の動的キーの値を取得することができる。ここでは、GetSubIdeologyLocDemoという動的キーをさらに用意することで入れ子構造にしている。そのコードを以下に示す。
defined_text = {
name = GetSubIdeologyLocDemo
text = {
trigger = { has_country_leader_ideology =conservatism}
localization_key =conservatism
}
text = {
trigger = { has_country_leader_ideology = liberalism }
localization_key = liberalism
}
text = {
trigger = { has_country_leader_ideology =socialism}
localization_key =socialism
}
}
ここでGetSubIdeologyLocDemoという動的キーが定義されている。一つ目のtextに着目する。has_country_leader_ideologyはその国家の指導者のイデオロギーを意味しており、まさにそれがサブイデオロギーの正体である。そして、一番目の例では指導者が保守主義者であれば、conservatismの静的キーを取るということを意味している。ここで重要なのは、conservatismは静的キーであるため、"[conservartism]"という記述はできないということである。
なお、動的キーを含むファイルはバニラの場合、commonフォルダのscripted_localisationフォルダの中に置かれている。拡張子はtxtである必要がある。
ここまで来れば、何故外交タブのguiファイルに追加しても上手くいかないのかがわかる。has_country_leader_ideologyが機能するには、国家タグのスコープが必要だからである。外交タブの所では、国家タグスコープが利用されていないため、サブイデオロギーが取得できないのである。
スクリプトGUI
こうなると、奥の手としてスクリプトGUIを使用しなければならない。スクリプトGUIでは、国家タグスコープを利用することが可能であるからである。コードを示そう。
scripted_gui = {
Diplomacy_SubIdeology = {
context_type = selected_country_context
parent_window_token = selected_country_view_diplomacy
window_name = "Diplomacy_Ideology"
}
}
hoi4公式の流儀に従うならば、スクリプトGUIを記述したtxtファイルはcommomフォルダのscripted_guiフォルダに置くべきだろう。スクリプトGUIを作るには、scripted_gui ブロックで囲む必要がある。その中に、GUI名を冠したブロックを作る。context_typeはその解釈される文脈を意味しており、ここでは「選択された国家の文脈」となっている。parent_window_tokenはこのGUIが従属するウィンドウを意味しており、今回の場合は「選択された国家の外交ビュー」になっている。最後に、ウィンドウネームというのは具体的な構成が書かれたコンテナのことを指しており、そのコードはこれから示す。
guiTypes = {
containerWindowType = {
name = "Diplomacy_Ideology"
position = { x = 0 y = 0 }
instantTextboxType = {
name = "ideology"
position = { x = 263 y = 145 }
font = "hoi_16mbs"
text = "[GetSubIdeologyLoc]"
alwaystransparent = yes
maxWidth = 245
maxHeight = 20
format = left
fixedsize = yes
}
}
}
これを記述するファイルの拡張子は.guiである必要があるし、interfaceフォルダ内に入れておかなければならない。上記のコードでは、Diplomacy_Ideologyというコンテナウィンドウを定義している。その中に、ideologyという名前のテキストボックスを入れているわけだが、これは外交タブの"ideology"とは全く関係がない。そうではなく、外交タブのイデオロギーの部分を上書きするように表示させているだけである。そのため、仕上げとして、元々の外交タブのメインイデオロギーを表示する部分を隅にやっておかねばならない。具体的にはcounty_infoコンテナのideology_nameの位置をx=-1500など見えない位置に追いやっておけばよい。
完成
なお、記事では民主主義しか実装していないが、共産主義等でも同様にすれば実装できる。残りは読者の演習問題とする(面倒なだけ)。
記事初めて書いたので、分かりにくかったり、間違っていたりした場合はコメントで指摘していただけるとありがたいです。閲覧いただきありがとうございます。