Files
spellforge/docs/handbook/05_release_guide.md
joywayerandClaude Opus 4.8 ad2f4c0bc6 docs: 整理文档目录并对齐代码现状
- 将开发过程/归档文档迁至 docs_dev/(development_plan、certification_checklist、
  已废弃的 Cocos 架构草案 archived_cocos_architecture_draft),并修正全部跨引用
- 新增根 README.md(项目介绍,暂定名 Spellforge)与 docs_dev/README.md 索引
- 新增 docs_dev/doc_code_audit_2026-07-20.md:文档 vs 代码交叉审计报告(经 6
  路对抗性复核,零证伪),含「代码更优 / 文档更优 / 中性」判定汇总
- 在 docs/ 各设计·技术·机制文档就地加「实现现状 (2026-07-20)」callout:
  追认代码更优实现(纯 JSON 数据驱动、SpatialGrid-only 碰撞、MultiMesh 单档、
  存档选最新槽等),订正陈旧/矛盾内容(.tres→JSON、Boss HP/阈值/波次、EventID、
  StatusManager.apply 签名等),标记未实现功能(C# 热路径、Mana、元进展、
  Boss 阶段/抗性、Tutorial、轨迹/连锁/催化等)与 latent bug(CoreFeatureTag 位运算、
  pierce 空操作、MAX_OPS 不读 cpu_limit)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-20 14:35:55 +08:00

171 lines
6.1 KiB
Markdown
Raw Permalink 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.
# 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_killTimer 触发型) |
| 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 PNG4 方向或单帧 | P0 |
| 敌人 Atlas6 原型) | 512×512,每格 64×64 | P0 |
| 子弹 Atlas(按 damage_type | 256×64,每格 32×32 | P0 |
| VFX 粒子场景(8 种特效) | GPUParticles2Done_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 已为首位 Autoloadproject.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 |