かるく

おゲームめいん。

【Hearts of Iron Ⅳ】MOD製作 イベント製作:基礎②【初心者向け】

f:id:calufate:20200211122508p:plain

 HoI4プレイヤーの皆様、こんにちは。バレンタインシーズンをいかがお過ごしでしょうか。バレンタインだったので久々に買ったガーナチョコレートの銀紙が桃色に変わっていて、「これがバレンタイン……」と驚いた私です。

 前回は根本的なイベント製作方法について見ていきました。しかし、あれだけでは完全に無意味なイベントです。ここで言う無意味というのは「何の効果もない」という意味ではありません。何の効果もないイベントだったとしても、フレーバーとしてプレイヤーを大いに楽しませられるのなら、それはとても意味があるイベントです。では、何を以て無意味とするのでしょうか。今回は、意味のあるイベント製作について見ていきたいと思います。

 

 今回の記事では、根本的なイベント製作方法についての知識を前提として話を進めていきますので、それらについて自信のない方は先に以下の記事を読まれると、理解の一助になるやもしれません。

calustrategy.hatenablog.com

 

 

1.「イベント」

1-1.前回のイベント

 前回製作したイベント文は以下のようなもので、実際にプレイしてみると以下のようなイベントが発生しました。

f:id:calufate:20200211034408p:plain

f:id:calufate:20200211050545p:plain

 文章の内容はともかく、フレーバーとしてのイベント製作方法としては問題ないように思えますが、試しにこのMODを入れた状態でしばらくプレイしてみました。

f:id:calufate:20200211133046p:plain

f:id:calufate:20200211133108p:plain

 イベントの「Paradox万歳!」を選択しておよそ20日後、再び同じイベントが発生しました。その後もおよそ20日前後で同じイベントが発生し続けます。また、このイベントはすべての国で発生しているようなので、このMODは「すべての国に対して「id = stn.1」のイベントが20日ごとに何度も発生するMOD」になっているわけです。

 私が無意味だと断じたのは、いくらフレーバー的なイベントであっても、特に脈絡もなく、すべての国に何度も発生するイベントでは何の味付けにもならず、むしろプレイヤーに対する嫌がらせになりかねないからです。例え、どんなに面白おかしいイベント文であろうと、さすがに何の脈絡もなく発生しては興ざめです。

 

 そこで、今回はイベントを狙ったタイミングで発生させるような方法について、私が調べたことを皆様と共有していきたいと思います。

 

1-2.条件付け

 イベントが「どのようなタイミングで」「どのような国家で」発生するかは非常に重要です。例えば、「ダンツィヒか、戦争か」というイベントが20日ごとに勝手に発生しては意味が分かりませんし、「パナマ」で発生しても仕方ありません。

 

 まずは、イベントを狙った条件下で発生させる方法をみていきましょう。

 イベントには「発生条件」を指定することが可能です。前回作ったイベントではこの「発生条件」を何も指定していないので、無条件に何度も発生するイベントになってしまっていました。これを「発生条件」を指定することで、意味を持たせていきます。

 ただ、前回のような何も考え無しのイベントでは、どのような「発生条件」を考えれば良いのかわからないため、今回は「二・二六事件」というフレーバーイベントを追加していきたいと思います。

 

1-2-1.条件考案

 「発生条件」を実装するためにも、「二・二六事件」がどのような条件下で発生するかを考えていきましょう。

 一つは「大日本帝国」であることが条件として必要でしょう。世界中の国で発生しても仕方ありません。もう一つ、出来れば「2月26日」に発生することが望ましいですが、残念ながらHoI4は直接イベントの日付を指定して発生させるようにはできません。なので、妥協して「1936年の2月中」に発生するようにしましょう。

 つまり、

を「発生条件」として考えることができます。

 ただ、個人的にはこのようなイベントの場合、「二・二六事件」としてしまうとイベント名が発生した日付と合致せず、「二・二六事件」という名前に違和感があるので、今回は「帝都不祥事件」という名前で実装したいと思います。

 

