# Play single-slot runs

> Give each run of an ironman, roguelike or permadeath mode one save that the player cannot copy back to undo a death, and end the run when it is over.

Product: Rolly Save 1.0.0 | Sheet: guide | Updated: 2026-10-31 | HTML: https://rolly-docs.pages.dev/save/guides/single-slot-runs/

## Start a run

Call **Start Rolly Run** with a slot that holds no save, such as `Ironman 1`. It writes nothing; the run's first save does. A slot that holds a save, a damaged one included, fails with Slot Exists: Start Rolly Run never deletes. **Is Run Active** tells whether the running game is a run, and in which slot.

Loading a slot that holds a run makes that run active again. Loading another slot, Clear Loaded Game and New Game+ end the binding; the run's save stays as it is.

## While a run is active

- Quick Save, autosaves and checkpoints write the run's slot, and Quick Load and Load Rolly Checkpoint load it.
- Save Game to Rolly Slot of another name, part saves and loads, memory slots and rewind fail with Invalid Input and the setup message OutsideRunSlot. Hide those buttons while Is Run Active is true.
- Copy Rolly Slot, Rename Rolly Slot and imports into the run's slot fail with Slot Exists.

## Why a copy of an older save does not load

Each save of a run takes the next number, and the run ledger records the newest number of each run: the first local player's profile by default, or one file for every profile and a dedicated server with Project Settings > Profiles > **Run Ledger** at Shared (see [Decide where runs record their saves](https://rolly-docs.pages.dev/save/guides/profiles/#decide-where-runs-record-their-saves)). Runs need no Profile Class. A copy of an older save, such as one the player kept in another folder, then loads with **Older Copy**. When the newest copy of the slot is damaged, the backup copy loads only when its number is the one the ledger recorded, as after a crash during the write; one below it fails with Damaged: the run's last save is lost, never replaced by an older one.

A load or an import of a run's save asked for while the ledger still loads, such as a game that resumes its run as it starts while the first local player's profile or the shared file is read, waits for it and is judged by it.

When the ledger cannot record a save, because no local player is there, the profile did not load or the shared file could not be read, the save still succeeds, its Issues have a NotRecorded line, and a setup warning tells you once a session. Older copies of that run then still load.

The ledger keeps 1,024 runs. Past that, an ended run is dropped to make room; when none has ended, a new run goes unrecorded.

This stops the game's own Copy, Rename and imports, and a slot's files put back by hand. A player who also puts back the ledger's files from the same moment, or deletes them, can load an older copy again: treat runs as protected against casual undoing, not against a determined player.

## End a run

Call **End Rolly Run** with the run's slot, loaded or not, such as from a menu that abandons a run:

- **Lock** keeps the save listed with Run State Ended; loading it fails with **Run Ended**.
- **Delete** deletes it.

When the slot is the active run's, the run ends at the call: saves asked for from then on, such as a Quick Save or an autosave in the same frame, go to their own slots, the current slot is cleared, and the ledger records the end, also when the game quits right after. For a run that is not loaded, the ledger records the end once the slot is read. Either way a copy of the slot made before the end also loads as Run Ended while that ledger is loaded. A slot without a run fails with Invalid Input and the setup message NotARun.

## Show runs in a slot list

List Rolly Slots gives each save's **Run State**: None, Active or Ended. **Set Rolly Slot Title** gives a run's save a title and keeps its run and save number. On a load's Failure, **Get Save Status Text** gives "This run has ended." for Run Ended and "This is an older copy of a run and cannot be loaded." for Older Copy.

## From C++

```cpp
Save->StartRun(TEXT("Ironman 1"));
FString RunSlot;
if (Save->IsRunActive(RunSlot))
{
	Save->QuickSave(); // writes RunSlot
}
Save->EndRun(TEXT("Ironman 1"), ERollySaveRunEnd::Lock);
```
