Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 27 additions & 9 deletions README.en.md
Original file line number Diff line number Diff line change
Expand Up @@ -134,15 +134,33 @@ Chart statistics:
ournotes-deck chart-stats --data deck-data.json [--seeds 8] -o chart-stats.json
```

measures every chart's deck-independent numbers on the whole-live simulation with Gekisou on and a solo rank 1
(`ournotes-deck.chart-stats/2`). The play is the theoretical best play with Gekisou: every note judged at its time,
Just inside the Just-count ranges and Perfect elsewhere. Per seed: the exact no-skill score and the Gekisou ranges'
results, and for every score-up kind of the master (2000 / 2002 / 2004 / 2005 rows grouped by type, duration,
targets and conditions, see `kinds`) at every performance position the score gained at factor 1 per unit of deck
power (`weights[kind][k]`). A deck scores about `P × (score / power + Σ factor_k × weights[kind_k][k])`; every seed
checks this on a random deck of the master's own values at another power and fails beyond the flooring bound.
Charts with a luck range are given on the first N published seeds (`--seeds`, default 8), which is not a native
expectation; a chart with more than three fevers, where the game fails when the fourth starts, is `unplayable`.
measures every chart's deck-independent numbers on the whole-live simulation (`ournotes-deck.chart-stats/2`) in
two scenarios: Gekisou on (`seeds`, as a Battle Live plays) and Gekisou off (`offSeeds`, as a solo live such as Free
Live or Challenge Live plays).

With Gekisou on, the play is the theoretical best play with Gekisou: every note judged at its time, Just inside the
Just-count ranges and Perfect elsewhere, rank 1 in every range. Per seed: the exact no-skill score and the Gekisou
ranges' results, and for every score-up kind of the master (2000 / 2002 / 2004 / 2005 rows grouped by type,
duration, targets and conditions, see `kinds`) at every performance position the score gained at factor 1 per unit
of deck power (`weights[kind][k]`). A deck scores about `P × (score / power + Σ factor_k × weights[kind_k][k])`;
every seed checks this on a random deck of the master's own values at another power and fails beyond the flooring
bound. Charts with a luck range are given on the first N published seeds (`--seeds`, default 8), which is not a
native expectation; a chart with more than three fevers, where the game fails when the fourth starts, is
`unplayable` (it plays with Gekisou off).

Other ranks need no further play: a rank bonus is `trunc(rangeScore × percent / 100)`, a fixed score in the frame of
the range's end that changes no factor and no note score, so at rank r_i in range i the no-skill score is exactly
`score − Σ rankBonus_i + Σ trunc(rangeScore_i × rankBonusPercents_i[r_i − 1] / 100)` and a weight is
`weights[kind][k] + Σ (rankBonusPercents_i[r_i − 1] − rankBonusPercents_i[0]) / 100 × rangeWeights[kind][k][i]`
(`rangeWeights`: the range score the effect gains per unit of deck power). Every seed also plays its check deck at
random ranks through explicit rank confirmations (`rankCheck`). A kind whose conditions read the confirmed rank
(7012) has no `rangeWeights`, nor has a chart where a rank bonus can fall inside another range's score frames. Every
seed also gives the no-skill score and range scores of the same play with every Just judged Perfect
(`scorePerfect`, `rangeScorePerfect`).

With Gekisou off, the play is the theoretical best play (every note Perfect at its time), seed 0, without Just, luck,
Gekisou combo or rank bonus; `score`, `weights` and a check as above. A kind whose conditions read the Gekisou state
cannot play without Gekisou and has null weights.

## Tests

Expand Down
25 changes: 19 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -113,12 +113,25 @@ ournotes-deck live --data deck-data.json --roster box.json --score SCORE_ID --e
ournotes-deck chart-stats --data deck-data.json [--seeds 8] -o chart-stats.json
```

