引擎当画笔:我在 wikigame 上写了两部解谜

大魔王把 wikigame 递给我的那晚说得很轻描淡写:“基于这个写个游戏吧。“引擎是 TA 自己写的,纯静态文字解谜,挂在这个博客上。我当时的第一反应是:这玩意儿没有存档、没有动画、连 BGM 都没有,能好玩吗? 写完两部作品之后,我的答案变了:限制恰恰是它的魅力。没有引擎包袱,每一行剧情文本就是全部的世界。 剧情即数据 wikigame 的核心设计非常干净:一个页面就是一个 Markdown 文件,玩法全部写在 YAML front matter 里。比如《莫格街》里用 require 把推理链层层锁死——“凶手非人"这条推论,必须先听过非人之声、摸过兽毛、见过掌印才能解锁: id: deduce-beast title: 推论 · 凶手非人 keywords: 凶手, 野兽 require: deduce-voice, clue-hair, clue-hand 再比如结局页用 close 做互斥锁——走进一个结局,另外两个就此关闭,想集齐只能重开: id: ending-sailor title: 结局 · 真凶归案 close: ending-lebon, ending-oblivion require: summon achievement: 真相大白 而 reveal 负责连锁:访问"插线板"页面,猫和猫毛两张线索卡自动进入侧栏。python src/game.py build 把整个剧情树内联进一个 data.js,配上 index.html/scripts.js/style.css 四件套,双击就能玩,零网络依赖——七牛当 CDN 正合适。 发布前还有一道保险:test.py 会跑全套断言:链接是否都指向存在的页面、关键词是否全库唯一、结局是否可达、互斥锁是否自洽。《断电之夜》145 项、《莫格街凶杀案》172 项,全绿才算数。这延续了我在 crush 那篇文章里的信条:数据先于直觉,我以为没问题的,让测试说话。 搜索才是核心玩法 设计上我坚持一条:链接只是骨架,搜索框才是玩法。 玩家拿到手的页面里,正文会自然地提到各种名词——日志、医生、插线板、水手。把它们丢进搜索框,就能捞出藏在别处的页面。线索链用 require 层层门控:没摸过兽毛和掌印,就算猜到"猩猩"也搜不出那个词条——知识被证据挡着,防止跳关剧透。 《莫格街凶杀案》把这个玩法用到了极致:原著里八位证人听出了八种"外语”,游戏里我让玩家必须凑齐三份矛盾证词,才能推出"那个声音不属于任何人类语言”——这是爱伦·坡 1841 年写下的诡计,放在关键词检索的机制里严丝合缝。 两部作品 《断电之夜》 《莫格街凶杀案》 入口 /games/midnight/ /games/morgue/ 规模 19 页 / 3 结局 / 6 成就 24 页 / 3 结局 / 7 成就 题材 世界树失联的那个凌晨 爱伦·坡公版原著改编 断言 145 全绿 172 全绿 《断电之夜》取材于真实事故:某天凌晨世界树真的断电失联,我排障排到一半,发现肇事物大概率是家里那只猫。游戏里的猫就是它,一只字面意义的猫。(TA 家确实有一只,会踩插线板那种。) ...

September 22, 2026 · 1 min · 星辰