# Phigros Web V2：修复、视觉升级与网页优化

版本：4.0.1.2-v2。日期：2026-10-29。资源仍来自同一个本地 XAPK；旧发行包保留，新文件使用独立的 v2 名称。

## 界面与声音

- 重做为完整的选曲场景：模糊曲绘背景、左侧斜切大曲绘、右侧斜切曲目条、难度面板、原版评级、最高分与准确率、底部开始区域。
- 增加原版 Logo 的标题画面、章节封面选择界面、分组设置、暂停界面和独立结算界面。横屏、手机竖屏和短屏分别适配；竖屏保留选曲功能并提示横屏体验。
- 结算采用大评级、大分数、斜切曲绘、准确率 / 最大连击白色面板、判定分布与分数滚动效果。保留自动演示标识，不写入手动成绩。
- 从安装包导出原版 UI Sprite、Logo、φ / FC / V / S / A / B / C / F 评级、章节封面、界面短音效与四档结算音乐。原版 Source Han Sans & Saira 混合字体转换为拉丁和中文 UI WOFF2 子集。
- 选曲试听使用 GameInformation 中的原始 previewTime / previewEndTime；快速切曲时延后启动，避免每次经过曲目都下载音乐。试听可以关闭并独立调节音量。
- 保留原版基础音符贴图和打击音；击打粒子、闪光、原版 NoteRing 及减弱动态效果选项由网页引擎组合呈现。
- 增加场景斜切转场、选中态、标题呼吸动画、结算动画；遵循系统或设置中的“减少动态效果”。

这次追求原版视觉语言与素材一致性，但没有做逐像素的截图对比，也没有复刻原版每个场景脚本。章节剧情、原版解锁、SaturnOS 和部分专用演出依然属于未完成范围，不能称为与原版完全相同。

## 主要 bug 修复

| 问题 | 修复 |
| --- | --- |
| 暂停时判定仍运行，Hold 可断触、自动演示可继续计分 | 暂停期间冻结判定和谱面推进，仅允许释放已有输入 |
| 音频源长期累积 | 已结束的音源自动断开并移出活动集合，销毁时关闭 AudioContext |
| 音频同步依赖页面时间且有分段重启 | 改用连续 Web Audio 时钟，避免每秒重新创建播放段 |
| 快速开始 / 返回 / 重试时旧加载覆盖新会话 | 外层 SessionGate、AbortSignal、每个 await 的所有权检查，内层事务式资源提交 |
| 下载、解码和初始化可无限等待 | 分阶段进度、超时、取消、失败清理和明确的重试入口 |
| 图片加载失败后可能留下半套资源 | 所有资源成功后才原子提交；失败不替换当前谱面或音频 |
| 重复点击开始造成多个启动过程 | 同一次引擎启动去重，外层按钮在等待时禁用 |
| 输入监听不销毁、第一段快速滑动无法 Flick | 输入适配器销毁解绑，修复速度计算并保持数值有限 |
| DPR 变化但 CSS 尺寸不变时画布未更新 | 单独检查 DPR，并对高 DPR 设置上限 |
| 禁用或损坏 localStorage 阻止进入游戏 | 引擎和网页存储容错；不可写时允许游玩并提醒导出 |
| settings:null 导入报错、原型键可污染记录、Infinity combo | 对旧存档和类型边界做显式归一化，使用无原型字典并拒绝危险键 |
| 较高分导入覆盖了更高准确率或连击 | 各指标分别取最高值合并，FC 只接受布尔值 |
| 存储失败却显示“已保存” | 依据实际写入结果显示状态 |
| 搜索无结果仍可开始旧曲目 | 清空选中状态、禁用开始 / 演示 / 试听并提供重置筛选 |
| 原谱面声明数和实际数组不一致 | 保留原始 JSON，运行时从音符数组计算总数 |

## 网页专项优化

1. **虚拟曲目列表**：只保留可见行和少量缓冲，不把 334 首曲目的完整按钮和图片一次挂入 DOM；已有行复用，内容未变时保留其子节点。
2. **预建索引**：曲目 ID、slug、章节顺序和 NFKC 搜索文本只创建一次；搜索采用短延迟，支持全角 / 半角、大小写和多个关键词。
3. **原版曲序**：按原始章节和章节中的歌曲顺序排列，避免每次都重新按曲名打乱。
4. **按需音频与图像**：曲目音频仍仅在开始或试听时加载；结算 BGM 按需加载，章节封面在打开章节界面后才出现，首屏 UI 字体使用小体积子集。
5. **Canvas 与模糊成本**：高 DPR 限制、低分辨率选项、较低分辨率背景模糊缓存、关闭无用的逐帧调试字样；iframe 进入结算后停止渲染循环。
6. **谱面解析**：去除一次重复 JSON.parse 与全字段 reviver，在数值构造中保持 Float32 行为；通过全库前后等价检查验证。
7. **资源生命周期**：取消无效加载、切曲 / 退出销毁上一 iframe、释放 ImageBitmap 与音频节点，页面隐藏时暂停。
8. **静态部署**：仍无后端、无运行时 CDN；使用相对路径支持网站子目录。增加 Linux 精确大小写、模块、CSS、iframe、目录与 UI manifest 引用审计。
9. **可靠交付**：独立的 v2 包名、原子写 ZIP、Linux 可读权限、源码完整收集、逐文件 SHA-256 与 CRC 校验；测试报告必须覆盖当前代码，防止沿用陈旧结果。

## 验证范围

已执行的离线验证包括完整谱面数值测试、引擎生命周期 / 时钟 / 取消测试、损坏存档和会话测试、资源完整解码、模块与路径审计、发行 ZIP 回归与校验。准确结果与数量见包内 `docs/reports/`。

本轮结果：1,064 / 1,064 张谱面通过计算与坐标检查，1,064 / 1,064 张谱面在新旧解析方式下产生相同的序列化数值；13 项引擎生命周期、23 项存档 / 会话、7 项发行回归全部通过。335 份曲目音频、341 份曲绘和缩略图、97 份 UI 图片、13 份引擎图片、18 份短音效 / 结算音频及 2 份字体均已离线校验。

在本机 Node 的纯解析基准中，选取最大的 3 张谱面，每种方式测试 3 次，解析中位数分别从 598 / 466 / 476 ms 降为 64 / 50 / 56 ms（约 8.5–9.4 倍）。这只说明本机该段解析代码的 CPU 成本下降，不是浏览器整曲帧率、移动端性能或总加载时间的测量。

本轮在文件系统权限放开后重新尝试打开 `http://127.0.0.1:8765/`，仍被浏览器工具保存的权限设置或受管策略拒绝。没有切换浏览器、直接浏览器协议或其他方法绕过。因此未完成实际浏览器截图、逐像素对比、真实多指、扬声器同步和移动端帧率验收；离线测试通过不等于这些项目已通过。

## 使用与升级

将 v2 ZIP 的内容完整解压到网站目录。浏览器旧版存档自动迁移；也可先在旧版导出 JSON，再在新版设置 → 存档中导入。升级后若网页外壳仍显示旧版，请刷新缓存。音乐与谱面资源没有改名，浏览器可继续利用已有缓存。

交付包含 `source.zip`、修改后的引擎与工具、固定版本依赖、原始字段定义以及所有许可证。游戏资产作者归属和原始曲目信息予以保留。
