Merge remote-tracking branch 'damfr/save-unique-id' into jgrpp

# Conflicts:
#	src/saveload/afterload.cpp
#	src/saveload/saveload.cpp
This commit is contained in:
Jonathan G Rennison
2019-01-22 18:42:01 +00:00
8 changed files with 61 additions and 2 deletions

View File

@@ -265,6 +265,8 @@ static void SortSaveGameList(FileList &file_list)
QSortT(file_list.Get(sort_start), s_amount, CompareFiosItems); QSortT(file_list.Get(sort_start), s_amount, CompareFiosItems);
} }
void SaveGameConfirmationCallback(Window *w, bool confirmed);
struct SaveLoadWindow : public Window { struct SaveLoadWindow : public Window {
private: private:
static const uint EDITBOX_MAX_SIZE = 50; static const uint EDITBOX_MAX_SIZE = 50;
@@ -281,6 +283,8 @@ private:
QueryString filter_editbox; ///< Filter editbox; QueryString filter_editbox; ///< Filter editbox;
SmallVector<bool, 32> fios_items_shown; ///< Map of the filtered out fios items SmallVector<bool, 32> fios_items_shown; ///< Map of the filtered out fios items
friend void SaveGameConfirmationCallback(Window *w, bool confirmed);
public: public:
/** Generate a default save filename. */ /** Generate a default save filename. */
@@ -463,6 +467,14 @@ public:
y = DrawStringMultiLine(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y = DrawStringMultiLine(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT,
y, r.bottom - WD_FRAMERECT_BOTTOM, _load_check_data.error, TC_RED); y, r.bottom - WD_FRAMERECT_BOTTOM, _load_check_data.error, TC_RED);
} else { } else {
/* Warning if save unique id differ when saving */
if (this->fop == SLO_SAVE &&
_load_check_data.settings.game_creation.generation_unique_id != 0 && /* Don't warn if the save has no id (old save) */
_load_check_data.settings.game_creation.generation_unique_id != _settings_game.game_creation.generation_unique_id) {
y = DrawStringMultiLine(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT,
y, r.bottom - WD_FRAMERECT_BOTTOM, STR_SAVELOAD_DIFFERENT_ID);
}
/* Mapsize */ /* Mapsize */
SetDParam(0, _load_check_data.map_size_x); SetDParam(0, _load_check_data.map_size_x);
SetDParam(1, _load_check_data.map_size_y); SetDParam(1, _load_check_data.map_size_y);
@@ -731,8 +743,15 @@ public:
} }
} else if (this->IsWidgetLowered(WID_SL_SAVE_GAME)) { // Save button clicked } else if (this->IsWidgetLowered(WID_SL_SAVE_GAME)) { // Save button clicked
if (this->abstract_filetype == FT_SAVEGAME || this->abstract_filetype == FT_SCENARIO) { if (this->abstract_filetype == FT_SAVEGAME || this->abstract_filetype == FT_SCENARIO) {
_switch_mode = SM_SAVE_GAME; if (_load_check_data.settings.game_creation.generation_unique_id != 0 && /* Don't warn if the save has no id (old save) */
FiosMakeSavegameName(_file_to_saveload.name, this->filename_editbox.text.buf, lastof(_file_to_saveload.name)); _load_check_data.settings.game_creation.generation_unique_id != _settings_game.game_creation.generation_unique_id) {
/* The save has a different id to the current game */
/* Show a caption box asking whether the user is sure to overwrite the save */
ShowQuery(STR_SAVEGAME_UNMATCHING_ID_CAPTION, STR_SAVEGAME_UNMATCHING_ID_CONFIRMATION_TEXT, this, SaveGameConfirmationCallback);
} else {
/* We can safely overwrite the save */
SaveGameConfirmationCallback(this, true);
}
} else { } else {
_switch_mode = SM_SAVE_HEIGHTMAP; _switch_mode = SM_SAVE_HEIGHTMAP;
FiosMakeHeightmapName(_file_to_saveload.name, this->filename_editbox.text.buf, lastof(_file_to_saveload.name)); FiosMakeHeightmapName(_file_to_saveload.name, this->filename_editbox.text.buf, lastof(_file_to_saveload.name));
@@ -864,6 +883,19 @@ static WindowDesc _save_dialog_desc(
_nested_save_dialog_widgets, lengthof(_nested_save_dialog_widgets) _nested_save_dialog_widgets, lengthof(_nested_save_dialog_widgets)
); );
/**
* Callback function for the savegame 'are you sure you want to overwrite save' window
* @param w Window which is calling this callback
* @param confirmed boolean value, true when yes was clicked, false otherwise
*/
void SaveGameConfirmationCallback(Window *w, bool confirmed)
{
if (confirmed) {
_switch_mode = SM_SAVE_GAME;
FiosMakeSavegameName(_file_to_saveload.name, dynamic_cast<SaveLoadWindow*>(w)->filename_editbox.text.buf, lastof(_file_to_saveload.name));
}
}
/** /**
* Launch save/load dialog in the given mode. * Launch save/load dialog in the given mode.
* @param abstract_filetype Kind of file to handle. * @param abstract_filetype Kind of file to handle.

View File

@@ -105,6 +105,11 @@ static void _GenerateWorld(void *)
/* Set the Random() seed to generation_seed so we produce the same map with the same seed */ /* Set the Random() seed to generation_seed so we produce the same map with the same seed */
if (_settings_game.game_creation.generation_seed == GENERATE_NEW_SEED) _settings_game.game_creation.generation_seed = _settings_newgame.game_creation.generation_seed = InteractiveRandom(); if (_settings_game.game_creation.generation_seed == GENERATE_NEW_SEED) _settings_game.game_creation.generation_seed = _settings_newgame.game_creation.generation_seed = InteractiveRandom();
_random.SetSeed(_settings_game.game_creation.generation_seed); _random.SetSeed(_settings_game.game_creation.generation_seed);
/* Generates a unique id for the savegame, to avoid accidentally overwriting a save */
/* We keep id 0 for old savegames that don't have an id */
_settings_game.game_creation.generation_unique_id = _interactive_random.Next(UINT32_MAX - 1) + 1; /* Generates between [1,UINT32_MAX] */
SetGeneratingWorldProgress(GWP_MAP_INIT, 2); SetGeneratingWorldProgress(GWP_MAP_INIT, 2);
SetObjectToPlace(SPR_CURSOR_ZZZ, PAL_NONE, HT_NONE, WC_MAIN_WINDOW, 0); SetObjectToPlace(SPR_CURSOR_ZZZ, PAL_NONE, HT_NONE, WC_MAIN_WINDOW, 0);

View File

@@ -3297,6 +3297,7 @@ STR_SAVELOAD_DETAIL_NOT_AVAILABLE :{BLACK}No infor
STR_SAVELOAD_DETAIL_COMPANY_INDEX :{SILVER}{COMMA}: {WHITE}{STRING1} STR_SAVELOAD_DETAIL_COMPANY_INDEX :{SILVER}{COMMA}: {WHITE}{STRING1}
STR_SAVELOAD_DETAIL_GRFSTATUS :{SILVER}NewGRF: {WHITE}{STRING} STR_SAVELOAD_DETAIL_GRFSTATUS :{SILVER}NewGRF: {WHITE}{STRING}
STR_SAVELOAD_FILTER_TITLE :{BLACK}Filter string: STR_SAVELOAD_FILTER_TITLE :{BLACK}Filter string:
STR_SAVELOAD_DIFFERENT_ID :{RED}Not the same game as you are saving.
STR_SAVELOAD_OSKTITLE :{BLACK}Enter a name for the savegame STR_SAVELOAD_OSKTITLE :{BLACK}Enter a name for the savegame
@@ -4994,6 +4995,8 @@ STR_GAME_SAVELOAD_ERROR_FILE_NOT_WRITEABLE :File not writea
STR_GAME_SAVELOAD_ERROR_DATA_INTEGRITY_CHECK_FAILED :Data integrity check failed STR_GAME_SAVELOAD_ERROR_DATA_INTEGRITY_CHECK_FAILED :Data integrity check failed
STR_GAME_SAVELOAD_NOT_AVAILABLE :<not available> STR_GAME_SAVELOAD_NOT_AVAILABLE :<not available>
STR_WARNING_LOADGAME_REMOVED_TRAMS :{WHITE}Game was saved in version without tram support. All trams have been removed STR_WARNING_LOADGAME_REMOVED_TRAMS :{WHITE}Game was saved in version without tram support. All trams have been removed
STR_SAVEGAME_UNMATCHING_ID_CAPTION :{WHITE}Caution!
STR_SAVEGAME_UNMATCHING_ID_CONFIRMATION_TEXT :{YELLOW}The savegame you are about to overwrite is not the same as the current one.{}Are you sure you want to do this?
STR_GAME_SAVELOAD_ERROR_HUGE_AIRPORTS_PRESENT :Savegame uses huge airports STR_GAME_SAVELOAD_ERROR_HUGE_AIRPORTS_PRESENT :Savegame uses huge airports
STR_GAME_SAVELOAD_ERROR_HELI_OILRIG_BUG :Savegame has a helicopter on approach to a buggy oil rig STR_GAME_SAVELOAD_ERROR_HELI_OILRIG_BUG :Savegame has a helicopter on approach to a buggy oil rig

View File

@@ -3597,6 +3597,12 @@ bool AfterLoadGame()
} }
} }
if (SlXvIsFeatureMissing(XSLFI_SAVEGAME_UNIQUE_ID)) {
/* Generate a random id for savegames that didn't have one */
/* We keep id 0 for old savegames that don't have an id */
_settings_game.game_creation.generation_unique_id = _interactive_random.Next(UINT32_MAX-1) + 1; /* Generates between [1;UINT32_MAX] */
}
/* Road stops is 'only' updating some caches */ /* Road stops is 'only' updating some caches */
AfterLoadRoadStops(); AfterLoadRoadStops();
AfterLoadLabelMaps(); AfterLoadLabelMaps();

