40250 classic: G1 integrate W4 (§9.1 map BGM selection, §9.2 background volume save/restore)
Doc conflicts resolved by W0: all four 增量 50 change-log bullets kept, W4 C.5 batch record appended. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014yvAPqPivoY7vmBbzgqK4W
This commit is contained in:
+81
-1
@@ -2825,6 +2825,28 @@ OnOpenCandidateList / OnCloseCandidateList / OnOpenReadingWnd / OnCloseReadingWn
|
||||
(文件路径 `user://BGM/lastplay.inf`)。
|
||||
4. 换图(§1.3)走同一条选曲逻辑。
|
||||
|
||||
**状态**:✅ 完成(曲目解析 + 音量在 Godot 侧落地;C++ 侧 BGM 名/音量路由与保留由增量 49 完成)。
|
||||
真服验收待 40250 服务端。
|
||||
|
||||
**改动**(2026-09-02 / W4)
|
||||
|
||||
- `project/bgm_director.gd`:`_on_bgm_changed` / 新增 `_on_world_reset` → `_select()`;
|
||||
`_select()` 实现 `game.py:190` 三行逻辑——服务端 `current_track` 非空即播,为空回落
|
||||
`MusicInfo.fieldMusic`(`METIN2THEMA = "M2BG.mp3"`);音量 `current_volume >= 0` 用服务端值,
|
||||
否则 `DEFAULT_FIELD_MUSIC_VOLUME = 1.0/5.0*0.1 = 0.02`;先 `master_bgm = vol` +
|
||||
`set_music_volume(vol)` 再 `play_bgm(track)`(淡入前置音量);`bind()` 连
|
||||
`M2Client.world_reset` 做换图重选。声音(SFX)音量参考取自系统设置,不随 BGM 包下发,
|
||||
故不改 `master_sfx`。
|
||||
- `project/musicinfo.gd`(新):常量 `METIN2THEMA / loginMusic / createMusic / selectMusic /
|
||||
fieldMusic`;静态 `save_last_play_field_music(name)` / `load_last_play_field_music()`
|
||||
持久化到 `user://BGM/lastplay.inf`。
|
||||
|
||||
**测试**:`godot --headless --path project --script res://bgm_test.gd` → PASS(exit 0)。
|
||||
覆盖:服务端名+音量、名+音量未指定(默认 0.02)、名为空回落 `fieldMusic`、`world_reset`
|
||||
重跑选曲、`lastplay.inf` 往返。`gamescene_test` / `netplay_test` / `p9_test` 回归全绿。无 C++ 改动。
|
||||
|
||||
**验收**:未验证(无真实 40250 服务端;地图 BGM 名 / 音量需服务端 `GC_MAIN_CHARACTER3/4` 数据)。
|
||||
|
||||
---
|
||||
|
||||
### 9.2 后台恢复后可能没有 BGM
|
||||
@@ -2844,10 +2866,42 @@ OnOpenCandidateList / OnCloseCandidateList / OnOpenReadingWnd / OnCloseReadingWn
|
||||
`m_fBackupMusicVolume / m_fBackupSoundVolume`。
|
||||
4. 这样 `_bgm_name` 不再被清空,曲目继续播放,恢复后音量还原。
|
||||
|
||||
**状态**:✅ 完成。
|
||||
|
||||
**改动**(2026-09-02 / W4)
|
||||
|
||||
- `project/audio.gd`:新增 `_backup_music_volume` / `_backup_sound_volume`(对齐参考
|
||||
`m_fBackupMusicVolume / m_fBackupSoundVolume`)+ `_volume_saved` 守卫;`save_volume()`
|
||||
存 `master_bgm/master_sfx`,`restore_volume()` 还原并把音量重新贴到当前 BGM 声道;
|
||||
新增 `set_music_volume(v)`(立即把 `master_bgm` 应用到正在播放的声道,无淡入)。
|
||||
- `project/app_lifecycle.gd`:`_enter_background()` 把 `_bound_audio.stop_bgm()` 换成
|
||||
`save_volume()` + `set_music_volume(0.0)`(等价 `SaveVolume()` 后 `SetMusicVolume(0)`);
|
||||
`_exit_background()` 加 `restore_volume()`。`_bgm_name` / `_bgm[]` 全程不动。
|
||||
|
||||
**测试**:`bgm_test.gd` 的 `_test_background_save_restore`——`_enter_background()` 后
|
||||
`master_bgm == 0`、备份为 `0.6/0.9`、`_bgm_name` 不变;`_exit_background()` 后
|
||||
`master_bgm/master_sfx` 还原为 `0.6/0.9`、`_bgm_name` 仍不变、备份标志清除。PASS(exit 0)。
|
||||
|
||||
**验收**:未验证(需真机 Android/iOS 前后台切换;本条无 1:1 桌面参考)。
|
||||
|
||||
---
|
||||
|
||||
### 9.3 生命周期所有权重复
|
||||
|
||||
**状态**:设计已确认,落地推迟到 Phase 2(由 W0 执行)。
|
||||
|
||||
**当前**:`AppLifecycle` 由 `GameScene._build()` 自建(`game_scene.gd:181` `AppLifecycle.new()`
|
||||
+ `add_child` + `bind(client, _audio)`);`M2Client` 自带 `_notification()` 处理
|
||||
`NOTIFICATION_APPLICATION_PAUSED/RESUMED` 直接调 `suspend()/resume()`
|
||||
(`extension/src/net/m2_client.cpp:2607`)。两处都在监听生命周期通知。
|
||||
|
||||
**目标设计(推迟到 Phase 2 / W0)**:`AppFlow` 作为唯一生命周期属主(等价
|
||||
`CPythonApplication`),由它创建并持有 `AppLifecycle`;`GameScene` 不再自建;
|
||||
`M2Client` 删除 `NOTIFICATION_*` 处理,只保留被 `AppLifecycle` 调用的
|
||||
`suspend() / resume()`。暂停 / 恢复 / 内存警告 / 关闭四条路径各只有一个入口,写进
|
||||
`docs/CLIENT-PORT.md` 的生命周期小节。本批次未改 `game_scene.gd` / `app_flow.gd` /
|
||||
`m2_client.*`(跨工作流共享文件,属 W0 / Phase 2 范围)。
|
||||
|
||||
**参考**:唯一协调者是 `CPythonApplication`
|
||||
(`REF/UserInterface/PythonApplication.cpp` + `PythonApplicationEvent.cpp`),
|
||||
`CPythonNetworkStream` 只是被它驱动的一个子系统。
|
||||
@@ -3112,7 +3166,7 @@ var _pw := "123456789"
|
||||
| W1 协议 / 账号会话 | 🟡 开发中(增量 50:§1.5 / §1.10 / §2.2 已落地,待真实验收) | 角色槽地址透传、发送结果、unknown / unhandled 错误链路、断线回 LOGIN;§1.5 locale 分支 + `CGClientVersion2`(0xf1);§1.10 `text_codec.h` + `to_wire` 路由 + `net_text_codec_test`(套件 16→17);§2.2 `GC_CHARACTER_ADD` 隐身丢弃 / PC·NPC 暂存 / 其余按 `npclist.txt` 命名立即 spawn,`GC_CHAR_ADDITIONAL_INFO` 无 pending 丢弃、命中则 `mut_spawn_full` 合并;G1 已接线 `set_executable_name` / `set_npclist_path` / `mut_affect_flags` | locale 代码页转码(CP949/CP1252)、真实双连接、进场延迟 |
|
||||
| W2 实体 / 世界 / 战斗 | 🟡 开发中(Phase 1 批次已交) | 增量 50:§2.1 两层模型(`EntityStore` 纯数据层 + `net_world._update_visibility()` 按 `CHAR_STAGE_VIEW_BOUND` / `AFFECT_SHOW_ALWAYS` / `IsWall` 建 / 淡出节点)、§2.3(`mut_spawn`→`mut_spawn_full` 整行替换 + 节点重建 + 上下马保坐标)、§2.4(点数快照清尾 / 单索引边界)、§2.5(`mut_affect_flags` 两段拼装 + 参考调用序刷新)已落地;`ctest` 16/16 + 7 项 GDScript 回归 + 新增 `net_world_vis_test` 全绿 | 远服端到端可见性 / VID 复用 / affect 表现验收;`state_flags` 表现层枚举 |
|
||||
| W3 玩法 UI / 输入 | 🟡 已有首版 | 多数窗口、背包 / 任务 / 社交、键位和输入已有回归;§8.6 数字键 / F1–F4 / Ctrl+数字入口已收敛;§8.3 帮助窗(`help_ui.gd` = `helpwindow.py` + `uiScriptLocale.HELP_*` 逐字,`H` / ESC 菜单 `help_button` 入口,`help_ui_test` 绿)已落地 | §8.6 剩余逐行键位、LSHIFT 翻页、表情包;帮助窗视觉 / `.sub` 贴图与真服未验收 |
|
||||
| W4 渲染 / 资产 / 音频 | 🟡 已有首版 | GR2 / `.msa` / `.mse`、地图 / 水体 / 天气 / BGM 部分链路已有;`bgm_director.gd` 消费点就位 | §9.1 地图 BGM 曲目解析 + 音量、§9.2 后台恢复曲目、§9.3 生命周期单一属主 |
|
||||
| W4 渲染 / 资产 / 音频 | 🟡 开发中 | 增量 50:§9.1 地图 BGM 选曲 + 音量(`bgm_director.gd` / 新 `musicinfo.gd`)、§9.2 后台音量存恢复(`audio.gd` / `app_lifecycle.gd`)已完成,`bgm_test` + 3 回归全绿;§9.3 设计已确认、落地推迟 Phase 2 | §9.3 由 W0 在 Phase 2 落地;BGM / 前后台真机验收 |
|
||||
| W5 打包 / 发布 / 验收 | ⬜ 未开始 | 已有 Godot 导出配置和构建入口 | 自包含资源包、Intel / Apple Silicon、签名和 Mac App 验收 |
|
||||
|
||||
### C.4 每批次回写模板
|
||||
@@ -3281,3 +3335,29 @@ var _pw := "123456789"
|
||||
帮助窗按非模态实现(原版 Lock()),ESC/关闭行为等价
|
||||
下一批次:Phase 2 由 W0 执行 G1 集成;§8.6 剩余逐行键位与表情包仍在 W3 范围
|
||||
```
|
||||
|
||||
```text
|
||||
批次:2026-09-02 / W4 / §9.1 §9.2 §9.3-doc
|
||||
状态:✅ 完成(§9.1 §9.2 代码 + 回归);§9.3 设计已确认,落地推迟到 Phase 2
|
||||
参考:POC/assets/root/game.py:190/225(选曲 + 先置音量);POC/assets/root/musicinfo.py
|
||||
(常量 + Save/LoadLastPlayFieldMusic);PythonNetworkStreamPhaseLoading.cpp:299
|
||||
(gs_fieldMusic_volume = 1/5*0.1);REF/MilesLib/SoundManager.h:31(SaveVolume/RestoreVolume)
|
||||
改动:
|
||||
project/bgm_director.gd —— _select() 补齐地图→曲目解析(服务端名优先 / 回落
|
||||
MusicInfo.fieldMusic / 默认音量 0.02 / 淡入前置音量);bind() 连 M2Client.world_reset
|
||||
换图重选
|
||||
project/musicinfo.gd(新)—— METIN2THEMA/loginMusic/createMusic/selectMusic/fieldMusic
|
||||
五常量 + save/load_last_play_field_music → user://BGM/lastplay.inf
|
||||
project/audio.gd —— +save_volume()/restore_volume()(字段 _backup_music_volume/
|
||||
_backup_sound_volume 对齐 m_fBackupMusicVolume/m_fBackupSoundVolume)+ set_music_volume()
|
||||
project/app_lifecycle.gd —— _enter_background 用 save_volume()+set_music_volume(0) 取代
|
||||
stop_bgm();_exit_background 加 restore_volume();_bgm_name 不清空
|
||||
project/bgm_test.gd(新)—— §9.1 选曲 4 例 + lastplay 往返 + §9.2 后台→前台存恢复
|
||||
测试:godot --headless --path project --script res://bgm_test.gd → PASS(exit 0);
|
||||
gamescene_test / netplay_test / p9_test 回归全绿;无 build/ 目录,无 C++ 改动(ctest 不涉及)
|
||||
验收:未验证(无真实 40250 服务端;前后台切换需真机 Android/iOS)
|
||||
风险与依赖:§9.3 需 W0 在 Phase 2 把 AppLifecycle 属主收敛到 AppFlow、M2Client 去掉
|
||||
NOTIFICATION_* —— 本批次按约束未改 game_scene.gd/app_flow.gd/m2_client.*;
|
||||
set_music_volume 只作用于当前 _bgm[_bgm_cur] 声道
|
||||
下一批次:Phase 2 由 W0 执行 §9.3 落地 + G1 集成与文档合并
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user