RunBackup
Automatically backs up your save every level, so a team wipe doesn't end the run. Rotating copies, restore by hand.
模組介紹 作者原文
RunBackup
Automatically copies your save every time a level starts, so a team wipe
doesn't have to end the run.
Built and compiled against game build v0.4.4 (Cosmetics Update line).
Why
R.E.P.O. deletes the save file when every player dies, and there's no in-game
undo. It also writes a save at the moment you die, so quitting from the death
screen rescues nothing. The only protection is a copy made beforehand — which
means remembering to make one.
This does the remembering.
What it does
Hooks RunManager.ChangeLevel, which covers both moments the game auto-saves:
arriving at the Service Station, and the instant a new level begins. Every
save the game writes gets a copy.
Copies land in a timestamped folder named after the run, e.g.
2026-07-24_11-42-08_L4-Manor, so you can find the right one at a glance.
Oldest are pruned once you pass MaxBackups.
Restoring
- Quit to the main menu (or close the game).
- Open the backups folder — by default Documents\REPO RunBackups.
The exact path is also printed in LogOutput.log at startup.
- Pick the backup from the level you want.
- Copy its contents back into the saves folder, replacing what's there.
- Load the game — you'll be at the start of that level.
Restoring is deliberately manual. Doing it automatically would mean writing
to the save folder while the game may be reading it, and getting that wrong
costs you the run it was meant to protect.
Host only
In multiplayer only the host has a save file at all, so only the host needs
this. Clients running it will simply never find a saves folder to copy.
Config
BepInEx/config/benjamin.runbackup.cfg
| Key | Default | Notes |
|---|---|---|
| Enabled | true | Master switch |
| MaxBackups | 10 | Oldest pruned first. A few hundred KB each |
| WriteDelay | 5.0 | Seconds to wait after a level change before copying |
| BackupDirectory | (empty) | Absolute path override. Empty = Documents\REPO RunBackups |
| Verbose | false | Logs every backup and prune |
WriteDelay exists because the game writes its save around the level change,
and copying mid-write would capture a truncated file. Raise it if a backup
ever looks incomplete.
Notes
The saves path is derived from Unity's Application.persistentDataPath
rather than a hardcoded AppData path, so it resolves correctly on Windows and
under Proton or a native Linux build.
Backups default to Documents\REPO RunBackups — somewhere you'll actually
find them — and are never written inside the game's saves folder, where
they'd risk being picked up by the game's own save list. If Documents doesn't
resolve (unusual setups), it falls back to a RunBackups folder beside the
saves folder.
Files are opened with ReadWrite sharing, so a backup can never block the game
from writing its own save even if the timing overlaps.
Tests
Unlike a gameplay patch, the file handling here is testable outside the game,
and it is. FileOps.cs has no Unity or BepInEx references so the same source
file compiles into a test harness covering recursive copying, byte-for-byte
integrity, copying while another process holds a save file open, prune
ordering and edge cases, and a 12-level rotation against a cap of 10.
Building
Requires.NET SDK 8.0+. Add the NuGet feeds in nuget.config, then:
dotnet build -c Release
Output lands in bin/Release/netstandard2.1/RunBackup.dll. Drop it in
BepInEx/plugins.
安裝與使用 安裝:BepInEx 外掛
- 本站下載的壓縮包就是模組本體,通常是 BepInEx 外掛(解壓後得到 .dll 或外掛資料夾)。
- 建議流程:用社群模組管理器(如 r2modman)選中本遊戲後匯入該模組,管理器會自動裝好 BepInEx 前置並處理依賴。
- 手動流程:先在遊戲目錄裝好 BepInEx 載入器,再把解壓出的 .dll 或外掛資料夾放進 BepInEx/plugins/。
- 啟動遊戲,BepInEx 控制台會列印載入日誌;確認這個模組出現在日誌裡即為安裝成功。
帶「前置依賴」的模組需要一併安裝,否則不會載入。功能開關通常在遊戲內或外掛自帶的設定檔裡調整。
下面這些內容需要先安裝,否則該模組不會生效: