mirror of https://github.com/OpenTTD/OpenTTD
Fix #6633: Cargo monitor industry delivery now accounts for which IndustryID the cargo was delivered to
parent
cbaf52fbe1
commit
780593ae60
|
@ -117,8 +117,9 @@ int32 GetPickupAmount(CargoMonitorID monitor, bool keep_monitoring)
|
||||||
* @param src_type type of \a src.
|
* @param src_type type of \a src.
|
||||||
* @param src index of source.
|
* @param src index of source.
|
||||||
* @param st station where the cargo is delivered to.
|
* @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 (amount == 0) return;
|
||||||
|
|
||||||
|
@ -151,6 +152,7 @@ void AddCargoDelivery(CargoID cargo_type, CompanyID company, uint32 amount, Sour
|
||||||
|
|
||||||
/* Industry delivery. */
|
/* Industry delivery. */
|
||||||
for (const Industry * const *ip = st->industries_near.Begin(); ip != st->industries_near.End(); ip++) {
|
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);
|
CargoMonitorID num = EncodeCargoIndustryMonitor(company, cargo_type, (*ip)->index);
|
||||||
CargoMonitorMap::iterator iter = _cargo_deliveries.find(num);
|
CargoMonitorMap::iterator iter = _cargo_deliveries.find(num);
|
||||||
if (iter != _cargo_deliveries.end()) iter->second += amount;
|
if (iter != _cargo_deliveries.end()) iter->second += amount;
|
||||||
|
|
|
@ -149,6 +149,6 @@ void ClearCargoPickupMonitoring(CompanyID company = INVALID_OWNER);
|
||||||
void ClearCargoDeliveryMonitoring(CompanyID company = INVALID_OWNER);
|
void ClearCargoDeliveryMonitoring(CompanyID company = INVALID_OWNER);
|
||||||
int32 GetDeliveryAmount(CargoMonitorID monitor, bool keep_monitoring);
|
int32 GetDeliveryAmount(CargoMonitorID monitor, bool keep_monitoring);
|
||||||
int32 GetPickupAmount(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 */
|
#endif /* CARGOMONITOR_H */
|
||||||
|
|
|
@ -1030,9 +1030,10 @@ static SmallIndustryList _cargo_delivery_destinations;
|
||||||
* @param cargo_type Type of cargo delivered
|
* @param cargo_type Type of cargo delivered
|
||||||
* @param num_pieces Amount of cargo delivered
|
* @param num_pieces Amount of cargo delivered
|
||||||
* @param source The source of the cargo
|
* @param source The source of the cargo
|
||||||
|
* @param company The company delivering the cargo
|
||||||
* @return actually accepted pieces of 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.
|
/* Find the nearest industrytile to the station sign inside the catchment area, whose industry accepts the cargo.
|
||||||
* This fails in three cases:
|
* This fails in three cases:
|
||||||
|
@ -1065,6 +1066,9 @@ static uint DeliverGoodsToIndustry(const Station *st, CargoID cargo_type, uint n
|
||||||
ind->last_cargo_accepted_at[cargo_index] = _date;
|
ind->last_cargo_accepted_at[cargo_index] = _date;
|
||||||
num_pieces -= amount;
|
num_pieces -= amount;
|
||||||
accepted += amount;
|
accepted += amount;
|
||||||
|
|
||||||
|
/* Update the cargo monitor. */
|
||||||
|
AddCargoDelivery(cargo_type, company, amount, ST_INDUSTRY, source, st, ind->index);
|
||||||
}
|
}
|
||||||
|
|
||||||
return accepted;
|
return accepted;
|
||||||
|
@ -1090,30 +1094,30 @@ static Money DeliverGoods(int num_pieces, CargoID cargo_type, StationID dest, Ti
|
||||||
Station *st = Station::Get(dest);
|
Station *st = Station::Get(dest);
|
||||||
|
|
||||||
/* Give the goods to the industry. */
|
/* 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 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 */
|
/* 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_EVER_ACCEPTED);
|
||||||
SetBit(st->goods[cargo_type].status, GoodsEntry::GES_CURRENT_MONTH);
|
SetBit(st->goods[cargo_type].status, GoodsEntry::GES_CURRENT_MONTH);
|
||||||
SetBit(st->goods[cargo_type].status, GoodsEntry::GES_ACCEPTED_BIGTICK);
|
SetBit(st->goods[cargo_type].status, GoodsEntry::GES_ACCEPTED_BIGTICK);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Update company statistics */
|
/* 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 */
|
/* Increase town's counter for town effects */
|
||||||
const CargoSpec *cs = CargoSpec::Get(cargo_type);
|
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 */
|
/* 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. */
|
/* 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 */
|
/* Modify profit if a subsidy is in effect */
|
||||||
if (CheckSubsidised(cargo_type, company->index, src_type, src, st)) {
|
if (CheckSubsidised(cargo_type, company->index, src_type, src, st)) {
|
||||||
|
|
Loading…
Reference in New Issue