差分

ナビゲーションに移動 検索に移動
18,032 バイト追加 、 月曜日 05:18
トリガーの日本語化(kagi)
{{Version|1.7}}
[[File:Trigger runner.png|alt=トリガーの真偽を確認するゲーム内ツールのスクリーンショット。複数のトリガーがfalseやtrueになっている様子を表示|thumb|trigger runner]]

※2025/10/6、英wikiよりkagi翻訳を通しました。機械翻訳なので一部不自然な日本語があるかもしれません。ぜひ編集してくれるとありがたいです。

トリガーは、それが使われるスコープに対してtrueかfalseを返す判定です。

たとえば、<code>is_ai = yes</code> はAIのキャラクターに対してはtrue、プレイヤーに対してはfalseを返します。

これはイベントのトリガーブロックで用いることで、プレイヤー向けのイベントを無効化する、といった使い方ができます。

値を比較するトリガーは、その値自体を返すこともできます。

例として、<code>add_gold = gold</code> は、そのキャラクターが現在所持している金額と同じだけのゴールドを増やします。

利用可能なコードトリガーの完全な一覧は、[[Triggers_list|triggers.log]] にあります。

ゲーム内でコンソールコマンド <code>script_docs</code> を実行し、Documents\Paradox Interactive\Crusader Kings III\logs に生成されるログを確認してください。

== トリガーブロック ==

トリガーはトリガー用のスクリプトブロックで使用します。

それらは、イベントの <code>trigger = { }</code> ブロックのように明示的にそう名付けられているか、あるいは意思決定の <code>is_shown = { }</code> や <code>is_valid = { }</code> のように、はい/いいえで答えられる問いの形になっています。

場合によっては、トリガー以外も受け付けるハイブリッド型のスクリプトブロックの中でトリガーが使われることもあります。

例: [[weight modifier]]
<pre>modifier = {
is_ai = yes
factor = 0
}</pre>
このブロックでは、<code>is_ai = no</code> はトリガーですが、<code>factor = 0</code> はオペレーターです。

=== アーリーアウト ===

ツールチップ化されている場合を除き、トリガーブロックは「アーリーアウト」の原則で動作します。

トリガーブロック全体をtrueにするには、中のすべてのトリガーがtrueである必要があります。「アーリーアウト」とは、ブロック内のいずれかのトリガーがfalseと評価された時点で、そのブロック内の残りのトリガーは評価されないことを意味します。

これはエラーの回避に役立ちます。

例: 次のトリガーブロックは、現在のキャラクタースコープの主配偶者が当人と同じ文化であるかを確認します。エラーを避けるため、最初にそのキャラクターにそもそも配偶者が「いる」かどうかを確認します。
<pre>trigger = {
exists = primary_spouse
culture = primary_spouse.culture
}</pre>
もし <code>exists = primary_spouse</code> がfalseなら、2つ目のトリガーは評価されません。

これはパフォーマンス最適化にも有用です。複数のトリガーを含むトリガーブロックでは、失敗しやすいものを先に置くことで、全体として評価するトリガーの数を大幅に減らせます。

例: このトリガーブロックは、現在のキャラクタースコープがプレイヤーであり、かつ独立した統治者であるかを確認します。
<pre>trigger = {
is_ai = no
is_independent_ruler = yes
}</pre>
このトリガーブロックをゲーム内の全キャラクターに対して年1回評価する場合、ほとんどのキャラクターはプレイヤーではないため、<code>is_ai = no</code> はほぼ常にfalseになり、2つ目のトリガーはほとんど評価されません。

=== 論理ブロック ===

トリガーブロックには複数のトリガーを含められます。デフォルトでは、すべてがtrueであればブロック全体がtrueになりますが、いくつかの論理ブロックによってその論理を操作できます。

==== AND ====

<pre>AND = {
is_ai = no
is_independent_ruler = yes
}</pre>

<code>AND</code> ブロックは、現在のキャラクターがプレイヤーであり、かつ独立した統治者である場合にtrueになります。

==== OR ====

<pre>OR = {
is_ai = no
is_independent_ruler = yes
}</pre>

<code>OR</code> ブロックは、現在のキャラクタースコープがプレイヤー「または」独立した統治者のいずれかである場合にtrueになります。

==== NOT/NOR/NAND ====

<pre>NOT = { has_title = title:k_france }</pre>

<code>NOT</code> ブロックは、現在のキャラクタースコープがフランス王国を保有していない場合にtrueになります。

曖昧さを避けるため、<code>NOT</code> には単一のトリガーのみを含めるべきです。複数のトリガーを扱う場合は、<code>NOR</code> や <code>NAND</code> を使うと意図が明確になります。

<pre>NAND = {
has_title = title:k_france
has_title = title:k_aquitaine
}</pre>

