From 1d1c9f44a12b7d11dfedffc70fa1e5be1f64de9b Mon Sep 17 00:00:00 2001 From: frosch Date: Tue, 1 Nov 2011 00:29:05 +0000 Subject: [PATCH] (svn r23077) -Change: [NewGRF] Enforce that the default cargo type of a vehicle is one of the refittable cargos in case of refittable engines. --- src/newgrf.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/newgrf.cpp b/src/newgrf.cpp index 7655d0bad8..56d49e1b9c 100644 --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -7948,6 +7948,7 @@ static void CalculateRefitMasks() FOR_ALL_ENGINES(e) { EngineID engine = e->index; EngineInfo *ei = &e->info; + bool only_defaultcargo; ///< Set if the vehicle shall carry only the default cargo /* Did the newgrf specify any refitting? If not, use defaults. */ if (_gted[engine].refitmask_valid) { @@ -7955,6 +7956,10 @@ static void CalculateRefitMasks() uint32 not_mask = 0; uint32 xor_mask = 0; + /* If the original masks set by the grf are zero, the vehicle shall only carry the default cargo. + * Note: After applying the translations, the vehicle may end up carrying no defined cargo. It becomes unavailable in that case. */ + only_defaultcargo = (ei->refit_mask == 0 && _gted[engine].cargo_allowed == 0); + if (ei->refit_mask != 0) { const GRFFile *file = _gted[engine].refitmask_grf; if (file == NULL) file = e->GetGRF(); @@ -8005,6 +8010,15 @@ static void CalculateRefitMasks() } ei->refit_mask = xor_mask & _cargo_mask; + + /* If the mask is zero, the vehicle shall only carry the default cargo */ + only_defaultcargo = (ei->refit_mask == 0); + } + + /* Ensure that the vehicle is either not refittable, or that the default cargo is one of the refittable cargos. + * Note: Vehicles refittable to no cargo are handle differently to vehicle refittable to a single cargo. The latter might have subtypes. */ + if (!only_defaultcargo && ei->cargo_type != CT_INVALID && !HasBit(ei->refit_mask, ei->cargo_type)) { + ei->cargo_type = CT_INVALID; } /* Check if this engine's cargo type is valid. If not, set to the first refittable