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