diff --git a/src/disaster_cmd.cpp b/src/disaster_cmd.cpp --- a/src/disaster_cmd.cpp +++ b/src/disaster_cmd.cpp @@ -1063,6 +1063,22 @@ void StartupDisasters() ResetDisasterDelay(); } +/** Marks all disasters targeting this industry in such a way + * they won't call GetIndustry(v->dest_tile) on invalid industry anymore. + * @param i deleted industry + */ +void ReleaseDisastersTargetingIndustry(IndustryID i) +{ + Vehicle *v; + FOR_ALL_VEHICLES(v) { + /* primary disaster vehicles that have chosen target */ + if (v->type == VEH_DISASTER && (v->subtype == ST_Airplane || v->subtype == ST_Helicopter)) { + /* if it has chosen target, and it is this industry (yes, dest_tile is IndustryID here), set order to "leaving map peacefully" */ + if (v->current_order.GetDestination() > 0 && v->dest_tile == i) v->current_order.SetDestination(3); + } + } +} + void DisasterVehicle::UpdateDeltaXY(Direction direction) { this->x_offs = -1; diff --git a/src/industry.h b/src/industry.h --- a/src/industry.h +++ b/src/industry.h @@ -238,6 +238,8 @@ const IndustryTileSpec *GetIndustryTileS void ResetIndustries(); void PlantRandomFarmField(const Industry *i); +void ReleaseDisastersTargetingIndustry(IndustryID); + /* writable arrays of specs */ extern IndustrySpec _industry_specs[NUM_INDUSTRYTYPES]; extern IndustryTileSpec _industry_tile_specs[NUM_INDUSTRYTILES]; diff --git a/src/industry_cmd.cpp b/src/industry_cmd.cpp --- a/src/industry_cmd.cpp +++ b/src/industry_cmd.cpp @@ -166,6 +166,9 @@ Industry::~Industry() } END_TILE_LOOP(tile_cur, 42, 42, this->xy - TileDiff(21, 21)) } + /* don't let any disaster vehicle target invalid industry */ + ReleaseDisastersTargetingIndustry(this->index); + DecIndustryTypeCount(this->type); DeleteSubsidyWithIndustry(this->index);