Rolly Docs

Inspect, compare and edit saves

The Save Inspector shows what a save holds, which copy a load takes and why a copy is damaged, compares two saves, changes values and writes them back as a new save, and finds the actor a record belongs to.

Sheet
14 of 64
Rev
1.0.0
Updated
On this sheet
Figure 1. Slot 1 in the Save Inspector: copy B loads and copy A is the backup; the chunk GLOB with its records by size; the chest's values with Inventory open; the side panel's File fields.

Open a slot, profile or file

Open the tab from Tools > Debug > Rolly Save Inspector or Tools > Rolly Save > Save Inspector. Inspect {Slot} in the menu of the save icon right of Play (tooltip “Play from a Rolly Save slot”) opens the start slot.

The source picker lists:

  • Slots of the project’s File Prefix, as the slot index lists them. A slot saved with a higher Game Data Version than the project’s opens read-only.
  • Profiles, by name and key.
  • Slot Index, the file that lists the slots and profiles.
  • Recent Files, the last 8 files opened; a file that is gone shows “(missing)”.
  • Open by Name, a slot or profile by its name. It reads both copies directly, so it finds a save the slot index lacks after a crash.

Open File… opens an export (.rollysave by default), a copy from the save folder (.sav) or Rolly Save JSON (.json). A file that starts with Rolly Save’s magic opens as a save; any other file opens as JSON. Files larger than Max Import Size or Max JSON Import Size (Project Settings > Plugins > Rolly Save > Sharing Saves) are not read.

Opening, checking, comparing and exporting write nothing: no copy and no slot index entry changes. Storage reads run on workers, and checks and comparisons run in slices of the editor’s frame, so the editor keeps drawing. Time per Frame in Editor Preferences > Plugins > Rolly Save > Save Inspector sets how long a slice takes, in milliseconds.

Read what a save holds

  • Contents lists the file’s chunks with their records: subject, class, size and share. A chunk’s share is of the file, a record’s of the decoded save. A lock marks data kept byte for byte for the newer version that wrote it, a red mark a record that fails Rolly Save’s check, a pencil a record with staged changes. Sort by file order, size or name; the search matches subjects, classes and chunk keys, not values. Edited keeps only the records with changes; Problems keeps the records that fail Rolly Save’s check and the records of a kind this version does not read. A component or owned object is named by its owner, such as /Game/Maps/Tavern:BP_Chest_1 › Lid, and a Save Handler attached to an actor by the actor and the handler, such as /Game/Maps/Tavern:BP_Lamp_3 › Material Parameters.
  • Values shows the selected record’s values grouped by section: Properties, Saved by Path, Actor, Component, Instances, Destruction, PCG Output, Owned Objects and Other Sections. Instances, Destruction and PCG Output list the removed, changed and added instances and the broken pieces; they cannot change (Harvest and instances, Destruction, Procedural content). Each value shows its saved type, such as Array of Vector; the full type is in its tooltip. Containers of more than 1,000 elements show pages of 1,000. A value that cannot change shows a lock, and its tooltip says why and what to do instead. A property bag, such as a StateTree’s parameters, shows as “{N} values” of type Property Bag with its values below it, which are read-only here: export the save as JSON, change the value there and import it, or change it in your game and save again.
  • File in the side panel holds the header: title, Game Data Version, save time, the Rolly Save version and platform that wrote it, engine and custom versions (the list opens by itself when one differs from this build, and those come first), the edit mark, “Captured over {N} frames” for a save Spreading Work captured over several frames, the thumbnail and the sizes of each part.
  • A spawned actor’s Actor group shows its Streamed Level: the level it respawns into, or World Partition cell for the cell at its saved place. An actor’s Actor group also shows Physics Sleep, Asleep or Awake, and for a level instance Level Instance, Loaded or Unloaded with the level it showed, under it › Asset, that level, and › Design, the level it had when the level holding it was built. None of these rows can change.

Keys: F2 or Enter edits the selected value, Delete stages its removal, Ctrl+C copies its text, Ctrl+F searches Contents.

See which copy loads and check a damaged save

A slot and a profile have two copies. The cards at the top show each copy’s state (Valid, Damaged, Newer, Missing or Unreadable), its role (Loads, or Backup beside the copy that loads), sequence, size and save time. The copy a load takes opens first; click the other card to see it. When neither copy reads, the copy that exists is shown with what is wrong with it, the main area says why, and the side panel stays so you can diagnose it.

Checks in the side panel:

  • Diagnose Copy A and Diagnose Copy B compare every checksum the copy records with the one its bytes give: prelude, header, file, directory and each chunk. A Mismatch row names the damaged part; a damaged chunk also fails the file’s checksum.
  • Records checks every record by its saved types, as a load does before anything applies, and lists each record that fails with the reason.
  • Check Against This Build runs your migrations on a copy and checks each record against its class, as the RollySaveCheckSaves commandlet does. It loads the classes and assets the records name, so it runs only when you press it.

Compare two saves

Turn on Compare and pick the save in Right: a slot, a file, or copy A or B of the open slot. Compare Copies on the cards puts the backup left and the newest right, so Added means the last save added it.

Figure 2. Compare Copies on Slot 1: Gold changed from 120 to 250, the Apple record removed and the crate added by the last save, with the summary and Previous Change and Next Change above.

The tree merges both saves: header fields, chunks, records and values, matched by name, key and subject. Changes Only hides nothing that differs; off, it also counts the records that match byte for byte. Previous Change (Alt+Up) and Next Change (Alt+Down) walk the changes.