1-2-2.条件実装

 「発生条件」は「trigger = { }」という形式で指定することができます。「trigger(引き金)」なので、引き金に指を掛けたら発動するようになる、という意味合いでしょうか。

 早速、前回作ったイベントに「trigger = { }」を実装します。「trigger = { }」は「id」や「title」、「desc」、「picture」、「option」と同じ段落に記述します。

 ちなみにMODでは「{}」で区切りをしているので、以下の記述では「country_event = { }」で一つの区切りになっており、HoI4に対して「「country_event」の「{」から「}」までが一つのイベントである」という区切りを判別させています。また、「country_evet = { }」内にある「trigger = { }」と「option = { }」でさらに別々の区切りとなります。この「{}」を忘れると、HoI4はどこまでが区切りなのか判別できずにエラーを起こすことになるので、「}」で閉じることは忘れないように気を付けてください。よくやります。

f:id:calufate:20200211154636p:plain

f:id:calufate:20200211155800p:plain

ちなみに「Notepad++」では「{}」がどこに対応しているか、赤く表示してくれる。

 「国が大日本帝国である」という条件は「tag」というもので指定することができます。「tag = 国家タグ」と記述することで、当該国家タグを有する国家でのみ、このイベントが発生することになります。国家タグは「HoI4 日本語Wikiのデータ集の中の国家タグ」から確認できます。「英語の国名や国旗でもどの国か判別できる!」という方は「HoI4WIKIのCountries」からでも確認できます。

 大日本帝国の国家タグは「JAP」となっているので、「trigger = {}」の中に「tag = JAP」と記述してこのイベントが大日本帝国だけで発生するようにしましょう。

f:id:calufate:20200211161136p:plain

 これで「stm.1」というイベントは大日本帝国でのみ発生することになりました。ここで「tag = USA」にするとアメリカでのみ、「tag = TIB」にするとチベットでのみ、このイベントは発生します。

 一つ目の「発生条件」は指定できたので、続いて「1936年2月中」という条件を指定します。直接「1936年2月中」という条件は指定できないので、今回は二つの条件を併用することでこれを再現したいと思います。

 日付は「date」を使用して条件付けできます。例えば「date < 1936.02.29」とすると「1936年2月29日以前の日付である」ということが条件となります。これと同時に「date > 1936.02.01」を使用すると「1936年2月1日以降で1936年2月29日以前の日付である」ということが条件となるため、「1936年2月中」という条件を達成することができます。このようにMODでは複数の条件を併用して、望む条件を付ける必要があるため、自分が望む条件を具体的に想像し、それに見合うように条件を組み合わせていきましょう。

 

 では、これをさらに追加して「大日本帝国である」「1936年2月中である」という条件でイベントを実装してみましょう。

f:id:calufate:20200211164046p:plain

 このままでは少し「trigger = { }」の中身が見づらいので、改行とTabを使って整理します。

f:id:calufate:20200211164233p:plain

 これで望む条件でイベントが実装されたはずです。早速試してみました。

f:id:calufate:20200211164743p:plain

 「大日本帝国」でプレイしたところ、1月中にはイベントは発生せず「2月中」にイベントが発生しました。その後は2月を過ぎると、イベントが発生する様子もなく、指定した条件がうまく機能しているであろうことが確認できました。念のため、サウジアラビアでもプレイしてみましたが、3月に入ってもイベントが発生する様子はなかったので、国の指定もうまくいっているようです。

 イベントの条件付けが上手くいったようなので、最後に前回記入した「イベント名」「イベント文」「選択肢」を改変していきましょう。まずはフレーバー的なイベント予定なので、「選択肢」を一つ削ります。「stm.1.b」の「option」は不要なので削除し、「option」を一つだけにします。

f:id:calufate:20200211165527p:plain

 さらに「mod/shoshinsha_test_mod/localisation/stm_l_english.yml」の中身を適当に変えていきます。

f:id:calufate:20200211170130p:plain

 これで完了したので、HoI4を起動させて確かめてみます。

f:id:calufate:20200211170510p:plain

 これで「帝都不祥事件」がイベントとして実装できました。イベント文はWikiからコピペしただけなのであれですが、もう少しこだわってこの時期の日本の不穏な空気感を再現できればフレーバーとしてとても意味のあるイベントになると思います。

 