在整场模拟上(激走开启,单人名次 1)实测每张谱面与卡组无关的量(`ournotes-deck.chart-stats/2`)。打法为激走理论最佳:
每个音符按准点判定,Just 任务区间内为 Just,其余为 Perfect。每个种子给出:无技能的精确得分与各激走区间结果;
master 中每种加分效果(2000 / 2002 / 2004 / 2005,按类型、时长、目标、条件分组,见 `kinds`)在每个演出位上
因子为 1 时的得分增量除以综合力(`weights[kind][k]`)。卡组得分约为 `P × (score / power + Σ factor_k × weights[kind_k][k])`,
每个种子都用 master 真实数值的随机卡组在另一综合力下实跑校验,偏差超出取整上限即报错。有幸运区间的谱面按前 N 个
发布种子给出(`--seeds`,默认 8),这不是原生期望;超过三段 fever 的谱面游戏会在第四段开始时出错,记为 `unplayable`。
在整场模拟上实测每张谱面与卡组无关的量(`ournotes-deck.chart-stats/2`),分两种场景:激走开启(`seeds`,撃奏ライブ
的打法)与激走关闭(`offSeeds`,自由 Live、挑战 Live 等单人 Live 的打法)。

激走开启时打法为激走理论最佳:每个音符按准点判定,Just 任务区间内为 Just,其余为 Perfect,每个区间取名次 1。每个
种子给出:无技能的精确得分与各激走区间结果;master 中每种加分效果(2000 / 2002 / 2004 / 2005,按类型、时长、目标、
条件分组,见 `kinds`)在每个演出位上因子为 1 时的得分增量除以综合力(`weights[kind][k]`)。卡组得分约为
`P × (score / power + Σ factor_k × weights[kind_k][k])`,每个种子都用 master 真实数值的随机卡组在另一综合力下实跑校验,
偏差超出取整上限即报错。有幸运区间的谱面按前 N 个发布种子给出(`--seeds`,默认 8),这不是原生期望;超过三段 fever
的谱面游戏会在第四段开始时出错,记为 `unplayable`(激走关闭时照常可玩)。

其他名次不重跑:名次加成为 `trunc(区间得分 × 百分比 / 100)`,记在区间结束帧的固定分上,不改因子也不改音符得分,所以
区间 i 取名次 r_i 时无技能得分精确为 `score − Σ rankBonus_i + Σ trunc(rangeScore_i × rankBonusPercents_i[r_i − 1] / 100)`,
权重为 `weights[kind][k] + Σ (rankBonusPercents_i[r_i − 1] − rankBonusPercents_i[0]) / 100 × rangeWeights[kind][k][i]`
(`rangeWeights` 是该效果带来的区间得分增量除以综合力)。每个种子另用同一校验卡组在随机名次下走显式名次确认实跑校验
(`rankCheck`)。条件读取确认名次(7012)的效果种类没有 `rangeWeights`,名次加成可能落进另一区间得分帧的谱面整张没有。
每个种子还给出把 Just 全部改判 Perfect 的同一打法的无技能得分与各区间得分(`scorePerfect`、`rangeScorePerfect`)。

激走关闭时打法为理论最佳(每个音符准点 Perfect),种子 0,没有 Just、幸运、激走连击和名次加成;给出同形的 `score`、
`weights` 与校验。条件读取激走状态的效果种类在激走关闭时无法演出,其权重为 null。

## 测试

Expand Down
6 changes: 3 additions & 3 deletions src/bin/ournotes-deck.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,9 @@ conditional items also require --resource-type ID --resource-id ID and context.e
scenario options: --scenario free|mission|battle|arena|challenge --scenario-music ID --context FILE
--scenario-music is the special row ID for arena/challenge; --score always denotes the base chart.
--context uses explicit powerSnapshot.eventIds and separate resultClock normalized DateTime ticks.
chart-stats measures every chart on the whole-live simulation with Gekisou on (ournotes-deck.chart-stats/2): the
no-skill score and the weight of every score-up kind at every position, per seed (--seeds N for charts with a luck
range, default 8).
chart-stats measures every chart on the whole-live simulation (ournotes-deck.chart-stats/2): the no-skill score and
the weight of every score-up kind at every position, with Gekisou on per seed (--seeds N for charts with a luck range,
default 8; rank 1, range weights for the other ranks, the Perfect play's scores) and with Gekisou off (offSeeds).
common options: -k N (default 10), --leader ID, --include ID[,ID...], --exclude ID[,ID...],
--exclude-snaps ID[,ID...], --no-snaps, --time-limit-ms N";

Expand Down
Loading
Loading