feat(examples): play scenarios and accuracy sliders on the chart data page - #9
Merged
Merged
Conversation
…; 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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The chart data page (
examples/songs/) gets play scenarios and accuracy sliders. With the defaults, its figures match the current page exactly.Commits
Scenarios
ranking.jsscenarioSeed):base_r = (score − Σ rankBonus_i + Σ trunc(rangeScore_i · p_i(r_i) / 100)) / powerw_r[k] = w[k] + Σ (p_i(r_i) − p_i(1)) / 100 · rangeWeights[k][i]gk=free). Gekisou is off and the figures come fromoffSeeds. Charts with more than 3 fevers, which Gekisou Live cannot play, still get figures here.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.
1 − 0.2q(greatFactor). It replaces the old Great input of the event ranking.score,rangeScore) and the all-Perfect run (scorePerfect,rangeScorePerfect).trunc(interpolated range score × pct / 100), then multiplied byg(q).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 needtrunc(√(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)
Query
New parameters:
gk=free,rk=<r>[,<r>,<r>],jr=<Just percent>andn=<players>.grkeeps 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].rankBonusPercentsseeds[].rangeWeights[kind][k][i]seeds[].scorePerfect, which includes the rank-1 bonuses of its own range scoresseeds[].ranges[i].rangeScorePerfectoffSeeds[]A
nullrangeWeights, or anullentry 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:offSeeds;rkquery round trip.npm run typecheckpasses.node scripts/build.mjs --checkpasses.Checks on the real scenario data (read only):
joinCharts/chartRowson all 340 charts, value for value.offSeeds: every one of the 340 charts has figures, withbase=offSeeds[0].score / P₀and the weights exactly as stored.baseequals a hand computation from the raw fields (difference 0).rankCheck, the linear prediction matches deck's ownpredictedwith the same residual as at rank 1 (median 0), and every whole-liveexactis within itsbound(at most 0.5 bound).scorePerfect. In non-Just rangesrangeScorePerfect == rangeScore.🤖 Generated with Claude Code