<code>NAND</code> ブロックは、現在のキャラクタースコープがフランス王国またはアキテーヌ王国のいずれか、もしくは両方とも保有していない場合にtrueになります。両方の称号を保有している場合はfalseです。

<pre>NOR = {
has_title = title:k_france
has_title = title:k_aquitaine
}</pre>

<code>NOR</code> ブロックは、現在のキャラクタースコープがフランス王国・アキテーヌ王国のいずれも保有していない場合にtrueになります。いずれかの称号を保有している場合はfalseです。

=== limit ブロック ===

<code>limit</code> ブロックは条件付きの効果やトリガーに使用します。

==== if/else_if ====

最も一般的な <code>limit</code> ブロックの使い方は、<code>if</code>/<code>else_if</code> 効果と組み合わせ、<code>limit</code> ブロックがtrueのときだけ効果を実行することです。

例: 現在のキャラクタースコープがプレイヤーであればゴールドを追加します。
<pre>if = {
limit = { is_ai = no }
add_gold = 100
}</pre>

==== 効果のリストビルダー ====

limit ブロックは、効果リストビルダーを制限するためにもよく使われます。

例: 現在のキャラクタースコープの子供が男性である場合にゴールドを追加します
<pre>every_child = {
limit = { is_male = yes }
add_gold = 100
}</pre>

注意: <code>any_X</code> リストビルダーは <code>limit</code> ブロックを「使用しません」。

==== trigger_if/trigger_else_if/trigger_else ====

<code>trigger_if</code> は、<code>limit</code> ブロックがtrueのときにのみトリガーをチェックできます。

例: 現在のキャラクタースコープがAIでない場合に、独立統治者であるかどうかをチェックします
<pre>trigger_if = {
limit = { is_ai = no }
is_independent_ruler = yes
}</pre>

条件付きトリガーは、ツールチップ付きのトリガーブロックで、可読性とエラー回避の両面からよく使われます。ツールチップ化されている場合、アーリーアウトは適用されないためです。

例: このトリガーは、ツールチップ化されていると <code>primary_spouse</code> が存在しないときにエラーを投げます。
<pre>trigger = {
exists = primary_spouse
culture = primary_spouse.culture
}</pre>
一方、こちらは <code>limit</code> ブロックがfalseならトリガーが評価されないため、エラーを投げません。
<pre>trigger_if = {
limit = { exists = primary_spouse }
culture = primary_spouse.culture
}</pre>

== トリガーの文法 ==

=== スコープ比較 ===

スコープ比較は、<code>=</code> の左右にスコープがある文です。両方のオブジェクトが同一であればtrue、そうでなければfalseです。

スコープ比較で使えるスコープは、データベーススコープ、イベントターゲット、保存済みスコープ、または変数です。

注意: 両方のスコープが同一のオブジェクトでなくても、同じスコープ種別である必要はあります。

例: このトリガーは、フランス王国の保有者が、現在のキャラクタースコープの父親と同一のキャラクターかどうかをチェックします。
<pre>title:k_france.holder = father</pre>

スコープ比較では、両側が有効である必要があります。この例では、現在のキャラクターに父親が存在し、かつフランス王国が創設されている必要があります。そうでないと、比較はエラーログにエラーを出すため、比較の前に両スコープの存在をどこかで確認しておく必要があります。

比較の左辺のスコープの存在確認自体は、<code>?=</code> を使って行えます:
<pre>title:k_france.holder ?= father</pre>

=== 値の比較 ===

値の比較は、2つの数値を、
* 等号 <code>=</code>
* 比較記号
** より大きい <code>></code>
** 以上 <code>>=</code>
** より小さい <code><</code>
** 以下 <code><=</code>
のいずれかで比較する文です。比較が数学的に正しければtrueになります。

値の比較で使える数値は以下のとおりです:
* 数値そのもの
* 名前付きの値
* [[script_value]]
* 保存済みスコープの値
* 数値を格納した [[variable]]

例: このトリガーは、現在のキャラクタースコープのゴールドが1000より大きいかをチェックします。
<pre>gold > 1000</pre>

=== コードトリガー ===

コードトリガーにはあらかじめ決められた構文があり、通常は動作に特定のスコープ種別のコンテキストを必要とします。

コードトリガーにはいくつかの形式があります:

==== 基本トリガー ====

基本トリガーは、その記述が期待される肯定/否定の結果を持つかどうかをチェックします。

例: このトリガーは、現在のキャラクタースコープがAI「ではない」場合にtrueになります。
<code>is_ai = no</code>

==== 単純トリガー ====

単純トリガーは、<code>=</code> の右辺に与えられる引数に応じてtrueかどうかをチェックします。

引数は次のいずれかです:

* スコープ
例: このトリガーは、現在のキャラクタースコープが保存済みスコープ <code>scope:actor</code> の封臣かどうかをチェックします。
<pre>is_vassal_of = scope:actor</pre>

