diff options
Diffstat (limited to 'src/saveload/afterload.cpp')
-rw-r--r-- | src/saveload/afterload.cpp | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp index afe2060a7..809248faf 100644 --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -31,6 +31,7 @@ #include "../town.h" #include "../economy_base.h" #include "../animated_tile_func.h" +#include "../subsidy_type.h" #include "table/strings.h" @@ -1913,6 +1914,36 @@ bool AfterLoadGame() i++; } } + + /* Delete invalid subsidies possibly present in old versions (but converted to new savegame) */ + for (Subsidy *s = _subsidies; s < endof(_subsidies); s++) { + if (s->cargo_type == CT_INVALID) continue; + if (s->age >= 12) { + /* Station -> Station */ + const Station *from = Station::GetIfValid(s->from); + const Station *to = Station::GetIfValid(s->to); + if (from != NULL && to != NULL && from->owner == to->owner && Company::IsValidID(from->owner)) continue; + } else { + const CargoSpec *cs = GetCargo(s->cargo_type); + switch (cs->town_effect) { + case TE_PASSENGERS: + case TE_MAIL: + /* Town -> Town */ + if (Town::IsValidID(s->from) && Town::IsValidID(s->to)) continue; + break; + case TE_GOODS: + case TE_FOOD: + /* Industry -> Town */ + if (Industry::IsValidID(s->from) && Town::IsValidID(s->to)) continue; + break; + default: + /* Industry -> Industry */ + if (Industry::IsValidID(s->from) && Industry::IsValidID(s->to)) continue; + break; + } + } + s->cargo_type = CT_INVALID; + } } AfterLoadLabelMaps(); |