コンテンツにスキップ
Stellaris v3.2 対応 翻訳

アノマリーのMOD制作

旧バージョンの資料

原文はゲームバージョン3.2向けです。現在のファイル構造やキーとは異なる可能性があります。

アノマリーは、調査船が天体を調査した際に発生する可能性がある特殊イベントです。次の2部分から成ります。

  • アノマリーカテゴリー: Stellaris/common/anomalies/
  • アノマリーイベント: Stellaris/events/

カテゴリーは調査船が天体を初めて調査した後に発見するアノマリーを定義し、状況ログ 状況ログの「アノマリー」タブへ表示されます。一方、アノマリーイベントは調査船が調査 アノマリー調査を終えたときに発生します。

出現メカニクス

アノマリーの出現システムはゲーム本体にハードコードされており、解析できるスクリプトファイルはありません。以下はゲームファイル、プレイヤーの経験、実機実験、一部の推測から分かる範囲をまとめたものです。

天体がゲーム内で初めて調査されるたび、アノマリーを出現させるか判定します。プレイヤー・AIを問わず、いずれかの帝国がその天体を初めて調査したときだけ発生します。基本確率は5%で、失敗するたびに0.5%ずつ増え、アノマリーを発見するとリセットされます。Stellaris/common/defines/00_defines.txtで変更できます。

ANOMALY_SPAWN_CHANCE           = 0.050 # 調査した惑星で発見が起こる確率
ANOMALY_SPAWN_CHANCE_INCREMENT = 0.005 # 失敗するたび次回確率へ加算する値

最初の判定に成功すると、有効なアノマリーカテゴリーを重み付きでランダム選択します。次の条件をすべて満たすカテゴリーだけが候補になります。

  1. 現在ほかの場所に存在していないこと。つまり、以前に出現したものが未調査で、まだアノマリーイベントを起こしていない状態ではないこと。
  2. 帝国種別(人間プレイヤーまたはAI)に許可されていること。should_ai_useとshould_ai_and_humans_useで決まります。前者の既定値はnoで、後者は前者を上書きします。
  3. max_once = yesなら、その調査船の所有国で一度も出現していないこと。既定値はnoで、yesなら帝国ごとに1回だけです。
  4. max_once_global = yesなら、そのゲーム中に一度も出現していないこと。既定値はnoで、yesならゲームごとに1回だけです。
  5. null_spawn_chanceが1でないこと。
  6. spawn_chance = {}の評価結果が0でないこと。
  7. on_success = {}内に、まだ発生可能なアノマリーイベントがあること。イベント側のmax_onceとmax_once_globalおよび発生履歴に依存します。既定値はそれぞれyesとnoです。

最後にnull_spawn_chanceによる判定を行います。この判定に成功すると、アノマリーは出現しません。既定値は0、つまり必ず通過します。出現が無効になった場合に別カテゴリーを再選択するかは不明です。ブラックホールなど特殊天体のカテゴリーを実際に希少にするため使われます。

この仕組みには3つの重要な帰結があります。

  1. 帝国がアノマリーを出現させて未調査のままにすると、同じカテゴリーはその調査が終わるまで再出現しません。1カテゴリーへ複数イベントを関連付けると、全イベントが調査待ちになります。調査前に帝国が滅亡すれば、そのゲーム中は関連イベントへ永久に到達できなくなる可能性があります。
  2. 未調査の天体にしか出現しないため、コンソールコマンドsurveyで独自カテゴリーを繰り返しテストするのは困難です。銀河の全天体を調査して全候補を出現させる可能性がありますが、その後は再出現を試せる未調査天体が残りません。
  3. 既定では、多くのカテゴリーはAIに奪われないようプレイヤー帝国だけに出現します。AIは代わりに、物語性は低いものの機能的なStellaris/common/anomalies/99_anomaly_categories_ai.txtのイベントを使います。

アノマリーカテゴリー

カテゴリーは状況ログ上の名称と説明、出現しやすさ、出現時期・場所の制限、調査後に起こるイベントを定義します。以前は2ファイルへ分かれていましたが、2.1で変更されました。完全な書式と設定項目はStellaris/common/anomalies/99_README_ANOMALIES.txtにも収録されています。

