Common API Calls
This page is the quick copy/paste layer.
Use it after you understand the basic Save Graph idea and need to wire buttons, menus, autosave zones, or debug shortcuts.
Save A Scope
Use this when one gameplay domain owns the save/load boundary.
@onready var room_scope: SaveFlowScope = $RoomScope
func save_room() -> void:
var metadata := SaveFlowSlotMetadata.new()
metadata.slot_id = "slot_1"
metadata.display_name = "Village Start"
metadata.save_type = "manual"
metadata.chapter_name = "Chapter 1"
metadata.location_name = "Forest Gate"
metadata.playtime_seconds = 960
var result := SaveFlow.save_scope("slot_1", room_scope, metadata)
if not result.ok:
push_warning(result.message)
Load A Scope
The target Scope and its Sources must already exist in the currently loaded scene.
func load_room() -> void:
var result := SaveFlow.load_scope("slot_1", room_scope)
if not result.ok:
push_warning(result.message)
Use strict: true only when missing Sources should fail the load:
SaveFlow.load_scope("slot_1", room_scope, true)
Save And Load A Scene Graph
Use this when the scene's Sources are discovered from the saveflow group.
func save_current_scene() -> void:
var result := SaveFlow.save_scene("slot_1", get_tree().current_scene)
if not result.ok:
push_warning(result.message)
func load_current_scene() -> void:
var result := SaveFlow.load_scene("slot_1", get_tree().current_scene)
if not result.ok:
push_warning(result.message)
Most project-ready workflows should still prefer save_scope() when a domain
boundary is clear.
Use Active Slot Helpers
Use SaveFlowSlotWorkflow when a menu or gameplay session has a selected slot.
var slot_workflow := SaveFlowSlotWorkflow.new()
func select_slot(slot_index: int) -> void:
slot_workflow.select_slot_index(slot_index)
func active_slot_id() -> String:
return slot_workflow.active_slot_id()
Build metadata for the active slot:
func build_metadata(save_type: String) -> SaveFlowSlotMetadata:
return slot_workflow.build_active_slot_metadata(
"",
save_type,
"Chapter 1",
"Forest Gate",
_current_playtime_seconds
)
Manual Save
func manual_save() -> void:
var metadata := build_metadata("manual")
var result := SaveFlow.save_scope(slot_workflow.active_slot_id(), room_scope, metadata)
if not result.ok:
push_warning(result.message)
Autosave
Autosave usually writes the active slot without opening a menu.
func trigger_autosave() -> void:
var metadata := build_metadata("autosave")
var result := SaveFlow.save_scope(slot_workflow.active_slot_id(), room_scope, metadata)
if not result.ok:
push_warning(result.message)
Checkpoint Save
Checkpoint is a gameplay recovery marker. It usually writes the active slot with checkpoint metadata.
func trigger_checkpoint() -> void:
var metadata := build_metadata("checkpoint")
metadata.location_name = "West Room Checkpoint"
var result := SaveFlow.save_scope(slot_workflow.active_slot_id(), room_scope, metadata)
if not result.ok:
push_warning(result.message)
Build Save Cards For UI
Use summaries and cards to draw a save menu without loading every full payload.
func build_save_cards() -> Array:
var summaries := SaveFlow.list_slot_summaries()
if not summaries.ok:
push_warning(summaries.message)
return []
return slot_workflow.build_cards_for_indices(
PackedInt32Array([1, 2, 3]),
summaries.data
)
Each card can drive a UI card:
for card in build_save_cards():
print(card.display_name, " ", card.location_name, " ", card.save_type)
Read One Slot Summary
func print_slot_summary(slot_id: String) -> void:
var result := SaveFlow.read_slot_summary(slot_id)
if not result.ok:
push_warning(result.message)
return
print(result.data)
Delete A Slot
func delete_selected_slot() -> void:
var result := SaveFlow.delete_slot(slot_workflow.active_slot_id())
if not result.ok:
push_warning(result.message)
Check Compatibility Before Loading
func can_load_slot(slot_id: String) -> bool:
var result := SaveFlow.inspect_slot_compatibility(slot_id)
if not result.ok:
push_warning(result.message)
return false
return bool(result.data.get("compatible", false))
Compatibility checks report schema/data-version safety. They do not run Pro migration.
Store A Raw Payload
Use save_data() only when your code already owns the whole payload.
func save_settings_payload() -> void:
var payload := {
"volume": 0.8,
"language": "en",
}
SaveFlow.save_data("settings", payload)
For gameplay scene state, use Sources and Scopes instead.
C# Equivalent
In C#, the same Scope workflow is:
var workflow = new SaveFlowSlotWorkflow();
workflow.SelectSlotIndex(1);
var metadata = workflow.BuildActiveSlotMetadata(
displayName: "Village Start",
saveType: "manual",
chapterName: "Chapter 1",
locationName: "Forest Gate",
playtimeSeconds: 960);
var result = SaveFlowClient.SaveScope(workflow.ActiveSlotId(), roomScope, metadata);
if (!result.Ok)
{
GD.PushWarning(result.Message);
}
See the C# page and C# API reference when you need the full wrapper surface.