Make the previous commit work with mod elements too

For this to work, loading code needed to stop trusting DEFAULT_PT_ identifiers, which it trusted because there have been some identifier changes between vanilla releases. I dug these up and listed them explicitly; they are now taken into account as needed when loading old enough saves.
This commit is contained in:
Tamás Bálint Misius 2023-10-15 19:23:39 +02:00
parent 36800a76cd
commit 73be29aa61
No known key found for this signature in database
GPG Key ID: 5B472A12F6ECA9F2
3 changed files with 60 additions and 6 deletions

View File

@ -4,6 +4,7 @@
#include "simulation/Simulation.h"
#include "simulation/ElementClasses.h"
#include "common/tpt-compat.h"
#include "common/Version.h"
#include "bson/BSON.h"
#include "graphics/Renderer.h"
#include "Config.h"
@ -641,6 +642,25 @@ void GameSave::readOPS(const std::vector<char> &data)
}
}
auto paletteRemap = [this, saveVersion = Version(majorVersion, minorVersion)](auto maxVersion, ByteString from, ByteString to) {
if (saveVersion <= maxVersion)
{
auto it = std::find_if(palette.begin(), palette.end(), [&from](auto &item) {
return item.first == from;
});
if (it != palette.end())
{
it->first = to;
}
}
};
paletteRemap(Version(87, 1), "DEFAULT_PT_TUGN", "DEFAULT_PT_TUNG");
paletteRemap(Version(90, 1), "DEFAULT_PT_REPL", "DEFAULT_PT_RPEL");
paletteRemap(Version(92, 0), "DEFAULT_PT_E180", "DEFAULT_PT_HEAC");
paletteRemap(Version(92, 0), "DEFAULT_PT_E181", "DEFAULT_PT_SAWD");
paletteRemap(Version(92, 0), "DEFAULT_PT_E182", "DEFAULT_PT_POLO");
paletteRemap(Version(93, 3), "DEFAULT_PT_RAYT", "DEFAULT_PT_LDTC");
//Read wall and fan data
if(wallData)
{

32
src/common/Version.h Normal file
View File

@ -0,0 +1,32 @@
#pragma once
#include <array>
#include <algorithm>
template<size_t ComponentCount>
struct Version
{
std::array<size_t, ComponentCount> components;
template<class ...Args>
constexpr Version(Args ...args) : components{ size_t(args)... }
{
}
constexpr bool operator <(const Version &other) const
{
return std::lexicographical_compare(components.begin(), components.end(), other.components.begin(), other.components.end());
}
constexpr bool operator ==(const Version &other) const
{
return std::equal(components.begin(), components.end(), other.components.begin(), other.components.end());
}
constexpr bool operator <=(const Version &other) const
{
return *this < other || *this == other;
}
};
template<class ...Args>
Version(Args ...args) -> Version<sizeof...(Args)>;

View File

@ -32,6 +32,10 @@ std::vector<ByteString> Simulation::Load(const GameSave *save, bool includePress
}
if(save->palette.size())
{
for(int i = 0; i < PT_NUM; i++)
{
partMap[i] = 0;
}
for(auto &pi : save->palette)
{
if (pi.second > 0 && pi.second < PT_NUM)
@ -40,19 +44,17 @@ std::vector<ByteString> Simulation::Load(const GameSave *save, bool includePress
for (int i = 0; i < PT_NUM; i++)
{
if (elements[i].Enabled && elements[i].Identifier == pi.first)
{
myId = i;
}
}
// if this is a custom element, set the ID to the ID we found when comparing identifiers in the palette map
// set type to 0 if we couldn't find an element with that identifier present when loading,
// unless this is a default element, in which case keep the current ID, because otherwise when an element is renamed it wouldn't show up anymore in older saves
if (myId != 0)
if (myId)
{
partMap[pi.second] = myId;
}
else if (!pi.first.BeginsWith("DEFAULT_PT_"))
else
{
missingElementTypes.push_back(pi.first);
partMap[pi.second] = myId;
}
}
}