Changeset - r19361:172ad5e17c1b
[Not reviewed]
master
0 2 0
frosch - 12 years ago 2012-05-25 20:54:54
frosch@openttd.org
(svn r24276) -Codechange: Enhance GRFFile with constructor and destructor.
2 files changed with 39 insertions and 27 deletions:
0 comments (0 inline, 0 general)
src/newgrf.cpp
Show inline comments
 
@@ -7898,12 +7898,7 @@ static void ResetNewGRF()
 
{
 
	const GRFFile * const *end = _grf_files.End();
 
	for (GRFFile **file = _grf_files.Begin(); file != end; file++) {
 
		GRFFile *f = *file;
 
		free(f->filename);
 
		free(f->cargo_list);
 
		free(f->railtype_list);
 
		delete [] f->language_map;
 
		free(f);
 
		delete *file;
 
	}
 

	
 
	_grf_files.Clear();
 
@@ -8069,39 +8064,52 @@ static void InitNewGRFFile(const GRFConf
 
		return;
 
	}
 

	
 
	newfile = CallocT<GRFFile>(1);
 

	
 
	newfile->filename = strdup(config->filename);
 
	newfile->grfid = config->ident.grfid;
 
	newfile = new GRFFile(config);
 
	*_grf_files.Append() = _cur.grffile = newfile;
 
}
 

	
 
/**
 
 * Constructor for GRFFile
 
 * @param config GRFConfig to copy name, grfid and parameters from.
 
 */
 
GRFFile::GRFFile(const GRFConfig *config)
 
{
 
	this->filename = strdup(config->filename);
 
	this->grfid = config->ident.grfid;
 

	
 
	/* Initialise local settings to defaults */
 
	newfile->traininfo_vehicle_pitch = 0;
 
	newfile->traininfo_vehicle_width = TRAININFO_DEFAULT_VEHICLE_WIDTH;
 
	this->traininfo_vehicle_pitch = 0;
 
	this->traininfo_vehicle_width = TRAININFO_DEFAULT_VEHICLE_WIDTH;
 

	
 
	/* Mark price_base_multipliers as 'not set' */
 
	for (Price i = PR_BEGIN; i < PR_END; i++) {
 
		newfile->price_base_multipliers[i] = INVALID_PRICE_MODIFIER;
 
		this->price_base_multipliers[i] = INVALID_PRICE_MODIFIER;
 
	}
 

	
 
	/* Initialise rail type map with default rail types */
 
	memset(newfile->railtype_map, INVALID_RAILTYPE, sizeof newfile->railtype_map);
 
	newfile->railtype_map[0] = RAILTYPE_RAIL;
 
	newfile->railtype_map[1] = RAILTYPE_ELECTRIC;
 
	newfile->railtype_map[2] = RAILTYPE_MONO;
 
	newfile->railtype_map[3] = RAILTYPE_MAGLEV;
 
	memset(this->railtype_map, INVALID_RAILTYPE, sizeof(this->railtype_map));
 
	this->railtype_map[0] = RAILTYPE_RAIL;
 
	this->railtype_map[1] = RAILTYPE_ELECTRIC;
 
	this->railtype_map[2] = RAILTYPE_MONO;
 
	this->railtype_map[3] = RAILTYPE_MAGLEV;
 

	
 
	/* Copy the initial parameter list
 
	 * 'Uninitialised' parameters are zeroed as that is their default value when dynamically creating them. */
 
	assert_compile(lengthof(newfile->param) == lengthof(config->param) && lengthof(config->param) == 0x80);
 
	memset(newfile->param, 0, sizeof(newfile->param));
 
	assert_compile(lengthof(this->param) == lengthof(config->param) && lengthof(this->param) == 0x80);
 

	
 
	assert(config->num_params <= lengthof(config->param));
 
	newfile->param_end = config->num_params;
 
	if (newfile->param_end > 0) {
 
		MemCpyT(newfile->param, config->param, newfile->param_end);
 
	}
 

	
 
	*_grf_files.Append() = _cur.grffile = newfile;
 
	this->param_end = config->num_params;
 
	if (this->param_end > 0) {
 
		MemCpyT(this->param, config->param, this->param_end);
 
	}
 
}
 

	
 
GRFFile::~GRFFile()
 
{
 
	free(this->filename);
 
	free(this->cargo_list);
 
	free(this->railtype_list);
 
	delete[] this->language_map;
 
}
 

	
 

	
src/newgrf.h
Show inline comments
 
@@ -16,6 +16,7 @@
 
#include "rail_type.h"
 
#include "fileio_type.h"
 
#include "core/bitmath_func.hpp"
 
#include "core/alloc_type.hpp"
 

	
 
/**
 
 * List of different canal 'features'.
 
@@ -98,7 +99,7 @@ struct GRFLabel {
 
};
 

	
 
/** Dynamic data of a loaded NewGRF */
 
struct GRFFile {
 
struct GRFFile : ZeroedMemoryAllocator {
 
	char *filename;
 
	bool is_ottdfile;
 
	uint32 grfid;
 
@@ -138,6 +139,9 @@ struct GRFFile {
 
	uint32 grf_features;                     ///< Bitset of GrfSpecFeature the grf uses
 
	PriceMultipliers price_base_multipliers; ///< Price base multipliers as set by the grf.
 

	
 
	GRFFile(const struct GRFConfig *config);
 
	~GRFFile();
 

	
 
	/** Get GRF Parameter with range checking */
 
	uint32 GetParam(uint number) const
 
	{
0 comments (0 inline, 0 general)