Modules
| Module | Loads in | Depends on | Holds |
|---|---|---|---|
RollySave |
Runtime | Engine modules (Json for Rolly Save JSON’s reader; GameplayDebugger where the target has the debugger), RollySaveCore |
The save subsystem of each game instance and its part in each game world, the Blueprint nodes, Save Handlers, the quick keys, the save file format (FRollySaveFile, its header, its codecs and the format constants), records and the save archive that captures and applies objects, file names, storage backends, the store that keeps two copies of each file, the slot index, save thumbnails, Project Settings, the console commands, the check keys and severities the editor checks share (Checks/), the command-line load (-RollySaveLoad), the value model, edits, comparisons and checks the Save Inspector builds on (Inspect/), Rolly Save JSON (Json/), and the Gameplay Debugger category RollySave (Debug/) |
RollySavePCG |
Runtime | RollySave, RollySaveCore, Core, CoreUObject, Engine, PCG (plugin) |
PCG components as Rolly Save’s instance source (FRollySavePCGSource): their values records (URollySavePCGValues), which instanced components their generations made, whether they generate again after a load, and what the debugger shows of each; the PCG messages; RollySavePCGTesting. (test builds only) |
RollySaveStateTree |
Runtime | RollySave, RollySaveCore, Core, CoreUObject, Engine, AIModule, StateTree, GameplayStateTree and PropertyBindingUtils (plugins) |
The StateTree handler (URollySaveStateTreeHandler): the StateTree components of an actor and of an AI pawn’s controller, their run state, the parameters set on them and their active states, read and forced through an execution context made as the component makes its own |
RollySaveGAS |
Runtime | RollySave, RollySaveCore, Core, CoreUObject, Engine, AIModule, GameplayTags, GameplayTasks, GameplayAbilities (plugin, which brings Data Registry, Beta) |
The Gameplay Abilities handler (URollySaveGASHandler): the Ability System Components of an actor and of an AI pawn’s controller and its Player State, their attribute base values, granted abilities with their instances’ SaveGame variables, active effects with their remaining time and context, and loose tags derived from the tag counts; the native tag Rolly. |
RollySaveUI |
Games and the editor, never a dedicated server (ClientOnly) | RollySave, RollySaveCore, RollySaveCoreUI, Engine, UMG, Slate, SlateCore, InputCore, DeveloperSettings |
Rolly Save’s screens: the slot screen, its model and slot sources, the profiles panel, the saving indicator, notices and the loading overlay, the Rolly Save UI Subsystem that opens them and follows the game’s saves and loads, Project Settings > Rolly Save Screens, and the Blueprint nodes that open them |
RollySaveEditor |
Editor | RollySave, RollySaveUI, RollySaveCore, RollySaveCoreUI, RollySaveCoreEditor, RollySavePCG and PCG (plugin), RollySaveStateTree, AIModule, StateTree, GameplayStateTree and PropertyBindingUtils (plugins), RollySaveGAS (the Handlers menu and tests), GameplayTasks and GameplayAbilities (plugin) (tests only), UnrealEd, Kismet, KismetCompiler, BlueprintGraph, AssetDefinition, AssetRegistry, ClassViewer, PropertyEditor, Slate, SlateCore, Settings, DeveloperToolSettings, ImageCore, RenderCore, UMG (the pictures test only), Projects, Json, GameplayTags, InputCore, PlacementMode, DataValidation (plugin), MessageLog, SharedSettingsWidgets, ToolMenus, DeveloperSettings, LevelEditor, SceneOutliner, ToolWidgets, Foliage, ApplicationCore (the inspector’s clipboard), DesktopPlatform (its file dialogs), WorkspaceMenuStructure (its Window menu entry) |
The Save Rule’s Content Browser entry, thumbnail and editor, Pick Properties with its SaveGame flag edits, the Rolly Save component’s details with Effective Settings, the level tools’ sprite textures, class icons, thumbnails, Place Actors category and details, the cook hook that keeps the Save Handlers of Project Settings and every Save Rule in cooked builds, the Compiler Results check of handler Blueprints, the editor checks with their Message Log listing, Tools menu, console command, Data Validation validator and commandlet, the outliner column and filters, the viewport markers, the setup panel, Play from Slot, the Save Inspector, Editor Preferences, and the automated tests |
RollySaveCore |
Runtime | Engine modules only | Setup reports, validation, the player’s input device, keyboard layouts and key names, the Steam Deck check, the accessibility and narration preferences, the names every Rolly product shares, Project Settings > Plugins > Rolly Save Core |
RollySaveCoreUI |
Games and the editor, never a dedicated server | RollySaveCore |
The Rolly UI design system: theme and presets, widgets, components, navigation, layout templates, the category screen with search, the text field and on-screen keyboard, menu narration, toasts, dialogs, the per-player screen stack and the Common UI adapter |
RollySaveCoreEditor |
Editor | RollySaveCore, RollySaveCoreUI |
The Message Log listing, the design system’s cook hook, the theme editor, the core’s tests and the UI test support |
The three core modules are the shared Rolly foundation, carried whole inside the plugin under this product’s name, so all nine modules ship. Rolly Save’s runtime module uses only RollySaveCore and AIModule, includes no PCG, StateTree or Gameplay Abilities header and knows nothing of the screens: RollySavePCG, the only runtime module that links PCG, serves PCG components through the instance-source interface (IRollySaveInstanceSource), RollySaveStateTree, the only runtime module that links StateTree, holds the StateTree handler, a child of the engine state handler base, RollySaveGAS, the only runtime module that links GameplayAbilities, holds the Gameplay Abilities handler, a child of the AI state handler base, and RollySaveUI listens to its events and calls its API, so a game with its own menus can leave the screens’ settings off. The editor module’s tests use RollySaveCoreEditor’s test support. The product never depends on another Rolly product.
Folders
Every module keeps its front door in its root folder: the module header and the types several folders share. Everything else sits in a feature folder with the same name under Public/ and Private/, and code includes headers by that path (File/RollySaveFile.h). Each class’s header comment holds its details. Record/ includes Actor/ for the ACTR and COMP sections, record sections declared in the public header Actor/RollySaveActorSections.h, and Paths/ for the values saved by path, and Instances/ and Destruction/ for the INST and GCOL sections, declared in the public headers Instances/RollySaveInstanceSection.h and Destruction/RollySaveDestructionSection.h. Actor/ calls Instances/ to track, capture and apply instances; Instances/ includes no header of Actor/ and names its message sources through Paths/RollySavePathChecks.h. Paths/ reads only the public data struct FRollySavePropertyPath of Rules/, whose header stays at Rules/RollySavePropertyPath.h where buyers include it; Rules/ checks and explains paths through Paths/.
RollySave
| Folder | What it holds |
|---|---|
| (root) | RollySave. (module, log category), RollySaveTypes. (the types the game’s API shares: ERollySaveStatus and FRollySaveResult, compression, apply timing, load map, subject kinds, FRollySaveSlotInfo, slot kinds, run states and ends, FRollySaveScope, thumbnail format, aspect and view, profile key sources, load phases, FRollySaveProfileInfo, the nodes’ pins), RollySaveProjectSettings. (URollySaveProjectSettings, each value checked where it is used and in Validate; the Lifecycle Saves and Platform values within their bounds in FRollySaveSettingsPlatform, RollySaveSettingsPlatform.), RollySaveLevelTypes. (the level tools’ enums and events), RollySaveClassNames (private: class names as messages show them) |
Game/ |
Public: URollySaveSubsystem (the game’s API; calls in RollySaveSubsystemCalls., the rest in RollySaveSubsystem.; FRestoreScope), URollySaveWorldSubsystem (a game world’s part: its objects that save without setup, their IDs and the world’s moments; not on clients), URollySaveSession (the saved map), RollySaveGlobals, FRollySaveLoadRequest, RollySaveCallbacks., FRollySaveLoadTesting and FRollySaveHoldTesting (test hooks, development builds only). Private: FRollySaveGameServices and its services (see The subsystem and its services), FRollySaveWorldReady (when a load’s world is ready: On World Ready, Waiting for World), RollySaveMapSegments (a map’s group segments, `LSEG |
Checks/ |
Public: ERollySaveCheckKey (the checks’ keys, only appended), FRollySaveCheckSeverities with ERollySaveCheckSeverity (Check Severities), ERollySaveCheckOnSave, RollySaveChecks (key names, the ignore tags RollySaveIgnoreChecks and RollySaveIgnore., ApplySeverity and ApplySetting, which set the severity of the Data Validation messages the grouped rows govern) |
Actor/ |
Public: URollySaveComponent (Rolly Save: overrides, paths, handlers, Custom Save ID, events), FRollySaveActorSettings and FRollySaveActorOverrides, RollySaveActorIds (ID texts of actors and components), RollySaveActorSections (ACTR and COMP). Private: FRollySaveWorldActors (a world’s actors as saves see them; the gather in RollySaveWorldActorsGather., their IDs in RollySaveWorldActorsIds.), FRollySaveLevelScopes (each level’s ID scope, the actors of each scope by name, the levels saves leave out; FRollySaveLevelOwners asks the engine which level instance or World Partition holds a level), RollySaveStreamingMessages, FRollySaveActorTracker (spawned, destroyed and restored actors), FRollySaveCustomIds, RollySaveActorRules, RollySaveActorFields (engine state through getters and setters), RollySaveActorCapture, FRollySaveActorApply (a load’s actors; respawns, Apply Timing, attached handlers and removals in RollySaveActorApplySpawn., RollySaveActorApplyTiming., RollySaveActorApplyHandlers. and RollySaveActorApplyRemovals.), FRollySaveAttachedHandlers, FRollySaveBodyWaits (the saved motion of roots that wait for a body), FRollySaveLevelInstances (level instances’ designs and loaded state, ACTR bit 10) with RollySaveLevelInstanceMessages, FRollySaveAskedRecords, FRollySaveLateComponents, RollySaveComponentEvents, RollySaveActorMessages |
Instances/ |
Public: FRollySaveInstanceSettings with ERollySaveInstanceMode and ERollySaveInstanceComponents (Instances), FRollySaveInstanceKey (an instance’s key), FRollySaveInstanceSection with RollySaveInstanceSection (the INST section: encode, decode, check), FRollySaveInstanceTakes with RollySaveInstanceTakes (what an actor’s settings take of its components and the memory their design copies hold, for the editor’s Takes line and the outliner). Private: FRollySaveInstanceTrackers (a world’s tracked instanced components, listed by level, whose entries go once garbage collection took their level, an output component’s also as its source cleans it up or garbage collection takes it; listens to the engine’s instance events only while it tracks an ISM, HISM or foliage component), FRollySaveInstanceTracker (one component: the design copy, which instance is which, the tables of design places and saved places keys look up, removal times, what Begin Play added, unmatched and kept sections), FRollySaveInstanceIndexMap (an ISM’s index map, which the engine’s instance events keep, and its reverse), FRollySaveInstanceSkinnedIds (an Instanced Skinned Mesh component’s identities by instance ID), IRollySaveInstanceFamily (an ISM or Instanced Skinned Mesh component’s reads and writes), RollySaveInstanceRules (which components save and the kinds that never do), FRollySaveInstanceMatcher (saved entries to design instances: ID first for skinned ones, then a grid of cells twice Match Tolerance wide), RollySaveInstanceCapture and RollySaveInstanceApply (a component’s section from its instances and back; the capture also counts a component for the debugger without touching its tracker), RollySaveInstanceReset (a Reset Area’s per-instance drops), RollySaveInstanceKeys (keys and their lookup), FRollySaveInstanceRegrowth (Regrow After: removal times, the one world timer, due instances), RollySaveInstanceMessages; a source’s output: IRollySaveInstanceSource with RollySaveInstanceSources (public: the interface a module such as RollySavePCG implements, with Describe for the debugger’s lines, and what it tells Rolly Save of each generation), FRollySaveSourceOutputs (a world’s output records: which components each holds, the session’s copies, their capture and apply; keys in RollySaveSourceOutputsKeys.), RollySaveOutputGroups (a record’s groups, one per mesh, joined from its components and split back) |
Destruction/ |
Public: ERollySaveDestruction (Destruction), FRollySaveDestructionSection with RollySaveDestructionSection (the GCOL section: encode, decode, check, the structure hash), RollySaveDestructionSetup (whether a collection replicates and abandons pieces, and the problem and fix texts the run-time warning and the editor check share). Private: FRollySaveDestructions (a world’s broken geometry collections as saves see them: sections kept, set and waiting for registration, one structure hash per asset), RollySaveDestructionCapture (a collection’s pieces as a save reads them), RollySaveDestructionApply (the restore on the physics thread), RollySaveDestructionMessages |
PCG/ |
Public: ERollySavePCGValues and ERollySavePCGRegenerate (PCG Values, Regenerate PCG), FRollySavePCGOutputGroup with RollySavePCGOutputSection (the PCGI section: encode, decode, check, sort, a cell’s frame) |
Level/ |
Public: URollySaveTriggerComponent, ARollySaveCheckpointVolume, ARollySaveAutosaveVolume, ARollySaveSavePoint, IRollySaveTriggerInterface, URollySaveResetAreaComponent, ARollySaveResetAreaVolume, URollySaveGameClock, URollySaveResetAreaState with its entry, snapshot, shape and query structs (a map’s area record), URollySaveDataLayerState with its entry (a World Partition map’s runtime Data Layers record) and RollySaveDataLayers (their capture and apply through the engine’s Data Layer manager), URollySaveDynamicLevels with FRollySaveDynamicLevel (a map’s levels loaded with Load Level Instance under a name), URollySaveParameterCollections with FRollySaveParameterCollection, FRollySaveCollectionScalar and FRollySaveCollectionVector (a map’s values of the Saved Parameter Collections that differ from their defaults, captured with the map and set again with its values, the others put back to their defaults), RollySaveToolLabels, RollySaveToolColors, RollySaveToolSprites. Private: FRollySaveLevelTools (a world’s Reset Areas), FRollySaveHLODHiding (Hide Destroyed in HLOD), FRollySaveTriggerWatch (actors spawned this frame, triggers waiting for a restore’s end), FRollySaveAreaClocks, RollySaveResetStep with RollySaveResetAreas (the areas a build reads and which of them decide at a point) and RollySaveResetInstances (its part of saved instances), RollySaveResetAreaRecord (the record’s read rules), RollySaveTagQueries, RollySaveLevelShapes, FRollySaveToolFilter, FRollySaveTriggerActions, RollySaveLevelMessages, RollySaveToolLook (editor-only sprite and label) |
Player/ |
Private: FRollySavePlayers (a world’s player controllers, their own pawns, the local players’ IDs), RollySavePlayerCapture (local players into PLYR chunks), FRollySavePlayerLoad (their records once each own pawn is there and restarted), FRollySaveHolds (players held by reason, stopped and restarted), RollySaveGround (the tests of the ground under a held pawn) |
Rules/ |
Public: URollySaveRule (a Save Rule), FRollySaveActorFilter (Match and Except), FRollySavePropertyPath (a property saved by path), RollySaveRuleExplain (what one actor saves and why; FindMatches, AppliesBefore). Private: FRollySaveRuleSet (every rule asset, loaded as a game instance starts), FRollySaveRuleReload (Reload Save Rules), FRollySaveRuleResolver (one world’s precedence, by class entries), RollySaveRuleMatch and FRollySaveActorTags (compiled filters, an actor’s gameplay tags), RollySaveRuleChecks (setup checks of rules, the component’s rule settings and attached handlers) |
Paths/ |
Public: RollySavePathInfo (what the editor shows of a path: Inspect, FindSaveProblem, FindSetterProblem, TargetsComponent, Describe). Private: RollySavePaths with FRollySavePathStep (a Saved by Path or Not Saved entry that applies to an actor) and FRollySavePathBinder (an actor’s path steps bound to each class once), RollySavePathSetters (how a load gives a value back), RollySavePathChecks (setup checks and messages) |
Nodes/ |
Public: the async Blueprint nodes, each header listing its nodes: URollySaveSlotAction (writes, no Cancel), URollySaveLoadAction (loads, cancellable), URollySaveListAction, URollySaveImportAction, URollySaveBytesAction, URollySaveProfileAction, URollySaveReloadRulesAction, URollySaveThumbnailAction, URollySaveProfilesAction, URollySaveProfileInfoAction and URollySaveJsonAction; URollySaveThumbnailHoldLibrary (Capture, Use and Release Rolly Thumbnail Hold, synchronous), URollySaveWaitWorldReadyAction (Wait for Rolly World Ready). Private: RollySaveNodeSupport (the result of a node without a game instance) |
Handler/ |
Public: URollySaveHandler (the Save Handler base: Gather and Apply, Apply Timing, Group, GetTargetActor; the C++ hooks CaptureState with ERollySaveHandlerCapture, WouldWrite, CanApplyNow, OffersApplyTiming and GetHandlerName, and DescribeClassText for messages; IsLoaded, TakeLoaded, TakeCapture, SetTargetActor and ClearTargetActor take FRollySaveInternalKey, so only the module calls them) |
EngineState/ |
Public: URollySaveEngineStateHandler (the base of Rolly Save’s engine state handlers: never a Global Handler, After Begin Play at the earliest, ValidateEntries, CollectTargets, ValidateFilter, ValidateClasses and MakeBadEntryIssue (BadEntry for a subclass’s lists, ERollySaveBadEntry), design notes through NoteDesigns, NoteDesign and FindDesign, ApplyDesign for a load in place, TooMany and the Issues lines; TakesComponent and FindTargetsIn, the target rule its captures, the editor’s checks and Effective Settings share; DescribeNoTargets and MakeNoTargets, NoTargets; DescribeLiveState, the debugger’s lines of what its engine system shows now) with FRollySaveComponentFilter (Components: names, classes, tags) and FRollySaveTargetView with FRollySaveHandlerTargets, ERollySaveNoTargets and ERollySaveLevelInstanceUse (RollySaveHandlerTargets.: the components, timelines and AI controller’s components of an actor or a class default, and the components of that controller’s Player State while it plays, as a packaged game has them, and what a handler finds among them); the built-ins URollySaveMaterialHandler, URollySaveTimelineHandler, URollySaveSequenceHandler, URollySaveMontageHandler and URollySaveAudioHandler, and RollySaveEngineStateTypes. (play states, audio positions, material object kinds). Private: RollySaveEngineStateMessages (GlobalNotAllowed, TimingNotOffered, BadEntry, TooMany, NotSeekable, NoAudioDevice, BadCollectionEntry, TooManyCollections and the Issues lines), FRollySaveEngineStateTargets (a world’s met actors, their design notes and audio clocks, and what seamless travel carries of them), FRollySaveAudioClocks (each followed audio component’s estimated and reported position), IRollySaveAudioPlayback (the engine’s audio, which tests replace with FRollySaveAudioFake), RollySaveEngineStateDesigns (designs of targets without a record in a load in place), RollySaveMaterialParameters (a dynamic instance’s object parameters read and set by kind, and the parameter bound). AI: public URollySaveAIStateHandler (the base of the AI handlers: readiness asked of the AI waits, the pawn and its controller, Spawn Missing Controller) and URollySaveBlackboardHandler with its records (FRollySaveBlackboardBool to FRollySaveBlackboardStruct, one list per key type); private FRollySaveAIWaits (the pawns whose AI handlers wait for their AI, checked on the core ticker after the apply and after a controller’s On New Pawn, Spawn Missing Controller at the first check, AINotReady and ControllerNotSpawned) and RollySaveAIMessages |
Slot/ |
Public: URollySaveSlotMetadata (the metadata record), RollySaveSlotInfos (slot list entries from the slot index: the size clamp, the order, Make for editor tools). Private: RollySaveSlotMetadataCodec (metadata in the header field META: Encode, Decode, DecodeHeader, ReplaceTitle, MakeSlotInfo), FRollySaveSlotState (the next save’s play time, place and game fields), FRollySaveSlotList (List Rolly Slots, each entry’s metadata decoded once), FRollySaveSlotTitles (Set Rolly Slot Title, Save Game to New Rolly Slot), FRollySaveSlotThumbnails (Load Rolly Slot Thumbnail’s textures), RollySaveSlotMessages |
Scope/ |
Private: FRollySavePartSaver (a part save from call to write), RollySavePartSave (the merged file), RollySaveScopes (a scope’s chunks, group name rules, the parts a save lacks) with FRollySaveGroups, FRollySaveSlotHold (a slot’s requests kept in order behind a read-then-write: RunHeld, RunNext for the write it queues, and the hold token FToken) |
Memory/ |
Private: FRollySaveMemorySlots (memory slots, the checkpoint’s memory copy and rewind points on a store of their own, and the store New Game+ carries its parts through) |
Flow/ |
Private: FRollySaveAutosave, FRollySaveCheckpoints, FRollySaveMemorySaves (memory slots and rewind points), FRollySaveNewGames (Clear Loaded Game, Forget Level, Forget All Levels, New Game+), FRollySaveGameInPlay (whether a game is in play in the current map, which lifecycle saves need: from Maps Without Autosave while it lists maps, else from loads, saves and new games), RollySaveFlowMessages |
Run/ |
Public: URollySaveRunLedger and FRollySaveRunLedgerEntry (each run’s newest save number and end, in the profile). Private: FRollySaveRunSlots (Start and End Rolly Run), RollySaveRuns (the rules a run’s save passes to load) |
Profile/ |
Public: URollySaveProfile (the Profile Class base), URollySaveProfileChoice (the named profile a platform user picked). Private: FRollySaveProfiles (the local players’ profiles: calls, saves, the first player’s ledger and runs in RollySaveProfiles., key resolution and the load path in RollySaveProfilesLoad.) with FEntry (one player’s profile, RollySaveProfileEntry.), FRollySaveProfileObjects (a profile’s objects by role, their resolver), RollySaveProfileFiles (profile files read, applied and written by role), FRollySaveProfileCatalog (the named profiles’ files: listing, new files under random keys, the keys players are switching to or given), FRollySaveProfileChoices (each platform user’s choice record), FRollySaveNamedProfileKeys (the key resolver of Named profile keys), FRollySaveNamedProfiles (the named profile calls), RollySaveProfileMessages |
Thumbnail/ |
Private: FRollySaveThumbnailOptions (Project Settings’ Thumbnails within their bounds), RollySaveThumbnailCodec (a frame’s pixels as an image; cut, scale and encode within the byte budget; check and decode), FRollySaveThumbnailCapture (the pictures saves hold: held, asked for by a save, read once per frame, waited for) with IRollySaveImageSource, IRollySaveFrame and FRollySaveViewportImageSource (the viewport’s frames). It includes nothing of Game/: Load Rolly Slot Thumbnail’s textures are FRollySaveSlotThumbnails in Slot/, and the test part of FRollySaveLoadTesting is Game/RollySaveThumbnailTesting. |
Transfer/ |
Private: FRollySaveTransfers (delete, copy, rename, export, import and the export file list, each in its slot’s order), RollySaveTransfer (the export folder, file names, file work on a worker thread), RollySaveImport (the checks an imported file passes), FRollySaveJsonTransfers (the nodes’ and console’s JSON exports and imports: the slot’s read order, each record decoded and rendered in slices, files on a worker, every check of an import) with FRollySaveJsonExport (one export streamed to its file as each record decodes) and RollySaveJsonFiles (JSON files read and written on a worker). Public: RollySaveInspectTransfers (what the Save Inspector reads and writes through the store: a slot’s copies, a file or JSON opened read-only with its import check, StartImportCheck (the same check in slices: the records read on a worker, each checked by FRollySaveLoadedGame::FCheckSteps, then RollySaveImport::CheckGame), a write over the opened save, Restore as Newest, Import as Slot, JSON export) |
Gate/ |
Private: FRollySaveGate (save blocks by object and reason) |
Debug/ |
Public: RollySaveDebugLines (the lines of a debug snapshot or actor as the category draws them). Private: FRollySaveDebuggerCategory (the category RollySave, registered off where the target has the debugger: collects URollySaveSubsystem::MakeDebugSnapshot and MakeDebugActor on the server every half second). The snapshots are made in Game/: FRollySaveDebugSnapshot and FRollySaveDebugActor (RollySaveDebugSnapshot.), RollySaveDebugSnapshots, RollySaveDebugParts (an actor’s and the world’s instances, collections and PCG components, counted on the server), RollySaveDebugEngineState (an actor’s physics sleep, level instance state and attached handlers with their live lines, FRollySaveDebugHandler, ERollySaveDebugHandlerState, FRollySaveDebugLevelInstance and ERollySaveDebugInstanceLevel, and the world’s handlers, run-time levels, level instances, collections and sounds, FRollySaveDebugEngineState), FRollySaveDebugSnapshotBuild (the full snapshot in steps: the loaded game’s records copied, 256 records or 1 MiB per step, started again when FRollySaveLoadedGame::GetStamp changes) and FRollySaveDebugRecorder (the last save, load and their issues) |
Inspect/ |
The Save Inspector’s data layer, plain C++ without the editor. Public: FRollySaveValue and FRollySaveDecodedRecord with RollySaveValueCodec (a record’s sections as values by their saved types and back, byte for byte), FRollySaveInspectFile (a file split into chunks and records once; HasRunningValueVersions, whether values this build writes read back the same under a file’s versions), FRollySaveStagedEdits (changes checked as they are staged, then rebuilt into a checked file marked as edited) with ERollySaveEditRefusal and its messages (RollySaveEditRefusals; InsideBag refuses values inside a property bag), RollySaveValueText (exact numbers, names, type names and keys as text), RollySaveFileDiff (two files matched by key), FRollySaveRecordChecks (each record’s check by saved types, in slices, a large record over several), FRollySaveSlicedJob (game-thread work in slices of the core ticker), FRollySaveValuePath (a value’s place in a record, by section, index, member, element and key). Private: FRollySaveDiffMatcher and FRollySaveValueComparer (records and values matched by key for RollySaveFileDiff, in steps; keys with case through TRollySaveCaseKeyFuncs, which the JSON table reader shares), FRollySavePackedDiff (a packed array or set compared in blocks as runs; a set of 4- or 8-byte elements sorted on a worker), RollySaveStagedApply., RollySaveStagedFields. and RollySaveStagedFromDiff. (a staged change applied to its record, the header and ACTR and COMP fields, and a comparison’s value or record staged), FRollySaveValueDecoder (follows the structure check’s struct decisions through Record/RollySaveSavedTypes), FRollySaveValueEncoder (tables found by content, appended to, never reordered), RollySaveEngineString (an engine string in the form it was saved in), RollySaveValueInput (typed text into a value with its refusal), FRollySaveValueIds (stable IDs of a record’s values, so staged changes follow their values through removals and reverts) |
Json/ |
Public: RollySaveJson (Write as text or streamed UTF-8, Read, ReadUtf8, DecodeValues, IsRollySaveJson), its options, limits and results, and RollySaveJsonMessages. Private: FRollySaveJsonTextWriter (indented text within a byte cap), FRollySaveJsonValueWriter (values readable or as bytes; CanWriteValues, IsExact), FRollySaveJsonCursor (the engine’s token reader with depth, keys, NUL, numbers and Base64 checked as each token arrives), FRollySaveJsonRecordReader (a record’s tables, sections and values, encoded as soon as its JSON closes; texts, references, structs, containers and fields in RollySaveJsonRecordValues.), RollySaveJsonReading, RollySaveJsonTypeText (type names parsed without making names), RollySaveJsonReasons (one reason per guard), RollySaveJsonRender (a file written from records rendered to JSON ahead, one at a time) |
File/ |
Public: FRollySaveFile (a file in memory, with its reader, writer and Diagnose), FRollySaveFileHeader with FRollySaveFileVersions, FRollySaveThumbnail and FRollySaveEditMark (header field EDIT), FRollySaveFileDiagnosis (every checksum’s state), FRollySaveFileResult, FRollySaveFourCC and the RollySaveFormat constants, FRollySaveProtection with FRollySaveProtectionKey (a key set: the key that protects, the keys that read, and what a load does with changed and unprotected files) and FRollySaveProtectionMark (header field PROT). Private: RollySaveProtectionCodec (AES-256 counter mode from FAES blocks, streaming HMAC-SHA1, a chunk’s prefix), RollySaveFileSeal (a write encoded unsigned on a worker, then sealed with its sequence number and tag, so a save hashes its file once), FRollySaveByteReader and FRollySaveByteWriter (bounded little-endian values and strings; the writer also counts or matches bytes without keeping them), FRollySaveByteFills (large copies made a block per step), RollySaveHeaderCodec, RollySaveChunkCodec (Oodle per chunk), RollySaveFileDirectory (the chunk directory’s parser, shared by the reader and the diagnosis) |
Record/ |
Public: FRollySaveRecord and RollySaveRecordFormat, FRollySaveRecordResult, RollySaveRecordCodec (records as bytes, CheckFile), FRollySaveRecordWriter (captures an object), FRollySaveRecordReader and FRollySaveApplySession (apply records), IRollySaveObjectResolver, FRollySaveNameRegistry, FRollySaveRecordVersion, RollySaveRecordCheck (the structure check, its limits and budget, and FindForeignClass, which every bag restore asks whether a saved class fits the live property), FRollySavePreloader, RollySaveRecordClass, RollySaveContract and URollySaveInterface (the functions other plugins’ objects declare). Private: RollySaveStructureCheck with FRollySaveCheckContext, FRollySaveValueWalker, FRollySaveTextWalker and FRollySaveTypeName; RollySaveSavedTypes (the layouts by saved type the walker and the inspector’s decoder share); RollySaveBagHead (a property bag’s head, its has-data flag and descriptions, read by its structure, so the inspector and JSON keep it as bytes and read the values after it); FRollySaveArchive, FRollySaveCaptureTables, FRollySaveApplyTables, FRollySaveApplyContext, RollySaveInlineSection (INLN), RollySavePathSection (PATH), RollySaveHooks, FRollySaveIssueList, ERollySaveReferenceTag, RollySaveRecordRules, FRollySaveCheckFindings |
Storage/ |
Public: FRollySaveFileName (prefix, kind, key and copy of one file), URollySaveBackend (the asynchronous storage interface), URollySaveGameSystemBackend (the platform’s ISaveGameSystem, the default: one platform user and sign-in, its preparation, the free-space rule), URollySaveMemoryBackend, FRollySaveSaveInfo (answers for the platform’s save-data screens). Private: RollySaveGameSystemPipe (the one task queue for the platform’s blocking calls), RollySaveUserGenerations (each user index’s sign-in generation, process-wide), FRollySaveFreeSpaceReadings with RollySaveFreeSpace (the drive’s free space after writes, at most once a minute), RollySaveSaveInfoCache (what the save-info delegate answers, by file, bound once at module start-up) |
Platform/ |
Private: FRollySaveLifecycleDispatcher (binds the engine’s background, foreground, teardown, login and focus events once per process and tells each game instance’s IRollySaveLifecycleListener, then flushes within the time limit), FRollySaveLifecycleSaves (one game instance’s lifecycle saves: target, drop rules, the save), FRollySavePlatformUsers (the saving user, sign-outs, sign-ins and user changes, the slot pause), FRollySaveStorageSpace (On Low Storage, Check Rolly Storage Space), FRollySaveRemoteClientNote (RemoteClients), RollySavePlatformMessages. Public: the testing header RollySavePlatformTesting. (automation builds only) |
Protection/ |
Public: URollySaveProtectionKeyProvider (keys from a game’s C++, read on its class default object). Private: RollySaveProtectionKeys (Project Settings’ or the provider’s keys checked and made into one FRollySaveProtection, kept until the settings change; the setup messages and the KeyMissing warning) |
Store/ |
Public: URollySaveStore (save, load, delete and flush with two copies per file; LoadCopy reads one copy, and Save with an expected sequence number writes only over that newest save) and its result types. Private: FRollySaveStoreCore (what every store in the process shares), FRollySaveMailbox (steps from any thread, run on the game thread), FRollySaveStorage and FRollySaveSlot (one file’s queue and copies), FRollySaveSlotOperation with its write, load (and newest-header read) and delete operations, RollySaveOperations, RollySaveCopyRules (the rules of copies A and B), RollySaveWorkerTask (work on a worker whose result reaches the game thread through the mailbox, so a flush runs it) |
Index/ |
Public: FRollySaveIndexEntry and FRollySaveListResult, RollySaveIndexRead (a prefix’s index read without writing it, for editor tools and rolly.). Private: FRollySaveIndex (one prefix’s slot index on one storage), RollySaveIndexCodec (the INDX payload) |
Console/ |
Private: rolly., rolly., rolly., rolly., rolly., and rolly. and rolly. (not in Shipping), with RollySaveConsoleCommon. and RollySaveRecordDump |
Migration/ |
Public: URollySaveMigrations (the asset of steps), URollySaveMigrationStep (the step base), the six built-in steps (RollySaveMigrationSteps.), URollySaveMigrationContext (what a step sees and edits; paths in RollySaveMigrationContextPaths.; FRunScope sets the run of one Migrate call), FRollySaveRecordHandle and FRollySaveRecordInfo, RollySaveOldSaveCheck and FRollySaveBuildCheck, the same check in steps that do not block (editor builds only). Private: FRollySaveMigrationRunner (which steps run, in order), FRollySaveMigrationRun (a step’s edit rules), RollySaveRecordValues (a record’s top-level tags), RollySaveMigrationMessages |
Import/ |
Private: FRollySaveEngineImports (Import Engine Save Game’s checks), FRollySaveEngineSlotImport (one import), RollySaveEngineSlotHeader (the engine’s header, bounded), FRollySaveEngineSlotArchive (the engine’s property reader, bounded, loading nothing), RollySaveImportMessages |
RollySavePCG
| Folder | What it holds |
|---|---|
| (root) | Public: URollySavePCGValues (the values record’s object), RollySavePCGTesting. (test builds only). Private: RollySavePCG. (the module, which registers the source) |
Source/ |
FRollySavePCGSource (the instance source: which components are output, the record of a cell, the generations it hears; values records and a load’s decisions in RollySavePCGSourceValues.) |
Values/ |
FRollySavePCGValueSet and RollySavePCGValueRules (a component’s values read, compared, saved and set; parameters held as text) |
Messages/ |
RollySavePCGMessages (GraphChanged, RegenerateFailed, GpuInstancesNotSaved) |
RollySaveStateTree
| Folder | What it holds |
|---|---|
| (root) | Public: URollySaveStateTreeHandler with FRollySaveStateTreeState and FRollySaveStateTreeActiveState (a component’s saved run state, tree, parameters and path). Private: RollySaveStateTree. (the module) |
Tree/ |
RollySaveStateTreeAccess (a component’s reference, tree and instance data read by reflection, its active path read as tree and state ID pairs, and a path forced through FStateTreeExecutionContext::ForceTransition) |
Parameters/ |
RollySaveStateTreeParameters (the parameters set on a component captured into a bag and set again by property ID; the others back at the tree’s defaults) |
Messages/ |
RollySaveStateTreeMessages (ParameterLeftOut, the not-running reason of AINotReady) |
RollySaveGAS
| Folder | What it holds |
|---|---|
| (root) | Public: URollySaveGASHandler (the handler: settings, the record AbilitySystems, which components it takes, capture and the apply’s order), RollySaveGASTypes. (FRollySaveGASState, FRollySaveGASAttribute, FRollySaveGASAbility, FRollySaveGASEffect, FRollySaveGASTagCount, ERollySaveGASUnsaved, ERollySaveGASTagReplication), RollySaveGASTags (Rolly.), RollySaveGASTesting. (test builds only). Private: RollySaveGAS. (the module) |
Apply/ |
FRollySaveGASReport (what one apply set and left out, which the steps add to and the handler turns into one Issues line per kind) |
Attributes/ |
RollySaveGASAttributes (base values captured by set, checked, and set in two passes around the effects; Add Missing Attribute Sets) |
Abilities/ |
RollySaveGASAbilities (granted abilities matched to live ones by class and source through queues, updated, given, then removed per Not in the Save), RollySaveGASAbilityVariables (an instance’s SaveGame variables in a property bag whose descriptions take their IDs from the names) |
Effects/ |
RollySaveGASEffects (active effects matched by class and instigator, updated in place or replaced, applied with their locked duration and remaining time, an index of live effects that takes the effects an application adds), RollySaveGASEffectContext (instigator, causer, source, ability and origin) |
Tags/ |
RollySaveGASLooseTags (loose counts derived from the public tag counts, less effects’ and active abilities’ tags; set by difference) |
Messages/ |
RollySaveGASMessages (VariableLeftOut, EffectNotApplied, numbers that are not finite) |
RollySaveUI
| Folder | What it holds |
|---|---|
| (root) | Public: RollySaveUI. (module, log category), RollySaveUITypes. (the screens’ enums and structs: styles, grouping, sort, fields, titles, texts), URollySaveUISettings (Rolly Save Screens, with the clamped getters every reader uses), URollySaveUISubsystem (one per game instance: opens the screens, hands the game’s events to the pieces, keeps the session), URollySaveUILibrary (the Blueprint nodes). Private: RollySaveUIClasses (the class settings loaded as the game starts, falling back to the built-in classes), RollySaveUIMessages (setup messages), RollySaveUIDialogs (the choice and failure dialogs every screen opens), RollySaveUIMetrics (the screens’ sizes and durations) |
Model/ |
Public: FRollySaveSlotScreenModel (rows, groups, order and each row’s actions from a list of saves, without widgets), IRollySaveSlotSource with FRollySaveLocalSlotSource (the game’s saves) and FRollySaveExportSlotSource (the export folder’s files), FRollySaveSlotRowViews (what a row and the detail show and say), RollySaveSlotTexts (titles, save times, play times) |
Screens/ |
Public: URollySaveSlotScreen (the category screen fed by a source; header, footer and search in RollySaveSlotScreenHeader., row pictures in RollySaveSlotScreenPictures.; it keeps the answers that wait for a running save or load, WhenWorkEnds), URollySaveSlotRow, FRollySaveSlotFlows (save, load and new game with their questions, and what every flow of the screen shares: the questions, the failure dialogs, and the check of an answer against the saves listed again, which waits while a save or load runs; it tells the notices, indicator, overlay, session and opener it is given in FRollySaveSlotFlowsServices, never the subsystem), FRollySaveSlotManageFlows (delete, rename, More with copy, export and abandon a run, and import, asking through the flows), FRollySaveSlotNextPicture (the picture the screen’s own save will hold, as the screen opened), FRollySaveSlotPictures (the pictures in view and a page below, read one at a time, held by save and save time, at most 64), FRollySaveScreenOpener (opens Save, Load, New Game, Import and the profiles panel, or acts without a screen), FRollySaveUISession (each player’s order and last row, the saves that run with who started them, the unsaved play time) |
Profiles/ |
Public: URollySaveProfilesScreen (the panel; its flows in RollySaveProfilesScreenFlows.), URollySaveProfileRow |
Feedback/ |
Public: FRollySaveIndicatorPresenter with URollySaveSavingIndicator (Saving, Saved or Loading), FRollySaveHeldPlates (Show While Held: a Loading plate per held local player, each on a wait of its own on the tween runner that runs only while that player is held, ended when the hold ends, On Player Released or not, or its controller or local player goes; bound to its player’s screen stack for Hide Under Screens), FRollySaveNoticePresenter, FRollySaveOverlayPresenter with URollySaveLoadingOverlay (with Wait for World it stays after On Load Finished until that load’s On World Ready, and goes without “Loaded.” when another load without it starts or the world tears down), FRollySaveMapLoadScreen (Map Load Screen = Movie Player: armed at a load’s Opening Map, it answers the movie player’s request for a loading screen with SRollySaveMapLoadScreen, a Slate copy of the overlay built from FRollySaveMapLoadLook, and holds its picture and font objects until the movie ends; bound to the movie player only while armed or showing). Private: RollySaveFeedbackLayout (the viewport’s area and the corner a player’s plate and the overlay’s sign stand in) |
Testing/ |
Public: FRollySaveUITesting (a fixed clock for save times and a test’s movie player; test builds only) |
RollySaveEditor
| Folder | What it holds |
|---|---|
Cook/ |
FRollySaveCookRules, on UE::Cook::FDelegates::ModifyCook: the packages of the Global Handlers, the Migrations asset, the Slot Fields Struct, the Profile Class, the Game Clock Class and every Save Rule go into every cook |
OldSaves/ |
URollySaveCheckSavesCommandlet (-run=RollySaveCheckSaves), RollySaveOldSaveCases (a folder’s cases and their lines, shared with the tests), URollySaveFolderBackend (reads <stem>. from one folder, refuses every write and delete) |
Handler/ |
URollySaveHandlerCompilerExtension (Compiler Results: the Set nodes Event Gather reaches that write a variable without SaveGame) |
Assets/ |
URollySaveRuleFactory, URollySaveRuleAssetDefinition (the Content Browser entry), URollySaveRuleThumbnailRenderer |
Rules/ |
FRollySaveRuleDetails (the rule editor), RollySaveHandlerPicker with FRollySaveHandlerPickerModel, FRollySaveHandlerPickerRow and FRollySaveHandlerPickerOwn (the class menu of each Handlers entry: Clear, the eight engine state handlers, Gameplay Abilities last, and Rolly Save’s own search over the game’s handler classes, loaded and in the asset registry), RollySaveRuleOverview with SRollySaveRuleRows (Checks, overlaps and the open level’s count), FRollySavePathEntryCustomization (a path entry’s row), RollySaveEditorRules (every Save Rule asset, loaded) |
Picker/ |
Pick Properties: FRollySavePickerModel (the tree and each row’s state from RollySavePathInfo), SRollySavePicker, SRollySavePickerRowWidget, SRollySavePickerFooter, RollySaveClassMenus, FRollySaveSaveGameCount, FRollySavePickerSource (the rule or component edited), RollySavePickerPackages, FRollySavePickerWindows |
Flags/ |
RollySaveFlags (SaveGame on Blueprint variables and struct members, Cook Property GUIDs, one compile per Blueprint), FRollySaveFlagsUndo (compiles again after an undo or redo) |
Component/ |
FRollySaveComponentDetails, SRollySaveEffectiveSettings and FRollySaveEffectiveRows (Effective Settings, from RollySaveRuleExplain, with the Takes line from RollySaveInstanceTakes), RollySaveInstanceTexts (Instances as one value, its tooltip, the Takes line and the outliner’s Instances line), RollySaveHandlerTexts (an attached engine state handler’s line: what it finds on the actor or why it finds nothing, and its settings with the Apply Timing it uses as tooltip), RollySaveComponentOwner (the actor a component’s details speak for) |
Style/ |
FRollySaveEditorStyle (the Save Rule’s class icon; the level tools’ class icons, thumbnails and Place Actors icon from Resources/Icons), RollySaveEditorLines (icon and text lines of read-only rows) |
Level/ |
FRollySaveToolSpriteTextures (textures from Resources/Sprites, given to the runtime’s hook), RollySavePlaceActors, FRollySaveTriggerDetails and FRollySaveResetAreaDetails, SRollySaveToolChecks and SRollySaveOverlappingAreas (SRollySaveToolRows.), RollySaveOverlappingAreas |
Checks/ |
The editor checks. Facts: FRollySaveCheckFacts (a map’s actors, loaded and from World Partition data, and their classes; Collect, CollectUnopened; sublevels the editor hides or has not loaded, known from their actors’ files, and one loaded hidden as the map opened, placed by its components’ relative transforms). What saves state: RollySaveSavedState (in Rules/), shared with the Rolly Save column. Checks: IRollySaveCheck, one class per key, each over the facts in an FRollySaveCheckContext (RollySaveIdChecks., RollySaveStructChecks., RollySaveClassChecks., RollySaveRuleTieCheck., RollySaveSetupChecks., RollySaveStreamedAreaCheck., RollySaveDestructionCheck.), listed by RollySaveCheckRun::MakeChecks; FRollySaveCheckFilter (severity rows and ignore rules) and RollySaveCheckRun::Finish (order, at most 1,000 messages). Messages: FRollySaveCheckMessage with its fixes and actions (RollySaveCheckFixes), RollySaveCheckLog (the listing, pages, tokens, notifications), FRollySaveCheckResults (what the last runs named per actor or asset). Runs: FRollySaveCheckRunner (Check Open Map, Check Project, the checks after a save, the check after a fix), FRollySaveCheckOnSave (Check After Saving, on the next tick), FRollySavePlayCheck (TemporaryMap and QuickKeyDebugCommands at Play), RollySaveCheckCommands (Tools menu, rolly.), URollySaveMapValidator, URollySaveCheckProjectCommandlet with RollySaveProjectCheck, URollySaveSaveGameCompilerExtension (Compiler Results). RollySaveConfigWriter writes Project Settings to DefaultGame. after a checkout, FRollySaveConfigUndo writes them again after an undo. Badges: FRollySaveCheckResults files each problem under the actors, assets and class (BadgeClass) a message names, and the runner’s OnResultsChanged tells the column and markers |
Outliner/ |
RollySaveActorStateRules (an actor’s state, word, icon and tooltip, from the runtime’s explain call and the last checks), FRollySaveActorStates (the states of the editor’s and play worlds, worked out when first asked and forgotten on editor events and, through URollySaveLoadListener, when a play world’s game ends a load, and the marked actors per world), FRollySaveOutlinerColumn with SRollySaveOutlinerCell, FRollySaveOutliner (the column in every level editor outliner as Outliner Column says, the three filters of the group Rolly Save State, which know which of them are on and add up, the header menu) |
Markers/ |
FRollySaveMarkers (the show flag and the debug draw) with FRollySaveMarkerTextures (the two textures, looked up once), FRollySaveMarkerPicker (which marked actors get a pin in a view: distance, cap, fade, order) behind IRollySaveMarkerScreen |
Setup/ |
FRollySaveSetupModel (the rows, answers on a copy of Project Settings, the change list, Apply, a row’s notice and its button), SRollySaveSetupPanel (the window), RollySaveSetupOffer (the first-use notification), RollySaveDebugKeys (the engine’s debug commands on the quick keys, from the Input config and the player input defaults, and their removal lines in Config/DefaultInput. with URollySaveDebugKeysUndo for Edit > Undo) |
PlayFromSlot/ |
FRollySavePlayFromSlot (the button beside Play, the load at Play In Editor start, Standalone with -RollySaveLoad), FRollySaveSlotListReader and RollySaveSlotMenu (the slot list and the menu, with Inspect {Slot}) |
Inspector/ |
The Save Inspector. RollySaveInspectorTab (the nomad tab, its Window and Tools menu entries), FRollySaveInspectorModel (the open source, its copies, selection, staged changes, comparison and jobs; no Slate; its opens in RollySaveInspectorModelOpen.) with RollySaveInspectorOpener (sources read into an FRollySaveInspectorSource), FRollySaveInspectorWrites (writes, restores, imports and exports), URollySaveInspectorFollow (Follow Saves), RollySaveInspectorContents, RollySaveInspectorValueRows and RollySaveInspectorCompareRows (the rows each view shows), RollySaveInspectorTexts (every message and label); RollySaveInspectorLocator (a record’s object in the editor’s or the play world, and its actions); RollySaveInspectorDialogs; the views SRollySaveInspector (the root: source bar, copy cards, main area, side panel), SRollySaveInspectorContents, SRollySaveInspectorValues, SRollySaveInspectorCompare, SRollySaveInspectorSidePanel (File, Diagnose, Checks, Edits, Running Game) with RollySaveInspectorPanelRows (its rows) and RollySaveInspectorRunningGame (the Running Game section: loaded game, remembered and streamed levels, waiting records, memory slots) and SRollySaveInspectorPicker (the source picker), with RollySaveInspectorBars and RollySaveInspectorWidgets (the source and edit bars, cards and value editors) |
Protection/ |
FRollySaveProtectionDetails (the Generate Key button on Project Settings’ Protection Key row, which writes the key through RollySaveConfigWriter in one undo step) |
| (module folder) | FRollySaveEditorModule (RollySaveEditorModule.), which owns the check runner, the checks after a save, the config undo, the actor states, the column, the markers and Play from Slot and hands each the parts it uses; URollySaveEditorUserSettings (Editor Preferences); RollySaveEditorTesting., the module’s one test hook header (test builds only) |
Tests/ |
A folder per runtime folder or test area (Archive/, Check/, Contract/, Rename/, Async/, Editor/ and more), each with its test types and helpers. Shared: RollySaveTestHelpers (fixed fixture content, byte edits that keep checksums valid), RollySaveFixtureFiles (the fixture folder and its manifest), RollySaveGameTests::FTestGame in Game/ (a standalone game with files in memory), RollySaveEditorTests::FFixture in Editor/. Test hooks into the runtime go through FRollySaveLoadTesting in Public/Game/RollySaveLoadTesting. |
The subsystem and its services
URollySaveSubsystem names each call for setup messages and forwards it to the service that owns the work (RollySaveSubsystemCalls.cpp); each service keeps its own state. The subsystem itself keeps its events, the restore scopes, Request Slot Screen’s checks (a local player controller of this game instance, a listener) with the answer of the request that runs (Mark Slot Screen Request Handled sets it, from a listener of the subsystem’s event or of a trigger’s own, which fires inside the request), the binding of a blocking actor’s End Play to its save blocks, and the clamp of Set Check Limits to the format’s own limits (RollySaveSubsystem.cpp).
FRollySaveGameServices, made in Initialize, builds the parts in the order the game instance’s start needs: the Global Handlers’ classes and the Save Rules first; then, once the subsystem loaded the Migrations asset and made the Game Clock, the slot state, memory slots, save blocks, groups, game objects, services, loader, profiles, level memory, streamed levels and quick keys. It wires what each tells another: a load’s end runs the waiting saves, a save to storage arms the autosave timer, the last save block’s removal runs the waiting saves on the next tick, a load that applied starts New Game+‘s next cycle or, for a whole-game load, takes the save’s play time, place, game fields, run and current slot (one from storage also drops the rewind points and the checkpoint’s memory copy), and the local players’ arrivals and departures load and drop their profiles.
| Service | Owns |
|---|---|
FRollySaveCallChecks |
Whether a call may run now, the game instance and world it names, and the refusals |
FRollySaveFinisher |
The end of every call: the callback, then the event of a save or load, on a later tick when asked; the shutdown state (BeginShutdown, MarkFlushed) |
FRollySavePlaythrough |
The current slot, the single-slot run and its rules (it waits for and reads the first local player’s run ledger), a save’s metadata bytes |
FRollySaveCapturer |
Captures of the whole game, a scope’s parts or New Game+’s carry, one Save Handler save scope per capture, each a save’s start (On Save Started, with who started it: the player of FRollySaveSubsystemCalls::FPlayerSaveScope, the game’s autosave or checkpoint, or the server); HasLoadSince |
FRollySaveSaver |
Writes captured saves, to storage through FRollySaveStorageWrites, then the saved hooks, the playthrough’s records, the caller and On Save Finished |
FRollySaveStorageWrites |
A storage save’s write: in its slot’s request order, it reads the title the slot’s newest save holds, waits for its picture at most Max Wait, has its metadata written and queues the write |
FRollySaveThumbnailCapture, FRollySaveSlotThumbnails |
The pictures saves hold; Load Rolly Slot Thumbnail’s textures |
FRollySaveSlotTitles, FRollySaveProfileCatalog, FRollySaveProfileChoices, FRollySaveNamedProfileKeys, FRollySaveNamedProfiles |
Set Rolly Slot Title and Save Game to New Rolly Slot; the named profiles’ files, the platform users’ choices, the key resolver and the named profile calls |
FRollySavePartSaver, FRollySaveMemorySaves, FRollySaveCheckpoints, FRollySaveAutosave |
Part saves, memory slots and rewind points, checkpoints, autosave |
FRollySaveLoads |
Loads by name, request, rewind step or checkpoint, and their cancel |
FRollySaveSlotList, FRollySaveTransfers, FRollySaveJsonTransfers, FRollySaveRunSlots |
List Rolly Slots; delete, copy, rename, export, import; exports and imports as Rolly Save JSON; Start and End Rolly Run |
FRollySaveNewGames |
Clear Loaded Game, Forget Level, Forget All Levels, New Game+ |
FRollySaveWorldEvents |
What the game’s worlds do, told to the loader, level memory, slot state, level tools, autosave, streamed levels and, last, the command-line load in the order each needs; the restore count; Mark All Areas for Reset |
FRollySaveStreamedLevels |
Streamed levels: captured as they unload, applied as they become visible, the assets their records name, On Streamed Level Ready |
FRollySaveHolds, FRollySaveWorldReady |
Held players, their checks and their events; a load’s or travel’s wait for its world, On World Ready and Waiting for World |
FRollySaveStartSlot |
-RollySaveLoad and -RollySaveKeepMap: read once per process, when the first world of the server or a standalone game began play, and loaded through FRollySaveLoads |
FRollySaveObjectCalls, FRollySaveEngineImports, FRollySaveRuleReload |
Register, Unregister, Get Save ID and Apply Saved Values; Import Engine Save Game; Reload Save Rules |
FRollySavePlatformUsers, FRollySaveGameInPlay, FRollySaveLifecycleSaves, FRollySaveStorageSpace, FRollySaveRemoteClientNote |
The saving user and sign-outs; whether a game is in play; lifecycle saves, registered with the process-wide dispatcher; low storage; the remote-client note |
Deinitialize ends the parts in the order shutdown needs (FRollySaveGameServices::Shutdown): a save that captures over frames captures the rest, while every part it writes through is there; BeginShutdown, so nothing is told from then on; every hold ends; saves that wait for their pictures go on without them; the profiles, quick keys, save blocks, streamed levels, level memory and loader go; the store flushes, so a save asked for last still reaches storage, and the read of a part save, copy, rename, import or End Rolly Run answers inside the flush and queues its write; MarkFlushed; then the held slot requests run and the remaining parts go, the thumbnail cache’s textures among them. Services reference the pointers that hold the parts the end lets go of, so they see a part go; a service that answers later is shared and its callbacks hold weak pointers, so a callback that finds its service gone ends as the game instance’s end does. The Blueprint nodes, the world part and the test hooks reach the services through URollySaveSubsystem::GetServices, whose FRollySaveInternalKey only the module can make; the world part’s GetTriggerWatch and FindGameObjects take the same key.
A part that holds objects of its own reports them to garbage collection (FGCObject). An object it reports keeps its outer alive while the part exists, so the parts whose objects are outered to the subsystem (memory slots, profiles, handlers, slot state) go in Shutdown. The world part holds its areas’ record as a property (URollySaveWorldSubsystem::ResetAreaState) and FRollySaveLevelTools only refers to it: reported from the tools, the record would keep the world part, its world and every actor in it after the world ended (Rolly.Save.LevelTools.Reset.WorldCollected).
How it works
Writing a file (FRollySaveFile::Write): the header is checked (string lengths, thumbnail size, IDs of carried fields) and encoded, known fields in a fixed order, then carried ones. Each chunk is compressed with Oodle at the chosen level when that makes it smaller and stored otherwise; a carried chunk keeps the bytes it was read with. The directory follows the header, the chunks follow the directory, and the file and prelude checksums are filled in last.
Reading a file (FRollySaveFile::Read) runs the cheapest checks first, decodes and allocates nothing before every checksum and recorded size passes, and accepts nothing Write would not write back unchanged:
- The prelude: magic, length, its own checksum, MinReadVersion against this version’s format, the sizes.
- The length against the recorded size, the header’s checksum, the whole file’s checksum; when that fails, the directory’s and each chunk’s checksums name the part that changed.
- The header’s fields (printable IDs, the writer’s order, each string in the writer’s one form), then the package, licensee and custom versions against the running build.
- The directory, with all chunks’ decoded sizes held to 1 GiB, then each chunk: decoded when its ID is known, carried when not. An unknown chunk flagged MustUnderstand, or a known one in a codec this version lacks, makes the file one of a newer version.
FRollySaveFile::ReadHeader runs steps 1 and 3 on the first 64 + HeaderSize bytes. Reads of a save share the file checks of RollySaveResults, the part save with its own shorter Game Data Version text: CheckRecordVersions (NewerVersion for newer records, Damaged otherwise, by RollySaveRecordCodec::CheckFile), CheckGameDataVersion (NewerVersion above the project’s Game Data Version) and CheckVersions (both). Loads, part saves, profiles and imports then read through FRollySaveLoadedGame::ReadChecked: the record chunks (GLOB, WRLD, LSEG, PLYR, PROF) are decoded, the rest kept as read, and every record is checked by its saved types alone (RollySaveStructureCheck::RunSavedTypes, or over several steps through FRollySaveLoadedGame::FCheckSteps), property bag layouts counted across the file.
Saving the game (URollySaveSubsystem::Save), on the game thread:
FRollySaveCallChecks::PassGates, shared with loads, refuses on a later tick: off the game thread, without a game world, on a client (NotAuthority), a slot name that is not 1 to 1,024 characters without NUL, a name Rolly Save keeps for itself or a slot outside the active run, each with a setup message;Busywhile a load sets values or seamless travel runs. Saves the player asks for then passPassBlockGate.FRollySaveCapturercaptures.FRollySaveGameObjects::Gatherlists the globals with their IDs, in a fixed order: the session, the game instance and its subsystems,URollySaveWorldSubsystem::GatherGlobals(Game Mode, Game State, world subsystems, the persistent level’s Level Blueprint), registered objects by name, and a new instance of each Global Handler (FRollySaveHandlers). A global saves when its What Saves switch is on and its class declares a contract function or aSaveGameproperty the engine’s own classes do not declare (the engine flagsAActor::bCanBeDamagedSaveGame).FRollySaveGameCapturecaptures them with oneFRollySaveRecordWriterover the resolverFRollySaveGameObjects, so a pointer between saved objects saves as an ID, and oneFRollySaveCheckBudgetfor the whole file; then, with What Saves > Actors and Local Players on, the world’s actors and the local players in the same budget. The first refused capture ends the save withInvalidDataand writes nothing.FRollySaveLoadedGame::AddKeptToadds what the last load or save held and this save did not capture (its header says which records stay), each checked as if every value were read (CheckKept) in the same budget; a record past a bound is left out withKeptRecordDropped. A capture takes the sections this version does not know from the record it replaces.- The records become the payloads of GLOB (empty key), the map’s WRLD chunk and the kept chunks (
RollySaveRecordCodec::EncodePayload, on the game thread), beside the chunks and header fields this version does not read. The header gets this build’s versions, the slot’s name and the Game Data Version; the loaded game becomes what the save wrote.FRollySaveStorageWritesasks for the save’s picture at the call, then, in the slot’s request order (FRollySaveSlotHold), reads the title of the slot’s newest copy (URollySaveStore::ReadNewestHeader; from the store’s own knowledge of the copies, or by inspecting both, never from the slot index alone, since a crash between a save and its index write leaves the index naming the older copy), waits for the picture at most Max Wait, writes the metadata (Slot metadata below) and the picture into the header, and the store writes the file; a slot that cannot be read fails the save, so a title is never lost. Its result ends the save: the saved hooks, the playthrough’s records, the caller, then On Save Finished.
Events: the record writer tells the save of each object it captures (SetPreSaveListener), which keeps those whose class declares OnRollySaveSaved and the Rolly Save components with an On Saved binding. After a successful write the subsystem calls OnRollySaveSaved on those still alive, in capture order, then the components’ On Saved, then the caller and On Save Finished. A failed write and a level’s capture call neither.
Loading the game (URollySaveSubsystem::Load, FRollySaveLoads, FRollySaveGameLoader), on the game thread:
- The gates of a save. The store, or the memory slots for a load from memory, reads the slot; a status other than loaded (
NotFound,NewerVersion,Damaged,StorageFailed) or a refusal ofCheckVersionsends the load. - The metadata is decoded and the run rules judge it (
FRollySavePlaythrough::CheckRunLoad), waiting for the first local player’s run ledger while that profile loads.ReadCheckedends the load of a damaged file before the map changes. A lower Game Data Version goes through the Migrations asset’s steps (FRollySaveMigrationRunner; a failed step ends the load withMigrationFailed). TheSessionrecord, read into a newURollySaveSession, names the saved map, which must be in this build (MissingMap). FRollySavePreloaderloads the hard imports of GLOB, of the WRLD chunk of the map the values go to and of the players’ chunks, and holds them. A Level Blueprint’s class loads with its map (ClassLoadsElsewhere).- Keep Current Map applies at once (step 5). Open Saved Map or a given map starts a relative server travel (
RollySaveTravel::Start) that keeps the URL’s options; a refused or failed travel (UEngine::OnTravelFailure) or a world of another map ends the load withTravelFailed. In the new worldURollySaveWorldSubsystem::OnWorldComponentsUpdatedremoves the placed actors the save holds as destroyed, and the world’sOnActorsInitializedstarts the apply. FRollySaveGameApplyprepares each record of GLOB and the world’s WRLD for the object its ID names, when its What Saves switch is on and the object is of the record’s class after Core Redirects (RollySaveRecordClass::Resolve; ClassMismatch otherwise, except for the world’s own objects in another map and a level instance’s Level Blueprint, matched by its role, its class’s name and the level asset its package came from, as a spawned instance loads its level under a new package name).RollySaveWorldApply::Runtakes actors and players throughFRollySaveActorApply, andPrepareandApplyrun in one call. The Save Handlers of Apply Timing Before Begin Play apply, all of them with Keep Current Map. Records of registered names whose objects are not there wait untilRegisterObjectregisters one. The file becomes the loaded game.- The world’s
OnWorldBeginPlaybroadcast, after every actor’s Begin Play, applies the records of After Begin Play actors and the After Begin Play Save Handlers and ends the load: the caller, then On Load Finished. Saves areBusyuntil then.CancelLoadstops a load before its travel starts, except inside a migration step or whileApplyToWorldsets the values (the game’s hooks, On Loaded events and Save Handlers’ Apply run inside it); the game instance’s end drops a running load without firing anything.
Saving actors (RollySaveActorCapture::CaptureWorld): FRollySaveWorldActors::Gather walks the actors of each level of the world once, leaving out a level being removed or whose values wait to be set, and lists the subjects that save, ordered by ID; its header gives each kind’s ID. An actor saves by its resolved Saving: always with Always, never with Never, and with With Saved State when it or a component has saved state, it has a Rolly Save component, or a value of it or a component is saved by path. Engine-made actors, players’ own pawns, registered actors, spawned actors with Respawn off and, when a level is remembered, the actors seamless travel carries on are left out; the components that save follow their actor. After a subject’s OnRollySavePreSave and its Rolly Save components’ On Pre Save, its record goes into the map’s WRLD chunk with its ACTR or COMP fields (RollySaveActorFields); a value that is not finite is left out. Records of placed actors kept destroyed follow; those of a placed actor destroyed with Keep Destroyed off and of a spawned actor destroyed in play go.
Loading actors (FRollySaveActorApply, inside the world’s apply; its header lists the steps): a map load removes the placed actors held as destroyed before the world’s actors initialize, so they run no Begin Play or End Play (a replicated one, on a server, at the world’s Begin Play, so clients hear of it). Spawned actors the world lacks are spawned again, deferred, with their GUIDs, and the second pass’s records are checked against their classes before the first pass applies (FRollySaveGameApply::CheckAhead), so a damaged file applies and removes nothing. Between the passes the spawned actors finish spawning and the components that exist only now are prepared or created; other missing components wait (FRollySaveLateComponents). After the second pass come attachments, transforms, owners and the other fields, then the loaded functions of both passes, once, and each Rolly Save component’s On Loaded.
Save Rules and values saved by path (Rules/, Paths/):
FRollySaveRuleSet::LoadAllloads every Save Rule asset the asset registry lists as a game instance starts; saves and loads never load a rule, and the cook hook adds them to every cook. Reload Save Rules (FRollySaveRuleReload) loads them again asynchronously and takes the new set once no load runs.- Each world’s
FRollySaveRuleResolverresolves an actor once per save: Actor Defaults, the matching rules its component does not ignore, then the component, through class entries built once per class (its header gives the order and when entries are worked out again). An actor a load spawned again resolves with its class’s templates untilFinishSpawningran (FRollySaveActorTracker::IsRespawning). Saving Never leaves an actor, its components and its child actors out, and a load leaves their records with LeftOutByRule; the next save drops them. FRollySavePathBinderbinds an actor’s path steps (FRollySavePathStep) to each target class once, refusing what cannot save, each reported once. Not Saved entries remove picks, leave SaveGame variables out of PROP (FRollySaveArchive::ShouldSkipProperty) and leave whole components out (FRollySaveWorldActors::IsComponentLeftOutByName). The record writer writes the picks into PATH as tagged properties named by the joined path; a value that would hold an owned or untracked object is left out (FRollySaveCaptureTables::BeginPathValue, PathLeftOut).- At the apply, after PROP, a PATH tag applies only when its name is a path the object picks now, directly or after property Core Redirects (
RollySavePaths::RedirectName), and its type is the property’s own; a value whose asset or saved object reads as empty keeps the live one (PathKeptLive), and any other tag is skipped (PathNotApplied).RollySavePathSettersgives the value back. - In a load that opens its map and on a level’s return, the records of After Begin Play actors are checked with the first pass and applied at the world’s Begin Play broadcast through
RollySaveWorldApply::ApplyLater, counting on from the load’s budget; saves wait for them (FRollySaveCallChecks::IsSettingValues). Records of When Asked actors wait inFRollySaveAskedRecordsuntil Apply Saved Values (RollySaveWorldApply::ApplyAsked); saves leave those actors out and write their records back as loaded. - Attached Save Handlers:
FRollySaveResolvedActor::FindHandlerslists each class once with the entry of the last source listing it. An actor saves for its handlers only while one of them would write (FRollySaveAttachedHandlers::WouldAnyWrite, asked of one probe instance per entry). A save makes an instance per actor and class (FRollySaveAttachedHandlers::MakeForSave), captured after the actor’s components under<actor>|@Handler:<class path>; its pre-save hook runsCaptureState, andFRollySaveGameCapturetakes back what the writer counted of a capture that gave Nothing (the loaded record is dropped) or Keep (the loaded record is written back,IsKeptBack). A load makes one per handler record whose class the live actor attaches now and runs its Apply when its timing comes andCanApplyNowallows (ApplyReady): Before Begin Play with the load’s values, After Begin Play once its own actor began play, also in a level that streams in, When Asked when the game asks;URollySaveWorldSubsystem::RetryPendingHandlersasks again. Until then the instance waits and saves keep its record as loaded (IsWaiting); waiting instances of actors garbage collection took go after it, the listener bound only while load instances are held. A record of a class no longer attached is kept. A When Asked instance whoseCanApplyNowrefused when the game asked applies at the nextRetryPendingHandlers; an actor saves while one of its handler records waits. On a load that opens its map and on a level’s return, an AI handler’s record (URollySaveHandler::ReadsRecordWithPlayers) is read once the local players have their pawns: at the world’s Begin Play for After Begin Play, at the ask for When Asked, into the instance the load made, which waits with the record unread (FRollySaveActorApply::LeaveUnread,FRollySaveAttachedHandlers::SetUnreadandTakeUnread, read inRollySaveWorldApply::ApplyAsked); seamless travel carries the unread record with its instance, and a later load of the actor replaces both. An ask that applies nothing before its world began play is noted (FRollySaveAskedRecords::NoteEarlyAsk) and asked again at the world’s Begin Play (URollySaveWorldSubsystem::HandleWorldBeganPlay). - Engine state handlers (
EngineState/):FRollySaveEngineStateTargetsmeets an actor whose sources attach one at its level’s build, at its spawn or as Play In Editor’s construction pass replaces it (FRollySaveWorldActors::TrackInstances), asking a probe of each to note its targets’ design assets by component name and slot (NoteDesigns); a target first met at a save is noted then (FindDesign). A pawn met before it has an AI controller, as one spawned in play, streamed in or spawned again by a load is, gets its controller’s StateTree noted from the StateTree components of its AI Controller Class’s class defaults (FindDesignTreeinRollySaveStateTree). Captures write an asset only when it differs from its note. In a load in place,RollySaveEngineStateDesigns::ApplyToUnsavedgives the targets of met actors in the load’s scope without a record their design (ApplyDesign: Material Parameters’ noted materials, Montages’ Stop Other Montages). The Audio handler’s clocks follow each taken audio component’s play state throughIRollySaveAudioPlaybackand estimate its position from the world’s audio time, its pauses and its pitch, or take the engine’s playback percent while Position is Reported; a play the handler starts sets its clock’s offset. Met actors, notes and clocks go with their actor, their level’s unload or garbage collection, whose listener is bound only while one is held, and move with actors seamless travel carries, taken before the leave forgets the world’s levels. Handlers report missing targets, entries past a bound and skipped values throughFRollySaveAttachedHandlers::ReportIssueLineinto the running load’s result, or the log; capture lines (KeyLeftOut, ParameterLeftOut) go throughReportCaptureLineinto the save’s Issues (FCaptureLines). Actors tagged SequencerActor never save. The Gameplay Abilities handler (RollySaveGAS) is an AI state handler too, so its values apply through the same waits, on a tick after its timing and never inside an ability’s or the load’s own calls; each record runs every step’s guards first, then loose tags, abilities, their variables, base values, effects and base values again; a load tells each load instance whether its actor was there before it (URollySaveHandler::IsInPlaceApply, set inFRollySaveActorApply::PrepareHandler), which Not in the Save reads. The AI handlers (Blackboard, StateTree) apply only throughFRollySaveAIWaits: theirCanApplyNowasks it, it checks readiness on the core ticker after the apply and after the controller’s On New Pawn, which it follows through the world part’s listener of pawn controller changes, gives a pawn a load spawned again its AI Controller Class at the first check, and applies throughFRollySaveAttachedHandlers::RetryPending, so no AI value is set inside the load’s own calls; a pawn still not ready after the last check reports AINotReady and waits for Apply Saved Values. Data Validation’s NoTargets and Effective Settings’ handler lines count targets withFindTargetsInover anFRollySaveTargetView, the rule the captures use. Each map’s parameter collections are a global record of its WRLD chunk,ParameterCollections:<map>(URollySaveParameterCollections), captured and applied with the map’s other roles.
The local players (Player/): own pawns (FRollySavePlayers) never save as actors. A save with Local Players runs RollySavePlayerCapture::CapturePlayers after the actors: a PLYR chunk per local player keyed Local:<index>, with the controller, the own pawn, the player state, their components and their attached Save Handlers; the controller and player state save when they hold saved properties, a saving component or an attached handler that would write (FRollySaveAttachedHandlers::WouldAnyWrite). With Open Saved Map, FRollySavePlayerLoad applies each chunk through RollySaveWorldApply::ApplyLater once the player’s own pawn is there and the Game Mode’s restart finished, and a save meanwhile writes the waiting chunk (FindWaitingChunk); only records whose root owner is the chunk’s player apply (RollySaveWorldApply::IsInOwnChunk). Keep Current Map applies the PLYR chunks in the load’s own apply, and in another map the players keep their place (FRollySaveActorApply::KeepPlayersPlace). Travel never applies them.
Remembering levels (FRollySaveLevelMemory, whose header gives the engine’s moments): leaving a map captures its WRLD chunk as a save does, without the carried actors, in a budget of its own and without saved hooks, into the loaded game, unless Remember Levels is off or a load’s own travel leaves; a refused capture forgets the level. The next map’s preload starts as travel names it and is held through the worlds on the way; at the arrival the apply waits for the preload’s own requests (FRollySavePreloader::WaitUntilLoaded) and runs as a load’s does (RollySaveWorldApply::Run). Forget Level, Forget All Levels and Clear Loaded Game remove chunks, or mark the current world so that leaving drops its chunk. A save writes every WRLD chunk the loaded game holds; a load replaces them.
Streamed levels (FRollySaveStreamedLevels, whose header gives the engine’s moments), on the server or in a standalone game, once the map’s actors initialized and while no map change runs; nothing runs while no level streams. A level that starts to unload (FLevelStreamingDelegates::OnLevelBeginMakingInvisible, bIsBeingRemoved already set, so saves leave it out) is captured as a save captures its part of the map, in a budget of its own and without saved hooks, and each record replaces the loaded game’s of its subject, found through FRollySaveRecordIndex, or joins the map’s chunk, noted as changed (FRollySaveLoadedGame::NoteRecordChanged) so a save that chose its slot meanwhile keeps it; its leave clocks and its areas’ waiting entries are kept (FRollySaveLevelTools::HandleLevelLeaving), and FRollySaveLevelAssets holds the assets and types its records name, never an object of a level. With Remember Streamed Levels off, its records and its destroyed actors are forgotten instead. A level that starts to become visible (OnLevelBeginMakingVisible, before the engine moves its actors, registers its components or calls their Begin Play) joins FRollySaveLevelScopes, which takes its actors’ Custom Save IDs, and FRollySaveLevelApply::Begin collects its records by its actors’ IDs, its Level Blueprint and the spawned actors anchored to it or to its actors (a cell’s anchors asked again for loot no partition held as the index was built), runs its Reset Areas’ step (FRollySaveLevelTools::BuildLevel) over them and its actors held destroyed, and applies its placed actors’ records (RollySaveWorldApply::RunStreamed, load kind Streamed), writing an unattached actor’s place through the inverse of the level transform the engine applies next; only then does the loaded game drop the records the step reset or that a placed actor back as placed left stale, and its actors held destroyed go, so a level the bounds refuse changes nothing. From then until LevelAddedToWorld the level is hidden from saves. A level the session captured as the same object takes nothing until a load changes the records. At FWorldDelegates::LevelAddedToWorld, after the level’s Begin Play, Finish sets the saved velocity and sleep of its simulating roots and its level instances’ saved state (FRollySaveFieldWait: the bodies exist only once its components registered, Play In Editor’s construction pass makes a Blueprint’s root again before this moment, and a level instance unloaded here never adds its level; a root that has no body yet waits in FRollySaveBodyWaits, which hears UActorComponent::GlobalCreatePhysicsDelegate only while one waits), respawns its spawned actors, applies the records that name them, its Level Blueprint’s among them, and those of After Begin Play actors, and in Play In Editor the placed records a second time without their ACTR sections and within bounds of their own; then On Area Reset and On Streamed Level Ready. After Finish, the copy FRollySaveShownAgain took as the level started to become invisible while it may return as the same objects (its engine state handlers’ captured records, its roots’ motion and its level instances’ state, which the engine tears down) applies to the actors the level’s apply set nothing for; a load drops the copies of its scope. A level instance’s level that starts to become visible as another level than its instance’s record names drops the records under the instance’s scope from the loaded game first (LevelInstanceChanged), whatever Save Level Instance State is. A load taken in between makes the level’s copies stale: Restart collects the loaded game’s records instead and applies them after its Begin Play. A level whose records name assets that are not loaded waits, hidden from saves, for one asynchronous preload and applies after it. A file’s records count once against its bounds (FRollySaveLoadedGame::GetAppliedBudget), read and written as each part applies; records this session captured apply within bounds of their own. When Asked records wait in batches (FRollySaveAskedRecords), each with its versions, bounds and a holder of what it names. The cell at a place is the runtime hash’s answer (FRollySaveLevelOwners::FindEngineCellAt), with a look through every cell when its query misses; a Spatial Hash cell holds a place by X and Y alone, as its height is only its content’s.
Instanced meshes (Instances/), on the server or in a standalone game; nothing ticks: the world part’s FRollySaveInstanceTrackers copies the design of each instanced component an actor’s Instances settings take, at the map’s actors initialized, as a streamed level starts to become visible and as it is added (a construction pass’s new component takes the design of the one it replaced), and when an actor spawns, before any saved value applies; a component first met at a save or a load, such as one the game added, starts from an empty design. As the world’s or a streamed level’s Begin Play ends, the instances Begin Play added join each tracker’s design, those it asked keys for included, so a design is what the component holds once its actor began play; a level added again only gives the components a construction pass made the designs of those they replace. With Instances off nowhere, no rule is resolved for this and nothing is kept. The engine’s instance events keep each ISM’s index map and its reverse; an Instanced Skinned Mesh component’s instances are followed by their IDs, taken by place for a design copied before registration. A capture (RollySaveInstanceCapture) writes the component record’s INST section: the design instances removed, those changed (by design index) and the ones added, each removed one with the Reset Clock time it went, read once per capture when no event gave it, or a Whole List’s every instance; a section a load kept goes beside it as INSK. An apply (RollySaveInstanceApply, from FRollySaveActorApply‘s component pass) puts a component back to its design when it is not there, then matches each entry to a design instance (FRollySaveInstanceMatcher) and sets what play changed; a section saved with Begin Play’s instances waits for the actor’s Begin Play, as an After Begin Play record does; a load in place puts every tracked component that does not hold its design back to it first. The reset step (RollySaveResetInstances) drops each instance’s entries by its own place, and an actor reset keeps its components’ INST and INSK sections.
Regrow After (FRollySaveInstanceRegrowth, owned by the trackers): removal times are saved, never due times. On Play Time one one-shot world timer wakes at the earliest due time among loaded components, its wait scaled by the world’s time dilation and at most 30 seconds of world time, and none is set while nothing waits; the timer holds one entry per removal and drops a component’s entries as its tracker goes. On a Game Clock due instances come back as their level is built and at Check Rolly Regrowth, which skips components that hold every design instance. A due instance comes back as the level designs it, unless the deciding Reset Area is set to Never with Reset Instances on, which keeps it on the timer until the areas change (HandleAreasChanged, from FRollySaveLevelTools); during a streamed level’s build (FRollySaveInstanceRegrowth::FLevelScope, from FRollySaveLevelApply::Begin) the stop places a component not registered yet by its place in the level and the level’s move, and reads the level’s own areas. On Instances Regrown fires once its actor began play.
Broken geometry collections (Destruction/), on the server or in a standalone game; nothing ticks: a capture asks the world actors’ FRollySaveDestructions for each geometry collection component whose actor’s Destruction is not Off: a collection whose root broke gives its pieces as RollySaveDestructionCapture reads them from the dynamic collection, with the import of its rest collection and its structure hash, computed once per asset; a section a load set is written back byte for byte while every placed piece lies within 2 cm of where the restore put it; a kept section is written back while the collection stands whole. An apply (FRollySaveActorApply‘s component pass) checks the section’s flags, then its rest collection, piece count and hash against the live ones; a registered collection is restored at once (RollySaveDestructionApply: one physics thread command releases the pieces that broke at their saved places, disables the removed ones and marks them fully decayed, with the proxy’s break and crumbling notifications off around it), and one not registered yet waits, to be checked again and restored as its physics state is made (UActorComponent::GlobalCreatePhysicsDelegate, listened to only while a section waits or is set) or as its level’s HandleLevelAdded or FinishLevel reports it shown. A section a load set ends as the collection’s physics state is made again, which builds it whole from its rest collection (Reset State, a registration). The world’s physics steps (FPhysScene_Chaos::OnPhysSceneStep), heard only from a restore until its step shows the break, give a custom renderer the restore forced off its root proxy the proxy back, so a paused game keeps it. Shutdown, from the world part’s Deinitialize, ends both listeners. A load in place first makes the broken collections of its scope whole (ResetBroken), as a streamed level’s apply does for its own when the level is the object it was before the load. As a streamed level starts to become invisible, its broken collections’ sections wait for the same objects to register again, since the engine makes them whole as they do: a level the engine keeps loaded comes back so, as does one that unloads and is asked for again before garbage collection takes it. A level the engine trashes as it unloads (ULevelStreaming::ShouldReuseUnloadedButStillAroundLevels) keeps nothing, and the sections of a collected level go as those of gone components do. A capture never carries a loaded GCOL section into a record (FRollySaveGameCapture::CarrySections knows it), and past the file’s bound on pieces it leaves out the collection’s section alone.
Hide Destroyed in HLOD (FRollySaveHLODHiding, owned by the world part): it follows the HLOD runtime subsystem’s registered and unregistered events and, as each HLOD actor registers and after each load (FRollySaveWorldEvents::HandleLoadApplied), calls Destroy Actor on each entry of its destructible HLOD components whose name, as a placed actor’s ID in the map, the actor tracker holds destroyed. With the setting off it keeps no HLOD; turned on during play, it finds the HLOD actors registered meanwhile (CatchUp) at the next registration or load. While the tracker holds no placed actor destroyed it reads no entry. The engine replicates the state from a server and applies it in a standalone game.
Actor groups (RollySaveMapSegments, RollySaveScopes): an actor’s resolved Group (FRollySaveWorldActors::ChooseGroup, a child actor taking its host’s) tags each record it and its components and handlers capture (FRollySaveRecord::Group, in memory only). In memory a map has one WRLD chunk holding every group’s records, so the record index, level memory, streamed levels and the reset step see one chunk per map; FRollySaveLoadedGame::Read merges each LSEG <map>|<group> chunk into it, refusing a duplicate subject or a key that is no map and group, and FRollySaveGameCapture::WriteChunks splits it again (RollySaveMapSegments::Split). Scopes judge a map’s records one by one (RollySaveScopes::IsInScope with the record, IsGroupInScope): World takes the records without a group, Groups those of the groups named, so part saves keep, part loads apply and loads remove unsaved spawned actors per record.
Spreading work (FRollySaveCapturer, FRollySaveSpreadCapture, FRollySaveSpreadApply): FRollySaveCapturer::Prepare captures the globals, players and handlers in the save’s first frame and, for a kind Save Kinds lists, hands the actors’ subjects to a core ticker that captures within Save Time per Frame each tick, at least one subject a tick and a tick’s end only between two actors (RollySaveActorIds::FindActorKey), skipping a tick while a Save Block is on, and capturing the rest once Max Save Frames frames have passed. At its end the records of subjects that went or whose level unloaded are dropped, the destroyed actors added and the file written; a load (FRollySaveGameLoader::SetBeforeStart), a travel (FRollySaveWorldEvents::SetBeforeLeaving) or the game’s end finishes it at once, counting that frame, and later saves wait in order; a finish asked from inside a subject’s capture ends it once that subject’s capture returns. After Begin Play records of a load that opens its map apply in batches of one actor’s records each, within Apply Time per Frame, on a core ticker, the load’s preload held until they end, charging the loaded game’s applied budget as each batch applies. The busy gate (FRollySaveCallChecks::PassBusyGate) and a travel’s leave finish them in one frame (FRollySaveGameLoader::FinishSpread); a streamed level’s unload capture, whose actors no apply finds once the level is being removed, keeps the loaded game’s records of the actors whose values wait and takes them out of the spread (TakeSpreadPending); their end runs the waiting saves on the next tick.
Holding players (FRollySaveHolds, RollySaveGround, FRollySaveWorldReady): FRollySaveWorldReady follows each load from On Load Started; at its On Load Finished it holds each player of the world whose pawn is there and whose records are set, and lists the others the Game Mode gives a pawn (Arriving), held once a possession gave the pawn and FRollySavePlayerLoad set its records (its applied callback), with a one-shot ticker of Max Hold Time ending that wait; it becomes ready once none of them is held for the load or awaited and the spread values are set, reporting Waiting for World meanwhile, and tells OnBecameReady also when a wait ends without On World Ready. A hold that waits for ground binds UWorldPartitionSubsystem::OnStreamingStateUpdated and FWorldDelegates::LevelAddedToWorld, and, outside World Partition or for a client’s level, a ticker four times a second, only while such a hold exists, and each a one-shot ticker of Max Hold Time; a possession moves the hold’s stop to the new pawn on the next tick (FRollySaveHolds::HandlePossessed); a controller that goes drops its holds; a world that goes ends the holds made in it or of its players without events.
Data layers (URollySaveDataLayerState, RollySaveDataLayers): the world part holds the record object and lists it among the map’s globals in a World Partition map with Save Data Layers on; its OnRollySavePreSave fills it from the world’s UDataLayerManager, and its OnRollySaveLoaded, in the map’s apply before Begin Play, sets the layers through SetDataLayerInstanceRuntimeState, comparing saved layers with each instance’s full name, so nothing in the file becomes a name or a path; the loader adds its Issues lines to the load’s.
Components that appear after a load (FRollySaveLateComponents, whose header gives the listener’s rules): a component record whose component is not there waits by actor and name until an object creation listener sees the component made, and applies the next frame through RollySaveWorldApply::ApplyLater. A level that starts to unload drops the records of its actors’ components (ForgetLevel), since the engine destroys its actors without telling of each; a level the engine keeps loaded while invisible keeps them.
Slot metadata (Slot/): after the captures, FRollySaveSlotState::MakeValues gives the map, the play time, the place, the kind and the game fields, and FRollySavePlaythrough::EncodeMetadata writes them through RollySaveSlotMetadataCodec::Encode as one URollySaveSlotMetadata record under the global ID SlotMetadata in the header field META; past 16,384 bytes the game fields are left out (FieldsTooLarge). FRollySaveSlotList lists slots from the headers the slot index keeps (DecodeHeader, MakeSlotInfo), decoding each entry’s metadata once per copy, sequence number and hash, and never reads a save. The metadata holds the title and whether the header holds a picture. FRollySaveSlotTitles rewrites a slot’s newest copy with a new title inside the slot’s hold, keeping a title for a slot without a save in FRollySavePlaythrough until that slot’s first write; a save to a new slot lists the slots, then reads the lowest free slot_<n> inside its hold and writes there (FRollySaveStamp::bSlotHeld, so the write goes before the slot’s waiting requests), trying the next number when the slot holds a save.
Thumbnails (Thumbnail/): FRollySaveThumbnailCapture keeps the pictures asked of the next frame, each with a weak pointer to its shot, and asks its image source for that frame: FRollySaveViewportImageSource binds UGameViewportClient::OnViewportRendered, where the world and the HUD have drawn and Slate has not, only while a frame is wanted. At the frame the capture drops the requests whose shots are gone, as when their saves went on without them, and reads the rectangle around the rest once, the one wait on the GPU; each picture’s pixels are converted from the read (also from linear colour), cut to Aspect, scaled and encoded on a worker (RollySaveThumbnailCodec::ToImage and Encode), stepping down JPEG quality, then width, within Max Size, the result coming back through RollySaveWorkerTask. A Manual or Quick save takes the picture Capture Rolly Save Thumbnail or Set Next Rolly Save Thumbnail held in the current map; a save of a kind Kinds lists asks for one otherwise, none with Max Wait 0. URollySaveSubsystem::CaptureThumbnailHold gives the shot to its caller in an FRollySaveThumbnailHold instead of holding it, so each of several menus keeps its own until UseThumbnailHold holds it for that menu’s save; LoadThumbnailHold waits for the shot’s encoding without a time limit and decodes it on a worker. FRollySaveStorageWrites counts each save from its call to its store request as one of the store’s operations (URollySaveStore::BeginWork), so Flush waits for it; the save waits through FTSTicker at most Max Wait. A flush of the game’s store or FlushAll (FRollySaveStoreCore::OnFlushStarted, IsFlushing, both by store ID, 0 for all) ends the waits whose frame has not come and answers such waits at once while it runs, since no frame draws inside it; another store’s flush leaves them; an encoding still running posts its result to the mailbox the flush runs. The game instance’s end ends every wait. FRollySaveSlotThumbnails reads a slot’s newest copy’s header with the picture (ReadNewestHeader, nothing read when the copy is the one it holds), checks the picture’s format and size before any pixel decodes (Decode) on a worker, makes the texture on the game thread and keeps it in a least recently used cache by slot key, up to Cache Size, dropping a slot whose read finds no save or no picture.
Part saves (FRollySavePartSaver, RollySavePartSave::Merge): the scope’s parts are captured at the call (RollySaveScopes::IsInScope) with what the loaded game keeps of them, and so are the metadata’s values. The metadata’s profile key is read once the first player’s key is known (FRollySaveStorageWrites::ReadHeld with the key). The slot is then read through FRollySaveSlotHold::RunHeld: from that read until the merge queued its write, later requests of the slot wait, so the merge never writes older content over them. The slot’s save is read with ReadChecked, migrated when its Game Data Version is lower, and its records outside the scope are kept, counted in the file’s bounds and written with this build’s versions; a damaged or newer slot is refused. The loaded game stays as it is.
Part loads (FRollySaveLoadRequest::Scope): the load reads, checks and migrates the whole file, finds the parts it lacks (RollySaveScopes::FindMissingParts), preloads and applies only the scope’s chunks in place, and FRollySaveLoadedGame::TakePart replaces those chunks in the loaded game when CanTakePart allows it (records of the same versions); otherwise the result says PartNotKept. A part load without World applies the players’ records with ERollySaveActorLoad::Part, so the last whole load’s restored marks and waiting component records stay.
Moving saves (FRollySaveTransfers): a copy holds its target with an FRollySaveSlotHold::FToken from its check to its write, and a rename holds the source too, taking the lower file key first, so two renames that swap names never each hold one slot while waiting for the other; the source’s newest copy is written under the new name, and a rename deletes the source once the write succeeded. An export writes on a worker through a temporary file moved into place (RollySaveTransfer). An import reads at most Max Import Size bytes, runs RollySaveImport::Check (kind, versions, Game Data Version, every record’s structure, and the run rules, passed in as a function), then, inside the target’s hold, stores the file only when the target holds nothing.
Memory slots (FRollySaveMemorySlots): whole-game saves on a store over a memory backend of the game instance’s own, without a slot index. Written saves are listed by serial and the oldest of its kind goes past its bound; a delete records the serial counter, so a save that began before it drops its files. Rewind loads the point Steps back from memory and drops the newer ones.
Save blocks (FRollySaveGate): blocks by weak object and reason; saves the player asks for pass PassBlockGate. The subsystem binds a blocking actor’s End Play; the gate listens to garbage collection while an object that is no actor holds a block. When the last block goes, the waiting autosave and checkpoint run on the next tick.
Autosave (FRollySaveAutosave): the game instance’s one-shot timer (FTimerManager, which pause stops) and RequestAutosave lead to one decision: dropped when autosave is off, the world is a client’s or excluded, or, for a request, Minimum Gap has not passed since the last save to storage; waiting during a load, seamless travel or a save block, until RunWaitingSaves runs it once FRollySaveCallChecks::CanRunWaitingSaves allows. The target is the run’s slot, the current slot under Current Slot, or the ring: the game is captured first (FRollySaveCapturer::Prepare), then ChooseRingSlot picks the slot after the highest autosave number, reading the headers the slot index lacks where the storage cannot list, and nothing is written when FRollySaveCapturer::HasLoadSince reports a load started since the capture (FRollySavePrepared::LoadsStarted). Every save to storage arms the timer again.
Checkpoints (FRollySaveCheckpoints): the whole game into storage (the checkpoint slot, the current slot or the run’s) and, outside a run, a retry copy into the memory slot checkpoint. It reads the save blocks itself: while one is on, the newest checkpoint waits for the last block to go.
Single-slot runs (FRollySavePlaythrough, FRollySaveRunSlots, RollySaveRuns): StartRun binds the run when its slot, inspected inside its hold, holds nothing; while bound, quick saves, autosaves and checkpoints go to the run’s slot and other targets are refused. A write into it stamps the next run number into the metadata; once written, the first local player’s ledger (URollySaveRunLedger) records it and the profile saves. Before anything of a load applies, CheckRunLoad refuses an ended run, a number outside 1 to 10^12 or one below the ledger’s; while the first player’s profile loads, loads and imports wait (FRollySaveProfiles::WhenFirstLoaded). EndRun of the active run unbinds it, clears the current slot and records the end at the call; then, through RunHeld, it loads the slot, records the end of a run it did not know, and deletes the slot or writes it back with run state Ended.
Profiles (FRollySaveProfiles): FRollySaveGameServices binds the local players’ arrivals (OnLocalPlayerAddedEvent, after their subsystems start) and departures; an arrival loads <prefix>_profile_<key>. The file must be a profile; it passes CheckGameDataVersion and ReadChecked, migrates, preloads, and its records apply by role (FRollySaveProfileObjects) to a new Profile Class instance, the local player, its subsystems and a new run ledger; records of other roles or of objects not there are kept. Where the storage keeps users apart, each other player gets a store on the backend URollySaveBackend::MakeUserBackend makes for it. Only Succeeded and Not Found make a profile usable; otherwise the file stays as it was, and saves are refused until a load succeeds or Reset Rolly Profile deletes both copies. The calls by player controller (LoadFor, SaveFor, ResetFor, FindFor) refuse a controller of no local player of the game instance; services read the first local player’s key through FRollySavePlaythrough::GetFirstProfileKey. With Profile Keys at Named, FRollySaveNamedProfileKeys resolves each player’s key before its profile loads, one player at a time in the order asked: the URollySaveProfileChoice record in the platform user’s own profile file (FRollySaveProfileChoices) names the profile; a player without one gets a new profile named after New Profile Name, or at Max Named Profiles what When Profiles Are Full says, and the choice is written back keeping what the file held (RollySaveProfileFiles), a damaged file replaced. FRollySaveProfileCatalog lists named profiles from the slot index by name, writes new ones under random keys, and claims a key from a Use Rolly Profile call or a resolution until the player’s entry holds it (claims are counted per player, so a Use call and that player’s resolution can hold one key together), so a second player’s Use, a joining player and a Delete never take it; FRollySaveProfiles::Switch and the resolution’s end refuse a key another entry holds. Use Rolly Profile switches a player’s entry to another key as a joining player’s load does, after FRollySaveProfileObjects::ResetPlayerObjects set the player’s and its subsystems’ SaveGame properties back to their class defaults; loads and preloads find their entry by the load’s number, never by key. Saves to storage and part saves made while the first player’s key is being found wait for it (FRollySaveProfiles::WhenFirstKeyKnown) outside a flush. A Use Rolly Profile call on a player whose key is being found ends the resolution: BeginSwitch gives the entry a new load number, which the resolver checks before each write (it deletes a profile it made for nobody and writes no choice), Switch runs the waiting saves with the new key, and a Use that fails resumes the resolution (EndSwitch).
New Game+ (FRollySaveNewGames::StartNewGamePlus): after every check, FRollySaveCapturer::CaptureCarry captures Carry’s parts with the loaded game’s kept records of them and a Session record whose map no world has, so the players take their values without their place, and AddNeverAreas adds the levels whose Never areas New Game+ keeps (Level tools, step 5). The file goes to the memory slots’ carry store; the loaded game, kept levels, current slot, run, checkpoint copy and rewind points are dropped; and the loader loads the file into the given map as a part load of the parts it holds. FRollySaveGameServices starts the next cycle once that load applied, so a map that does not open leaves the cycle as it was.
Migrating a save (FRollySaveMigrationRunner::Run), in a load after the records’ check and before the preload:
- The steps whose To Version is above the save’s Game Data Version and not above the project’s, sorted stably by To Version, then list order.
- Each step runs in its own Migrate call with a new serial and context;
URollySaveMigrationContext::FRunScopepoints the context at the save’sFRollySaveMigrationRunfor that call. The run owns the edit rules: find a live record, remove (flagged until the step ends, so handles keep their meaning; a handle of another serial is stale, StaleRecord), touch, add and fail. - Reads compare the saved tag’s type name with the property’s (
UE::FPropertyTypeName) and read through the save archive over a values-only apply table, where pointers to saved, owned or unloaded objects and texts of unloaded string tables read as empty: such a read fails with PointerNotRead, since writing the value back would lose them, and copies nothing. Writes encode one tag through the record’s own capture tables (FRollySaveCaptureTables::BeginEdit), so indexes stay; a write the archive stops orCheckRecordrefuses restores the record and fails the step. - After Migrate, a step fails on Fail Migration, a refused edit, a Blueprint script exception (
FBlueprintCoreDelegates::OnScriptException), or a changed or added record that fails the check by saved types (FRollySaveMigrationRun::CheckTouched), bag layouts counted across the changed records.
Level tools (Level/), on the server or in a standalone game; nothing ticks:
- A Rolly Save Trigger binds its shapes’ overlap events at Begin Play. An actor that appears inside while saved values are set (
URollySaveSubsystem::IsRestoring, counted byURollySaveSubsystem::FRestoreScope, whichRollySaveWorldApply’s applies open too), during seamless travel or in the frame it was spawned (FRollySaveTriggerWatch, which records spawns only while a trigger is registered) is recorded without triggering; with Trigger on Appear it is checked once the restore ended, the world’s Begin Play ended or on the next frame. - A trigger that passes its checks (Enabled, Trigger By, Players, Filter, Except, Triggers, Cooldown, Can Trigger Rolly Save) sets Triggered, fires On Triggered and runs its action (
FRollySaveTriggerActions); a failed save clears Triggered for Once and Once per Visit. - Reset Areas register with the world’s
FRollySaveLevelTools. AtOnWorldComponentsUpdated, before level memory or a load removes or applies anything,FRollySaveWorldEvents::BuildResetAreasreads the clocks once (FRollySaveAreaClocks) and takes the map’s area record out of the load’s or the remembered level’s chunk (RollySaveResetAreaRecord); on a return it first waits for the arrival’s preload.RollySaveResetStepthen drops from the chunk the records of every saved actor a due area resets, so the level builds it as designed. - Areas take their state as they register; On Area Reset fires after the world’s Begin Play. Leaving a level sets every area’s leave times, and a save or a leave captures the record (
URollySaveResetAreaState) into the map’s WRLD chunk, with snapshots of the areas on spawned actors. - New Game+ (
FRollySaveNewGames::AddNeverAreas,FRollySaveLevelMemory::CollectForNewGamePlus) carries the WRLD chunk of the current level when its tools hold an enabled Never area (FRollySaveLevelTools::HasNeverArea) and, with Remember Levels on, of each remembered level whose record lists one.RollySaveResetAreaRecord::MarkForNewGamePlusmarks the record (bKeepOnlyNeverAreas), so every other area starts as designed and the next build keeps only the records the Never areas decide for.
In the editor, each placed tool class makes an editor-only sprite and label (RollySaveToolLook), the sprite’s transient texture coming through RollySaveToolSprites::Find, so a map saves no reference to it. The details customizations act for the actor or for the component the panel was opened on (IDetailLayoutBuilder::GetSelectedObjects), never both.
The old-save check (RollySaveOldSaveCheck::Check, editor builds only, since it blocks while it preloads) runs a load’s steps on a stored file without a world: CheckVersions, CheckRecords, the steps, the saved map, a preload that waits, then per record its class (MissingClass) and the structure check against the class’s default object, with findings (FRollySaveCheckFindings). The editor module’s RollySaveOldSaveCases reads each case through URollySaveFolderBackend. FRollySaveBuildCheck runs the same steps (FRollySaveOldSaveSteps) without blocking: the preload asynchronously, then each record against its class in slices of an FRollySaveSlicedJob, with the blocking check’s report.
Inspecting and editing a save (Inspect/): URollySaveStore::LoadCopy reads one copy through the file’s queue, writing nothing, and FRollySaveFile::Diagnose reports every checksum of its bytes. FRollySaveInspectFile::Make splits a file into chunks and records on a worker; RollySaveValueCodec::Decode runs a record’s structure check by saved types, then reads PROP, PATH and INLN into values as the walker read them (RollySaveSavedTypes), ACTR and COMP into their fields, and keeps everything else as bytes; each top-level value and each section is encoded again into a matcher that compares in place, so a decoded record always encodes to its own bytes, and a value that would not is kept as bytes and counted in Fallbacks. FRollySaveRecordDecode does it in steps: the structure check one top-level tag per step (RollySaveStructureCheck::FSavedTypesSteps over FRollySaveValueWalker::BeginObject and CheckNextTag, 1,024 elements of a large top-level array, set or map per step), then a top-level value per step (512 elements or entries of a large top-level container per step, each compared with its bytes as it is read), and each copy of more than 64 KiB (packed elements, bytes kept as saved) made 1 MiB per step through FRollySaveByteFills, whose sources the matcher accepts without reading them again. FRollySaveStagedEdits stages each change on a copy of its state and refuses it (ERollySaveEditRefusal) before it changes anything; each change names its value by FRollySaveValueIds, so a revert replays the others on their own values. Values are written only when FRollySaveInspectFile::HasRunningValueVersions holds: the package version and every custom version the file records are this build’s, and it records the text and record versions the value forms read; an archive answers a version it lacks as -1, but a version only this build registers belongs to no type the file’s values can hold. Build encodes the changed records into their own tables, appending what they lack, refuses one whose ACTR or COMP fields a section would leave out (RollySaveActorSections::FindLeftOut), checks every record of the file as a load does under one budget, writes the title and Game Data Version, marks the file edited (EDIT) and holds it to the format’s limits. The caller writes it with URollySaveStore::Save and the opened sequence number, so a save made meanwhile ends it with Changed. RollySaveFileDiff::Compare matches header fields, chunks, records and values by key through maps, compares matched records’ bytes 1 MiB per step and decodes only records whose bytes differ; a large top-level container compares 256 elements or entries per step, and chunks that hold no records compare, then when they differ are checksummed, 1 MiB per step; a packed container’s differences become runs, 1,000 per container and 128 per step at most, the rest counted, and a record’s entries stop at its value limit with one entry counting the rest.
The Save Inspector (Inspector/ of the editor module): the model reads every source through RollySaveInspectTransfers on a store of its own whose index upkeep is off, so opening a slot writes nothing; a slot’s two copies are read with URollySaveStore::LoadCopy and diagnosed, and the copy a load would take is shown. Rows are made from the model on demand, values a page of 1,000 at a time. Staged changes live in an FRollySaveStagedEdits per open source; a write passes the sequence number the slot had when it was opened, so a save made meanwhile ends it with Changed. The record checks, Check Against This Build, comparisons and exports run as FRollySaveSlicedJobs within the Editor Preferences’ Time per Frame, and a job of a source shown before reports nothing. A comparison reads the right file once and builds a RollySaveFileDiff whose entries carry both value paths, which Use Right Value and Use Right Record stage through SetValueFrom and UseRecord. The running game’s source is the loaded game the play world’s subsystem holds, copied by an FRollySaveDebugSnapshotBuild in a sliced job and moved into the source’s file, read-only; Refresh and Follow Saves take it the same way. Each copy and file is diagnosed once per open, on the opener’s worker beside its split into records, and the side panel’s sizes come from the prelude; the copy marked Loads is the one URollySaveStore::FindLoadedCopy names; texts that read the model are made again only when it broadcasts a change (RollySaveInspectorWidgets::MakeModelText), and the export dialog checks its file name when it changes. A change staged while a write runs is refused with Writing.
The Gameplay Debugger category (Debug/): while the category is on, the server collects the game’s snapshot and the debug actor’s every half second, and the debugger replicates the lines to the client; RollySaveDebugLines turns a snapshot into lines, so the category and the tests draw the same text; the Save Inspector’s Running Game section lists the snapshot’s own fields. FRollySaveDebugRecorder keeps the debug actor’s record facts with the loaded game’s stamp, so a record is decoded again only after a change. The instance, destruction and PCG lines (RollySaveDebugParts) count each tracked component with the capture’s own code in a mode that changes nothing, so they show what a save would write; the world’s lines read every live tracker, work linear in the tracked instances, twice a second only while the category shows.
Saves as JSON (Json/): RollySaveJson::Write writes the header, every chunk and every record, each value readable when FRollySaveJsonValueWriter::IsExact holds and HasRunningValueVersions holds for the file, otherwise its bytes in Base64, streamed in UTF-8 to an archive in blocks. RollySaveJson::Read takes the engine’s token reader one token at a time through FRollySaveJsonCursor, which counts nesting, keys and bytes as each token arrives; FRollySaveJsonRecordReader charges each value, table entry and byte array against what is left of the decoded save’s limit before making it, and encodes each record as its JSON closes, names found in its table by how they show; keys compare case-sensitively through RollySaveJsonReading::IsKey. FRollySaveJsonTransfers reads a slot in its request order, splits it on a worker, decodes and renders one record at a time in slices on the game thread, keeping only the rendered text (RollySaveJsonRender), writes the file on a worker through a temporary file, and for an import reads the file within Max JSON Import Size on a worker, writes and reads the file it holds, then hands it to the import’s checks (FRollySaveTransfers::StoreImported) marked as edited by a JSON import.
Importing an engine save (FRollySaveEngineImports, FRollySaveEngineSlotImport, whose header gives the order): the platform save system’s calls run on the platform backend’s queue; RollySaveEngineSlotHeader::Parse reads the header within bounds; the saved class is checked against the expected one before anything loads or is created, and a Blueprint class the asset registry knows as its child (GetAncestorClassNames) loads asynchronously. The properties are read through FRollySaveEngineSlotArchive once to find the assets they name, which are preloaded, and again into a new save game; what is still missing reads as empty, listed in Issues.
A load reports its start (On Load Started) and its phases (On Load Progress): Reading at its start, Migrating before the steps, Loading Assets at 0, after each preloaded package and at 1, Opening Map before the travel and Setting Values before the apply; each report checks that the load still runs after the game’s code ran. A load Cancel stops raises On Load Cancelled instead of On Load Finished, and the services run what waited for it as after a finished load: the autosaves due meanwhile and the triggers’ end of restore.
The Blueprint nodes (Nodes/): the game instance holds each node until its result, which arrives on a later tick through a weak pointer and fires Success or Failure by its Status; Activate starts the subsystem’s call with the node’s display name for setup messages. A node without a game instance fails with Invalid Input on the next tick. Load nodes cancel by the load’s number, so a refused node never stops another load.
The quick keys (FRollySaveQuickKeys) bind the game viewport’s OnInputKey once the viewport exists (UGameViewportClient::OnViewportCreated), read Project Settings at each press and call Quick Save or Quick Load; the gates refuse a client.
Capturing an object (FRollySaveRecordWriter::Capture, whose header gives what saves and how each reference is written): the subject’s OnRollySavePreSave runs (RollySaveHooks), a class a Blueprint compile or Live Coding replaced is refused, and the save archive (FRollySaveArchive: save-game, without deltas, persistent and filtering editor-only data, so the editor writes what a packaged game does) serializes it, through SerializeScriptProperties for actors and scene components and Serialize for other objects. Names, imports and references go into the record’s tables (FRollySaveCaptureTables), names by display index, so names that differ in case stay apart; each object the subject owns gets one INLN entry, written after its outers’ with its own OnRollySavePreSave. The bytes become PROP and INLN, and the record passes the structure check a load runs, in the budget the caller gives every capture of the file; a refused record leaves the budget as it was.
Applying records (FRollySaveApplySession, or FRollySaveRecordReader::Apply one at a time; the session’s header gives the passes and their rules): RollySaveRecordCodec::CheckFile decides once per file whether its versions hold records. Prepare runs the structure check (RollySaveStructureCheck): the tables, INLN and the subject’s bytes walked against the target class as the engine reads them (FRollySaveValueWalker), with what property bags, instanced structs and texts (FRollySaveTextWalker) would allocate counted against the file’s bounds before anything is created; a failing record damages the file, and nothing of it applies. Apply reads PROP through the save archive with the file’s versions. Imports resolve after Core Redirects (RollySaveRecordRules::RedirectImport) among loaded objects only; owned objects are recreated when a property first refers to them, their classes checked first; the archive’s guards stop at a text nested more than 32 levels, a value nested more than 64 and a seek outside the bytes. Once every record applied, OnRollySaveLoaded runs on each record’s owned objects, innermost first, then on its target.
Preloading (FRollySavePreloader, whose header gives the asset registry’s checks): each hard import, at its path after Core Redirects, loads asynchronously through the preloader’s own FStreamableManager, held until Release, within FRollySavePreloadLimits (16,384 packages, 1 GiB on disk). The callback runs on the tick after the loads ended.
Records in bytes (RollySaveRecordCodec): a chunk payload is a record count, then each record’s size and bytes; a record is its kind, subject, class import, name, import and reference tables and sections. The decoder accepts only what the encoder writes, so a decoded payload encodes to the same bytes; record kinds and sections it does not know are kept whole.
Storing (URollySaveBackend): only FRollySaveFileName names reach a backend (ForSlot, ForProfile, ForIndex or parsed), so files of other names are never touched. Write, Read, Exists, Delete and List wrap the callback, pass on only the statuses the operation promises, run the callback once and count the operation for WaitUntilIdle, and call the subclass’s Start function. URollySaveGameSystemBackend runs the platform’s blocking calls one after another on one task queue (RollySaveGameSystemPipe) off the game thread; on iOS every write is read back and compared.
Keeping two copies (URollySaveStore, whose header gives the copy rules): each file has one queue (FRollySaveSlot) per storage ID for the whole process. A save is encoded on a worker as soon as it is asked for; at its turn it reads and verifies both copies when this session has not, and writes to the copy that does not hold the newest valid save; until the backend reports, that copy counts as damaged. A load verifies both copies on a worker (FRollySaveFile::Verify) and decodes the newest valid one, falling back to the other. Backend reports only post steps to the mailbox (FRollySaveMailbox), which the core ticker runs on the game thread each frame and Flush runs while it waits. A save, load or delete tells the slot index of its prefix (FRollySaveIndex::Record), which writes its own pair through the same queue. The module flushes every store when the game goes to the background (3 seconds at most) and before the engine exits (10 seconds for the stores, later saves and the platform’s save system together).
A load holds both copies’ bytes and the decoded chunks of the copy that loads, so twice the file size plus the decoded size: a 4 MiB save that decodes to 10 MiB needs about 18 MiB while it loads, which matters on mobile. A save holds the decoded file until its worker has encoded it, then only the encoded bytes.
Leaving the game (FRollySaveLifecycleDispatcher, Platform/): the module binds the engine’s background, foreground, world teardown, login and window focus events once per process, so their reverse call order cannot flush before a capture. At each, the dispatcher tells every registered game instance (FRollySaveLifecycleSaves), which, where a game is in play (FRollySaveGameInPlay: from a whole-game load or save in the map, in the map opened after a new game, through seamless travel; the game’s own change to another map ends it), captures in that frame and queues an autosave, then runs one URollySaveStore::FlushAll within Background Time Limit or Quit Time Limit: the platform stops ticking the engine after a background event, and an exit resets the core ticker, so the writes are driven through the store’s mailbox inside the event. The game thread waits here, bounded by those limits, since no frame follows that it could spoil. A quit saves at the teardown of the game world while the engine exits, before the game instance removes its local players, whose profiles hold the run ledger. A store flush also ends every platform preparation (URollySaveGameSystemBackend::PrepareStorage), whose answer would come on a later tick. Each user index has a sign-in generation (RollySaveUserGenerations), advanced at its sign-out; a game system backend is bound to one generation, checks it on the storage queue before each platform call, and puts it in its storage ID, so an operation queued before a sign-out never runs on the next sign-in’s storage.
Extension points
| To change | Do this |
|---|---|
| Save the state of an object of your own | Flag its properties SaveGame, struct members included. For state outside properties, override Serialize and write it when Ar. is true; actors and scene components save their properties only |
| Change what one actor saves | Add a Rolly Save component (URollySaveComponent) and tick the overrides it should not take from Actor Defaults; C++ can set Overrides before the actor registers |
| Keep a placed actor’s state when it moves to another sublevel or is replaced | Give its Rolly Save component a Custom Save ID |
| Change what groups of actors save, or save engine properties such as a light’s intensity | A Save Rule (URollySaveRule) data asset; one actor opts out with its component’s Use Save Rules or Ignored Rules |
| Show why an actor saves what it saves | RollySaveRuleExplain::Explain with the actor, the rules and its map |
| Save state of each actor of a kind that is in no property | Attach a Save Handler in a rule’s or the component’s Handlers, its settings on the entry; GetTargetActor gives each instance its actor |
| Give a value saved by path back through a function of your plugin | Name the function in the Saved by Path entry’s Setter: one parameter of the property’s type, no return value, no network event |
| Let an actor set itself up before its saved values arrive | Apply Timing When Asked, then URollySaveSubsystem::ApplySavedValues once it is ready |
| Apply the Save Rules of a plugin mounted during play | The Reload Save Rules node, or URollySaveSubsystem::ReloadSaveRules |
| Keep a value saved by path whose property changed type | A migration step that reads it with ReadPathValue (Get Path Value) and writes it with WritePathValue (Set Path Value) |
| Give actors gameplay tags that rules match on, without the Gameplay Tag Asset Interface | Name their Gameplay Tag Container or Gameplay Tag variables in Project Settings > Plugins > Rolly Save > Gameplay Tag Variables |
| Read or build the save IDs of actors and components, such as in a tool that reads saves | RollySaveActorIds; RollySaveActorSections reads their ACTR and COMP fields |
| Run code of your object right before a save, once it is written or after a load | Declare OnRollySavePreSave, OnRollySaveSaved or OnRollySaveLoaded as a UFUNCTION without parameters or a return value, or as a Blueprint function of that name; no Rolly Save header is needed. In a Blueprint, implement URollySaveInterface or bind a Rolly Save component’s OnPreSave, OnSaved and OnLoaded |
| Reset levels the player left | URollySaveSubsystem::ForgetLevel and ForgetAllLevels; bRememberLevels off keeps none |
| Skip what a destruction does when a load removes an actor | Check URollySaveSubsystem::IsRemovedByLoad in Begin Play, End Play and Event Destroyed |
| Vet records without applying them, or against lower bounds | RollySaveRecordCheck::Check with FRollySaveCheckLimits; FRollySaveApplySession takes limits too, and URollySaveSubsystem::SetCheckLimits sets them for a game instance’s saves, no higher than the format’s own |
| Save records of your own that point at the game’s saved objects | Give URollySaveSubsystem::GetResolver to your FRollySaveRecordWriter and FRollySaveApplySession |
| Spawn a record’s object again, or check that a live object may take a record | RollySaveRecordClass::Resolve gives the record’s class after +ClassRedirects, among loaded classes; preload the record first |
| Save state of an object you cannot change, such as another plugin’s actor | A Blueprint or C++ subclass of URollySaveHandler with variables flagged SaveGame, set in Gather and used in Apply, listed in Project Settings > Plugins > Rolly Save > Global Handlers |
| Let a C++ handler write no record, keep its loaded one, or not make its actor save | Override CaptureState (Write, Nothing or Keep) and WouldWrite |
| Let a C++ handler wait until what it restores is there | Override CanApplyNow; call URollySaveWorldSubsystem::RetryPendingHandlers for its actor once it is |
| Let a C++ handler treat a load in place apart from an actor the load made | Read URollySaveHandler::IsInPlaceApply in Apply |
| Save values of your game’s effect context type | Subclass URollySaveGASHandler in C++ and override CaptureContextValues and ApplyContextValues |
| Save, load, delete, copy or list from Blueprint | The nodes of Nodes/; from C++ the subsystem’s calls of the same names, whose callbacks run on a later tick |
| Save an object that does not save on its own | Call Register Object for Saving (URollySaveSubsystem::RegisterObject) with a name unique in the game; a subsystem with SaveGame properties or a contract function needs nothing |
| Give the objects records point at save IDs | Register them in an FRollySaveNameRegistry, or implement IRollySaveObjectResolver, and give it to FRollySaveRecordWriter and to FRollySaveRecordReader or FRollySaveApplySession |
| Keep data of your own in a save file | Add a chunk whose ID starts with a lowercase letter, such as FRollySaveFourCC("mygm"), and list it in FRollySaveFileReadOptions::KnownChunks where you read it |
| Keep saves in another storage | Subclass URollySaveBackend and override StartWrite, StartRead, StartExists, StartDelete and StartList; each calls its callback once, from any thread, without the game thread |
| Test with a platform’s save system behaviour | Give URollySaveGameSystemBackend::SetSaveGameSystem your own ISaveGameSystem, and SetFreeSpaceQuery a free space of your choice |
| Let several backend objects share one queue per file | Return the same text from URollySaveBackend::GetStorageId |
| Use your backend for every store | Pick it in Project Settings > Plugins > Rolly Save > Storage Backend; stores without SetBackend make that class |
| Keep each platform user’s saves apart in your backend | Override KeepsUsersApart (true), MakeUserBackend (a backend per user), PrepareStorage (the user’s storage made ready once) and, where it can tell, StartQueryFreeSpace and GetFreeSpaceAfterWrites; report a write after the user’s sign-out as SignedOut |
| Answer the platform’s save-data questions from your own binding | Bind FGameDelegates::GetExtendedSaveGameInfoDelegate and call FRollySaveSaveInfo::Answer for Rolly Save’s files |
| Change saved data between versions of your game | Raise Game Data Version and add a step to the Migrations asset: a built-in step, a Blueprint of URollySaveMigrationStep, or a C++ subclass that overrides Migrate_Implementation (and ValidateFields for its fields’ Data Validation) |
| Check the saves of your released builds | Put them in Check Folder and run Rolly. or -run=RollySaveCheckSaves; from editor code of your own, give RollySaveOldSaveCheck::Check what a store loaded |
| Read a save of the engine’s Save Game to Slot | URollySaveSubsystem::ImportEngineSaveGame, or the Import Engine Save Game node |
| Give a save a picture of your own | URollySaveSubsystem::SetNextThumbnail with a render target or an FImageView, before the save |
| Show a slot’s picture in your own menu | URollySaveSubsystem::LoadSlotThumbnail, or the Load Rolly Slot Thumbnail node |
| Show that the game saves or loads | Bind OnSaveStarted, OnLoadStarted, OnLoadProgress, OnLoadFinished and OnLoadCancelled on the subsystem |
| Let players make and pick profiles by name | Profile Keys at Named, and the subsystem’s ListProfiles, CreateProfile, RenameProfile, DeleteProfile and UseProfile |
| Show fields of your own in slot lists | A struct with SaveGame members in Project Settings > Slot Fields Struct, filled with SetSlotGameFields; ListSlots gives it in FRollySaveSlotInfo::GameFields |
| Save or load part of the game | SavePart with an FRollySaveScope, and Load with an FRollySaveLoadRequest; put objects in a group with RegisterObject’s Group or a Save Handler’s Group |
| Keep snapshots for the session | SaveToMemory, SaveRewindPoint, Rewind, and Load with bFromMemory |
| Refuse saves for a while | AddSaveBlock and RemoveSaveBlock |
| Keep data of each local player outside a playthrough | A Blueprint or C++ subclass of URollySaveProfile with SaveGame variables, named in Project Settings > Profile Class; a local player subsystem’s SaveGame properties save with the profile too |
| Move saves through storage of your own, such as a cloud | ExportToBytes and ImportFromBytes |
| Save from your own interaction system | URollySaveTriggerComponent::Trigger with the user, on the server |
| Let an actor refuse a trigger, such as while enemies are near | Implement IRollySaveTriggerInterface::CanTriggerRollySave on the trigger’s actor |
| Open your own menu from a save point | Turn Show Slot Screen off, bind URollySaveSubsystem::OnSlotScreenRequested or the trigger’s OnSlotScreenRequested, and call URollySaveSubsystem::MarkSlotScreenRequestHandled in that listener |
| Open the slot screen or the profiles panel from your menus | Open Rolly Slot Screen and Open Rolly Profiles, or URollySaveUISubsystem::OpenSlotScreen and OpenProfiles |
| Start your game’s new game from the slot screen | Bind URollySaveUISubsystem::OnNewGameChosen, or set New Game Map |
| Change the slot screen’s layout, a row, the profiles panel, the saving indicator or the loading overlay | A Blueprint subclass of the class, its widgets named like the parts, named in Project Settings > Rolly Save Screens > Classes |
| Build a slot screen of your own on Rolly Save’s rules | FRollySaveSlotScreenModel with the saves ListSlots gives, or FRollySaveSlotFlows with an IRollySaveSlotSource of your own |
| Key profiles by account | Profile Keys at Provider and a Blueprint or C++ subclass of URollySavePlayerIdProvider overriding Get Profile Key |
| Protect runs while players switch profiles, or on a dedicated server | Run Ledger at Shared |
| Reset areas after time of your game’s calendar | A Blueprint or C++ subclass of URollySaveGameClock, named in Project Settings > Game Clock Class |
Save the instanced output of a generator of your own, as RollySavePCG does for PCG |
Implement IRollySaveInstanceSource and register it with RollySaveInstanceSources::Register; tell Rolly Save of each generation with NoteGenerationStarting, NoteGenerated and NoteCleaned, and of a load’s decision without one with NoteGenerationSkipped. Its records take PCG’s paths, @PCG, @PCGOutput and @PCGCell: |
| Reset a place at once | URollySaveResetAreaComponent::MarkForReset or URollySaveSubsystem::MarkAllAreasForReset, then a memory slot saved and loaded with Open Saved Map |
Tests
Named Rolly.Save.<Area>.<Case>, all headless. No name extends another test’s name after a dot: the automation tree would make the shorter one a group, which never runs, and TestNames fails then. Golden tests read fixture files that every later version must keep loading, from the project’s TestData/RollySaveFixtures folder; in a project without that folder they have no cases.
File.*: round trips at every compression, damage at every byte, every truncated length, unknown and newer data, limits and invalid input.Forged,WriteBackandMutations(4,000 seeded edits) recompute the checksums after their edits, so the parsers behind them see forged sizes, strings and fields;Goldenreads the fixture files.Record.*: the codec’s round trips, truncations and forged counts, strings, imports and sections;Goldenapplies the manifest’s records to new objects and captures their content into the same bytes.Rename.*applies records written before a rename (properties, struct members, enum values, struct types, Blueprint variables and struct members, gameplay tags, classes, moved assets) with and without redirects.Archive.*: each saved type, the archive’s flags and versions, references and pointer kinds, soft paths, names that differ in case, replaced classes, owned objects (Inline,InlineClassChecks,InlineForgedChain), preloads (Preload,PreloadClassCheck,PreloadHoldsLoaded),NoSyncLoad,GCDuringApply,PropertyBag,IssueCap, the archive’s guards andCaptureCost.Check.*: a test per bound of the structure check,WholeFile(a file refused for one record),CaptureRefuses(a capture refuses what a load would) andMutations(3,000 records edited at seeded bytes, each refused before anything applies or applied without stopping).Contract.*: the two functions’ forms, order and threads, Blueprint hooks, andForeignProduct, which needs the stand-in productTools/Fixtures/RollyStandIninstalled beside Rolly Save and otherwise only says so.Api.*: the subsystem in a standalone game made without Play In Editor (FTestGame): globals, authority, the file budget, captures refused, registration, and loads whose travelFRollySaveLoadTestingreplaces and whose next world is made asUEngine::LoadMapmakes it (LoadGlobals,InPlace,LoadRefused,LoadCancel,Carried,KeptBudget,ClassRedirect,SameFrame,LoadRequest).Actors.*: actors placed as a map load places them, in loads that open the map again: IDs and their guards, Custom Save IDs, spawned and destroyed actors, respawn and create guards,DamagedSecondPass, attachments, child actors, late components, owners, control rotations,RemovedByLoadQuery, replication, andGoldenover the golden actors fixtures.Rules.*,Paths.*,Timing.*,AttachedHandlers.*: matching, class entries, precedence, discovery, explain and reload of Save Rules made in memory; values saved by path, their setters, guards, members and redirects; After Begin Play and When Asked; attached handlers, their IDs, renames and index.Events.*,Players.*,Levels.*: the order of every call; local players logged in as the engine logs them in (a Game Mode Base, a match-based Game Mode, vehicles, another map, chunk guards); travel between test maps asUEngine::LoadMapand seamless travel do, with forgetting, restarts and carried actors.Async.*,QuickKeys,Handler.*,Cook.Rules,Commands.*: each node’s pins and statuses,Cancel,CallerGone,GameInstanceShutdown,NoGameInstance,ThenBeforeResultandNames; the quick keys on a game viewport; Save Handlers whose graphs are built as the editor builds them; the cook hook; the console commands (ListandDumpwrite nothing).Thumbnails.*: pictures from a test’s frames (FRollySaveLoadTesting::SetTestPictures, frames drawn at once or when the test draws one, each read counted) and, withrhi, from a game viewport’s frame (Real); the wait, reads per frame, late frames, flushes, the kinds, a client and a dedicated server, split screen regions, the cache and every bound of the codec and the settings; the pictures menus hold (HoldNewSlots,HoldRelease,HoldNodes,HoldFailures: a client’s and a dedicated server’s empty holds, a frame that never came, a map change, player 2’s region).Slots.*,Scopes.*,Memory.*,Gate.*,Autosave.*,Checkpoints.*,Runs.*,Profiles.*,NewGamePlus.*,Transfer.*: slot metadata, titles, new slots, the current slot, its guards, play time andGolden; titles that wait (PendingTitle,NextTitle); named profiles (Named,NamedGuards,NamedRaceswith two players at once,NamedChoicesover forged and damaged choice files,NamedBounds,SwitchResets); part saves and loads, theirOverlapwith other requests of the slot and the game instance’s end (Shutdown); memory slots and rewind; save blocks; autosave, checkpoints, runs (Import,LedgerLoading,EndOverlap,EndShutdown), profiles (PerUser,FileGuards), New Game+ (KeepNeverand its variants) and moving saves (Overlap,Shutdown, export listings, imports of Max Import Size and one byte more); each guard is fed its bound and one past it.Hold.*,Spread.*,Groups.*,DataLayers.*: holds over a test answer for the ground (FRollySaveHoldTesting::FGroundScope) and over the world’s own trace with a floor streamed in or spawned, stopping a character, a Floating Pawn Movement and a simulating root, following a possession and a seamless travel, a match-based Game Mode’s late pawn, with a client’s levels answered by the test (FClientLevelsScope), since a connection needs a server’s net driver; spread captures and applies on a test clock (FClockScope), with a Save Block, Max Save Frames, a load, a travel, a pre-save function’s load and the game’s end, and saves, autosaves and travel during spread values; groups through whole and part saves and loads, a listen server’s part load, level memory, the reset step, streaming, New Game+, a child actor, a later build’s change and the segment key’s guards; data layers through the engine’s Data Layer manager on its World Partition test map/Engine/WorldPartition/UnitTests/FourCubesopened as an editor world, where every layer starts Unloaded, since only a game world starts them in their start states, and through real saves, loads and travel with that manager given to the test’s game world (FRollySaveLoadTesting::FDataLayerManagerScope).Streaming.Scale.RoundTripstreams, saves and loads 2,000 actors in 50 levels.Storage.*,Store.*,Index.*,Settings.*: the key rule against a separate XXH3 implementation, each backend’s statuses,GenericFileson real files inSaved/SaveGamesbeside other files that stay byte for byte as they were; the store on a fault-injecting backend (copies, damage, killed writes, queue order, results from worker threads, flush limits) andStore.Fixtures; the slot index with and without listing; each setting’s fallback and setup error.LevelTools.*: triggers and Reset Areas with walkers moved as walking moves them and volumes given brushes as the editor gives them: checkpoints, appearing actors, who triggers, modes,Triggers.RestoreScope,Triggers.SpawnTracking, resets on a return, seamless travel, game time and loads, the guards of the area record, snapshots, clocks, the grid and saved entries, and that garbage collection frees a world once it ended.Migration.*,OldSaveCheck.*,Commandlet.ExitCodes,Import.*,Globals.Golden: step order, exact types, pointers and string table texts not read, bounds, built-in and Blueprint steps, Data Validation, andChainover the chain’s fixture files at Game Data Versions 1 to 3; the old-save check and commandlet over folders of saves written for one test; engine save imports from a fake platform save system,Fixturesamong them; the golden globals fixture.Editor.Checks.*: each check over the editor’s map with level tools placed as the editor places them, or over World Partition data made from placed actors; severity rows, ignore rules and the validator’s use cases; the Message Log’s order, tokens and fixes; the checks after a save of maps and rules saved to disk under a mount point of the test; the commandlet’s exit codes and lines; the config writer on a scratch file;Checks.Streaming,StreamingIds,StreamingFacts,StreamingScopeandStreamingHidden: Reset Area in a Streamed Level and the IDs of level instances, from facts and from sublevels on disk, unloaded or loaded hidden.StartSlot.*: the command line, withFRollySaveLoadTesting::FStartSlotScope.Editor.Outliner.*,Editor.Markers.*,Editor.Setup.*,Editor.PlayFromSlot.*,Editor.UserSettings: the column’s states, sorting, filters and updates, the marker picker over a fake screen and the marked actors of the editor’s map, the setup model and its rows (Setup.Rows) over a scratch config file, the slot list over files in memory and the load at Play In Editor start in a test game;PicturesSetupwithrhi.Inspect.*,Json.*,Debugger.*: the value codec’s exactness over every saved type, packed arrays, edits and their refusals, field edits, reverts, the record checks in slices, the build check and diffs; JSON round trips, the golden exports, every guard at its bound and one past, compact output, exports streamed and ended by the game’s end, imports and their messages; the category’s lines and the game’s snapshot, held players included (Debugger.Holds), and the lines of instances, broken collections and PCG components on a server and a client (Debugger.Instances,Debugger.Destruction,Debugger.PCG).Editor.Inspector.*: the inspector’s model and views over files in memory:Registration(the tab and menus),Sources(slots, profiles, the index, Open by Name, files, copies, Recent Files),Contents,Values(pages of 1,000 and one more),EditsandReadOnly,Compare(Use Right Value and Use Right Record),Locator,JsonDialogs,RunningGame,StreamedLocator,StreamedNotLoadedandStreamedLocatorPlay(sublevels and level instances in the editor’s and a game’s world),StreamedRows,RunningGameStreamedandRunningGameGone(real streaming: kept levels, loot that waits for its level or owner, loot destroyed in play);PicturesInspectorwithrhi.UI.*: the screens in a test game whose players’ screens draw in virtual windows, driven by a virtual Slate user, mouse and touch, with save times worded against a fixed clock: the model’s rows, groups, order and actions, every flow, the list’s states, requests, clients, keys and narration, the layouts’ sizes, split screen, the indicator’s timeline over the tween runner (Indicator.States) and its one Saved line (Indicator.SavedOnce), notices, the overlay through a test travel (Overlay.LoadProgress) and a seamless one (Overlay.SeamlessTravel), its wait for the world (Overlay.WaitForWorld,Overlay.WaitEnds), the held players’ plates (IndicatorHeld.States,SplitScreen,Settings,SeamlessTravel,ControllerGone,PlayerRemoved,UnderScreens), answers that wait for another player’s save and say when a save changed (Flows.Changed.Waits), the profiles panel, the setup rows, the settings’ bounds, andPictures, drawn withrhi.Lifecycle.<Kind>.<Path>: the shared harness (Tests/Lifecycle/): each kind (Actors,Instances,Destruction,PCG,TestHandler,PhysicsSleep,LevelInstanceState,DynamicLevels,MaterialParameters,Timelines,LevelSequence,Montages,Audio,Blackboard,StateTree,ParameterCollections,ParameterCollectionsUnlisted,GAS) registers its places, Make, Change, Describe and its rules’ expectations, and runs the 14 paths of a level, a load or a travel (map load, Keep Current Map, hard and seamless travel, streamed back as new objects, shown again, reused, part load, respawn, construction pass, Begin Play, Reset Area, the designer’s change, listen server), compared with what Make and Change left; it checks the project’s settings at its start and prints its fakes and the paths a kind skips with the reason. Its sublevel ticks, as a streamed level does. After the sublevel leaves it lets the world’s streaming run, as a game’s next frames do, so the levels of its level instances leave too;FTestGameclears the editor’s standalone flag of the worlds its streaming loads, as Play In Editor does, and collects garbage when a world that streamed levels ends, as a map change does.HandlerTiming.*: Apply Timing in streamed levels and Play In Editor, capture decisions, waiting records, timing and Global Handler refusals, collection and unloading, shown-again copies, carried instances, the load paths and reloaded rules, on the test handler.PhysicsSleep.*,LevelInstanceState.*,DynamicLevels.*: sleep, level instance state and run-time levels on their paths, with their guards and messages; the spikesPhysicsSleep.Spike,LevelInstanceState.Spike,Sequences.SpikeandMontages.Spike.Blackboard.*,StateTree.*,AI.*: the AI handlers on test pawns, controllers and trees made in memory, the spikeStateTree.ForceTransition, the AI waits and their counters, E13 to E16 at their bounds and one past (AI.Guards, one case per guard group), each AI message with its fill-ins (AI.Messages) and the AI records through JSON (AI.Json);FTestGamegives its worlds their AI system asUEngine::LoadMapdoes.Materials.*,Timelines.*,Sequences.*,Montages.*,Audio.*: the built-in handlers on their paths, the audio ones on the named audio fake (FRollySaveLoadTesting::FAudioFakeScope) apart fromAudio.NoDevice, the real path underrolly test, andAudio.Device, which needsrolly test ... audio;EngineState.GuardsandEngineState.Messages: E1 to E9 and E19 to E21 at their bounds and one past, and each message with its fill-ins;HandlerTiming.*runs its cases on a built-in too.Destruction.*,HLOD.*: geometry collections made in memory (RollySaveDestructionTests: a bridge of 19 pieces, broken, reshaped and read on the physics thread) through every way a level comes back, each guard of the GCOL section at its bound and one past, and Hide Destroyed in HLOD on HLOD actors given destructible components as an HLOD build gives them, read through the replicated state; worlds call themselves listen servers by their URL while those HLODs begin play.Destruction.ListenServerandHLOD.ListenServerplay a listen server and a client in Play In Editor (RollySaveNetworkTests::FPlaySession, on a new editor map), andHLOD.Standaloneneedsrhi.Editor.*: the editor over a fixture made in memory (RollySaveEditorTests::FFixture): the Content Browser entry, the rule editor, Pick Properties, SaveGame flags, Effective Settings with the Takes line (Precedence.Instances), the level tools’ labels, details, sprites, Place Actors and class icons, the Handlers menu and the handlers’ setup checks and texts (Handlers.*), andPictures,PicturesLevelTools,PicturesSetupandPicturesInspector, drawn withrhi.HandlerTiming.*,Materials.*,Timelines.*,Sequences.*,Montages.*,Audio.*,PhysicsSleep.*,LevelInstanceState.*,DynamicLevels.*,Blackboard.*,StateTree.*,ParameterCollections.*,EngineState.*,AI.*: engine state and AI over actors, test pawns and controllers made in memory in a test game whose worlds get their AI system as a map’s do; the four engine spikes (PhysicsSleep.Spike,LevelInstanceState.Spike,Sequences.Spike,Montages.Spike) andStateTree.ForceTransition; audio on the named fake (FRollySaveLoadTesting::FAudioFakeScope), withAudio.Deviceon the machine’s audio device underrolly test <filter> audio; each guard at its bound and one past (EngineState.Guards,AI.Guards,ParameterCollections.Guards).GAS.*: Ability System Components on test actors, Player States and bots whose AI controllers hold them, with attribute sets, effects and abilities made in C++ (Tests/GAS/); the six engine spikes first (TimerSpike,PeriodicSpike,StreamedSpike,TagSpike,ClampSpike,PlayerStateSpike); the test tags exist only in the host project; each guard at its bound and one past (GAS.Guards); the client’s view on a listen server (GAS.ListenServer); the fixturev1_gas_state.savinActors.Golden.