1-2-3.条件の見直し

 さて、無事、「大日本帝国」で「1936年2月中」に「二・二六事件」を実装できましたが、果たしてこの条件だけで良いのでしょうか。確かに史実プレイでは特に問題ありませんが、例えば国家方針の「皇道派を支持」を初手で選択していたとしたらどうでしょう。「皇道派を支持」は35日で完了し、初手で選ぶと2月の頭には完了していることになります。その場合、皇道派を推奨している状況下で「二・二六事件」がそのまま勃発するのは違和感があります。

 よって、もし国家方針の「皇道派を支持」をイベント発生までに完了している場合には、このイベントを発生しないようにしたいと、私は思いました。

 つまり、

という3つの条件を実装していきたいと思います。

 

 国家方針が完了しているかどうかの条件付けは「trigger = {}」に「has_completed_focus」を使用することで再現できます。そのままこれを日本語的に読むと「フォーカスを完了した」という意味合いになります。どのように使用するかと言うと、「has_completed_focus = (完了したかチェックしたい国家方針のID)」という形式で使っていきます。「国家方針のID」とはそれぞれの国家方針をデータ上で管理するために与えられる文字列です。TwitterのIDと同じようなものだと思って構いません。すべての国家方針やイベントにはこのIDが割り振られていて、MOD製作する上では名前ではなく、このIDで管理していきます。

 では、まずは「皇道派を支持」のIDを調べていきます。日本の国家方針のデータが入っている「バニラのHoI4のデータ」である「common/national_focus/japan.txt」を開いてから「検索」で……と言いたいところですが、何と検索すれば良いのかわかりづらいと思います。そこで、今回はHoI4のゲーム画面から直接確かめる方法を使いましょう。

 「Steam」の「ライブラリ」から「Hearts of Iron Ⅳ」のタイトルを右クリックして「プロパティ」を選択。

f:id:calufate:20200211174850p:plain

 出てきたウィンドウの「起動オプションを設定…」を選択。

f:id:calufate:20200211175108p:plain

 枠内に「-debug」と入力し、「OK」を押して準備完了です。

f:id:calufate:20200211175209p:plain

 そのままHoI4を起動します。このとき、「error.log」というメモ帳が起動すると思いますが、今のところはあまり関係ないので無視して閉じて貰って大丈夫です。

 この状態から日本を選択してゲームを開始し、国家方針の上にマウスを乗せると、名前の下に「Focus ID」が見え、「皇道派を支持」は「Focus ID = JAP_support_the_kodoha_faction」であることが確認できました。

f:id:calufate:20200211181857p:plain

 ここで注意なのですが、「-debug」の状態ではマルチプレイをできないので、MOD製作を終えたときやマルチプレイに参加する場合には、再度「ライブラリ」から「起動オプションの設定…」を開いて「-debug」を削除しておきましょう。毎回「error.log」が立ちあがるのも面倒ですし。

 

 「皇道派を支持」のFocus IDも判明したので、早速「trigger = {}」の中に条件を追加していきます。

f:id:calufate:20200212180717p:plain

 条件を追加できましたので、保存してから再度HoI4を起動してみました。しかし、待てど暮らせど一向に「stm.1」のイベントは発生しません。不審に思って、ニューゲームを行い、今度は「皇道派を支持」を完了させてからしばらく待つと、ようやく「stm.1」のイベントが発生しました。

f:id:calufate:20200212182020p:plain

  このことからわかるように、この「has_completed_focus」は「対象のFocus IDが完了していた場合」という条件の判断を行うものであって、「対象のFocus IDが完了していない場合」という条件の判断を行うものではありません。これをどのようにMODで実装すれば良いのでしょうか。これは条件を読み替えて「対象のFocus IDが完了していた場合という条件を達成していない場合」という風に考えます。というわけで、「has_completed_focus」を否定してあげましょう。 HoI4のMODにおいて条件の否定は簡単で「NOT = { }」を使用します。

 

 早速、「stm.1」の条件に否定を加えましょう。

f:id:calufate:20200212195052p:plain

 実際に使ってみたところ、狙い通り、「「皇道派を支持」を完了した状態ではない状態」で「帝都不祥事件(二・二六事件)」が発生しました。念のため、「皇道派を支持」を完了した状態で待ってみると、3月になっても「帝都不祥事件」は発生しませんでした。

f:id:calufate:20200212195531p:plain

 これでようやく「帝都不祥事件(二・二六事件)」の実装が完了しました。お疲れさまでした。

 

