Changeset - r27979:37253e20ef1d
[Not reviewed]
master
0 3 0
frosch - 14 months ago 2023-10-01 13:21:57
frosch@openttd.org
Fix #8846: When upgrading NewGRF presets, copy NewGRF parameters only if the NewGRF are compatible. Otherwise reset to defaults.
3 files changed with 15 insertions and 2 deletions:
0 comments (0 inline, 0 general)
src/newgrf_config.cpp
Show inline comments
 
@@ -67,6 +67,14 @@ GRFConfig::GRFConfig(const GRFConfig &co
 
}
 

	
 
/**
 
 * 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.
 
 * @param src Source config.
 
 */
 
@@ -685,7 +693,7 @@ const GRFConfig *FindGRFConfig(uint32_t 
 
		/* Skip incompatible stuff, unless explicitly allowed */
 
		if (mode != FGCM_NEWEST && HasBit(c->flags, GCF_INVALID)) continue;
 
		/* 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" */
 
		if (best == nullptr || c->version > best->version) best = c;
 
	}
src/newgrf_config.h
Show inline comments
 
@@ -173,6 +173,7 @@ struct GRFConfig : ZeroedMemoryAllocator
 

	
 
	struct GRFConfig *next; ///< NOSAVE: Next item in the linked list
 

	
 
	bool IsCompatible(uint32_t old_version) const;
 
	void CopyParams(const GRFConfig &src);
 

	
 
	std::optional<std::string> GetTextfile(TextfileType type) const;
src/newgrf_gui.cpp
Show inline comments
 
@@ -723,7 +723,11 @@ struct NewGRFWindow : public Window, New
 
			while (*c != iter->second) c = &(*c)->next;
 
			GRFConfig *d = new GRFConfig(*a);
 
			d->next = (*c)->next;
 
			d->CopyParams(**c);
 
			if (d->IsCompatible((*c)->version)) {
 
				d->CopyParams(**c);
 
			} else {
 
				d->SetParameterDefaults();
 
			}
 
			if (this->active_sel == *c) {
 
				CloseWindowByClass(WC_GRF_PARAMETERS);
 
				CloseWindowByClass(WC_TEXTFILE);
0 comments (0 inline, 0 general)