You are viewing a potentially older version of this package. View all versions.
Shleidericks-UniversalSurvivorUnlocks-0.1.2 icon

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-5.4.2121 icon
bbepis-BepInExPack

Unified BepInEx all-in-one modding pack - plugin framework, detour library

Preferred version: 5.4.2121
RiskofThunder-R2API_Core-5.3.0 icon
RiskofThunder-R2API_Core

Core R2API module

Preferred version: 5.3.0
RiskofThunder-R2API_ContentManagement-1.0.11 icon
RiskofThunder-R2API_ContentManagement

API for adding content to the game

Preferred version: 1.0.11
RiskofThunder-R2API_Language-1.1.0 icon
RiskofThunder-R2API_Language

API for modifying the language localisation of the game

Preferred version: 1.1.0
RiskofThunder-R2API_Unlockable-1.0.2 icon
RiskofThunder-R2API_Unlockable

API for adding custom achievements and unlockables

Preferred version: 1.0.2
RiskofThunder-R2API_Networking-1.0.4 icon
RiskofThunder-R2API_Networking

Networking API around the Unity UNet Low Level API (LLAPI)

Preferred version: 1.0.4

README

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 UnlockableDef entries.
  • 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 ContentPack implementations.
  • 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 MissionProfileAnalyzer and 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:
    • Execution
    • HealingSupport
    • ResourceMastery
    • MeleeCombat
    • ProjectileCombat
  • 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 SessionMissionRegistry so Generated candidates become real Mission v2 definitions without writing them into Survivors.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 AllowedPerformerSkill runtime 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 / Excavation preset.

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: 0 and Invalid 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.json to schema v2 with dormantMissions and the explicit PendingContent state 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 MissingContent persistence 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 schemaVersion values 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 UserSelected choices 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 AuthoringMode disabled; official assigned snapshots continue to refresh through their stable BasePresetId path.

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, and SelectionMode=UserSelected without 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 / SurvivorDefinitionRegistry system.
  • 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 UsuLog policy with Logging.VerboseLogging=false by 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.
  • Notes continues 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
  • 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 MissionPresetLibraryService layer 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:
    • Kill
    • HoldItemStack
    • PickupItem / no-item-pickup tracking
    • CompleteTeleporter
    • ScrapItems
    • BombingRun
    • CarryEquipment
    • CompleteEnding
    • RecruitMinions
    • DefeatUmbraWaves
    • LeaveStage
  • 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 JhinOfficial preset 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.
  • 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.
  • 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 asignado messages when the same generated unlock is revisited during ContentPack construction.
  • Hardened Ralsei's Devotion recruitment detection: LemurianHarness is resolved through the item catalog when available and falls back to DevotedLemurianController when 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-HUNK package 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.log so 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:
    • MissionDefinition
    • MissionRoute
    • MissionObjective
    • MissionCondition
    • MissionRules
    • MissionTarget
    • MissionPreset
  • Added support in the new mission model for alternative mission routes:
    • Conditions inside a route use AND.
    • Different routes can work as OR alternatives.
  • Added mission progress scope definitions for:
    • Shared
    • PerPlayer
  • 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 Kill objective evaluation for Mission System v2.
  • Added initial reusable mission conditions:
    • Airborne
    • Grounded
    • RequiredSurvivor
  • Added reusable mission target categories:
    • Any
    • Enemy
    • Boss
    • Elite
    • SpecificBody
    • SpecificBoss
  • Added support for identifying specific enemies and bosses through stable internal body IDs such as BrotherBody or SuperRoboBallBossBody.
  • Added runtime KillEnemies challenge 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 Shared and PerPlayer progress 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.6 in 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 ScrapItemBossFinisher challenge 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
  • Added the description field to survivor challenge configuration.

  • Added support for custom challenge descriptions displayed by generated unlocks.

  • Added the HealHealth challenge 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 BossCriticalKill challenge 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 HoldItemStack challenge 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 BackstabBossKill challenge 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 AirborneExplosionKills challenge 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 PrecisionExecutionStreak challenge 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 llave to Elegido 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 llave challenge when first detected by Universal Survivor Unlocks.
  • The default Sora challenge uses ApplyStatusEffects and requires 100 valid active status effects simultaneously during a single run.
  • Added automatic migration for Sora configurations using the legacy default KillEnemies 100 challenge.
  • Existing customized Sora challenge configurations are preserved and are not overwritten.

0.1.1

  • Added initial support for configurable survivor challenges.
  • Added ApplyStatusEffects challenge 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.json when updating an existing configuration.
  • Default challenge configuration for newly detected supported survivors:
    • type: KillEnemies
    • amount: 100
  • Custom UnlockableDef generation 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 KillEnemies are 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.