src/order_cmd.cpp
branchNewGRF_ports
changeset 6720 35756db7e577
parent 6719 4cc327ad39d5
child 6743 cabfaa4a0295
--- a/src/order_cmd.cpp	Sat Jun 02 19:59:29 2007 +0000
+++ b/src/order_cmd.cpp	Sat Jul 14 19:42:58 2007 +0000
@@ -18,6 +18,7 @@
 #include "saveload.h"
 #include "vehicle_gui.h"
 #include "cargotype.h"
+#include "strings.h"
 
 /**
  * Called if a new block is added to the order-pool
@@ -48,6 +49,8 @@
 
 	order.refit_cargo   = CT_NO_REFIT;
 	order.refit_subtype = 0;
+	order.wait_time     = 0;
+	order.travel_time   = 0;
 	order.index = 0; // avoid compiler warning
 
 	// Sanity check
@@ -75,6 +78,8 @@
 	order.index = 0; // avoid compiler warning
 	order.refit_cargo   = CT_NO_REFIT;
 	order.refit_subtype = 0;
+	order.wait_time     = 0;
+	order.travel_time   = 0;
 	return order;
 }
 
@@ -85,8 +90,9 @@
  */
 void InvalidateVehicleOrder(const Vehicle *v)
 {
-	InvalidateWindow(WC_VEHICLE_VIEW,   v->index);
-	InvalidateWindow(WC_VEHICLE_ORDERS, v->index);
+	InvalidateWindow(WC_VEHICLE_VIEW,      v->index);
+	InvalidateWindow(WC_VEHICLE_ORDERS,    v->index);
+	InvalidateWindow(WC_VEHICLE_TIMETABLE, v->index);
 }
 
 /**
@@ -127,6 +133,8 @@
 			order->next = NULL;
 			order->refit_cargo   = CT_NO_REFIT;
 			order->refit_subtype = 0;
+			order->wait_time     = 0;
+			order->travel_time   = 0;
 
 			return order;
 		}
@@ -152,6 +160,9 @@
 
 	order->refit_cargo   = data.refit_cargo;
 	order->refit_subtype = data.refit_subtype;
+
+	order->wait_time   = data.wait_time;
+	order->travel_time = data.travel_time;
 }
 
 
@@ -190,7 +201,7 @@
  *                        only the first 8 bits used currently (bit 16 - 23) (max 255)
  * @param p2 packed order to insert
  */
-int32 CmdInsertOrder(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
+CommandCost CmdInsertOrder(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
 	Vehicle *v;
 	VehicleID veh   = GB(p1,  0, 16);
@@ -441,21 +452,21 @@
 		RebuildVehicleLists();
 	}
 
-	return 0;
+	return CommandCost();
 }
 
 /** Declone an order-list
  * @param *dst delete the orders of this vehicle
  * @param flags execution flags
  */
-static int32 DecloneOrder(Vehicle *dst, uint32 flags)
+static CommandCost DecloneOrder(Vehicle *dst, uint32 flags)
 {
 	if (flags & DC_EXEC) {
 		DeleteVehicleOrders(dst);
 		InvalidateVehicleOrder(dst);
 		RebuildVehicleLists();
 	}
-	return 0;
+	return CommandCost();
 }
 
 /**
@@ -483,7 +494,7 @@
  * @param p1 the ID of the vehicle
  * @param p2 the order to delete (max 255)
  */
-int32 CmdDeleteOrder(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
+CommandCost CmdDeleteOrder(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
 	Vehicle *v, *u;
 	VehicleID veh_id = p1;
@@ -554,32 +565,30 @@
 		RebuildVehicleLists();
 	}
 
-	return 0;
+	return CommandCost();
 }
 
-/** Goto next order of order-list.
+/** Goto order of order-list.
  * @param tile unused
  * @param flags operation to perform
  * @param p1 The ID of the vehicle which order is skipped
- * @param p2 unused
+ * @param p2 the selected order to which we want to skip
  */
