1
0
mirror of https://github.com/TerryCavanagh/VVVVVV.git synced 2024-06-29 07:58:30 +02:00

Prevent writing stats/settings if they're not loaded

This prevents writing to unlock.vvv or settings.vvv if the game hasn't
made an attempt to load them yet. Otherwise, if the game aborted via
VVV_exit() because of, say, failure to parse a graphics file, it would
overwrite perfectly existing valid save data since it hasn't loaded it
yet.

Fixes #870.
This commit is contained in:
Misa 2022-03-13 22:39:09 -07:00
parent 75ee657612
commit 5bd7dce075

View File

@ -4024,6 +4024,8 @@ void Game::unlocknum( int t )
#endif #endif
} }
static bool stats_loaded = false;
void Game::loadstats(struct ScreenSettings* screen_settings) void Game::loadstats(struct ScreenSettings* screen_settings)
{ {
tinyxml2::XMLDocument doc; tinyxml2::XMLDocument doc;
@ -4031,6 +4033,8 @@ void Game::loadstats(struct ScreenSettings* screen_settings)
tinyxml2::XMLElement* pElem; tinyxml2::XMLElement* pElem;
tinyxml2::XMLElement* dataNode; tinyxml2::XMLElement* dataNode;
stats_loaded = true;
if (!FILESYSTEM_loadTiXml2Document("saves/unlock.vvv", doc)) if (!FILESYSTEM_loadTiXml2Document("saves/unlock.vvv", doc))
{ {
// Save unlock.vvv only. Maybe we have a settings.vvv laying around too, // Save unlock.vvv only. Maybe we have a settings.vvv laying around too,
@ -4340,7 +4344,15 @@ bool Game::savestats(bool sync /*= true*/)
bool Game::savestats(const struct ScreenSettings* screen_settings, bool sync /*= true*/) bool Game::savestats(const struct ScreenSettings* screen_settings, bool sync /*= true*/)
{ {
tinyxml2::XMLDocument doc; tinyxml2::XMLDocument doc;
bool already_exists = FILESYSTEM_loadTiXml2Document("saves/unlock.vvv", doc); bool already_exists;
if (!stats_loaded)
{
vlog_warn("Stats not loaded! Not writing unlock.vvv.");
return false;
}
already_exists = FILESYSTEM_loadTiXml2Document("saves/unlock.vvv", doc);
if (!already_exists) if (!already_exists)
{ {
vlog_info("No unlock.vvv found. Creating new file"); vlog_info("No unlock.vvv found. Creating new file");
@ -4567,12 +4579,16 @@ void Game::serializesettings(tinyxml2::XMLElement* dataNode, const struct Screen
xml::update_tag(dataNode, "controllerSensitivity", key.sensitivity); xml::update_tag(dataNode, "controllerSensitivity", key.sensitivity);
} }
static bool settings_loaded = false;
void Game::loadsettings(struct ScreenSettings* screen_settings) void Game::loadsettings(struct ScreenSettings* screen_settings)
{ {
tinyxml2::XMLDocument doc; tinyxml2::XMLDocument doc;
tinyxml2::XMLHandle hDoc(&doc); tinyxml2::XMLHandle hDoc(&doc);
tinyxml2::XMLElement* dataNode; tinyxml2::XMLElement* dataNode;
settings_loaded = true;
if (!FILESYSTEM_loadTiXml2Document("saves/settings.vvv", doc)) if (!FILESYSTEM_loadTiXml2Document("saves/settings.vvv", doc))
{ {
savesettings(screen_settings); savesettings(screen_settings);
@ -4606,7 +4622,15 @@ bool Game::savesettings(void)
bool Game::savesettings(const struct ScreenSettings* screen_settings) bool Game::savesettings(const struct ScreenSettings* screen_settings)
{ {
tinyxml2::XMLDocument doc; tinyxml2::XMLDocument doc;
bool already_exists = FILESYSTEM_loadTiXml2Document("saves/settings.vvv", doc); bool already_exists;
if (!settings_loaded)
{
vlog_warn("Settings not loaded! Not writing settings.vvv.");
return false;
}
already_exists = FILESYSTEM_loadTiXml2Document("saves/settings.vvv", doc);
if (!already_exists) if (!already_exists)
{ {
vlog_info("No settings.vvv found. Creating new file"); vlog_info("No settings.vvv found. Creating new file");