summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/order_base.h3
-rw-r--r--src/order_cmd.cpp56
-rw-r--r--src/order_gui.cpp34
3 files changed, 43 insertions, 50 deletions
diff --git a/src/order_base.h b/src/order_base.h
index b592aa2d5..b0c77b956 100644
--- a/src/order_base.h
+++ b/src/order_base.h
@@ -28,6 +28,7 @@ private:
friend const struct SaveLoad *GetOrderDescription(); ///< Saving and loading of orders.
OrderTypeByte type; ///< The type of order
+ uint8 flags; ///< 'Sub'type of order
DestinationID dest; ///< The destination of the order.
CargoID refit_cargo; ///< Refit CargoID
@@ -36,8 +37,6 @@ private:
public:
Order *next; ///< Pointer to next order. If NULL, end of list
- uint8 flags; ///< 'Sub'type of order
-
uint16 wait_time; ///< How long in ticks to wait at the destination.
uint16 travel_time; ///< How long in ticks the journey to this destination should take.
diff --git a/src/order_cmd.cpp b/src/order_cmd.cpp
index 0f974f8aa..a864d554d 100644
--- a/src/order_cmd.cpp
+++ b/src/order_cmd.cpp
@@ -302,10 +302,12 @@ CommandCost CmdInsertOrder(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
default: return CMD_ERROR;
}
+ if (new_order.GetNonStopType() != OFB_NO_NON_STOP && v->type != VEH_TRAIN) return CMD_ERROR;
+
/* Order flags can be any of the following for stations:
* [full-load | unload] [+ transfer] [+ non-stop]
* non-stop orders (if any) are only valid for trains */
- switch (new_order.flags) {
+ switch (new_order.GetLoadType() | new_order.GetUnloadType()) {
case 0:
case OFB_FULL_LOAD:
case OFB_FULL_LOAD | OFB_TRANSFER:
@@ -314,15 +316,6 @@ CommandCost CmdInsertOrder(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
case OFB_TRANSFER:
break;
- 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;
-
default: return CMD_ERROR;
}
break;
@@ -364,19 +357,16 @@ CommandCost CmdInsertOrder(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
}
}
+ if (new_order.GetNonStopType() != OFB_NO_NON_STOP && v->type != VEH_TRAIN) return CMD_ERROR;
+
/* Order flags can be any of the following for depots:
* order [+ halt] [+ non-stop]
* non-stop orders (if any) are only valid for trains */
- switch (new_order.flags) {
+ switch (new_order.GetDepotOrderType() | new_order.GetDepotActionType()) {
case OFB_PART_OF_ORDERS:
case OFB_PART_OF_ORDERS | OFB_HALT_IN_DEPOT:
break;
- 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;
-
default: return CMD_ERROR;
}
break;
@@ -768,21 +758,25 @@ CommandCost CmdModifyOrder(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
if (flags & DC_EXEC) {
switch (p2) {
- case OF_FULL_LOAD:
- ToggleBit(order->flags, OF_FULL_LOAD);
- if (!order->IsType(OT_GOTO_DEPOT)) ClrBit(order->flags, OF_UNLOAD);
- break;
- case OF_UNLOAD:
- ToggleBit(order->flags, OF_UNLOAD);
- ClrBit(order->flags, OF_FULL_LOAD);
- break;
- case OF_NON_STOP:
- ToggleBit(order->flags, OF_NON_STOP);
- break;
- case OF_TRANSFER:
- ToggleBit(order->flags, OF_TRANSFER);
- break;
- default: NOT_REACHED();
+ case OF_FULL_LOAD:
+ if (order->IsType(OT_GOTO_DEPOT)) {
+ order->SetDepotOrderType(order->GetDepotOrderType() ^ OFB_SERVICE_IF_NEEDED);
+ } else {
+ order->SetLoadType(order->GetUnloadType() ^ OFB_FULL_LOAD);
+ order->SetUnloadType(order->GetUnloadType() & ~OFB_UNLOAD);
+ }
+ break;
+ case OF_UNLOAD:
+ order->SetUnloadType(order->GetUnloadType() ^ OFB_UNLOAD);
+ order->SetLoadType(0);
+ break;
+ case OF_NON_STOP:
+ order->SetNonStopType(order->GetNonStopType() ^ OFB_NON_STOP);
+ break;
+ case OF_TRANSFER:
+ order->SetUnloadType(order->GetUnloadType() ^ OFB_TRANSFER);
+ break;
+ default: NOT_REACHED();
}
/* Update the windows and full load flags, also for vehicles that share the same order list */
diff --git a/src/order_gui.cpp b/src/order_gui.cpp
index 5b89299aa..de929eac2 100644
--- a/src/order_gui.cpp
+++ b/src/order_gui.cpp
@@ -91,22 +91,22 @@ static int GetOrderFromOrderWndPt(Window *w, int y, const Vehicle *v)
return (sel <= v->num_orders && sel >= 0) ? sel : INVALID_ORDER;
}
-static StringID StationOrderStrings[] = {
- STR_8806_GO_TO,
- STR_GO_TO_TRANSFER,
- STR_8807_GO_TO_UNLOAD,
- STR_GO_TO_TRANSFER_UNLOAD,
- STR_8808_GO_TO_LOAD,
- STR_GO_TO_TRANSFER_LOAD,
- STR_NULL,
- STR_NULL,
- STR_880A_GO_NON_STOP_TO,
- STR_GO_TO_NON_STOP_TRANSFER,
- STR_880B_GO_NON_STOP_TO_UNLOAD,
- STR_GO_TO_NON_STOP_TRANSFER_UNLOAD,
- STR_880C_GO_NON_STOP_TO_LOAD,
- STR_GO_TO_NON_STOP_TRANSFER_LOAD,
- STR_NULL
+static StringID _station_order_strings[][7] = {
+ {
+ STR_8806_GO_TO,
+ STR_GO_TO_TRANSFER,
+ STR_8807_GO_TO_UNLOAD,
+ STR_GO_TO_TRANSFER_UNLOAD,
+ STR_8808_GO_TO_LOAD,
+ STR_GO_TO_TRANSFER_LOAD
+ }, {
+ STR_880A_GO_NON_STOP_TO,
+ STR_GO_TO_NON_STOP_TRANSFER,
+ STR_880B_GO_NON_STOP_TO_UNLOAD,
+ STR_GO_TO_NON_STOP_TRANSFER_UNLOAD,
+ STR_880C_GO_NON_STOP_TO_LOAD,
+ STR_GO_TO_NON_STOP_TRANSFER_LOAD
+ }
};
static void DrawOrdersWindow(Window *w)
@@ -201,7 +201,7 @@ static void DrawOrdersWindow(Window *w)
break;
case OT_GOTO_STATION:
- SetDParam(1, StationOrderStrings[order->flags]);
+ SetDParam(1, _station_order_strings[!!order->GetNonStopType()][order->GetLoadType() | order->GetUnloadType()]);
SetDParam(2, order->GetDestination());
break;