summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2006-12-26 15:28:11 +0000
committerrubidium <rubidium@openttd.org>2006-12-26 15:28:11 +0000
commitc140ca6f200e48444ccec4320067dd91165d98f0 (patch)
treed978822803398fab14cfb710a8ad0fa321cc8a3b
parentb58c90a07539a15f3f05c5b11ca3bb5ebdda5fe8 (diff)
downloadopenttd-c140ca6f200e48444ccec4320067dd91165d98f0.tar.xz
(svn r7563) -Fix (FS#468): removing towns in the scenario editor could leave subsidies with that town as source/destination, resulting in an assertion when displaying the Subsidies Window.
-rw-r--r--economy.c15
-rw-r--r--economy.h5
-rw-r--r--town_cmd.c1
3 files changed, 18 insertions, 3 deletions
diff --git a/economy.c b/economy.c
index 97fc55c0d..8839d7db1 100644
--- a/economy.c
+++ b/economy.c
@@ -848,6 +848,19 @@ Pair SetupSubsidyDecodeParam(const Subsidy* s, bool mode)
return tp;
}
+void DeleteSubsidyWithTown(TownID index)
+{
+ Subsidy *s;
+
+ for (s = _subsidies; s != endof(_subsidies); s++) {
+ if (s->cargo_type != CT_INVALID && s->age < 12 &&
+ (((s->cargo_type == CT_PASSENGERS || s->cargo_type == CT_MAIL) && (index == s->from || index == s->to)) ||
+ ((s->cargo_type == CT_GOODS || s->cargo_type == CT_FOOD) && index == s->to))) {
+ s->cargo_type = CT_INVALID;
+ }
+ }
+}
+
void DeleteSubsidyWithIndustry(IndustryID index)
{
Subsidy *s;
@@ -855,7 +868,7 @@ void DeleteSubsidyWithIndustry(IndustryID index)
for (s = _subsidies; s != endof(_subsidies); s++) {
if (s->cargo_type != CT_INVALID && s->age < 12 &&
s->cargo_type != CT_PASSENGERS && s->cargo_type != CT_MAIL &&
- (index == s->from || (s->cargo_type!=CT_GOODS && s->cargo_type!=CT_FOOD && index==s->to))) {
+ (index == s->from || (s->cargo_type != CT_GOODS && s->cargo_type != CT_FOOD && index == s->to))) {
s->cargo_type = CT_INVALID;
}
}
diff --git a/economy.h b/economy.h
index e4b8f2afc..823e167c8 100644
--- a/economy.h
+++ b/economy.h
@@ -60,8 +60,9 @@ int UpdateCompanyRatingAndValue(Player *p, bool update);
VARDEF Subsidy _subsidies[MAX_PLAYERS];
Pair SetupSubsidyDecodeParam(const Subsidy* s, bool mode);
-void DeleteSubsidyWithIndustry(uint16 index);
-void DeleteSubsidyWithStation(uint16 index);
+void DeleteSubsidyWithTown(TownID index);
+void DeleteSubsidyWithIndustry(IndustryID index);
+void DeleteSubsidyWithStation(StationID index);
int32 GetTransportedGoodsIncome(uint num_pieces, uint dist, byte transit_days, CargoID cargo_type);
uint MoveGoodsToStation(TileIndex tile, int w, int h, int type, uint amount);
diff --git a/town_cmd.c b/town_cmd.c
index 99a821083..923846369 100644
--- a/town_cmd.c
+++ b/town_cmd.c
@@ -79,6 +79,7 @@ void DestroyTown(Town *t)
}
DeleteName(t->townnametype);
+ DeleteSubsidyWithTown(t->index);
MarkWholeScreenDirty();
}