Steamでパラド社の一部タイトルが新型コロナ対策への寄付のためセール中です。

「Hearts of Iron IV」開発日記2020年2月21日――Modとパッチログ

「Hearts of Iron IV」開発日記2020年2月21日分が公開されていましたので、その内容をご紹介。今回はModとパッチログについて。La Résistance発売前の開発日記です。

前回:開発日記2020年2月19日――AIと機能のアップデート

前バージョン1.8.2についてはこちら。


スポンサーリンク

開発日記

開発日記2020年2月21日は、Modとパッチログについて。

1.9「ハスキー」パッチログ

以下ではパッチログで私が気になった部分を抜粋してご紹介しています。全文については直接フォーラムをご覧ください。なお、リンク先は関連する開発日記についての記事です。

スポンサーリンク

Mod制作

  • 1.9.0にはMod開発の助けになる多くのツールや改良が含まれる。以下、主なものを取り上げる。

さらなるエフェクト・トリガー・変数・サポート

  • 新たな無料パッチで相当数のエフェクト・トリガー・変数を追加した。完全なリストはパッチログやゲームが生成するドキュメントをご覧いただきたい。

  • 既存のエフェクト・トリガーにもさまざまなサポートを追加した。HoI4のスクリプト言語は変数としてのトークン保存をサポートする。例えば上の画像のようなことができる。ここで私たちはinfantry_equipmentというトークンを一時的な変数に保存し、その後add_equipment_to_stockpileというエフェクトで保存したトークンを使用している。
  • 現時点では以下のオブジェクトを変数に保存でき、すべてのエフェクト・トリガーはこうした変数を受け付けるようになっている。
    • ideology/ideology groups
    • equipment types
    • operation
  • サポートはさらに追加していく予定だ。またスクリプト言語のドキュメントサポートも追加した。以下のHTMLファイルは新たなドキュメンテーションツールから出力したものだ。
  • エフェクトのドキュメント
  • トリガーのドキュメント
  • 補正のドキュメント
  • 動的変数のドキュメント

歴史ロガー

  • 歴史ロガーはAIのゲームプレイを観察するために開発したツールであり、現在は一般公開している。詳細はAIについての開発日記をご覧いただきたい。以下のリンクで例を見ることができる(例1例2 注:この例はクリックするだけでブラウザ上で動作しますが、読み込みに時間がかかります)。
  • 歴史ロガーを使用するには「-hands_off」オプションを使ってゲームを起動し、開始する必要があり、NGame::HANDS_OFF_START_TAGで定義される観察する国家で自動的にスタートする(あるいは手動でゲームを開始してコンソールコマンド「history_logger」)。
  • 実行中、ゲームはデータを収集して毎月「documents\user\Hearts of Iron IV\history_dump」フォルダに保存する。ゲームが充分データを収集したと思ったらこのフォルダの内容をZIP圧縮してこれを「game\tools\history_viewer\history_viewer.html」からロードできる。

  • ここではプレイヤーが満足させたいテスト条件も出力できる。必要なら「game\tests」にさらに条件を追加でき、「user\Documents\Paradox Interactive\Hearts of Iron IV\logs\tests」に成功・失敗のレポートが出る。

クラッシュログ

  • スクリプト実行やセーブデータのロードに不具合があってクラッシュした場合、ゲームが最後に実行したスクリプトや、最後にロードしたスクリプト/歴史/セーブデータを走らせる。これによりクラッシュの原因に関する詳細がわかるだろうし、私たちがクラッシュ自体を解決するまで問題を回避できる。
  • この情報は「-crash_data_log」オプションを使って起動された場合のみ保存される(パフォーマンスに影響があるため、通常の開発では有効にしないことを勧める)。「user\Documents\Paradox Interactive\Hearts of Iron IV\crashes\…\meta.yml」に出力され、ファイルと行の情報が表示される。
  • ゲームがセーブデータの読み込み中にクラッシュする場合、「user\Documents\Paradox Interactive\Hearts of Iron IV\settings.txt」の「save_as_binary」をnoにすることを勧める。こうすることでセーブデータをテキストの形で閲覧できる。
  • もちろん、クラッシュした場合はバグレポートを行ってもらいたい。そうすれば私たちが修正できる。

