Two kinds of storage
| Storage | Platforms | What it means |
|---|---|---|
| One folder for every user | Windows, Mac, Linux, Steam Deck, Android, iOS | Every player’s slots and profiles are in Saved/SaveGames. A sign-out there is the end of the session: Windows reports one as the player shuts down or logs off, and Rolly Save writes a Session End save (Save when the game closes or goes to the background). Saving goes on. |
| Storage that keeps users apart | Consoles | Each platform user has storage of their own, prepared by the platform and closed at their sign-out. The rules below apply. |
Settings are in Project Settings > Plugins > Rolly Save > Platform.
Whose storage holds what
| Data | Lives with | Setting |
|---|---|---|
| Slots and the slot index | The saving user | Saving User: First Local Player (default), the platform user of the game’s first local player; or Primary Platform User, the platform’s primary user whatever player is first |
| A local player’s profile | That player’s platform user | |
| A guest’s profile (a local player without a platform user) | Nowhere: usable with defaults, never read or written, since every guest would share one file. Save Rolly Profile refuses it with InvalidInput. |
Guest Profiles: Not Saved (default), or With the Saving User, which keeps it in the saving user’s storage under its place among the local players (guest1) |
Sign-outs
On storage that keeps users apart:
- A profile’s user signs out: that profile goes, unsaved, since the user’s storage is closing; writes queued for that user that have not started end with
SignedOut. On User Signed Out fires with the player, the user index and Saving User false. At the next sign-in on that place, the player’s profile loads again and On User Signed In fires. - The saving user signs out: saves to slots end with
SignedOutand autosave and lifecycle saves stop; On User Signed Out fires with Saving User true; the setup messageSavingUserSignedOutnotes it, and the Signed Out notice tells the player “{Player} signed out, so saving is paused.” What the game does next, often a return to the title screen, follows the platform’s rules: decide it in On User Signed Out. - A queued save and the next person: on platforms that give the next person who signs in the place of the one who left, a write asked for before the sign-out never runs on the next person’s storage: it ends with
SignedOut.
When the saving user changes
These rules apply when the saving user signs in again after a sign-out, when the first local player moves to another user, and when another local player becomes first. When the Saving User Changes:
| Value | Then |
|---|---|
| Stop Until Load (default) | Slots are read from the new user’s storage, and saves to slots end with SignedOut until a load or Clear Loaded Game, so one user’s game never lands in another’s storage. |
| Follow | Slots move to the new user’s storage at once, the loaded game included. |
The platform’s preparation and interface
- Prepare Platform Storage (on): the platform prepares each user’s storage as the user is bound, at the game’s start or a join, so a console’s syncing or conflict dialog shows then rather than at the first autosave. Operations for that user wait for the platform’s answer, or for the next time the saves are flushed, as when the game leaves or quits.
- Platform Save Interface (off): lets the platform show its own save interface while Rolly Save reads and writes. Each save makes several platform calls (both copies’ reads before a slot’s first write, the write, the index write), so a dialog for each would interrupt play.
The platform’s save-data screens
With Answer Platform Save Info on, Rolly Save answers what a platform asks about its files for the platform’s own list of saves:
| File | Title | Subtitle | Detail |
|---|---|---|---|
| A slot’s copy | The slot’s title, else its name | The place (Set Slot Location), else the map’s name | Save time and play time |
| A profile’s copy | The profile’s name | Profile | Save time |
| The slot index | Save list |
Platform Save Icon names the icon, and Platform Max Save Size (MiB) the size reserved per file (0: the file’s own size). Each copy is its own file, so a platform that lists files shows two entries per slot. Files of other plugins go to the binding found before Rolly Save’s. A game that binds FGameDelegates::GetExtendedSaveGameInfoDelegate itself replaces Rolly Save’s answers; the setup message SaveInfoRebound says so once, and the game’s binding calls FRollySaveSaveInfo::Answer for Rolly Save’s files.
Free storage space
- Low Storage Warning (MiB) (100; 0 off): after a save, when the storage has less free space than this, On Low Storage fires with the free bytes and the warning, once, and again only after the space rose above it. The Low Storage notice tells the player “Storage is almost full. Free some space so saving keeps working.” The drive is read at most once a minute, after every save once it is below twice the warning.
- Check Rolly Storage Space: free bytes, or Known false where the storage cannot tell, for a slot screen or before a large save.
- A save that fails for lack of space ends with
LowStoragewhere Rolly Save measures the save storage: the Saved folder’s drive of a single-user storage. Storage that keeps users apart cannot be measured, so there a full store ends a save withFailed, and no warning comes.
Both notices are in Project Settings > Plugins > Rolly Save Screens > Notices (Low Storage, Signed Out).
Try it
rolly.save.lifecycle signout <user index> and signin <user index> report a sign-out or sign-in to Rolly Save. On a desktop the storage is one folder, so a sign-out is the end of the session there; the sign-out rules need a console’s storage.
C++
Events on URollySaveSubsystem: OnUserSignedIn(Player, UserIndex), OnUserSignedOut(Player, UserIndex, bSavingUser), OnLowStorage(FreeBytes, ThresholdBytes); CheckStorageSpace(OnDone) is the node’s call. A storage backend of your own tells Rolly Save that it keeps users apart (URollySaveBackend::KeepsUsersApart), prepares a user’s storage (PrepareStorage), measures its free space (StartQueryFreeSpace, GetFreeSpaceAfterWrites) and makes a backend per user (MakeUserBackend).