* データベースキー
例: このトリガーは、現在のキャラクタースコープが <code>infirm</code> キーで定義された特性を持つかどうかをチェックします。
<pre>has_trait = infirm</pre>

==== 複合トリガー ====

複合トリガーは、スクリプトブロック内で複数のパラメーターを使用します。パラメーターには、スコープ、データベースキー、数値、フラグ値などが使えます。

例: このトリガーは、現在のキャラクタースコープが、上位者を標的とした暗殺(murder)タイプの進行中の策謀を持っているかをチェックします。
<pre>is_scheming_against = {
target = liege
type = murder
}</pre>

一部のコードトリガーには、単純形と複合形の両方が存在します。

==== インライン複合トリガー ====

一部の複合トリガーは、値を返す1行表記で書くことができます。

これは引用符で囲み、追加の引数を括弧で渡します。

たとえば、スクリプト値は次のようになります:<syntaxhighlight lang="c">
distance_to_liege_sval = {
  value = "realm_to_title_distance_squared(liege.capital_county)"
}
</syntaxhighlight>この機能は文書化されておらず、すべてのトリガーで動作するわけではありません。テストから、説明文に <code>Traits: <, <=, =, !=, >, >=</code> の一文があるトリガーのみをサポートしているようです。

トリガーに複数の引数が必要な場合、たとえば特性とトラックを必要とする <code>has_trait_xp</code> のようなものは、<code>|</code> で引数をつなげます。

<code>value = "has_trait_xp(lifestyle_traveler|danger)"</code>

現時点では、この複数引数の構文が確認されているのはこのトリガーのみです。

=== scripted_triggers ===

scripted_triggers は、スクリプトの可読性を高め重複を避けるために、複数のトリガーの組み合わせを単一の記述に置き換えられるマクロです。

通常は <code>common/scripted_triggers</code> に定義され、トリガーが許されるあらゆる場所で使用できます。

ときにはイベントファイル([[events]] を参照)内でローカルに定義され、その場合は同じファイル内のイベントでのみ使用できます。

==== 基本的な scripted_triggers ====

単純な scripted_triggers は、あらかじめ定められたトリガー集合が全体としてtrue(<code>= yes</code>)かfalse(<code>= no</code>)かをチェックします。

例: あるキャラクターが裕福な成人の独立統治者かどうかを繰り返しチェックするために、次のトリガー集合を使っているとします:
<pre>is_independent_ruler = yes
is_adult = yes
gold > 1000</pre>
同じトリガー集合を各所で繰り返し書く代わりに、scripted_trigger として定義できます:
<pre>is_rich_adult_independent_ruler = {
is_adult = yes
is_independent_ruler = yes
gold > 1000
}</pre>

そして、その集合をチェックしたい場所では、次の1文に置き換えられます:
<code>is_rich_adult_independent_ruler = yes</code>

否定形を使う
<pre>is_rich_adult_independent_ruler = no</pre>
のは、<code>NOT</code> 論理ブロックを使うのと同等です
<pre>NOT = { is_rich_adult_independent_ruler = yes }</pre>

scripted_triggers はさまざまな文脈で使用されるため、定義内で <code>root</code> や <code>prev</code> のような曖昧なイベントターゲットの使用は避けることが推奨されます。

==== 複合的な scripted_triggers ====

scripted_triggers には、引数を渡すためのリテラルテキスト置換を行う複合形もあります。

たとえば、現在のキャラクタースコープがフランス王の封臣であり、かつその王と血縁関係にあることをチェックする次のトリガー集合があるとします:

<pre>is_vassal_of = title:k_france.holder
is_close_family_of = title:k_france.holder</pre>
このトリガー集合を scripted_trigger として定義できますが、<code>title:k_france.holder</code> を固定で参照する代わりに、定義では大文字で2つの <code>$</code> で囲った引数を使います:
<pre>is_related_vassal_of = {
is_vassal_of = $TARGET$
is_close_family_of = $TARGET$
}</pre>
使用時には、<code>$</code> を除いた同名で、期待される引数を指定します:
<pre>is_related_vassal_of = {
TARGET = title:k_france.holder
}</pre>

この形式では、scripted_trigger 内の <code>$TARGET$</code> は、評価の「前」に与えられた引数で文字通り置換されます。

== 論理オペレーター/トリガー ==
これらのトリガーは基本的な論理機能を提供します。
{| class="wikitable sortable" width="100%"
! width="15%" | Name
! width="15%" | Description
! width="40%" | Usage
! width="10%" | Traits
! width="10%" | Supported Scopes
! width="10%" | 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> }
|
|
|
|}

== 参考文献 ==

{{Modding navbox}}
[[Category:Modding]]
98

回編集

案内メニュー