summaryrefslogtreecommitdiff
path: root/src/economy.cpp
diff options
context:
space:
mode:
authorsmatz <smatz@openttd.org>2009-08-08 16:42:55 +0000
committersmatz <smatz@openttd.org>2009-08-08 16:42:55 +0000
commit2a430d981f680485b9d4f9e5fab8bc642952b9bf (patch)
treee37f617ae610677d7c92aad77b5f184545599102 /src/economy.cpp
parenteff8cb839072c3aa80d1e54b189810061160669a (diff)
downloadopenttd-2a430d981f680485b9d4f9e5fab8bc642952b9bf.tar.xz
(svn r17113) -Change [FS#265][FS#2094][FS#2589]: apply the subsidy when subsidy's destination is in station's catchment area and cargo packets originate from subsidy's source
-Change [FS#1134]: subsidies aren't bound to stations after awarding anymore, they still apply to town or industry, no matter what station is used for loading and unloading. Awarded subsidies from older savegames are lost -Change [NoAI]: due to these changes, AISubsidy::GetSource and AISubsidy::GetDestination now return STATION_INVALID for awarded subsidies
Diffstat (limited to 'src/economy.cpp')
-rw-r--r--src/economy.cpp43
1 files changed, 19 insertions, 24 deletions
diff --git a/src/economy.cpp b/src/economy.cpp
index 45cab5c59..f8bba522c 100644
--- a/src/economy.cpp
+++ b/src/economy.cpp
@@ -328,11 +328,13 @@ void ChangeOwnershipOfCompanyItems(Owner old_owner, Owner new_owner)
Company::Get(old_owner)->money = UINT64_MAX >> 2; // jackpot ;p
}
- if (new_owner == INVALID_OWNER) {
- Subsidy *s;
- FOR_ALL_SUBSIDIES(s) {
- if (s->IsAwarded() && Station::Get(s->dst)->owner == old_owner) {
- s->cargo_type = CT_INVALID;
+ Subsidy *s;
+ FOR_ALL_SUBSIDIES(s) {
+ if (s->awarded == old_owner) {
+ if (new_owner == INVALID_OWNER) {
+ DeleteSubsidy(s);
+ } else {
+ s->awarded = new_owner;
}
}
}
@@ -916,45 +918,38 @@ static void DeliverGoodsToIndustry(const Station *st, CargoID cargo_type, int nu
/**
* Delivers goods to industries/towns and calculates the payment
* @param num_pieces amount of cargo delivered
- * @param source Originstation of the cargo
* @param dest Station the cargo has been unloaded
* @param source_tile The origin of the cargo for distance calculation
* @param days_in_transit Travel time
* @param company The company delivering the cargo
- * The cargo is just added to the stockpile of the industry. It is due to the caller to trigger the industry's production machinery
+ * @param src_type Type of source of cargo (industry, town, headquarters)
+ * @param src Index of source of cargo
+ * @return Revenue for delivering cargo
+ * @note The cargo is just added to the stockpile of the industry. It is due to the caller to trigger the industry's production machinery
*/
-static Money DeliverGoods(int num_pieces, CargoID cargo_type, StationID source, StationID dest, TileIndex source_tile, byte days_in_transit, Company *company)
+static Money DeliverGoods(int num_pieces, CargoID cargo_type, StationID dest, TileIndex source_tile, byte days_in_transit, Company *company, SourceType src_type, SourceID src)
{
- bool subsidised = false;
-
assert(num_pieces > 0);
/* Update company statistics */
company->cur_economy.delivered_cargo += num_pieces;
SetBit(company->cargo_types, cargo_type);
- const Station *s_to = Station::Get(dest);
-
- if (source != INVALID_STATION) {
- const Station *s_from = Station::Get(source);
-
- /* Check if a subsidy applies. */
- subsidised = CheckSubsidised(s_from, s_to, cargo_type, company->index);
- }
+ const Station *st = Station::Get(dest);
/* Increase town's counter for some special goods types */
const CargoSpec *cs = CargoSpec::Get(cargo_type);
- if (cs->town_effect == TE_FOOD) s_to->town->new_act_food += num_pieces;
- if (cs->town_effect == TE_WATER) s_to->town->new_act_water += num_pieces;
+ if (cs->town_effect == TE_FOOD) st->town->new_act_food += num_pieces;
+ if (cs->town_effect == TE_WATER) st->town->new_act_water += num_pieces;
/* Give the goods to the industry. */
- DeliverGoodsToIndustry(s_to, cargo_type, num_pieces);
+ DeliverGoodsToIndustry(st, cargo_type, num_pieces);
/* Determine profit */
- Money profit = GetTransportedGoodsIncome(num_pieces, DistanceManhattan(source_tile, s_to->xy), days_in_transit, cargo_type);
+ Money profit = GetTransportedGoodsIncome(num_pieces, DistanceManhattan(source_tile, st->xy), days_in_transit, cargo_type);
/* Modify profit if a subsidy is in effect */
- if (subsidised) {
+ 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;
@@ -1051,7 +1046,7 @@ void CargoPayment::PayFinalDelivery(CargoPacket *cp, uint count)
}
/* Handle end of route payment */
- Money profit = DeliverGoods(count, this->ct, cp->source, this->current_station, cp->source_xy, cp->days_in_transit, this->owner);
+ Money profit = DeliverGoods(count, this->ct, this->current_station, cp->source_xy, cp->days_in_transit, this->owner, cp->source_type, cp->source_id);
this->route_profit += profit;
/* The vehicle's profit is whatever route profit there is minus feeder shares. */