summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormichi_cc <michi_cc@openttd.org>2010-09-25 12:48:33 +0000
committermichi_cc <michi_cc@openttd.org>2010-09-25 12:48:33 +0000
commit12133ffb3108d2812ceb197f84b6dbc8c1b33184 (patch)
tree13ad041f0d7c8ccef9e199af07859b560f2291bc
parentfaf5c48533a27ed4a942686c142c4fa490b74e48 (diff)
downloadopenttd-12133ffb3108d2812ceb197f84b6dbc8c1b33184.tar.xz
(svn r20843) -Fix [FS#2534] (r20506): Make sure (gradual) loading is properly terminated for consists with multiple cargo types. Don't stop loading if the timetabled wait is not over yet. (Steve-N)
-rw-r--r--src/economy.cpp18
1 files changed, 14 insertions, 4 deletions
diff --git a/src/economy.cpp b/src/economy.cpp
index 628970b39..6d5f99761 100644
--- a/src/economy.cpp
+++ b/src/economy.cpp
@@ -1158,7 +1158,7 @@ static void LoadUnloadVehicle(Vehicle *v, int *cargo_left)
bool completely_emptied = true;
bool anything_unloaded = false;
bool anything_loaded = false;
- bool full_load_amount = false;
+ uint32 full_load_amount = 0;
uint32 cargo_not_full = 0;
uint32 cargo_full = 0;
@@ -1280,7 +1280,13 @@ static void LoadUnloadVehicle(Vehicle *v, int *cargo_left)
count = cargo_left[v->cargo_type];
cargo_left[v->cargo_type] -= cap;
}
- if (count >= (uint)cap_left) full_load_amount = true;
+
+ /* Store whether the maximum possible load amount was loaded or not.*/
+ if (count >= (uint)cap_left) {
+ SetBit(full_load_amount, v->cargo_type);
+ } else {
+ ClrBit(full_load_amount, v->cargo_type);
+ }
if (v->cargo.Empty()) TriggerVehicle(v, VEHICLE_TRIGGER_NEW_CARGO);
@@ -1342,8 +1348,12 @@ static void LoadUnloadVehicle(Vehicle *v, int *cargo_left)
unloading_time = gradual_loading_wait_time[v->type];
}
- /* We loaded less cargo than possible and it's not full load, stop loading. */
- if (!anything_unloaded && !full_load_amount && !(v->current_order.GetLoadType() & OLFB_FULL_LOAD)) SetBit(u->vehicle_flags, VF_STOP_LOADING);
+ /* We loaded less cargo than possible for all cargo types and it's not full
+ * load and we're not supposed to wait any longer: stop loading. */
+ if (!anything_unloaded && full_load_amount == 0 && !(v->current_order.GetLoadType() & OLFB_FULL_LOAD) &&
+ (!_settings_game.order.timetabling || v->current_order_time >= (uint)max(v->current_order.wait_time - v->lateness_counter, 0))) {
+ SetBit(v->vehicle_flags, VF_STOP_LOADING);
+ }
} else {
bool finished_loading = true;
if (v->current_order.GetLoadType() & OLFB_FULL_LOAD) {