Mercurial > hg > openttd
changeset 13092:d755cf7553ef draft
(svn r17592) -Fix [FS#3212](r17436): force all cargo being accepted when industry tiles accept it but industry itself doesn't
author | smatz <smatz@openttd.org> |
---|---|
date | Sun, 20 Sep 2009 18:52:12 +0000 |
parents | 5cdcbb26b38c |
children | 696b879cb1b3 |
files | src/economy.cpp src/industry_cmd.cpp src/station_base.h src/tile_cmd.h |
diffstat | 4 files changed, 25 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/src/economy.cpp +++ b/src/economy.cpp @@ -932,7 +932,7 @@ /* Give the goods to the industry. */ uint accepted = DeliverGoodsToIndustry(st, cargo_type, num_pieces, src_type == ST_INDUSTRY ? src : INVALID_INDUSTRY); - /* If there are non-industries around accepting the cargo, accept it all */ + /* If this cargo type is always accepted, accept all */ if (HasBit(st->always_accepted, cargo_type)) accepted = num_pieces; /* Determine profit */
--- a/src/industry_cmd.cpp +++ b/src/industry_cmd.cpp @@ -429,9 +429,30 @@ } } + const Industry *ind = Industry::GetByTile(tile); for (byte i = 0; i < lengthof(itspec->accepts_cargo); i++) { CargoID a = accepts_cargo[i]; - if (a != CT_INVALID) acceptance[a] += cargo_acceptance[i]; + if (a == CT_INVALID) continue; // work only with valid cargos + + /* Add accepted cargo */ + acceptance[a] += cargo_acceptance[i]; + + /* Maybe set 'always accepted' bit (if it's not set already) */ + if (HasBit(*always_accepted, a)) continue; + + bool accepts = false; + for (uint cargo_index = 0; cargo_index < lengthof(ind->accepts_cargo); cargo_index++) { + /* Test whether the industry itself accepts the cargo type */ + if (ind->accepts_cargo[cargo_index] == a) { + accepts = true; + break; + } + } + + if (accepts) continue; + + /* If the industry itself doesn't accept this cargo, set 'always accepted' bit */ + SetBit(*always_accepted, a); } }
--- a/src/station_base.h +++ b/src/station_base.h @@ -85,7 +85,7 @@ byte last_vehicle_type; std::list<Vehicle *> loading_vehicles; GoodsEntry goods[NUM_CARGO]; ///< Goods at this station - uint32 always_accepted; ///< Bitmask of cargos accepted by town houses and headquarters + uint32 always_accepted; ///< Bitmask of always accepted cargo types (by houses, HQs, industry tiles when industry doesn't accept cargo) IndustryVector industries_near; ///< Cached list of industries near the station that can accept cargo, @see DeliverGoodsToIndustry()
--- a/src/tile_cmd.h +++ b/src/tile_cmd.h @@ -80,7 +80,7 @@ * Tile callback function signature for obtaining cargo acceptance of a tile * @param tile Tile queried for its accepted cargo * @param acceptance Storage destination of the cargo acceptance in 1/8 - * @param always_accepted Bitmask of town and headquarters-accepted cargo + * @param always_accepted Bitmask of always accepted cargo types */ typedef void AddAcceptedCargoProc(TileIndex tile, CargoArray &acceptance, uint32 *always_accepted);