# 05 发布标准清单 (Release Guide)

> 正式发布前所有 **P0 必须项** 须全部打勾。参考：`docs_dev/certification_checklist.md`（权威完整版）。

---

## 一、P0 技术验收（S6 P0，均已通过）

| 编号 | 项目 | 状态 | 说明 |
|:---|:---|:---:|:---|
| P-S6-01 | Wave 1~20 无崩溃通关；W8/W20 Boss 正常 | ✅ | 系统已实现并实测 |
| P-S6-02 | 500 敌人 + 1500 子弹稳定 60fps | ✅ | 实测 180fps / 0.6ms |
| P-S6-03 | Endless 排行榜 + HMAC 签名 | ✅ | user://endless_records.json |
| P-S6-04 | 死亡时截图保存非黑屏 | ✅ | user://runs/run_*.png |
| P-S6-05 | 所有 P6-N 规范条目无违反 | ✅ | 1 修复 / 11 PASS |
| P-S6-06 | 四语本地化（zh_CN/zh_TW/en/ja） | 🟡 | 骨架完成；法术/Core 名待键化 |
| P-S6-07 | 内存峰值 RSS < 512MB | ✅ | 实测 ~176MB |

---

## 二、内容完成清单（发布前必做）

### 2.1 法术内容（当前：14 张，目标：20+ 张）

| 类型 | 已有 | 缺失（示例） |
|:---|:---|:---|
| ACTION | spark_bolt, energy_orb, fire_bolt, poison_dart, laser_beam, water_wave, chain_bolt, plasma_storm (产物), poison_pool, summon_turret | ice_nova, nuke, homing, chain_bolt（独立弹道版）|
| MODIFIER | damage_plus, spread_mod, double_cast | heavy_cost, speed_mult_mod |
| TRIGGER | trigger_on_hit | trigger_on_kill（Timer 触发型） |
| LOGIC | every_n_shots, if_hp_below, if_enemy_nearby, loop | — |

**添加法术流程** → 见 [02 内容创作指南 §A](02_content_authoring.md)

### 2.2 Core 种类（当前：5 种，目标：7 种）

| Core | 状态 |
|:---|:---|
| wand_basic | ✅ |
| wand_fast | ✅ |
| wand_memory (PERSISTENT_MEMORY) | ✅ |
| matrix_board (MATRIX 2×4) | ✅ |
| circuit_fork (CIRCUIT) | ✅ |
| staff_long (10 槽) | ⬜ 待加 |
| wand_eternal (INFINITE_SPELLS) | ⬜ 待加 |

### 2.3 美术资源（当前：全程序化占位）

| 资源 | 规格 | 优先级 |
|:---|:---|:---|
| 玩家精灵 | 64×64 PNG，4 方向或单帧 | P0 |
| 敌人 Atlas（6 原型） | 512×512，每格 64×64 | P0 |
| 子弹 Atlas（按 damage_type） | 256×64，每格 32×32 | P0 |
| VFX 粒子场景（8 种特效） | GPUParticles2D，one_shot=true | P0 |
| UI Theme / 背景 | 商店/结算/设置背景图 | P1 |
| App 图标 | 512×512 PNG | P0 发布前 |

**替换方法** → 见 [03 资源替换指南](03_asset_replacement.md)

### 2.4 音效资源（当前：程序化蜂鸣）

| 文件 | 内容 |
|:---|:---|
| `audio/sfx/hit.ogg` | 子弹命中 |
| `audio/sfx/kill.ogg` | 敌人死亡 |
| `audio/sfx/hurt.ogg` | 玩家受击 |
| `audio/sfx/wave_complete.ogg` | 波次结算 |
| `audio/sfx/boss.ogg` | Boss 入场 |
| `audio/sfx/shop.ogg` | 商店开启 |
| `audio/sfx/buy.ogg` | 购买法术 |
| `audio/sfx/level_up.ogg` | 升级 |
| `audio/bgm/battle_*.ogg` | 战斗 BGM（循环）|

**替换方法** → 见 [03 资源替换指南 §A](03_asset_replacement.md)

### 2.5 本地化补全

