Mercurial > hg > openttd
changeset 16868:6f39950083d8 draft
(svn r21602) -Codechange: split actual adding/removing of orders to/from a vehicle's order list from the validation of those (user) commands. Based on patch by fonsinchen
author | rubidium <rubidium@openttd.org> |
---|---|
date | Wed, 22 Dec 2010 21:16:34 +0000 |
parents | b7a2b1958d0e |
children | 63f8b6eeb72c |
files | src/order_base.h src/order_cmd.cpp |
diffstat | 2 files changed, 100 insertions(+), 79 deletions(-) [+] |
line wrap: on
line diff
--- a/src/order_base.h +++ b/src/order_base.h @@ -254,6 +254,9 @@ void ConvertFromOldSavegame(); }; +void InsertOrder(Vehicle *v, Order *new_o, VehicleOrderID sel_ord); +void DeleteOrder(Vehicle *v, VehicleOrderID sel_ord); + /** * Shared order list linking together the linked list of orders and the list * of vehicles sharing this order list.
--- a/src/order_cmd.cpp +++ b/src/order_cmd.cpp @@ -663,56 +663,66 @@ if (flags & DC_EXEC) { Order *new_o = new Order(); new_o->AssignOrder(new_order); - - /* Create new order and link in list */ - if (v->orders.list == NULL) { - v->orders.list = new OrderList(new_o, v); - } else { - v->orders.list->InsertOrderAt(new_o, sel_ord); - } - - Vehicle *u = v->FirstShared(); - DeleteOrderWarnings(u); - for (; u != NULL; u = u->NextShared()) { - assert(v->orders.list == u->orders.list); - - /* If there is added an order before the current one, we need - to update the selected order */ - if (sel_ord <= u->cur_order_index) { - uint cur = u->cur_order_index + 1; - /* Check if we don't go out of bound */ - if (cur < u->GetNumOrders()) { - u->cur_order_index = cur; - } - } - /* Update any possible open window of the vehicle */ - InvalidateVehicleOrder(u, INVALID_VEH_ORDER_ID | (sel_ord << 8)); - } - - /* As we insert an order, the order to skip to will be 'wrong'. */ - VehicleOrderID cur_order_id = 0; - Order *order; - FOR_VEHICLE_ORDERS(v, order) { - if (order->IsType(OT_CONDITIONAL)) { - VehicleOrderID order_id = order->GetConditionSkipToOrder(); - if (order_id >= sel_ord) { - order->SetConditionSkipToOrder(order_id + 1); - } - if (order_id == cur_order_id) { - order->SetConditionSkipToOrder((order_id + 1) % v->GetNumOrders()); - } - } - cur_order_id++; - } - - /* Make sure to rebuild the whole list */ - InvalidateWindowClassesData(GetWindowClassForVehicleType(v->type), 0); + InsertOrder(v, new_o, sel_ord); } return CommandCost(); } /** + * Insert a new order but skip the validation. + * @param v The vehicle to insert the order to. + * @param new_o The new order. + * @param sel_ord The position the order should be inserted at. + */ +void InsertOrder(Vehicle *v, Order *new_o, VehicleOrderID sel_ord) +{ + /* Create new order and link in list */ + if (v->orders.list == NULL) { + v->orders.list = new OrderList(new_o, v); + } else { + v->orders.list->InsertOrderAt(new_o, sel_ord); + } + + Vehicle *u = v->FirstShared(); + DeleteOrderWarnings(u); + for (; u != NULL; u = u->NextShared()) { + assert(v->orders.list == u->orders.list); + + /* If there is added an order before the current one, we need + * to update the selected order */ + if (sel_ord <= u->cur_order_index) { + uint cur = u->cur_order_index + 1; + /* Check if we don't go out of bound */ + if (cur < u->GetNumOrders()) { + u->cur_order_index = cur; + } + } + /* Update any possible open window of the vehicle */ + InvalidateVehicleOrder(u, INVALID_VEH_ORDER_ID | (sel_ord << 8)); + } + + /* As we insert an order, the order to skip to will be 'wrong'. */ + VehicleOrderID cur_order_id = 0; + Order *order; + FOR_VEHICLE_ORDERS(v, order) { + if (order->IsType(OT_CONDITIONAL)) { + VehicleOrderID order_id = order->GetConditionSkipToOrder(); + if (order_id >= sel_ord) { + order->SetConditionSkipToOrder(order_id + 1); + } + if (order_id == cur_order_id) { + order->SetConditionSkipToOrder((order_id + 1) % v->GetNumOrders()); + } + } + cur_order_id++; + } + + /* Make sure to rebuild the whole list */ + InvalidateWindowClassesData(GetWindowClassForVehicleType(v->type), 0); +} + +/** * Declone an order-list * @param *dst delete the orders of this vehicle * @param flags execution flags @@ -755,48 +765,56 @@ order = v->GetOrder(sel_ord); if (order == NULL) return CMD_ERROR; - if (flags & DC_EXEC) { - v->orders.list->DeleteOrderAt(sel_ord); + if (flags & DC_EXEC) DeleteOrder(v, sel_ord); + return CommandCost(); +} - Vehicle *u = v->FirstShared(); - DeleteOrderWarnings(u); - for (; u != NULL; u = u->NextShared()) { - if (sel_ord < u->cur_order_index) u->cur_order_index--; - - assert(v->orders.list == u->orders.list); +/** + * Delete an order but skip the parameter validation. + * @param v The vehicle to delete the order from. + * @param sel_ord The id of the order to be deleted. + */ +void DeleteOrder(Vehicle *v, VehicleOrderID sel_ord) +{ + v->orders.list->DeleteOrderAt(sel_ord); - /* NON-stop flag is misused to see if a train is in a station that is - * on his order list or not */ - if (sel_ord == u->cur_order_index && u->current_order.IsType(OT_LOADING)) { - u->current_order.SetNonStopType(ONSF_STOP_EVERYWHERE); - /* When full loading, "cancel" that order so the vehicle doesn't - * stay indefinitely at this station anymore. */ - if (u->current_order.GetLoadType() & OLFB_FULL_LOAD) u->current_order.SetLoadType(OLF_LOAD_IF_POSSIBLE); - } + Vehicle *u = v->FirstShared(); + DeleteOrderWarnings(u); + for (; u != NULL; u = u->NextShared()) { + if (sel_ord < u->cur_order_index) u->cur_order_index--; + + assert(v->orders.list == u->orders.list); - /* Update any possible open window of the vehicle */ - InvalidateVehicleOrder(u, sel_ord | (INVALID_VEH_ORDER_ID << 8)); + /* NON-stop flag is misused to see if a train is in a station that is + * on his order list or not */ + if (sel_ord == u->cur_order_index && u->current_order.IsType(OT_LOADING)) { + u->current_order.SetNonStopType(ONSF_STOP_EVERYWHERE); + /* When full loading, "cancel" that order so the vehicle doesn't + * stay indefinitely at this station anymore. */ + if (u->current_order.GetLoadType() & OLFB_FULL_LOAD) u->current_order.SetLoadType(OLF_LOAD_IF_POSSIBLE); } - /* As we delete an order, the order to skip to will be 'wrong'. */ - VehicleOrderID cur_order_id = 0; - FOR_VEHICLE_ORDERS(v, order) { - if (order->IsType(OT_CONDITIONAL)) { - VehicleOrderID order_id = order->GetConditionSkipToOrder(); - if (order_id >= sel_ord) { - order->SetConditionSkipToOrder(max(order_id - 1, 0)); - } - if (order_id == cur_order_id) { - order->SetConditionSkipToOrder((order_id + 1) % v->GetNumOrders()); - } - } - cur_order_id++; - } - - InvalidateWindowClassesData(GetWindowClassForVehicleType(v->type), 0); + /* Update any possible open window of the vehicle */ + InvalidateVehicleOrder(u, sel_ord | (INVALID_VEH_ORDER_ID << 8)); } - return CommandCost(); + /* As we delete an order, the order to skip to will be 'wrong'. */ + VehicleOrderID cur_order_id = 0; + Order *order = NULL; + FOR_VEHICLE_ORDERS(v, order) { + if (order->IsType(OT_CONDITIONAL)) { + VehicleOrderID order_id = order->GetConditionSkipToOrder(); + if (order_id >= sel_ord) { + order->SetConditionSkipToOrder(max(order_id - 1, 0)); + } + if (order_id == cur_order_id) { + order->SetConditionSkipToOrder((order_id + 1) % v->GetNumOrders()); + } + } + cur_order_id++; + } + + InvalidateWindowClassesData(GetWindowClassForVehicleType(v->type), 0); } /**