src/order_cmd.cpp
branchNewGRF_ports
changeset 6872 1c4a4a609f85
parent 6871 5a9dc001e1ad
child 6877 889301acc299
--- a/src/order_cmd.cpp	Mon Dec 03 23:39:38 2007 +0000
+++ b/src/order_cmd.cpp	Tue Jan 22 21:00:30 2008 +0000
@@ -6,20 +6,27 @@
 #include "openttd.h"
 #include "order.h"
 #include "airport.h"
-#include "vehicle.h"
 #include "depot.h"
-#include "functions.h"
-#include "table/strings.h"
 #include "waypoint.h"
-#include "command.h"
+#include "command_func.h"
 #include "station.h"
-#include "player.h"
+#include "player_func.h"
 #include "news.h"
 #include "saveload.h"
 #include "vehicle_gui.h"
 #include "cargotype.h"
-#include "strings.h"
 #include "aircraft.h"
+#include "strings_func.h"
+#include "core/alloc_func.hpp"
+#include "functions.h"
+#include "window_func.h"
+#include "settings_type.h"
+#include "string_func.h"
+
+#include "table/strings.h"
+
+TileIndex _backup_orders_tile;
+BackuppedOrders _backup_orders_data;
 
 DEFINE_OLD_POOL_GENERIC(Order, Order)
 
