diff options
-rw-r--r-- | saveload.c | 8 | ||||
-rw-r--r-- | sdl.c | 12 | ||||
-rw-r--r-- | settings.c | 1 | ||||
-rw-r--r-- | variables.h | 1 | ||||
-rw-r--r-- | win32.c | 12 |
5 files changed, 30 insertions, 4 deletions
diff --git a/saveload.c b/saveload.c index dda3eefc1..ffb6fd280 100644 --- a/saveload.c +++ b/saveload.c @@ -1146,6 +1146,14 @@ bool EmergencySave() return true; } +void DoExitSave() +{ + char buf[200]; + sprintf(buf, "%s%sexit.sav", _path.autosave_dir, PATHSEP); + debug(buf); + SaveOrLoad(buf, SL_SAVE); +} + // not used right now, but could be used if extensions of savegames are garbled /*int GetSavegameType(char *file) { @@ -434,6 +434,8 @@ static uint32 ConvertSdlKeyIntoMy(SDL_keysym *sym) return (key << 16) + sym->unicode; } +void DoExitSave(); + static int PollEvent(void) { SDL_Event ev; @@ -500,9 +502,13 @@ static int PollEvent(void) case SDL_QUIT: // do not ask to quit on the main screen - if (_game_mode != GM_MENU) - AskExitGame(); - else + if (_game_mode != GM_MENU) { + if(_patches.autosave_on_exit) { + DoExitSave(); + return ML_QUIT; + } else + AskExitGame(); + } else return ML_QUIT; break; diff --git a/settings.c b/settings.c index d171554a1..58edcd216 100644 --- a/settings.c +++ b/settings.c @@ -779,6 +779,7 @@ static const SettingDesc patch_player_settings[] = { {"errmsg_duration", SDT_UINT8, (void*)5, &_patches.errmsg_duration, NULL}, {"toolbar_pos", SDT_UINT8, (void*)0, &_patches.toolbar_pos, NULL}, {"keep_all_autosave", SDT_BOOL, (void*)false, &_patches.keep_all_autosave, NULL}, + {"autosave_on_exit", SDT_BOOL, (void*)false, &_patches.autosave_on_exit, NULL}, {"bridge_pillars", SDT_BOOL, (void*)true, &_patches.bridge_pillars, NULL}, {"invisible_trees", SDT_BOOL, (void*)false, &_patches.invisible_trees, NULL}, diff --git a/variables.h b/variables.h index 9756d5047..667bd4a83 100644 --- a/variables.h +++ b/variables.h @@ -148,6 +148,7 @@ typedef struct Patches { uint32 colored_news_date; // when does newspaper become colored? bool keep_all_autosave; // name the autosave in a different way. + bool autosave_on_exit; // save an autosave when you quit the game, but do not ask "Do you really want to quit?" bool extra_dynamite; // extra dynamite bool never_expire_vehicles; // never expire vehicles @@ -181,6 +181,8 @@ static void ClientSizeChanged(int w, int h) } } +void DoExitSave(); + static LRESULT CALLBACK WndProcGdi(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { @@ -224,7 +226,15 @@ static LRESULT CALLBACK WndProcGdi(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lP } case WM_CLOSE: - AskExitGame(); + // do not ask to quit on the main screen + if (_game_mode != GM_MENU) { + if(_patches.autosave_on_exit) { + DoExitSave(); + _exit_game = true; + } else + AskExitGame(); + } else + return ML_QUIT; return 0; case WM_LBUTTONDOWN: |