<!-- title: 《text-engine》一张软盘，装下整个文字冒险 -->
<!-- domain: games -->
<!-- repo: okaybenji/text-engine -->

你大概率在小时候玩过那种游戏：屏幕上只有几行字，你敲 `go north`，它告诉你前面有一扇锁着的门；你敲 `look at door`，它说门上有个钥匙孔。没有画面，没有音效，但你愣是在被窝里玩了一晚上。这类游戏叫文字冒险（Text Adventure），上世纪七十年代起源于大型机，80 年代跟着软盘进过千家万户，后来被 3D 画面拍死在沙滩上。

但有个叫 Benji Kay 的独立开发者不这么想。据他自己的说法，现在的浏览器已经强大到能模拟当年游戏赖以生存的整个操作系统——那为什么不把文字冒险装回去？于是有了今天要拆的这个仓库：**okaybenji/text-engine**。

## 仓库档案

- **仓库**：[okaybenji/text-engine](https://github.com/okaybenji/text-engine) —— "An HTML-based text adventure game engine"，一个跑在浏览器里的文字冒险引擎 + 一个示例游戏
- **⭐ 375 star / 68 fork**，语言 JavaScript，GPL-3.0 协议（这条对想变现的人很关键，后面细说）
- **作者**：Benji Kay，个人账号，据其个人主页曾在 Google 做设计工程，2024 年还用同一套技术做过一款叫 Monkey Trap 的免费网页游戏
- **体量**：核心就一个 `index.js`，零依赖；`game-disks` 文件夹里放"游戏盘"；436 个 commit，最近一次更新在 2025 年 6 月
- **在线 Demo**：[okaybenji.github.io/text-engine](https://okaybenji.github.io/text-engine/)，打开即玩，另在 itch.io 上有页面（okaybenji.itch.io/text-engine）

注意它的定位：**引擎 + 游戏盘，而不是一个孤立的游戏**。仓库里附带的 demo 游戏本身就是完整可玩的冒险，而任何人拿它做自己的游戏，本质上就是"写一张新软盘"。

## 这游戏是什么

一句话：**你负责打字，引擎负责让世界回应你**。

打开 Demo，屏幕是一个复古终端：橙色文字，光标闪烁。你处在一个房间里，引擎会打印房间描述和里面的东西。你输入 `look at desk`，它描述桌子；你输入 `take key`，钥匙进背包；你输入 `talk to waiter`，他给你一堆可以聊的话题，每个话题前面标着大写关键词，你敲关键词就把天聊下去。走到锁门前敲 `use key`，门开了——就这一个瞬间，多巴胺跟四十多年前一模一样。

核心循环长这样：

```mermaid
flowchart LR
    A[读一段文字描述] --> B[输入指令<br>look take go talk]
    B --> C{引擎解析}
    C -->|认识这个词| D[世界变了<br>拿到道具 开门 剧情推进]
    C -->|不认识| E[无效反馈<br>好奇心加一]
    D --> F[冒出新线索或新出口]
    E --> B
    F --> A
    F --> G{结局}
    G -->|卡关| B
    G -->|通关| H[换一张新盘 再来一局]
```

整个游戏的数据被作者叫做"disk"（软盘），其实就是一个返回 JSON 的函数：顶层必须有 `roomId`（玩家当前在哪）和 `rooms`（所有房间）。每个房间有描述 `desc`、出口 `exits`、可捡的 `items`、可对话的 `characters`。也就是说，**做一张新盘 = 写一份 JSON**，几乎不用编程；想加戏，才需要在 `onEnter`、`onUse` 这些钩子里写几行 JS。仓库里的 `newDiskTemplate` 就是为这个准备的模板。

## 为什么上头

文字冒险这个品类被验证了五十年，它的“上头机制”其实非常现代，拆开看全是今天手游在用的东西：

**1. 解析器就是老虎机。** 你永远不知道哪个词能触发反应。`look`、`take`、`use`、`talk` 是基本功，但 `unlock`、`flip`、`push` 这些隐藏动词全靠猜。每猜对一个，等于拉动一次拉杆中奖——这是典型的“猜测-奖励”循环，跟 Wordle 让你猜五字母单词是同一种快感。text-engine 还专门做了**命令自动补全**（2.0 版加入的，作者在致谢里专门感谢了帮他设计这个功能的朋友），把“打错词的挫败”压到最低，让猜词的快乐留在原地。

**2. 物品栏就是进度条。** 你的 `inventory` 从空到满，每捡起一样东西，都是系统在告诉你“你变强了”。而钥匙开门这类设计，本质是“先给锁、再给钥匙”的经典钩子——玩家先看见目标（上锁的门），动力就自动产生了。

**3. 对话系统是收集玩法。** text-engine 的角色对话用 `topics` 实现：每个话题有 `option`（显示的选项）和 `line`（选中后说的话），还能设置 `prereqs`——必须先聊过某话题，新话题才会解锁，`removeOnRead` 控制聊过即消失。这不就是对话形式的收集图鉴吗？玩家会下意识把每个 NPC 的话茬聊干。

**4. ASCII 画是彩蛋奖励。** 房间可以配 `img` 字段放 ASCII 艺术图，进入就打印。在没有美术成本的前提下，这反而是最便宜的“哇”时刻。

**5. 单局成本趋近于零。** 打开网页就能玩，一条指令一秒钟，卡关了随时 `save`。这种低摩擦恰恰是网页小游戏最值钱的特质——留存靠的不是大坝，是水龙头。

## 技术拆解

这个仓库对开发者的价值，一半在“能抄的架构”，一半在“能复用的组件”。

**零依赖单文件架构。** 全部引擎逻辑在 `index.js` 里，通过 `<script>` 引入后往全局命名空间挂一堆函数，HTML 里只需要一个 `id="output"` 的 div 和一个 `id="input"` 的输入框。没有构建工具、没有框架、没有 npm install。对于一个想两周做出 MVP 的个人开发者，这种“反现代”的选择反而是最短路径。

**存档系统的骚操作：命令重放。** 这是全仓库最值得学的设计。text-engine 3.0 的 `save`/`load` **不序列化游戏状态，而是记录玩家输入过的全部指令**，读档时把游戏重置后按顺序重放一遍——像游戏自己快进玩到你的进度。为此作者把 disk 从“对象”改成了“返回对象的函数”：每次重放前调用函数拿到全新状态，全程不需要刷新浏览器。代价是非确定性代码会出问题——README 里专门举了个例子：demo 里那枚抛硬币的十美分，存档再读档，硬币可能正面变反面，因为重放的只是 `use dime` 这条指令，硬币被重新抛了一次。这个权衡写得坦坦荡荡，还给了出路：不想要就覆盖掉 save 命令，或者自己写存档。对做回合制、命令驱动游戏的开发者，这套模式比状态快照省太多事。

**命令系统按参数个数分桶。** 所有命令存在全局数组 `commands` 里，`commands[0]` 收纳零参数命令（`go` 不带参数会列出所有出口），`commands[1]` 收纳带一个参数的。想加自定义命令两行代码；想换掉默认行为，直接覆盖同名函数，README 连 `delete commands[0].save` 这种删命令的写法都教了。

**一套现成的工具函数。** `getRoom`、`getExit`、`getItem`、`getCharacter`、`pickOne`（从数组随机取一个，用于随机台词）、`println`（支持传 CSS 类名染色）——内容向游戏需要的查询原语基本齐了。物品还支持**多个别名**（`['basketball', 'ball']`），玩家叫它球还是叫它篮球都能命中，这是文字游戏体验的隐形分水岭。

**跨环境运行。** 1.1.1 版之后引擎不绑定 DOM，有人做了 text-engine-node 的示例——同一张盘可以跑在终端里。这意味着你的游戏内容层和展示层是分离的，换皮成本很低。

## 变现观察

先把丑话说在前面：**GPL-3.0 意味着你不能拿这个引擎的代码改吧改吧就闭源收费**——衍生作品必须同样开源。所以围绕它的变现路径要么“卖内容不卖引擎”，要么联系作者谈商业授权。开源文字游戏内容本身怎么赚钱？路上有现成的车辙：

- **itch.io 付费短篇互动小说**：这是独立文字游戏最活跃的市集，1-5 美元的短篇冒险常年有稳定销量， Halloween/圣诞主题限定盘尤其好卖。text-engine 自己就有 itch 页面，作者用它发引擎和示例。
- **Steam 上的付费互动小说**：《80 Days》把儒勒·凡尔纳改写成互动小说卖了百万份量级；Choice of Games 把“纯文字+选项”做成了持续出货的厂牌。文字游戏的开发成本极低，撑得起 5-10 美元的定价。
- **免费+订阅/打赏**：AI Dungeon 当年就是免费玩+订阅解锁高级模型的路线，说明文字品类玩家对“持续更新内容”的付费意愿是存在的。
- **网页广告**：纯文字游戏页面停留时间长、翻页频繁，接 Poki/CrazyGames 这类网页游戏平台的广告分成是低成本试水，但单看 ARPU 不如上面两条。

这个仓库本身没有变现痕迹——它是作者的开源作品集项目。但它证明了最重要的一件事：**这条路的物料成本是一份 JSON**。

## 给我的灵感

**1. 中文“每日一谜”文字冒险（MVP：1-2 周）。** Wordle 把猜词做成了每日限定，文字冒险完全可以照搬：每天一张小盘，三五个房间一条谜，通关后生成一个 emoji 战绩图让玩家晒到群里。text-engine 的盘就是 JSON，你甚至可以做一个题库表每天轮换。变现走微信小游戏的激励视频（卡关看广告拿提示）+ 会员解锁往期题库。引擎核也可以不抄它的 GPL 代码，自己照“解析器+房间图”的思路重写一个——思路免费，代码清洁。

**2. 聊天界面皮的文字怪谈（MVP：2-3 周）。** 把终端 UI 换成聊天 App 的样子：NPC 是聊天列表里的联系人，topics 是消息气泡，`talk to mary` 变成点开对话框。悬疑/怪谈题材天然适合这个皮，内购解锁章节是成熟路径。技术上只需重写 `println` 一层，引擎的房间-物品-话题模型原样保留。

**3. 把“盘”卖给不会写代码的人（MVP：2 周 + 持续销售）。** 最反直觉的一步棋：这个引擎最值钱的功能是“内容即 JSON”。做一个套壳产品——教师做互动课文、博物馆做导览、HR 做入职培训剧情、品牌做互动H5——用户填表单生成盘，你收订阅费。你不是在卖游戏，是在卖“让任何岗位的人做出文字冒险”的能力，B 端客单价远高于 C 端广告。

顺带一提，作者自己的 Monkey Trap 就是这条技术路线的活广告：同一套终端美学，做一款完全免费的网页游戏，换来的是口碑和约稿——对个人开发者，这本身也是一种变现。

## 上手

- 仓库：https://github.com/okaybenji/text-engine
- 在线 Demo：https://okaybenji.github.io/text-engine/
- itch.io 页面：https://okaybenji.itch.io/text-engine

建议的入手顺序：先玩十分钟 demo，把每个命令都敲一遍；然后打开 `game-disks/demo-disk.js`，对照着玩到的内容读 JSON——你会发现屏幕上每句话都对应一个字段；最后拷贝 `newDiskTemplate`，把第一个房间改成你家。到这一步，你距离发布自己的文字冒险，大概只剩一个周末和一个好故事。

> [!tip] 51学通信知识星球
> **星主：爱卫生**（微信：gprshome201101）——公众号「51学通信」创办者，19 年通信行业运维与讲师经验，著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书（各大电商平台有售）。
> **星球定位**：深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域，主打运维岗位与信令分析。
> **当前规模**：5200 篇主题 / 990 个回答，198 元/年。
> **加入福利**：加入星球后请加爱卫生微信，拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题，另有群内分享。
> **AI 加持**：51学通信知识星球已作为 skill 接入 WorkBuddy，使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例，做总结、找文档和 PPT 等场景全覆盖。

![51学通信知识星球海报-扫码加入](https://wiki.500nian.com/images/zhixingqiu_qrcode.png)
