Stellaris

Stellaris

评价数不足
【Stellaris3.9.2】帝国補正のパラメータを動的に変化させる方法案
由 fatal_errorjp 制作
タイトルの通りです。
帝国補正(static_modifiers)は、固定値でしか指定できません。
つまり帝国規模や艦隊許容量などの外部の値に連動して
パラメータを変えたりしたい場合には通常の方法では対応できないことになります。

完全なリアルタイムな対応は難しいですが、代替案があるので
このガイドではその代替案に関するやり方を記載しておこうと思います。
   
奖励
收藏
已收藏
取消收藏
大雑把な概要
帝国補正を付与する方法として、add_modifierというeffectが用意されています。
以下は3.9.2のeffect.logに記載されているadd_modifierの説明です。
add_modifier - Adds a specific modifier to the scoped object for a set duration add_modifier = { modifier = <key> days/months/years = <int, -1 (default) means it never expires> multiplier = <float>/<variable> (optional) time_multiplier = <variable> (optional: days/months/years value is multiplied by the value of this variable) clear_on_owner_change = yes (optional: default no; clears modifier if planet/system/megastructure's owner changes) } Supported Scopes: megastructure planet country ship pop fleet galactic_object pop_faction federation spy_network espionage_operation

上記を読むと、multiplierで倍率の指定ができることがわかりますね。
modifier = <key>の部分で呼び出す帝国補正そのものについては固定値しか記載できませんが、
multiplierを指定することで、指定した倍率がかかった状態で帝国補正がかかるようになります。

つまり以下の手順の処理を作れば擬似的に
動的な帝国補正の付与ができるんじゃないかという話です。
  1. 帝国補正を付与するタイミングで、付与させたいパラメータの値を計算し、
    add_modifierのmultiplierに計算結果を記載するようにする
  2. 任意のタイミングでこのパラメータを再計算する
    再計算した結果にしたがって、帝国補正をつけ直す

ということで、今回はこちらのModを参考にして話を進めていきます。
https://steamproxy.net/sharedfiles/filedetails/?id=3048147681
作成にあたって必要なもの
最終的には画像のような項目を揃えていく必要があります。


イメージ的には下段の右2つ、帝国補正の定義とscript_valuesは2つで1つです。
この2つの組み合わせで実際に付与される帝国補正の値が決まります。
1. MOD作成用のフォルダを生成する
まずは、Mod作成用のフォルダを用意しましょう。

これは、私の過去に作ったガイド「【Stellaris3.8.2】ポートレート&種族の作り方メモ」の
第1章「1. MOD作成用のフォルダを生成する」と内容が被るので細かい説明は割愛します。
https://steamproxy.net/sharedfiles/filedetails/?id=2982605349
2. 計算式を決める
ということでまずは帝国補正の計算式を決めましょう。

今回のサンプルModでは、以下のような計算式で補正値を計算するように決めました。
布告で増やせる交易保護値 = 2 * ((艦隊許容量の最大値) - (現在使用中の艦隊許容量)) / (保有星系数)

また、サンプルModは布告で補正値を付与するようにしているので、
布告の維持費についても合わせて設定しています。
布告の維持費 = ((艦隊許容量の最大値) - (現在使用中の艦隊許容量)) * 0.25
3 計算式に合わせて、帝国補正の定義とscript_valuesの定義を作成する
計算式を決めたので、帝国補正と計算式の具体的にコードに落とし込んでみましょう。

以下の構成で、新規のテキストファイルを作成してください。
文字コードはUTF-8 BOMなしにしてください。
C:\Users\(ユーザー名)\Documents\Paradox Interactive\Stellaris\mod\(MODのディレクトリ名)
└common
 ├static_modifiers
 │└(mod名)_static_modifiers.txt ← これを作る
 └script_values
  └(mod名)_script_values.txt ← これも作る
# ------------------------------------------ # (mod名)_static_modifiers.txt # ------------------------------------------ # 帝国補正「沿岸警備隊」 # 交易保護値を上昇させる coast_guard = { local_trade_protection_add = 2 }
# ------------------------------------------ # (mod名)_script_values.txt # ------------------------------------------ # 沿岸警備隊に必要なコストの基本値(=余っている艦隊許容量) coast_guard_cost = { complex_trigger_modifier = { trigger = max_naval_capacity mode = add } complex_trigger_modifier = { trigger = used_naval_capacity_integer mode = subtract } min = 0 } # 沿岸警備隊の交易保護値上昇量(=余っている艦隊許容量/保有星系数 小数切り上げ) coast_guard_trade_protection_value = { add = value:coast_guard_cost divide = trigger:controlled_systems ceiling = yes }

(mod名)_static_modifiers.txtの方に記載した「local_trade_protection_add = 2」が
2章で決めた計算式「布告で増やせる交易保護値」の「2」の部分に当たります。
この数値に、「coast_guard_trade_protection_value」の値をかけるようなイメージです。
つまりstatic_modifiers側には「定数」のみを記載しましょう。

逆に「script_values」側には変数を記載するようにします。
「coast_guard_trade_protection_value」は、「add = value:coast_guard_cost」と
表記をしておりますが、これは「coast_guard_cost」の計算結果を呼び出し、
その結果を足しているということです。足し算ですが、元の値がない(=0)ので、
単純に参照と同等の動きをしていると考えてください。

「coast_guard_cost」の中身は、 「((艦隊許容量の最大値) - (現在使用中の艦隊許容量))」です。
max_naval_capacityが艦隊許容量の最大値、
used_naval_capacity_integerが現在使用中の艦隊許容量を示しています。
現在使用中の艦隊許容量が最大値を超えてしまうケースがありますが、
計算値が負になる事は想定していないので、
「min = 0」の指定で最小値が0になるようにしています。
controlled_systemsが保有星系数ですね。
4. 帝国補正を付与するための布告の定義を作成する
3章で作成した帝国補正を付与するために、今回は布告を使うことにします。
布告と布告のローカライズ定義を作成しましょう。

以下の構成で、新規のテキストファイルを作成してください。
文字コードは布告はUTF-8 BOMなし、ローカライズファイルはUTF-8 BOMありにしてください。
C:\Users\(ユーザー名)\Documents\Paradox Interactive\Stellaris\mod\(MODのディレクトリ名)
├common
│└edicts
│ └(mod名)_edicts.txt ← これを作る
└localisation
 └(mod名)_l_japanese.yml ← これも作る
# ------------------------------------------ # (mod名)_edicts.txt # ------------------------------------------ @EdictDuration = -1 @CoastGuardBaseCost = 0.25 # 沿岸警備隊 coast_guard = { length = @EdictDuration icon = "GFX_edict_type_time" resources = { category = campaigns cost = { energy = @CoastGuardBaseCost multiplier = value:coast_guard_cost } upkeep = { energy = @CoastGuardBaseCost multiplier = value:coast_guard_cost } } potential = { is_gestalt = no } effect = { hidden_effect = { remove_modifier = coast_guard } add_modifier = { modifier = coast_guard multiplier = value:coast_guard_trade_protection_value } } ai_weight = { weight = 0 modifier = { weight = @EdictLowPrio has_resource = { type = energy amount > 5000 } } } }
# ------------------------------------------ # (mod名)_l_japanese.yml # ------------------------------------------ l_japanese: coast_guard:0 "沿岸警備隊" edict_coast_guard:0 "$coast_guard$" edict_coast_guard_desc:0 "艦隊許容量の余剰分を利用して沿岸警備隊を結成し、交易路を巡回させれば治安維持に繋がるだろう。"

布告(edicts)の各パラメータの意味は英語Wiki[stellaris.paradoxwikis.com]を参照してください。
ローカライズファイルの中身についても内容は割愛します。
重要なのは、「add_modifier 」の記述になります。
add_modifier = { modifier = coast_guard multiplier = value:coast_guard_trade_protection_value }

multiplierのところで、3章で定義したstatic_modifiersの「coast_guard」と、
script_valuesの「coast_guard_trade_protection_value」を指定しています。
これで、計算式に沿った帝国補正を付与してくれるというわけです。
5. 帝国補正を再計算してつけ直すためのイベント定義を作成する
4章で帝国補正を付与できるようになりましたが、この補正値を外す手段がまだありません。
また、付与した帝国補正値はなにもしなければ布告で付与した時の値で固定になります。
動的に変化させたいので、再計算させるためのイベントを作ります。

以下の構成で、新規のテキストファイルを作成してください。
文字コードはUTF-8 BOMなしにしてください。
C:\Users\(ユーザー名)\Documents\Paradox Interactive\Stellaris\mod\(MODのディレクトリ名)
├common
│└on_actions
│ └(mod名)_on_actions.txt ← これを作る
└events
  └(mod名)_events.txt ← これも作る
# ------------------------------------------ # (mod名)_on_actions.txt # ------------------------------------------ # this = country on_monthly_pulse_country = { events = { coast_guard.1 } }
namespace = coast_guard country_event = { id = coast_guard.1 hide_window = yes is_triggered_only = yes trigger = { is_gestalt = no } immediate = { if = { # 「沿岸警備隊」の布告が有効な場合は、効果の再計算をする limit = { has_edict = coast_guard } remove_modifier = coast_guard add_modifier = { modifier = coast_guard multiplier = value:coast_guard_trade_protection_value } } else_if = { # 「沿岸警備隊」の布告が無効な場合は、帝国補正を削除する limit = { has_modifier = coast_guard } remove_modifier = coast_guard } } }

on_monthly_pulse_countryには毎月頭に呼び出させるイベント群を記載します。
今回は「coast_guard.1」を指定してますね。
「coast_guard.1」内で布告が有効かどうかをチェックして、
有効なら布告の効果の再計算を、無効なら布告の削除をしています。
これで毎月頭に帝国補正値の再計算ができるようになりましたね。
同じように毎日などにもできますが、ゲームが重くなると嫌なので、
敢えて毎月1回に押さえました。
終わりに
ということで、ちょっとまどろっこしくはありますが、
擬似的に帝国補正をつけ外しすれば、動的に補正値を変更することが可能です。

リーダー回りに仕様変更が入るようなので、その内容次第にはなりますが、
例えば帝国規模に合わせてリーダーの上限数を変更するなどと
言った対応も同じ手法で実現可能なはずです。
今後の更新次第ではそういう仕組みを作ってみようかなと思っています。

以上です。