1-2-4.条件の見直し2

 一応、前述の条件で「帝都不祥事件(二・二六事件)」は問題ない、と考える方も多いかもしれません。しかし、私は一つだけ気になることがありました。それは「皇道派を支持」から「近代幕府」という分岐に進んだ場合、それは「帝都不祥事件(二・二六事件)」を止められるのでしょうか。

 実際の歴史的な議論は私にはわかりませんが、少なくともイベントを作る私は、「皇道派を支持」を完了していたとしても「近代幕府」の道に進むのならば「帝都不祥事件(二・二六事件)」が発生するようにしたい、と思いました。

 このような場合、どのように条件を考えれば良いのでしょうか。

 

 まず、そもそもの「帝都不祥事件」の条件として、

は必要です。同時に「皇道派を支持」を2月の頭までに完了していたとしても、

  • 「近代幕府」を完了した

 という条件を満たすならば「帝都不祥事件」を発生させた方が良いと思ったとします。

 このとき、「下の条件に「大日本帝国である」を加えなくて良いの?」と思う方もいらっしゃるかもしれません。おそらくイベント製作の「条件付け」に対して深い理解を得られた方だと思います。今回の場合は、「近代幕府」という国家方針が「大日本帝国」にしか存在せず、世界中で「近代幕府」を完了させるという条件を満たせるのが、自然と「大日本帝国」だけになるため、今回の場合は「大日本帝国である」という条件は不要になります。もちろん、「tag = JAP」を追加しても問題ありませんが、出来るだけ節約した方がバグの可能性を減らせるので、今回は省略します。

 話を戻して、このように二つの条件のうち、どちらか一方を満たす場合、という条件付けもHoI4では行えます。それが「OR = { }」です。

 

 実際に、一つ目の条件と二つ目の条件のどちらか一方を満たしている場合、という条件を作ってみましょう。まず、「-debug」の起動オプションを入力した状態でHoI4を起動させ、「近代幕府」のFocus IDを確認します。確認してみると、「JAP_modern_shogunate」であることがわかりました。

f:id:calufate:20200212204207p:plain

 必要な情報はそろったので、条件を記載しましょう。

f:id:calufate:20200212204532p:plain

 さて、これで、

または

  • 1936年2月29日以前である

または

  • 1936年2月1日以降である

または

  • 皇道派を支持」を完了していない

または

  • 「近代幕府」を完了している

といういずれかの条件で「帝都不祥事件」が発生します。

 ……駄目ですね。この状態ではHoI4は条件が5つある中の、いずれかを満たした場合に「帝都不祥事件」を発生させてしまいます。私たちはあくまで二つの条件群のどちらかを満たした場合に「帝都不祥事件」が発生するようにしたいです。そこで、複数の条件をまとめて一つの条件群にするために「AND = { }」を使って、上の4つの条件をひとまとめにしましょう。

f:id:calufate:20200212205307p:plain

 これで、

または

  • 「近代幕府」を完了している

という条件を実装できました。

 実際にプレイをしてみると、「皇道派を支持」を完了している状態ではイベントが発動しませんが、「近代幕府」を完了させたところ、4月なのに「帝都不祥事件」が発動しました。無事、条件を達成です。

f:id:calufate:20200212212427p:plain

 が、今度は5月にも「帝都不祥事件」が発生しました。

f:id:calufate:20200212212706p:plain

 これは、前半の条件には「1936年2月中」というものがあったので「1936年2月」を過ぎればイベントが再度発生することはありませんでしたが、後半の条件は「近代幕府」を完了しているということだけなので「近代幕府」を完了して以降はずっと条件を満たしていることになり、何度も発生するようになってしまっています。

 しかし、このイベントは一度発生すれば十分ですので、一度だけ発生するようにしましょう。

 

 イベントが一度だけ発生するようにするには、「fire_only_once = yes」を用います。日本語的には「一度だけ発動」という意味合いになると思います。これを「stm.1」のイベントに追記していきましょう。「fire_only_once = yes」は「trigger = { }」と同じ並びで「country_event = { }」の中に記載します。

f:id:calufate:20200212215713p:plain

 これで「帝都不祥事件」は一度しか発生しないイベントになりました。試しに「近代幕府」を完了させると、一度だけ「帝都不祥事件」が発生しましたが、その後は発生することはありませんでした。

 

 