-int32 CmdSkipOrder(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
+CommandCost CmdSkipToOrder(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
 	Vehicle *v;
 	VehicleID veh_id = p1;
+	VehicleOrderID sel_ord = p2;
 
 	if (!IsValidVehicleID(veh_id)) return CMD_ERROR;
 
 	v = GetVehicle(veh_id);
 
-	if (!CheckOwnership(v->owner)) return CMD_ERROR;
+	if (!CheckOwnership(v->owner) || sel_ord == v->cur_order_index ||
+			sel_ord >= v->num_orders || v->num_orders < 2) return CMD_ERROR;
 
 	if (flags & DC_EXEC) {
-		/* Goto next order */
-		VehicleOrderID b = v->cur_order_index + 1;
-		if (b >= v->num_orders) b = 0;
-
-		v->cur_order_index = b;
+		v->cur_order_index = sel_ord;
 
 		if (v->type == VEH_ROAD) ClearSlot(v);
 
@@ -597,9 +606,94 @@
 	if (v->type == VEH_AIRCRAFT) InvalidateWindowClasses(WC_AIRCRAFT_LIST);
 	if (v->type == VEH_SHIP) InvalidateWindowClasses(WC_SHIPS_LIST);
 
-	return 0;
+	return CommandCost();
 }
 
+/**
+ * Move an order inside the orderlist
+ * @param tile unused
+ * @param p1 the ID of the vehicle
+ * @param p2 order to move and target
+ *           bit 0-15  : the order to move
+ *           bit 16-31 : the target order
+ * @note The target order will move one place down in the orderlist
+ *  if you move the order upwards else it'll move it one place down
+ */
+CommandCost CmdMoveOrder(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
+{
+	VehicleID veh = p1;
+	VehicleOrderID moving_order = GB(p2,  0, 16);
+	VehicleOrderID target_order = GB(p2, 16, 16);
+
+	if (!IsValidVehicleID(veh)) return CMD_ERROR;
+
+	Vehicle *v = GetVehicle(veh);
+	if (!CheckOwnership(v->owner)) return CMD_ERROR;
+
+	/* Don't make senseless movements */
+	if (moving_order >= v->num_orders || target_order >= v->num_orders ||
+			moving_order == target_order || v->num_orders <= 1)
+		return CMD_ERROR;
+
+	Order *moving_one = GetVehicleOrder(v, moving_order);
+	/* Don't move an empty order */
+	if (moving_one == NULL) return CMD_ERROR;
+
+	if (flags & DC_EXEC) {
+		/* Take the moving order out of the pointer-chain */
+		Order *one_before = GetVehicleOrder(v, moving_order - 1);
+		Order *one_past = GetVehicleOrder(v, moving_order + 1);
+
+		if (one_before == NULL) {
+			/* First order edit */
+			v->orders = moving_one->next;
+		} else {
+			one_before->next = moving_one->next;
+		}
+
+		/* Insert the moving_order again in the pointer-chain */
+		one_before = GetVehicleOrder(v, target_order - 1);
+		one_past = GetVehicleOrder(v, target_order);
+
+		moving_one->next = one_past;
+
+		if (one_before == NULL) {
+			/* first order edit */
+			SwapOrders(v->orders, moving_one);
+			v->orders->next = moving_one;
+		} else {
+			one_before->next = moving_one;
+		}
+
+		/* Update shared list */
+		Vehicle *u = GetFirstVehicleFromSharedList(v);
+
+		DeleteOrderWarnings(u);
+
+		for (; u != NULL; u = u->next_shared) {
+			/* Update the first order */
+			if (u->orders != v->orders) u->orders = v->orders;
+
+			/* Update the current order */
+			if (u->cur_order_index == moving_order) {
+				u->cur_order_index = target_order;
+			} else if(u->cur_order_index > moving_order && u->cur_order_index <= target_order) {
+				u->cur_order_index--;
+			} else if(u->cur_order_index < moving_order && u->cur_order_index >= target_order) {
+				u->cur_order_index++;
+			}
+
+			assert(v->orders == u->orders);
+			/* Update any possible open window of the vehicle */
+			InvalidateVehicleOrder(u);
+		}
+
+		/* Make sure to rebuild the whole list */
+		RebuildVehicleLists();
+	}
+
+	return CommandCost();
+}
 
 /** Modify an order in the orderlist of a vehicle.
  * @param tile unused
@@ -611,7 +705,7 @@
  *                        only the first 8 bits used currently (bit 16 - 23) (max 255)
  * @param p2 mode to change the order to (always set)
  */
-int32 CmdModifyOrder(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
+CommandCost CmdModifyOrder(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
 	Vehicle *v;
 	Order *order;
@@ -680,7 +774,7 @@
 		}
 	}
 
-	return 0;
+	return CommandCost();
 }
 
 /** Clone/share/copy an order-list of an other vehicle.
@@ -691,7 +785,7 @@
  * - p1 = (bit 16-31) - source vehicle to clone orders from, if any (none for CO_UNSHARE)
  * @param p2 mode of cloning: CO_SHARE, CO_COPY, or CO_UNSHARE
  */
-int32 CmdCloneOrder(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
+CommandCost CmdCloneOrder(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
 	Vehicle *dst;
 	VehicleID veh_src = GB(p1, 16, 16);
@@ -813,7 +907,7 @@
 		default: return CMD_ERROR;
 	}
 
-	return 0;
+	return CommandCost();
 }
 
 /** Add/remove refit orders from an order
@@ -825,7 +919,7 @@
  *   - bit 8-15 Cargo subtype
  *   - bit 16-23 number of order to modify
  */
-int32 CmdOrderRefit(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
+CommandCost CmdOrderRefit(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
 	const Vehicle *v;
 	Order *order;
@@ -862,7 +956,7 @@
 		}
 	}
 
-	return 0;
+	return CommandCost();
 }
 
 /**
@@ -881,7 +975,8 @@
 	if (!IsCustomName(v->string_id)) {
 		bak->name[0] = '\0';
 	} else {
-		GetName(bak->name, v->string_id & 0x7FF, lastof(bak->name));
+		SetDParam(0, v->index);
+		GetString(bak->name, STR_VEHICLE_NAME, lastof(bak->name));
 	}
 
 	/* If we have shared orders, store it on a special way */
@@ -956,7 +1051,7 @@
  * If we do want to backup/restore it, just add UnitID uid to BackuppedOrders, and
  * restore it as parameter 'y' (ugly hack I know) for example. "v->unitnumber = y;"
  */
-int32 CmdRestoreOrderIndex(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
+CommandCost CmdRestoreOrderIndex(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
 	Vehicle *v;
 	VehicleOrderID cur_ord = GB(p2,  0, 16);
@@ -975,7 +1070,7 @@
 		v->service_interval = serv_int;
 	}
 
-	return 0;
+	return CommandCost();
 }
 
 
@@ -1232,8 +1327,10 @@
 	SLE_VAR(Order, flags, SLE_UINT8),
 	SLE_VAR(Order, dest,  SLE_UINT16),
 	SLE_REF(Order, next,  REF_ORDER),
-	SLE_CONDVAR(Order, refit_cargo,    SLE_UINT8, 36, SL_MAX_VERSION),
-	SLE_CONDVAR(Order, refit_subtype,  SLE_UINT8, 36, SL_MAX_VERSION),
+	SLE_CONDVAR(Order, refit_cargo,    SLE_UINT8,  36, SL_MAX_VERSION),
+	SLE_CONDVAR(Order, refit_subtype,  SLE_UINT8,  36, SL_MAX_VERSION),
+	SLE_CONDVAR(Order, wait_time,      SLE_UINT16, 67, SL_MAX_VERSION),
+	SLE_CONDVAR(Order, travel_time,    SLE_UINT16, 67, SL_MAX_VERSION),
 
 	/* Leftover from the minor savegame version stuff
 	 * We will never use those free bytes, but we have to keep this line to allow loading of old savegames */