refactor: adventure format

This commit is contained in:
hypercross 2026-03-04 17:37:45 +08:00
parent 02aad0415c
commit 292099819c
8 changed files with 166 additions and 131 deletions

View File

@ -1,97 +1,43 @@
# 要求
编写ttrpg冒险。冒险将要使用./system.md描述的规则运行。
若为yarn spinner编写参考./yarn-spinner.md的内容。
编写ttrpg冒险。冒险将要使用./docs/system.md描述的规则运行。
若为yarn spinner编写参考./docs/yarn-spinner.md的内容。
每个冒险应该包含以下要素:
每个冒险应该详细设定以下要素:
- 简报:地理、环境、当前态势。
- 后果:如果玩家什么都不做,将会默认发生的后果。
- 压力:一些随机遭遇,将在冒险中随机发生。
- 主线:一些逻辑上连续的遭遇。
- 支线:一些独立的支线遭遇,完成可以获得资源帮助。
## 简报
应当确立以下内容:
- 环境:地理特征,社会风貌,政治态势。
- 当前态势:冒险要解决的事件当前的状态。
- 势力1-2种与事件相关的势力。
- 玩家角色:玩家的身份,以及初始任务目标。
设计势力时,应当确立以下内容:
- 1-2 名代表性NPC。
- 势力当前的计划以及障碍。
- 势力掌握的资源。
## 后果
随着时间的推移,如果玩家未能解决事件,则不好的事情会逐渐发生。
后果分三个阶段,每个阶段会引入新的规则,为玩家行动制造额外障碍。
在第三个阶段发生后,玩家行动将会遭受极大挑战,很可能很快失败。
## 压力
设计10条随机遭遇用于玩家冒险中遇到的意外。
大部分应该为玩家制造危险。随着后果的发生,随机遭遇的危险程度也会随之提升。
## 主线
设计6条逻辑连续的遭遇完成一条遭遇后会揭露下一条遭遇。
在完成最后一条遭遇后,玩家可以解决事件。
## 支线
设计6条逻辑独立的遭遇每个遭遇会给玩家提供一些可能的资源。
每个遭遇位于一个独立地点,需要玩家投入时间探索或完成挑战。
## 地图设计
描述冒险发生的地理布局及各遭遇点之间的逻辑连接。
- 区域布局:描述主要地标及其空间关系。
- 路径与环境:描述连接地点的路径特征及旅行中的风险。
- 地点标注明确主线遭遇M1-M6和支线遭遇S1-S6所在的地理位置。
设计多种路径连接地点,以允许玩家在探索中有选择的空间。
为路径设计多种特性,如隐藏、上锁、单向、经过之后坍塌等,以允许探索时有多样的体验。
使用`mermaid`语法绘制地图,并插入冒险文件中。
## 遭遇的设计
设计一项遭遇时如果有NPC出现则为出现的NPC设计动机、当前计划、当前遇到的障碍以便玩家交互。
如果没有NPC则设计2-4种可以交互的环境元素尽量覆盖不同的玩家属性以及不同的交互性质。
每条遭遇都需要明确描述发生的场景地点。尽量设计不同风格的地点。
## 文本格式
输出时使用markdown格式。
对于遭遇表而言,放在`csv`文件里:
```csv
label,body
1,遭遇内容的markdown文本
2,遭遇内容的markdown文本
...
```
在冒险本体的markdown里使用以下语法引用遭遇表
`:md-table[./encounters.csv]`
主线、支线、压力等每个类型需要有独特的csv文件。
- 背景:地点、环境、势力设定。(./docs/setting.md)
- 主题:玩家的身份以及任务目标。(./docs/theme.md)
- 秘密:任务中可能揭露的秘密。(./docs/mystery.md)
- 地点:玩家可以访问的地点。(./docs/location.md)
- 路径:在地点间移动期间可能遇到的事件。(./docs/route.md)
## 文件结构
为每个冒险创建一个新文件夹。冒险本体以`adventure.md`保存。
为每个`冒险`创建一个文件夹,包含以下内容:
- `adventure.md`:冒险本体,引用其他文件。
- `locations.csv`:描述每个地点。
- `cast.csv`描述冒险中出现的npc势力怪物。
- `curio.csv`:描述冒险中可能遇到的特殊物品或资源。
- `route.csv`:描述冒险中在特定路径上可能遭遇的事件。
csv文件使用以下格式
```csv
label,body
1,markdown文本
2,markdown文本
...
```
npc名称等标题内容也以markdown语法写在body里而不是label里。
## 冒险本体
编写简报段落,确立以下内容:
- 环境:地理特征,社会风貌,政治态势。
- 当前态势:冒险要解决的事件当前的状态。
- 玩家角色:玩家的身份,以及初始任务目标。
使用以下语法引用csv
`:md-table[./locations.csv]{roll}`

