src/order_cmd.cpp
branchcustombridgeheads
changeset 5650 aefc131bf5ce
parent 5649 55c8267c933f
child 6144 5a0ffbf27ced
equal deleted inserted replaced
5649:55c8267c933f 5650:aefc131bf5ce
    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 &&
  1271 			SlObject(order, _order_desc);
  1271 			SlObject(order, _order_desc);
  1272 		}
  1272 		}
  1273 	}
  1273 	}
  1274 }
  1274 }
  1275 
  1275 
  1276 const ChunkHandler _order_chunk_handlers[] = {
  1276 extern const ChunkHandler _order_chunk_handlers[] = {
  1277 	{ 'ORDR', Save_ORDR, Load_ORDR, CH_ARRAY | CH_LAST},
  1277 	{ 'ORDR', Save_ORDR, Load_ORDR, CH_ARRAY | CH_LAST},
  1278 };
  1278 };