Skip to content

Commit d64bbcb

Browse files
committed
Script API: implement OPT_SAVECOMPONENTSIGNORE, skipping save parts
1 parent e029a02 commit d64bbcb

File tree

8 files changed

+67
-33
lines changed

8 files changed

+67
-33
lines changed

Common/ac/gamesetupstructbase.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,14 @@ struct GameSetupStructBase
212212
}};
213213
}
214214

215+
// Returns a list of game options that must be preserved when restoring a save
216+
inline static std::array<int, 1> GetPreservedOptions()
217+
{
218+
return std::array<int, 1> {{
219+
OPT_SAVECOMPONENTSIGNORE
220+
}};
221+
}
222+
215223
private:
216224
void SetDefaultResolution(GameResolutionType type, Size game_res);
217225
void SetNativeResolution(GameResolutionType type, Size game_res);

Common/ac/gamestructdefines.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,8 @@
8686
#define OPT_SCALECHAROFFSETS 52 // apply character scaling to the sprite offsets (z, locked offs)
8787
#define OPT_SAVESCREENSHOTLAYER 53 // which render layers to include into savegame screenshot
8888
#define OPT_VOICECLIPNAMERULE 54 // which rule to use for a voice clip name based on character's name (old/new)
89-
#define OPT_HIGHESTOPTION OPT_VOICECLIPNAMERULE
89+
#define OPT_SAVECOMPONENTSIGNORE 55 // ignore these savegame components (flag mask)
90+
#define OPT_HIGHESTOPTION OPT_SAVECOMPONENTSIGNORE
9091
#define OPT_NOMODMUSIC 98 // [DEPRECATED]
9192
#define OPT_LIPSYNCTEXT 99
9293

Editor/AGS.Editor/Resources/agsdefns.sh

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@
9494
#define OPT_SCALECHAROFFSETS 52
9595
#define OPT_SAVEGAMESCREENSHOTLAYER 53
9696
#define OPT_VOICECLIPNAMERULE 54
97+
#define OPT_SAVECOMPONENTSIGNORE 55
9798
#define OPT_LIPSYNCTEXT 99
9899
99100
#define COLOR_TRANSPARENT -1
@@ -3290,6 +3291,18 @@ builtin struct Screen {
32903291
};
32913292
#endif
32923293
3294+
enum SaveComponentSelection
3295+
{
3296+
eSaveCmp_None = 0,
3297+
eSaveCmp_Audio = 0x00000002,
3298+
eSaveCmp_Dialogs = 0x00000008,
3299+
eSaveCmp_GUI = 0x00000010,
3300+
eSaveCmp_Cursors = 0x00000040,
3301+
eSaveCmp_Views = 0x00000080,
3302+
eSaveCmp_DynamicSprites = 0x00000100,
3303+
eSaveCmp_Plugins = 0x00002000
3304+
};
3305+
32933306
32943307
32953308
import readonly Character *player;

Engine/ac/game.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -961,7 +961,7 @@ void save_game(int slotn, const String &descript, std::unique_ptr<Bitmap> &&imag
961961
}
962962

963963
// Save dynamic game data
964-
SaveGameState(out.get());
964+
SaveGameState(out.get(), (SaveCmpSelection)(kSaveCmp_All & ~(game.options[OPT_SAVECOMPONENTSIGNORE] & kSaveCmp_ScriptIgnoreMask)));
965965
// call "After Save" event callback
966966
run_on_event(kScriptEvent_GameSaved, RuntimeScriptValue().SetInt32(slotn));
967967
}
@@ -1071,7 +1071,8 @@ HSaveError load_game(const String &path, int slotNumber, bool &data_overwritten)
10711071
}
10721072

10731073
// do the actual restore
1074-
err = RestoreGameState(src.InputStream.get(), src.Version);
1074+
err = RestoreGameState(src.InputStream.get(), src.Version,
1075+
(SaveCmpSelection)(kSaveCmp_All & ~(game.options[OPT_SAVECOMPONENTSIGNORE] & kSaveCmp_ScriptIgnoreMask)));
10751076
data_overwritten = true;
10761077
if (!err)
10771078
return err;

Engine/game/savegame.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -422,6 +422,9 @@ static void CopyPreservedGameOptions(GameSetupStructBase &gs, const PreservedPar
422422
const auto restricted_opts = GameSetupStructBase::GetRestrictedOptions();
423423
for (auto opt : restricted_opts)
424424
gs.options[opt] = pp.GameOptions[opt];
425+
const auto preserved_opts = GameSetupStructBase::GetPreservedOptions();
426+
for (auto opt : preserved_opts)
427+
gs.options[opt] = pp.GameOptions[opt];
425428
}
426429

427430
// Final processing after successfully restoring from save
@@ -680,12 +683,12 @@ HSaveError DoAfterRestore(const PreservedParams &pp, RestoredData &r_data)
680683
return HSaveError::None();
681684
}
682685

683-
HSaveError RestoreGameState(Stream *in, SavegameVersion svg_version)
686+
HSaveError RestoreGameState(Stream *in, SavegameVersion svg_version, SaveCmpSelection select_cmp)
684687
{
685688
PreservedParams pp;
686689
RestoredData r_data;
687690
DoBeforeRestore(pp);
688-
HSaveError err = SavegameComponents::ReadAll(in, svg_version, SavegameComponents::kSaveCmp_All, pp, r_data);
691+
HSaveError err = SavegameComponents::ReadAll(in, svg_version, select_cmp, pp, r_data);
689692
if (!err)
690693
return err;
691694
return DoAfterRestore(pp, r_data);
@@ -762,10 +765,10 @@ void DoBeforeSave()
762765
}
763766
}
764767

