Repository navigation
Tournament Service English
LA edited this page Jul 3, 2026
·
1 revision
中文 | English | Architecture Overview
The Tournament Service provides local multi-score real-time comparison. It pre-loads historical scores in the song select screen, builds timeline caches, and during gameplay drives the Three-Pillar HUD or Leaderboard to compare the current play against historical "ghosts" in real-time — no network connection, no spectate room needed.
| Aspect | Official Lazer | Traditional BMS (e.g. LR2) | Ez2Lazer Tournament Service |
|---|---|---|---|
| Score Comparison | Online spectate only (needs Spectator connection) | Local best score side-by-side | Local ghost comparison, no network needed |
| Timing | Real-time spectate stream | Replay only | Pre-loaded in song select → real-time in-game |
| Comparison HUD | Leaderboard bar (results screen only) | Custom-built (hardcoded) | Three-Pillar / Leaderboard dual HUD, adjustable in skin editor |
| Pause Awareness | Spectator follows host clock | None | Ghost auto-freezes on game pause (via official GameplayClock) |
| Multiple Score Sources | Other players only | Local best only | Mod-filterable, up to 10 entries, sortable |
| Sort Metrics | Total score only | Total score only | Theoretical max / Total score / ACC / Combo / Miss count |
| Cache | None | None | LRU 3 maps + timeline isolation cache |
Song Select
│ EzScoreRaceService pre-loads historical scores
│ LRU cache (max 3 maps, 300ms debounce)
▼
Gameplay
│ HUD components create EzScoreRaceTimelineScoreProcessor
│ Bind to ghost state
│ Query timeline per frame by GameplayClock
▼
EzHUDScoreCompareBars / EzHUDScoreRaceLeaderboard
Three-Pillar Comparison Leaderboard List
A ghost is "a past score play." Each ghost contains:
- Score metadata (mods, judgement mode, etc.)
- Pre-built timeline snapshot array
- Bindable properties for live score/ACC/combo/miss count (updated per frame by Processor)
Per-frame flow:
-
ReferenceClock.CurrentTime→ current game time -
QueryAtTime(clockTime)→ fetch snapshot from timeline - Update Bindable values (auto-skips if value unchanged — no unnecessary event chains)
| Component | Description |
|---|---|
Three-Pillar HUD (EzHUDScoreCompareBars) |
Current play + 2 comparison ghosts, BMS-style vertical bar comparison |
Leaderboard (EzHUDScoreRaceLeaderboard) |
Multi-ghost list (up to 10), supports sorting and mod filtering |
See HUD Widgets - Tournament Components.
- No network needed for comparison: Enable Three-Pillar HUD or Leaderboard in settings to compare current play against historical best or same-mod best
- Three bars: Current play ("Now") plus two historical ghosts selected by criteria (highest ACC, highest score)
- Mod filtering: Only shows ghosts matching the current mod combination — Easy mode scores won't mix with NoMod
- Flexible sorting: Sort by total score, ACC, Combo, Miss count, or theoretical max
-
EzScoreRaceService: Global background service, Component lifecycle = process-level, exposes state via
IBindableDictionary<string, EzScoreRaceState> - EzScoreRaceState: Complete state snapshot of one ghost, containing ScoreInfo, Timeline, Bindable live values
- EzScoreRaceTimelineScoreProcessor: Created per HUD component, binds to one ghost state and drives updates against reference clock
-
EzScoreRaceGhostTimelineMode: Available comparison modes:
None/HitEvents(legacy)/ManiaSession(primary) -
Data flow:
EzScoreRaceService → States → Processor → HUD Bindable, all on game main thread
-
Settings → HUDto enable Three-Pillar HUD or Leaderboard - Skin editor to adjust position and appearance
- Press
Ctrl+F10in-game to open skin editor for real-time adjustment
- Timeline Service — The data foundation for Tournament
- HUD Widgets - Three-Pillar HUD
- HUD Widgets - Leaderboard