Changeset - r11076:462de50d5ea7
[Not reviewed]
master
0 6 0
peter1138 - 16 years ago 2009-02-08 18:11:06
peter1138@openttd.org
(svn r15417) -Codechange: Add default rail type labels and support for per-GRF translation table.
6 files changed with 83 insertions and 2 deletions:
0 comments (0 inline, 0 general)
src/newgrf.cpp
Show inline comments
 
@@ -479,6 +479,17 @@ static ChangeInfoResult RailVehicleChang
 
			case 0x05: { // Track type
 
				uint8 tracktype = grf_load_byte(&buf);
 

	
 
				if (tracktype < _cur_grffile->railtype_max) {
 
					RailType railtype = GetRailTypeByLabel(_cur_grffile->railtype_list[tracktype]);
 
					if (railtype == INVALID_RAILTYPE) {
 
						/* Rail type is not available, so disable this engine */
 
						ei[i].climates = 0x80;
 
					} else {
 
						rvi[i].railtype = railtype;
 
					}
 
					break;
 
				}
 

	
 
				switch (tracktype) {
 
					case 0: rvi->railtype = rvi->engclass >= 2 ? RAILTYPE_ELECTRIC : RAILTYPE_RAIL; break;
 
					case 1: rvi->railtype = RAILTYPE_MONO; break;
 
@@ -610,8 +621,13 @@ static ChangeInfoResult RailVehicleChang
 
				} else {
 
					break;
 
				}
 
				if (rvi->railtype == RAILTYPE_RAIL     && engclass >= EC_ELECTRIC) rvi->railtype = RAILTYPE_ELECTRIC;
 
				if (rvi->railtype == RAILTYPE_ELECTRIC && engclass  < EC_ELECTRIC) rvi->railtype = RAILTYPE_RAIL;
 

	
 
				if (_cur_grffile->railtype_max == 0) {
 
					/* Use traction type to select between normal and electrified
 
					 * rail only when no translation list is in place. */
 
					if (rvi->railtype == RAILTYPE_RAIL     && engclass >= EC_ELECTRIC) rvi->railtype = RAILTYPE_ELECTRIC;
 
					if (rvi->railtype == RAILTYPE_ELECTRIC && engclass  < EC_ELECTRIC) rvi->railtype = RAILTYPE_RAIL;
 
				}
 

	
 
				rvi->engclass = engclass;
 
			} break;
 
@@ -1749,6 +1765,12 @@ static ChangeInfoResult GlobalVarChangeI
 
				buf += 8;
 
				break;
 

	
 
			case 0x12: // Rail type translation table
 
				/* This is loaded during the reservation stage, so just skip it here. */
 
				/* Each entry is 4 bytes. */
 
				buf += 4;
 
				break;
 

	
 
			default:
 
				ret = CIR_UNKNOWN;
 
				break;
 
@@ -1810,6 +1832,23 @@ static ChangeInfoResult GlobalVarReserve
 
				break;
 
			}
 

	
 
			case 0x12: { // Rail type translation table
 
				if (i == 0) {
 
					if (gvid != 0) {
 
						grfmsg(1, "ReserveChangeInfo: Rail type translation table must start at zero");
 
						return CIR_INVALID_ID;
 
					}
 

	
 
					free(_cur_grffile->railtype_list);
 
					_cur_grffile->railtype_max = numinfo;
 
					_cur_grffile->railtype_list = MallocT<RailTypeLabel>(numinfo);
 
				}
 

	
 
				RailTypeLabel rtl = grf_load_dword(&buf);
 
				_cur_grffile->railtype_list[i] = BSWAP32(rtl);
 
				break;
 
			}
 

	
 
			default:
 
				ret = CIR_UNKNOWN;
 
				break;
src/newgrf.h
Show inline comments
 
@@ -10,6 +10,7 @@
 
#include "cargotype.h"
 
#include "industry_type.h"
 
#include "station_type.h"
 
#include "rail_type.h"
 

	
 
enum GrfLoadingStage {
 
	GLS_FILESCAN,
 
@@ -98,6 +99,9 @@ struct GRFFile {
 
	uint8 cargo_max;
 
	CargoLabel *cargo_list;
 
	uint8 cargo_map[NUM_CARGO];
 

	
 
	uint8 railtype_max;
 
	RailTypeLabel *railtype_list;
 
};
 

	
 
extern GRFFile *_first_grffile;
src/rail.cpp
Show inline comments
 
@@ -207,3 +207,15 @@ RailTypes GetCompanyRailtypes(CompanyID 
 

	
 
	return rt;
 
}
 

	
 
RailType GetRailTypeByLabel(RailTypeLabel label)
 
{
 
	/* Loop through each rail type until the label is found */
 
	for (RailType r = RAILTYPE_BEGIN; r != RAILTYPE_END; r++) {
 
		const RailtypeInfo *rti = GetRailTypeInfo(r);
 
		if (rti->label == label) return r;
 
	}
 

	
 
	/* No matching label was found, so it is invalid */
 
	return INVALID_RAILTYPE;
 
}
src/rail.h
Show inline comments
 
@@ -132,6 +132,11 @@ struct RailtypeInfo {
 
	 * Cost multiplier for building this rail type
 
	 */
 
	uint8 cost_multiplier;
 

	
 
	/**
 
	 * Unique 32 bit rail type identifier
 
	 */
 
	RailTypeLabel label;
 
};
 

	
 

	
 
@@ -255,6 +260,13 @@ RailType GetBestRailtype(const CompanyID
 
RailTypes GetCompanyRailtypes(const CompanyID c);
 

	
 
/**
 
 * Get the rail type for a given label.
 
 * @param label the railtype label.
 
 * @return the railtype.
 
 */
 
RailType GetRailTypeByLabel(RailTypeLabel label);
 

	
 
/**
 
 * Reset all rail type information to its default values.
 
 */
 
void ResetRailTypes();
src/rail_type.h
Show inline comments
 
@@ -7,6 +7,8 @@
 

	
 
#include "core/enum_type.hpp"
 

	
 
typedef uint32 RailTypeLabel;
 

	
 
/**
 
 * Enumeration for all possible railtypes.
 
 *
src/table/railtypes.h
Show inline comments
 
@@ -73,6 +73,9 @@ static const RailtypeInfo _original_rail
 

	
 
		/* cost multiplier */
 
		8,
 

	
 
		/* rail type label */
 
		'RAIL',
 
	},
 

	
 
	/** Electrified railway */
 
@@ -142,6 +145,9 @@ static const RailtypeInfo _original_rail
 

	
 
		/* cost multiplier */
 
		12,
 

	
 
		/* rail type label */
 
		'ELRL',
 
	},
 

	
 
	/** Monorail */
 
@@ -207,6 +213,9 @@ static const RailtypeInfo _original_rail
 

	
 
		/* cost multiplier */
 
		16,
 

	
 
		/* rail type label */
 
		'MONO',
 
	},
 

	
 
	/** Maglev */
 
@@ -272,6 +281,9 @@ static const RailtypeInfo _original_rail
 

	
 
		/* cost multiplier */
 
		24,
 

	
 
		/* rail type label */
 
		'MGLV',
 
	},
 
};
 

	
0 comments (0 inline, 0 general)