mirror of https://github.com/OpenTTD/OpenTTD
Fix #8846: When upgrading NewGRF presets, copy NewGRF parameters only if the NewGRF are compatible. Otherwise reset to defaults.
parent
d75a5e1a9a
commit
82c8720814
|
@ -66,6 +66,14 @@ GRFConfig::GRFConfig(const GRFConfig &config) :
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return whether this NewGRF can replace an older version of the same NewGRF.
|
||||||
|
*/
|
||||||
|
bool GRFConfig::IsCompatible(uint32_t old_version) const
|
||||||
|
{
|
||||||
|
return this->min_loadable_version <= old_version && old_version <= this->version;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Copy the parameter information from the \a src config.
|
* Copy the parameter information from the \a src config.
|
||||||
* @param src Source config.
|
* @param src Source config.
|
||||||
|
@ -685,7 +693,7 @@ const GRFConfig *FindGRFConfig(uint32_t grfid, FindGRFConfigMode mode, const MD5
|
||||||
/* Skip incompatible stuff, unless explicitly allowed */
|
/* Skip incompatible stuff, unless explicitly allowed */
|
||||||
if (mode != FGCM_NEWEST && HasBit(c->flags, GCF_INVALID)) continue;
|
if (mode != FGCM_NEWEST && HasBit(c->flags, GCF_INVALID)) continue;
|
||||||
/* check version compatibility */
|
/* check version compatibility */
|
||||||
if (mode == FGCM_COMPATIBLE && (c->version < desired_version || c->min_loadable_version > desired_version)) continue;
|
if (mode == FGCM_COMPATIBLE && !c->IsCompatible(desired_version)) continue;
|
||||||
/* remember the newest one as "the best" */
|
/* remember the newest one as "the best" */
|
||||||
if (best == nullptr || c->version > best->version) best = c;
|
if (best == nullptr || c->version > best->version) best = c;
|
||||||
}
|
}
|
||||||
|
|
|
@ -173,6 +173,7 @@ struct GRFConfig : ZeroedMemoryAllocator {
|
||||||
|
|
||||||
struct GRFConfig *next; ///< NOSAVE: Next item in the linked list
|
struct GRFConfig *next; ///< NOSAVE: Next item in the linked list
|
||||||
|
|
||||||
|
bool IsCompatible(uint32_t old_version) const;
|
||||||
void CopyParams(const GRFConfig &src);
|
void CopyParams(const GRFConfig &src);
|
||||||
|
|
||||||
std::optional<std::string> GetTextfile(TextfileType type) const;
|
std::optional<std::string> GetTextfile(TextfileType type) const;
|
||||||
|
|
|
@ -723,7 +723,11 @@ struct NewGRFWindow : public Window, NewGRFScanCallback {
|
||||||
while (*c != iter->second) c = &(*c)->next;
|
while (*c != iter->second) c = &(*c)->next;
|
||||||
GRFConfig *d = new GRFConfig(*a);
|
GRFConfig *d = new GRFConfig(*a);
|
||||||
d->next = (*c)->next;
|
d->next = (*c)->next;
|
||||||
d->CopyParams(**c);
|
if (d->IsCompatible((*c)->version)) {
|
||||||
|
d->CopyParams(**c);
|
||||||
|
} else {
|
||||||
|
d->SetParameterDefaults();
|
||||||
|
}
|
||||||
if (this->active_sel == *c) {
|
if (this->active_sel == *c) {
|
||||||
CloseWindowByClass(WC_GRF_PARAMETERS);
|
CloseWindowByClass(WC_GRF_PARAMETERS);
|
||||||
CloseWindowByClass(WC_TEXTFILE);
|
CloseWindowByClass(WC_TEXTFILE);
|
||||||
|
|
Loading…
Reference in New Issue