roguish · CamHenlin/roguish
Roguish 是一款用 HTML/JavaScript 编写的浏览器端 Roguelike 游戏,仓库描述为开源、支持多人、可扩展。按 README,克隆仓库后可用 python -m SimpleHTTPServer 8000 启动本地服务,再在浏览器访问 localhost:8000 或 devindex.html 游...
这个项目把「文字冒险」拆成两个可以分别替换的部分:一边是确定性的规则与状态内核,另一边是负责写散文的语言模型。玩家在终端输入行动,模型提出叙述文本和一组带类型的事件,引擎独立校验这些事件是否合法、再归约进权威状态并写入只追加的历史。也就是说,模型没有直接修改存档的权力,它只是「提案方」,最终落盘的是经过引擎裁决的结果。这种把生成式模型约束在结构化输出契约之后的思路,是该项目最有学习价值的设计,也让整局游戏可以在离线环境中被重复回放与验证。
世界内容用 TOML 加 Markdown 编写,仓库自带一个名为 ember_hollow 的示例世界。TOML 负责声明世界级配置(包括模型端点的位置、要使用的模型名、场景入口等),Markdown 承担叙述性文本的撰写,两者组合形成可读、可用 Git 做版本管理的「世界包」。作者不需要写 Python 就能新增一个世界,只要遵守字段约定即可;README 中的 world-authoring 文档专门描述这套编写规范。
命令行工具围绕世界与会话两条主线组织。doctor 检查运行环境是否齐备,validate-world 静态校验世界定义,play 启动一局游戏,sessions create 可以在不进入游玩的情况下先建好一局,sessions list 列出该世界下的全部会话,reindex 重建索引,export 把时间线导出成 markdown 或 json。测试、世界校验、会话创建、回放、分支与导出这些操作全部离线可用,只有真正让模型生成叙述时才需要本地服务在线。
进入游戏后有一套以斜杠开头的会话内命令:/continue 在没有玩家输入的情况下让模型推进一个场景节拍;/history 回看最近若干回合;/undo 只是把当前位置往回挪一格,并不会删除后续历史;/branch 从当前回合派生出一个新的会话,两个分支共享此前全部历史、只在之后的新回合分叉;/checkpoint 与 /restore 提供命名指针的保存与回跳;/sessions 在局内切换或查看会话;/export 直接在当前终端里导出。这种「只追加、位置可回退」的数据模型,使得撤销、分支、检查点三者共享同一份不可变历史,避免了常见的存档覆盖问题。
对于需要可重复验证的场景,play 支持 --actions-file 参数:一个 UTF-8 文本文件,每行一条玩家行动,引擎会依次执行并展示已提交的叙述,跑完后回到正常交互输入。自动播放期间按 Ctrl-C 可以中断并接管。空行和游戏内命令会被拒绝,这个文件只接受玩家行动。若某条行动对应的模型响应在配置的修复尝试之后仍然不合法,同一行动最多再重试两次,仍失败则该回合不落盘、自动播放停在交互提示处;而传输层错误只报告不做自动重试,两者的处理策略被明确区分开。
运行时数据默认落在 .local-adventure/ 目录(可用环境变量 LOCAL_ADVENTURE_HOME 改写),其中包括 SQLite 数据库、用户主动放在那里的导出文件以及日志。备份这个目录就等于备份了全部会话,没有单独的存档命令,每一个合法的行动都会被自动保存。导出的内容只包含当前祖先链、重放得到的状态与检查点,会刻意剔除模型提示词与原始模型响应,这一取舍对分享战报很友好,也避免了把提示词结构泄露出去。
隐私边界在 README 里写得比较明确:引擎没有遥测,也不需要云端账号;提示词和游戏内容只会发送到 world.toml 中配置的模型端点,如果那个端点不是回环地址,就需要格外谨慎。依赖方面要求 Python 3.12 及以上,以及本地运行的 LM Studio 服务,模型名必须与 /v1/models 返回的标识完全一致,引擎以文本模式请求并附带明确的 JSON 输出契约。引擎自身采用 Apache-2.0 许可,但所用模型的许可证是独立的一份,两者不能混为一谈。
从学习角度看,这个仓库很适合作为「如何把 LLM 接进有状态的游戏系统」的参考样本:关注点分离(世界定义 / 会话历史 / 状态归约 / 模型适配)、只用追加写的历史表支撑撤销与分支、用显式的结构化输出契约替代自由文本解析、以及把失败重试策略区分成「内容不合法」与「传输失败」两类。需要注意的是它并非开箱即玩的成品游戏,需要自行准备本地模型服务与权重,且当前界面完全基于终端,没有图形客户端。
Endless Sky 是一款 C++ 编写的 2D 沙盒式太空探索游戏,玩法接近 Elite、Esc...
OpenLoco 是 Chris Sawyer《Locomotion》的开源重实现,对应一款模拟经营运输...