国家タグのエイリアス

  • 国家タグにエイリアシングシステムを追加した。こうしたエイリアスは国家タグのように機能する(エイリアスは国家タグが使用される場面で使われる3文字のタグ)が、ゲームプレイの中で別の国家に割り当てることもできる。
  • 上の画像でSPD、VIC、MOTは国家タグエイリアスだ。SPDは元の国家タグSPR(これは実際の国家タグ)を持つ国家を指定しており、国家フラグSPR_carlist_spain_flagを持っている。

  • ここでこのようなスクリプトが呼び出されたとすると、正しくSPRが見つけられ、その国家に政治力が追加される。
  • 元のタグ/トリガーの組み合わせに加えて、国家タグエイリアスは変数、イベントターゲット、スコアリングシステムを持つこともできる。上の例ではMOTは国家タグエイリアスで、変数generic_operation_targetを持っている。この変数はスクリプトの別の部分で国ごとに設定されるものだ。

国家スコアラー

  • スクリプト言語にスコアリングシステムを追加した。「game\common\scorers\country」に例がある。これは多くのトリガーと補正を使って国家を測定できるもので、get_sorted_scored_countriesやget_highest_scored_countryというようなエフェクトでスコアリングエントリーを使用する。
  • このシステムはさまざまなAI実装でも使用される。例えば作戦AIは完全にスクリプト化されており、このスコアリングシステムを使って標的を選定する。暗号解読AIも暗号解読の目標選定にこのスコアリングシステムを使っている。

補正の定義付け

  • スクリプト言語を使ってカスタム補正を追加できるようになった。こうした新しい補正は「game\common\modifier_definitions」に保存される。こうした補正が定義されると国家/ステート/司令官の補正を追加するものとして利用できる。
  • これは補正のツールチップにも表示され、「country/state」スコープや「leader_modifier/unit_modifier」のユニットリーダースコープ内で「modifier@modifier_token」を使ってエフェクトやトリガーで補正の値にアクセスすることもできる。

[Ctrl]+[Alt]+左クリックでスクリプトファイルを開く

(注:GIFアニメーションで、スクリプトファイルを開いて数値を変更して保存するとゲームの数値も変更される様子)

  • デバッグモードで[Ctrl]+[Alt]+左クリックを使うと国家方針、アイディア、ディシジョン、イベント、研究、国民精神などでスクリプトファイルを開くことができる。
  • 画像は既存の国家方針の編集の例だ。リロードも改善され、国家方針ツリーは変更したときにデフォルトの位置に戻ることはなくなった。

さらなるAI戦略

  • AIの振る舞いを上書き/変更するため、私たちは多くの戦略を追加した。AIが特定の戦線により多くのユニットを要求するようにしたり、強制的に計画を実行/中止させたり、攻撃性を変えたりなどが行えるAI戦略を作ることができる。こうした戦略により、連合国はヨーロッパにおいて枢軸国への上陸作戦をよりよくできるようになった。

改造可能なゲーム速度

  • これはマルチプレイMod制作者から多く尋ねられた。NGame::GAME_SPEED_SECONDSの値を変更することでゲーム速度を改造できる。

