Author: UL
Version: 0.2.9
Install type: Host-only / server-side
Vanilla clients: Supported
Host-only cursed loot chaos for R.E.P.O. Touch haunted valuables, reveal one curse per level, and let the Taxman announce it through vanilla systems.
The host rolls a curse lazily when real loot is touched during a level. With the default CursesPerLevel=1, one curse reveal can happen per gameplay session. Additional touches in the same level reuse the same session instead of rolling more curses.
The mod currently focuses on touch-based curses for stability. It does not add new monsters, models, sounds, custom HUDs, or client-required assets.
Only the host needs the mod installed. Vanilla clients can join.
Curse effects use existing R.E.P.O. systems where possible, such as normal grab sync, vanilla enemy attention, targeted vanilla TTS/text, and truck screen messages. The mod is designed for public host-only play and keeps risky lifecycle hooks out of the public build.
Announcements use vanilla TTS/text behavior, not a custom HUD.
In v0.2.9 the host targets each player's own PlayerAvatar.ChatMessageSendRPC where possible, so the curse reveal can appear through the game's normal TTS/text path. R.E.P.O. does not expose a separate always-visible synced global chat-feed or system-message channel, so TTS/text still follows vanilla behavior.
The truck screen is the clearest shared visual announcement. Reveal messages include the curse name plus a short rule:
TAXMAN'S CURSE:
Player cursed: Curse Name
Short rule
Bottom objective HUD messages are not used by default because that UI path is local-only and not safe to present as a host-only public announcement.
The public config intentionally exposes only simple options.
[General]
EnabledHostOnlyDebugLogging[Curse]
CursesPerLevelIncludeHostAvoidSamePlayerTwiceCurseIntensity[TTS]
EnableTTSTTSModeTTSCooldownSeconds[CurseTypes]
EnableMimicValuableEnableLootBaitEnableReverseLuckEnableLastTouchCurseEnableGlassTouchEnableGoldenTrapv0.2.9 applies only one gameplay hook: PhysGrabObject.GrabStartedRPC.
It does not patch RunManager.GameDirectorStart, RunManager.ChangeLevel, drop, break, extraction, or level-end methods. It does not use Harmony.PatchAll.
The curse director is created lazily by a valid valuable touch in an active run and resets lazily when a valid touch reports a new gameplay session key. The session key is level-only:
room=<room>|scene=<scene>|round=<roundId>|levelGen=<levelGenId>
Player view IDs, toucher IDs, and cursed-player IDs are intentionally excluded so different players touching loot in the same level reuse the same curse session.
Install with a Thunderstore-compatible mod manager, or manually place the package contents into your R.E.P.O. BepInEx profile so TaxmansCurseHauntedLoot.dll is loaded as a BepInEx plugin.
The package depends on BepInEx-BepInExPack.
v0.2.9 is the stable public baseline. It includes the fixed one-curse-per-level session logic, simplified public config, TTS settings, centralized truck retry, and truck screen reveal messages with short curse rules.