summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorsmatz <smatz@openttd.org>2009-07-01 15:08:43 +0000
committersmatz <smatz@openttd.org>2009-07-01 15:08:43 +0000
commit023f78b5ff76b15777d6d7db73adcb9a6673c543 (patch)
treeec2ee7d7bc394445332feea36e76a5b004092ba7 /src
parent927c4a0fe8b836fe88ca0636d2249016501dc9c3 (diff)
downloadopenttd-023f78b5ff76b15777d6d7db73adcb9a6673c543.tar.xz
(svn r16710) -Fix: invalidate subsidies with invalid source or destination when converting older savegames
Diffstat (limited to 'src')
-rw-r--r--src/saveload/afterload.cpp31
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();