- 将开发过程/归档文档迁至 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>
171 lines
6.1 KiB
Markdown
171 lines
6.1 KiB
Markdown
# 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 |
|