diff options
author | celestar <celestar@openttd.org> | 2007-01-15 14:42:24 +0000 |
---|---|---|
committer | celestar <celestar@openttd.org> | 2007-01-15 14:42:24 +0000 |
commit | 05b783e551102127f1e48aa579a58b9a1ec8fabb (patch) | |
tree | cad841bb152e6112359e6b75928562e7161a7c26 /src/economy.cpp | |
parent | 3b22cfe70d743cde8c268d415f311a0de4e630ea (diff) | |
download | openttd-05b783e551102127f1e48aa579a58b9a1ec8fabb.tar.xz |
(svn r8144) -Fix: [FS#163] When a station is removed, vehicles do not get excessive payment any longer, as the origin TILE is now stored as long as the origin STATION for the transported cargos. Basically this is only a temporary fix until cargopackets are implemented, but it fixes one of the oldest known bugs (Special Thanks to Darkvater for lots of testing)
Diffstat (limited to 'src/economy.cpp')
-rw-r--r-- | src/economy.cpp | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/src/economy.cpp b/src/economy.cpp index 4006fc059..a1a63ee1e 100644 --- a/src/economy.cpp +++ b/src/economy.cpp @@ -1213,7 +1213,7 @@ static bool CheckSubsidised(Station *from, Station *to, CargoID cargo_type) return false; } -static int32 DeliverGoods(int num_pieces, CargoID cargo_type, StationID source, StationID dest, byte days_in_transit) +static int32 DeliverGoods(int num_pieces, CargoID cargo_type, StationID source, StationID dest, TileIndex source_tile, byte days_in_transit) { bool subsidised; Station *s_from, *s_to; @@ -1243,7 +1243,7 @@ static int32 DeliverGoods(int num_pieces, CargoID cargo_type, StationID source, DeliverGoodsToIndustry(s_to->xy, cargo_type, num_pieces); // Determine profit - profit = GetTransportedGoodsIncome(num_pieces, DistanceManhattan(s_from->xy, s_to->xy), days_in_transit, cargo_type); + 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) { @@ -1376,7 +1376,7 @@ int LoadUnloadVehicle(Vehicle *v, bool just_arrived) unloading_time += v->cargo_count; /* TTDBUG: bug in original TTD */ if (just_arrived && !HASBIT(v->load_status, LS_CARGO_PAID_FOR)) { - profit += DeliverGoods(v->cargo_count, v->cargo_type, v->cargo_source, last_visited, v->cargo_days); + profit += DeliverGoods(v->cargo_count, v->cargo_type, v->cargo_source, last_visited, v->cargo_source_xy, v->cargo_days); SETBIT(v->load_status, LS_CARGO_PAID_FOR); } result |= 1; @@ -1388,7 +1388,7 @@ int LoadUnloadVehicle(Vehicle *v, bool just_arrived) if (just_arrived && (u->current_order.flags & OF_TRANSFER) && !HASBIT(v->load_status, LS_CARGO_PAID_FOR)) { v_profit = GetTransportedGoodsIncome( v->cargo_count, - DistanceManhattan(GetStation(v->cargo_source)->xy, GetStation(last_visited)->xy), + DistanceManhattan(v->cargo_source_xy, GetStation(last_visited)->xy), v->cargo_days, v->cargo_type) * 3 / 2; @@ -1402,12 +1402,15 @@ int LoadUnloadVehicle(Vehicle *v, bool just_arrived) // No goods waiting at station ge->enroute_time = v->cargo_days; ge->enroute_from = v->cargo_source; + ge->enroute_from_xy = v->cargo_source_xy; } else { // Goods already waiting at station. Set counters to the worst value. - if (v->cargo_days >= ge->enroute_time) - ge->enroute_time = v->cargo_days; - if (last_visited != ge->enroute_from) + if (v->cargo_days >= ge->enroute_time) ge->enroute_time = v->cargo_days; + + if (last_visited != ge->enroute_from) { ge->enroute_from = v->cargo_source; + ge->enroute_from_xy = v->cargo_source_xy; + } } // Update amount of waiting cargo SB(ge->waiting_acceptance, 0, 12, min(amount_unloaded + t, 0xFFF)); @@ -1451,8 +1454,7 @@ int LoadUnloadVehicle(Vehicle *v, bool just_arrived) int cargoshare; int feeder_profit_share; - if (v->cargo_count == 0) - TriggerVehicle(v, VEHICLE_TRIGGER_NEW_CARGO); + if (v->cargo_count == 0) TriggerVehicle(v, VEHICLE_TRIGGER_NEW_CARGO); /* Skip loading this vehicle if another train/vehicle is already handling * the same cargo type at this station */ @@ -1482,6 +1484,7 @@ int LoadUnloadVehicle(Vehicle *v, bool just_arrived) // And record the source of the cargo, and the days in travel. v->cargo_source = ge->enroute_from; + v->cargo_source_xy = ge->enroute_from_xy; v->cargo_days = ge->enroute_time; result |= 2; st->last_vehicle_type = v->type; |