changeset 11076:3ce92d721ce1 draft

(svn r15417) -Codechange: Add default rail type labels and support for per-GRF translation table.
author peter1138 <peter1138@openttd.org>
date Sun, 08 Feb 2009 18:11:06 +0000
parents adc269893bd0
children b2dc6e897ede
files src/newgrf.cpp src/newgrf.h src/rail.cpp src/rail.h src/rail_type.h src/table/railtypes.h
diffstat 6 files changed, 83 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/newgrf.cpp
+++ b/src/newgrf.cpp
@@ -479,6 +479,17 @@
 			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 @@
 				} 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 @@
 				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 @@
 				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;
--- a/src/newgrf.h
+++ b/src/newgrf.h
@@ -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 @@
 	uint8 cargo_max;
 	CargoLabel *cargo_list;
 	uint8 cargo_map[NUM_CARGO];
+
+	uint8 railtype_max;
+	RailTypeLabel *railtype_list;
 };
 
 extern GRFFile *_first_grffile;
--- a/src/rail.cpp
+++ b/src/rail.cpp
@@ -207,3 +207,15 @@
 
 	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;
+}
--- a/src/rail.h
+++ b/src/rail.h
@@ -132,6 +132,11 @@
 	 * Cost multiplier for building this rail type
 	 */
 	uint8 cost_multiplier;
+
+	/**
+	 * Unique 32 bit rail type identifier
+	 */
+	RailTypeLabel label;
 };
 
 
@@ -255,6 +260,13 @@
 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();
--- a/src/rail_type.h
+++ b/src/rail_type.h
@@ -7,6 +7,8 @@
 
 #include "core/enum_type.hpp"
 
+typedef uint32 RailTypeLabel;
+
 /**
  * Enumeration for all possible railtypes.
  *
--- a/src/table/railtypes.h
+++ b/src/table/railtypes.h
@@ -73,6 +73,9 @@
 
 		/* cost multiplier */
 		8,
+
+		/* rail type label */
+		'RAIL',
 	},
 
 	/** Electrified railway */
@@ -142,6 +145,9 @@
 
 		/* cost multiplier */
 		12,
+
+		/* rail type label */
+		'ELRL',
 	},
 
 	/** Monorail */
@@ -207,6 +213,9 @@
 
 		/* cost multiplier */
 		16,
+
+		/* rail type label */
+		'MONO',
 	},
 
 	/** Maglev */
@@ -272,6 +281,9 @@
 
 		/* cost multiplier */
 		24,
+
+		/* rail type label */
+		'MGLV',
 	},
 };