コンテンツにスキップ

ロジック設定パターン集 (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: on_complete: actions: # 既読なら省略版へ - type: jump_to scene_id: scene_short condition: has_seen: ["scene_long"] # 未読なら詳細版へ - type: jump_to scene_id: scene_long
# 詳細版
- id: scene_long
title: "詳しい説明"
dialogue:
- text: "これは長い説明です..."
on_complete:
actions:
- type: jump_to
scene_id: scene_next
# 省略版
- id: scene_short
title: "省略版"
dialogue:
- text: "はい、例の件ですね。"
on_complete:
actions:
- type: jump_to
scene_id: 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分後に爆発する」パターンです。 タイマー開始 (start_timer) アクションを使用します。

スイッチ起動シーンの **完了時のアクション** で設定します。
1. 「**タイマー開始 (Timer)**」を選択
2. **制限時間**: `3` 分
3. **時間切れ時のアクション**: 「シーン移動」→「爆発シーン」
これで、スイッチ起動シーンを完了した時点から3分のカウントダウンが開始されます。
時間切れになると、自動的に爆発シーンへ強制移動します。
```yaml # スイッチ起動シーン - id: scene_switch_on title: "時限爆弾のスイッチ" on_complete: actions: - type: start_timer timer: duration: 3 # 3分後 on_timeout: actions: - type: jump_to scene_id: scene_explosion - type: jump_to scene_id: scene_next # 通常の次シーン
# 時間切れ時に表示されるシーン
- id: scene_explosion
title: "爆発!"
# ...
```

「爆弾を解除したら、カウントダウンを止める」パターンです。 タイマー停止 (cancel_timer) アクションを使用します。

爆弾解除シーンの **完了時のアクション** で設定します。
1. 「**タイマー停止 (Cancel)**」を選択
2. 続けて「**シーン移動 (Jump)**」でクリア画面へ移動
これで、解除シーンを完了した時点でカウントダウンが停止します。
```yaml # 爆弾解除シーン - id: scene_defuse title: "爆弾解除" dialogue: - narrator: "配線を切った……間に合った!" on_complete: actions: - type: cancel_timer # タイマーを停止 - type: jump_to scene_id: scene_ending_success
# クリア画面
- id: scene_ending_success
title: "脱出成功"
on_complete:
actions:
- type: game_clear
game_clear:
label: "生還者"
next_action: back_to_top
```

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

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