An array or set of plain numbers (bools, integers, floats, doubles) shows its differences as runs: one row for a single element, Bytes[200..4095] for a range. A container lists its first 1,000 runs and then one row counting the elements that differ past them; a record lists up to 262,144 rows and counts the rest in its own row. A record of many megabytes, or of an array, set or map of many thousands of values, is read, checked and compared over several frames.

When the left save can be changed, Use Right Value stages the right save’s value on the left, or the removal of a value the right lacks, and Use Right Record stages the right save’s whole record: in place of the left one, added to the chunk, or the removal of one the right lacks. A value only the right save holds comes over with its record. Nothing goes from left to right. Each use finds its value again after the changes you staged since the comparison, so removing one value never sends a later use to its neighbour; a use whose value you removed, or whose record you replaced, is refused. Use Right Record drops the changes staged on that record before it from Edits, since they are not written.

Change values and write them back

Only the copy that loads can change. Double-click a value, type and press Enter; Escape cancels. Each change is checked as you make it: a change that cannot be made stays out and its reason shows under the row. A value left as it was stages nothing. Changes are staged, listed under Edits in the side panel with Revert, and written only by Write. Revert also drops a later change that no longer applies without the reverted one, such as an edit inside a removed element or a rotation that would no longer be usable.

  • Whole numbers edit in a numeric box; a number outside the type’s range is refused with the range.
  • A string over 200 characters or of several lines shows its start; Edit Text… opens the whole string in a dialog.
  • A colour shows a swatch beside its components.
  • A gameplay tag container lists its tags. Add Tag… in its right-click menu adds one of the project’s gameplay tags; a tag the project lacks is refused, since a load would drop it. A tag goes by Remove.
  • A set’s elements change only by Remove, since a changed element could equal another; a change that would make two elements equal is refused.
Figure 3. Gold changed from 250 to 999 and the nickname removed, staged; an OutOfRange refusal under the row; Edits (2) in the side panel; Write to Slot 1 in the edit bar.
  • Write to {Slot}… writes the changes as a new save of the slot in the other copy. The save you opened stays as the backup, and the new save is marked as edited. With Confirm Writes on, a dialog lists every change first.
  • Save as New Slot… writes them as a new slot and leaves the opened one as it is.
  • Restore as Newest… on the backup copy writes it as the newest save; the newest save it replaces becomes the backup.
  • Title and Game Data Version change in File. Remove Record sits on the record line.

A write never replaces a save made after you opened it, such as one Play In Editor made: the write is refused with Changed, the changes stay staged, and Save as New Slot keeps them while Open Again shows the newer save. While Play In Editor runs, a banner says that its next save replaces what you write.

Values change only in a save written with this build’s versions, because a changed value is written with this build’s serialization. A save written with another version’s numbers shows OtherVersions; its Game Data Version and removals still change. Data kept for a newer version, references to saved or owned objects and keyed texts keep their bytes; Replace with Plain Text turns a keyed text into a plain one.

Find the actor a record belongs to

The record line above Values offers what fits the record and the world:

Record Editor’s world While Play In Editor runs
Placed actor, Custom Save ID Select and Frame; an actor World Partition has not loaded offers Load and Select; another map of this project offers Open Map, and a map the project does not have, such as one of another project, says so Select and Frame in the play world that is not a client’s
Actor of a sublevel Select and Frame while the editor shows the sublevel; a hidden one: “In {Level}, not shown”, or “In {Level}, not loaded” when the editor has not loaded it, and Load and Select loads it and makes it visible as the Levels panel does; a level the open map does not stream: “In {Level}, not part of the open map” Select and Frame while its level is visible; otherwise “In {Level}, not streamed in”
Actor of a level instance’s level Select selects the level instance, Frame frames the actor; a level instance World Partition has not loaded offers Load and Select; one spawned in play: “Exists only while playing” Select and Frame while its level is visible; otherwise “In {Level Instance}, not streamed in”
Component, owned object Select selects the actor, then the component the same
Spawned actor, player, Game Mode, Game State “Exists only while playing” Select and Frame
Level Blueprint of the map, a sublevel or a level instance Open Level Blueprint while its level is shown, enabled when it has one; none is created; otherwise “In {Level}, not shown” for a hidden sublevel, “In {Level}, not loaded” for one not loaded the same
Registered name, profile record, handler “Not an actor” the same

Browse to Class shows a Blueprint class in the Content Browser without loading it; Open Class opens the Blueprint editor, which loads it, or the source of a C++ class. With an instance selected under Instances or PCG Output, Frame Instance moves the editor camera to it, for a PCG cell to its place from the cell’s centre.

Check a save against this build

Press Check Against This Build under Checks. The report says whether the save loads in this build, from which Game Data Version to which with how many migration steps, and lists what fails (such as a record whose class is gone) and what it loads without (values dropped, assets missing).

See what the running game holds

Running Game takes a snapshot of the game that plays in Play In Editor: the play world that is not a client’s. Contents and Values show the loaded game’s records, and the side panel’s Running Game section shows the remembered levels, the current map’s streamed levels (see Save streamed levels and World Partition worlds), the records that wait for their objects and what for, the memory slots and the rewind points. The records are copied over several frames, never encoded, so a large game does not hitch play; a save, load or level change during the copy starts it again. A server that runs in a process of its own cannot be reached; turn on Run Under One Process in Editor Preferences > Level Editor > Play.

Figure 4. The running game's snapshot: the loaded game's records in Contents, two remembered levels and three waiting records in the side panel.

With Follow Saves on (Editor Preferences > Plugins > Rolly Save > Save Inspector), a Play In Editor save of the open slot or profile opens it again; with changes staged, a banner offers Open Again instead. The running game’s snapshot is taken again after its saves and loads.

Export and import JSON

The JSON menu exports the open save as Rolly Save JSON and imports a JSON file as a slot; see Export and import saves as JSON.