View File

@@ -93,6 +93,7 @@ const SlxiSubChunkInfo _sl_xv_sub_chunk_infos[] = {
{ XSLFI_BUY_LAND_RATE_LIMIT, XSCF_NULL, 1, 1, "buy_land_rate_limit", NULL, NULL, NULL }, { XSLFI_BUY_LAND_RATE_LIMIT, XSCF_NULL, 1, 1, "buy_land_rate_limit", NULL, NULL, NULL },
{ XSLFI_DUAL_RAIL_TYPES, XSCF_NULL, 1, 1, "dual_rail_types", NULL, NULL, NULL }, { XSLFI_DUAL_RAIL_TYPES, XSCF_NULL, 1, 1, "dual_rail_types", NULL, NULL, NULL },
{ XSLFI_CONSIST_SPEED_RD_FLAG, XSCF_NULL, 1, 1, "consist_speed_rd_flag", NULL, NULL, NULL }, { XSLFI_CONSIST_SPEED_RD_FLAG, XSCF_NULL, 1, 1, "consist_speed_rd_flag", NULL, NULL, NULL },
{ XSLFI_SAVEGAME_UNIQUE_ID, XSCF_IGNORABLE_ALL, 1, 1, "savegame_unique_id", NULL, NULL, NULL },
{ XSLFI_NULL, XSCF_NULL, 0, 0, NULL, NULL, NULL, NULL },// This is the end marker { XSLFI_NULL, XSCF_NULL, 0, 0, NULL, NULL, NULL, NULL },// This is the end marker
}; };

