chart_achievement: 正向支持按音符类别给判定数(绝赞单列),算出确切达成率
This commit is contained in:
@@ -42,18 +42,60 @@ python chart_achievement.py # 不给参数 = 交互向导
|
||||
|
||||
## 正向:已知判定数 → 达成率 + DX 分
|
||||
|
||||
达成率是**按音符权重加权**的(Tap 500 / Hold 1000 / Slide 1500 / Break 2500),
|
||||
所以有两种给判定数的方式:
|
||||
|
||||
### ① 精确:按音符类别给(推荐,得到确切数值)
|
||||
|
||||
```powershell
|
||||
python chart_achievement.py --chart "<...>\000008_03.ma2" --cp 290 --perfect 8 --great 3 --good 1
|
||||
python chart_achievement.py --game "<...>\Sinmai_Data" --music-id 8 --level 3 --cp 290 --perfect 8 --great 3 --good 1 # 3 = MASTER
|
||||
python chart_achievement.py --game "<...>\Sinmai_Data" --music-id 8 --level 3 --tap 260/0/3 --break 6 # 3 = MASTER
|
||||
```
|
||||
|
||||
- `--cp` / `--perfect` / `--great` / `--good` 都给个数,`--miss` 留空时自动补足
|
||||
(`miss = 总音符数 - CP - Perfect - Great - Good`)。
|
||||
- 输出达成率的**区间**(下界 ~ 上界)和「按比例分摊」的参考值:
|
||||
只给聚合判定数时,达成率取决于这些 Great/Good/Miss **落在哪些音符上**
|
||||
(落在绝赞上扣得多、落在 Tap 上扣得少),所以是一个区间而不是一个数。
|
||||
下界 = 扣分尽量落在高权重音符上,上界 = 尽量落在低权重音符上。
|
||||
- DX 分是确定的:`3×CP + 2×Perfect + 1×Great`。
|
||||
每个类别写 `CP/Perfect/Great/Good/Miss` 五个数(`/`、`,` 或空格分隔,后面可以省略),
|
||||
**没给满的部分按 CP 算**:
|
||||
|
||||
| 参数 | 类别 | 权重 |
|
||||
| --- | --- | --- |
|
||||
| `--tap` | Tap / Star / Touch / EX | 500 |
|
||||
| `--hold` | Hold 系 | 1000 |
|
||||
| `--slide` | Slide 系 | 1500 |
|
||||
| `--break` | 绝赞(Break 系) | 2500 |
|
||||
|
||||
绝赞的 Great / Perfect 本身还有档位,需要时可以再细分(不给就按 Great 失分 20%、Perfect 奖励 75 算):
|
||||
|
||||
| 参数 | 含义 |
|
||||
| --- | --- |
|
||||
| `--break-great40 N` | 绝赞里 N 个 Great 是「失分 40%」档(Great2nd) |
|
||||
| `--break-great50 N` | 绝赞里 N 个 Great 是「失分 50%」档(Great3rd) |
|
||||
| `--break-perfect50 N` | 绝赞里 N 个 Perfect 是「奖励分 50」档(Perfect2nd) |
|
||||
|
||||
输出就是一个**确切**的达成率,并附上失分 / 绝赞奖励分的明细:
|
||||
|
||||
```
|
||||
判定输入(按音符类别;Break = 绝赞;没给的部分按 CP 算)
|
||||
Tap/Star/Touch/EX (500) 263 个:CP 260 · Great 3
|
||||
Hold (1000) 14 个:CP 14
|
||||
Slide (1500) 19 个:CP 19
|
||||
Break (2500) 6 个:CP 6
|
||||
结果
|
||||
达成率 100.8413% (确切值)
|
||||
DX 分 900 / 906 (99.34%)
|
||||
```
|
||||
|
||||
### ② 汇总:只给总判定数(得到估计值 + 区间)
|
||||
|
||||
```powershell
|
||||
python chart_achievement.py --chart "<...>\000008_03.ma2" --cp 290 --perfect 8 --great 3 --good 1
|
||||
```
|
||||
|
||||
`--cp` / `--perfect` / `--great` / `--good` 都给总数,`--miss` 留空时自动补足
|
||||
(`miss = 总音符数 - CP - Perfect - Great - Good`)。
|
||||
|
||||
这时达成率取决于这些 Great/Good/Miss **落在哪类音符上**(落在绝赞上扣得多、落在 Tap 上扣得少),
|
||||
所以给出的是「按类别比例分摊的估计值」+ 一个区间(下界 = 扣分都落在高权重音符上,
|
||||
上界 = 都落在低权重音符上)。想要一个确切数值就用上面的 ①。
|
||||
|
||||
DX 分在两种方式下都是确定的:`3×CP + 2×Perfect + 1×Great`。
|
||||
|
||||
## 反向:已知达成率 → 判定组合 + DX 分
|
||||
|
||||
@@ -146,8 +188,11 @@ CP 的物理可能范围(Perfect 只能落在绝赞音符上,所以 CP 不
|
||||
|
||||
## 已知局限
|
||||
|
||||
- 只按谱面文本计算,不涉及游戏运行时的实际判定时机分布(例如绝赞 Perfect 是 75 还是 50 档,
|
||||
正向计算里只能给区间)。
|
||||
- 只按谱面文本计算,不涉及游戏运行时的实际判定时机分布。绝赞的 Great 档位(失分 20% / 40% / 50%)
|
||||
和 Perfect 档位(奖励 75 / 50)需要自己用 `--break-great40` / `--break-great50` /
|
||||
`--break-perfect50` 指定,不给就按 20% / 75 算。
|
||||
- 汇总模式(只给总判定数)只能给区间——这不是精度问题,是信息量不够:同样的判定总数,
|
||||
落在绝赞上和落在 Tap 上扣的分不同。要确切值就按类别给(`--tap` / `--hold` / `--slide` / `--break`)。
|
||||
- 精确反向只验证坏音符数 ≤ 12 的组合(见上文)。
|
||||
- 若 `.ma2` 里的 `T_NUM_ALL` 与解析出的计分音符数不一致,会在输出里给警告
|
||||
(全部 5419 个游戏谱面实测一致)。
|
||||
|
||||
Reference in New Issue
Block a user