Compare commits

..

No commits in common. "0d008791860d382fa7dd12ffc8778a2a62e045f1" and "f1aa536c4d56128b4258a95353bfbea81b5eea31" have entirely different histories.

11 changed files with 186 additions and 316 deletions

View File

@ -1,84 +1,97 @@
# 要求
编写ttrpg冒险。冒险将要使用./docs/system.md描述的规则运行。
若为yarn spinner编写参考./docs/yarn-spinner.md的内容。
编写ttrpg冒险。冒险将要使用./system.md描述的规则运行。
若为yarn spinner编写参考./yarn-spinner.md的内容。
每个冒险应该按顺序详细设定以下要素:
每个冒险应该包含以下要素:
1. 背景:地点、环境。(./docs/setting.md)
2. 势力:任务中出现的势力。(./docs/faction.md)
3. 主题:玩家的身份以及任务目标。(./docs/theme.md)
4. 地点:玩家可以访问的地点。(./docs/location.md)
5. 路径:在地点间移动期间可能遇到的事件。(./docs/route.md)
- 简报:地理、环境、当前态势。
- 后果:如果玩家什么都不做,将会默认发生的后果。
- 压力:一些随机遭遇,将在冒险中随机发生。
- 主线:一些逻辑上连续的遭遇。
- 支线:一些独立的支线遭遇,完成可以获得资源帮助。
## 设计流程
## 简报
1. 为冒险创建一个文件夹,并创建 `design.md`: 设计笔记。
2. 遵守文档的要求,将每个步骤的设计记录在此文件中。
3. 生成冒险所需的csv文件
- `locations.csv`:描述每个地点。
- `cast.csv`描述冒险中出现的npc势力怪物。
- `curio.csv`:描述冒险中可能遇到的特殊物品或资源。
- `route.csv`:描述冒险中在特定路径上可能遭遇的事件。
4. 编写`adventure.md`冒险本体,包含冒险简报引入,以及引用其他文件。
应当确立以下内容:
csv文件使用以下格式
- 环境:地理特征,社会风貌,政治态势。
- 当前态势:冒险要解决的事件当前的状态。
- 势力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文本
1,遭遇内容的markdown文本
2,遭遇内容的markdown文本
...
```
npc名称等标题内容写在body里而不是label里。子段落标题加粗而不是使用标题。
如:
```
### 艾拉
在冒险本体的markdown里使用以下语法引用遭遇表
`:md-table[./encounters.csv]`
**类型**NPC/盟友
主线、支线、压力等每个类型需要有独特的csv文件。
**身份**:村庄的守护者
```
## 文件结构
使用以下语法引用csv
`:md-table[./locations.csv]`
`:md-table[./cast.csv]`
`:md-table[./route.csv]{roll}`
`:md-table[./curio.csv]`
每个文件只引用一次。不需要添加额外的解释。
## 世界观
冒险应当讲诉`中世纪剑与魔法`风格的故事。角色们通常具有一些超出常人的能力,较少受社会制度所约束,但也无法左右社会现状。
社会由`骑士`、`贵族`、`平民`、`先知`四种人群构成。
- `骑士`精通武艺,受`先知`授予各种特殊能力,四处游历,保卫王国。他们通常正直而受尊重。
- `贵族`掌握权力,确保王国的外交与内政秩序。他们有的依靠精明和圆滑上位,有的则依靠世袭头衔粗暴而无能。
- `平民`从事生产,为王国贡献粮食、手工制品与人力。
- `先知`裁定纠纷,为王国的命运提供预言与计划。他们通常性情古怪,每名先知都独居在一个特殊的地点。
此外,社会中还有各式各样的私人势力,在明里暗处中活跃,无法划分到上述角色中。
## 超自然现象
除了人类以外,王国中可能出现各种各样的奇异生物与超自然现象。它们会影响角色们的冒险,但是很难影响朝政与社会。
从欧洲民间传说以及童话故事中获取灵感。
超自然现象通常由一些奇异生物操控,他们可能具有智能,具有与人类达成交易的可能,甚至可以做到操纵与欺骗人类。与此同时,他们的能力可能具有不为人知的弱点。
许多先知也能引发超自然现象,但他们的动机通常无法被人类理解,甚至不会使用超自然现象来影响人类社会。有的骑士持有先知赋予的超能力,但会付出相应的牺牲或者代价。
## 势力设计
在冒险中可将部分NPC设计为势力领袖手下带领一群相互类似的NPC。
势力是势力领袖的衍生。通过为势力创建势力计划、掌握的资源、势力成员的典型特点,来塑造势力的特色。
- 势力目标:敛财/复仇/征服/保护/研究/创造/自保/探索/寻宝
## NPC设计
冒险中出现的NPC应当具有鲜明的特色但不应该有过于复杂的人物动机。通过行动来展现NPC的个性避免纠缠不清的爱恨情仇。
为每个冒险创建一个新文件夹。冒险本体以`adventure.md`保存。

View File

@ -1,24 +0,0 @@
# 势力
冒险中应当出现1~2个势力。
为每个势力设定以下元素:
1. 领袖NPC设计其背景故事、特殊能力、动机、缺陷。
2. 势力计划该势力目前的目标和行动纲领。应该大致与领袖NPC的人物动机有关。
3. 势力障碍势力计划目前遇到的障碍。应该大致与领袖NPC的缺陷有关。
4. 掌握资源:势力对当地社会的影响力,拥有的物资,以及成员技能。
5. 活动范围:势力成员会在哪些地点出没。
准备至少两个地点,来支持玩家与势力的交互:
- 指挥所:玩家可以在这里找到势力领袖,与其进行谈判,交易,或者冲突。
- 任务执行地:玩家可以在这里遇到正在执行计划人物的势力成员,可以加以帮助或者阻止。
## 格式
cast.csv的label直接使用npc名称
```csv
label,body
张三,markdown文本
老王,markdown文本
...
```

View File

@ -1,42 +0,0 @@
# 地点设计
使用`mermaid`语法来记录地点和路径的结构。然后,为每个地点创建一个段落来描述其遭遇内容。
1. 为主题中的每个遭遇设计一个地点。此外,再为每个势力的指挥所和任务执行地各设计一个地点。
2. 为地点遭遇安排合适的交互内容设计。从以下模板当中挑选,尽量不要重复。
a. 起始地点起始地点应当提供NPC或地图为玩家展开游戏提供充足信息并提供初始挑战。
b. 枢纽地点:与入口相连,四通八达。玩家需要经常返回。
c. 档案地点放满了笔记、个人物品、信件、日志能够揭露NPC动机或角色关系的地点。
d. 杂物堆:堆满看似不起眼的物品,实际上隐藏着重要信息、物品或密道。
e. 储藏室:存放着许多医疗用品或武器,通常上锁或被堵住。
f. 设备损坏:重要设施损坏,需要花费时间或资源修复,之后可以解锁路径、揭露重要信息或者重要道具等等。
g. 事故现场:具有危险环境要素的房间,冒险调查可以回收重要线索等等。
h. 陷阱房间:意外或者人为制造了环境要素的房间,若不小心会遭受危险。
i. 守卫室:驻扎着敌人的房间,通常把守着要道。
j. 人质室敌人正在袭击NPC的房间救出NPC可以获得其帮助。
2. 将地点连接起来,形成地图。
a. 确保每个地点都处于某种环状路径中,允许玩家总是前进不用回头。
b. 确保地点中有一些岔路,允许玩家在选择前进方向时有所选择。
3. 为路径设计差异化。
a. 选择两条路径,使用锁、隐藏入口、障碍物等形式,封堵其入口。在其他地点安排钥匙、秘密提示、清障工具等,帮助玩家打开路径。
b. 添加一条秘密捷径。玩家必须在不明显的地方仔细探索,才能发现捷径,并通过捷径绕过危险或障碍。
c. 为部分路径添加危险元素,如陷阱、怪物袭击、悬崖等等,以平衡不同路线遇到的阻碍。
4. 为地点添加一些辅助物资。辅助物资应当能帮助玩家恢复损伤,或者更好执行某些检定。
5. 为地点和路径添加合适的挑战。
设计时,尽可能设计多样的挑战和特色。
## 格式
地点csv的label直接使用地点名称。
```csv
label,body
村口,markdown文本
森林空地,markdown文本
...
```

View File

@ -1,27 +0,0 @@
# 路径设计
根据冒险的背景设定,将一部分较为危险的路径划分为危险路径。
为每条危险路径设计6种随机遭遇
- 随机遭遇通常为玩家带来风险,若不能完成豁免则会造成属性损伤。
- 在体验上希望让玩家无法分辨随机遭遇与普通的地点遭遇。不要把随机遭遇描述为单纯的危险豁免,而是要有完整的场景描述。
- 若两条路径的性质类似,可以共用随机遭遇。
随机遭遇中可以出现NPC、怪物、物品等元素。可以设计只在随机遭遇中出现的元素。
在随机遭遇中,可以出现骑士、平民、一般动物,但避免出现本次冒险中没有明确铺垫的超自然元素。
设计风险时,尽可能覆盖多样的属性类型。
## 格式
路径需要特殊的csv格式用于区分不同的路径。
```csv
group,label,body
森林小径,1,markdown文本
森林小径,2,markdown文本
洞穴密道,1,markdown文本
洞穴密道,2,markdown文本
...
```

View File

@ -1,16 +0,0 @@
# 背景
为冒险设定背景。应包含以下内容:
1. 环境风貌:当地社会文化形态,以及环境生态。
2. 风格特色:冒险发生的地点(通常是一座大型建筑),该地点当前的状态与特点。
3. 上下文:在冒险发生前,这里发生过什么事情。
## 环境风貌
- 人类活动:人迹罕至/偏僻的村落/城市郊区/城堡/富饶的农村/大型城市街区等等。
- 环境生态:寒冷/炎热/河边/海边/山顶/林间/草原,甚至水下。
- 氛围
## 风格特色
- 地点:家族庄园/大图书馆/集市/工坊/研究所/学院/军营/流民营地/藏宝库/工厂/墓穴/动物巢穴等等。
- 构造:木制/石制/砂石/活生生的植物/冰封/玻璃/血肉/泥土/金属/大理石/菌菇/丝网等等。

View File

@ -1,81 +0,0 @@
# 系统
## 玩家角色
只有一个玩家角色。
### 基本属性
玩家角色具有以下基本属性:
- 力量
- 体质
- 敏捷
- 感知
- 智力
- 魅力
每个基本属性范围1-19会用于属性检定掷D20小于等于属性则检定成功。
属性可能遭受损伤扣减,损伤需要通过休息来缓慢回复。
一次受到超过当前一半属性损伤时,会遭受严重创伤,该属性即使休息也不会回复损伤。
必须通过专家、专门地点或道具来解除严重创伤。
### 耐受
玩家具有一条耐受度属性,只需几分钟的调整即可完全恢复。
耐受度随玩家角色成长而提升初始范围为1-6。
在玩家做好准备时可消耗耐受用于抵抗属性损伤每点耐受抵抗1点损伤。
### 疲劳与恢复
结算疲劳时,掷一个`D6`属性骰每一面代表一种属性。掷出的属性受到1点损伤。
结算恢复时类似掷出的属性恢复1点损伤。如果掷出的属性没有损伤或受到严重创伤则恢复无效。
### 检定与进度
玩家可以通过检定来尝试交互。每条交互需要三种属性:
- 主属性:玩家需要使用什么属性来进行此交互。
- 难度:玩家需要积累多少成功进度来成功完成此交互。
- 机会:玩家积累多少失败进度后交互失败,且玩家不可再尝试。
如:`力量3/1`(力量难度3机会1)表示玩家使用力量属性检定3成功进度后交互成功完成1失败进度后交互失败且不可再尝试。
每次进行检定时掷D20检定骰以及D4进度骰。
若检定骰小于等于玩家当前主属性,则获得进度骰数量成功进度,否则获得对应数量失败进度。
根据交互在叙事上是否可以拆分步骤来设计:
- 若交互可以取得阶段性进展,比如开门、解谜,则可以设计较大数字的难度,否则使用`1`。
- 若交互失败可能连续发生,比如连续躲避陷阱失败可能连续受到伤害,则可以设计较大数字的机会,否则使用`1`。
检定的难度/机会不会告知玩家。若没有触发成功也没有触发失败,则检定后仅告知当前成功/失败进度。
### 战斗
有可能与玩家发生战斗的NPC或生物需要为敌人准备以下设计
- 耐受玩家使用武器攻击后会扣减敌人的耐受。范围大致在6-12之间。扣光之后敌人会被击倒。耐受当前值玩家不可知。
- 武器敌人攻击玩家时使用的骰子公式。在d6到d12之间。
- 战术:与玩家战斗时,可能会使用的特殊战术或技能。
如:`巨狼(10)d8撕咬受伤后会嚎叫呼唤同伴`
### 后果
玩家状态
- 属性损伤:属性类型+当前值
- 严重创伤:属性类型
- 标签:类型+持续事件,用于疾病、祝福、中毒等
- 资源:类型+数量,用于物品、金钱等
世界状态
- 势力计划进度id+成功进度
- 事件发展进度id+阶段

View File

@ -1,44 +0,0 @@
# 主题
为冒险设计主题。主题描述了冒险故事的主要目标与困难。
- 保护商队/调查神秘事件/杀死怪物/寻找宝藏/窃取重要物品/抵达地点/逃离地点
从主题出发,为冒险设计以下遭遇:
- 1条最终决战
- 2条预兆
- 2条铺垫
- 2条转折
每个遭遇都应该发生在一个独立的地点。
在设定主题遭遇时不要具体设定遭遇的NPC、物品、现象或者玩家可以如何与其交互。仅仅粗略地描述场景即可。
比如:“一位衣着精致的骑士正趴在一口枯井旁哭泣”。不用具体指定骑士的身份,也不用描述其使用的武器或防具。
## 最终决战
在最终决战中,玩家必须面对主要困难,若是成功则可以完成主要目标。
## 预兆
在预兆遭遇中,玩家会遭遇一些看似与主要目标无关的场景或事件,主要是营造氛围。
进行调查会揭露关于任务的边缘信息,主要是任务事件对环境或者普通人的影响。
玩家与预兆的交互不会直接影响主要目标。
## 铺垫
在铺垫遭遇中将冒险的主要困难以及相关的NPC、物品、现象介绍给玩家。
可能会立即向玩家施加挑战。赢得铺垫遭遇将提升玩家完成主要目标的机会。
## 转折
在转折遭遇中玩家与重要NPC、物品、现象的关系将发生改变。
NPC立场可能发生逆转、NPC能力发生变化或者某种现象开始发生。
转折遭遇要么打破玩家预期,要么顺着玩家的预期展开但是冲突变得更激烈。

96
content/system.md Normal file
View File

@ -0,0 +1,96 @@
# 系统
## 玩家角色
只有一个玩家角色。
### 基本属性
玩家角色具有以下基本属性:
- 力量
- 体质
- 敏捷
- 感知
- 智力
- 魅力
每个基本属性范围1-19会用于属性检定掷D20小于等于属性则检定成功。
属性可能遭受损伤扣减,损伤需要通过休息来缓慢回复。
一次受到超过当前一半属性损伤时,会遭受严重创伤,该属性即使休息也不会回复损伤。
必须通过专家、专门地点或道具来解除严重创伤。
### 耐受
玩家具有一条耐受度属性,只需几分钟的调整即可完全恢复。
耐受度随玩家角色成长而提升初始范围为1-6。
在玩家l做好准备时可消耗耐受用于抵抗属性损伤每点耐受抵抗1点损伤。
### 时间
每天有24小时玩家的每次基本行动花费1小时。
白天6点到晚上0点属于行动时间
- 在条件允许的情况下可以进行休息每小时随机恢复1点属性损伤。
晚上0点到凌晨6点属于睡眠时间
- 若睡觉休息每小时随机恢复1点属性损伤。
- 若条件不允许,则即使休息也不能回复损伤。
- 若不休息则每小时随机遭受1点属性损伤。
### 属性骰
随机回复/扣减属性时使用D6属性骰来决定随机回复/扣减的属性。
若掷恢复时,掷出的属性已满,则本次随机恢复没有效果。
### 基本行动
除休息外玩家可进行以下行动每次花费1小时
- 旅行移动到另一地点。若旅途超过1小时可能在半路遭遇随机遭遇。
- 调查:检查当前地点,揭露更多线索或交互对象。
- 交互:根据交互性质而定,可能有不同的检定、难度、机会。
### 交互行动
每条交互需要三种属性:
- 主属性:玩家需要使用什么属性来进行此交互。
- 难度:玩家需要积累多少成功进度来成功完成此交互。
- 机会:玩家积累多少失败进度后交互失败,且玩家不可再尝试。
如:`力量3/1`(力量难度3机会1)表示玩家使用力量属性检定3成功进度后交互成功完成1失败进度后交互失败且不可再尝试。
每次进行交互时掷D20检定骰以及D4进度骰。
若检定骰小于等于玩家当前主属性,则获得进度骰数量成功进度,否则获得对应数量失败进度。
根据交互的挑战性质设计效果:
- 应变:难度/机会都低,即使失败也能达到成功的效果,仅受到不可耐受的属性损伤。
- 挑战:难度高/机会低,失败后根据进度获取收益,且交互可再次尝试。
- 努力:难度/机会都高,失败无事发生。
- 风险:难度低/机会高,失败有较重大损失。
检定的难度/机会不会告知玩家。若没有触发成功也没有触发失败,则检定后仅告知当前成功/失败进度。
### 状态
玩家状态
- 属性损伤:属性类型+当前值
- 严重创伤:属性类型
- 标签:类型+持续事件,用于疾病、祝福、中毒等
- 资源:类型+数量,用于物品、金钱等
- 成就:类型+等级,用于声望、技能等
世界状态
- 进度:类型+id+成功进度+失败进度,用于势力计划、事件进展等。

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,6 +70,10 @@ when: $villager_encountered == false
## 文件分割
按照遭遇拆分文件,每个遭遇都是一个文件
可以把遭遇拆分为多个文件。每个文件不要超过300行
只要使用匹配的遭遇title就可以跳转到其他文件内的遭遇。
只要使用匹配的遭遇title就可以跳转到其他文件内的遭遇。
每个交互机会应当有自己的节点。若检定既没有成功也没有失败,则应当允许玩家再次尝试或者返回遭遇。
使用变量来存储其他世界状态。

8
package-lock.json generated
View File

@ -32,7 +32,6 @@
"@tailwindcss/postcss": "^4.2.1",
"@tailwindcss/typography": "^0.5.15",
"@tailwindcss/vite": "^4.0.0",
"@types/js-yaml": "^4.0.9",
"@types/node": "^22.19.13",
"tailwindcss": "^4.0.0",
"ts-node": "^10.9.2",
@ -2556,13 +2555,6 @@
"integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==",
"license": "MIT"
},
"node_modules/@types/js-yaml": {
"version": "4.0.9",
"resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz",
"integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==",
"dev": true,
"license": "MIT"
},
"node_modules/@types/node": {
"version": "22.19.13",
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.13.tgz",

View File

@ -50,7 +50,6 @@
"@tailwindcss/postcss": "^4.2.1",
"@tailwindcss/typography": "^0.5.15",
"@tailwindcss/vite": "^4.0.0",
"@types/js-yaml": "^4.0.9",
"@types/node": "^22.19.13",
"tailwindcss": "^4.0.0",
"ts-node": "^10.9.2",