changeset 18654:afcb8f4668ab draft

(svn r23502) -Fix (r23143): Vehicle var 42 used a cargo translation table of the wrong GRF.
author frosch <frosch@openttd.org>
date Mon, 12 Dec 2011 19:30:36 +0000
parents a29f6160b4b9
children 327afa314a42
files src/newgrf_engine.cpp src/vehicle_base.h
diffstat 2 files changed, 16 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/src/newgrf_engine.cpp
+++ b/src/newgrf_engine.cpp
@@ -481,7 +481,7 @@
 			}
 			return v->grf_cache.position_same_id_length;
 
-		case 0x42: // Consist cargo information
+		case 0x42: { // Consist cargo information
 			if (!HasBit(v->grf_cache.cache_valid, NCVV_CONSIST_CARGO_INFORMATION)) {
 				const Vehicle *u;
 				byte cargo_classes = 0;
@@ -531,14 +531,22 @@
 					}
 				}
 
-				/* Unlike everywhere else the cargo translation table is only used since grf version 8, not 7. */
-				const GRFFile *grffile = v->GetGRF();
-				uint8 common_bitnum = (common_cargo_type == CT_INVALID) ? 0xFF :
-					(grffile->grf_version < 8) ? CargoSpec::Get(common_cargo_type)->bitnum : grffile->cargo_map[common_cargo_type];
-				v->grf_cache.consist_cargo_information = cargo_classes | (common_bitnum << 8) | (common_subtype << 16) | (user_def_data << 24);
+				/* Note: We have to store the untranslated cargotype in the cache as the cache can be read by different NewGRFs,
+				 *       which will need different translations */
+				v->grf_cache.consist_cargo_information = cargo_classes | (common_cargo_type << 8) | (common_subtype << 16) | (user_def_data << 24);
 				SetBit(v->grf_cache.cache_valid, NCVV_CONSIST_CARGO_INFORMATION);
 			}
-			return v->grf_cache.consist_cargo_information;
+
+			/* The cargo translation is specific to the accessing GRF, and thus cannot be cached. */
+			CargoID common_cargo_type = (v->grf_cache.consist_cargo_information >> 8) & 0xFF;
+
+			/* Unlike everywhere else the cargo translation table is only used since grf version 8, not 7. */
+			const GRFFile *grffile = object->grffile;
+			uint8 common_bitnum = (common_cargo_type == CT_INVALID) ? 0xFF :
+				(grffile->grf_version < 8) ? CargoSpec::Get(common_cargo_type)->bitnum : grffile->cargo_map[common_cargo_type];
+
+			return (v->grf_cache.consist_cargo_information & 0xFFFF00FF) | common_bitnum << 8;
+		}
 
 		case 0x43: // Company information
 			if (!HasBit(v->grf_cache.cache_valid, NCVV_COMPANY_INFORMATION)) {
--- a/src/vehicle_base.h
+++ b/src/vehicle_base.h
@@ -60,7 +60,7 @@
 	/* Values calculated when they are requested for the first time after invalidating the NewGRF cache. */
 	uint32 position_consist_length;   ///< Cache for NewGRF var 40.
 	uint32 position_same_id_length;   ///< Cache for NewGRF var 41.
-	uint32 consist_cargo_information; ///< Cache for NewGRF var 42.
+	uint32 consist_cargo_information; ///< Cache for NewGRF var 42. (Note: The cargotype is untranslated in the cache because the accessing GRF is yet unknown.)
 	uint32 company_information;       ///< Cache for NewGRF var 43.
 	uint8  cache_valid;               ///< Bitset that indicates which cache values are valid.
 };