Skip to content

feat(classic-history): restore separate Classic skin history in the native carousel - #345

Draft
ccccxp wants to merge 7 commits into
Alban1911:mainfrom
ccccxp:pr/classic-history
Draft

ccccxp wants to merge 7 commits into
Alban1911:mainfrom
ccccxp:pr/classic-history

Conversation

@ccccxp

@ccccxp ccccxp commented Oct 9, 2026 •

Copy link
Copy Markdown
Contributor

Merge order

This PR requires ClassicWheel #344. Please merge #344 first. This branch contains only its seven history commits and does not include any ClassicWheel commit.

What this adds

This restores the last successfully injected Classic skin for each champion, moves the native carousel to that target, and shows the history badge and closable history notice when the target reaches the center.

Classic and regular history are stored separately. A manual card, arrow, skin, or chroma selection immediately releases history control, preventing the carousel from snapping back to the saved target. History also yields to an active Classic random selection.

Why a separate plugin

The regular history plugin uses ordinary skin IDs and the regular selector lifecycle. Classic history must wait for the live Classic catalog, move through the fixed native carousel, survive temporary carrier reports, and attach its marker to client-reused card elements.

ROSE-ClassicHistoric owns only the Classic marker and notice. It delegates movement and selection protection to ClassicWheel. The regular plugin remains unchanged outside Rift Classic and stays available as a fallback if the Classic plugin is absent or fails to initialize.

Carrier and resource compatibility

History stores resource skin IDs rather than carrier IDs. With #344 alone it uses upstream's Skin0 + classic/ path. If #318 is present, the same saved target follows Rose's automatic choice between native default + classic-native/ and Skin0 + classic/. This PR does not choose or mix carrier package families.

For standalone review, optional wheel helpers fall back to upstream Skin0 behavior instead of making this branch import ClassicWheel code.

Validation

  • 39 focused injection, Classic library, history, Pengu bridge, chroma, and countdown tests passed.
  • JavaScript syntax and changed Python module checks passed.
  • Integrated live testing covered automatic targeting, centered navigation, manual release, restored artwork, and the history marker/notice.

Changed files

  • Pengu Loader/plugins/ROSE-ClassicHistoric/index.js
  • Pengu Loader/plugins/ROSE-HistoricMode/index.js
  • pengu/communication/broadcaster.py
  • pengu/communication/message_handler.py
  • threads/handlers/injection_trigger.py
  • ui/handlers/historic_mode_handler.py
  • utils/core/historic.py

Store Classic and regular history independently, restore a validated Classic target through the native carousel, and keep the history badge anchored to the requested center card.

Release history control on explicit user navigation while preserving it during the client base-skin fallback and restored-target transition. Normalize Classic and regular IDs during deactivation so the protected target is not mistaken for a different skin.

This commit also restores the missing Classic helper imports in HistoricModeHandler; without them, the target-preservation branch raised NameError and silently fell through its defensive exception handler.

Source commits consolidated: 1efe6d17, 66d43660, 22b98203, and the HistoricMode import correction originally carried by 485f65a8.

Verification: separate history tests previously passed in the development environment; the current handler and plugin pass Python and JavaScript syntax checks.
Restore Classic history from the validated catalog, normalize legacy 600xx champion keys into the resource per-champion history scope, and compare native carrier IDs with resource IDs at the mode boundary.

Project the saved target through ClassicWheel, keep the history marker and toast on the requested center card, and suppress automatic automatic carousel movement after explicit native carousel navigation so the selector does not flicker back to history.

Resolve historic chroma names through either raw or resource cache IDs while leaving regular history storage and comparison behavior unchanged.

Verification: local history scope, native carrier activation, JavaScript syntax, and Python compilation checks passed.
Reuse the wheel's carrier-compatible carousel movement and presentation events instead of maintaining a second carousel navigator. Keep Classic history active while the wheel projects parent cards and scope unowned-skin saving to the Classic history storage.

Regular-mode history deactivation remains unchanged.

Validation: covered by final branch syntax and git diff checks. No separate live-client run is claimed for this commit.
Attach the history marker and label to the current wheel control host, clear stale presentation when leaving JADE, and prevent duplicated notices during native carousel refreshes.

Validation: covered by final branch syntax and git diff checks. No separate live-client run is claimed for this commit.
Let the Classic history plugin claim the history presentation layer only after its bridge subscriptions and assets are initialized.

The regular HistoricMode plugin now stops rendering only when the current session is JADE and the matching Classic history owner is ready. It remains available in ordinary modes and as the JADE fallback when the dedicated plugin is absent or fails to initialize.

This keeps the UI switch inside the history feature PR and avoids using ClassicWheel readiness as a global proxy for unrelated plugin control.

Validation: covered by final branch syntax and git diff checks. No separate live-client run is claimed for this commit.
Route the regular history and target files through their existing path helpers while keeping the new Classic files separate. This preserves upstream behavior and test substitution points without changing the Classic history scope or file names.

Validation: the upstream corrupt-history and missing-history tests pass; Python compilation and git diff checks pass.
Use the carrier-aware ClassicWheel helpers when that base PR is present, while retaining the upstream Skin0 behavior when this feature branch is reviewed or merged on its own.

This keeps the history PR functionally isolated: it does not copy the wheel implementation or modify the shared Classic core module.

Validation: 39 focused injection, Classic library, history, Pengu bridge, chroma, and countdown tests passed.
@ccccxp
ccccxp force-pushed the pr/classic-history branch from 7b1c465 to f87b9af Compare October 18, 2026 14:42
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