諜報作戦の改造

  • 諜報作戦システムは大部分をスクリプトできるようにデザインされており、新たな諜報作戦を作るのに幅広くModで改造可能だ。
  • 基本的なこととして、諜報作戦は3つの作戦フェーズで構成される。バニラの実装では、こうしたフェーズは3つに分かれたプールからランダムに選ばれる。すなわち、潜入・実施・脱出だ。しかし決してそうしなければならないわけではない(例外もある。偽情報作戦では潜入と脱出は必要ない)。

  • 各フェーズには、そのフェーズが利用可能かどうかを決定する固有の要件がある(したがって例えば対象国が内陸である場合、潜水艦による潜入はできない)。また装備の要件もあり、備蓄から自動的に利用される。輸送機のような高価な装備について、諜報作戦終了後に返却される装備を設定できる。

  • 一部のフェーズでは民需工場コストを使用する。これは一定日数の一定数の工場として表現される。
  • フェーズが選択される確率はイベントなどのai_chancesのように、補正を受ける基礎値によって決まる。
  • 各フェーズは3つのローカライゼーションが関連付けられる。すなわち計画、結果、失敗時の結果だ。
  • さらに2つの画像が必要だ。ひとつは概要欄上部の画像、もうひとつはマップ上のフェーズアイコンだ。

  • 次にスクリプトにおいて諜報作戦がどのように見えるか、上から見ていこう。

  • これはGUIに関する部分で、Mod制作者は知っているだろう。
  • Iconは諜報機関画面で表示される画像だ。
  • Map_iconは諜報作戦が実行できるときにマップ上に表示されるアイコン。
  • Nameとdescは名称と説明文のローカライゼーションのキーだ。
  • Priorityはその諜報作戦が利用可能な諜報作戦リストで何番目に表示されるかを決める。

  • Daysは開始からの継続期間。準備フェーズでは必要な資源を集めたときに全体が決まる。
  • Network strengthは標的国における諜報網の強度。
  • Operativesは諜報作戦を開始するのに必要な諜報員の数。これは国家がその数の諜報員を持つようになるまでその作戦は実施できないことを意味する。
  • visible = {}トリガーはディシジョンやアイディアと同様だ。Trueになる場合この諜報作戦は表示される。
  • allowed = {}とavailable = {}トリガーは表示されていないが、 allowed = {}はその諜報作戦がある国家に対して実行可能かをチェックする。これは特定の国家に対してのみ実行可能にする際に便利だ(重水工場破壊作戦をドイツ以外の国家に限定するなど)。
  • available = {}は(表示されている場合)実施できるかをチェックする。これは(visible = {}をavailable = {}より厳しくない条件にすることで)実際にそうなる前にプレイヤーに実施できるようになることを知らせたいときに便利だ。

  • Selection_targetは実施対象にできる対象の数を制約する(FROMは常に標的国を、FROM.FROMはひとつ存在する場合は対象のステート、ROOTは諜報作戦を行う国家)。これはゲームがすべてのタグやステートをチェックしないようにし、パフォーマンスが低下するのを防ぐ。
  • Selection_target_stateは諜報作戦で選択されるステートの種類を定義する(この例ではレジスタンス値があるステート)。selection_targetと組み合わせると、この例ではレジスタンスがいる対象国のステートのみが選択され得る。

  • Equipmentは必要な装備のカテゴリーを決める。上で述べたように装備は実施フェーズと結びついており、ゲームが選択しているフェーズにかかわらず最低限のコストを設定するのに役立つ。
  • Required_tokensは国家が持っているトークンをチェックする。バニラではトークンは他の諜報作戦からのみ得られるが、理論的には国家方針、イベント、ディシジョンからも得られる。それ自体では目的に寄与しないが、プレイヤーがある諜報作戦を始める前に別の諜報作戦を終わらせるように強制し、2つの作戦を連結するのに役立つ。

  • Risk_chanceは諜報員にまずいことが起こる確率だ。この場合は20%。ランダム数値生成で悪い結果になると決まると、on_operative_detected_during_operationというon_actionを実行し、さまざまな結果(拘束、殺害、負傷、強制的な潜伏)の可能性を決める。
  • Experienceは割り当てた諜報員の得る経験値。
  • Outcome_chanceは基礎的な結果のみを得る確率だ。この値は低いほど追加の利益を得られる可能性が高まる。失敗するようにしたい場合は基礎的な結果を悪いものにして、outcome_chanceを失敗の確率にする。
  • Outcome_modifiersは結果に影響する補正だ。これは諜報機関のアップグレード、国民精神、アイディア、閣僚など、別の場所で設定される。こうした補正の合計によって基礎的な結果の確率が増減する。
  • 利用可能な補正は以下のものを含む。
    • Outcome_modifiers (結果の確率を補正する)
    • Risk_modifiers (リスク確率を補正する)
    • Cost_modifiers (装備の必要量を補正する)
  • 特に素晴らしいのは諜報作戦が自身で全体の補正を定義できることだ。これによって非常に柔軟なシステムになる。他の分野ではコードで補正を定義する必要があるが、ここでは諜報作戦で名称をつければ補正を定義できる。閣僚、技術、国民精神に追加するときも名称で補正を参照できる。

  • Outcome_executeは本質的にはエフェクトを実行するための単なるフィールドだ(ディシジョンや国家方針と大差ない)。
  • Outcome_extra_executeは別のエフェクトフィールドだ。Outcome_chanceで完了時にoutcome_executeとOutcome_extra_executeのどちらを実行するかを決める(Outcome_chanceはoutcome_executeを実行する確率だ)。
  • この例ではゲームがボーナスの目を出せば単純なrandom_listに引き継がれ、ボーナスの大きさを決める。例えば敵国の安定度を下げることもできるし、特定の状況下で小さい確率ながら内戦を起こすこともできる。
  • 常に結果を同じにしたい場合はoutcome_extra_executeにその効果を記入し、outcome_chanceをゼロにする。
  • Outcome_potentialは諜報作戦実施前に予想される結果を表示するツールチップを生成する。この例ではoutcome_executeと同じで、プレイヤーに作戦実施によって得られる最小限のものを表示している。

  • これはどのようにフェーズが選択されるかを決める部分。各フェーズは基礎確率を持ち、この確率は補正を受ける。
  • 上の画像には書いている間に気がついたバグが含まれている。諜報作戦のフェーズは対象ステートが選択される前にロールされるため、基礎確率についてFROM.FROMでレジスタンスをチェックしている部分は機能しない。

