初心者がHearts of Iron IV Mod制作に挑戦!補給ディシジョンを作ってみた

Hoi4

はじめに

Hearts of Iron IVをプレイしているなかで、

補給が届かなくて師団がまともに使えない…

なんて絶望した経験はありませんか?私自身、インフラの整っていないアフリカ戦線などで、精鋭師団がただの置物になってしまう悲劇に何度も見舞われた思い出があります。

「これをどうにかしたい!」という思いから、以前少しMOD作った経験もあったのでMODを作ってみることにしました~!
(簡単な実装だと思ったらめちゃ大変でした…)

Mod概要

実際に作ったMOD『 Supply Boost 』がこちらになります!

↓Steamワークショップ画面へはこちらから↓
Supply Boost

作ったMODのゲーム内の使用画面

今回は補給問題の解決のために、上記ディシジョンにざっくりと以下のバフが付与されています。

  • 建築速度上昇
  • 物資使用量減少
  • 補給切れ減少
  • 物資補給猶上昇

下に詳細なバフ、デバフの情報があります!

詳細はこちらをタップ!
補給改善計画の実施

本MODで追加されたディシジョンを有効化

コンテナ内の過積載許可

海軍経験値-5.0%
移動による指揮統制率の減少+5.0%
物資補給猶予+120.0時間

鉄道連隊の展開

建築速度+15.00%

軌道変換の実施

陸軍経験値獲得-5.0%
建設速度+30.00%

緊急空輸要請

空軍経験値-10
航空事故の発生率+25.0%

補給切れ-15.0%
物資消費量-10%

制作手順

せっかくなので、実際にコーディング前に行ったMOD制作の手順をお話しさせてください!

今回、制作途中で行き当たりばったりになって作業がパンクするのを防ぐため、事前に以下の作業手順を準備しました。

  1. 大まかな概要の決定
    追加するコンテンツの汎用性を優先し、どの国家でも使える『 ディシジョン形式 』に決定。
  2. ディシジョンの構造を決定
    ディシジョンの実行条件、表示条件を決定。
  3. ディシジョンのバフ、デバフ、コストを決定
    ゲームバランスを考慮しつつ、バフとデバフ、必要なコストを決定。
  4. ディシジョンの日本語名、英語名、内部IDの決定
    プログラム用の『 識別名 』を決めると同時に、実際の画面に表示される日本語・英語名を決定。
  5. ローカライゼーションファイルに記述する文の決定
    ディシジョンカテゴリとディシジョン、それぞれの説明文を決定。

おおきくこの手順に沿って準備をしたことで、仕様変更が必要になった際もスムーズに対応出来ました!

コード解説

前提

Hoi4のディシジョンは実際にプレイヤーが押して効果を付与するディシジョンと、それをまとめるディシジョンカテゴリの2つを組み合わせてゲーム内に表示されます。

これらを実装するには、下記の3種類のファイルを作成する必要があります。

  • ディシジョンカテゴリ:ディシジョンをまとめるグループを設定する要素。表示条件やアイコンなどの設定を行います。
  • ディシジョン:実際にプレイヤーにバフやデバフを設定する要素。プレイヤーが直接触れる部分の設定を行います。
  • ローカライゼーション:実装した識別名にゲーム内で表示するタイトル、説明文を紐づける要素。ゲームに没入出来る雰囲気が出たり!

今回は実際に作成したMODファイルの中からディシジョンを1つピックアップして作り方を詳しくご紹介します!

※今回は『 緊急空輸要請 』のディシジョンに絞って、その仕組みを深掘りしていきます。その他のディシジョンはGitHub上に公開されていますので、ぜひそちらも併せてご覧ください!

完成画面

構造の解説

