changeset 18241:b9d050ddad0f draft

(svn r23077) -Change: [NewGRF] Enforce that the default cargo type of a vehicle is one of the refittable cargos in case of refittable engines.
author frosch <frosch@openttd.org>
date Tue, 01 Nov 2011 00:29:05 +0000
parents 4ecb22f0d875
children 2eacf17b9ebc
files src/newgrf.cpp
diffstat 1 files changed, 14 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/newgrf.cpp
+++ b/src/newgrf.cpp
@@ -7948,6 +7948,7 @@
 	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 @@
 			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 @@
 			}
 
 			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