Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
UniversalSurvivorUnlocks
Automatically adds configurable unlock requirements to modded Risk of Rain 2 survivors that do not provide their own character unlock.
| Date uploaded | a month ago |
| Version | 0.1.2 |
| Download link | Shleidericks-UniversalSurvivorUnlocks-0.1.2.zip |
| Downloads | 55 |
| Dependency string | Shleidericks-UniversalSurvivorUnlocks-0.1.2 |
This mod requires the following mods to function
bbepis-BepInExPack
Unified BepInEx all-in-one modding pack - plugin framework, detour library
Preferred version: 5.4.2121RiskofThunder-R2API_Language
API for modifying the language localisation of the game
Preferred version: 1.1.0RiskofThunder-R2API_Unlockable
API for adding custom achievements and unlockables
Preferred version: 1.0.2RiskofThunder-R2API_Networking
Networking API around the Unity UNet Low Level API (LLAPI)
Preferred version: 1.0.4README
Universal Survivor Unlocks
Universal Survivor Unlocks adds progression-based unlock requirements to compatible modded survivors in Risk of Rain 2 when those survivors do not provide their own character unlock system.
The goal is to make modded survivors feel more naturally integrated into Risk of Rain 2 progression instead of always becoming immediately available after installation.
✦ Overview
| Feature | Status |
|---|---|
| Automatic modded survivor detection | ✅ Implemented |
| Automatic locking for survivors without their own unlock | ✅ Implemented |
| Respect original survivor unlocks | ✅ Implemented |
| Vanilla / official DLC survivor protection | ✅ Implemented |
Dynamic UnlockableDef generation |
✅ Implemented |
| Locked survivor portrait support | ✅ Implemented |
Persistent Survivors.json configuration |
✅ Implemented |
| Configuration backup | ✅ Implemented |
| Survivor uninstall / reinstall configuration recovery | ✅ Implemented |
ApplyStatusEffects gameplay challenge |
✅ Implemented |
| Server-side challenge tracking groundwork | ✅ Implemented |
| Host-authoritative multiplayer configuration | ⚠ Planned / In development |
| Full multiplayer validation | ⚠ Experimental |
KillEnemies gameplay tracking |
⚠ Not yet implemented |
✦ Features
- Automatically detects installed modded survivors.
- Automatically assigns unlock requirements to compatible modded survivors that do not already provide one.
- Respects unlock requirements created by the original survivor mod authors.
- Does not replace Vanilla or official DLC survivor progression.
- Creates real Risk of Rain 2
UnlockableDefentries. - Uses the game's normal locked survivor behavior.
- Displays modded survivor portraits in generated achievements.
- Automatically generates a configurable
Survivors.json. - Preserves survivor configuration when a survivor mod is disabled or uninstalled.
- Restores previous configuration when the survivor becomes available again.
- Automatically creates a backup of the previous configuration.
- Supports configurable survivor challenges.
- Includes gameplay tracking for
ApplyStatusEffects. - Includes server-side challenge tracking groundwork for multiplayer-compatible challenges.
- Supports different modded survivor
ContentPackimplementations. - Compatible with RealerCheatUnlocks for testing and manual unlock management.
✦ How It Works
When Risk of Rain 2 finishes loading, Universal Survivor Unlocks scans the survivor catalog.
| Step | Behavior |
|---|---|
| 1 | Detect installed modded survivors. |
| 2 | Check whether each survivor already has an unlock requirement. |
| 3 | If the original mod already provides an unlock, leave it untouched. |
| 4 | If no original unlock exists, Universal Survivor Unlocks can assign its own generated unlock. |
| 5 | The survivor remains locked until that generated unlock is granted. |
Original survivor unlock systems always take priority.
Universal Survivor Unlocks does not intentionally replace the progression of Vanilla or official DLC survivors.
✦ Installation Order
The installation order does not matter.
Survivor installed first
Install Survivor Mod
↓
Install Universal Survivor Unlocks
↓
Launch Risk of Rain 2
↓
Survivor is detected
Universal Survivor Unlocks installed first
Install Universal Survivor Unlocks
↓
Install Survivor Mod later
↓
Launch Risk of Rain 2
↓
Survivor is detected
Compatible survivors are scanned again when the game loads.
✦ Unlock Persistence
Universal Survivor Unlocks separates challenge configuration from unlock progress.
| Data | Stored by | Purpose |
|---|---|---|
| Challenge configuration | Survivors.json |
Defines how a survivor is unlocked. |
| Completed unlock | Risk of Rain 2 player profile | Stores whether the survivor has already been unlocked. |
Conceptually:
Survivors.json
└── HOW the survivor is unlocked
Risk of Rain 2 Player Profile
└── WHETHER the survivor has already been unlocked
This allows previously earned survivor unlocks to remain associated with the player profile.
Reinstall behavior
| Previous state | Uninstall survivor | Reinstall survivor | Expected state |
|---|---|---|---|
| Locked | ✅ | ✅ | 🔒 Remains locked |
| Unlocked | ✅ | ✅ | 🔓 Remains unlocked |
The generated unlock identifier should remain stable between releases so previously earned unlocks can continue to be recognized.
✦ Configuration
Universal Survivor Unlocks automatically creates its configuration after the game successfully loads with the mod installed.
Main configuration
BepInEx/config/UniversalSurvivorUnlocks/Survivors.json
When using r2modman or Thunderstore Mod Manager:
<Profile>/BepInEx/config/UniversalSurvivorUnlocks/Survivors.json
Backup
BepInEx/config/UniversalSurvivorUnlocks/Survivors.backup.json
You do not need to manually create Survivors.json.
✦ JSON Structure
The configuration separates survivors into two groups:
{
"availableSurvivors": {},
"unavailableSurvivors": {}
}
| Group | Description |
|---|---|
availableSurvivors |
Modded survivors that are currently installed and available. |
unavailableSurvivors |
Previously detected modded survivors that are currently unavailable. |
A survivor may become unavailable because its mod was disabled, removed, temporarily uninstalled, or failed to load.
Its saved configuration is preserved instead of being immediately deleted. If the survivor becomes available again, Universal Survivor Unlocks can restore its previous configuration.
✦ Example Survivor Configuration
{
"availableSurvivors": {
"ExampleBody": {
"displayName": "Example",
"internalName": "Example",
"bodyName": "ExampleBody",
"source": "com.example.survivor",
"originalUnlock": "Ninguno",
"available": true,
"status": "Available",
"reason": "",
"challenge": {
"enabled": true,
"name": "Example Challenge",
"type": "ApplyStatusEffects",
"parameters": {
"amount": 100,
"singleRun": true
}
}
}
}
}
Most metadata fields are maintained automatically by Universal Survivor Unlocks. Normally, users should only modify:
challenge
✦ Challenge Configuration
A challenge uses the following basic structure:
"challenge": {
"enabled": true,
"name": "Challenge Name",
"type": "ChallengeType",
"parameters": {}
}
| Field | Purpose |
|---|---|
enabled |
Enables or disables the Universal Survivor Unlocks challenge. |
name |
Defines the displayed challenge name. |
type |
Defines which challenge tracker should be used. |
parameters |
Contains settings specific to the selected challenge type. |
Example:
"challenge": {
"enabled": true,
"name": "Status Master",
"type": "ApplyStatusEffects",
"parameters": {
"amount": 100,
"singleRun": true
}
}
✦ ApplyStatusEffects
ApplyStatusEffects is currently the first fully implemented gameplay challenge type.
The challenge is completed when the configured number of valid status effects are active simultaneously during the same run.
For example:
"amount": 100
means:
Maintain at least 100 valid active status effects at the same time.
Negative Status Effects
Negative status effects count only while they are active on enemies.
Negative Effect
+
Enemy
=
Counts
Examples may include valid debuffs, damage-over-time effects, slowing effects, weakening effects, and crowd-control states.
The exact available effects depend on the currently loaded game content and installed mods.
Positive Status Effects
Positive status effects count only while they are active on allies or members of the player team.
Positive Effect
+
Ally
=
Counts
Negative status effects affecting allied players do not contribute to the positive total. Positive effects on enemies are not counted as valid enemy debuffs.
Stackable Effects
Stackable effects contribute once for every currently active stack.
Bleed x25
=
25 active effects
Example across multiple enemies:
Enemy A
Bleed x20
Enemy B
Bleed x15
TOTAL = 35
Non-Stackable Effects
A non-stackable effect contributes once per affected entity.
Slow on Enemy A = 1
Slow on Enemy B = 1
Slow on Enemy C = 1
TOTAL = 3
Multiple internal stacks of a non-stackable effect do not make that effect contribute multiple times on the same entity.
Multiple Targets
Status effects from multiple valid entities are added together.
Enemy A
Bleed x20
Enemy B
Burn x30
Enemy C
Bleed x25
Ally
Positive Buff x1
TOTAL = 76
The challenge uses the total number of valid effects currently active across the battlefield.
Real-Time Tracking
ApplyStatusEffects tracks the current state of the battlefield.
If an effect expires, is removed, is cleansed, or the affected entity dies, that effect stops contributing to the active total.
100 active effects
↓
10 Bleed stacks expire
↓
90 active effects
The active total can therefore increase and decrease during the run.
Once the requirement is reached and the survivor unlock is granted, that unlock remains completed for that player profile.
✦ Challenge Status
| Challenge Type | Gameplay Tracking | Status |
|---|---|---|
ApplyStatusEffects |
✅ | Implemented |
KillEnemies |
❌ | Not yet fully implemented |
Some automatically generated survivor configurations may currently contain:
"type": "KillEnemies",
"parameters": {
"amount": 100
}
The configuration structure supports additional challenge types, but only challenge types with an implemented tracker should currently be considered functional.
✦ Original Survivor Unlocks
Universal Survivor Unlocks intentionally does not replace unlock requirements provided by another survivor mod.
If a modded survivor already provides its own UnlockableDef:
Original Unlock Detected
↓
Universal Survivor Unlocks
↓
Leaves it unchanged
This helps prevent conflicts with progression systems designed by other mod authors.
✦ Compatibility
Universal Survivor Unlocks dynamically detects compatible modded survivors instead of requiring a hardcoded dependency for every character.
| Survivor / Mod | Detection | Unlock handling |
|---|---|---|
| Sora | ✅ | ✅ Tested |
| Ralsei | ✅ | ✅ Tested |
| HUNK | ✅ | ✅ Tested |
| Enforcer | ✅ | Original unlock respected |
| Nemesis Enforcer | ✅ | Original unlock respected |
| Auriel | ✅ | Original unlock respected |
These survivor mods are not required dependencies of Universal Survivor Unlocks.
✦ Sora Compatibility
Universal Survivor Unlocks has been extensively tested with Sora by Dragonyck.
Sora itself is not created or maintained by Universal Survivor Unlocks. Universal Survivor Unlocks only provides external compatibility and unlock integration when appropriate.
| Test | Result |
|---|---|
| Automatic survivor detection | ✅ |
| Generated USU unlock requirement | ✅ |
| Locked survivor behavior | ✅ |
| Unlock persistence | ✅ |
| Survivor uninstall / reinstall while locked | ✅ |
| Survivor uninstall / reinstall while unlocked | ✅ |
| Status effect tracking | ✅ |
| Positive status effects | ✅ |
| Negative status effects | ✅ |
| Stackable damage-over-time effects | ✅ |
| Non-stackable effects | ✅ |
| Unlock completion | ✅ |
| Repeated unlock prevention after completion | ✅ |
Sora remains the work of its original mod author. Universal Survivor Unlocks only provides external unlock integration.
✦ Multiplayer
Universal Survivor Unlocks uses server-side tracking groundwork for gameplay challenges.
This architecture is intended to support multiplayer-compatible unlock conditions.
⚠ Full multiplayer behavior is still experimental.
Host-to-client challenge configuration synchronization is still being developed and tested.
The planned behavior is:
Host Configuration
↓
Authoritative Challenge Settings
↓
Players In The Session
This would allow the Host's survivor challenge configuration to control the multiplayer session without permanently overwriting each client's personal configuration.
Until multiplayer synchronization has been fully validated, multiplayer challenge behavior should be considered experimental.
✦ RealerCheatUnlocks
Universal Survivor Unlocks is compatible with RealerCheatUnlocks.
It can be useful during testing for:
- manually granting survivor unlocks,
- manually revoking survivor unlocks,
- testing locked survivor portraits,
- validating unlock persistence,
- resetting test states.
RealerCheatUnlocks is optional and is not required for normal use.
✦ Installation
Thunderstore / r2modman
Install Universal Survivor Unlocks using:
- Thunderstore Mod Manager
- r2modman
Required dependencies should be installed automatically when installing the package with dependencies.
Manual Installation
Place the plugin inside your Risk of Rain 2 BepInEx installation.
The DLL should ultimately be located under:
BepInEx/plugins/UniversalSurvivorUnlocks/
Example:
BepInEx/
└── plugins/
└── UniversalSurvivorUnlocks/
└── UniversalSurvivorUnlocks.dll
✦ Dependencies
| Dependency |
|---|
| BepInExPack |
| R2API ContentManagement |
| R2API Language |
| R2API Unlockable |
Exact package dependency versions are defined in:
manifest.json
✦ Troubleshooting
Survivor Is Not Detected
Make sure:
- the survivor mod itself loads correctly,
- all required dependencies are installed,
- Universal Survivor Unlocks loads successfully,
- the survivor appears in Risk of Rain 2's survivor catalog.
Check:
BepInEx/LogOutput.log
and search for:
Universal Survivor Unlocks
The log contains detailed survivor detection information.
Survivor Is Not Locked
The survivor may already provide its own unlock requirement.
Universal Survivor Unlocks intentionally respects progression systems created by the original survivor mod author.
Survivor Was Uninstalled
Universal Survivor Unlocks preserves previously detected survivor configuration where possible.
The survivor may appear under:
"unavailableSurvivors"
When the survivor mod becomes available again, its previous configuration can be restored.
Configuration Problems
Check:
BepInEx/config/UniversalSurvivorUnlocks/Survivors.json
Make sure the JSON syntax is valid.
⚠ Fields Normally Managed Automatically
Avoid manually changing:
| Field |
|---|
displayName |
internalName |
bodyName |
source |
originalUnlock |
available |
status |
reason |
The recommended editable section is:
challenge
✦ Current Development
Current and planned development areas include:
- additional gameplay challenge types,
- survivor-specific default challenge presets,
- Host-authoritative multiplayer configuration,
- multiplayer synchronization,
- multiplayer compatibility testing,
- kill-based challenges,
- healing-based challenges,
- boss-related challenges,
- elite enemy challenges,
- stage progression challenges,
- difficulty-based challenges,
- run completion challenges,
- additional survivor compatibility testing.
✦ Planned Challenge Examples
| Example |
|---|
| Kill a configured number of enemies |
| Defeat specific bosses |
| Reach a specific stage |
| Complete a run on a specific difficulty |
| Heal a configured amount of health |
| Complete special survivor-specific objectives |
These examples are development goals and do not necessarily represent currently implemented challenge types.
✦ Source Code
Source code is available on GitHub:
https://github.com/Danileonardo/Rain2CharacterUnlock
Bug reports, compatibility reports, suggestions and development feedback can also be submitted through the repository.
✦ Third-Party Survivor Mods
Universal Survivor Unlocks does not claim ownership of third-party survivor mods.
Characters, survivor implementations, assets, animations, sounds, skills and other content belonging to third-party survivor mods remain the work of their respective creators.
Universal Survivor Unlocks only provides an external progression and unlock integration system for compatible survivors.
✦ Credits
Thanks to the Risk of Rain 2 modding community and the developers of:
- BepInEx
- R2API
- r2modman
- Thunderstore
for providing the tools and infrastructure used by the modding ecosystem.
Third-party survivor mods referenced for compatibility testing remain credited to their respective creators.
✦ License
Universal Survivor Unlocks is licensed under the MIT License.
See the included LICENSE file for complete license information.
CHANGELOG
Changelog
All notable changes to Universal Survivor Unlocks are documented here for Thunderstore and GitHub releases.
0.3.0 — Adaptive Generated Missions & Runtime Authority
Highlights
- Added the first public adaptive Generated mission pipeline for modded survivors that do not currently have an applicable Original, Official USU, or player CUSTOM mission.
- Generated missions are temporary runtime fallbacks: they are rebuilt from the currently installed survivor/profile context and are not persisted as player CUSTOM content.
- Added survivor gameplay/profile analysis, local power assessment, challenge-tier resolution, template compatibility scoring, deterministic candidate generation, and runtime mission materialization.
- Preserved creator-owned unlock content: vanilla/DLC progression and mod-author Original unlocks remain authoritative when present. USU Generated content does not replace them.
- Kept the 10 Official Mission v2 presets authoritative over Generated candidates and retained the 12 Legacy recipes as hidden reusable compatibility/editor assets.
Generated mission system
- Added
MissionProfileAnalyzerand related profile models to classify survivor bodies, skills, effects, usage patterns, and mission-relevant capabilities. - Added local power/complexity assessment plus ChallengeTier resolution used to scale generated mission difficulty without hardcoding individual survivor names.
- Added compatibility-scored reusable mission template families and a deterministic generator that selects temporary mission candidates from the local installed/unlocked context.
- Added runtime materialization for the currently supported Generated families:
ExecutionHealingSupportResourceMasteryMeleeCombatProjectileCombat
- Generated missions use compatible alternative performers rather than requiring the target survivor itself, and the generated target is never used to unlock itself.
- Added generated presentation formatting with compact vanilla-style text, including the existing two-line / 50-character-per-line presentation rule. Generic mechanic missions no longer expose internal performer counts such as
+7; character suffixes are reserved for missions that actually require specific characters. - Retained the historical 100-kill challenge only as an emergency compatibility fallback. Its presence is not used as a reason to replace Original creator content.
Runtime, authority, and presentation
- Added a runtime Generated materialization bridge into
SessionMissionRegistryso Generated candidates become real Mission v2 definitions without writing them intoSurvivors.json. - Added effective mission routing so Mission v2 Generated content is used for challenge evaluation instead of accidentally progressing the historical fallback in parallel.
- Added
AllowedPerformerSkillruntime condition support and generalized skill-token/internal-skill matching for generated performer constraints. - Added Mission v2 objective support used by the new generated families for healing and compatible skill/resource actions.
- Added an effective presentation bridge for Character Select / achievement-facing text so Generated and Official USU missions present the mission that is actually active.
- Original providers now explicitly bypass USU EFFECTIVE token refresh, preserving the creator's own presentation for Artillerist, Shock Trooper, Aurelion Sol, Auriel, Enforcer, Nemesis Enforcer, Miner while Original is selected, and future compatible Original providers.
- Miner remains the intentional curated exception where the player can explicitly choose between the creator's Original unlock and USU's separate
Excavación / Excavationpreset.
Multiplayer/session groundwork
- Generated missions participate in the same host-authoritative session snapshot model as other effective missions.
- Host Character Select snapshots include Generated/Official/selected mission data without persisting host choices into a client's local configuration.
- Generated progress scopes are materialized as shared session progress where required by the current generated templates.
- Host-side lobby snapshot construction and fragmented dispatch were validated with the current 23-survivor test profile. Broader client/run validation continues during the public release test cycle.
Validation
- Current test profile: 7 Generated candidates → 7 materialized, with
Unsupported families: 0andInvalid materializations: 0. - Confirmed that Original provider presentation is preserved while Generated/Official USU presentation continues to refresh normally.
- Confirmed that generated mission data remains temporary (
Persistencia: no) and does not become a stored CUSTOM mission.
0.2.2 — Mission Authority & Persistence Foundation
Highlights
- Separated the 10 current official Mission System v2 presets from the 12 hidden Legacy recipes. Legacy recipes remain preserved for compatibility, future CUSTOM missions, and later editor/generator work.
- Added Miner's independent USU preset Excavación / Excavation while preserving MinerUnearthed's native Original unlock. Miner remains Original by default and can explicitly switch Original ↔ USU.
- Added stable survivor identity using
ContentPack + Body(survivor:<source>:<body>) so persisted mission ownership no longer depends only on a transient runtime entry. - Upgraded
Survivors.jsonto schema v2 withdormantMissionsand the explicitPendingContentstate for survivor mods that are temporarily absent. - Reinstalled survivors now rehydrate the same persisted mission/configuration by stable identity while rebuilding runtime metadata from the currently installed mod.
Persistence and compatibility
- Absent survivor mods persist only the minimum required data: stable identity, Body/Source, challenge/Mission v2 configuration, provider/selection state, preset relationship, CUSTOM data, and forward-compatible mission metadata.
- Runtime character snapshots such as skills, skins, prefabs, lore, stats, Unity objects, and ContentProfile data are not stored as dormant truth.
- Added migration from the previous
MissingContentpersistence model to mission-only dormant records. - Official USU missions may remain prepared while their referenced survivor mod is not installed.
Provider,SelectionMode,BasePresetId,CustomMission, Mission v2 data, and unknown forward-compatible fields are preserved during normalization.- Future unsupported
schemaVersionvalues put persistence into read-only mode instead of allowing an older build to overwrite newer data. - Saves continue to use a temporary file before replacement and keep a previous-version backup.
Mission authority and provider handling
- Added centralized authority validation for the fixed current set of 10 Official / 12 Legacy presets, stable IDs, Body/Source bindings, Mission v2 metadata, localization bindings, reward ranges, and Legacy isolation.
- Centralized provider policy and provider selection so the embedded Risk Of Options UI, fallback UI, persistence, and runtime assignment paths share the same Original/USU/CUSTOM precedence rules.
- Preserved the global Original-first policy. Explicit
UserSelectedchoices are not silently replaced by automatic fallback logic. - Miner is the current curated direct Original ↔ USU exception and targets
creator.official.miner.excavation.
Runtime and maintenance
- Consolidated gameplay bootstrap, Mission v2 run lifecycle, Legacy run lifecycle, shared gameplay event hooks, polling tiers, and duplicated scrapper handling without intentionally changing mission semantics.
- Reduced duplicated high-frequency engine subscriptions and retained full-rate polling only where mission behavior requires it.
- Removed closed development-only migration/dead-code paths and reorganized survivor, persistence, provider, UI, Mission preset, and runtime files by responsibility.
- Public release builds now keep preset
AuthoringModedisabled; official assigned snapshots continue to refresh through their stableBasePresetIdpath.
Release validation
- Mission Authority runtime validation: 10 Official / 12 Legacy / Miner direct Original ↔ USU.
- Miner persistence workflow validated through installed → absent/PendingContent → reinstalled, preserving the same stable identity,
Excavación,Provider=USU, andSelectionMode=UserSelectedwithout leaving a duplicate dormant record. - This release does not introduce adaptive mission generation, power scoring, ChallengeTier resolution, or random template generation; those remain future work.
0.2.1 — Survivor Definitions & Mission Library Update
Release focus
- Closed the current curated survivor presentation/localization pass for the installed/tested survivor set.
- Added the first public Mission Library/provider-management interface while keeping the full mission editor for a later release.
- Kept the nine creator-made unlock missions on the existing Mission System v2 backend; this release does not migrate native/legacy unlock logic into Survivor Definitions.
Added
- Added the central
SurvivorDefinition/SurvivorDefinitionRegistrysystem. - Added curated Definitions for 15 survivor integrations:
- Aurelion Sol
- Auriel
- Enforcer
- Ralsei
- Sora
- Wooper
- Tinkaton
- HUNK
- Jhin
- Miner
- Rocket
- Scout
- Spy
- Heretic
- Nemesis Enforcer
- Added manual curated Spanish localization (
es-419/es-ES) plus English repairs for visible modded-survivor content where needed. - Added survivor content profiles covering overview/details, skills, keywords, skins, unlock information, and Logbook-facing lore/Notes.
- Added runtime content catalog services for survivors, items, equipment, skills, bodies, and stages, including discovery-aware presentation support.
- Added Mission Library UI with an optional embedded Risk Of Options integration.
- Added a Character Select launcher fallback when Risk Of Options is not installed.
- Added provider/assignment services for Original/USU/Custom state, preset assignment, restore-original behavior, preset snapshot refresh, and runtime mission refresh.
- Added centralized
UsuLogpolicy withLogging.VerboseLogging=falseby default. - Added runtime context tracking used by mission/content systems.
Changed
- Updated Jhin's active El Cuarto Acto requirement to 4,444+ lethal critical damage in the current preset/configuration source.
- Expanded survivor detection/content-profile handling so curated Definitions can activate without hard references to external survivor DLLs.
- Heretic now uses a special Definition path compatible with Moffein-Heretic exposing the vanilla
HereticBody/SurvivorDef instead of registering a separate modded SurvivorDef. - Updated locked-survivor presentation, browser/profile refresh behavior, and configuration reconciliation for the new profile/Definition layers.
- Improved runtime refresh and assignment handling so provider changes can be reflected without replacing the player's unrelated personal configuration.
- Risk Of Options is now a soft dependency/integration, not a required package dependency.
Localization / survivor presentation
- Curated visible-content coverage now includes character overview/details, skills, keyword panels, skins, achievements/requirements, and lore where available for the registered Definitions.
Notescontinues to represent Logbook lore only and follows the real native Logbook discovery state instead of a separate USU-known flag.- Removed the runtime automatic-translation direction from the current release path; 0.2.1 uses curated manual localization.
Compatibility and release metadata
- Bumped plugin, assembly project metadata, source manifest, and Thunderstore staging manifest to
0.2.1. - Updated README documentation for the current Mission Library, optional Risk Of Options integration, Definitions, and provider behavior.
- Preserved native survivor unlock providers when they exist; Definitions do not replace creator-owned unlock logic.
- Full visual mission authoring/editing remains planned for a later release.
0.2.0 — Creator Challenges Update
Release focus
- This release is focused on public testing and balance feedback for the current 9 creator-made survivor unlock challenges.
- The in-game preset library, preset reassignment UI, editable copies, and full mission editor are not included yet.
- Internal preset/library architecture is included so future releases can build on the same stable mission definitions without reverting the current challenge work.
Added
- Added/finished the current official Mission System v2 presets for:
- Sora — Elegido de la Llave Espada
- Ralsei — El poder de la bondad
- Jhin — El Cuarto Acto
- Spy — Sin que me veas venir
- Scout — Sed Termonuclear
- Rocket — La gravedad es opcional
- HUNK — La Parca No Falla
- Tinkaton — Forjada en Chatarra
- Wooper — De vuelta al agua
- Added localized official challenge names/descriptions for English and Spanish (
es-419/es-ES), with English fallback. - Added Lunar Coin rewards to the official generated achievements:
- Sora:
+4 - Ralsei:
+3 - Jhin:
+4 - Spy:
+3 - Scout:
+2 - Rocket:
+4 - HUNK:
+5 - Tinkaton:
+5 - Wooper:
+2
- Sora:
- Added
MissionConfig/ preset-origin metadata so official missions can retain a stable source preset identity for the upcoming library/editor workflow. - Added the read-only
MissionPresetLibraryServicelayer over the built-in preset catalog. - Added internal library access for assignable missions, official missions, legacy missions, Objective templates, and Condition templates.
- Added/expanded reusable Mission v2 runtime handlers for current official mission compositions, including:
KillHoldItemStackPickupItem/ no-item-pickup trackingCompleteTeleporterScrapItemsBombingRunCarryEquipmentCompleteEndingRecruitMinionsDefeatUmbraWavesLeaveStage
- Added reusable tracking/evaluation support for skill history and pre-damage target status so conditions can validate actions such as Wooper's poisoned Ravenous Bite requirement.
- Added global Mission v2 progress logging with milestone-based output to reduce log spam while retaining useful progress diagnostics.
Current official challenge changes
- Sora — Elegido de la Llave Espada
- Replaced the old 100-status-effect challenge with a Bulwark's Ambry / Artifact of Vengeance mission.
- Requires Mercenary to be represented in the party, the Vengeance Umbra encounter to be completed, and the Ambry to be exited successfully.
- Uses Shared mission progress.
- Ralsei — El poder de la bondad
- Replaced the old 10,000-healing challenge with a Devotion-focused mission.
- Requires Captain or Seeker, recruiting 3 Lemurian allies, and completing the teleporter route.
- Jhin — El Cuarto Acto
- Preserves the lethal boss critical-hit concept at 44,444+ damage.
- Added a dedicated
JhinOfficialpreset identity so Jhin is consistent with the other official creator presets.
- Spy — Sin que me veas venir
- Requires Bandit, Serrated Dagger, a valid boss backstab, and a fatal finishing hit.
- Removed the older Smoke Bomb prerequisite.
- Scout — Sed Termonuclear
- Reworked into two alternative routes:
- Hold 8 Energy Drinks, OR
- Complete the first-stage teleporter within 4 minutes without picking up items.
- Reworked into two alternative routes:
- Rocket — La gravedad es opcional
- Reworked into 3 successful bombing runs.
- Each bombing run requires 5 qualifying explosion kills before landing, with landing required between successful runs.
- HUNK — La Parca No Falla
- Replaced the old 24-hit / 24-kill execution streak challenge.
- Requires continuously protecting the Fuel Array and either escaping the Moon or obliterating at the Obelisk.
- Losing the required equipment or dying invalidates the route.
- Tinkaton — Forjada en Chatarra
- Reworked into a three-objective Mission v2 composition:
- Scrap 6 items.
- Hold Shattering Justice.
- Defeat a valid mechanical Eye boss target.
- Removed the old mandatory MUL-T + Blast Canister finishing-hit requirement.
- Reworked into a three-objective Mission v2 composition:
- Wooper — De vuelta al agua
- Reworked to require Acrid in Wetland Aspect.
- Requires 20 kills with Ravenous Bite against enemies that were already poisoned before the qualifying bite.
- Removed the old Bison Steak and stage-completion requirements.
Multiplayer
- Continued the host-authoritative session mission model.
- Mission snapshots are frozen/synchronized for the active multiplayer session instead of replacing each client's personal configuration.
- Shared and PerPlayer mission scopes are represented explicitly in Mission v2.
- Improved multiplayer completion routing and session unlock delivery.
- Preserved independent personal progress for PerPlayer mission routes.
Performance and diagnostics
- Added runtime activity planning so inactive legacy/runtime trackers can avoid unnecessary work.
- Added runtime budgets/throttling for periodic mission scans.
- Reduced repetitive progress/status/healing/kill logging.
- Added milestone-based progress output based on objective size.
- Prevented completed mission routes from continuing to emit unnecessary progress logs.
- Suppressed normal local progress/reward logging when all local profiles already own the survivor unlock, while preserving required network/session processing.
- Prevented repeated
Unlock temprano asignadomessages when the same generated unlock is revisited during ContentPack construction. - Hardened Ralsei's Devotion recruitment detection:
LemurianHarnessis resolved through the item catalog when available and falls back toDevotedLemurianControllerwhen the static marker asset is unavailable.
Preset catalog cleanup
- Normalized the internal built-in preset catalog before exposing it to players.
- The current library reports:
- 9 assignable official missions
- 12 hidden legacy mission recipes
- 26 Objective templates
- 35 Condition templates
- Legacy mission recipes remain available internally for compatibility/history but are no longer treated as new assignable missions.
- Official missions are returned as fresh copies from catalog factories so source presets are not mutated.
Changed
- Bumped the public release version to
0.2.0. - Updated README documentation to match the actual current nine official mission designs.
- Updated README multiplayer examples/scopes to match the Mission v2 definitions.
- Updated HUNK attribution to the current
rob-HUNKpackage and added Wooper to survivor credits. - Clarified that Risk Of Options and the in-game mission editor are not dependencies/features of 0.2.0.
- Clarified that current official presets are still source-synchronized and that permanent editable copies are a future feature.
Known validation focus
- Public testing is especially useful for balance/theme feedback across all nine official challenges.
- HUNK, Tinkaton, Sora, and Ralsei benefit from additional end-to-end testing across different mod profiles/multiplayer sessions.
- Devotion/Lemurian content can produce asset-assignment warnings in some profiles; reports should include
LogOutput.logso compatibility issues can be separated from unrelated third-party warnings.
Planned after 0.2.0
- Preset assignment service for assigning an official mission to another compatible detected survivor.
- In-game preset library entry point/configuration.
- Safe editable copies of official presets.
- Full Mission System v2 editor.
- User-created/shareable presets.
0.1.9
Added
- Added the first foundation of the new Mission System v2.
- Added reusable mission models for:
MissionDefinitionMissionRouteMissionObjectiveMissionConditionMissionRulesMissionTargetMissionPreset
- Added support in the new mission model for alternative mission routes:
- Conditions inside a route use
AND. - Different routes can work as
ORalternatives.
- Conditions inside a route use
- Added mission progress scope definitions for:
SharedPerPlayer
- Added the creator-preset / custom-mission ownership model.
- Creator presets are treated as original source definitions and are not intended to be edited directly.
- Added groundwork for player-created custom missions based on creator presets without replacing the original preset.
- Added initial
Killobjective evaluation for Mission System v2. - Added initial reusable mission conditions:
AirborneGroundedRequiredSurvivor
- Added reusable mission target categories:
AnyEnemyBossEliteSpecificBodySpecificBoss
- Added support for identifying specific enemies and bosses through stable internal body IDs such as
BrotherBodyorSuperRoboBallBossBody. - Added runtime
KillEnemieschallenge tracking. - Added GitHub Sponsors integration through
.github/FUNDING.yml. - Added bilingual project support and donation information to the README.
- Added Discord community sections for questions, bug reports, survivor requests, preset ideas and suggestions.
- Added detailed credits for the third-party survivor mods referenced by USU presets.
Multiplayer
- Reworked challenge completion routing around a centralized multiplayer-aware completion system.
- Improved session-wide unlock delivery.
- Preserved the host-authoritative challenge model.
- The host's effective challenge configuration remains authoritative during multiplayer sessions.
- Shared challenges can receive valid progress from multiple players.
- Per-player challenges continue to maintain independent player progress.
- A valid individual route can complete its challenge for the session without combining invalid partial player progress.
- The mission architecture now explicitly represents
SharedandPerPlayerprogress scopes. - Player-local configuration is intended to remain separate from the host's effective session configuration.
Changed
- Bumped Universal Survivor Unlocks to version
0.1.9. - Updated package metadata for Thunderstore.
- Updated the Thunderstore website link to the project's GitHub Sponsors page.
- Reworked the README to better explain:
- Built-in creator presets.
- Multiplayer behavior.
- Configuration persistence.
- Mission System v2.
- Support and donations.
- Discord/community support.
- Survivor mod attribution.
- AI usage transparency.
- Updated Jhin documentation to match the current preset requirement of 44,444 critical damage.
- Updated Scout documentation to match the current preset name Energía Atómica.
- Documented Rocket's current requirement of 15 airborne explosion kills.
- Clarified that Ralsei's challenge ignores passive regeneration.
- Improved separation between currently functional challenge trackers and the next-generation universal mission architecture.
Fixed
- Fixed outdated project version metadata that was still reporting
0.1.6in the.csproj. - Fixed inconsistent package version metadata between the plugin and Thunderstore manifests.
- Corrected outdated README and CHANGELOG information that no longer matched current preset values.
- Removed outdated documentation implying that all multiplayer challenge tracking was still experimental.
- Improved documentation around creator presets so users are not encouraged to directly overwrite source presets.
Development
- Existing challenge trackers remain functional while presets are progressively migrated to Mission System v2.
- Mission System v2 currently provides architectural groundwork and initial event evaluation; not every planned objective or condition is exposed to players yet.
- The future in-game mission editor will operate on custom mission copies instead of directly modifying creator presets.
0.1.8
Added
- Added Tinkaton preset: Forjada en Chatarra.
- Added the new
ScrapItemBossFinisherchallenge type. - Added tracking for items converted into Scrap during a run.
- Added final-hit validation for MUL-T's Bote explosivo against the Alloy Worship Unit.
- Added an AI usage transparency notice to the README.
Changed
- Increased Ralsei's Oración de Esperanza healing requirement from 5,000 to 10,000.
- Updated Bandit's multiplayer HUNK route to reduce false streak resets for remote clients.
- Shortened Tinkaton's challenge description to fit correctly in the survivor selection UI.
Testing
- Continued multiplayer validation for HUNK.
- Added diagnostic logging for Tinkaton's Scrap and final-hit conditions.
0.1.6
Added
-
Added built-in unlock presets for additional supported modded survivors:
- Sora —
Elegido de la Llave Espada - Ralsei —
Oración de Esperanza - Jhin —
El Cuarto Acto - Scout —
Sed Termonuclear - Spy —
Sin que me veas venir - Rocket —
La gravedad es opcional - HUNK —
La Parca No Falla
- Sora —
-
Added the
descriptionfield to survivor challenge configuration. -
Added support for custom challenge descriptions displayed by generated unlocks.
-
Added the
HealHealthchallenge type.- Tracks actual health restored to Player-team entities during a run.
- Supports players, allied summons, drones and turrets.
- Does not count barrier, shields or overhealing.
-
Added the
BossCriticalKillchallenge type.- Supports boss kills requiring a minimum critical-hit damage value.
- The current Jhin preset requires a lethal critical hit of at least 4444 damage.
-
Added the
HoldItemStackchallenge type.- Tracks item stacks independently for each player.
- Player inventories are never combined.
- The current Scout preset requires one player to hold 15 Energy Drinks.
-
Added the
BackstabBossKillchallenge type.- Uses Risk of Rain 2's backstab detection.
- The current Spy preset requires Bandit's Serrated Dagger to deliver the lethal backstab to a boss.
-
Added the
AirborneExplosionKillschallenge type.- Tracks lethal explosion / blast kills while the owning player remains airborne.
- Touching the ground resets that player's streak.
- Supports blast and shockwave kills.
- Supports player-owned explosive drones and minions.
- Drone or minion airborne state does not affect progress; only the owning player's airborne state is checked.
- Damage-over-time kills occurring after an explosion do not count.
-
Added the
PrecisionExecutionStreakchallenge type.- Supports consecutive Railgunner M99 weak-point hits.
- Supports consecutive Bandit Lights Out kills.
- The current HUNK preset requires either 24 consecutive Railgunner weak-point hits or 24 consecutive Lights Out kills.
-
Added player ownership resolution for gameplay events generated by drones and minions.
-
Added server-side tracking systems for the new challenge types.
-
Added built-in preset authoring synchronization support for development.
Changed
- Renamed Sora's built-in challenge from
Guerrero de la llavetoElegido de la Llave Espada. - Updated built-in survivor presets to use explicit challenge descriptions.
- Expanded gameplay challenge architecture to support multiple reusable server-tracked challenge types.
- Improved individual-player tracking so challenge progress from different players is not incorrectly combined.
- Improved handling of current Risk of Rain 2 APIs for item counts, damage sources and bullet hit information.
Development / Validation
- The new gameplay challenge implementations compile successfully.
- A general gameplay validation pass is still pending for the newly added survivor presets.
- Full multiplayer behavior remains experimental and requires additional validation.
0.1.3
- Added the built-in default unlock preset for Dragonyck's Sora.
- Sora now automatically receives the
Guerrero de la llavechallenge when first detected by Universal Survivor Unlocks. - The default Sora challenge uses
ApplyStatusEffectsand requires 100 valid active status effects simultaneously during a single run. - Added automatic migration for Sora configurations using the legacy default
KillEnemies 100challenge. - Existing customized Sora challenge configurations are preserved and are not overwritten.
0.1.1
- Added initial support for configurable survivor challenges.
- Added
ApplyStatusEffectschallenge tracking. - Status effect progress is calculated from effects currently active during a run.
- Negative status effects are counted only on enemies.
- Positive status effects are counted only on allies.
- Stackable effects contribute once per active stack.
- Non-stackable effects contribute once per affected entity.
- Multiple enemies and allies can contribute to the total simultaneously.
- Status effects stop contributing when they expire, are removed, or the affected entity dies.
- Added server-side tracking groundwork for multiplayer-compatible challenges.
- Improved dynamic survivor unlock handling and challenge configuration.
[0.1.0] - Initial Public Release
Added
- Automatic detection of modded survivors.
- Support for modded survivors loaded through different ContentPack implementations.
- Automatic creation of unlock requirements for modded survivors that do not provide their own character unlock.
- Automatic locking of newly detected supported modded survivors on first startup.
- Preservation of unlock requirements created by original survivor mod authors.
- Vanilla and official DLC survivors are excluded from the custom unlock system.
- Automatic generation of
Survivors.json. - Automatic preservation of unavailable survivor configurations.
- Automatic creation of
Survivors.backup.jsonwhen updating an existing configuration. - Default challenge configuration for newly detected supported survivors:
type:KillEnemiesamount:100
- Custom
UnlockableDefgeneration for supported modded survivors. - Custom achievement definitions used by generated survivor unlocks.
- Modded survivor portrait support for generated achievement icons.
- Locked survivor portrait handling in the character selection screen.
- Compatibility with RealerCheatUnlocks for manually granting and revoking generated unlocks.
- Logging for survivor detection, source identification, unlock generation and configuration synchronization.
Tested Compatibility
The detection and locking system has been tested with several modded survivors using different loading implementations, including:
- Sora
- Ralsei
- HUNK
These survivor mods are not dependencies.
Configuration
The generated configuration file is located at:
BepInEx/config/UniversalSurvivorUnlocks/Survivors.json
When using r2modman or Thunderstore Mod Manager, the file is located inside the selected profile.
Known Limitations
- Gameplay challenge progress tracking is not yet implemented.
- Challenge definitions such as
KillEnemiesare currently stored in the JSON and used to define generated unlock requirements, but they do not yet automatically complete through gameplay. - Additional challenge types are planned for future versions.
Planned
- Functional gameplay challenge tracking.
- Additional challenge types.
- Boss-related unlock conditions.
- Elite enemy challenges.
- Stage progression challenges.
- Difficulty-based challenges.
- Run completion challenges.
- Custom challenge presets for exceptionally powerful modded survivors.
- Additional compatibility testing with survivor frameworks and character packs.