Mercurial > hg > openttd
changeset 12001:2dd20683fcbb draft
(svn r16407) -Fix [FS#2913]: set CargoPacket::source to INVALID_STATION when source station is deleted
author | smatz <smatz@openttd.org> |
---|---|
date | Sat, 23 May 2009 19:43:09 +0000 |
parents | 432a32fa1746 |
children | f625db21b8e2 |
files | src/economy.cpp src/saveload/afterload.cpp src/station.cpp |
diffstat | 3 files changed, 23 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- a/src/economy.cpp +++ b/src/economy.cpp @@ -1016,9 +1016,7 @@ */ static Money DeliverGoods(int num_pieces, CargoID cargo_type, StationID source, StationID dest, TileIndex source_tile, byte days_in_transit, SmallIndustryList *industry_set) { - bool subsidised; - Station *s_from, *s_to; - Money profit; + bool subsidised = false; assert(num_pieces > 0); @@ -1029,12 +1027,14 @@ SetBit(c->cargo_types, cargo_type); } - /* Get station pointers. */ - s_from = Station::Get(source); - s_to = Station::Get(dest); + const Station *s_to = Station::Get(dest); - /* Check if a subsidy applies. */ - subsidised = CheckSubsidised(s_from, s_to, cargo_type); + if (source != INVALID_STATION) { + const Station *s_from = Station::Get(source); + + /* Check if a subsidy applies. */ + subsidised = CheckSubsidised(s_from, s_to, cargo_type); + } /* Increase town's counter for some special goods types */ const CargoSpec *cs = GetCargo(cargo_type); @@ -1045,7 +1045,7 @@ DeliverGoodsToIndustry(s_to, cargo_type, num_pieces, industry_set); /* Determine profit */ - profit = GetTransportedGoodsIncome(num_pieces, DistanceManhattan(source_tile, s_to->xy), days_in_transit, cargo_type); + Money profit = GetTransportedGoodsIncome(num_pieces, DistanceManhattan(source_tile, s_to->xy), days_in_transit, cargo_type); /* Modify profit if a subsidy is in effect */ if (subsidised) {
--- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -1275,6 +1275,14 @@ } } + if (CheckSavegameVersion(120)) { + /* CargoPacket's source should be either INVALID_STATION or a valid station */ + CargoPacket *cp; + FOR_ALL_CARGOPACKETS(cp) { + if (!Station::IsValidID(cp->source)) cp->source = INVALID_STATION; + } + } + /* Buoys do now store the owner of the previous water tile, which can never * be OWNER_NONE. So replace OWNER_NONE with OWNER_WATER. */ if (CheckSavegameVersion(46)) {
--- a/src/station.cpp +++ b/src/station.cpp @@ -101,6 +101,12 @@ for (CargoID c = 0; c < NUM_CARGO; c++) { goods[c].cargo.Truncate(0); } + + CargoPacket *cp; + FOR_ALL_CARGOPACKETS(cp) { + /* Don't allow cargo packets with invalid source station */ + if (cp->source == this->index) cp->source = INVALID_STATION; + } }