Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
7260b23
feat(skin-sdk): freeze the v2 skin interface
nulltask Oct 11, 2026
5f54f49
feat(player-web): hand be-music skins the timing of each judgement
nulltask Oct 11, 2026
ff36a47
feat(player-web): fill the gameplay runtime's song facts and play mom…
nulltask Oct 11, 2026
7b26265
feat(player-web): report lane press times and autoplayed notes to skins
nulltask Oct 11, 2026
a408dc8
feat(player-web): add the clear lamp and judging setup to result data
nulltask Oct 11, 2026
0909958
chore: list the filled skin runtime fields in the changeset
nulltask Oct 11, 2026
fade80b
feat(player-web): report lane covers and the green number to be-music…
nulltask Oct 11, 2026
540e1e1
feat(player-web): hand measure lines to be-music skins that draw them
nulltask Oct 11, 2026
72c4587
feat(player-web): tell be-music skins which judgement set off each bomb
nulltask Oct 11, 2026
55985c1
feat(player-web): report the select pointer to be-music skins
nulltask Oct 11, 2026
11490e7
chore: list the lane cover, measure line, bomb and pointer fields in …
nulltask Oct 11, 2026
73fd398
feat(player): signal long-note holds and the resolved ruleset to UI r…
nulltask Oct 11, 2026
65041ac
feat(player-web): report long-note holds and judge windows to be-musi…
nulltask Oct 11, 2026
f5487c5
chore: list the long-note, hold and judge window fields in the changeset
nulltask Oct 11, 2026
c28c2cc
fix(player-web): validate be-music skins' play option changes by key
nulltask Oct 11, 2026
4d41177
feat(player-web): let hosts hand be-music select skins per-chart records
nulltask Oct 11, 2026
a4530c9
feat(player-web-demo): keep a best record per chart for be-music skins
nulltask Oct 11, 2026
d086b28
chore: list the play option rules and song records in the changeset
nulltask Oct 11, 2026
a239343
feat(player-web): hand be-music skins the songs' stage files, banners…
nulltask Oct 11, 2026
c21ce70
feat(player-web): hand the BGA images to be-music skins that composit…
nulltask Oct 11, 2026
6cceb60
feat(player-web): add a decide scene for be-music skins
nulltask Oct 11, 2026
da09588
feat(player-web-demo): show a be-music skin's decide screen before th…
nulltask Oct 11, 2026
36f202c
chore: list song images, skin-drawn BGA and the decide scene in the c…
nulltask Oct 11, 2026
84a4c99
feat(player-web): hand be-music skins the host's stored settings
nulltask Oct 11, 2026
744e6a3
feat(player-web-demo): tune be-music skin settings from the Debug Menu
nulltask Oct 11, 2026
1e01247
chore: describe how hosts hand skins their settings in the docs and c…
nulltask Oct 11, 2026
5f7ac56
Merge remote-tracking branch 'origin/devel' into feature/skin-sdk-com…
nulltask Oct 11, 2026
ab92341
fix(player-web): keep the judge timing log loadable by Node's type st…
nulltask Oct 11, 2026
05c5c7a
chore(skin-sdk): keep the skin API at revision 1
nulltask Oct 11, 2026
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
8 changes: 8 additions & 0 deletions .changeset/player-long-note-and-ruleset-signals.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
'@be-music/player': minor
---

The engine now tells UI runtimes about long-note holds and about the ruleset a play is judged under, so a renderer no longer has to guess them from lane presses or re-derive the judge windows.

- `PlayerUiCommand` gains `long-note-start` (channel, head beat, and the `ln` / `cn` / `hcn` mode the active ruleset actually plays the note in) and `long-note-end` (channel and a `complete` / `dropped` outcome). They are pushed in autoplay, auto-scratch, and manual play, next to the existing `hold-lane-until-beat` / `release-lane` pair.
- `PlayerOptions.onRulesetResolved` is called once before playback with a `PlayerRulesetInfo`: the ruleset id, its long-note style, and its judge window tables in µs, after the judge ruleset, the debug window override, and a replay's recorded settings were applied. Under LR2 the tables are the ones in force at the start of the chart; a later `#EXRANKxx` change is not reported.
19 changes: 19 additions & 0 deletions .changeset/player-web-skin-frame-data.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
---
'@be-music/player-web': minor
---

Be-music skins can change play options and open the readme from the select screen through the new `setPlayOption`, `cyclePlayOption`, and `toggleReadme` actions (unknown keys and values outside an option's choices are ignored, `hiSpeed` and `shutter` are clamped, and each change bumps the select frame's `revision`). `PixiPlayOptions` and its value unions are now aliases of the SDK's `BeMusicPlayOptions` types.

