# 05 发布标准清单 (Release Guide) > 正式发布前所有 **P0 必须项** 须全部打勾。参考:`docs/plan/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/plan/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 |