feat: yarn spinner

This commit is contained in:
hypercross 2026-03-02 14:44:12 +08:00
parent 13007c8fa4
commit f27a6a8dfc
2 changed files with 84 additions and 0 deletions

View File

@ -1,6 +1,7 @@
# 要求 # 要求
编写ttrpg冒险。冒险将要使用./system.md描述的规则运行。 编写ttrpg冒险。冒险将要使用./system.md描述的规则运行。
若为yarn spinner编写参考./yarn-spinner.md的内容。
每个冒险应该包含以下要素: 每个冒险应该包含以下要素:
@ -59,6 +60,10 @@
- 路径与环境:描述连接地点的路径特征及旅行中的风险。 - 路径与环境:描述连接地点的路径特征及旅行中的风险。
- 地点标注明确主线遭遇M1-M6和支线遭遇S1-S6所在的地理位置。 - 地点标注明确主线遭遇M1-M6和支线遭遇S1-S6所在的地理位置。
设计多种路径连接地点,以允许玩家在探索中有选择的空间。
为路径设计多种特性,如隐藏、上锁、单向、经过之后坍塌等,以允许探索时有多样的体验。
使用`mermaid`语法绘制地图,并插入冒险文件中。 使用`mermaid`语法绘制地图,并插入冒险文件中。
## 遭遇的设计 ## 遭遇的设计

79
content/yarn-spinner.md Normal file
View File

@ -0,0 +1,79 @@
# Yarn Spinner 编写
Yarn Spinner是一种文字冒险文本格式可用于描述ttrpg冒险。
不要使用`markdown`格式语法,如标题,加粗等。只使用纯文本描述冒险内容。
## 基本结构
每个`主线`和`支线`遭遇使用一个`节点`来描述。然后,为每个遭遇里的每个交互创建一个`节点`。
```yarn-spinner
title: 节点名称
---
描述文本
角色: 角色台词
-> 选项描述1
<<命令1>>
-> 选项描述2
<<命令2>>
===
```
对于`随机`遭遇而言,使用多个`title`相同的节点。
可以使用`when: `来为节点触发添加条件。
若需要节点只触发一次,可以结合`变量`。
```yarn-spinner
title: 随机遭遇
when: $villager_encountered == false
---
村民: 森林里有一只大狼!
<<set $villager_encountered to true>>
===
```
## 跳转
`<<jump 节点名称>>`:跳转节点
`<<detour 节点名称>>`:跳转节点,并在节点执行结束后返回
`<<return>>`:返回`detour`跳转来源节点
玩家在主线/支线地点之间移动时,根据路径内容,插入`<<detour 随机遭遇>>`来触发随机遭遇。
随机遭遇可以使用`<<return>>`来返回主线。
## 休息与睡觉
在合适的地方可以休息。如果时间在晚0点到早6点之间可以睡觉。
## 命令和函数
使用命令读写时间。不要创建变量。
- ```<<time_pass>>```:时间流逝,若休息则使用`<<time_pass true>>`。若在夜间休息则休息至第二天6点否则休息1小时。
- ```<<if time_of_day() <= 6>>```读取24小时制当前时间。午夜为0点。
- ```<<if time_of_game() >= 72>>```:总共流逝的时间。
使用以下命令操作角色属性:
- ```<<damage str 4>>```:造成角色属性损伤。若可耐受,则使用```<<damage str 4 true>>```。
- ```<<heal str 4>>```:解除属性创伤,并恢复角色属性损伤。
- ```<<buff str 4 4>>```:施加属性修改值,持续一定小时数。
- ```<<set $result to check("nodeId:checkId", "wis")>> ```:检定角色属性。成功返回正值代表成功进度,失败返回负值代表失败进度。
- ```<<if $result >= 3>>```:处理检定成功进度。
- ```<<if $result <= -2>>```:处理检定失败进度。
- ```<<if $result > 0>>```:如果既没有成功也没有失败,暗示玩家应该继续尝试。
使用以下命令操作角色物品:
- ```<<add_item light_armor 1>>```:添加物品。
- ```<<if consume_item("gold", 100)>>```:消耗物品。
- ```<<if has_item("gold", 100)>>```:检查物品。
## 文件分割
可以把遭遇拆分为多个文件。每个文件不要超过300行。
只要使用匹配的遭遇title就可以跳转到其他文件内的遭遇。
每个交互机会应当有自己的节点。若检定既没有成功也没有失败,则应当允许玩家再次尝试或者返回遭遇。
使用变量来存储其他世界状态。