Skip to content

谱包&谱面 哈希计算与校验逻辑设计 #386

Description

@Chen-Luan

需求

  • 根据核心字段区分不同/相同谱面
  • 谱面导入/更新后即时识别并更新缓存

设计

核心字段:bpm 组、音符组、视觉效果组,核心字段一致的谱面视为同一张谱面。

同一张谱面共享同样的哈希和玩家分数记录。

流程

分为两种流程,第一种在导入/打开游戏时触发,用于更新选曲页分数;第二种在进入音游加载时触发,用于再次确保玩家未篡改游玩的谱面。

  • 谱包导入和扫描流程
    1. 玩家通过自制谱管理 UI 导入/更新谱包谱面;或玩家每次打开游戏时(检查自制谱路径下 文件路径+文件更新时间 与本地缓存的一致的文件将直接跳过整个流程)。
    2. 反序列化 ChartPackData 和 ChartData,提取 bpm 组、音符组、视觉效果组,创建一个 ChartHashData 实例。
    3. 对 ChartHashData 实例进行反序列化,需要确保字段顺序和小数位数固定、排除多余空格缩进和换行符以抹平平台差异。
    4. 对得到的 string/byte[] 进行哈希,得到谱面哈希。
    5. 将谱面路径+更新时间+哈希存入本地数据,可在此对谱包数据做解析并一并存入本地数据。
  • 游玩前校验流程
    1. 在玩家加载谱面时触发。
    2. 按照上述步骤对谱面再做一次哈希,如果不一致先更新本地数据。
    3. 将哈希留存于内存中,结算时记录玩家分数+游玩的谱面的哈希。

Metadata

Metadata

Assignees

No one assigned

    Labels

    Priority: 中 MediumType: 优化 Enhancement新需求或原有功能的优化 Optimization of new requirements or existing functions

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions