diff options
author | frosch <frosch@openttd.org> | 2011-04-16 17:20:08 +0000 |
---|---|---|
committer | frosch <frosch@openttd.org> | 2011-04-16 17:20:08 +0000 |
commit | 204a6b16c34ff6be35f2821001f5b778a44c5da9 (patch) | |
tree | 804dfa0f8bfc139407855b528426bf31a3706956 /src | |
parent | 74069dbda31c7311f2f11b8ac31fa6c927e4b763 (diff) | |
download | openttd-204a6b16c34ff6be35f2821001f5b778a44c5da9.tar.xz |
(svn r22333) -Change: Prefer deleting automatic orders instead of inserting new ones.
Diffstat (limited to 'src')
-rw-r--r-- | src/vehicle.cpp | 44 |
1 files changed, 43 insertions, 1 deletions
diff --git a/src/vehicle.cpp b/src/vehicle.cpp index 94a71da43..5b0b88522 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -1870,7 +1870,49 @@ void Vehicle::BeginLoading() (!prev_order->IsType(OT_AUTOMATIC) && !prev_order->IsType(OT_GOTO_STATION)) || prev_order->GetDestination() != this->last_station_visited) { - if (!suppress_automatic_orders && this->orders.list->GetNumOrders() < MAX_VEH_ORDER_ID && Order::CanAllocateItem()) { + /* Prefer deleting automatic orders instead of inserting new ones, + * so test whether the right order follows later */ + int target_index = this->cur_auto_order_index; + bool found = false; + while (target_index != this->cur_real_order_index) { + const Order *order = this->GetOrder(target_index); + if (order->IsType(OT_AUTOMATIC) && order->GetDestination() == this->last_station_visited) { + found = true; + break; + } + target_index++; + if (target_index >= this->orders.list->GetNumOrders()) target_index = 0; + assert(target_index != this->cur_auto_order_index); // infinite loop? + } + + if (found) { + if (suppress_automatic_orders) { + /* Skip to the found order */ + this->cur_auto_order_index = target_index; + InvalidateVehicleOrder(this, 0); + } else { + /* Delete all automatic orders up to the station we just reached */ + const Order *order = this->GetOrder(this->cur_auto_order_index); + while (!order->IsType(OT_AUTOMATIC) || order->GetDestination() != this->last_station_visited) { + if (order->IsType(OT_AUTOMATIC)) { + /* Delete order effectively deletes order, so get the next before deleting it. */ + order = order->next; + DeleteOrder(this, this->cur_auto_order_index); + } else { + /* Skip non-automatic orders, e.g. service-orders */ + order = order->next; + this->cur_auto_order_index++; + } + + /* Wrap around */ + if (order == NULL) { + order = this->GetOrder(0); + this->cur_auto_order_index = 0; + } + assert(order != NULL); + } + } + } else if (!suppress_automatic_orders && this->orders.list->GetNumOrders() < MAX_VEH_ORDER_ID && Order::CanAllocateItem()) { /* Insert new automatic order */ Order *auto_order = new Order(); auto_order->MakeAutomatic(this->last_station_visited); |