Releases: adofaiex/JipperOverlayer
Release list
v1.1.4
Features
- Asynchronous lazy-loaded patches (PatchManager): register patches with a
lazyTrigger— applied asynchronously only when both the toggle and the trigger allow, without touching the update loop. A background poller applies/unapplies on demand, isolates permanently failing patches (_failedPatches) instead of retrying every tick, and is torn down safely on disable/quit (cc616d2) - PatchManager scene-awareness: the lazy poller pauses while a scene loads and cancels on application quit;
Initializenow resets every cache and the quitting flag so re-enabling starts clean (7a0d892)
Performance
- GameRefs centralized state access layer: new static facade (
GameRefs) exposes controller/conductor/level-maker/RDC/etc. through delegate calls instead of scattered reflection and direct type access;PatchManagergainedCreateMemberGetterand friends with full delegate caching, so high-frequency reads cost a plain delegate call (b66d84b) - Pre-baked hex color LUT:
ColorPerDictionarybakes a 256-step RGB/RGBA hex lookup table (built throughColorUtility, byte-identical output) and the Progress / BPM / coop Accuracy hot paths now read it by index instead of interpolating a color and converting to hex per frame; the LUT invalidates itself on any color edit. The per-hit player nameplate hex inVersionSafeis memoized. All rich-text overlay colors now carry alpha (single-player Progress included, matching the color editor's alpha slider). Removed the unusedBpmCalculator.ColorToHex - Dynamic glyph pre-baking: the bounded overlay charset — ASCII printable, every character used by the three UI languages, and user-custom labels — is baked into all TMP dynamic font atlases at boot via
TMP_FontAsset.TryAddCharacters(overload resolved at runtime across the string/uint[]/IEnumerable<char>signatures TMP versions use; multi-atlas enabled; static atlases skipped in silence). Removes main-thread atlas re-rack + texture-rebuild spikes on first render and on EN/KO/CN language switches. Glyphs a font can't produce (e.g. Hangul in a Latin-only ttf) simply stay unbaked and keep falling back to the CJK font - XPerfect probing gated: when XPerfect is not installed the probe is disabled permanently (it can't be installed without a restart); when installed-but-disabled it keeps polling every frame (it may be enabled in-game); when active it stops after the first successful cache and recovers automatically via the toggle event when disabled again
Bug Fixes
- Level-name position no longer reset:
ApplyLevelNamePatch()/ResetLevelName()keepscrController.txtLevelNameOriginalPositionin sync with the applied position, so laterSetDefaultTextevents no longer yank the title back to its pre-patch position (84fd26f) - No more stray best records from mid-level starts: a run is only saved/settled when it started from floor 0 (
_lastSavedFromStart); checkpoints and mid-level restarts no longer pollute the best/attempt stats (3b300a2)
Refactors
- Overlay code decoupled from concrete game types: all state access now goes through
GameRefs;VersionSafeand callers were adapted, and.csproj/.gitignoreupdated alongside (b66d84b) - Pause handling flattened: removed the
_lastPausededge-detection field; canvas visibility now readsGameRefs.IsPauseddirectly each frame inOverlayMono(ac86aea) - SeedProgress: progress managers seed the start tile explicitly on show via the new
IOverlayTextManager.SeedProgress(single-player and coop), giving an immediate refresh when progress display is enabled and showing the start-progress range for mid-level starts; start progress is now calculated as(floor + 1) / totalTiles(02a0553)
Full Changelog: v1.1.3...v1.1.4
v1.1.3
Features
- Per-section fonts & font sizes: separate font and font-size configuration for each overlay section (Main, BPM, Judgement, ComboTitle, ComboVal, Timing, Attempt); "Use Global Font" toggle per slot (ac9a396)
- UI patch toggles: independent boolean toggles in Settings — Patch Beta Watermark, Patch Level Name, Reposition Auto Text — each can be enabled/disabled and dynamically reset (46b9dcc)
- Text effects panel: global shadow (TMP Underlay) and outline (TMP Outline keyword) with toggles, RGBA color pickers, Width/Softness sliders; changes apply live via
ApplyFontToAll()+ShadowManager.ClearCache() - Trilingual localization: all new UI sections fully translated (EN/KO/CN) via
Tr.Get()— Text Effects (session) + Section-level font options + UI toggle labels (46b9dcc) - Dual-loader architecture: support for both MelonLoader and UMM via
IModLoaderinterface; separate entry assemblies (JipperOverlayer.Loader.Melon/.UMM); platform-specific build artifacts (e985450)
Performance
- Music time throttle: update interval tightened from 1s → 0.1s (
_lastMusicTimeTick) for smoother display at minimal CPU cost; added clip‑null/zero‑length fallback using last floorentryTimeas total duration (71d73ec)
Bug Fixes
- Toggle UI: checkbox and label merged into a single clickable area (c2e80a4)
- Level name position drifts after death:
Hide()now callsResetLevelName()to restore original position/scale/size before nulling cache fields, preventing cumulative offset on scene restart - Level name size not restored on mod disable:
Destroy()now callsResetLevelName()so scale/sizeDelta revert when mod unloads
Refactors
- PatchManager: removed
Maindependency;HarmonyIdstored internally instead of requiring assembly‑scoped id (9f989fc) - Awake_Rewind patch removed: level‑name positioning moved from Harmony patch into
Overlay.UpdateSize()/Show(), giving finer control over when and whether the patch applies (46b9dcc) - Extracted
ApplyLevelNamePatch(): unified level-name positioning logic fromShow()andUpdateSize()into a single method; always applies patch onShow()regardless of cache state (separated save-once from apply-always) ResetLevelName(): always nulls cache fields at exit (removed early-return skip), ensuring clean state
Full Changelog: https://github.com/2228293026/JipperOverlayer/compare/v1.1.2...v1.1.3
v1.1.2
Features
- Alpha slider in color editor: RGBA four-slider layout replaces the previous RGB-only UI; hex input already supported 8-char alpha values
Bug Fixes
- Jongyeol
song.timelog spam: added_lastMusicTimeSecguard toUpdateTime(), preventing per-frameAudioSource.timeaccess whensong.clipis null (r142+ levels without standard audio clips); log no longer flooded with Unity warnings - v136 XPerfect per-player fallback: when XPerfect doesn't provide
GetPlayerXPerfectCountmethods (v136), per-player getters now redirect to main static values instead of always returning 0 - DetectApiVersion static property binding: fixed
CreatePropertyGetter<T, F>→CreateStaticPropertyGetter<TField>forADOBase.playerManager(was throwing on r14x, causing version detection to fall back to v136 path and breaking judgement/XAccuracy display)
Refactors
- PatchManager thread safety: added
lock (_lock)to all public methods;List<Type>→HashSet<Type>for O(1)Containslookups - Cached reflection utilities: added 9 helper methods (
GetMethodInfo,GetFieldInfo,CreateFieldRef,CreatePropertyGetter/Setter,CreateStaticFieldGetter/Setter,CreateStaticPropertyGetter/Setter) with dictionary caching; used byVersionSafev136 path andShadowManager - VersionSafe v136 bindings: replaced bare
GetField/GetValuereflection with PatchManager cached variants; missing fields now log a warning before falling back to defaults - Settings JSON migration: replaced UMM default XML serialization with
Newtonsoft.Json; existingSettings.xmlauto-migrates toSettings.jsonon first load, then deletes the old XML file
Full Changelog: https://github.com/2228293026/JipperOverlayer/compare/v1.1.1...v1.1.2
v1.1.1
Features
- ComboLineReversed: new toggle to swap the vertical order of the combo number and combo title label; animation anchor adapts to both orientations (3 Tr keys: EN/KO/CN)
- ShowAutoInXPerfect: when XPerfect mode is active, optionally show the auto-tile perfect count in orange (
#FF8000) after the−Perfectvalue
Refactors
- Jongyeol State/Death/PurePerfect via
IOverlayTextManager: moved all three Jongyeol-mode helper methods (UpdateDeath,UpdateState,CheckPurePerfect,GetTooJudgement) out ofJongyeolModuleand intoIOverlayTextManager; bothOverlayTextManagerNormalandOverlayTextManagerCoopnow implement them, enabling full coop-aware Jongyeol display - Coop Jongyeol Death/State:
OverlayTextManagerCoopnow renders per-player death counts and state labels in each player's color, withIsPurePerfectchecked independently per player _monofield cache:OverlayMonocomponent reference stored as_monofield at construction; replaces repeatedGetComponent<OverlayMono>()calls inUpdateCombo,Show(), andHide()- Static
StringBuilderpools:_judgementSb,_attemptSb,_bpmSb,_comboSb,_timingSbdeclared as static fields; eliminates per-frame heap allocations acrossBuildJudgementString,UpdateAttempts,BuildBpmText,UpdateCombo, andUpdateTimingScale UpdateTimingScaleearly-exit: value cached in_lastTimingScale; text rebuild skipped when scale changes less than 0.001%OutExpoChangelookup table: combo animation easing replaced with a 31-entry pre-built float array (_expTable), removingMath.Powcalls per animation frameOverlayMono.Updateguard: added!Overlay.GameObject.activeSelfcheck to skip update loop when overlay is hidden
Full Changelog: https://github.com/2228293026/JipperOverlayer/compare/v1.1.0...v1.1.1
v1.1.0
Features
- Full Jongyeol color customization: 3 gradients (JCombo/JDeath/JTiming) + 11 static colors (8 states + FPS/Author/Start)
- Display order: reorder main stack elements with ▲▼ (General 7 items, Jongyeol 13 items)
- BPM line order: reorder TBPM/CBPM/KPS lines independently
- BPM line visibility: per-line ✓ toggle to show/hide each BPM line
- Attempt line order: swap Attempt/Full Attempt display order
- 14 new Tr keys for state colors + 23 keys for display order (EN/KO/CN)
Refactors
- Settings folder namespace: JipperOverlayer.Overlayer.Settings → JipperOverlayer.Overlayer (fixes Settings type collision)
- DrawReorderList helper: unified ▲▼/✓ UI for all order lists, 3 callers share 1 implementation (-45 lines)
- BPM text building: extracted shared BuildBpmText() static method, used by both General and Jongyeol mode
Bug Fixes
- ColorPerDictionary.GetColor cache: added noCache parameter for static color updates
- EnsureDefaults() migration: detect stale colors.json and reset transparent (a==0) colors
- FPS/Author/Start text: label white via <color=white>, value takes configured color
- BPM/Combo colors: added missing reset buttons in General section
- State colors: all 8 conditions fully translated with "Color"/"색상"/"颜色" suffix
- Empty reference guard: null-check in SetupLocationMain to prevent NRE from stale config
- Config migration: auto-filter invalid IDs from display order arrays on load
- BPM cache: DirtyBpmCache() forces text rebuild when visibility/order changes
Full Changelog: https://github.com/2228293026/JipperOverlayer/compare/v1.0.8...v1.1.0
v1.0.8
feat: integrate XPerfect counter into judgement display
Add optional integration with XPerfect mod:
- Detect XPerfect availability via UnityModManager and cache delegates
- Replace perfect counts in judgement line with +Perfect / X-Perfect / -Perfect
- Ensure correct execution order with HarmonyAfter
- Handle dynamic enable/disable of XPerfect via OnToggle event
- Add settings toggle "Show XPerfect in Judgement"
Full Changelog: https://github.com/2228293026/JipperOverlayer/compare/v1.0.7...v1.0.8
v1.0.7
-
All custom positions changed to pixel offsets (position += offset), not affected by alignment
-
New PosSlide2: XY on the same line, -2000~2000 range, integer pixel values
-
Tr.cs: Added Coop and 11 position tags Key, trilingual translation
-
Position grouping fold: Main/BPM, Judge(P1~P4), Others
-
FPS refresh rate slider indented below ShowFPS, hidden when turned off
-
DecimalPrecision remove extra {} blocks, indentation alignment
-
Attempt added Coop independent offset field
-
ApplyFontToAll remove redundant try-catch
-
Configuration migration: ConfigVersion 0→2, old PX/PY converted to offset
-
Change JudgementText/_judgementObject to [4] array
-
SetupLocationJudgement: P1/P3 x=-250, P2/P4 x=250 First row y=35, Second row y=5 (same as single-player default height)
-
UpdateJudgement: Read per-player marginTrackers in coop mode
-
Settings: P1~P4 JudgePX/PY sliders, default values aligned with two-column layout
-
Move Attempt text to x=550 in multiplayer mode to avoid overlap
-
In Show(), set up SetupLocationJudgement first, then UpdateJudgement
-
Title text updates in real time, pausing switching Jongyeol does not lose text, DecimalPrecision injection, code cleanup
Full Changelog: https://github.com/2228293026/JipperOverlayer/compare/v1.0.6...v1.0.7
v1.0.6
Bug Fixes
- Fix version detection for game API changes: detect v141+ via scrMarginTracker and ADOBase.playerManager instead of removed scrController.playerManager
- Fix percentAcc/percentXAcc delegate bindings: use ADOBase.playerManager (static) instead of scrController.instance.playerManager (removed property)
Full Changelog: https://github.com/2228293026/JipperOverlayer/compare/v1.0.5...v1.0.6
v1.0.5
Features
- Customizable text labels: all overlay labels can be customized via Custom Labels settings panel
- Label presets: English / Korean / Chinese one-click presets
- FPS refresh rate slider (0.05~1.0s) for Jongyeol mode
- Settings UI reorganized with collapsible panels (General/Display/Jongyeol/Alignment/Labels)
Refactors
- Replaced JOverlay inheritance with JongyeolModule composition (-405 lines)
- Removed all unused virtual keywords (Overlay 13, OverlayTextManagerCoop 4, OverlayTextManagerNormal 3)
- Renamed YellowCombo → AllowELCombo for accurate naming (EL = Early/Late judgment)
- Settings.OnGUI split into 5 collapsible sections with sub-folders
Bug Fixes
- PlanetMoveToNextFloorPatch: include Jongyeol settings in registration condition
- JCombo patches: require ShowCombo guard
- Show(): call SetupLocationMain when Jongyeol is active regardless of standard settings
- RefreshVisibility: actively refresh BPM/Combo/Judgement/TimingScale/ProgressBar when toggled on
- Fix UpdateDeath division-by-zero when currentSeqID == StartTile
- Fix GUI.changed false-positive triggering unnecessary overlay updates
- Fix time label cache not refreshing when edited in Custom Labels panel
Full Changelog: https://github.com/2228293026/JipperOverlayer/compare/v1.0.4...v1.0.5
v1.0.4
Refactors
- Replaced JOverlay inheritance with JongyeolModule composition (-405 lines)
- Deleted JOverlay.cs, JOverlayTextManagerNormal.cs, JOverlayTextManagerCoop.cs, IJOverlayTextManager.cs
- Created JongyeolModule.cs as composable module
- Overlay fields changed from protected to internal for module access
- PurePerfectColor changed to public static readonly
- Removed all unused virtual keywords (Overlay 13, OverlayTextManagerCoop 4, OverlayTextManagerNormal 3)
- Removed redundant Jbpm.BpmColorMax wrapper; callers use Main.Settings.BpmColorMax directly
- Renamed YellowCombo → AllowELCombo for accurate naming (EL = Early/Late judgment)
- Removed redundant UpdateState() call in RdcSetAutoPatch