GameMaker Studio · GML
Cloud saves
Cloud saves let a player keep progress across devices. Each save lives in a numbered slot (1-10) and is a free-form struct validated against the schema you define in the panel.
Define a Save Schema
In the panel, declare the fields a save may contain and their types. The server validates every save against it.
Slots run 1 to 10. Saving to a used slot overwrites it.
Saving
Send a struct to a slot and read save_completed from the queue.
var data = { x: obj_player.x, y: obj_player.y, money: global.money, map: global.mapid };
gmda_saveGame(1, data); // slot 1 -> save_completedThe struct is sent as JSON. Keep saves reasonably small.
Loading
Request a slot and read save_loaded. An empty slot is not an error: e.response.save is undefined; when the slot is used, e.response.save.data is your struct, verbatim.
gmda_loadGame(1); // -> save_loaded
// in the poll loop:
case "save_loaded":
if (e.success && is_struct(e.response.save)) {
var data = e.response.save.data;
obj_player.x = data.x;
global.money = data.money;
}
break;// save_loaded -> e.response.save (undefined when the slot is empty):
{
"slot": 1,
"data": { "level": 5, "coins": 120 }, // your struct, verbatim
"updated_at": "2026-06-07T18:00:00.000Z"
}
// read it with: if (is_struct(e.response.save)) { var data = e.response.save.data; }Listing Saves
List the used slots with their metadata (no payload) and read saves_listed.
gmda_listSaves(); // -> saves_listed (e.response.saves)# saves: Array, each used slot (metadata only, no data):
{
"slot": int,
"size_bytes": int,
"updated_at": String
}
# save_completed -> meta has the same shape (slot, size_bytes, updated_at).Deleting a Save
Remove a slot and read save_deleted.
gmda_deleteSave(1); // -> save_deleted