diff --git a/src/newgrf_config.cpp b/src/newgrf_config.cpp --- a/src/newgrf_config.cpp +++ b/src/newgrf_config.cpp @@ -51,6 +51,13 @@ GRFConfig::GRFConfig(const GRFConfig &co this->name = DuplicateGRFText(config.name); this->info = DuplicateGRFText(config.info); if (config.error != NULL) this->error = new GRFError(*config.error); + for (uint i = 0; i < config.param_info.Length(); i++) { + if (config.param_info[i] == NULL) { + *this->param_info.Append() = NULL; + } else { + *this->param_info.Append() = new GRFParameterInfo(*config.param_info[i]); + } + } } /** Cleanup a GRFConfig object. */ @@ -63,6 +70,8 @@ GRFConfig::~GRFConfig() delete this->error; } CleanUpGRFText(this->name); + + for (uint i = 0; i < this->param_info.Length(); i++) delete this->param_info[i]; } /** @@ -140,6 +149,53 @@ GRFError::~GRFError() } /** + * Create a new empty GRFParameterInfo object. + * @param nr The newgrf parameter that is changed. + */ +GRFParameterInfo::GRFParameterInfo(uint nr) : + name(NULL), + desc(NULL), + type(PTYPE_UINT_ENUM), + min_value(0), + max_value(UINT32_MAX), + param_nr(nr), + first_bit(0), + num_bit(32) +{} + +/** + * Create a new GRFParameterInfo object that is a deep copy of an existing + * parameter info object. + * @param info The GRFParameterInfo object to make a copy of. + */ +GRFParameterInfo::GRFParameterInfo(GRFParameterInfo &info) : + name(DuplicateGRFText(info.name)), + desc(DuplicateGRFText(info.desc)), + type(info.type), + min_value(info.min_value), + max_value(info.max_value), + param_nr(info.param_nr), + first_bit(info.first_bit), + num_bit(info.num_bit) +{ + for (uint i = 0; i < info.value_names.Length(); i++) { + SmallPair *data = info.value_names.Get(i); + this->value_names.Insert(data->first, DuplicateGRFText(data->second)); + } +} + +/** Cleanup all parameter info. */ +GRFParameterInfo::~GRFParameterInfo() +{ + CleanUpGRFText(this->name); + CleanUpGRFText(this->desc); + for (uint i = 0; i < this->value_names.Length(); i++) { + SmallPair *data = this->value_names.Get(i); + CleanUpGRFText(data->second); + } +} + +/** * Update the palettes of the graphics from the config file. * This is needed because the config file gets read and parsed * before the palette is chosen (one can configure the base