character.jsonについて

character.json は、キャラクターそのもの(表示名・性別・恋愛対象・立ち絵・初期ステータス・アンロック・エンディング等)を定義します。

ページ概要

  • 対象ファイル: character.json
  • 役割: キャラクターのプロフィール、恋愛対象設定、立ち絵、初期ステータス、アンロック条件、CG/BGMギャラリーなどを定義します。
  • どこで使われるか: キャラクター選択/一覧表示、イベント実行時の表示(立ち絵/名前/CG/BGM解決)、バリデーション(検証)時
  • 最小構成: このページの「最小構成(コピペ用)」
  • よくあるミス: このページの「よくあるミス」

最小構成(コピペ用)

{
  "id": "my_char",
  "family_name_ja": "山田",
  "given_name_ja": "花子",
  "family_name_en": "Yamada",
  "given_name_en": "Hanako",
  "age": 17,
  "description_ja": "説明",
  "description_en": "Description",
  "gender": "female",
  "relationship_type": {
    "male": "romance",
    "female": "friendship"
  },
  "portraits": {
    "spring": {
      "casual": {
        "normal": "portraits/spring/casual/normal.png"
      }
    }
  },
  "initial_stats": {
    "male": { "affection": 0, "intimacy": 0, "relationship": "acquaintance" },
    "female": { "affection": 0, "intimacy": 0, "relationship": "acquaintance" }
  },
  "stat_ranges": {
    "affection": { "min": -100, "max": 100 },
    "intimacy": { "min": -100, "max": 100 }
  },
  "unlock_conditions": {
    "male": null,
    "female": null
  }
}

最重要ポイント

  • 必須立ち絵: spring.casual.normal は必ず用意してください(ないとエラーになります)。
  • 性別ごとの項目: relationship_typeinitial_statsmale/female の両方が必須です。

id(キャラクターID)

イベントスクリプトの character 参照で使うため、一度決めたら基本的に変えないのが安全です。

名前・説明文

基本フィールド

{
  "family_name_ja": "山田",
  "given_name_ja": "花子",
  "family_name_en": "Yamada",
  "given_name_en": "Hanako",
  "description_ja": "明るく元気な女の子。",
  "description_en": "A cheerful and energetic girl."
}

変数プレースホルダーの使用

名前や説明文では、プレイヤー名やゲーム状態変数を埋め込めます。

{
  "family_name_ja": "{{player.family_name}}",
  "given_name_ja": "{{var.custom_nickname}}",
  "description_ja": "{{player.given_name}}の幼馴染。一緒に過ごした日数は{{var.days_together}}日。",
  "description_en": "{{player.given_name}}'s childhood friend. We've spent {{var.days_together}} days together."
}

使えるプレースホルダー

  • {{player.*}}: プレイヤー名(given_name, family_name, full_name, nickname など)
  • {{var.*}}: ゲーム状態変数(イベントで設定した変数を参照)

詳細は 変数とconditional を参照してください。

性別・恋愛対象

gender

"gender": "female"

relationship_type(性別ごと)

relationship_type は「プレイヤー性別ごとに、そのキャラが恋愛対象かどうか」を表します。

"relationship_type": {
  "male": "romance",
  "female": "friendship"
}

target_player_gender(任意・推奨)

target_player_gender を指定すると、このキャラクターが選択可能になる主人公の性別を制限できます。未指定の場合は全性別で選択可能です。恋愛対象キャラでは混乱防止のため指定を推奨します。注意: 空配列([])は誰の性別でも選択不可になるため非推奨です。

"target_player_gender": ["male"]

立ち絵(portraits)

必須: spring / casual / normal の1枚が必須です(バリデーションエラー回避のため)。

"portraits": {
  "spring": {
    "casual": {
      "normal": "portraits/spring/casual/normal.png"
    }
  }
}

詳しくは 立ち絵について を参照してください。

初期ステータス(initial_stats)

プレイヤー性別ごとに、初期値と関係性を持ちます。

relationship の有効値(5段階): dislike, acquaintance, friend, bestFriend, dating。初対面・知り合い程度の初期値には acquaintance を指定します(stranger は廃止済みで使用できません)。

"initial_stats": {
  "male": {
    "affection": 0,
    "intimacy": 0,
    "relationship": "acquaintance"
  },
  "female": {
    "affection": 0,
    "intimacy": 0,
    "relationship": "acquaintance"
  }
}

ステータス範囲(stat_ranges)

ステータスは範囲内に自動でクランプされます。

"stat_ranges": {
  "affection": {"min": -100, "max": 100},
  "intimacy": {"min": -100, "max": 100}
}

アンロック(unlock_conditions)

unlock_conditions は、主人公性別ごとに「このキャラクターが最初から選択可能か / 後からイベントで解放されるか」を定義します。

"unlock_conditions": {
  "male": null,    // または true: 最初からアンロック(選択可能)
  "female": false  // 最初はロック、イベントで解放
}

値の意味

  • null または true: 最初からアンロック(キャラクター選択画面に表示される)
  • false: 最初はロック、イベントで unlock_characters コマンドを使って解放

イベントでアンロックする方法

ロックされたキャラクター(false)は、他のキャラクターのイベントで unlock_characters を使って解放します。

{
  "scene_id": "introduction_event",
  "type": "dialogue",
  "speaker": "sakura_tanaka",
  "text_ja": "私の友達を紹介するね!",
  "unlock_characters": ["locked_character_id"]
}

日数やフラグによる条件付きアンロックは、イベントの required_conditions で実現します。詳細は イベント条件イベントスクリプト を参照してください。

CG/BGMギャラリー(cg_gallery / bgm_gallery)

イベント側では cgbgm にIDを指定して呼び出します。ギャラリーは 配列ではなくオブジェクト(map) です(キーがID)。

"cg_gallery": {
  "confession_rooftop": {
    "path": "cg/confession_rooftop.png",
    "title_ja": "屋上の告白",
    "title_en": "Confession on the Rooftop",
    "description_ja": "(任意)",
    "description_en": "(optional)"
  }
}

path は季節対応(マップ)も可能です。

"cg_gallery": {
  "ending_cg": {
    "path": { "spring": "cg/ending_spring.png", "default": "cg/ending.png" },
    "title_ja": "エンディング",
    "title_en": "Ending"
  }
}
"bgm_gallery": {
  "character_theme": {
    "path": "audio/character_theme.mp3",
    "title_ja": "テーマ",
    "title_en": "Theme",
    "loop": true,
    "volume": 0.7
  }
}

季節対応(マップ)も同様に使えます(path{ \"default\": \"...\", \"summer\": \"...\" } のように指定)。

theme_bgm(テーマBGM)

theme_bgmbgm_gallery のIDを指定すると、そのキャラクターの「テーマ曲」として扱われます(キャラクター選択画面などで使われます)。

"theme_bgm": "character_theme"

よくあるミス

  • 必須立ち絵がない: spring.casual.normal が未定義/ファイルが存在しない → portraits に登録し、実ファイルも配置する
  • cg_gallery を配列で書く: [{...}] 形式 → 正: { \"id\": { ... } }(キーがID)
  • relationship_type / initial_stats の性別キー不足: male または female が抜ける → 両方必須
  • 関係性(relationship)の値が無効: stranger など → 有効値はこのページの initial_stats.relationship の説明どおり

関連