changeset 6147:a7aecaae3414 draft

(svn r8890) -Codechange: (NewGRF) add cargo translation support to engine var 47
author peter1138 <peter1138@openttd.org>
date Sat, 24 Feb 2007 23:20:21 +0000
parents 97fbbda2bb08
children 4b171c8e99ce
files src/newgrf.cpp src/newgrf.h src/newgrf_engine.cpp
diffstat 3 files changed, 26 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/newgrf.cpp
+++ b/src/newgrf.cpp
@@ -3707,6 +3707,29 @@
 	_cur_grffile->spritegroups_count = 0;
 }
 
+static void BuildCargoTranslationMap()
+{
+	memset(_cur_grffile->cargo_map, 0xFF, sizeof(_cur_grffile->cargo_map));
+
+	for (CargoID c = 0; c < NUM_CARGO; c++) {
+		const CargoSpec *cs = GetCargo(c);
+		if (!cs->IsValid()) continue;
+
+		if (_cur_grffile->cargo_max == 0) {
+			/* Default translation table, so just a straight mapping to bitnum */
+			_cur_grffile->cargo_map[c] = cs->bitnum;
+		} else {
+			/* Check the translation table for this cargo's label */
+			for (uint i = 0; i < _cur_grffile->cargo_max; i++) {
+				if (cs->label == _cur_grffile->cargo_list[i]) {
+					_cur_grffile->cargo_map[c] = i;
+					break;
+				}
+			}
+		}
+	}
+}
+
 static void InitNewGRFFile(const GRFConfig *config, int sprite_offset)
 {
 	GRFFile *newfile;
@@ -4032,6 +4055,7 @@
 			LoadNewGRFFile(c, slot++, stage);
 			if (stage == GLS_ACTIVATION) {
 				ClearTemporaryNewGRFData();
+				BuildCargoTranslationMap();
 				DEBUG(sprite, 2, "Currently %i sprites are loaded", _cur_spriteid);
 			}
 		}
--- a/src/newgrf.h
+++ b/src/newgrf.h
@@ -64,6 +64,7 @@
 
 	uint8 cargo_max;
 	CargoLabel *cargo_list;
+	uint8 cargo_map[NUM_CARGO];
 } GRFFile;
 
 extern GRFFile *_first_grffile;
--- a/src/newgrf_engine.cpp
+++ b/src/newgrf_engine.cpp
@@ -608,7 +608,7 @@
 			 */
 			const CargoSpec *cs = GetCargo(v->cargo_type);
 
-			return (cs->classes << 16) | (cs->weight << 8) | cs->bitnum;
+			return (cs->classes << 16) | (cs->weight << 8) | GetEngineGRF(v->engine_type)->cargo_map[v->cargo_type];
 		}
 
 		case 0x48: return GetVehicleTypeInfo(v->engine_type); /* Vehicle Type Info */