動的MOD制作¶
本ページは、効果、条件、スクリプトローカライズ、スクリプト変数など、抽象的ながら非常に柔軟なMOD制作機能を扱います。
効果¶
効果は実行時にゲーム状態を変える文です。多くのゲームオブジェクトとイベントが動的効果として使用します。効果文の全一覧はEffectsを参照してください。効果は必ずスコープ上で実行します。詳細はScopesを参照してください。
スクリプト効果¶
複数の効果文や他のスクリプト効果を1つの効果として再利用できるブロックで、common/scripted_effects/xyz.txtに定義します。
example_scripted_effect = {
shift_ethic = ethic_materialist
...
}
定義後は通常の効果と同様にexample_scripted_effect = yesで呼び出せます。
パラメータ¶
パラメータはすべて文字列で、スクリプト効果へ動的に挿入されます。
# 定義
example_scripted_effect = {
shift_ethic = ethic_$ETHIC$
}
# 呼び出し
example_scripted_effect = { ETHIC = materialist }
複数パラメータも使えます。
example_scripted_effect = {
while = {
count = $COUNT$
shift_ethic = ethic_$ETHIC$
}
}
example_scripted_effect = { ETHIC = materialist COUNT = 2 }
パラメータ条件¶
詳細資料はcommon/scripted_effects/99_advanced_documentation.txtです。二重角括弧で囲むと、そのパラメータが渡された場合だけ内容を挿入します。
[[homeworld] <<<ここへ処理>>>]
last_created_species = {
save_global_event_target_as = vaadwaurSpecies
[[homeworld]set_species_homeworld = event_target:tempHomeworld]
}
先頭に!を付けると、パラメータが渡されなかったかnoの場合だけ挿入します。
[[!homeworld] <<<ここへ処理>>>]
パイプで既定値も指定できます。
has_global_flag = crisis_stage_$STAGE|1$
このメタスクリプト構文は2.3で導入されましたが、2.6時点のバニラでは使用例が少なく、common/scripted_effects/archaeology_event_effects.txtとcommon/scripted_triggers/00_scripted_triggers.txtなどにあります。Star Trek: New CivilisationsのようなMODではより多く使われています。
インライン計算¶
スクリプト効果とスクリプトトリガーでは、単純な計算式@\[ ... ]を使えます。
inline_math_example = {
add_monthly_resource_mult = {
resource = unity
value = $COUNT|1$
min = @\[ $COUNT|1$ * 10 ]
max = 99999999
}
}
COUNTをXとして、対象帝国へ月間統合力収入のX倍(下限X×10、上限99,999,999)を与えます。COUNT = 10なら月間収入の10倍、下限100です。
利用できる演算子は+、-、*、/です。それ以外は両側を連結し、たとえば@\[ 4 = 2 ]は42になります。
最初の式だけが評価される制限
1つのスクリプト効果/トリガー内では、最初の@\[ ... ]だけが正しく認識・評価されます。複数必要なら、互いを呼び出す複数のスクリプト効果へ分けます。
inline_math_drawback = {
if = {
limit = { <condition A> }
inline_math_drawback_step_2 = { COUNT = 2 }
}
else = { inline_math_drawback_step_2 = { COUNT = 1 } }
}
inline_math_drawback_step_2 = {
if = {
limit = { <condition B> }
inline_math_drawback_step_3 = { COUNT = $COUNT$ MULT = 0.75 }
}
else = { inline_math_drawback_step_3 = { COUNT = $COUNT$ MULT = 1.0 } }
}
inline_math_drawback_step_3 = {
inline_math_drawback_step_4 = {
RESOURCE = unity
COUNT = @\[ $COUNT$ * $MULT$ ]
}
}
inline_math_drawback_step_4 = {
add_monthly_resource_mult = {
resource = $RESOURCE$
value = $COUNT$
min = @\[ $COUNT$ * 100 ]
max = 100000000
}
}
式を引用符で囲んで別効果のパラメータとして渡す方法もあります。呼び出し元では計算式は評価されませんが、式内の$COUNT$は置換されます。受け取った効果側で計算式を評価するため、経路ごとに異なる式を選べます。ただし1回の呼び出しへ複数の式を渡すことはできません。
inline_math_effect = {
if = {
limit = { <condition A> }
inline_math_drawback_step_2 = { COUNT = 2 }
}
else = { inline_math_drawback_step_2 = { COUNT = 1 } }
}
inline_math_drawback_step_2 = {
if = {
limit = { <condition B> }
inline_math_drawback_step_3 = { Resource = unity Value = "@\[ $COUNT$ * 0.75 * 500]" }
}
else = {
inline_math_drawback_step_3 = { Resource = unity Value = "@\[ $COUNT$ * 500]" }
}
}
inline_math_drawback_step_3 = {
add_resource = { $Resource$ = $Value$ }
}
角括弧ローカライズ¶
3.4以降、set_nameやnameで角括弧ローカライズを使う通常の形式は次のとおりです。ローカライズ文字列内の角括弧コマンド1つにつきvariable_stringを1つ使います。
name = {
key = "NAME_Imperial_Origin_Empire"
variable_string = "[origin_imperial_species.GetAdj]"
}
スクリプト効果内では、開き角括弧の前にバックスラッシュを2つ付けるか、角括弧自体を省略します。そうしないと角括弧ローカライズが表示されません。
name = {
key = "NAME_Imperial_Origin_Empire"
variable_string = "\\[origin_imperial_species.GetAdj]"
}
条件¶
条件は真偽を評価する文です。多くのゲームオブジェクトとイベントが動的条件として使用します。全一覧はConditionsを参照してください。条件もスコープ上で検査します。
スクリプトトリガー¶
複数の条件文や他のスクリプトトリガーを1つの条件として再利用するブロックで、common/scripted_triggers/xyz.txtに定義します。
example_scripted_trigger = {
has_ethic = ethic_materialist
has_ethic = ethic_fanatic_materialist
...
}
通常の条件と同様にexample_scripted_trigger = <yes/no>で呼び出せます。パラメータも利用できます。
example_scripted_trigger = {
has_ethic = ethic_$ETHIC$
has_ethic = ethic_fanatic_$ETHIC$
}
example_scripted_trigger = { ETHIC = materialist }
パラメータ付きトリガーはxyz = no形式では呼べません。否定する場合はNOT = { ... }へ入れます。
スクリプトローカライズ¶
common/scripted_loc/xyz.txtに定義します。条件に応じたローカライズキーを返すインスタンスを作ります。
defined_text = {
name = GetAuthorityName
text = {
trigger = { has_authority = auth_democratic }
localization_key = auth_democratic
}
text = {
trigger = { has_authority = auth_oligarchic }
localization_key = auth_oligarchic
}
...
}
ローカライズファイルから[<scope>.GetAuthorityName]で呼びます。この例は帝国スコープからの使用を想定していますが、スクリプトローカライズ自体にスコープ型の制限はありません。
スクリプト変数¶
common/scripted_variables/xyz.txtに定義し、ファイル末尾には必ず空行またはコメント行を置きます。ゲームオブジェクトではなく、他のゲームファイルから共用できる@変数です。各ファイル内で定義した@変数は他ファイルから使えませんが、スクリプト変数は全ファイルで共有されます。
@example = 2
example_scripted_effect = {
while = {
count = @example
shift_ethic = ethic_$ETHIC$
}
}
または、定義側でパラメータを使い、呼び出し時にスクリプト変数を渡せます。
example_scripted_effect = {
while = {
count = $COUNT$
shift_ethic = ethic_$ETHIC$
}
}
example_scripted_effect = { ETHIC = materialist COUNT = @example }
補正の数値にも@変数を使えます。
補正¶
3.0以降、add_modifierでは数値を乗算するmultiplierを使えます(原文注記では、実際の導入は少し前ですが未文書化とされています)。
effect = {
add_modifier = {
modifier = soul_diet1
multiplier = 6
days = 360
}
}
スクリプト補正¶
3.4でcommon/scripted_modifiersに導入されました。資料はcommon/scripted_modifiers/00_scripted_modifiers.txtです。ここで作る補正は既定では何の効果も持たず、条件付き補正や資源表などでmult = modifier:my_modifierのように明示して効果を与えます。例は01_ruler_jobs.txtのhead_researcher、04_species_traits.txtのtrait_charismaticです。
| 設定 | 説明・既定値 |
|---|---|
icon |
gfx/interface/icons/modifiers内の拡張子なしファイル名。既定はmod_+キー。 |
percentage |
パーセント表示するか。既定no。 |
min_mult |
ソースコードで乗数として使う場合の最小値。既定0。コード生成補正を上書きしない限り通常は無関係です。 |
max_decimals |
最大小数桁。既定2。 |
good |
正値を緑、負値を赤とする「良い」補正か。既定no。 |
neutral |
すべてを黄色表示する中立補正か。既定no。 |
hidden |
ツールチップから隠すと思われますが要検証。既定no。 |
no_diff |
原文では機能不明。既定no。 |
cap_zero_to_one |
原文では機能不明。既定no。 |
localize_with_value_key |
ローカライズキー内の$VALUE$へ数値を表示します。既定no。 |
category |
補正を読み取るオブジェクトカテゴリで、特定オブジェクトへ適用するかの判定にも使われます。たとえばcheck_modifier_valueで値を取得する対象を表します。階層内で可能な限り低いものを指定します(帝国→惑星→POP)。候補はall、pop、ship、station、fleet、country、army、leader、planet、component、pop_faction(未使用のため非推奨)、deposit、megastructure、habitability、starbase、economic_unit、system、trade、federation、espionageです。 |
pop_job_trade_mult = {
icon = mod_trade_value_mult
percentage = yes
good = yes
category = pop
}
フラグ¶
フラグは存在するか否かだけを持つ真偽値で、リーダー、惑星、帝国(ファーストコンタクト)、艦隊、艦船、種族、POP(派閥)、連邦、銀河天体(環境オブジェクト)、巨大構造物、諜報作戦、グローバルの各スコープへ付与できます。
set_<scope>_flag = <flag_name>
set_timed_<scope>_flag = { flag = <flag_name> days = <int> }
remove_<scope>_flag = <flag_name>
has_<scope>_flag = <flag_name>
設定後の経過時間を検査するhad_<scope>_flag = { flag = <flag_name> days = <duration> }は原文時点で未実装です。補正もフラグに似ていますが、付与先の統計値を変える点が異なります。
動的フラグ¶
フラグ名へ@とスコープ(leader、country、title)を付けて動的な名前を作れます。これは実際のフラグ名だけを変え、検査方法は変えません。
from = { set_leader_flag = is_friend_of_@root }
対象リーダーIDが140なら、保存される名前はis_friend_of_140です。トリガーでもhas_leader_flag = is_friend_of_@fromと使えます。動的フラグはset_/remove_<scope>_flagとhas_<scope>_flagだけが対応し、create_leaderのflagsなど他の場所では静的名が必要です。イベントターゲットへ変数として保存したスコープも使えます。
スクリプト値¶
3.3でcommon/script_valuesへ導入されました。資料はcommon/script_values/00_script_values.txtです。スクリプトトリガーの数値版のように、要求時に一連の高度な計算を実行しキーの代わりに結果を返します。common/script_valuesへtxtを作り、value:example_valueの形式で参照します。頻繁に検査されるトリガーで使う場合は性能へ注意してください。
example_value = {
base = 10
add = 100
multiply = value:some_other_script_value
round = yes
modifier = {
max = owner.max_example_variable
owner = { is_variable_set = max_example_variable }
}
complex_trigger_modifier = {
trigger = count_owned_planet
trigger_scope = owner
parameters = { limit = { num_pops > 10 } }
mode = add
mult = 5
}
}
baseの既定値は0です。使用可能な計算は次のとおりです。
- 数値を取るもの:
set/weight(現在値を置換)、add、subtract、factor/mult/multiply、divide、modulo、round_to、max、min、pow。 yesだけを取るもの:round、ceiling、floor、abs、square、square_root。round_toは指定値の最も近い倍数へ丸めます(10.7にround_to = 5を適用すると10)。maxは現在値が指定値を超える場合にその値へ下げ、minは下回る場合にその値へ上げます。powは累乗で、オーバーフローに注意してください。roundは最も近い整数への四捨五入、ceilingは切り上げ、floorは切り捨て、absは負なら-1を掛ける絶対値、squareは二乗、square_rootは平方根です。weightとfactor以外はインラインでも使用できます。両者は基礎値を上書きするため、通常はset、mult、multiplyを使います。modifier内へ置けば条件成立時だけ計算できます。complex_trigger_modifierはブロック形式のトリガー結果を数値として取得します。trigger_scopeの既定はthis、parametersへ追加情報、modeへ演算、multへ結果の倍率を指定します。上例はPOPが10より多い所有惑星1つにつき5を加算します。
右辺に使用できる値の完全な一覧はevents/00_how_to_use_variablesを参照してください。スクリプト値もスクリプト効果・トリガーと同じメタスクリプトを使い、value:my_value|PARAM1|value1|PARAM2|value2|でパラメータを渡し、定義側の$PARAM1$をvalue1へ置換できます。
インラインスクリプト¶
3.5で導入され、資料はcommon/inline_scripts/00_README.txtです。1ファイルに書いたスクリプトブロックを、他のスクリプトへ直接書いたかのように挿入します。スクリプト効果やスクリプトトリガーとよく似ていますが、効果・トリガーに限らず、モジュール化や会話などにも使えます。コピー&ペーストを減らし、定義を1か所直すだけで全利用箇所へ反映できます。
common/inline_scriptsにtxtを作ります。1ファイルにつき1スクリプトだけで、ファイル名が参照名になります。サブフォルダで整理できます。
common/inline_scripts/edicts/upkeep_low.txt:
resources = {
category = edicts
upkeep = {
unity = 10
multiplier = value:edict_size_effect
}
}
00_edicts.txtから次のように挿入します。
fortify_the_border = {
length = @EdictPerpetual
icon = "GFX_edict_type_policy"
inline_script = "edicts/upkeep_low"
modifier = {
starbase_upgrade_speed_mult = 0.50
country_starbase_capacity_add = 2
}
}
パラメータ¶
common/inline_scripts/test_basic_policy.txt:
$KEY$ = {
option = {
name = "$KEY$_a"
on_enabled = { add_modifier = { modifier = $MODIFIER_A$ days = 360 } }
}
option = {
name = "$KEY$_b"
on_enabled = { add_modifier = { modifier = $MODIFIER_B$ days = 360 } }
}
}
common/policies/00_policies.txt:
inline_script = {
script = test_basic_policy
KEY = test_1
MODIFIER_A = evermore_science
MODIFIER_B = fumongus_authoritarian
}
パラメータは文字列なので、引用符で囲めば文全体や複数文も渡せます。
inline_script = {
script = just_an_example
MODIFIER = "num_tech_alternatives_add = 1 scientist_skill_levels = 2"
}
注意点¶
inline_scriptはすべての場所で対応しているわけではありません。unexpected tokenやinit前に遭遇したというエラーが出る場所では使用できない可能性があります。examples = { abc test2 test3 object }のような項目リスト内では使用できません。- インラインスクリプトファイルのコメント行でも
$PARAM$は置換されます。複数行コードをパラメータとして渡すとエラーになるため注意してください。 - インライン計算によるフロー制御で、インラインスクリプトの実行を調整し、MOD間の互換性の調整や指定回数のループ実行も可能です。Stellaris Modding Denには、スクリプト変数とインラインスクリプトによるMOD互換性、ループ設計1(簡単な方式)、ループ設計2(Gigastructural Engineering MOD由来の追加Offsetパラメータ付き)の議論とコード例があります。
- 計算の仕組みは数学的な説明を参照してください。Desmosなどのオンライン描画ツールで可視化できます。
関連項目¶
原文の参考資料¶
- 3.4.2 Cepheusパッチ公開(2022年5月12日): スクリプト補正。
- 動的フラグのスコープ指定、対応する命令と条件、イベントターゲットの使用。
- 3.3.1 Libra更新(2022年2月23日)、開発日記240:3.3のスクリプト改善(2022年2月3日): スクリプト値。
- 開発日記267:3.5 Fornaxパッチノート: インラインスクリプト。
出典: Stellaris Wiki — Dynamic modding(原文更新日: 2025年11月20日、版ID 111890)
翻訳日: 2026年9月18日 / 対応バージョン: 3.5
本ページは原文Wiki(CC BY-SA 3.0)の内容を翻訳した非公式ファン翻訳です。