36 * |
36 * |
37 */ |
37 */ |
38 Order UnpackOldOrder(uint16 packed) |
38 Order UnpackOldOrder(uint16 packed) |
39 { |
39 { |
40 Order order; |
40 Order order; |
41 order.type = GB(packed, 0, 4); |
41 order.type = (OrderType)GB(packed, 0, 4); |
42 order.flags = GB(packed, 4, 4); |
42 order.flags = GB(packed, 4, 4); |
43 order.dest = GB(packed, 8, 8); |
43 order.dest = GB(packed, 8, 8); |
44 order.next = NULL; |
44 order.next = NULL; |
45 |
45 |
46 order.refit_cargo = CT_NO_REFIT; |
46 order.refit_cargo = CT_NO_REFIT; |
63 * |
63 * |
64 */ |
64 */ |
65 static Order UnpackVersion4Order(uint16 packed) |
65 static Order UnpackVersion4Order(uint16 packed) |
66 { |
66 { |
67 Order order; |
67 Order order; |
68 order.type = GB(packed, 0, 4); |
68 order.type = (OrderType)GB(packed, 0, 4); |
69 order.flags = GB(packed, 4, 4); |
69 order.flags = GB(packed, 4, 4); |
70 order.dest = GB(packed, 8, 8); |
70 order.dest = GB(packed, 8, 8); |
71 order.next = NULL; |
71 order.next = NULL; |
72 order.index = 0; // avoid compiler warning |
72 order.index = 0; // avoid compiler warning |
73 order.refit_cargo = CT_NO_REFIT; |
73 order.refit_cargo = CT_NO_REFIT; |
357 return_cmd_error(STR_0210_TOO_FAR_FROM_PREVIOUS_DESTINATIO); |
357 return_cmd_error(STR_0210_TOO_FAR_FROM_PREVIOUS_DESTINATIO); |
358 } |
358 } |
359 |
359 |
360 if (flags & DC_EXEC) { |
360 if (flags & DC_EXEC) { |
361 Vehicle *u; |
361 Vehicle *u; |
362 Order *new = AllocateOrder(); |
362 Order *new_o = AllocateOrder(); |
363 AssignOrder(new, new_order); |
363 AssignOrder(new_o, new_order); |
364 |
364 |
365 /* Create new order and link in list */ |
365 /* Create new order and link in list */ |
366 if (v->orders == NULL) { |
366 if (v->orders == NULL) { |
367 v->orders = new; |
367 v->orders = new_o; |
368 } else { |
368 } else { |
369 /* Try to get the previous item (we are inserting above the |
369 /* Try to get the previous item (we are inserting above the |
370 selected) */ |
370 selected) */ |
371 Order *order = GetVehicleOrder(v, sel_ord - 1); |
371 Order *order = GetVehicleOrder(v, sel_ord - 1); |
372 |
372 |
373 if (order == NULL && GetVehicleOrder(v, sel_ord) != NULL) { |
373 if (order == NULL && GetVehicleOrder(v, sel_ord) != NULL) { |
374 /* There is no previous item, so we are altering v->orders itself |
374 /* There is no previous item, so we are altering v->orders itself |
375 But because the orders can be shared, we copy the info over |
375 But because the orders can be shared, we copy the info over |
376 the v->orders, so we don't have to change the pointers of |
376 the v->orders, so we don't have to change the pointers of |
377 all vehicles */ |
377 all vehicles */ |
378 SwapOrders(v->orders, new); |
378 SwapOrders(v->orders, new_o); |
379 /* Now update the next pointers */ |
379 /* Now update the next pointers */ |
380 v->orders->next = new; |
380 v->orders->next = new_o; |
381 } else if (order == NULL) { |
381 } else if (order == NULL) { |
382 /* 'sel' is a non-existing order, add him to the end */ |
382 /* 'sel' is a non-existing order, add him to the end */ |
383 order = GetLastVehicleOrder(v); |
383 order = GetLastVehicleOrder(v); |
384 order->next = new; |
384 order->next = new_o; |
385 } else { |
385 } else { |
386 /* Put the new order in between */ |
386 /* Put the new order in between */ |
387 new->next = order->next; |
387 new_o->next = order->next; |
388 order->next = new; |
388 order->next = new_o; |
389 } |
389 } |
390 } |
390 } |
391 |
391 |
392 u = GetFirstVehicleFromSharedList(v); |
392 u = GetFirstVehicleFromSharedList(v); |
393 DeleteOrderWarnings(u); |
393 DeleteOrderWarnings(u); |
614 /* Toggle u->current_order "Full load" flag if it changed. |
614 /* Toggle u->current_order "Full load" flag if it changed. |
615 * However, as the same flag is used for depot orders, check |
615 * However, as the same flag is used for depot orders, check |
616 * whether we are not going to a depot as there are three |
616 * whether we are not going to a depot as there are three |
617 * cases where the full load flag can be active and only |
617 * cases where the full load flag can be active and only |
618 * one case where the flag is used for depot orders. In the |
618 * one case where the flag is used for depot orders. In the |
619 * other cases for the OrderType the flags are not used, |
619 * other cases for the OrderTypeByte the flags are not used, |
620 * so do not care and those orders should not be active |
620 * so do not care and those orders should not be active |
621 * when this function is called. |
621 * when this function is called. |
622 */ |
622 */ |
623 if (sel_ord == u->cur_order_index && |
623 if (sel_ord == u->cur_order_index && |
624 u->current_order.type != OT_GOTO_DEPOT && |
624 u->current_order.type != OT_GOTO_DEPOT && |