The player now fills these new skin fields:

- Runtime: `song`, `lastJudgeDeltaMs` / `judgeTimings`, `minBpm` / `maxBpm` / `mainBpm`, `songLengthMs` / `songElapsedMs`, `failedAtMs` / `allNotesDoneAtMs` / `outroAtMs`, `gaugeRiseAtMs` / `gaugeMaxAtMs`, `scoreHistory` / `gaugeHistory`, `laneCovers` / `visibleMs` / `greenNumber` (beatoraja's duration and green number, over the current scroll and BPM), and `judgeWindows` (the engine's resolved windows in ms; a mid-chart `#EXRANK` change is not reflected).
- Lanes and notes: each lane's `pressedAtMs` / `releasedAtMs` and `holding` / `holdStartedAtMs`, each long note's `mode` (as the active ruleset plays it) and `state` (`pending` / `held` / `dropped` / `done`), `autoplay` on notes and long notes played by autoplay or auto-scratch, the `judge` that set off each bomb, and `measureLines` (one per lane run) for skins that set `drawsMeasureLines`.
- Select: `pointer` in the stage's design pixels, `hit` returns whether the pointer is over the rect, and `songRecord(song)` answers from the new `resolveSongRecord` select-scene option, through which a host hands skins its per-chart best records (lamp, EX score, max combo, miss count, play count); without it every song reads as never played.
- Result data: `lamp`, `gaugeType`, `judgeRuleset`, `fast` / `slow`, and `judgeTimings`.
- Song images: `songImage(song, kind)` on the select, decide, gameplay, and result frames returns the song's `#STAGEFILE`, `#BANNER`, or `#BACKBMP` as an `ImageBitmap`, loaded lazily from the song collection (select bumps `revision` when one arrives). Each scene keeps at most 32 decoded images and closes the least recently used one beyond that.
- Skin settings: every frame carries `settings`. The gameplay, select, result, and decide scenes take the player's stored values through the new `beMusicSkinSettings` option, check them with `resolveBeMusicSkinSettings` (now also exported from `@be-music/player-web/skin`), and take changes through `setBeMusicSkinSettings`, which the skin sees from the next frame (select also bumps `revision`). Without stored values the skin draws with its defaults.
- BGA: a skin that sets `drawsBga` receives `frame.bga` with the active base, layer, and POOR images and `poorActive`.

A skin that sets `drawsLaneCover`, `drawsMeasureLines`, or `drawsBga` now draws the lane covers, measure lines, or BGA itself, and the player stops drawing its own.

The new `DefaultPixiDecideView` shows a skin's `decide` screen between select and play for its `durationMs` (Enter, Space, or a click skips ahead; Escape cancels back to select); hosts mount it only when the skin declares one.
11 changes: 11 additions & 0 deletions .changeset/skin-sdk-complete-frames.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
---
'@be-music/skin-sdk': minor
---

Skins now receive everything they need to match what LR2 and beatoraja skins can show. Every addition is optional or opt-in, so existing skins keep working unchanged.

- Gameplay runtime: `song`, `lastJudgeDeltaMs` / `judgeTimings` (positive = late), `judgeWindows`, `laneCovers`, `visibleMs`, `greenNumber`, `minBpm` / `maxBpm` / `mainBpm`, `songLengthMs` / `songElapsedMs`, `failedAtMs` / `allNotesDoneAtMs` / `outroAtMs`, `gaugeRiseAtMs` / `gaugeMaxAtMs`, and `scoreHistory` / `gaugeHistory`.
- Gameplay frame: `measureLines` and `bga` behind the new opt-in `drawsMeasureLines` / `drawsBga` flags, `drawsLaneCover`, per-lane press / release / hold times, long-note `mode` / `state`, `autoplay` on notes, and the `judge` behind each bomb.
- Select frame: `playOptions` / `playOptionChoices` with `setPlayOption`, `cyclePlayOption`, and `toggleReadme` actions, `pointer`, `songRecord(song)`, and `hit` returning whether the pointer is over the rect. `BeMusicPlayOptions` and its value unions now live in the SDK.
- Result data: `lamp`, `gaugeType`, `judgeRuleset`, `fast` / `slow`, and `judgeTimings`, with `binJudgeTimings` for timing histograms.
- An optional decide screen (`skin.decide`), skin settings (`skin.settings`, resolved with `resolveBeMusicSkinSettings` and checked by `validateBeMusicSkin`), and `songImage(song, kind)` on every frame.
Loading