From 86107028a491052896161f64bd783e06b1231ee1 Mon Sep 17 00:00:00 2001 From: Niels Martin Hansen Date: Sun, 29 Dec 2019 14:36:45 +0100 Subject: [PATCH] Fix: Allow old NewGRF industries to blank out in/out cargo slots (#7882) --- src/industry_cmd.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/industry_cmd.cpp b/src/industry_cmd.cpp index c6602b0877..628e335570 100644 --- a/src/industry_cmd.cpp +++ b/src/industry_cmd.cpp @@ -1822,6 +1822,11 @@ static void DoCreateNewIndustry(Industry *i, TileIndex tile, IndustryType type, break; } CargoID cargo = GetCargoTranslation(GB(res, 0, 8), indspec->grf_prop.grffile); + /* Industries without "unlimited" cargo types support depend on the specific order/slots of cargo types. + * They need to be able to blank out specific slots without aborting the callback sequence, + * and solve this by returning undefined cargo indexes. Skip these. */ + if (cargo == CT_INVALID && !(indspec->behaviour & INDUSTRYBEH_CARGOTYPES_UNLIMITED)) continue; + /* Verify valid cargo */ if (std::find(indspec->accepts_cargo, endof(indspec->accepts_cargo), cargo) == endof(indspec->accepts_cargo)) { /* Cargo not in spec, error in NewGRF */ ErrorUnknownCallbackResult(indspec->grf_prop.grffile->grfid, CBID_INDUSTRY_INPUT_CARGO_TYPES, res); @@ -1849,6 +1854,9 @@ static void DoCreateNewIndustry(Industry *i, TileIndex tile, IndustryType type, break; } CargoID cargo = GetCargoTranslation(GB(res, 0, 8), indspec->grf_prop.grffile); + /* Allow older GRFs to skip slots. */ + if (cargo == CT_INVALID && !(indspec->behaviour & INDUSTRYBEH_CARGOTYPES_UNLIMITED)) continue; + /* Verify valid cargo */ if (std::find(indspec->produced_cargo, endof(indspec->produced_cargo), cargo) == endof(indspec->produced_cargo)) { /* Cargo not in spec, error in NewGRF */ ErrorUnknownCallbackResult(indspec->grf_prop.grffile->grfid, CBID_INDUSTRY_OUTPUT_CARGO_TYPES, res);