View File

@@ -67,6 +67,7 @@ enum SlXvFeatureIndex {
XSLFI_BUY_LAND_RATE_LIMIT, ///< Buy land rate limit XSLFI_BUY_LAND_RATE_LIMIT, ///< Buy land rate limit
XSLFI_DUAL_RAIL_TYPES, ///< Two rail-types per tile XSLFI_DUAL_RAIL_TYPES, ///< Two rail-types per tile
XSLFI_CONSIST_SPEED_RD_FLAG, ///< Consist speed reduction flag XSLFI_CONSIST_SPEED_RD_FLAG, ///< Consist speed reduction flag
XSLFI_SAVEGAME_UNIQUE_ID, ///< Savegame unique ID
XSLFI_RIFF_HEADER_60_BIT, ///< Size field in RIFF chunk header is 60 bit XSLFI_RIFF_HEADER_60_BIT, ///< Size field in RIFF chunk header is 60 bit
XSLFI_HEIGHT_8_BIT, ///< Map tile height is 8 bit instead of 4 bit, but savegame version may be before this became true in trunk XSLFI_HEIGHT_8_BIT, ///< Map tile height is 8 bit instead of 4 bit, but savegame version may be before this became true in trunk

View File

@@ -330,6 +330,7 @@ struct NetworkSettings {
/** Settings related to the creation of games. */ /** Settings related to the creation of games. */
struct GameCreationSettings { struct GameCreationSettings {
uint32 generation_seed; ///< noise seed for world generation uint32 generation_seed; ///< noise seed for world generation
uint32 generation_unique_id; ///< random id to differentiate savegames
Year starting_year; ///< starting date Year starting_year; ///< starting date
uint8 map_x; ///< X size of map uint8 map_x; ///< X size of map
uint8 map_y; ///< Y size of map uint8 map_y; ///< Y size of map

View File

@@ -2848,6 +2848,16 @@ min = 0
max = UINT32_MAX max = UINT32_MAX
cat = SC_EXPERT cat = SC_EXPERT
[SDT_VAR]
base = GameSettings
var = game_creation.generation_unique_id
type = SLE_UINT32
from = 0
def = 0
min = 0
max = UINT32_MAX
patxname = ""savegame_unique_id.game_creation.generation_unique_id""
[SDT_VAR] [SDT_VAR]
base = GameSettings base = GameSettings
var = game_creation.tree_placer var = game_creation.tree_placer