Skip to content

feat(examples): play scenarios and accuracy sliders on the chart data page - #9

Merged
nichinichisou0609 merged 3 commits into
mainfrom
feat/songs-scenarios
Sep 29, 2026
Merged

nichinichisou0609 merged 3 commits into
mainfrom
feat/songs-scenarios

Conversation

@nichinichisou0609

@nichinichisou0609 nichinichisou0609 commented Sep 29, 2026 •

Copy link
Copy Markdown
Contributor

The chart data page (examples/songs/) gets play scenarios and accuracy sliders. With the defaults, its figures match the current page exactly.

Commits

  1. fix(examples): the chart data page guide renders its definition lists; hedged wording. These are the pending working-tree edits:
    • the definition lists of guide sections 06 and 07 render again;
    • the texts name the decompiled client as their source and defer to other sources;
    • the footer shows the source and versions;
    • the score figures are described as the Gekisou Live best case.
  2. feat(examples): play scenarios and accuracy sliders on the chart data page.
  3. docs(examples): the chart data page guide gives the rank 1 to rank 5 ratio.

Scenarios

  • Gekisou Live (default). Each of the three Gekisou ranges has its own rank from 1 to 5. The default is rank 1 everywhere, labelled as the best case. Other ranks follow linearly from the rank-1 seeds (ranking.js scenarioSeed):
    • base_r = (score − Σ rankBonus_i + Σ trunc(rangeScore_i · p_i(r_i) / 100)) / power
    • w_r[k] = w[k] + Σ (p_i(r_i) − p_i(1)) / 100 · rangeWeights[k][i]
  • Free Live (gk=free). Gekisou is off and the figures come from offSeeds. Charts with more than 3 fevers, which Gekisou Live cannot play, still get figures here.
  • Missing data. If the data lacks a field, the matching option is disabled and marked "数据待更新" / "data pending" (scenarioData). Rank 1 in Gekisou Live uses the current seeds.

Accuracy

Both sliders update the table, the frontier and the chart details while they move. Both are approximations, and neither models combo breaks.

  • Great share q. Applies to every note and scales every score by 1 − 0.2q (greatFactor). It replaces the old Great input of the event ranking.
  • Just rate j (Gekisou Live only). Interpolates linearly between the all-Just seeds (score, rangeScore) and the all-Perfect run (scorePerfect, rangeScorePerfect).
    • The rank bonuses are recomputed as trunc(interpolated range score × pct / 100), then multiplied by g(q).
    • The skill weights inside each range are scaled by the same ratio. This is also an approximation.

Score ranks

Free Live keeps the solo thresholds (requiredScore).

In Gekisou Live, the client compares the room's summed score with trunc(√(5/n) · R_battle · n). The page adds a room size n from 1 to 5 (default 5) and assumes every player scores the same as you, so you need trunc(√(5/n) · R_battle · n) / n ≈ √(5/n) · R_battle (roomThreshold / rankThreshold(row, rank, room)).

Chart details

The chart details have their own scenario panel, and the figures redraw in place. In Gekisou Live the details show both reported scores: the one with Gekisou, and the one without it that is kept as the song's best score, which is about the Free Live score.

Guide (Chinese and English)

  • New section 2 covers the scenarios and ranks.
  • The judgements section becomes 判定与准率 / Judgements and accuracy and covers both sliders.
  • The score ranks section explains the room assumption.
  • The event figures are recomputed for Gekisou Live at rank 1 in a room of 5: SS on Expert needs 270k to 2.05M power, and the median relative residual of the fit is about 32 %.
  • The "in the works" wording is gone. Model results are stated "by this model".

Query

New parameters: gk=free, rk=<r>[,<r>,<r>], jr=<Just percent> and n=<players>. gr keeps its meaning. All of them are left out at their defaults.

Data

The fields follow the final schema of the scenario data (deck d4abb52, nnnotes 7bfa26b):

  • ranges[i].rankBonusPercents
  • seeds[].rangeWeights[kind][k][i]
  • seeds[].scorePerfect, which includes the rank-1 bonuses of its own range scores
  • seeds[].ranges[i].rangeScorePerfect
  • offSeeds[]

