Skip to content

Releases: adofaiex/JipperOverlayer

v1.1.4

Choose a tag to compare

@github-actions github-actions released this 12 Aug 02:29

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; Initialize now 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; PatchManager gained CreateMemberGetter and friends with full delegate caching, so high-frequency reads cost a plain delegate call (b66d84b)
  • Pre-baked hex color LUT: ColorPerDictionary bakes a 256-step RGB/RGBA hex lookup table (built through ColorUtility, 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 in VersionSafe is memoized. All rich-text overlay colors now carry alpha (single-player Progress included, matching the color editor's alpha slider). Removed the unused BpmCalculator.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() keep scrController.txtLevelNameOriginalPosition in sync with the applied position, so later SetDefaultText events 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; VersionSafe and callers were adapted, and .csproj/.gitignore updated alongside (b66d84b)
  • Pause handling flattened: removed the _lastPaused edge-detection field; canvas visibility now reads GameRefs.IsPaused directly each frame in OverlayMono (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

Choose a tag to compare

@github-actions github-actions released this 16 Jul 07:44

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 IModLoader interface; 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 floor entryTime as 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 calls ResetLevelName() 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 calls ResetLevelName() so scale/sizeDelta revert when mod unloads

Refactors

  • PatchManager: removed Main dependency; HarmonyId stored 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 from Show() and UpdateSize() into a single method; always applies patch on Show() 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

Choose a tag to compare

@github-actions github-actions released this 08 Jul 00:28

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.time log spam: added _lastMusicTimeSec guard to UpdateTime(), preventing per-frame AudioSource.time access when song.clip is null (r142+ levels without standard audio clips); log no longer flooded with Unity warnings
  • v136 XPerfect per-player fallback: when XPerfect doesn't provide GetPlayerXPerfectCount methods (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> for ADOBase.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) Contains lookups
  • Cached reflection utilities: added 9 helper methods (GetMethodInfo, GetFieldInfo, CreateFieldRef, CreatePropertyGetter/Setter, CreateStaticFieldGetter/Setter, CreateStaticPropertyGetter/Setter) with dictionary caching; used by VersionSafe v136 path and ShadowManager
  • VersionSafe v136 bindings: replaced bare GetField/GetValue reflection 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; existing Settings.xml auto-migrates to Settings.json on 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

Choose a tag to compare

@github-actions github-actions released this 04 Jun 11:22

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 −Perfect value

Refactors

  • Jongyeol State/Death/PurePerfect via IOverlayTextManager: moved all three Jongyeol-mode helper methods (UpdateDeath, UpdateState, CheckPurePerfect, GetTooJudgement) out of JongyeolModule and into IOverlayTextManager; both OverlayTextManagerNormal and OverlayTextManagerCoop now implement them, enabling full coop-aware Jongyeol display
  • Coop Jongyeol Death/State: OverlayTextManagerCoop now renders per-player death counts and state labels in each player's color, with IsPurePerfect checked independently per player
  • _mono field cache: OverlayMono component reference stored as _mono field at construction; replaces repeated GetComponent<OverlayMono>() calls in UpdateCombo, Show(), and Hide()
  • Static StringBuilder pools: _judgementSb, _attemptSb, _bpmSb, _comboSb, _timingSb declared as static fields; eliminates per-frame heap allocations across BuildJudgementString, UpdateAttempts, BuildBpmText, UpdateCombo, and UpdateTimingScale
  • UpdateTimingScale early-exit: value cached in _lastTimingScale; text rebuild skipped when scale changes less than 0.001%
  • OutExpoChange lookup table: combo animation easing replaced with a 31-entry pre-built float array (_expTable), removing Math.Pow calls per animation frame
  • OverlayMono.Update guard: added !Overlay.GameObject.activeSelf check 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

Choose a tag to compare

@github-actions github-actions released this 02 Jun 14:48

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

Choose a tag to compare

@github-actions github-actions released this 01 Jun 19:09

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

Choose a tag to compare

@github-actions github-actions released this 30 May 23:45
  • 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

Choose a tag to compare

@github-actions github-actions released this 30 May 14:37

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

Choose a tag to compare

@github-actions github-actions released this 30 May 13:37

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

Choose a tag to compare

@github-actions github-actions released this 30 May 09:22

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