# StoryTeller 互動故事系統

{% hint style="info" %}

## 製作這個功能的目的，是因為小時候玩的抉擇叢書，明明它好像一本小說，卻可以讓自己選擇行動。長大後還是念念不忘，希望有一天自己也可以再玩到這種類型的遊戲。

{% endhint %}

## 快速開始

#### 基本指令

```bash
# 啟動劇本
.st start <alias|title> [alone|all|poll
 x]  
 
 # 查看可玩劇本清單
.st list     

# 遊戲控制
.st pause                                   # 暫停目前進行中的劇本
.st continue [runId]                        # 繼續暫停中的劇本
.st end                                     # 結束目前劇本
```

#### 遊戲進行

```bash
.st goto <page>                             # 跳至指定頁面/選項
.st set <var> <value>                       # 設定變數
```

### 詳細功能說明

#### 1. 劇本管理

**新增和更新劇本**

**Discord 專用功能：**

```bash
# 以附件方式上傳及下載
.st import <alias> [title]                  # 上傳檔案以新增劇本
.st update <alias> [title]                  # 上傳檔案以覆蓋既有劇本
.st export <alias>                      # 將劇本以私訊傳送文字檔
```

**支援的檔案格式：**

* `.json` - 完整的 StoryTeller 格式
* `.txt` - RUN\_DESIGN 語法格式

**劇本管理指令**

```bash
.st my [alias]                              # 查看自己新增之劇本統計
.st mylist                                  # 顯示自己所有新增之劇本清單
.st list <alias>                            # 顯示該劇本簡介與可用資訊
.st delete <alias>                          # 刪除自己擁有的劇本
.st verify <alias>                          # 檢查劇本內容格式是否正確
```

#### 2. 權限管理

```bash
.st allow <alias> AUTHOR                    # 僅作者本人可在任何地方啟動（預設）
.st allow <alias>                           # 在本群組/頻道允許啟動
.st allow <alias> <groupId...>              # 允許指定之群組/頻道啟動（可多個）
.st allow <alias> all                       # 任何人皆可啟動（公開）
```

#### 3. 遊戲設定

```bash
.st edit alone|all|poll x                   # 發起者可切換參與權限
```

**參與權限選項：**

* `alone` - 僅發起者可互動
* `all` - 任何人可參與
* `poll x` - 啟用 Discord 投票 x 分鐘（預設 3，僅 Discord）

#### 4. 狀態檢視

```bash
.st game                                    # 顯示目前運行與暫停中的遊戲
.st debug                                   # 顯示詳細的除錯資訊
```

### RUN\_DESIGN 語法

StoryTeller 支援 RUN\_DESIGN 語法，這是一種簡潔的文字格式來定義互動故事。

#### 基本語法結構

```txt
[meta] title "故事標題"
[intro] 故事簡介內容

[player_var] name "請輸入角色名稱" "範例：小明"
[stat_def] hp 1 20 "生命值"
[var_def] gold 0 1000 "金幣"

[label] 0
[title] 開始頁面
[text] 歡迎來到這個故事世界！
[text|if=hp>10] 你的生命值看起來不錯。
[set] gold=100
[random] 50%
[text] 你發現了一些寶藏！

[choice]
-> 繼續前進 | 1
-> 休息一下 | 2 | if=hp<5
-> 結束遊戲 | END

[label] 1
[title] 第二頁
[text] 你繼續前進了...
[ending]
[text] 恭喜你完成了故事！
```

#### 語法元素說明

**元數據**

* `[meta] title "標題"` - 設定故事標題

**簡介**

* `[intro] 內容` - 設定故事簡介

**玩家變數**

* `[player_var] key "提示文字" "預設值"` - 定義玩家需要設定的變數

**統計值定義**

* `[stat_def] key min max "標籤"` - 定義遊戲統計值（如生命值、攻擊力等）

**變數定義**

* `[var_def] key min max "標籤"` - 定義遊戲變數

**頁面結構**

* `[label] id` - 定義頁面 ID
* `[title] 標題` - 設定頁面標題
* `[text] 內容` - 顯示文字內容
* `[text|if=條件] 內容` - 條件性文字
* `[text|speaker=角色] 內容` - 指定說話角色

**變數操作**

* `[set] key=value` - 設定變數值
* `[set|if=條件] key=value` - 條件性設定變數

**隨機事件**

* `[random] 百分比%` - 設定隨機觸發機率

**選項**

* `[choice]` - 開始定義選項
* `-> 選項文字 | 目標頁面 | if=條件 | stat=統計變化`

**結局**

* `[ending]` - 標記為結局頁面

### 變數系統

#### 變數類型

1. **玩家變數** (`playerVariables`)
   * 由玩家設定的角色相關資訊
   * 例如：角色名稱、職業等
2. **統計值** (`stats`)
   * 遊戲中的數值屬性
   * 例如：生命值、攻擊力、防禦力等
3. **遊戲變數** (`variables`)
   * 故事進行中的狀態變數
   * 例如：金幣數量、任務進度等

#### 變數操作

```bash
.st set name 小花          # 設定角色名稱
.st set hp 12             # 設定生命值
.st set gold 500          # 設定金幣數量
```

