トリガー
※2025/10/6、英wikiよりkagi翻訳を通しました。機械翻訳なので一部不自然な日本語があるかもしれません。ぜひ編集してくれるとありがたいです。
トリガーは、それが使われるスコープに対してtrueかfalseを返す判定です。
たとえば、is_ai = yes はAIのキャラクターに対してはtrue、プレイヤーに対してはfalseを返します。
これはイベントのトリガーブロックで用いることで、プレイヤー向けのイベントを無効化する、といった使い方ができます。
値を比較するトリガーは、その値自体を返すこともできます。
例として、add_gold = gold は、そのキャラクターが現在所持している金額と同じだけのゴールドを増やします。
利用可能なコードトリガーの完全な一覧は、triggers.log にあります。
ゲーム内でコンソールコマンド script_docs を実行し、Documents\Paradox Interactive\Crusader Kings III\logs に生成されるログを確認してください。
トリガーブロック[編集 | ソースを編集]
トリガーはトリガー用のスクリプトブロックで使用します。
それらは、イベントの trigger = { } ブロックのように明示的にそう名付けられているか、あるいは意思決定の is_shown = { } や is_valid = { } のように、はい/いいえで答えられる問いの形になっています。
場合によっては、トリガー以外も受け付けるハイブリッド型のスクリプトブロックの中でトリガーが使われることもあります。
modifier = {
is_ai = yes
factor = 0
}
このブロックでは、is_ai = no はトリガーですが、factor = 0 はオペレーターです。
アーリーアウト[編集 | ソースを編集]
ツールチップ化されている場合を除き、トリガーブロックは「アーリーアウト」の原則で動作します。
トリガーブロック全体をtrueにするには、中のすべてのトリガーがtrueである必要があります。「アーリーアウト」とは、ブロック内のいずれかのトリガーがfalseと評価された時点で、そのブロック内の残りのトリガーは評価されないことを意味します。
これはエラーの回避に役立ちます。
例: 次のトリガーブロックは、現在のキャラクタースコープの主配偶者が当人と同じ文化であるかを確認します。エラーを避けるため、最初にそのキャラクターにそもそも配偶者が「いる」かどうかを確認します。
trigger = {
exists = primary_spouse
culture = primary_spouse.culture
}
もし exists = primary_spouse がfalseなら、2つ目のトリガーは評価されません。
これはパフォーマンス最適化にも有用です。複数のトリガーを含むトリガーブロックでは、失敗しやすいものを先に置くことで、全体として評価するトリガーの数を大幅に減らせます。
例: このトリガーブロックは、現在のキャラクタースコープがプレイヤーであり、かつ独立した統治者であるかを確認します。
trigger = {
is_ai = no
is_independent_ruler = yes
}
このトリガーブロックをゲーム内の全キャラクターに対して年1回評価する場合、ほとんどのキャラクターはプレイヤーではないため、is_ai = no はほぼ常にfalseになり、2つ目のトリガーはほとんど評価されません。
論理ブロック[編集 | ソースを編集]
トリガーブロックには複数のトリガーを含められます。デフォルトでは、すべてがtrueであればブロック全体がtrueになりますが、いくつかの論理ブロックによってその論理を操作できます。
AND[編集 | ソースを編集]
AND = {
is_ai = no
is_independent_ruler = yes
}
AND ブロックは、現在のキャラクターがプレイヤーであり、かつ独立した統治者である場合にtrueになります。
OR[編集 | ソースを編集]
OR = {
is_ai = no
is_independent_ruler = yes
}
OR ブロックは、現在のキャラクタースコープがプレイヤー「または」独立した統治者のいずれかである場合にtrueになります。
NOT/NOR/NAND[編集 | ソースを編集]
NOT = { has_title = title:k_france }
NOT ブロックは、現在のキャラクタースコープがフランス王国を保有していない場合にtrueになります。
曖昧さを避けるため、NOT には単一のトリガーのみを含めるべきです。複数のトリガーを扱う場合は、NOR や NAND を使うと意図が明確になります。
NAND = {
has_title = title:k_france
has_title = title:k_aquitaine
}
NAND ブロックは、現在のキャラクタースコープがフランス王国またはアキテーヌ王国のいずれか、もしくは両方とも保有していない場合にtrueになります。両方の称号を保有している場合はfalseです。
NOR = {
has_title = title:k_france
has_title = title:k_aquitaine
}
NOR ブロックは、現在のキャラクタースコープがフランス王国・アキテーヌ王国のいずれも保有していない場合にtrueになります。いずれかの称号を保有している場合はfalseです。
limit ブロック[編集 | ソースを編集]
limit ブロックは条件付きの効果やトリガーに使用します。
if/else_if[編集 | ソースを編集]
最も一般的な limit ブロックの使い方は、if/else_if 効果と組み合わせ、limit ブロックがtrueのときだけ効果を実行することです。
例: 現在のキャラクタースコープがプレイヤーであればゴールドを追加します。
if = {
limit = { is_ai = no }
add_gold = 100
}
効果のリストビルダー[編集 | ソースを編集]
limit ブロックは、効果リストビルダーを制限するためにもよく使われます。
例: 現在のキャラクタースコープの子供が男性である場合にゴールドを追加します
every_child = {
limit = { is_male = yes }
add_gold = 100
}
注意: any_X リストビルダーは limit ブロックを「使用しません」。
trigger_if/trigger_else_if/trigger_else[編集 | ソースを編集]
trigger_if は、limit ブロックがtrueのときにのみトリガーをチェックできます。
例: 現在のキャラクタースコープがAIでない場合に、独立統治者であるかどうかをチェックします
trigger_if = {
limit = { is_ai = no }
is_independent_ruler = yes
}
条件付きトリガーは、ツールチップ付きのトリガーブロックで、可読性とエラー回避の両面からよく使われます。ツールチップ化されている場合、アーリーアウトは適用されないためです。
例: このトリガーは、ツールチップ化されていると primary_spouse が存在しないときにエラーを投げます。
trigger = {
exists = primary_spouse
culture = primary_spouse.culture
}
一方、こちらは limit ブロックがfalseならトリガーが評価されないため、エラーを投げません。
trigger_if = {
limit = { exists = primary_spouse }
culture = primary_spouse.culture
}
トリガーの文法[編集 | ソースを編集]
スコープ比較[編集 | ソースを編集]
スコープ比較は、= の左右にスコープがある文です。両方のオブジェクトが同一であればtrue、そうでなければfalseです。
スコープ比較で使えるスコープは、データベーススコープ、イベントターゲット、保存済みスコープ、または変数です。
注意: 両方のスコープが同一のオブジェクトでなくても、同じスコープ種別である必要はあります。
例: このトリガーは、フランス王国の保有者が、現在のキャラクタースコープの父親と同一のキャラクターかどうかをチェックします。
title:k_france.holder = father
スコープ比較では、両側が有効である必要があります。この例では、現在のキャラクターに父親が存在し、かつフランス王国が創設されている必要があります。そうでないと、比較はエラーログにエラーを出すため、比較の前に両スコープの存在をどこかで確認しておく必要があります。
比較の左辺のスコープの存在確認自体は、?= を使って行えます:
title:k_france.holder ?= father
値の比較[編集 | ソースを編集]
値の比較は、2つの数値を、
- 等号
= - 比較記号
- より大きい
> - 以上
>= - より小さい
< - 以下
<=
- より大きい
のいずれかで比較する文です。比較が数学的に正しければtrueになります。
値の比較で使える数値は以下のとおりです:
- 数値そのもの
- 名前付きの値
- script_value
- 保存済みスコープの値
- 数値を格納した variable
例: このトリガーは、現在のキャラクタースコープのゴールドが1000より大きいかをチェックします。
gold > 1000
コードトリガー[編集 | ソースを編集]
コードトリガーにはあらかじめ決められた構文があり、通常は動作に特定のスコープ種別のコンテキストを必要とします。
コードトリガーにはいくつかの形式があります:
基本トリガー[編集 | ソースを編集]
基本トリガーは、その記述が期待される肯定/否定の結果を持つかどうかをチェックします。
例: このトリガーは、現在のキャラクタースコープがAI「ではない」場合にtrueになります。
is_ai = no
単純トリガー[編集 | ソースを編集]
単純トリガーは、= の右辺に与えられる引数に応じてtrueかどうかをチェックします。
引数は次のいずれかです:
- スコープ
例: このトリガーは、現在のキャラクタースコープが保存済みスコープ scope:actor の封臣かどうかをチェックします。
is_vassal_of = scope:actor
- データベースキー
例: このトリガーは、現在のキャラクタースコープが infirm キーで定義された特性を持つかどうかをチェックします。
has_trait = infirm
複合トリガー[編集 | ソースを編集]
複合トリガーは、スクリプトブロック内で複数のパラメーターを使用します。パラメーターには、スコープ、データベースキー、数値、フラグ値などが使えます。
例: このトリガーは、現在のキャラクタースコープが、上位者を標的とした暗殺(murder)タイプの進行中の策謀を持っているかをチェックします。
is_scheming_against = {
target = liege
type = murder
}
一部のコードトリガーには、単純形と複合形の両方が存在します。
インライン複合トリガー[編集 | ソースを編集]
一部の複合トリガーは、値を返す1行表記で書くことができます。
これは引用符で囲み、追加の引数を括弧で渡します。
たとえば、スクリプト値は次のようになります:<syntaxhighlight lang="c">
distance_to_liege_sval = {
value = "realm_to_title_distance_squared(liege.capital_county)"
}
</syntaxhighlight>この機能は文書化されておらず、すべてのトリガーで動作するわけではありません。テストから、説明文に Traits: <, <=, =, !=, >, >= の一文があるトリガーのみをサポートしているようです。
トリガーに複数の引数が必要な場合、たとえば特性とトラックを必要とする has_trait_xp のようなものは、| で引数をつなげます。
value = "has_trait_xp(lifestyle_traveler|danger)"
現時点では、この複数引数の構文が確認されているのはこのトリガーのみです。
scripted_triggers[編集 | ソースを編集]
scripted_triggers は、スクリプトの可読性を高め重複を避けるために、複数のトリガーの組み合わせを単一の記述に置き換えられるマクロです。
通常は common/scripted_triggers に定義され、トリガーが許されるあらゆる場所で使用できます。
ときにはイベントファイル(events を参照)内でローカルに定義され、その場合は同じファイル内のイベントでのみ使用できます。
基本的な scripted_triggers[編集 | ソースを編集]
単純な scripted_triggers は、あらかじめ定められたトリガー集合が全体としてtrue(= yes)かfalse(= no)かをチェックします。
例: あるキャラクターが裕福な成人の独立統治者かどうかを繰り返しチェックするために、次のトリガー集合を使っているとします:
is_independent_ruler = yes is_adult = yes gold > 1000
同じトリガー集合を各所で繰り返し書く代わりに、scripted_trigger として定義できます:
is_rich_adult_independent_ruler = {
is_adult = yes
is_independent_ruler = yes
gold > 1000
}
そして、その集合をチェックしたい場所では、次の1文に置き換えられます:
is_rich_adult_independent_ruler = yes
否定形を使う
is_rich_adult_independent_ruler = no
のは、NOT 論理ブロックを使うのと同等です
NOT = { is_rich_adult_independent_ruler = yes }
scripted_triggers はさまざまな文脈で使用されるため、定義内で root や prev のような曖昧なイベントターゲットの使用は避けることが推奨されます。
複合的な scripted_triggers[編集 | ソースを編集]
scripted_triggers には、引数を渡すためのリテラルテキスト置換を行う複合形もあります。
たとえば、現在のキャラクタースコープがフランス王の封臣であり、かつその王と血縁関係にあることをチェックする次のトリガー集合があるとします:
is_vassal_of = title:k_france.holder is_close_family_of = title:k_france.holder
このトリガー集合を scripted_trigger として定義できますが、title:k_france.holder を固定で参照する代わりに、定義では大文字で2つの $ で囲った引数を使います:
is_related_vassal_of = {
is_vassal_of = $TARGET$
is_close_family_of = $TARGET$
}
使用時には、$ を除いた同名で、期待される引数を指定します:
is_related_vassal_of = {
TARGET = title:k_france.holder
}
この形式では、scripted_trigger 内の $TARGET$ は、評価の「前」に与えられた引数で文字通り置換されます。
論理オペレーター/トリガー[編集 | ソースを編集]
これらのトリガーは基本的な論理機能を提供します。
| Name | Description | Usage | Traits | Supported Scopes | Supported Targets |
|---|---|---|---|---|---|
| always | 常に同じ値 | always = yes | yes/no | ||
| AND | 内包するトリガーはすべてtrueでなければならない | AND = { <triggers> } | |||
| OR | 内包する項目のうち少なくとも1つがtrueでなければならない | OR = { <triggers> } | |||
| NOT | トリガー内容を否定 | NOT = { <triggers> } | |||
| NOR | 否定された OR トリガー | NOR = { <triggers> } | |||
| NAND | 否定された AND トリガー | NAND = { <triggers> } | |||
| all_false | すべての子がfalseならtrue(NORと同等) | all_false = { <triggers> } | |||
| any_false | いずれかの子がfalseならtrue(NANDと同等) | any_false = { <triggers> } | |||
| switch | あるトリガーに基づいて別のトリガーを評価し、任意のフォールバックを持つスイッチ | switch = {
trigger = simple_assign_trigger case_1 = { <triggers> } case_2 = { <triggers> } case_n = { <triggers> } fallback = { <triggers> } } |
|||
| trigger_if | limit の display_triggers が満たされた場合に内包トリガーを評価 | trigger_if = { limit = { <display_triggers> } <triggers> } | |||
| trigger_else_if | 直前の `trigger_if` または `trigger_else_if` の display_triggers が満たされず、かつ自身の limit の display_triggers が満たされた場合に内包トリガーを評価 | trigger_if = { limit = { <display_triggers> } <triggers> }
trigger_else_if = { limit = { <display_triggers> } <triggers> } |
|||
| trigger_else | 直前の 'trigger_if' または 'trigger_else_if' の display_triggers が満たされなかった場合に内包トリガーを評価 | trigger_if = { limit = { <display_triggers> } <triggers> }
trigger_else = { <triggers> } |
参考文献[編集 | ソースを編集]
| ドキュメンテーション | スクリプト • スコープ • 効果 • トリガー • 変数 • 補正リスト |
| スクリプト | AI • ブックマーク • キャラクター • コマンド • 評議会 • 文化 • ディシジョン • 王朝 • イベント • 政府 • 歴史 • 領地 • ライフスタイル • 連隊 • 宗教 • スクリプト値 • ストーリーサイクル • 闘争 • 称号 • 特性 |
| インターフェース | インターフェース • データ型 • ローカライズ • カスタムローカライズ • フレーバー化 |
| マップ | マップ • 地形 |
| グラフィック | 3Dモデル • エクスポーター • 紋章 • グラフィックアセット • フォント • パーティクル • シェーダー • ユニットモデル |
| オーディオ | 音楽 • サウンド |
| その他 | コンソールコマンド • チェックサム • Modの構造 • Mod制作ツール • トラブルシューティング |