A procedurally generated escape room event for Rust.
EscapeRoom
A procedurally generated escape room event for Rust. Players are dropped into a dungeon of dynamically built rooms, hunted by NPC carriers and a boss, and must crack a randomized four digit code to open the exit door before time runs out.
Every event is different. The layout, the NPC placements, the clue distribution, and the escape code are all rolled fresh each run, so no two playthroughs feel the same.
CORE LOOP
Players queue in a lobby with a visible countdown. When the lobby ends the event begins, an on screen timer takes over showing how long they have left, and the event goes live. Players explore room by room, kill NPC carriers for journal pages with clues, talk to wandering NPCs for riddles, fight a boss for the death code, and finally enter the four digit escape code at the exit door to win.
FEATURES
Procedural Generation
Multi room layouts with hallways, stairs, second floor, doors, and doorways
Room archetypes: start room, normal rooms, boss room, exit room
Pressure plate triggered doors
Decorative props placed by archetype
NPCs
The Turned: hostile NPC carriers placed throughout the dungeon. Each one drops a journal page on death containing a clue toward the escape code
The Unturned: peaceful talking NPCs scattered around the rooms. Players interact with them to receive spoken riddles
Boss: a final encounter that drops the code needed to unlock a separate door
Auto turrets in the boss room
Clue System
Over 40 distinct clue types generated per code, including math, parity, repetition, position, glyph shape, and journey style narrative clues
Each clue is wrapped into a thematic captive journal page with a unique flavor narrative for immersion
Clues are split between the Turned drops and the Unturned riddles, so killing and talking both reward the player
On Screen HUD
Lobby countdown HUD during the queue
Event countdown HUD during play, showing remaining time
Lives counter
Conversation panel for NPC interactions
Player Lifecycle
Saves and restores player inventory and stats across event entry and exit
Configurable lives system
Atmosphere
Optional escape room music
Lights out moments and lockdown timers for tension
Random screams
Configuration
| 1 | { |
| 2 | "Auto Spawn": { |
| 3 | "Enabled": true, |
| 4 | "Interval": 3600.0, |
| 5 | "Min Players Online": 1 |
| 6 | }, |
| 7 | "Event Settings": { |
| 8 | "Time Limit (seconds)": 1800.0, |
| 9 | "Max Players": 6 |
| 10 | }, |
| 11 | "Generation": { |
| 12 | "Wallpapers Enabled": true, |
| 13 | "Wallpaper - Wall Skin ID (0 = default)": 0, |
| 14 | "Wallpaper - Flooring Skin ID (0 = default, e.g. 10386 = Asbestos Vintage Yellow)": 10386, |
| 15 | "Wallpaper - Ceiling Skin ID (0 = default, e.g. 10388 = Plasterboard)": 10388 |
| 16 | }, |
| 17 | "Combat": { |
| 18 | "Player Kit (if set, overrides Starter Items; requires Kits plugin)": "", |
| 19 | "Starter Items": [ |
| 20 | { |
| 21 | "Shortname": "hazmatsuit", |
| 22 | "Amount": 1, |
| 23 | "Skin": 0, |
| 24 | "Container (belt, main, wear)": "wear", |
| 25 | "Weapon Mod (optional, e.g. weapon.mod.flashlight)": "" |
| 26 | }, |
| 27 | { |
| 28 | "Shortname": "rifle.ak", |
| 29 | "Amount": 1, |
| 30 | "Skin": 0, |
| 31 | "Container (belt, main, wear)": "belt", |
| 32 | "Weapon Mod (optional, e.g. weapon.mod.flashlight)": "weapon.mod.flashlight" |
| 33 | }, |
| 34 | { |
| 35 | "Shortname": "ammo.rifle", |
| 36 | "Amount": 300, |
| 37 | "Skin": 0, |
| 38 | "Container (belt, main, wear)": "main", |
| 39 | "Weapon Mod (optional, e.g. weapon.mod.flashlight)": "" |
| 40 | }, |
| 41 | { |
| 42 | "Shortname": "rocket.launcher", |
| 43 | "Amount": 1, |
| 44 | "Skin": 0, |
| 45 | "Container (belt, main, wear)": "belt", |
| 46 | "Weapon Mod (optional, e.g. weapon.mod.flashlight)": "" |
| 47 | }, |
| 48 | { |
| 49 | "Shortname": "ammo.rocket.basic", |
| 50 | "Amount": 20, |
| 51 | "Skin": 0, |
| 52 | "Container (belt, main, wear)": "main", |
| 53 | "Weapon Mod (optional, e.g. weapon.mod.flashlight)": "" |
| 54 | }, |
| 55 | { |
| 56 | "Shortname": "syringe.medical", |
| 57 | "Amount": 5, |
| 58 | "Skin": 0, |
| 59 | "Container (belt, main, wear)": "belt", |
| 60 | "Weapon Mod (optional, e.g. weapon.mod.flashlight)": "" |
| 61 | }, |
| 62 | { |
| 63 | "Shortname": "bandage", |
| 64 | "Amount": 5, |
| 65 | "Skin": 0, |
| 66 | "Container (belt, main, wear)": "belt", |
| 67 | "Weapon Mod (optional, e.g. weapon.mod.flashlight)": "" |
| 68 | } |
| 69 | ], |
| 70 | "Scientists Per Non-Start/Exit Room (Min)": 1, |
| 71 | "Scientists Per Non-Start/Exit Room (Max)": 2, |
| 72 | "Boss HP Base": 750, |
| 73 | "Boss HP Per Extra Player": 1.5, |
| 74 | "Turned HP": 150, |
| 75 | "Allow PvP Inside Event (overrides PvE plugins)": false, |
| 76 | "Allow Self Damage Inside Event (e.g. blowing yourself up, fall damage)": true, |
| 77 | "Allow Explosive Damage Between Players (overrides PvE plugins, splash from C4, satchels, grenades, etc.)": true |
| 78 | }, |
| 79 | "Traps": { |
| 80 | "Enabled": true, |
| 81 | "Min Traps Per Middle Room": 2, |
| 82 | "Max Traps Per Middle Room": 4, |
| 83 | "Turret HP": 100.0, |
| 84 | "Turrets In Boss Room (Min)": 1, |
| 85 | "Turrets In Boss Room (Max)": 2, |
| 86 | "Pressure Pad Doors Enabled": true, |
| 87 | "Pressure Pad Doors Per Event": 2, |
| 88 | "Pressure Pad Unlock Seconds": 5.0 |
| 89 | }, |
| 90 | "NPCs": { |
| 91 | "Unturned Kit": null, |
| 92 | "Boss Kit (blank for default scientist loadout)": "", |
| 93 | "Turned Melee Damage (per swing, before randomization)": 10.0 |
| 94 | }, |
| 95 | "Atmosphere": { |
| 96 | "LightsOutEnabled": true, |
| 97 | "LightsOutInterval": 300.0, |
| 98 | "LightsOutDuration": 180.0, |
| 99 | "LockdownEnabled": true, |
| 100 | "LockdownInterval": 240.0, |
| 101 | "LockdownDuration": 20.0, |
| 102 | "Screams": true, |
| 103 | "ScreamMin": 30.0, |
| 104 | "ScreamMax": 90.0, |
| 105 | "ColdBreath": true, |
| 106 | "Blood": true, |
| 107 | "Force Dark For Players In Event": true, |
| 108 | "Force Dark Hour (0-23)": 2 |
| 109 | }, |
| 110 | "Music": { |
| 111 | "Enabled": true |
| 112 | }, |
| 113 | "Rewards": { |
| 114 | "Currency System (Economics or ServerRewards)": "Economics", |
| 115 | "Currency Amount": 500, |
| 116 | "Kit": "", |
| 117 | "Reward Items (shortname:amount)": [ |
| 118 | "scrap: 100", |
| 119 | "wood: 1000" |
| 120 | ], |
| 121 | "Reward Console Commands ({steamid}, {playername} placeholders)": [] |
| 122 | }, |
| 123 | "General": { |
| 124 | "Broadcast": true, |
| 125 | "LeaderboardMax": 100, |
| 126 | "Player Lives (minimum 1)": 5, |
| 127 | "Blocked Commands (while in escape room)": [ |
| 128 | "home", |
| 129 | "tpr", |
| 130 | "tp", |
| 131 | "town", |
| 132 | "outpost", |
| 133 | "bandit", |
| 134 | "kit", |
| 135 | "backpack", |
| 136 | "remove" |
| 137 | ] |
| 138 | }, |
| 139 | "Queue": { |
| 140 | "Queue Wait Time (seconds)": 60.0, |
| 141 | "Min Players To Start": 1, |
| 142 | "Announce Queue Status": true, |
| 143 | "Event Start Sound Prefab (blank to skip)": "assets/prefabs/missions/effects/mission_victory.prefab" |
| 144 | } |
| 145 | } |
INSTALLATION
Drop EscapeRoom.cs into your oxide/plugins folder
Edit lang strings in the lang file if you want to translate or rewrite player facing text
NOTES
All player facing text lives in the lang file, so the dungeon, journal pages, NPC dialog, and HUD labels can be fully translated or rewritten without touching the plugin source