#### 條件表達式

支援多種條件判斷：

```txt
[text|if=hp>10] 你的生命值很高
[text|if=gold>=100] 你有足夠的金幣
[text|if=name=="小明"] 你好，小明！
[text|if=hp>5 && gold>50] 你的狀態不錯
```

#### 骰子系統

支援骰子表達式：

```txt
[text] 你投出了 {2d6} 點傷害
[text] 你的攻擊力是 {1d20+5}
```

### 平台特定功能

#### Discord 專用功能

1. **投票系統**

   ```bash
   .st start story poll 5    # 啟用 5 分鐘投票
   .st edit poll 3          # 切換為 3 分鐘投票
   ```
2. **檔案上傳**
   * 支援拖拽上傳 `.json` 或 `.txt` 檔案
   * 自動解析和驗證檔案格式
3. **私訊功能**
   * 可將劇本以私訊方式傳送給用戶

#### 跨平台相容性

* **Line/Telegram/WhatsApp**: 支援基本功能，不支援投票和檔案上傳
* **Discord**: 支援所有功能，包括投票、檔案上傳等

### 限制和規則

#### 檔案大小限制

* 最大上傳檔案：1MB
* 最大頁數：400 頁
* 每段文字最大長度：500 字

#### 用戶限制

根據 VIP 等級有不同的限制：

| VIP 等級 | 劇本數量限制 | 同時進行遊戲數 |
| ------ | ------ | ------- |
| 0      | 3      | 3       |
| 1      | 10     | 10      |
| 2+     | 100    | 100     |

#### 權限系統

1. **AUTHOR\_ONLY**: 僅作者可啟動
2. **GROUP\_ONLY**: 僅指定群組可啟動
3. **ANYONE**: 任何人可啟動

### 最佳實踐

#### 新增劇本

1. **規劃故事結構**
   * 先設計主要情節和分支
   * 確定結局數量和多樣性
2. **變數設計**
   * 合理設計統計值範圍
   * 提供有意義的玩家變數
3. **測試和驗證**
   * 使用 `.st verify` 檢查格式
   * 測試所有分支和結局

#### 遊戲進行

1. **角色設定**
   * 鼓勵玩家設定豐富的角色資訊
   * 根據角色資訊提供個性化內容
2. **進度管理**
   * 適時使用暫停功能
   * 記錄重要的遊戲狀態
3. **社群互動**
   * 在 Discord 中使用投票功能增加參與感
   * 鼓勵玩家分享遊戲體驗

### 故障排除

#### 常見問題

1. **找不到劇本**
   * 檢查 alias 是否正確
   * 確認權限設定
2. **無法啟動遊戲**
   * 檢查是否已達同時進行遊戲數限制
   * 確認劇本格式是否正確
3. **變數設定失敗**
   * 檢查變數名稱是否正確
   * 確認數值範圍是否合理

#### 除錯工具

```bash
.st debug    # 顯示詳細的遊戲狀態資訊
```

### 範例劇本

#### 簡單冒險故事

```txt
[meta] title "森林冒險"
[intro] 你是一個勇敢的冒險者，正在探索神秘的森林。

[player_var] name "請輸入你的角色名稱" "範例：亞瑟"
[stat_def] hp 10 20 "生命值"
[stat_def] strength 1 10 "力量"

[label] 0
[title] 森林入口
[text] 歡迎，{name}！你來到了神秘的森林入口。
[text] 你的生命值：{hp}，力量：{strength}
[choice]
-> 進入森林 | 1
-> 先休息一下 | 2 | if=hp<15
-> 離開 | END

[label] 1
[title] 森林深處
[text] 你進入了森林深處，發現了一個古老的遺跡。
[random] 30%
[text] 突然，一隻野獸出現了！
[set] hp=hp-5
[choice]
-> 戰鬥 | 3 | if=strength>5
-> 逃跑 | 4
-> 投降 | END

[label] 2
[title] 休息
[text] 你決定先休息一下，恢復了一些體力。
[set] hp=hp+5
[choice]
-> 現在進入森林 | 1
-> 繼續休息 | 2

[label] 3
[title] 戰鬥勝利
[text] 你勇敢地擊敗了野獸！
[set] strength=strength+1
[ending]
[text] 恭喜你完成了冒險！

[label] 4
[title] 逃跑
[text] 你選擇了逃跑，雖然安全但錯過了寶藏。
[ending]
[text] 你安全離開了森林，但沒有獲得任何獎勵。
```

這個範例展示了 StoryTeller 的基本功能，包括變數設定、條件判斷、隨機事件和多重結局。

### 更新日誌

#### 最新功能

* 支援 RUN\_DESIGN 語法
* Discord 投票系統
* 跨平台暫停/繼續功能
* 增強的角色統計系統
* 改進的權限管理

#### 已知限制

* 投票功能僅限 Discord
* 檔案上傳僅限 Discord
* 某些進階功能需要 VIP 等級

***

StoryTeller 系統持續更新中，請關注最新版本的功能和改進。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://bothelp.hktrpg.com/hktrpg-guan-fang-shi-yong-jiao-xue/yu-le-gong-neng/storyteller-hu-dong-gu-shi-xi-tong.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
