mirror of
https://github.com/The-Powder-Toy/The-Powder-Toy.git
synced 2025-08-21 15:41:35 +02:00
blame simon
render compatibility stuff, allow renderer to open saves with elements it doesn't understand, because something is better than nothing
This commit is contained in:
@@ -567,9 +567,7 @@ void GameSave::readOPS(char * data, int dataLength)
|
|||||||
unsigned partsCount = 0;
|
unsigned partsCount = 0;
|
||||||
unsigned int blockX, blockY, blockW, blockH, fullX, fullY, fullW, fullH;
|
unsigned int blockX, blockY, blockW, blockH, fullX, fullY, fullW, fullH;
|
||||||
int savedVersion = inputData[4];
|
int savedVersion = inputData[4];
|
||||||
#if defined(SNAPSHOT) || defined(DEBUG)
|
|
||||||
bool fakeNewerVersion = false; // used for development builds only
|
bool fakeNewerVersion = false; // used for development builds only
|
||||||
#endif
|
|
||||||
|
|
||||||
bson b;
|
bson b;
|
||||||
b.data = NULL;
|
b.data = NULL;
|
||||||
@@ -733,28 +731,42 @@ void GameSave::readOPS(char * data, int dataLength)
|
|||||||
if (bson_iterator_type(&iter) == BSON_OBJECT)
|
if (bson_iterator_type(&iter) == BSON_OBJECT)
|
||||||
{
|
{
|
||||||
int major = INT_MAX, minor = INT_MAX;
|
int major = INT_MAX, minor = INT_MAX;
|
||||||
|
#ifdef RENDERER
|
||||||
|
int renderMajor = INT_MAX, renderMinor = INT_MAX;
|
||||||
|
#endif
|
||||||
bson_iterator subiter;
|
bson_iterator subiter;
|
||||||
bson_iterator_subiterator(&iter, &subiter);
|
bson_iterator_subiterator(&iter, &subiter);
|
||||||
while (bson_iterator_next(&subiter))
|
while (bson_iterator_next(&subiter))
|
||||||
{
|
{
|
||||||
if (bson_iterator_type(&subiter) == BSON_INT)
|
if (bson_iterator_type(&subiter) == BSON_INT)
|
||||||
{
|
{
|
||||||
|
#ifdef RENDERER
|
||||||
|
if (!strcmp(bson_iterator_key(&subiter), "rendermajor"))
|
||||||
|
renderMajor = bson_iterator_int(&subiter);
|
||||||
|
else if (!strcmp(bson_iterator_key(&subiter), "renderminor"))
|
||||||
|
renderMinor = bson_iterator_int(&subiter);
|
||||||
|
#else
|
||||||
if (!strcmp(bson_iterator_key(&subiter), "major"))
|
if (!strcmp(bson_iterator_key(&subiter), "major"))
|
||||||
major = bson_iterator_int(&subiter);
|
major = bson_iterator_int(&subiter);
|
||||||
else if (!strcmp(bson_iterator_key(&subiter), "minor"))
|
else if (!strcmp(bson_iterator_key(&subiter), "minor"))
|
||||||
minor = bson_iterator_int(&subiter);
|
minor = bson_iterator_int(&subiter);
|
||||||
else
|
#endif
|
||||||
fprintf(stderr, "Wrong type for %s\n", bson_iterator_key(&iter));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#if defined(SNAPSHOT) || defined(DEBUG)
|
#ifdef RENDERER
|
||||||
|
if (renderMajor > SAVE_VERSION || (renderMajor == SAVE_VERSION && renderMinor > MINOR_VERSION))
|
||||||
|
#elif defined(SNAPSHOT) || defined(DEBUG)
|
||||||
if (major > FUTURE_SAVE_VERSION || (major == FUTURE_SAVE_VERSION && minor > FUTURE_MINOR_VERSION))
|
if (major > FUTURE_SAVE_VERSION || (major == FUTURE_SAVE_VERSION && minor > FUTURE_MINOR_VERSION))
|
||||||
#else
|
#else
|
||||||
if (major > SAVE_VERSION || (major == SAVE_VERSION && minor > MINOR_VERSION))
|
if (major > SAVE_VERSION || (major == SAVE_VERSION && minor > MINOR_VERSION))
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
std::stringstream errorMessage;
|
std::stringstream errorMessage;
|
||||||
|
#ifdef RENDERER
|
||||||
|
errorMessage << "Save from a newer version: Requires render version " << renderMajor << "." << renderMinor;
|
||||||
|
#else
|
||||||
errorMessage << "Save from a newer version: Requires version " << major << "." << minor;
|
errorMessage << "Save from a newer version: Requires version " << major << "." << minor;
|
||||||
|
#endif
|
||||||
throw ParseException(ParseException::WrongVersion, errorMessage.str());
|
throw ParseException(ParseException::WrongVersion, errorMessage.str());
|
||||||
}
|
}
|
||||||
#if defined(SNAPSHOT) || defined(DEBUG)
|
#if defined(SNAPSHOT) || defined(DEBUG)
|
||||||
@@ -1203,11 +1215,7 @@ void GameSave::readOPS(char * data, int dataLength)
|
|||||||
break;
|
break;
|
||||||
case PT_PIPE:
|
case PT_PIPE:
|
||||||
case PT_PPIP:
|
case PT_PPIP:
|
||||||
#if defined(SNAPSHOT) || defined(DEBUG)
|
|
||||||
if (savedVersion < 93 && !fakeNewerVersion)
|
if (savedVersion < 93 && !fakeNewerVersion)
|
||||||
#else
|
|
||||||
if (savedVersion < 93)
|
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
if (particles[newIndex].ctype == 1)
|
if (particles[newIndex].ctype == 1)
|
||||||
particles[newIndex].tmp |= 0x00020000; //PFLAG_INITIALIZING
|
particles[newIndex].tmp |= 0x00020000; //PFLAG_INITIALIZING
|
||||||
@@ -1924,6 +1932,12 @@ void GameSave::readPSv(char * saveDataChar, int dataLength)
|
|||||||
minimumMinorVersion = minor;\
|
minimumMinorVersion = minor;\
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// restrict the minimum version this save can be rendered with
|
||||||
|
#define RESTRICTRENDERVERSION(major, minor) if ((major) > blameSimon_major || (((major) == blameSimon_major && (minor) > blameSimon_minor))) {\
|
||||||
|
blameSimon_major = major;\
|
||||||
|
blameSimon_minor = minor;\
|
||||||
|
}
|
||||||
|
|
||||||
char * GameSave::serialiseOPS(unsigned int & dataLength)
|
char * GameSave::serialiseOPS(unsigned int & dataLength)
|
||||||
{
|
{
|
||||||
int blockX, blockY, blockW, blockH, fullX, fullY, fullW, fullH;
|
int blockX, blockY, blockW, blockH, fullX, fullY, fullW, fullH;
|
||||||
@@ -1932,6 +1946,8 @@ char * GameSave::serialiseOPS(unsigned int & dataLength)
|
|||||||
// when building, this number may be increased depending on what elements are used
|
// when building, this number may be increased depending on what elements are used
|
||||||
// or what properties are detected
|
// or what properties are detected
|
||||||
int minimumMajorVersion = 90, minimumMinorVersion = 2;
|
int minimumMajorVersion = 90, minimumMinorVersion = 2;
|
||||||
|
// blame simon for always being slow updating the renderer
|
||||||
|
int blameSimon_major = 92, blameSimon_minor = 0;
|
||||||
|
|
||||||
//Get coords in blocks
|
//Get coords in blocks
|
||||||
blockX = 0;//orig_x0/CELL;
|
blockX = 0;//orig_x0/CELL;
|
||||||
@@ -2090,6 +2106,9 @@ char * GameSave::serialiseOPS(unsigned int & dataLength)
|
|||||||
//Store saved particle index+1 for this partsptr index (0 means not saved)
|
//Store saved particle index+1 for this partsptr index (0 means not saved)
|
||||||
partsSaveIndex[i] = (partsCount++) + 1;
|
partsSaveIndex[i] = (partsCount++) + 1;
|
||||||
|
|
||||||
|
RESTRICTVERSION(94, 0);
|
||||||
|
RESTRICTRENDERVERSION(93, 0);
|
||||||
|
|
||||||
//Type (required)
|
//Type (required)
|
||||||
partsData[partsDataLen++] = particles[i].type;
|
partsData[partsDataLen++] = particles[i].type;
|
||||||
|
|
||||||
@@ -2103,6 +2122,7 @@ char * GameSave::serialiseOPS(unsigned int & dataLength)
|
|||||||
partsData[partsDataLen++] = particles[i].type >> 8;
|
partsData[partsDataLen++] = particles[i].type >> 8;
|
||||||
fieldDesc |= 1 << 14;
|
fieldDesc |= 1 << 14;
|
||||||
RESTRICTVERSION(93, 0);
|
RESTRICTVERSION(93, 0);
|
||||||
|
RESTRICTRENDERVERSION(93, 0);
|
||||||
fromNewerVersion = true; // TODO: remove on 93.0 release
|
fromNewerVersion = true; // TODO: remove on 93.0 release
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2353,6 +2373,8 @@ char * GameSave::serialiseOPS(unsigned int & dataLength)
|
|||||||
bson_append_start_object(&b, "minimumVersion");
|
bson_append_start_object(&b, "minimumVersion");
|
||||||
bson_append_int(&b, "major", minimumMajorVersion);
|
bson_append_int(&b, "major", minimumMajorVersion);
|
||||||
bson_append_int(&b, "minor", minimumMinorVersion);
|
bson_append_int(&b, "minor", minimumMinorVersion);
|
||||||
|
bson_append_int(&b, "rendermajor", blameSimon_major);
|
||||||
|
bson_append_int(&b, "renderminor", blameSimon_minor);
|
||||||
bson_append_finish_object(&b);
|
bson_append_finish_object(&b);
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user