From 44dc83b73fbf0e9832576d62a7e4ef0f1f110b83 Mon Sep 17 00:00:00 2001 From: frosch Date: Mon, 12 Dec 2011 19:30:36 +0000 Subject: (svn r23502) -Fix (r23143): Vehicle var 42 used a cargo translation table of the wrong GRF. --- src/newgrf_engine.cpp | 22 +++++++++++++++------- src/vehicle_base.h | 2 +- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/newgrf_engine.cpp b/src/newgrf_engine.cpp index 5d01aae42..35f6b44c4 100644 --- a/src/newgrf_engine.cpp +++ b/src/newgrf_engine.cpp @@ -481,7 +481,7 @@ static uint32 VehicleGetVariable(Vehicle *v, const ResolverObject *object, byte } 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 @@ static uint32 VehicleGetVariable(Vehicle *v, const ResolverObject *object, byte } } - /* 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)) { diff --git a/src/vehicle_base.h b/src/vehicle_base.h index 5ac7bd540..3a13ec4e7 100644 --- a/src/vehicle_base.h +++ b/src/vehicle_base.h @@ -60,7 +60,7 @@ struct NewGRFCache { /* 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. }; -- cgit v1.2.3-70-g09d2