@@ -212,19 +219,19 @@
 			 * non-stop orders (if any) are only valid for trains */
 			switch (new_order.flags) {
 				case 0:
-				case OF_FULL_LOAD:
-				case OF_FULL_LOAD | OF_TRANSFER:
-				case OF_UNLOAD:
-				case OF_UNLOAD | OF_TRANSFER:
-				case OF_TRANSFER:
+				case OFB_FULL_LOAD:
+				case OFB_FULL_LOAD | OFB_TRANSFER:
+				case OFB_UNLOAD:
+				case OFB_UNLOAD | OFB_TRANSFER:
+				case OFB_TRANSFER:
 					break;
 
-				case OF_NON_STOP:
-				case OF_NON_STOP | OF_FULL_LOAD:
-				case OF_NON_STOP | OF_FULL_LOAD | OF_TRANSFER:
-				case OF_NON_STOP | OF_UNLOAD:
-				case OF_NON_STOP | OF_UNLOAD | OF_TRANSFER:
-				case OF_NON_STOP | OF_TRANSFER:
+				case OFB_NON_STOP:
+				case OFB_NON_STOP | OFB_FULL_LOAD:
+				case OFB_NON_STOP | OFB_FULL_LOAD | OFB_TRANSFER:
+				case OFB_NON_STOP | OFB_UNLOAD:
+				case OFB_NON_STOP | OFB_UNLOAD | OFB_TRANSFER:
+				case OFB_NON_STOP | OFB_TRANSFER:
 					if (v->type != VEH_TRAIN) return CMD_ERROR;
 					break;
 
@@ -275,12 +282,12 @@
 			 * order [+ halt] [+ non-stop]
 			 * non-stop orders (if any) are only valid for trains */
 			switch (new_order.flags) {
-				case OF_PART_OF_ORDERS:
-				case OF_PART_OF_ORDERS | OF_HALT_IN_DEPOT:
+				case OFB_PART_OF_ORDERS:
+				case OFB_PART_OF_ORDERS | OFB_HALT_IN_DEPOT:
 					break;
 
-				case OF_NON_STOP | OF_PART_OF_ORDERS:
-				case OF_NON_STOP | OF_PART_OF_ORDERS | OF_HALT_IN_DEPOT:
+				case OFB_NON_STOP | OFB_PART_OF_ORDERS:
+				case OFB_NON_STOP | OFB_PART_OF_ORDERS | OFB_HALT_IN_DEPOT:
 					if (v->type != VEH_TRAIN) return CMD_ERROR;
 					break;
 
@@ -305,7 +312,7 @@
 			switch (new_order.flags) {
 				case 0: break;
 
-				case OF_NON_STOP:
+				case OFB_NON_STOP:
 					if (v->type != VEH_TRAIN) return CMD_ERROR;
 					break;
 
@@ -507,7 +514,7 @@
 			/* 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.type == OT_LOADING &&
-					HasBit(u->current_order.flags, OFB_NON_STOP)) {
+					HasBit(u->current_order.flags, OF_NON_STOP)) {
 				u->current_order.flags = 0;
 			}
 
@@ -549,7 +556,7 @@
 			v->LeaveStation();
 			/* NON-stop flag is misused to see if a train is in a station that is
 			 * on his order list or not */
-			if (HasBit(v->current_order.flags, OFB_NON_STOP)) v->current_order.flags = 0;
+			if (HasBit(v->current_order.flags, OF_NON_STOP)) v->current_order.flags = 0;
 		}
 
 		InvalidateVehicleOrder(v);
@@ -666,7 +673,7 @@
 	VehicleID veh   = GB(p1,  0, 16);
 
 	if (!IsValidVehicleID(veh)) return CMD_ERROR;
-	if (p2 != OFB_FULL_LOAD && p2 != OFB_UNLOAD && p2 != OFB_NON_STOP && p2 != OFB_TRANSFER) return CMD_ERROR;
+	if (p2 != OF_FULL_LOAD && p2 != OF_UNLOAD && p2 != OF_NON_STOP && p2 != OF_TRANSFER) return CMD_ERROR;
 
 	v = GetVehicle(veh);
 
@@ -676,27 +683,27 @@
 	if (sel_ord >= v->num_orders) return CMD_ERROR;
 
 	order = GetVehicleOrder(v, sel_ord);
-	if (order->type != OT_GOTO_STATION &&
-			(order->type != OT_GOTO_DEPOT    || p2 == OFB_UNLOAD) &&
-			(order->type != OT_GOTO_WAYPOINT || p2 != OFB_NON_STOP)) {
+	if ((order->type != OT_GOTO_STATION  || GetStation(order->dest)->IsBuoy()) &&
+			(order->type != OT_GOTO_DEPOT    || p2 == OF_UNLOAD) &&
+			(order->type != OT_GOTO_WAYPOINT || p2 != OF_NON_STOP)) {
 		return CMD_ERROR;
 	}
 
 	if (flags & DC_EXEC) {
 		switch (p2) {
-		case OFB_FULL_LOAD:
-			ToggleBit(order->flags, OFB_FULL_LOAD);
-			if (order->type != OT_GOTO_DEPOT) ClrBit(order->flags, OFB_UNLOAD);
+		case OF_FULL_LOAD:
+			ToggleBit(order->flags, OF_FULL_LOAD);
+			if (order->type != OT_GOTO_DEPOT) ClrBit(order->flags, OF_UNLOAD);
 			break;
-		case OFB_UNLOAD:
-			ToggleBit(order->flags, OFB_UNLOAD);
-			ClrBit(order->flags, OFB_FULL_LOAD);
+		case OF_UNLOAD:
+			ToggleBit(order->flags, OF_UNLOAD);
+			ClrBit(order->flags, OF_FULL_LOAD);
 			break;
-		case OFB_NON_STOP:
-			ToggleBit(order->flags, OFB_NON_STOP);
+		case OF_NON_STOP:
+			ToggleBit(order->flags, OF_NON_STOP);
 			break;
-		case OFB_TRANSFER:
-			ToggleBit(order->flags, OFB_TRANSFER);
+		case OF_TRANSFER:
+			ToggleBit(order->flags, OF_TRANSFER);
 			break;
 		default: NOT_REACHED();
 		}
@@ -719,8 +726,8 @@
 				 */
 				if (sel_ord == u->cur_order_index &&
 						u->current_order.type != OT_GOTO_DEPOT &&
-						HasBit(u->current_order.flags, OFB_FULL_LOAD) != HasBit(order->flags, OFB_FULL_LOAD)) {
-					ToggleBit(u->current_order.flags, OFB_FULL_LOAD);
+						HasBit(u->current_order.flags, OF_FULL_LOAD) != HasBit(order->flags, OF_FULL_LOAD)) {
+					ToggleBit(u->current_order.flags, OF_FULL_LOAD);
 				}
 				InvalidateVehicleOrder(u);
 			}
@@ -902,7 +909,7 @@
 			InvalidateVehicleOrder(u);
 
 			/* If the vehicle already got the current depot set as current order, then update current order as well */
-			if (u->cur_order_index == order_number && HasBit(u->current_order.flags, OFB_PART_OF_ORDERS)) {
+			if (u->cur_order_index == order_number && HasBit(u->current_order.flags, OF_PART_OF_ORDERS)) {
 				u->current_order.refit_cargo = cargo;
 				u->current_order.refit_subtype = subtype;
 			}
@@ -923,18 +930,13 @@
 	/* Make sure we always have freed the stuff */
 	free(bak->order);
 	bak->order = NULL;
+	free(bak->name);
+	bak->name = NULL;
 
 	/* Save general info */
 	bak->orderindex       = v->cur_order_index;
 	bak->service_interval = v->service_interval;
-
-	/* Safe custom string, if any */
-	if (!IsCustomName(v->string_id)) {
-		bak->name[0] = '\0';
-	} else {
-		SetDParam(0, v->index);
-		GetString(bak->name, STR_VEHICLE_NAME, lastof(bak->name));
-	}
+	if (v->name != NULL) bak->name = strdup(v->name);
 
 	/* If we have shared orders, store it on a special way */
 	if (IsOrderListShared(v)) {
@@ -976,14 +978,14 @@
 void RestoreVehicleOrders(const Vehicle *v, const BackuppedOrders *bak)
 {
 	/* If we have a custom name, process that */
-	if (!StrEmpty(bak->name)) {
+	if (bak->name != NULL) {
 		_cmd_text = bak->name;
 		DoCommandP(0, v->index, 0, NULL, CMD_NAME_VEHICLE);
 	}
 
 	/* If we had shared orders, recover that */
 	if (bak->clone != INVALID_VEHICLE) {
-		DoCommandP(0, v->index | (bak->clone << 16), 0, NULL, CMD_CLONE_ORDER);
+		DoCommandP(0, v->index | (bak->clone << 16), CO_SHARE, NULL, CMD_CLONE_ORDER);
 	} else {
 
 		/* CMD_NO_TEST_IF_IN_NETWORK is used here, because CMD_INSERT_ORDER checks if the
@@ -1250,6 +1252,11 @@
 	}
 }
 
+Date GetServiceIntervalClamped(uint index)
+{
+	return (_patches.servint_ispercent) ? Clamp(index, MIN_SERVINT_PERCENT, MAX_SERVINT_PERCENT) : Clamp(index, MIN_SERVINT_DAYS, MAX_SERVINT_DAYS);
+}
+
 /**
  *
  * Check if we share our orders with an other vehicle
@@ -1323,10 +1330,8 @@
 		if (CheckSavegameVersion(5)) {
 			/* Pre-version 5 had an other layout for orders
 			    (uint16 instead of uint32) */
-			uint16 orders[5000];
-
 			len /= sizeof(uint16);
-			assert (len <= lengthof(orders));
+			uint16 *orders = MallocT<uint16>(len + 1);
 
 			SlArray(orders, len, SLE_UINT16);
 
@@ -1334,11 +1339,11 @@
 				Order *order = new (i) Order();
 				AssignOrder(order, UnpackVersion4Order(orders[i]));
 			}
+
+			free(orders);
 		} else if (CheckSavegameVersionOldStyle(5, 2)) {
-			uint32 orders[5000];
-
-			len /= sizeof(uint32);
-			assert (len <= lengthof(orders));
+			len /= sizeof(uint16);
+			uint16 *orders = MallocT<uint16>(len + 1);
 
 			SlArray(orders, len, SLE_UINT32);
 
@@ -1346,6 +1351,8 @@
 				Order *order = new (i) Order();
 				AssignOrder(order, UnpackOrder(orders[i]));
 			}
+
+			free(orders);
 		}
 
 		/* Update all the next pointer */