Skip to content

feat(music-data): play scenarios: Gekisou off, every rank, the Perfect play - #5

Merged
nichinichisou0609 merged 1 commit into
mainfrom
feat/music-data-scenarios
Sep 29, 2026
Merged

nichinichisou0609 merged 1 commit into
mainfrom
feat/music-data-scenarios

Conversation

@nichinichisou0609

Copy link
Copy Markdown
Collaborator

Moves the deck model to ournotes-deck d4abb52 (empty-sekai/ournotes-deck#1, chart-stats scenarios) and carries the new statistics through music-data, so that a page can show a chart as a solo live plays it (Gekisou off, the default) and as a Gekisou live at any ranks (1..5 per range), with a Just rate between the Just play and the Perfect play.

Changes

  • rust/Cargo.toml, rust/Cargo.lock: ournotes-deck pinned at d4abb52ff75059a13e99a88fd6812ec1bdaa5dd2 (the deck pull request's branch commit).
  • src/nnnotes/musicdata.py
    • DECK_CHART_KEYS gains offSeeds (it was dropped otherwise); ranges[].rankBonusPercents, seeds[].rangeWeights, seeds[].rankCheck, seeds[].scorePerfect and seeds[].ranges[].rangeScorePerfect pass through with ranges / seeds.
    • mission_pattern, rank_bonus_percents: the song's rank bonus percentages from MasterLiveGekisouRankingScoreBonus (as the game reads them).
    • chart_deck checks, besides the chart facts: every range's rankBonusPercents (and rankBonusPercent = [0]) against those rows; every seed's rankBonus == trunc(rangeScore * rankBonusPercent / 100); a chart with justNotes == 0 has scorePerfect == score and rangeScorePerfect == rangeScore; the shapes weights[kind][position], rangeWeights[kind][position][range] (or null, a kind null), one range result per range, exactly one Gekisou off seed (its kinds may be null); every check, rankCheck and off check within its bound.
  • docs/music-data.md: the two scenarios, the rank formulas, the Just rate, every new field with its unit; docs/commands.md.
  • docs/schema/music-data.schema.json: the new fields as optional properties (files written before this change stay valid).
  • tests/test_musicdata.py: the stand-in deck model writes the new fields from a rank bonus table; checks for every cross-check failure, null range weights and null kinds, rank_bonus_percents / mission_pattern.

The version stays 0.1.2 (to be set separately).

Verification

  • Built the extension locally from the pinned commit (uv pip install -e ., maturin, locked = true); nnnotes._deck.info()["commit"] is d4abb52….
  • python -m pytest: 1125 passed, 5 skipped (a missing optional freetype, goldens recorded with other library versions).
  • Full TW data (master 0b21c9f4a3911370d5f981fb894c7544, 85 songs, 340 charts, --workers 4, 42 s): every chart measured and every cross-check passed. Compared with the file of the previous deck commit (7e5d84b):
    • all 116369 old values are equal, value by value (only provenance.deck.commit moves); the new keys are exactly the scenario fields;
    • every chart has one offSeeds entry, its no-skill score below every Gekisou on seed's; every check (1376), off check (340) and rank check (1376) is within its bound;
    • at rank 1 everywhere the rank formulas give every seed's score and weights bit for bit; every rankBonus is the truncated formula; no range weights or kinds are null in TW;
    • 724 seeds of charts without Just notes have scorePerfect == score.
  • Expert, no skills (85 charts): Gekisou off / on (rank 1) min 0.211, median 0.417, max 0.633; all rank 5 / all rank 1 min 0.610, median 0.685, max 0.782 (rank 1 / rank 5: 1.28 to 1.64).
  • The file grows from 1716820 to 2796758 bytes (gzip 368231 bytes).

Generated with Claude Code

…t play

The deck model moves to ournotes-deck d4abb52 (chart-stats scenarios). Every chart's `deck`
carries `offSeeds`, the chart measured with Gekisou off as a solo live plays; its ranges carry
`rankBonusPercents` and its seeds `rangeWeights`, `rankCheck`, `scorePerfect` and
`rangeScorePerfect`, from which a page derives a Gekisou live at any ranks and a Just rate.

The statistics are checked against the master data and themselves: the rank bonus percentages
against the MasterLiveGekisouRankingScoreBonus rows of the song's mission pattern, every rank
bonus against trunc(rangeScore * percent / 100), the Perfect play of a chart without Just notes
against the play, the array shapes, one Gekisou off seed, and every check and rank check within
its bound. docs/music-data.md and the schema describe the new fields (optional in the schema:
older files do not have them).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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