an_anomaly_category = {                # カテゴリーIDキー
    should_ai_use = yes/no              # AIが生成できるか。既定値no
    should_ai_and_humans_use = yes/no   # yesならAIと人間の両方。should_ai_useを上書き

    desc = "key"                        # 省略時は<カテゴリーキー>_desc
    desc = {                             # トリガー付き説明も可。最初の有効項目を使用
        trigger = { ... }                 # planetスコープ、from = ship
        text = "key"
    }
    picture = GFX_picture               # カテゴリー画面の画像
    level = int                         # 難易度1~10

    null_spawn_chance = 0.5            # 既定値0。選ばれても出現しない確率0.0~1.0
    max_once = yes/no                   # 既定値no。帝国ごとに1回
    max_once_global = yes/no            # 既定値no。ゲームごとに1回

    spawn_chance = {
        base = <数値>                     # 他の有効カテゴリーに対する相対重み。既定値0
        modifier = {
            add/factor = <数値>
            <条件>                          # planetスコープ、from = ship
        }
    }

    on_spawn = { <効果> }               # 出現直後に実行。root = planet、from = ship
                                          # コンソールで出した場合は実行されない

    on_success = {                       # random_listと同様にイベントを選択
        1 = {
            max_once = yes                  # 個別結果の既定値yes
            max_once_global = no            # 個別結果の既定値no
            modifier = {
                add/factor = <数値>
                <条件>                        # shipスコープ、from = planet
            }
            anomaly_event = <ID>            # shipスコープ、from = planet
        }
        1 = <イベントID>                 # 上記の短縮形
    }

    on_success = <イベントID>           # 結果が1つだけの場合の短縮形
}

ship_eventも使えますが、その場合はship、from = ship、fromfrom = planetという異なるスコープになります。

小惑星限定アノマリーの例

小惑星を調査したときだけ出現するアノマリーを作ります。MODのcommon/anomalies/へmy_asteroid_anomaly_category.txtを作り、まず次の骨格を用意します。

an_anomaly_category = {
    should_ai_use =
    desc =
    picture =
    level =
    null_spawn_chance =
    max_once =
    max_once_global =
    spawn_chance = { base = 1 }
    on_success = { }
}

カテゴリー名は一意にし、同じMODで作る全ファイル・オブジェクトへ共通接頭辞を付けるのが適切です。ここではmy_asteroid_categoryとします。物語イベントをAIに奪われないようshould_ai_use = no、状況ログの説明キーをmy_asteroid_category_desc、小惑星イベント画像をGFX_evt_asteroid_field、単純なアノマリーなので難易度を3にします。

null_spawn_chanceは希少化の必要がないため0です。複数の結果を見せたいのでmax_onceとmax_once_globalは両方noにします。出現重みの基本値を0にし、天体が小惑星なら1を加えることで小惑星だけへ出現させます。

on_successには3イベントを指定します。第1イベントの重みを2、ほかを1にします。同じプレイヤーが各結果を何度も見ないよう個別結果のmax_once = yes、他帝国では起こりうるようmax_once_global = noにします。

my_asteroid_category = {
    should_ai_use = no
    desc = "my_asteroid_category_desc"
    picture = GFX_evt_asteroid_field
    level = 3
    null_spawn_chance = 0
    max_once = no
    max_once_global = no

    spawn_chance = {
        base = 0
        modifier = { add = 1 is_asteroid = yes }
    }

    on_success = {
        2 = {
            max_once = yes
            max_once_global = no
            anomaly_event = my_asteroid_event.1
        }
        1 = {
            max_once = yes
            max_once_global = no
            anomaly_event = my_asteroid_event.2
        }
        1 = {
            max_once = yes
            max_once_global = no
            anomaly_event = my_asteroid_event.3
        }
    }
}

my_asteroid_event.1~.3は3つのアノマリーイベントIDです。

アノマリーイベント

アノマリーイベントは通常イベントと同じですが、カテゴリーから呼ばれ、必ず艦船イベントにする点が固有です。詳細はイベントのMOD制作を参照してください。

先ほどのmy_asteroid_event.1を実装します。コードはMODのevents/に、たとえばmy_asteroid_event.txtとして置きます。

  • スコープはroot = ship、from = planetです。
  • 自発的に起動しないため、必ずis_triggered_only = yesにします。
  • immediateでイベント対象の天体を整理することがよくあります。この例では工学研究または鉱物の埋蔵量を与えるため、先に小惑星上の既存埋蔵量を消します。
namespace = my_asteroid_event

ship_event = {
    id = my_asteroid_event.1
    title = "my_asteroid_event.1.name"
    desc = "my_asteroid_event.1.desc"
    picture = GFX_evt_mining_station
    show_sound = event_ship_bridge
    location = from
    is_triggered_only = yes

    immediate = {
        from = { clear_deposits = yes }
    }

    option = {
        name = "my_asteroid_event.1.a"
        from = { set_deposit = d_engineering_2 }
    }
    option = {
        name = "my_asteroid_event.1.b"
        from = { set_deposit = d_minerals_5 }
    }
}

出典: Stellaris Wiki — Anomalies modding(原文更新日: 2023年5月7日、版ID 74220)
翻訳日: 2026年8月31日 / 対応バージョン: 3.2
本ページは原文Wiki(CC BY-SA 3.0)の内容を翻訳した非公式ファン翻訳です。