summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorfrosch <frosch@openttd.org>2011-11-01 00:29:05 +0000
committerfrosch <frosch@openttd.org>2011-11-01 00:29:05 +0000
commit1d1c9f44a12b7d11dfedffc70fa1e5be1f64de9b (patch)
treee5f88a8b59bbff6e7cd5885b3de2d2acd6e0a36b /src
parentbe5fffd133b1865586754cfe2b29d0bfb0dba4c9 (diff)
downloadopenttd-1d1c9f44a12b7d11dfedffc70fa1e5be1f64de9b.tar.xz
(svn r23077) -Change: [NewGRF] Enforce that the default cargo type of a vehicle is one of the refittable cargos in case of refittable engines.
Diffstat (limited to 'src')
-rw-r--r--src/newgrf.cpp14
1 files changed, 14 insertions, 0 deletions
diff --git a/src/newgrf.cpp b/src/newgrf.cpp
index 7655d0bad..56d49e1b9 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