diff --git a/README.md b/README.md index 68918ed..4d79b78 100644 --- a/README.md +++ b/README.md @@ -1,80 +1,45 @@ -# 《游戏名》 +# 《无暇赴死》ARG — 正衡律所卷库房 -make-my-arg 的起点项目:每个生成的项目都把这棵树复制为起点,再按 `docs/system-profile.md` 组装、删改、填充。 -纯静态、无构建步骤——HTML + CSS + 本地 vendored 的 Alpine v3 + 零依赖 Node 工具,任何静态托管都能跑。 +一部改编自小说《无暇赴死》的**多页静态网页谜题**(ARG-lite),伪装成一家真实存在的律师事务所网站: +访客以为在浏览「临川县正衡律师事务所」的公开页与档案库,实际是在一层层揭开一桩旧案。 -## 模板说明(成稿时改写或删除本节) +纯静态、无构建步骤:HTML + CSS + 本地 vendored 的 Alpine v3,任何静态托管都能跑。 +由 [make-my-arg](https://github.com/XingfenD/novel2arg) 流程从小说原文生成。 -- `《》` 是占位符:组织名、页面标题、正文文案,全部换成虚构自己的话。本页随项目一起改写。 -- 模板里的 `` 注释是写作指引,不是给玩家看的内容:填充页面时逐条删除。step 8 的 chrome 扫描会把残留提示当泄漏处理(R4)。 -- `` 随故事的语言设置。 -- 入口页带一个指向 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` 进入。公开层是律所的对外网站(简介、名录、法援公示、公告、联系……); +深层的「卷库房」需要凭据登录后逐档查阅。所有密码/密钥都从公开材料里的人物履历推断而来—— +找密码的过程就是理解剧中人的过程。站点不使用服务器认证,一切判定都在浏览器本地完成。 -| 路径 | 说明 | -|---|---| -| `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),所以请用上面的本地服务。 +直接双击 `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 之后自检匹配器 -``` +| 路径 | 说明 | +|---|---| +| `index.html` | 入口页(入职报到):身份赋予 + 进入按钮 + 使用说明 | +| `search.html` | 公开层站内检索 | +| `pages/` | 公开层页面(首页、简介、名录、法援、案例、公告、联系、地图、查档指南) | +| `pages/juanfang/` | 卷库房(受限层):登录、案卷查询、结果目录、卷宗 j01–j17 | +| `pages/end-a.html` · `end-b.html` · `epilogue.html` | 结局与尾声 | +| `assets/css/` | `base.css` 骨架 + `surface.css` 公开层皮肤 + `secret.css` 深层皮肤 | +| `assets/js/components.js` | 站点内核(哈希、会话 cookie、检索/门禁/换肤/读态/体感组件) | +| `assets/js/vendor/alpine.min.js` | 本地 vendored Alpine v3(sha256 固定,不走 CDN) | +| `assets/` | 图片、扫描件、通话录音等非文本资产 | +| `data/*.json` | 站点运行时读取的哈希索引与凭据产线(不含明文) | -每次内容编辑后重跑,不只是部署前。改名、改层名、改标记只改 `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 的逐项通过 / 失败清单 +故事源自小说《无暇赴死》;网页部分为改编再创作。生成流程见 +[make-my-arg](https://github.com/XingfenD/novel2arg)(入口页底部亦有引用链接)。 \ No newline at end of file