- [ ] 所有法术 `display_name` / `description` 改为 `tr()` 键
- [ ] 所有 Core `display_name` 改为 `tr()` 键
- [ ] 所有状态效果名改为 `tr()` 键
- [ ] Boss 名称键化
- [ ] 商店页文案（Steam 商店描述，日/英/繁中）

---

## 三、Steam PC 发布前必须项

### 3.1 Steamworks 配置（代码端）

1. **安装 GodotSteam 插件**（godotsteam.com）
2. **初始化**：在 `CrashReporter._ready()` 前调用 `Steam.init()`
3. **成就钩子**（ST-11）：`AchievementManager` 订阅 `EventID.ACHIEVEMENT_UNLOCKED`（ID=18）：
   ```gdscript
   func _on_achievement_unlocked(p: Dictionary) -> void:
       Steam.set_achievement(p.get("achievement_id",""))
       Steam.store_stats()
   ```
4. **云存档**（ST-50）：`ProfileManager.save_run()` 包裹 `Steam.beginFileWriteBatch/endFileWriteBatch`
5. **排行榜提交**（ST-42）：`EndlessRecords.add_record()` 后尝试 `Steam.uploadLeaderboardScore()`，网络失败静默缓存

### 3.2 认证检查项速查

| 编号 | 项目 | 实现位置 |
|:---|:---|:---|
| ST-01 | 不收集 PII | 无账号系统 ✅ |
| ST-03 | 清除所有本地数据 | `SettingsManager.clear_all_local_data()` ✅ |
| ST-10 | Steam.init() 成功 | 待实现 |
| ST-20 | 手柄基本可用 | 待实现（InputMap 映射） |
| ST-30 | Steam Deck 1280×800 | 待测试 |
| ST-40/41 | HMAC 签名排行榜 | `endless_records.gd` ✅ |
| ST-50 | Steam Cloud 存档 | 待实现（profile_manager.gd 已有位置） |

完整清单见 `docs_dev/certification_checklist.md`

---

## 四、构建与发布流程

### 4.1 导出配置（Godot Editor）

```
Project → Export
```

| 平台 | 模板 | 注意 |
|:---|:---|:---|
| Windows x64 | Export with Mono runtime | 勾选"Embed PCK"打包为单文件 |
| Steam Deck (Linux) | Linux x86_64 Mono | 须在 SteamOS/Proton 下测试（ST-33）|

### 4.2 版本号管理

在 `project.godot` 设置：
```ini
[application]
config/version="1.0.0"
```

发布时打 git tag：
```bash
git tag v1.0.0
git push origin v1.0.0
```

并在 `CHANGELOG.md` 记录构建哈希（PRE-02 要求）。

### 4.3 发布前最终清单

```
[ ] 所有 P0 认证项 ✅（见 certification_checklist.md）
[ ] Steam 商店页：截图×5、宣传片、描述文字审核通过
[ ] IARC 自评系统完成（Steam 自动申报）
[ ] Wave 1~20 完整通关测试（无崩溃）
[ ] crash_reporter.gd 已为首位 Autoload（project.godot 验证）
[ ] version = "1.0.0" 已设置，git tag 已推送
```

---

## 五、QA 测试要点

| 场景 | 验证内容 |
|:---|:---|
| 全 20 波通关 | 每波正常生成；结算金币/XP 正确；W8/W20 Boss 阶段触发 |
| 法术排列测试 | MATRIX 邻接加成；CIRCUIT 双路；共鸣触发；LOGIC 门控 |
| 存档恢复 | 关闭游戏→重开→`resume_game()` 恢复法杖+波次 |
| 排行榜防篡改 | 手动修改 endless_records.json → 重启应拒绝载入 |
| 难度三档 | 初学者：受伤乘数×0.7（即减少30%）；挑战：W1 生成24敌（20×1.2），Boss HP×1.3 |
| 清除数据 | 设置→清除→确认→所有 user:// 文件消失 |
| 语言切换 | 商店中切语言→HUD/商店/背包/结算全部切换 |
| 性能压测 | 500 敌 + 1500 弹 → 帧率 ≥ 60fps |
| 内存 | Wave 20 Boss 战 → RSS < 512MB |