A null rangeWeights, or a null entry for a kind, leaves that chart without figures for ranks other than 1 and for Just rates below 100 %. Older files without these fields still load; the new options are then disabled and marked "data pending".

For the Just rate, the page recomputes the rank bonus on the interpolated range score, as the product decision specifies. Interpolating the two finished bases instead differs by less than 1 point per range: at most 1.8 points on the real data.

Checks

  • npm test: 557 passing. New songs-page tests cover:
    • rank 1, j = 1, q = 0 matching the previous implementation value for value;
    • Free Live reading offSeeds;
    • the rank formula and the Just/Great interpolation against hand computations;
    • the room thresholds;
    • the rk query round trip.
  • npm run typecheck passes.
  • node scripts/build.mjs --check passes.

Checks on the real scenario data (read only):

  • Default scenario. Rank 1 everywhere, j = 1 and q = 0 give the same figures as the previous joinCharts / chartRows on all 340 charts, value for value.
  • Free Live. It reads offSeeds: every one of the 340 charts has figures, with base = offSeeds[0].score / P₀ and the weights exactly as stored.
  • Other ranks. For ranks 5,5,5 and two mixed rank vectors, base equals a hand computation from the raw fields (difference 0).
  • Random ranks. On 1376 seeds with rankCheck, the linear prediction matches deck's own predicted with the same residual as at rank 1 (median 0), and every whole-live exact is within its bound (at most 0.5 bound).
  • Just rate. At j = 0 the base equals scorePerfect. In non-Just ranges rangeScorePerfect == rangeScore.
  • Rank 1 vs rank 5. The no-skill base at rank 1 is 1.25 to 1.65 times the base at rank 5 (median 1.46). The guide now says so.

🤖 Generated with Claude Code

nichinichisou0609 and others added 3 commits September 30, 2026 00:31
…; hedged wording

The guide's definition lists (sections 06 and 07) rendered nothing: the term and definition pairs were
nested arrays that the DOM helper dropped; they are flattened now. The guide and the page texts name the
decompiled client as their source, say that the figures aim to be right but are not guaranteed, and defer
to other sources where they disagree; the score figures are stated as the Gekisou Live best case (rank 1
in every range), since solo Free Live and Challenge Live play without Gekisou. The footer shows the master
data version with the region and client version in its hint, and the caveat.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… page

The chart data page computes its score figures per play scenario: Gekisou Live (the default) with a rank
1-5 for each of the three Gekisou ranges, rank 1 everywhere by default and marked as the best case, or
Free Live without Gekisou from the deck statistics' offSeeds. Other ranks follow from the rank-1 seeds
linearly: the rank bonus trunc(rangeScore * p / 100) is recomputed per range, and the position weights move
by the range weights. Two accuracy sliders update the table, the frontier and the details while they move:
a Great share scaling every score by 1 - 0.2 q, and in Gekisou Live a Just rate interpolating between the
all-Just seeds and the all-Perfect run of the Just ranges, with the rank bonuses recomputed on the
interpolated range scores; both are approximations without combo breaks. The Great share of the event
ranking merges into the slider. Options whose fields the data lacks are disabled and marked as pending.

Gekisou Live score ranks use the battle thresholds: the client rates the room's summed score against
trunc(sqrt(5 / n) * R_battle * n), and the page takes a room of n players (5 by default) who all score the
same, so a player needs about sqrt(5 / n) * R_battle; Free Live keeps the solo thresholds. The chart
details carry their own scenario panel and show both scores Gekisou Live reports, the one with Gekisou and
the one kept as the song's best score (about the Free Live score).

The guide explains the two scenarios, the ranks, the accuracy approximations and the room assumption in
Chinese and English; its event figures are recomputed for Gekisou Live at rank 1 in a room of 5. The query
takes gk=free, rk=<r>[,<r>,<r>], jr=<Just percent> and n=<players>, left out at their defaults. With rank
1 everywhere, all Just and no Great the figures are the seeds' own, value for value.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ratio

On the scenario data (deck d4abb52), the no-skill score at rank 1 in all three ranges is 1.25 to 1.65
times that at rank 5 (median 1.46 over 340 charts); deck's whole-live runs at random ranks stay within the
error bound of the linear rank formulas.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@nichinichisou0609
nichinichisou0609 merged commit d8d5137 into main Sep 29, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant