変数とconditional

ページ概要

  • 対象ファイル: events.json, events/*.json
  • 役割: 変数(variables)で「覚えておく値」を保存し、イベント発生条件(required_conditions.variables)や conditional で分岐に使います。
  • どこで使われるか: イベント実行時(変数の更新)、イベント発火判定時/条件分岐時(変数の評価)
  • 最小構成: このページの各例(コピペ可能)
  • よくあるミス: このページの「設計のコツ」

ゲーム状態の変数(variables)

変数はキーと値の辞書で、イベント中のシーンや選択肢から設定できます。既存キーは上書きされます。

設定(シーン/選択肢)

{
  "scene_id": "s01",
  "type": "dialogue",
  "character": "player",
  "text_ja": "(覚えておこう)",
  "text_en": "(I should remember this.)",
  "variables": {
    "my_char_route": "A",
    "visited_cafe_count": 1
  }
}

参照(events.json の required_conditions.variables)

イベント発生条件で変数を参照できます(exists / not_exists / 比較など)。

"required_conditions": {
  "variables": {
    "visited_cafe_count": { "operator": ">=", "value": 3 },
    "my_char_route": { "operator": "==", "value": "A" }
  }
}

exists / not_exists の例:

"required_conditions": {
  "variables": {
    "my_char_route": { "operator": "exists" }
  }
}

日数と変数を一致させる(day_equals_variable)

「指定した変数(int)と同じ日だけ発生」のような用途に使えます。

"required_conditions": {
  "day_equals_variable": "my_char_promise_cafe_day"
}

conditional シーン(イベント内分岐)

イベントスクリプト内で、フラグ・ステータスなどに応じて次シーンを自動決定します。

{
  "scene_id": "s10",
  "type": "conditional",
  "branches": [
    {
      "conditions": { "required_flags": ["flag_a"] },
      "next_scene": "s11_a"
    },
    {
      "conditions": {
        "variables": {
          "my_char_route": { "operator": "==", "value": "A" }
        }
      },
      "next_scene": "s11_b"
    },
    {
      "conditions": {
        "language": ["ja"]
      },
      "next_scene": "s11_ja"
    }
  ],
  "default_next_scene": "s11_default"
}

テキストの変数展開({{ ... }})

会話テキスト、話者名、キャラクター情報などで、プレイヤー名やゲーム状態変数を差し込めます。

プレイヤー名変数

{{player.*}} でプレイヤー名を展開できます。

{
  "scene_id": "s20",
  "type": "dialogue",
  "character": "my_char",
  "text_ja": "おはよう、{{player.given_name}}!",
  "text_en": "Good morning, {{player.given_name}}!"
}
プレースホルダー 置換内容 備考
{{player.full_name}} フルネーム(JA: 「姓 名」 / EN: 「Given Family」) player.getFullName(locale) に従います
{{player.family_name}} -
{{player.given_name}} -
{{player.nickname}} ニックネーム(未設定なら名) nickname ?? given_name
{{player.family_name_san}} JA: 「姓さん」 / EN: 「Mr./Ms. 姓」 EN の敬称は player.gender によって Mr./Ms. が自動選択されます
{{player.given_name_kun}} JA: 「名くん」 / EN: 「名」 英語では「くん」を付けません
{{player.given_name_chan}} JA: 「名ちゃん」 / EN: 「名」 英語では「ちゃん」を付けません
{{player.nickname_kun}} JA: 「ニックネームくん」 / EN: 「ニックネーム」 未設定なら名で代替します
{{player.nickname_chan}} JA: 「ニックネームちゃん」 / EN: 「ニックネーム」 未設定なら名で代替します

注意(よくあるハマり)

  • 空白は入れない: 現状は文字列の完全一致で置換しているため、{{ player.given_name }} のように空白を入れると置換されません({{player.given_name}} の形にしてください)。
  • 一覧以外は置換されない: {{player.age}} など未対応キーは、そのままテキストに残ります。

ゲーム状態変数の埋め込み({{var.*}})

イベントで設定した変数も、テキスト内で参照できます。

{
  "scene_id": "s30",
  "type": "dialogue",
  "character": "my_char",
  "text_ja": "あのカフェには{{var.visited_cafe_date}}日に行ったね!",
  "text_en": "We've been to that cafe {{var.visited_cafe_date}} days!"
}

変数プレースホルダーの特徴

  • 存在しない変数を参照した場合は、空文字列になります
  • 数値型の変数も自動的に文字列に変換されます
  • キャラクター名にも使えます: character.jsonfamily_name_ja などにも {{var.*}}{{player.*}} を記述できます
  • 話者名にも使えます: イベントスクリプトの name_display でも使用できます

使用例

話者名への応用:

{
  "scene_id": "s40",
  "type": "dialogue",
  "character": "my_char",
  "name_display": "{{var.current_relationship}}",
  "text_ja": "今日も良い天気だね!",
  "text_en": "Nice weather today!"
}

例えば、current_relationship 変数に「恋人」「友達」「クラスメイト」などを入れておけば、関係性に応じて話者名を動的に変更できます。

キャラクター名への応用:

{
  "family_name_ja": "{{player.family_name}}",
  "given_name_ja": "{{var.custom_nickname}}",
  "description_ja": "{{player.given_name}}の幼馴染。一緒に過ごした日数は{{var.days_together}}日。"
}

キャラクターの名前自体を動的に変えたり、説明文に変数を埋め込むことができます。

設計のコツ

  • 命名は衝突しないように: <characterId>_ の接頭辞を付ける
  • 分岐は上から評価: conditional.branches は上から最初に一致したものが採用されます
  • 数値は数値で: 比較演算(>= など)は、変数値と value が数値のときだけ有効です

関連