13
content/docs/location.md Normal file
View File

@ -0,0 +1,13 @@
# 地点设计
1. 为主题中的每个遭遇设计一个地点。此外再添加约3-5个地点用于放置秘密线索。
2. 将地点连接起来,形成地图。确保每个地点都处于某种环状路径中,允许玩家总是前进不用回头。确保地点中有一些岔路,允许玩家在选择前进方向时有所选择。
3. 为地点添加一些危险元素,如陷阱、怪物袭击、悬崖等等。如果地点有岔路,为不同的岔路设计差异化的挑战元素。
4. 设计两处上锁的路径。将锁对应的钥匙安排到其他地点,以允许玩家获得钥匙并解锁路径。
5. 设计一处隐藏路径。玩家必须通过探索才能发现此路径。隐藏路径应该能允许玩家绕开危险,或者获得一些帮助物资。
6. 为地点添加一些辅助物资。辅助物资应当能帮助玩家恢复损伤,或者更好执行某些检定。

15
content/docs/mystery.md Normal file
View File

@ -0,0 +1,15 @@
# 秘密
玩家在冒险中,应当面对一些神秘现象或阴谋。
玩家可以通过调查来得知秘密的真相,但是真相与完成游戏目标没有直接关系。
得知真相会花费玩家额外的精力,但能够帮助玩家在最终决战前做好准备。
## 线索
将秘密拆分为5-6条线索。玩家可以在冒险中获得其中一些线索并最终拼凑出秘密的真相。
只靠单独的线索无法获得秘密的完整真相。必须依赖至少3-4条线索的组合才行。
设计地点时,将秘密的线索分散安排到多个地点中。

9
content/docs/route.md Normal file
View File

@ -0,0 +1,9 @@
# 路径设计
根据冒险的背景设定将一部分较为危险的路径划分为危险路径并设计共6条随机遭遇。
随机遭遇不与特定的地点或路径绑定,而在路边随机发生。
随机遭遇通常为玩家带来风险,若不能完成豁免则会造成属性损伤。
设计风险时,尽可能覆盖多样的属性类型。

42
content/docs/setting.md Normal file
View File