1-2-5.イベント画像

 蛇足ですが、公開する予定もないMODなので、Wikiから画像をお借りしてイベントの左下の「picture」も変更してさらに雰囲気を出しましょう。イベントの画像は「210×176ピクセル」みたいなので、以前と同じように調整して「.dds」の画像を用意しましょう。このとき、イベント画像は微妙に斜めらせないといけず、斜めらせない場合は変がウィンドウ枠と平行な感じで表示されますが、気にしない方は割と面倒くさい作業なのでやらなくても良いと思います。

 用意したイベントの画像は「gfx/event_pictures/」に保存してあげます。今回、私は「210×176ピクセル」で「mod/shoshinsha_test_mod/gfx/event_pictures/report_event_japan_niniroku.dds」というファイルを用意しました。

 しかし、今回はただ「gfx/event_pictures/」に画像を追加して、そのファイルの名前をイベントの「picture = 」に書くだけでは上手くいきません。イベントの画像や国民精神のアイコン、おそらく国家方針のアイコンなども、一旦、別のファイルを通して「Focus ID」のようなIDを与えてあげる必要があります。そのファイルが「interface/」にあるので、「mod/shoshinsha_test_mod/interface/」に新規作成でテキストファイル(.txt)を用意してあげましょう。名前は既存のHoI4のバニラのファイルと被らなければ何でも大丈夫ですが、拡張子は「.txt」から「.gfx」に変更してください。私は「shoshinsha_test_mod.gfx」にしました。

f:id:calufate:20200212230847p:plain

 新規作成した「mod/shoshinsha_test_mod/interface/shoshinsha_test_mod.gfx」をテキストエディタで開いて、バニラのHoI4のデータの「interface/」にあるファイルと同じように形式で記述していきます。まずは「spriteTypes = { }」を追加します。

f:id:calufate:20200212231412p:plain

 続いて新しく追加した画像にIDを設定してあげましょう。これには「spriteType = { }」を使う必要があるみたいです。以下のように追加していきます。

f:id:calufate:20200212231702p:plain

 ここで「name = ""」の「""」の中身が写真のIDになります。自由に名付けることができますが、出来るだけわかりやすくしておきましょう。私は「バニラのHoI4のデータ」と似たように名付けた方が管理が楽なので、今回は「GFX_report_event_japan_niniroku」としておきます。

 次に「texturefile = ""」を使ってこの「name」で名付けたIDがどの画像に対応しているかを指定してあげます。今回は「gfx/event_pictures/report_event_japan_niniroku.dds」の画像のIDなので「texturefile = ""」にこれを記述してあげます。

f:id:calufate:20200212232516p:plain

 これでイベント画像の追加ができましたので、最後に「stm.1」の「picture = 」を「GFX_report_event_japan_niniroku」書き換えて完了です。

f:id:calufate:20200212232931p:plain

 ファイルを上書き保存してからHoI4を再起動させて、イベントを発生させてみましょう。

f:id:calufate:20200212233452p:plain

 無事、左下の画像が実装されました。

 

 ここまでお疲れさまでした。これで本当にフレーバーイベントである「帝都不祥事件」の実装が完了しました。

 

2.最後に

2-1.まとめ

 いかがだったでしょうか。これで「国家」「日付」「国家方針を完了したか否か」という条件で発生するフレーバーイベントは実装できるようになりました。

 これを使えば以下のようなフレーバーイベントを実装することもできます。

f:id:calufate:20200212234008p:plain

f:id:calufate:20200212234746p:plain

f:id:calufate:20200212235156p:plain

 さて、皆様は「stm.2」のコードを見ただけでどのようなイベントなのかご理解することはできたでしょうか。できた方もできなかった方も、新しいイベントをどんどん作って慣れていってみましょう。

 

 それでは、ここまでお疲れさまでした。イベントに関する条件付けの実装方法は以上となります。「trigger = { }」に使えるものは「tag」や「date」、「has_completed_focus」以外にもさまざまにありますが、量が多くて今回だけでは並べられません……。もし「英語は大丈夫!」という方や「気合でやる!」と言う方は、HoI4WIKIの「Conditions」からご確認ください。私が全部は無理、と申し上げさせていただいている理由もご理解いただけるかと思います。

 次回以降は、さらにイベントに関する内容を取り扱いたいと思います。また次回もよろしくお願いいたします。

 

 今回は特に思いつかなったので、おまけはありません。