Skip to content

Rune use recording

What is recorded

The Mind Palace plaque design records two kinds of footage for each learned rune:

  • The first successful use of the rune.
  • The three most recent uses of the rune.

The checkpoint save stores the first-use clip: each used rune's knowledge entry holds one FName recording ID. The three most recent uses are specified by the Mind Palace design and join the knowledge entry as a recent-use list when the plaques need them.

Clip length

Each Mind Palace plaque clip is specified as 2 to 3 seconds long and looping.

The clip save format does not store a fixed length field. Playback length comes from the recorded frames and their per-frame timestamps. UGameplayRecordingWidget::PlayRecording accepts a loop flag, so a plaque can request looping playback directly.

Where it is viewed

Recordings are viewed on a pedestal plaque in the Memory Palace.

The large plaque shows the first successful use. Three smaller plaques show the three most recent uses. Playback occurs only while the player is zoomed into that pedestal. When the player exits the zoomed view, playback stops.

Storage

Rune-to-clip keying

Rune knowledge lives in the checkpoint save, URephrasedSaveGame::Knowledge. Each rune's FRuneKnowledgeEntry holds FirstUseRecordingId, the clip of its first successful use.

URephrasedSaveSubsystem exposes:

  • HasUsedRune(URuneDataAsset* Rune): true once the rune has been part of an activated sentence.
  • GetRecordingForRune(URuneDataAsset* Rune): returns the first-use recording ID, or None if the rune has not been used.
  • MarkRuneUsed(URuneDataAsset* Rune, FName RecordingId): links the rune to a clip.

When a sentence activates, the rune coordinator records one clip and links it to both words, but only to a word that has no clip yet, so each rune keeps its first use. The write lands in the resident save and reaches disk with the next checkpoint.

At world start and again when recording begins, UGameplayRecorderSubsystem deletes every clip slot the save no longer references (GetReferencedRecordingIds). It waits until the save has been read, so clips are never swept before their references load.

Clip storage

UGameplayRecordingSave extends USaveGame and stores one recorded clip. Each clip lives in its own save slot so clips load independently.

Clip fields:

  • Version: int32, value 2.
  • RecordingId: FName.
  • FrameSize: FIntPoint.
  • FramesPerSecond: float.
  • Frames: TArray<FGameplayRecordingFrame>.

Each FGameplayRecordingFrame contains:

  • JpegData: TArray<uint8>.
  • TimeSeconds: float, the seconds since the clip started. Frames are not evenly spaced when the game hitches, so playback follows this timestamp.

The class provides:

  • GetSlotName(FName RecordingId).
  • HasRecording(FName RecordingId).
  • DeleteRecording(FName RecordingId).

Recorder subsystem

UGameplayRecorderSubsystem is a UWorldSubsystem that records low-resolution gameplay clips. It captures the game view without the HUD and saves each clip to its own save slot.

  • StartOrJoinRecording(UObject* Holder) returns the recording ID. A clip keeps recording while at least one holder has joined it.
  • ReleaseRecording(UObject* Holder, bool bKeepClip) drops a hold. Once no holders remain, the clip records a short post-roll and then saves.
  • A clip is written to disk only if at least one holder released with bKeepClip.
  • Clips auto-stop at a hard frame cap.
  • Frames come from a scene capture that mirrors the player camera, are read back from the GPU without blocking, and are JPEG-compressed on worker threads.
  • Finishing a stopped clip, including draining its last frames, serializing, and writing, stays off the game thread so saving does not hitch.

Playback widget

UGameplayRecordingWidget is the UUserWidget base for playing a saved clip into an image widget.

  • Blueprint subclasses must name their image widget FrameImage; the field is BindWidget and case-sensitive.
  • PlayRecording(FName RecordingId, bool bLoop) loads the clip asynchronously and plays it.
  • StopPlayback() stops playback and leaves the current frame on screen.
  • OnPlaybackFinished and OnRecordingNotFound(FName RecordingId) are Blueprint-implemented events.
  • The widget decodes one JPEG frame at a time into a single transient texture and keeps playing while the game is paused.

A Mind Palace pedestal hosts a Blueprint subclass of UGameplayRecordingWidget on its plaque and plays the recording ID from GetRecordingForRune while the player is focused on it.

Saves during development

The console variable Rephrased.Save.WipeOnPlay is on by default, so everyday development starts clean: ARephraseCharacter::BeginPlay calls WipeAllSaves, which clears the checkpoint save, its knowledge, and every clip slot. Set it to 0 to keep saves and clips across PIE runs. Only pawns with bClearsSaveOnBeginPlay wipe, so the Mind Palace pawn leaves progress alone.

Authoring rule for designers

Recording happens automatically when a rune command resolves. Designers do not author clips, place recording triggers, or hand-create plaque footage. The clip is a capture of the gameplay view around that successful use.

What to check before calling it done

  • A rune used for the first time produces a clip.
  • The clip is 2 to 3 seconds long and loops on the plaque.
  • A fourth use replaces the oldest of the three recent clips, once the knowledge entry holds a recent-use list.
  • Reloading keeps recordings, with Rephrased.Save.WipeOnPlay set to 0.
  • Pedestal playback loops while zoomed in and stops when the player exits the zoomed view.

Sources

  • Mind Palace Doc (Sept 10) - https://docs.google.com/document/d/1SJmAOAfufwu9qbgOUCZI1GF3yFlYUOLtF2s-FMq7W0w/edit - covers the Mind Palace pedestal plaques and the 2 to 3 second looping recording specification.

Change history

  • 2026-09-29 — Gabriel Li — Recording links live in the checkpoint save's rune knowledge; documented the clip sweep and Rephrased.Save.WipeOnPlay.
  • 2026-09-17 — Gabriel Li — Rewrote the page as the Rune use recording specification and aligned the storage description with the verified UPlayerRuneKnowledge, UGameplayRecordingSave, UGameplayRecorderSubsystem, and UGameplayRecordingWidget headers.
  • 2026-09-10 — rsafadi — Initial page: first-use rune recordings.