@ -0,0 +1,42 @@
# 背景
为冒险设定背景。应包含以下内容:
- 环境风貌:当地社会文化形态,以及环境生态。
- 风格特色:冒险发生的地点(通常是一座大型建筑),该地点当前的状态与特点。
- 上下文:在冒险发生前,这里发生过什么事情。
## 环境风貌
- 人类活动:人迹罕至/偏僻的村落/城市郊区/城堡/富饶的农村/大型城市街区等等。
- 环境生态:寒冷/炎热/河边/海边/山顶/林间/草原,甚至水下。
## 风格特色
- 地点:家族庄园/大图书馆/集市/工坊/研究所/学院/军营/流民营地/藏宝库/工厂/墓穴/动物巢穴等等。
- 构造:木制/石制/砂石/活生生的植物/冰封/玻璃/血肉/泥土/金属/大理石/菌菇/丝网等等。
## 上下文
- 灾难背景:古战场/研究事故/诅咒/瘟疫/遭到袭击/闹鬼/石化/被怪物占据/被封印/遭天谴等等
## 世界观
冒险应当讲诉`中世纪剑与魔法`风格的故事。角色们通常具有一些超出常人的能力,较少受社会制度所约束,但也无法左右社会现状。
社会由`骑士`、`贵族`、`平民`、`先知`四种人群构成。
- `骑士`精通武艺,受`先知`授予各种特殊能力,四处游历,保卫王国。
- `贵族`掌握权力,确保王国的外交与内政秩序。
- `平民`从事生产,为王国贡献粮食、手工制品与人力。
- `先知`裁定纠纷,为王国的命运提供预言与计划。
此外,社会中还有各式各样的私人势力,在明里暗处中活跃,无法划分到上述角色中。
除了人类以外,王国中可能出现各种各样的奇异生物与超自然现象。它们会影响角色们的冒险,但是很难影响朝政与社会。
从欧洲民间传说以及童话故事中获取灵感。
## 势力设计
在冒险中可将部分NPC设计为势力领袖手下带领一群相互类似的NPC。
势力是势力领袖的衍生。通过为势力创建势力计划、掌握的资源、势力成员的典型特点,来塑造势力的特色。
- 势力目标:敛财/复仇/征服/保护/研究/创造/自保/探索/寻宝

View File

@ -29,39 +29,17 @@
耐受度随玩家角色成长而提升初始范围为1-6。
在玩家l做好准备时可消耗耐受用于抵抗属性损伤每点耐受抵抗1点损伤。
在玩家做好准备时可消耗耐受用于抵抗属性损伤每点耐受抵抗1点损伤。
### 时间
### 疲劳与恢复
每天有24小时玩家的每次基本行动花费1小时
结算疲劳时,掷一个`D6`属性骰每一面代表一种属性。掷出的属性受到1点损伤
白天6点到晚上0点属于行动时间
结算恢复时类似掷出的属性恢复1点损伤。如果掷出的属性没有损伤或受到严重创伤则恢复无效。
- 在条件允许的情况下可以进行休息每小时随机恢复1点属性损伤。
### 检定与进度
晚上0点到凌晨6点属于睡眠时间
- 若睡觉休息每小时随机恢复1点属性损伤。
- 若条件不允许,则即使休息也不能回复损伤。
- 若不休息则每小时随机遭受1点属性损伤。
### 属性骰
随机回复/扣减属性时使用D6属性骰来决定随机回复/扣减的属性。
若掷恢复时,掷出的属性已满,则本次随机恢复没有效果。
### 基本行动
除休息外玩家可进行以下行动每次花费1小时
- 旅行移动到另一地点。若旅途超过1小时可能在半路遭遇随机遭遇。
- 调查:检查当前地点,揭露更多线索或交互对象。
- 交互:根据交互性质而定,可能有不同的检定、难度、机会。
### 交互行动
每条交互需要三种属性:
玩家可以通过检定来尝试交互。每条交互需要三种属性:
- 主属性:玩家需要使用什么属性来进行此交互。
- 难度:玩家需要积累多少成功进度来成功完成此交互。
@ -69,7 +47,7 @@
如:`力量3/1`(力量难度3机会1)表示玩家使用力量属性检定3成功进度后交互成功完成1失败进度后交互失败且不可再尝试。
每次进行交互掷D20检定骰以及D4进度骰。
每次进行检定掷D20检定骰以及D4进度骰。
若检定骰小于等于玩家当前主属性,则获得进度骰数量成功进度,否则获得对应数量失败进度。
根据交互的挑战性质设计效果:
@ -81,7 +59,7 @@
检定的难度/机会不会告知玩家。若没有触发成功也没有触发失败,则检定后仅告知当前成功/失败进度。
### 状态
### 后果
玩家状态
@ -89,8 +67,8 @@
- 严重创伤:属性类型
- 标签:类型+持续事件,用于疾病、祝福、中毒等
- 资源:类型+数量,用于物品、金钱等
- 成就:类型+等级,用于声望、技能等
世界状态
- 进度:类型+id+成功进度+失败进度,用于势力计划、事件进展等。
- 势力计划进度id+成功进度
- 事件发展进度id+阶段

