diff options
author | rubidium <rubidium@openttd.org> | 2013-02-03 10:06:34 +0000 |
---|---|---|
committer | rubidium <rubidium@openttd.org> | 2013-02-03 10:06:34 +0000 |
commit | f790d70cd62b2a9e4ddf87c20f6a22755bc24881 (patch) | |
tree | 4b7ea1d71d5a35db852ec6c5915eedbc1b0ea0da /src/economy.cpp | |
parent | c7168f09c315795a88b70d5486b2ced6356f0cd4 (diff) | |
download | openttd-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)
Diffstat (limited to 'src/economy.cpp')
-rw-r--r-- | src/economy.cpp | 14 |
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; } } |