765-
void SaveGameState(Stream *out)
768+
void SaveGameState(Stream *out, SaveCmpSelection select_cmp)
766769
{
767770
DoBeforeSave();
768-
SavegameComponents::WriteAllCommon(out, SavegameComponents::kSaveCmp_All);
771+
SavegameComponents::WriteAllCommon(out, select_cmp);
769772
}
770773

771774
void ReadPluginSaveData(Stream *in, PluginSvgVersion svg_ver, soff_t max_size)

Engine/game/savegame.h

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -153,18 +153,49 @@ struct SavegameDescription
153153
SavegameDescription();
154154
};
155155

156+
// SaveCmpSelection flags tell which save components to restore, and which to skip
157+
enum SaveCmpSelection
158+
{
159+
kSaveCmp_None = 0,
160+
kSaveCmp_GameState = 0x00000001,
161+
kSaveCmp_Audio = 0x00000002,
162+
kSaveCmp_Characters = 0x00000004,
163+
kSaveCmp_Dialogs = 0x00000008,
164+
kSaveCmp_GUI = 0x00000010,
165+
kSaveCmp_InvItems = 0x00000020,
166+
kSaveCmp_Cursors = 0x00000040,
167+
kSaveCmp_Views = 0x00000080,
168+
kSaveCmp_DynamicSprites = 0x00000100,
169+
kSaveCmp_Overlays = 0x00000200,
170+
kSaveCmp_Scripts = 0x00000400,
171+
kSaveCmp_Rooms = 0x00000800,
172+
kSaveCmp_ThisRoom = 0x00001000,
173+
kSaveCmp_Plugins = 0x00002000,
174+
kSaveCmp_All = 0xFFFFFFFF,
175+
176+
// Components, allowed to be ignored by script's request
177+
kSaveCmp_ScriptIgnoreMask =
178+
kSaveCmp_Audio
179+
| kSaveCmp_Dialogs
180+
| kSaveCmp_GUI
181+
| kSaveCmp_Cursors
182+
| kSaveCmp_Views
183+
| kSaveCmp_DynamicSprites
184+
| kSaveCmp_Plugins
185+
};
186+
156187

157188
// Opens savegame for reading; optionally reads description, if any is provided
158189
HSaveError OpenSavegame(const String &filename, SavegameSource &src,
159190
SavegameDescription &desc, SavegameDescElem elems = kSvgDesc_All);
160191
// Opens savegame and reads the savegame description
161192
HSaveError OpenSavegame(const String &filename, SavegameDescription &desc, SavegameDescElem elems = kSvgDesc_All);
162193
// Reads the game data from the save stream and reinitializes game state
163-
HSaveError RestoreGameState(Stream *in, SavegameVersion svg_version);
194+
HSaveError RestoreGameState(Stream *in, SavegameVersion svg_version, SaveCmpSelection select_cmp);
164195
// Opens savegame for writing and puts in savegame description
165196
std::unique_ptr<Stream> StartSavegame(const String &filename, const String &user_text, const Bitmap *user_image);
166197
// Prepares game for saving state and writes game data into the save stream
167-
void SaveGameState(Stream *out);
198+
void SaveGameState(Stream *out, SaveCmpSelection select_cmp);
168199

169200
} // namespace Engine
170201
} // namespace AGS

Engine/game/savegame_components.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1337,7 +1337,7 @@ ComponentHandler ComponentHandlers[] =
13371337
"Dynamic Surfaces",
13381338
0,
13391339
0,
1340-
kSaveCmp_DynamicSurfaces,
1340+
kSaveCmp_DynamicSprites, // share flag with "Dynamic Sprites"
13411341
WriteDynamicSurfaces,
13421342
ReadDynamicSurfaces
13431343
},

Engine/game/savegame_components.h

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -33,29 +33,6 @@ struct RestoredData;
3333

3434
namespace SavegameComponents
3535
{
36-
// SaveCmpSelection flags tell which save components to restore, and which to skip
37-
enum SaveCmpSelection
38-
{
39-
kSaveCmp_None = 0,
40-
kSaveCmp_GameState = 0x00000001,
41-
kSaveCmp_Audio = 0x00000002,
42-
kSaveCmp_Characters = 0x00000004,
43-
kSaveCmp_Dialogs = 0x00000008,
44-
kSaveCmp_GUI = 0x00000010,
45-
kSaveCmp_InvItems = 0x00000020,
46-
kSaveCmp_Cursors = 0x00000040,
47-
kSaveCmp_Views = 0x00000080,
48-
kSaveCmp_DynamicSprites = 0x00000100,
49-
kSaveCmp_Overlays = 0x00000200,
50-
kSaveCmp_DynamicSurfaces= 0x00000400,
51-
kSaveCmp_Scripts = 0x00000800,
52-
kSaveCmp_Rooms = 0x00001000,
53-
kSaveCmp_ThisRoom = 0x00002000,
54-
kSaveCmp_Plugins = 0x00004000,
55-
kSaveCmp_All = 0xFFFFFFFF
56-
};
57-
58-
5936
// Reads all available components from the stream
6037
HSaveError ReadAll(Stream *in, SavegameVersion svg_version, SaveCmpSelection select_cmp,
6138
const PreservedParams &pp, RestoredData &r_data);

0 commit comments

Comments
 (0)