BeyondMastery
Experimental native achievement and durable progression framework. Gameplay validation incomplete; no final skin assets.Beyond Mastery 0.1.0 — experimental achievement framework
Native achievements and an independent durable progression ledger with same-run boss challenges. This is an incomplete development framework, not a finished achievement mod. Live encounter/arena adapters, challenge tracking, native UI, provider integration, real-save and multiplayer acceptance remain unfinished or untested. No final reward skin assets are included. Use a disposable test profile and read docs/IMPLEMENTATION_STATUS.md before testing.
Beyond Mastery 0.1.0 — experimental development build
A native Risk of Rain 2 progression plugin with ten achievements per registered survivor: nine encounter/Collective accomplishments, plus The Final Reckoning (all eight boss identities in one successful run). No final skin assets are included. An earned cosmetic entitlement remains valid without a skin pack.
This is a compiled development build. Full release acceptance is incomplete. No live gameplay, native UI rendering, vanilla save round trip, or live multiplayer test has been performed. Read docs/IMPLEMENTATION_STATUS.md before testing.
What qualifies
Monsoon (DifficultyIndex.Hard) or the eight explicitly named official Eclipse difficulties. Mithrix needs encounter-applied Karma 8+. Anima Harvester needs both phases. Echo of Providence uses the native phase transition chain. Acceptance and Rejection are separate accomplishments and cannot be credited from contradictory branches of one run lineage. Acceptance never supplies the Solus Heart slot in The Final Reckoning.
Individual achievements are permanent at encounter resolution. The ultimate achievement requires the same player's participation in all eight targets, on the survivor selected for that run, followed by victory. A failed run preserves individual achievements. Checkpoint rollback replaces the active checklist; permanent achievements are retained. Body transformations do not create another survivor row. Quality and artifacts are recorded as context, not disqualifiers. The guide does not control eligibility.
Install for an isolated smoke test
Extract BeyondMastery-0.1.0-experimental.zip into a disposable BepInEx development profile. The archive contains BepInEx/plugins/BeyondMastery/BeyondMastery.dll; it contains no game or dependency assemblies. Do not test on your only ordinary save. No installer has been run on the author's machine.
Dependencies compiled against:
- BepInEx 5 / BepInExPack 5.4.2122 cache.
- RoR2BepInExPack 1.44.0 (
___riskofthunder.RoR2BepInExPack). - R2API.Language 1.1.0 (
com.bepis.r2api.language), with its own normal dependencies. - HookGen-generated
MMHOOK_RoR2matching the game; the BepInEx ecosystem normally supplies this. - Optional ProperSave 3.0.7 only for this adapter revision. Other versions do not load the checkpoint integration.
Encounter adapters are pinned to RoR2 module ID 1189835d-0fbe-45e7-8dc9-17f7e9a40d5b. A different module logs a diagnostic and disables encounter detection; it does not fall back to body-name kills. These are cached references, not a verified installed target profile. Do not redistribute them.
Use
Open Logbook → Beyond Mastery, or run bm_matrix in the native console. Select a cell for requirements, entitlement state, and the ? disclosure control. Requirement-only is the default; hints and full route require an explicit disclosure choice. Track/Untrack adds an objective to the normal native objective panel. The Eclipse button is a read-only view of the game's completed-Eclipse helper. Existing Eclipse Skins remain unlocked and unchanged.
Console commands:
bm_status: tracking state, actual storage root, profile key.bm_export "<new absolute file path>": checksummed profile ledger export; never overwrites a file.bm_import "<file>": same-profile, same-reset-generation merge with imported provenance and silent restoration.bm_export_pending "<new absolute file path>": recovery copy of unsaved grants, distinct from a committed ledger.bm_reset <profile hash> CONFIRM: explicit profile-scoped reset/relock, protected by a new reset generation.
There are no production manual-grant or fake encounter commands. Synthetic fixtures only exist in the separate test executable.
Saves and recovery
Permanent records live at Environment.SpecialFolder.LocalApplicationData/BeyondMastery/RoR2/<account-and-profile hash>/, outside the game XML and mod-manager profile. On Windows this normally resolves to %LOCALAPPDATA%\BeyondMastery\RoR2. Wine/Proton resolves LocalApplicationData within its Windows environment. bm_status is authoritative for the actual runtime path. Storage.Root overrides it. Use the checked migration tool before changing roots; retain the old copy.
Each profile directory contains a checksummed journal, atomic snapshot, previous snapshot, and writer lock. A damaged journal tail is preserved before repair. Unrecoverable or future-schema data is preserved and reported instead of being replaced with empty progress. Profile display names are not keys. Online identity is read from Steam or the local network platform identity. For offline play, enable Storage.UseOfflineIdentity; it persists an account UUID in the storage root. Keep that setting and UUID consistent across sessions.
A vanilla session does not load this DLL and cannot update this ledger. When the mod returns, it projects only its own missing native IDs, silently. It never restores an old whole-profile XML over newer vanilla progress. Actual vanilla round trips still need runtime validation. Steam Cloud synchronization of sidecars is not implemented. Back up this storage root externally.
Native first-time delivery is claimed durably before the popup is queued. Retries/restoration do not repeat celebrations. A crash in the small gap between the delivery claim and the native queue can suppress a popup; the entitlement is still recoverable. This is an explicit at-most-once presentation tradeoff, not an exactly-once cross-save transaction guarantee.
ProperSave stores a namespaced checkpoint of the current run. Loading it creates a new timeline branch from only the saved evidence. Without ProperSave, a ledger does not resume abandoned runs. Mid-encounter save providers need further work. Unacknowledged remote grants use a durable host outbox; actual host-crash/reconnect transport still needs runtime validation.
Build and contribute
Run python3 tools/build.py all, then python3 tools/build.py audit, then python3 tools/package.py. The offline builder uses the already available private compiler/reference cache by default. Override BEYONDMASTERY_DOTNET, BEYONDMASTERY_CSC, BEYONDMASTERY_REFERENCES, and BEYONDMASTERY_RUNTIME_REFERENCES for another machine. No NuGet restore or unrelated dependency update is performed. A conventional .csproj is also supplied; set BeyondMasteryReferences to private references.
See docs/ADD_A_SKIN.md for the next skin-development chat, docs/ADD_A_SURVIVOR.md for stable modded survivor registration, and docs/ADD_A_BOSS_ADAPTER.md for versioned detector work. Reuse the existing Eclipse AdvancedSkins model/rig API; do not rebuild it in this mod.