それでは実際に作成したコードを一緒に見ていきましょう!所々に僕なりのこだわりだったり、調べたことのメモ(#のあと)を残してたので参考にしてみてください!

ディシジョンカテゴリの実装
# ディシジョンカテゴリ識別名(今回はSupplyBoostからSBに)
SB = {
	# カテゴリの設定

	# どの国家で使えるようにするか
	allowed = {
		# 全国家で常に表示!(全国家共通要素にしたいので)
		always = yes
	}

	# カテゴリのアイコン設定!(いい感じに)
	icon = generic_industry

	# カテゴリの表示画像(GFX_を入れること、ファイル名拡張子は不要)
	picture = "GFX_decision_cat_picture_operational_planning"

	# カテゴリの表示設定(今回は常に表示!トリガーを用意して表示させるのもアリ)
	visible = {
		always = yes
	}

	# カテゴリの表示優先度(埋もれないように!)
	priority = 3
}
ディシジョンの実装
# カテゴリファイルで設定した識別名(今回はSB)
SB = {

  # 各ディシジョンの記述領域

    # ディシジョン識別名(今回はemergency_airlift_request | わかりやすい方がいい!)
  emergency_airlift_request = {

        # ディシジョンのアイコン
        icon = generic_industry

        # ディシジョンの表示優先度(他のディシジョンとのバランスによって調整したり!)
        priority = 10

        # ディシジョンの実行条件(例:特定の技術が研究されていること)
        available = {

            # 今回は研究されていることを条件に!(空軍の内容に合うように調整)
            has_tech = tech_logistics_company2      # レベル2輸送機
            has_air_experience > 10                 # 空軍経験値10以上持ってるとき

      # 装備を在庫数を条件に(今回は輸送なので輸送機を100機以上)
            has_equipment = { transport_plane_equipment > 99 }
        }

        # ディシジョンの表示・非表示条件(例:個別の国家でのみ閲覧できるようにする)
        visible = {

            # 今回は別に前提ディシジョンを用意してそれが取得が出来た場合に表示する
      # つけなくてもOK!詳細はGitHubをご覧ください!
            has_country_flag = logistics_modernized_flag
        }

        # 表示権限(国家に対しての表示条件指定|経験値の指定をしても押せる。上のは押せなくなる)
        allowed = {
            # 全国家に常に表示する
            always = yes
        }

        # 一度きりの実行にするか?(yesの場合、実行後は再表示☓)
        fire_only_once = no

        # AIのディシジョン優先度
        ai_will_do = {
            factor = 1
        }

        # ディシジョン有効化に必要な政治力(ゲームバランスを壊さない程度に!)
        cost = 200

        # 完了してから再度選べるようになるまでのクールダウン期間(今回は14日|連打して爆速にしたい思いを乗せて~!)
        days_re_enable = 14

        # ディシジョン効果日数(今回は180日間効果が続く|クールダウンを含めて1年で2階程度は使える構成に!)
        days_remove = 180

        # ステータス補正(例:建築速度 / 研究速度上昇)
        modifier = {
            # --- バフ --- (ホントは輸送機を強化したかった...)
            supply_consumption_factor = -0.1   # 物資消費を15%抑制
            out_of_supply_factor = -0.15       # 補給切れペナルティを20%軽減
          
            # --- デバフ ---(輸送機が酷使されてる感じを演出)
            air_accidents_factor = 0.25        # 航空事故率20%増加
            air_range_factor = -0.05           # 航空機の航続距離を-10%低下
        }

        # ディシジョン終了時に発動される効果(例:政治力付与)
        remove_effect = {
        }

        # 国家全体に発動される効果(例:国民精神の付与)
        complete_effect = {
            # 実行した瞬間に、空軍経験値を少し消費する
            air_experience = -10
        }
    }
}
ローカライゼーション
# 作った識別名にそれぞれ訳を書く!(今回は日本語)
# 言語の識別名(忘れるとエラー出るから絶対忘れない!)
l_japanese:

# ディシジョンカテゴリタイトル(補給関連なのでシンプルに)
SB: "補給計画"

# ディシジョンカテゴリ説明文(説明文にはdescをつける!)
SB_desc: "我々の軍隊は、より多くの物資を必要とするようになっている。補給線を改善することで、前線の部隊により多くの物資を届けることができるようになるだろう。"

# 個別のディシジョンタイトル
emergency_airlift_request: "緊急空輸要請"

# ディシジョン説明文(説明文にはdescが付く)
# プレイヤーがマウスホバーした時に出る説明文(書かなくてもOK)
emergency_airlift_request_desc: "我々の軍隊は、より多くの物資を届ける必要がある。緊急空輸を要請することで、前線の部隊により多くの物資を届けることができるようになるだろう。"

参考にさせて頂いたサイト様

[ サイト名 ] (当該サイトURL)
・特に参考になったページ ※埋め込みリンク有り
で表記しています。

[ Hoi4 modding support wiki ] ( https://hoi4modding.wiki.fc2.com/ )
Tips:ディシジョンの作り方(こちらのページが非常に参考になりました)

[ Hearts of Iron 4 Data Wiki ] ( https://hoi4data.paradoxwiki.org/ )
MOD(こちらのページが非常に参考になりました)

MOD制作にあたり、こちらのサイトが大変参考になりました!貴重な情報をまとめてくださっている両サイトの運営者様、本当にありがとうございました!

苦労した点と解決策

下の文字タップして詳細を表示!

カテゴリ専用のファイルを作成していますか?

ディシジョンファイルにディシジョンカテゴリの識別名だけを指定した状態になっていませんか?
元から存在するカテゴリ識別名ではない場合、ゲームは自作した識別名がなんなのか理解出来ないので設定する必要があります。

  • 場所:common\decisions\categoriesフォルダ内
  • Todo:カテゴリ専用のファイル( .txt )を作成し編集、保存する。

カテゴリ名のスペルミスはありませんか?

ディシジョンカテゴリを設定するファイルで指定した識別名とディシジョンファイルのカテゴリ識別名は完全に一致する必要があります。
スペースや小文字、大文字、アンダースコアの有無などを確認してみてください!

descriptor.modファイルの中身に下記のコードを追加してみてください!

picture="thumbnail.png"

またサムネイル画像にしたい画像をpng保存して、上記の『”』に囲まれた中の単語と同じ名前に指定してみてください!

実は私自身、最初は自分の好きなファイル名で指定していたのですが、なぜかSteam側に全く反映されない…というトラブルに見舞われました。上記名前の場合は無事反映されたので現在はこの名前に落ち着いています。

おわりに

いかがでしたでしょうか?
MOD制作は大変な面も多いですが、ゲーム内で動いた時の達成感は感動するものなので是非チェレンジしてみてください!

今回の制作では、正直なところ僕自身の力不足で何度か計画を変更しました。本来の計画どおりに進んだ部分は全体の構成くらいで、細かいバフなどは今出来る範囲で実装したところです。
今後は、追々実装を見合わせた部分の制作を行おうと思っています!

今回のMODは僕のGitHub上でソースコードを公開しています。
もし興味があれば、ぜひ覗いてみてください!
GitHubはこちら

最後までお読み頂き、ありがとうございました!
次は何をいじくり回しましょうか?お楽しみに!

コメント

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