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

81 lines
6.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 《游戏名》
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/` 下的成品。
## 本地运行
静态站点,没有构建:
```bash
python3 -m http.server 8000 # 然后打开 http://localhost:8000
```
直接双击 `index.html` 也能看,但检索模块要 `fetch()` 读 `data/*.json`,需要 http(s),所以请用上面的本地服务。
## 检查(`tools/` 拼装后可用)
```bash
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 的逐项通过 / 失败清单