summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2013-02-03 10:06:34 +0000
committerrubidium <rubidium@openttd.org>2013-02-03 10:06:34 +0000
commitf790d70cd62b2a9e4ddf87c20f6a22755bc24881 (patch)
tree4b7ea1d71d5a35db852ec6c5915eedbc1b0ea0da
parentc7168f09c315795a88b70d5486b2ced6356f0cd4 (diff)
downloadopenttd-f790d70cd62b2a9e4ddf87c20f6a22755bc24881.tar.xz
(svn r24962) -Fix [FS#5438]: Reserve all capacity while unloading to avoid 'stealing' cargo, i.e. loading cargo onto a second vehicle when the first can't be fully filled yet (fonsinchen)
-rw-r--r--src/economy.cpp14
1 files changed, 11 insertions, 3 deletions
diff --git a/src/economy.cpp b/src/economy.cpp
index ea59be708..573936ade 100644
--- a/src/economy.cpp
+++ b/src/economy.cpp
@@ -1251,7 +1251,8 @@ static void LoadUnloadVehicle(Vehicle *front, int *cargo_left)
if (_settings_game.order.improved_load && (front->current_order.GetLoadType() & OLFB_FULL_LOAD)) {
/* 'Reserve' this cargo for this vehicle, because we were first. */
for (Vehicle *v = front; v != NULL; v = v->Next()) {
- int cap_left = v->cargo_cap - v->cargo.Count();
+ int cap_left = v->cargo_cap;
+ if (!HasBit(v->vehicle_flags, VF_CARGO_UNLOADING)) cap_left -= v->cargo.Count();
if (cap_left > 0) cargo_left[v->cargo_type] -= cap_left;
}
}
@@ -1568,10 +1569,17 @@ static void LoadUnloadVehicle(Vehicle *front, int *cargo_left)
* If we use autorefit otoh, we only want to load/refit a vehicle if the other wagons cannot already hold the cargo,
* to keep the option to still refit the vehicle when new cargo of different type shows up.
*/
- if (_settings_game.order.improved_load && (front->current_order.GetLoadType() & OLFB_FULL_LOAD) && !use_autorefit) {
+ if (_settings_game.order.improved_load && (front->current_order.GetLoadType() & OLFB_FULL_LOAD)) {
/* Update left cargo */
for (Vehicle *v = front; v != NULL; v = v->Next()) {
- int cap_left = v->cargo_cap - v->cargo.Count();
+ int cap_left = v->cargo_cap;
+ if (!HasBit(v->vehicle_flags, VF_CARGO_UNLOADING)) {
+ if (use_autorefit) {
+ continue;
+ } else {
+ cap_left -= v->cargo.Count();
+ }
+ }
if (cap_left > 0) cargo_left[v->cargo_type] -= cap_left;
}
}