質疑応答

Q1:歴史ロガーは実際のプレイでも機能するの?

A1:通常プレイでも機能する(そんなにテストはしてないが)。マルチプレイでは機能しない。

Q2:空母艦載機に関する修正があるけど、8時から16時まで夜間だから太平洋では出撃は1日1回になって空母の強さが大西洋と比べて半減する問題は修正された?

A2:リストにそうしたものはない。システム全体が攻撃/防御について連動した時間で走っているので、難しい問題だ。最良の解決策を見つけられていないので素早い修正は約束できない。


「La Résistance」発売は25日(日本時間26日、MtGと同じ時刻なら深夜2時)発売です。

次回:開発日記2020年3月4日――LaRリリース後と統計

バージョン1.9.1ベータ版についてはこちら。

コメント

  1. 南樺太は日本の中核州にするのに、南鳥島は非中核州のままか・・・

    • 南鳥島に関してはAI日本が選択する降伏ディシジョンが原因でしょうね。
      中核州二つに核投下すると降伏しちゃうから、南鳥島を中核州にすると南鳥島、樺太(次アプデから)、沖縄、千島列島の内二つに核落とすだけで終わっちゃうし。

  2. ライセンスの表示に許可が必要になったというのはおそらく、敵がどこまで研究をすすめているのかをライセンス画面で確認するのを防ぐという事だと思います。

    • なるほどそういう理由がありそうですね。追記しました。ありがとうございます。

  3. 中立主義は外部的にブーストされるというのは、政党支持工作で中道主義を増加させられるようになったという意味だと思います。

    • 確認しましたが、現在は中道主義は外部から増加させることができないのですね。
      追記しました。ありがとうございます。

  4. 優勢火力の初期研究もついにナーフされるときが来たか。まぁそれでも使い勝手自体は相変わらず良さそうですけど。

    >空母艦載機に関する修正があるけど、8時から16時まで夜間だから太平洋では出撃は1日1回になって空母の強さが大西洋と比べて半減する問題は修正された?

    これ、どういう意味か分かる方います?8~16時は昼間じゃなくて夜間なんですか?

    • ゲーム中の艦載機攻撃は0時、8時、16時の1日3回に発生するんだけど、夜間と被ったときは攻撃効率がゼロになって無効化される。時差の関係で大西洋だと0時が夜、8時16時が昼間で一日2回攻撃できるのだが、太平洋では0時が昼、8時16時が夜で一日1回しか攻撃できない。

      • あぁ、艦載機の出撃時間を時差を無視してグリニッジ標準時の0時8時16時に固定しているから、そういう問題が起きるのか。なるほど。素人目には現地時間の8時と16時とかにすれば良いのでは?って思っちゃうけど、回答にあるように修正は難しいんだろうなぁ。

        • 次善の対応策は6時間ごとに出撃するようにして、どの地域でも1日2回攻撃できるようにするとかかな

          • 気になって調べてみたけれど、たぶんフォーラムで最初の質問した人は勘違いしているのかも。初期バージョンでは確かに8時間ごとに一日3回だったのだけど、1.3.2で4時間ごとに一日6回になる変更がされているので。
            00_defines.luaのHOURS_DELAY_AFTER_EACH_COMBATがその定義されている数字。

            (1.3.2のパッチログより)
            >Lowered air combat delay so that some areas will still see combat even though caught in extreme time zones.

          • 00_defines.luaを見ると、HOURS_DELAY_AFTER_EACH_COMBATは確かに数値が4となっていますが、説明には「一般的には往復があるので倍の値として利用される(generally used as double because of roundtrip)」とあります。
            また、おそらくHOURS_DELAY_AFTER_EACH_COMBATは通常の航空戦のインターバルの値で、空母艦載機出撃についてはCARRIER_HOURS_DELAY_AFTER_EACH_COMBAT(こちらも値は4)が使われているのではないかと思いますが、フォーラムでは「片方変えるだけでも大丈夫だと思うけど違うかも」という話になっていて詳細は不明です。

            https://hoi4.paradoxwikis.com/Naval_battle#Naval_strike
            あくまで傍証ですが、英語Wikiでも少なくとも1.5時点では空母艦載機は0時、8時、16時に攻撃するという内容になっていることが確認されているようです。

            https://forum.paradoxplaza.com/forum/index.php?threads/hoi4-bonus-diary-modding-1-9-patchlog.1332541/page-7#post-26282494
            https://steamcommunity.com/sharedfiles/filedetails/?id=2004636951
            なお、「6時間ごとに出撃するようにして、どの地域でも1日2回攻撃できるようにする」というアイディアは、フォーラムでModにして公開されている方がいらっしゃいますね。
            今確認したところでは、上記のHOURS_DELAY_AFTER_EACH_COMBATとCARRIER_HOURS_DELAY_AFTER_EACH_COMBATをそれぞれ3に設定するという内容です。

          • 上のコメント書いた者ですが、勘違いでしたか。ありがとうございます、非常に助かります。

  5. スペインの11月11日って何かと思ったらEU4のスタート日のことか

  6. 中道を外部から増やせるなら150で雇える閣僚やクーデター、選挙も増やせばいいのに

  7. 「La Résistance」の発売が日本時間で本日午後6時に前倒しになったそうです。

    • グリニッジ標準時だと朝9時発売ってことですか、前回より早いですね。日本語化mod作成チームの方々、新要素盛沢山ですが、これまでのような素晴らしい翻訳、是非とも御願いします!

  8. バージョン1.9おめでとう!

タイトルとURLをコピーしました