コンテンツにスキップ

ロジック設定パターン集 (Tips)

import { Tabs, TabItem } from ‘@astrojs/starlight/components’;

シナリオ制作でよくある「やりたいこと」別に、条件判定 (Condition)アクション を使った実装例を紹介します。

シーンの出現条件を工夫するパターンです。

「宝箱を開ける」など、二度目は表示したくないイベントです。

宝箱シーンの **開始条件** に以下を設定します。
* 「条件を追加」→「**既読/未読**」
* 「**未読 (Not Seen)**」を選択
* 対象シーン: **自分自身のシーンID** を選択
- id: scene_treasure title: "宝箱" condition: # 自分自身を見たことがない場合のみ表示 has_not_seen: ["scene_treasure"]

「初回は詳しい説明をするが、2回目は省略する」パターンです。

2つのシーンを用意します。
**シーンA (詳細版)**
* 開始条件: 「**シーンAをまだ見ていない**」 (hasNotSeen: scene_A)
* 完了アクション: 次のシーンへ
**シーンB (簡易版)**
* 開始条件: 「**シーンAを見たことがある**」 (hasSeen: scene_A)
* 完了アクション: 次のシーンへ
# 分岐判定用シーン (Router) - id: scene_check type: story dialogue: - text: "..." on_complete: rules: # 既読なら省略版へ - if: has_seen: ["scene_long"] do: - type: jump_to scene_id: scene_short # 未読なら詳細版へ (デフォルト) - do: - type: jump_to scene_id: scene_long
# 詳細版
- id: scene_long
title: "詳しい説明"
dialogue:
- text: "これは長い説明です..."
on_complete:
next_scene: scene_next
# 省略版
- id: scene_short
title: "省略版"
dialogue:
- text: "はい、例の件ですね。"
on_complete:
next_scene: scene_next

「変数」や「複数条件」を使ったパターンです。

複数条件での解放 (Multi-condition)

Section titled “複数条件での解放 (Multi-condition)”

「3人の村人全員と話すと、村長が出てくる」パターンです。

村長のシーンの **開始条件** に、3つの条件を追加します。
1. 条件追加 → 既読 → 「村人A」
2. 条件追加 → 既読 → 「村人B」
3. 条件追加 → 既読 → 「村人C」
※デフォルトで「すべての条件を満たす (AND)」として扱われます。
- id: scene_chief title: "村長との会話" condition: # 配列内の条件はすべてAND(かつ)で判定されます has_seen: - "villager_a" - "villager_b" - "villager_c"

「特定のスポットを3箇所以上回る」パターンです。 変数をカウンターとして使います。

1. **各スポットのシーン**: * 完了アクション: 「ポイント操作」 * 変数 `stamp_count` に `1` を加算。 * (不正防止のため、各スポットは「一度きり」設定にすると良いでしょう)
2. **景品交換所のシーン**:
* 開始条件: 「ポイント」
* 変数 `stamp_count` が `3` `以上`
# スポットA (B, Cも同様) - id: spot_a on_complete: actions: - type: point_modify point: { name: "stamp_count", amount: 1 }
# ゴール
- id: scene_goal
condition:
points: [{ name: "stamp_count", operator: ">=", value: 3 }]

GPSや時間を活用した、少し特殊なパターンです。

「古地図を手に入れたら、地図上に隠しダンジョンが表示される」パターンです。 場所データ (locations) 側の設定を使用します。

**ロケーション編集画面**で行います。
1. 隠し場所にしたいロケーションを選ぶ。
2. 「**公開条件 (Reveal Condition)**」を設定する。
3. 条件で「**既読**」→「古地図入手シーン」を指定する。
これ設定すると、条件を満たすまでは地図上にマーカー自体が表示されなくなります。
(※「隠しスポット(Secret)」機能とは異なり、マーカーそのものを隠します)
locations: - id: hidden_dungeon name: "隠しダンジョン" lat: 35.12345 lng: 139.12345
# この条件を満たすまで地図に表示されない
reveal_condition:
has_seen: ["scene_get_map"]
# ※注意: 手動で記述する場合、空の項目は省略可能です(例: actions: [] は不要)。

「時限爆弾のスイッチを入れてから、3分後に爆発する」パターンです。 「経過時間条件」を使用します。

爆発シーン (Bad End) に設定します。
1. **時間・期間条件** を開く。
2. 「**経過時間 (Timer)**」を設定。
3. **トリガー**: 「スイッチ起動シーン」
4. **最小時間**: `3` 分
これで、スイッチ起動から3分経過すると、現在地に「爆発」シーンが出現します。
(※プレイヤーがその場所を開く必要がありますが、強制イベントとして実装される場合もあります)
- id: scene_explosion title: "爆発!" conditions: elapsed_time: trigger_scene_id: "scene_switch_on" min_minutes: 3 # max_minutesを設定しない=3分以降ずっと有効

クリア実績を分けたり、エンディング後に飛ばすURLを変えたりする方法です。

エンディングシーンの **完了・分岐アクション** で設定します。 (条件が厳しい順に並べるのがコツです)
1. **アクション1 (完全クリア)**
* 条件: 変数 `score` >= 100
* 実行: 「**ゲームクリア**」
* 称号: 「伝説の探偵」
* 完了後: 「URLを開く」 (特典サイトへ)
2. **アクション2 (通常クリア)**
* 条件: なし (その他すべて)
* 実行: 「**ゲームクリア**」
* 称号: 「見習い探偵」
* 完了後: 「トップに戻る」
on_complete: rules: # 完全クリア - if: points: [{ name: "score", operator: ">=", value: 100 }] do: - type: game_clear game_clear: label: "伝説の探偵" next_action: open_url url: "https://example.com/secret"
# 通常クリア
- do:
- type: game_clear
game_clear:
label: "見習い探偵"
next_action: back_to_top