Changeset - r23378:505e1384af51
[Not reviewed]
master
0 3 0
Samu - 5 years ago 2019-02-04 00:44:50
dj_samu@hotmail.com
Fix #6633: Cargo monitor industry delivery now accounts for which IndustryID the cargo was delivered to
3 files changed with 16 insertions and 10 deletions:
0 comments (0 inline, 0 general)
src/cargomonitor.cpp
Show inline comments
 
@@ -114,14 +114,15 @@ int32 GetPickupAmount(CargoMonitorID mon
 
 * @param cargo_type type of cargo.
 
 * @param company company delivering the cargo.
 
 * @param amount Amount of cargo delivered.
 
 * @param src_type type of \a src.
 
 * @param src index of source.
 
 * @param st station where the cargo is delivered to.
 
 * @param dest industry index where the cargo is delivered to.
 
 */
 
void AddCargoDelivery(CargoID cargo_type, CompanyID company, uint32 amount, SourceType src_type, SourceID src, const Station *st)
 
void AddCargoDelivery(CargoID cargo_type, CompanyID company, uint32 amount, SourceType src_type, SourceID src, const Station *st, IndustryID dest)
 
{
 
	if (amount == 0) return;
 

	
 
	if (src != INVALID_SOURCE) {
 
		/* Handle pickup update. */
 
		switch (src_type) {
 
@@ -148,12 +149,13 @@ void AddCargoDelivery(CargoID cargo_type
 
	CargoMonitorID num = EncodeCargoTownMonitor(company, cargo_type, st->town->index);
 
	CargoMonitorMap::iterator iter = _cargo_deliveries.find(num);
 
	if (iter != _cargo_deliveries.end()) iter->second += amount;
 

	
 
	/* Industry delivery. */
 
	for (const Industry * const *ip = st->industries_near.Begin(); ip != st->industries_near.End(); ip++) {
 
		if ((*ip)->index != dest) continue;
 
		CargoMonitorID num = EncodeCargoIndustryMonitor(company, cargo_type, (*ip)->index);
 
		CargoMonitorMap::iterator iter = _cargo_deliveries.find(num);
 
		if (iter != _cargo_deliveries.end()) iter->second += amount;
 
	}
 
}
 

	
src/cargomonitor.h
Show inline comments
 
@@ -146,9 +146,9 @@ static inline TownID DecodeMonitorTown(C
 
}
 

	
 
void ClearCargoPickupMonitoring(CompanyID company = INVALID_OWNER);
 
void ClearCargoDeliveryMonitoring(CompanyID company = INVALID_OWNER);
 
int32 GetDeliveryAmount(CargoMonitorID monitor, bool keep_monitoring);
 
int32 GetPickupAmount(CargoMonitorID monitor, bool keep_monitoring);
 
void AddCargoDelivery(CargoID cargo_type, CompanyID company, uint32 amount, SourceType src_type, SourceID src, const Station *st);
 
void AddCargoDelivery(CargoID cargo_type, CompanyID company, uint32 amount, SourceType src_type, SourceID src, const Station *st, IndustryID dest = INVALID_INDUSTRY);
 

	
 
#endif /* CARGOMONITOR_H */
src/economy.cpp
Show inline comments
 
@@ -1027,15 +1027,16 @@ static SmallIndustryList _cargo_delivery
 
 * Transfer goods from station to industry.
 
 * All cargo is delivered to the nearest (Manhattan) industry to the station sign, which is inside the acceptance rectangle and actually accepts the cargo.
 
 * @param st The station that accepted the cargo
 
 * @param cargo_type Type of cargo delivered
 
 * @param num_pieces Amount of cargo delivered
 
 * @param source The source of the cargo
 
 * @param company The company delivering the cargo
 
 * @return actually accepted pieces of cargo
 
 */
 
static uint DeliverGoodsToIndustry(const Station *st, CargoID cargo_type, uint num_pieces, IndustryID source)
 
static uint DeliverGoodsToIndustry(const Station *st, CargoID cargo_type, uint num_pieces, IndustryID source, CompanyID company)
 
{
 
	/* Find the nearest industrytile to the station sign inside the catchment area, whose industry accepts the cargo.
 
	 * This fails in three cases:
 
	 *  1) The station accepts the cargo because there are enough houses around it accepting the cargo.
 
	 *  2) The industries in the catchment area temporarily reject the cargo, and the daily station loop has not yet updated station acceptance.
 
	 *  3) The results of callbacks CBID_INDUSTRY_REFUSE_CARGO and CBID_INDTILE_CARGO_ACCEPTANCE are inconsistent. (documented behaviour)
 
@@ -1062,12 +1063,15 @@ static uint DeliverGoodsToIndustry(const
 

	
 
		uint amount = min(num_pieces, 0xFFFFU - ind->incoming_cargo_waiting[cargo_index]);
 
		ind->incoming_cargo_waiting[cargo_index] += amount;
 
		ind->last_cargo_accepted_at[cargo_index] = _date;
 
		num_pieces -= amount;
 
		accepted += amount;
 

	
 
		/* Update the cargo monitor. */
 
		AddCargoDelivery(cargo_type, company, amount, ST_INDUSTRY, source, st, ind->index);
 
	}
 

	
 
	return accepted;
 
}
 

	
 
/**
 
@@ -1087,36 +1091,36 @@ static Money DeliverGoods(int num_pieces
 
{
 
	assert(num_pieces > 0);
 

	
 
	Station *st = Station::Get(dest);
 

	
 
	/* Give the goods to the industry. */
 
	uint accepted = DeliverGoodsToIndustry(st, cargo_type, num_pieces, src_type == ST_INDUSTRY ? src : INVALID_INDUSTRY);
 
	uint accepted_ind = DeliverGoodsToIndustry(st, cargo_type, num_pieces, src_type == ST_INDUSTRY ? src : INVALID_INDUSTRY, company->index);
 

	
 
	/* If this cargo type is always accepted, accept all */
 
	if (HasBit(st->always_accepted, cargo_type)) accepted = num_pieces;
 
	uint accepted_total = HasBit(st->always_accepted, cargo_type) ? num_pieces : accepted_ind;
 

	
 
	/* Update station statistics */
 
	if (accepted > 0) {
 
	if (accepted_total > 0) {
 
		SetBit(st->goods[cargo_type].status, GoodsEntry::GES_EVER_ACCEPTED);
 
		SetBit(st->goods[cargo_type].status, GoodsEntry::GES_CURRENT_MONTH);
 
		SetBit(st->goods[cargo_type].status, GoodsEntry::GES_ACCEPTED_BIGTICK);
 
	}
 

	
 
	/* Update company statistics */
 
	company->cur_economy.delivered_cargo[cargo_type] += accepted;
 
	company->cur_economy.delivered_cargo[cargo_type] += accepted_total;
 

	
 
	/* Increase town's counter for town effects */
 
	const CargoSpec *cs = CargoSpec::Get(cargo_type);
 
	st->town->received[cs->town_effect].new_act += accepted;
 
	st->town->received[cs->town_effect].new_act += accepted_total;
 

	
 
	/* Determine profit */
 
	Money profit = GetTransportedGoodsIncome(accepted, DistanceManhattan(source_tile, st->xy), days_in_transit, cargo_type);
 
	Money profit = GetTransportedGoodsIncome(accepted_total, DistanceManhattan(source_tile, st->xy), days_in_transit, cargo_type);
 

	
 
	/* Update the cargo monitor. */
 
	AddCargoDelivery(cargo_type, company->index, accepted, src_type, src, st);
 
	AddCargoDelivery(cargo_type, company->index, accepted_total - accepted_ind, src_type, src, st);
 

	
 
	/* Modify profit if a subsidy is in effect */
 
	if (CheckSubsidised(cargo_type, company->index, src_type, src, st))  {
 
		switch (_settings_game.difficulty.subsidy_multiplier) {
 
			case 0:  profit += profit >> 1; break;
 
			case 1:  profit *= 2; break;
0 comments (0 inline, 0 general)