36
content/docs/theme.md Normal file
View File

@ -0,0 +1,36 @@
# 主题
为冒险设计主题。主题描述了冒险故事的主要目标与困难。
- 保护商队/调查神秘事件/杀死怪物/寻找宝藏/窃取重要物品/抵达地点/逃离地点
从主题出发,为冒险设计以下遭遇:
- 1条最终决战
- 1-2条预兆
- 1-2条铺垫
- 1-2条转折
每个遭遇都应该发生在一个独立的地点。
## 最终决战
在最终决战中,玩家必须面对主要困难,若是成功则可以完成主要目标。
## 预兆
在预兆遭遇中,玩家会遭遇一些看似与主要目标无关的场景或事件。
进行调查会揭露关于冒险秘密的信息,但玩家的行为不会直接影响主要目标。
## 铺垫
在铺垫遭遇中将冒险的主要困难以及相关的NPC、物品、现象介绍给玩家。
可能会立即向玩家施加挑战。赢得铺垫遭遇将提升玩家完成主要目标的机会。
## 转折
在转折遭遇中玩家与重要NPC、物品、现象的关系将发生改变。
NPC立场可能发生逆转、NPC能力发生变化或者冒险秘密开始揭露。

View File

@ -6,7 +6,7 @@ Yarn Spinner是一种文字冒险文本格式可用于描述ttrpg冒险。
## 基本结构
每个`主线`和`支线`遭遇使用一个`节点`来描述。然后,为每个遭遇里的每个交互创建一个`节点`。
每个`地点`遭遇使用一个`节点`来描述。然后,为每个遭遇里的每个`交互`创建一个`节点`。
```yarn-spinner
title: 节点名称
@ -40,7 +40,7 @@ when: $villager_encountered == false
`<<detour 节点名称>>`:跳转节点,并在节点执行结束后返回
`<<return>>`:返回`detour`跳转来源节点
玩家在主线/支线地点之间移动时,根据路径内容,插入`<<detour 随机遭遇>>`来触发随机遭遇。
玩家在地点之间移动时,根据路径内容,插入`<<detour 随机遭遇>>`来触发随机遭遇。
随机遭遇可以使用`<<return>>`来返回主线。
@ -60,7 +60,7 @@ when: $villager_encountered == false
- ```<<if $result >= 3>>```:处理检定成功进度。
- ```<<if $result <= -2>>```:处理检定失败进度。
- ```<<if $result > 0>>```:如果既没有达成成功进度也没有达成失败进度,暗示玩家应该继续尝试。
- 检定后总是在文本中描述玩家当前的进度(但不要描述难度和机会)
- 检定后总是在文本中描述玩家当前的进度(但不要描述难度和机会)。使用`{$result}`来显示进度。
直接使用变量来记录玩家物品。没有背包限制。
- ```<<set $item_light_armor to $item_light_armor + 1>>```:添加物品。
@ -70,10 +70,6 @@ when: $villager_encountered == false
## 文件分割
可以把遭遇拆分为多个文件。每个文件不要超过300行
按照遭遇拆分文件,每个遭遇都是一个文件
只要使用匹配的遭遇title就可以跳转到其他文件内的遭遇。
每个交互机会应当有自己的节点。若检定既没有成功也没有失败,则应当允许玩家再次尝试或者返回遭遇。
使用变量来存储其他世界状态。