# 崩坏童话：蜜糖村（网页版）

一个看起来百分之百治愈的像素童话村庄，实际是一场情绪疗程的沉浸幻境。
纯单机网页游戏：无存档、无后端、无 localStorage，浏览器打开即玩。完整流程约 25–35 分钟，含 4 个结局（E1 糖衣 / E2 回收 / E3 苏醒 / E4 静默）。

## 启动方式

```bash
npm install        # 安装依赖（phaser / vite / typescript）
npm run build      # 产出纯静态 dist/
npm run preview    # 本地游玩 → http://127.0.0.1:4815/
```

开发模式可用 `npm run dev`（热更新）。构建产物为纯静态文件，无外部网络请求、无外部音频/字体文件。

## 按键

| 按键 | 功能 |
|---|---|
| WASD / 方向键 | 移动（96 像素/秒，四向动画） |
| E | 交互 / 推进对话（靠近对象 ≤24 像素出现「按 E」提示） |
| ↑ / ↓ + E 或 1 / 2 / 3 | 对话选项（温柔 / 迟疑 / 否定） |
| `` ` ``（反引号） | Debug 面板开关 |

## Debug 面板（PRD §13）

默认关闭、无 UI 痕迹，不影响正常游玩。按反引号键 `` ` `` 开关，功能：

- 直接设置幸福值（0–100）、觉知值（0–100）、当前日（1–7）
- 传送到任意场景（10 选）
- 置齐全部线索（9 处）
- 强制触发四个结局之一（E1–E4）

## 玩法提示（无剧透）

每天早上看广场公告板接「今日幸福任务」，完成后黄昏钟声响起，回小屋睡觉进入次日。幸福值由左上角向日葵表盘显示（12 瓣，无数字）。村里的规则是「必须幸福」——但通往真相的路，恰恰是那些系统禁止的悲伤。古井与雾墙从第 5 天起可以靠近。

## 素材与地图制作流程（全部原创，无现成素材）

所有像素素材与地图均为本项目内程序化自制，未使用任何素材包或开源 tileset。生成脚本全部保留在仓库内，可一键复现。

### 像素素材（Aseprite 1.3，`tools/aseprite/`）

- 脚本：`gen_all.lua` 总编排，dofile 组织 `helpers.lua`（糖果色板/白色层灰板 + 像素原语）、`gen_tileset.lua`、`gen_player.lua`、`gen_npcs.lua`、`gen_extras.lua`、`gen_portraits.lua`。
- 复现命令：
  ```bash
  /Applications/Aseprite.app/Contents/MacOS/aseprite -b --script tools/aseprite/gen_all.lua
  ```
- 产出（`public/assets/`）：
  - `tileset.png` 256×128：16×16 瓦片 ×128（草地/石路/湖水/花丛/莓果丛/树/房屋/室内家具/井/雾/白色层，瓦片 id 表见 `CONTRACT.md` §2）
  - `sprites/player.png` 64×96：16×24/帧，4 朝向 × 4 帧行走，第 0 帧兼待机
  - `sprites/npc_*.png`：7 组具名 NPC 各 3 档表情（smile/flat/off，off 与 smile 仅差 1–2 像素）+ 双子鸟 2 帧张嘴 + 群演 ×5 各 2 帧循环
  - `portraits/*.png`：主角微笑头像、E3 专用「真实的脸」头像、7 张 NPC 头像，各 32×32

### 地图（Tiled 1.12，`tools/tiled/`）

- 脚本：`genmaps.js`（Tiled 脚本运行时 `Tiled -e` 执行，TextFile 写出 .tmx），再用 Tiled CLI 导出 JSON。
- 复现命令：
  ```bash
  /Applications/Tiled.app/Contents/MacOS/Tiled -e tools/tiled/genmaps.js
  for m in house plaza bakery shop clinic lake field well fog white; do
    /Applications/Tiled.app/Contents/MacOS/Tiled --export-map --embed-tilesets \
      public/assets/maps/$m.tmx public/assets/maps/$m.json
  done
  ```
- 产出（`public/assets/maps/`）：10 张地图（小屋 12×8 / 广场 30×20 / 面包房 15×10 / 杂货店 15×10 / 诊所 12×8 / 湖畔 24×16 / 花田 20×14 / 古井 14×10 / 雾墙 20×8 / 白色层 20×14），统一 `ground` / `obstacles`（`collides=true`）/ `objects`（spawn、NPC 点位、door、交互点）三层结构；所有室外场景经村广场互通，门双向成对。

## 技术架构（PRD §12）

- Phaser 3 + TypeScript + Vite；逻辑分辨率 320×180，整数倍放大居中，`pixelArt: true` 禁用纹理平滑。
- 场景：BootScene / TitleScene / 10 个地图 Scene（共用 MapScene 基类）/ 常驻 UIScene（对话框、向日葵表盘、提示）/ DreamScene / EndingScene。
- `CorruptionDirector`：普通 TS 单例 + 事件发射器，持有幸福/觉知/日期/任务标记/线索集合/侵蚀阶段，是全部状态与视听参数的唯一真源；饱和度与晕影用相机 postFX（ColorMatrix / Vignette），负片闪帧用 ColorMatrix negative 单帧切换。
- BGM 与音效全部 Web Audio 程序合成（8 小节 8-bit 循环：方波主旋律 + 三角波低音 + 鸟鸣声部；音效 4 个），playbackRate 与低通由 CorruptionDirector 按 §6.4 矩阵驱动。
- 文本腐蚀在对话渲染层实施（§6.5 十组同音错字，原文案保持干净），优先命中咪咪。

## 验收

`tools/acceptance.mjs` 为自动化验收脚本（puppeteer-core + 本机 Chrome），覆盖 PRD §14 的 20 条清单（静态逐字校验 + 真实浏览器全流程游玩 + Debug 面板 + 四结局 + 截图）：

```bash
npm run build && (npm run preview &) && node tools/acceptance.mjs
```

截图输出在 `tools/shots/`。
