Files
wu-xia-fu-si-arg/README.md
T

6.1 KiB
Raw Blame History

《游戏名》

make-my-arg 的起点项目:每个生成的项目都把这棵树复制为起点,再按 docs/system-profile.md 组装、删改、填充。 纯静态、无构建步骤——HTML + CSS + 本地 vendored 的 Alpine v3 + 零依赖 Node 工具,任何静态托管都能跑。

模板说明(成稿时改写或删除本节)

  • 《》 是占位符:组织名、页面标题、正文文案,全部换成虚构自己的话。本页随项目一起改写。
  • 模板里的 <!-- --> 注释是写作指引,不是给玩家看的内容:填充页面时逐条删除。step 8 的 chrome 扫描会把残留提示当泄漏处理(R4)。
  • <html lang> 随故事的语言设置。
  • 入口页带一个指向 make-my-arg 技能仓库的 GitHub 链接(对技能的引用,请勿删除);入口除此之外只有进入按钮,没有“关于”页。
  • 这棵树只放不随模块变化的那部分:入口外壳、共用 css/js、两份忽略文件、README。带模块标记的文件——search.html(M1)、data/(M1/M2/M6)、secret.css(M5)、phone.css / chrome.css(设备类)、pages/ 与受限区域、结局页(M10)——由 step 6a 从技能仓库的 assets/templates/(js/css/html 前端代码模板,索引见其 README)按 docs/system-profile.md 的选择复制创建;profile 没选的机制一个都不出现。tools/ 和 viewer/ 由 step 6a 从 skill 的 assets/ 拼装进来,它们各有唯一出处,不要在项目里分叉维护。
  • 起点项目里没有 data/*.src.json:它自带的 .gitignore 会把这些明文表忽略掉,而明文表只应在 6a 选中对应模块时才创建。

目录结构

路径 说明
index.html 入口外壳(M9):身份赋予 + 进入按钮;底部带指向 make-my-arg 仓库的引用链接;规则说明只在虚构确有必要时出现
pages/ 站点页面,一篇一文档;受限区域用虚构自己的词命名(internal/ staff/ archive/),绝不叫 secret/,文件名不许剧透
assets/css/base.css 共用骨架:常驻顶栏、页面栏宽、文档套件、门禁表单、x-cloak、M11 纹理
assets/css/surface.css 公开层皮肤:色板与字体,唯一随虚构气质改动的地方
assets/css/secret.css M5 深层皮肤;profile 未选 M5 时这个文件不存在
assets/js/components.js 共用内核:hash()、session store 与 readState(M14);只注册 profile 选中的组件
assets/js/vendor/alpine.min.js node tools/vendor-alpine.mjs 拉取并校验 sha256 后落下,永不改动、不走 CDN
.gitignore 随起点项目落到项目根:开发副产物不进 Git 历史
.dockerignore 随起点项目落到项目根:明文表 / docs/ / 机制文件不进部署镜像
assets/img/ audio/ docs/ 图片、音频谜题、可下载的仿制文档(pdf/xlsx),用到才建
data/keywords.*.src.json 明文索引表,开发专用,不进部署树
data/keywords.*.json node tools/build-keywords.mjs 产出的哈希表,站点真正读取的文件
data/forbidden.json M6 禁用词模块(哈希 + 触发态文案)
data/credentials.src.json M2 派生凭据的出处登记(部件 + 规则),开发专用
tools/ step 6a 从 assets/tools/ 复制:检查器与 config.mjs
viewer/ step 6a 从 assets/viewer/ 复制:站点图渲染树,不是站点页面
docs/ step 1–5 的产物:story canon(五张表)、system-profile、GDD、触达链、谜题分析
deploy/ 部署脚本与清单,用到才建

tools/、viewer/、docs/、deploy/ 里没有站点页面:走图工具按 CONFIG.skipDirs 跳过它们,所以生成的站点图永远不会把页数撑大。

资产(assets/)

docs/gdd.md front matter 的资产清单是唯一来源。node tools/make-assets.mjs 按该清单重新生成全部 非文本资产:SVG 源写在 tools/asset-src/,再由宿主 ffmpeg/librsvg 光栅化为清单声明的 png/jpg; 通话录音由 espeak-ng + ffmpeg 电话频带链路合成。tools/ 不进部署树,页面只引用 assets/ 下的成品。

本地运行

静态站点,没有构建:

python3 -m http.server 8000     # 然后打开 http://localhost:8000

直接双击 index.html 也能看,但检索模块要 fetch() 读 data/*.json,需要 http(s),所以请用上面的本地服务。

检查(tools/ 拼装后可用)

node tools/build-keywords.mjs      # 改动任何 data/keywords*.src.json 之后,重新生成哈希表
node tools/check-links.mjs         # 死链 + 公开索引泄漏;期望 "0 dead · 0 layer leaks"
node tools/check-solvable.mjs      # 冷启动走查:每页可达、每个门可解、关键词都被读过
node tools/check-credentials.mjs   # 派生凭据:部件 + 规则 + 零明文(存在 credentials.src.json 时)
node tools/check-reachability.mjs  # 演算副本:把凭据注入一次性副本,复跑可达性
node tools/site-graph.mjs          # 产出 docs/site-graph.json 与 docs/site-graph/(报告型,有问题也退出 0)
node tools/check-solvable.mjs --self-test   # 改过 tools/config.mjs 之后自检匹配器

每次内容编辑后重跑,不只是部署前。改名、改层名、改标记只改 tools/config.mjs 一个文件,不要重写检查器。

部署

静态树部署就是一次拷贝,因此有第二条泄漏路径:明文 data/*.src.json(答案本身,R3)、docs/(GDD 与触达链就是全部答案)、tools/ viewer/ deploy/ 机制文件,都不得进入部署目录。两份忽略文件就在这棵树里,随复制落到项目根;GitHub Pages 直接发布仓库即可。

设计文档

  • docs/system-profile.md — step 2 与用户一起选定的容器与模块
  • docs/gdd.md — 游戏设计文档:front matter(资产清单 + 实体登记表)+ 八节
  • docs/reachability.md — 触达链分析:每页从哪来、守门是什么
  • docs/puzzle-audit.md — 谜题设计分析:必要性 / 可得性 / 直观性 / 泄漏扫描
  • docs/self-check.md — step 8 的逐项通过 / 失败清单