--- 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 */