1 /*
2  * This file is part of OpenTTD.
3  * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
4  * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
5  * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
6  */
7 
8 /** @file order_type.h Types related to orders. */
9 
10 #ifndef ORDER_TYPE_H
11 #define ORDER_TYPE_H
12 
13 #include "core/enum_type.hpp"
14 
15 typedef byte VehicleOrderID;  ///< The index of an order within its current vehicle (not pool related)
16 typedef uint32 OrderID;
17 typedef uint16 OrderListID;
18 typedef uint16 DestinationID;
19 
20 /** Invalid vehicle order index (sentinel) */
21 static const VehicleOrderID INVALID_VEH_ORDER_ID = 0xFF;
22 /** Last valid VehicleOrderID. */
23 static const VehicleOrderID MAX_VEH_ORDER_ID     = INVALID_VEH_ORDER_ID - 1;
24 
25 /** Invalid order (sentinel) */
26 static const OrderID INVALID_ORDER = 0xFFFFFF;
27 
28 /**
29  * Maximum number of orders in implicit-only lists before we start searching
30  * harder for duplicates.
31  */
32 static const uint IMPLICIT_ORDER_ONLY_CAP = 32;
33 
34 /** Order types. It needs to be 8bits, because we save and load it as such */
35 enum OrderType : byte {
36 	OT_BEGIN         = 0,
37 	OT_NOTHING       = 0,
38 	OT_GOTO_STATION  = 1,
39 	OT_GOTO_DEPOT    = 2,
40 	OT_LOADING       = 3,
41 	OT_LEAVESTATION  = 4,
42 	OT_DUMMY         = 5,
43 	OT_GOTO_WAYPOINT = 6,
44 	OT_CONDITIONAL   = 7,
45 	OT_IMPLICIT      = 8,
46 	OT_END
47 };
48 
49 /**
50  * Flags related to the unloading order.
51  */
52 enum OrderUnloadFlags {
53 	OUF_UNLOAD_IF_POSSIBLE = 0,      ///< Unload all cargo that the station accepts.
54 	OUFB_UNLOAD            = 1 << 0, ///< Force unloading all cargo onto the platform, possibly not getting paid.
55 	OUFB_TRANSFER          = 1 << 1, ///< Transfer all cargo onto the platform.
56 	OUFB_NO_UNLOAD         = 1 << 2, ///< Totally no unloading will be done.
57 };
58 
59 /**
60  * Flags related to the loading order.
61  */
62 enum OrderLoadFlags {
63 	OLF_LOAD_IF_POSSIBLE = 0,      ///< Load as long as there is cargo that fits in the train.
64 	OLFB_FULL_LOAD       = 1 << 1, ///< Full load all cargoes of the consist.
65 	OLF_FULL_LOAD_ANY    = 3,      ///< Full load a single cargo of the consist.
66 	OLFB_NO_LOAD         = 4,      ///< Do not load anything.
67 };
68 
69 /**
70  * Non-stop order flags.
71  */
72 enum OrderNonStopFlags {
73 	ONSF_STOP_EVERYWHERE                  = 0, ///< The vehicle will stop at any station it passes and the destination.
74 	ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS = 1, ///< The vehicle will not stop at any stations it passes except the destination.
75 	ONSF_NO_STOP_AT_DESTINATION_STATION   = 2, ///< The vehicle will stop at any station it passes except the destination.
76 	ONSF_NO_STOP_AT_ANY_STATION           = 3, ///< The vehicle will not stop at any stations it passes including the destination.
77 	ONSF_END
78 };
79 
80 /**
81  * Where to stop the trains.
82  */
83 enum OrderStopLocation {
84 	OSL_PLATFORM_NEAR_END = 0, ///< Stop at the near end of the platform
85 	OSL_PLATFORM_MIDDLE   = 1, ///< Stop at the middle of the platform
86 	OSL_PLATFORM_FAR_END  = 2, ///< Stop at the far end of the platform
87 	OSL_END
88 };
89 
90 /**
91  * Reasons that could cause us to go to the depot.
92  */
93 enum OrderDepotTypeFlags {
94 	ODTF_MANUAL          = 0,      ///< Manually initiated order.
95 	ODTFB_SERVICE        = 1 << 0, ///< This depot order is because of the servicing limit.
96 	ODTFB_PART_OF_ORDERS = 1 << 1, ///< This depot order is because of a regular order.
97 };
98 
99 /**
100  * Actions that can be performed when the vehicle enters the depot.
101  */
102 enum OrderDepotActionFlags {
103 	ODATF_SERVICE_ONLY   = 0,      ///< Only service the vehicle.
104 	ODATFB_HALT          = 1 << 0, ///< Service the vehicle and then halt it.
105 	ODATFB_NEAREST_DEPOT = 1 << 1, ///< Send the vehicle to the nearest depot.
106 };
107 DECLARE_ENUM_AS_BIT_SET(OrderDepotActionFlags)
108 
109 /**
110  * Variables (of a vehicle) to 'cause' skipping on.
111  */
112 enum OrderConditionVariable {
113 	OCV_LOAD_PERCENTAGE,    ///< Skip based on the amount of load
114 	OCV_RELIABILITY,        ///< Skip based on the reliability
115 	OCV_MAX_SPEED,          ///< Skip based on the maximum speed
116 	OCV_AGE,                ///< Skip based on the age
117 	OCV_REQUIRES_SERVICE,   ///< Skip when the vehicle requires service
118 	OCV_UNCONDITIONALLY,    ///< Always skip
119 	OCV_REMAINING_LIFETIME, ///< Skip based on the remaining lifetime
120 	OCV_MAX_RELIABILITY,    ///< Skip based on the maximum reliability
121 	OCV_END
122 };
123 
124 /**
125  * Comparator for the skip reasoning.
126  */
127 enum OrderConditionComparator {
128 	OCC_EQUALS,      ///< Skip if both values are equal
129 	OCC_NOT_EQUALS,  ///< Skip if both values are not equal
130 	OCC_LESS_THAN,   ///< Skip if the value is less than the limit
131 	OCC_LESS_EQUALS, ///< Skip if the value is less or equal to the limit
132 	OCC_MORE_THAN,   ///< Skip if the value is more than the limit
133 	OCC_MORE_EQUALS, ///< Skip if the value is more or equal to the limit
134 	OCC_IS_TRUE,     ///< Skip if the variable is true
135 	OCC_IS_FALSE,    ///< Skip if the variable is false
136 	OCC_END
137 };
138 
139 
140 /**
141  * Enumeration for the data to set in #CmdModifyOrder.
142  */
143 enum ModifyOrderFlags {
144 	MOF_NON_STOP,        ///< Passes an OrderNonStopFlags.
145 	MOF_STOP_LOCATION,   ///< Passes an OrderStopLocation.
146 	MOF_UNLOAD,          ///< Passes an OrderUnloadType.
147 	MOF_LOAD,            ///< Passes an OrderLoadType
148 	MOF_DEPOT_ACTION,    ///< Selects the OrderDepotAction
149 	MOF_COND_VARIABLE,   ///< A conditional variable changes.
150 	MOF_COND_COMPARATOR, ///< A comparator changes.
151 	MOF_COND_VALUE,      ///< The value to set the condition to.
152 	MOF_COND_DESTINATION,///< Change the destination of a conditional order.
153 	MOF_END
154 };
155 template <> struct EnumPropsT<ModifyOrderFlags> : MakeEnumPropsT<ModifyOrderFlags, byte, MOF_NON_STOP, MOF_END, MOF_END, 4> {};
156 
157 /**
158  * Depot action to switch to when doing a #MOF_DEPOT_ACTION.
159  */
160 enum OrderDepotAction {
161 	DA_ALWAYS_GO, ///< Always go to the depot
162 	DA_SERVICE,   ///< Service only if needed
163 	DA_STOP,      ///< Go to the depot and stop there
164 	DA_END
165 };
166 
167 /**
168  * Enumeration for the data to set in #CmdChangeTimetable.
169  */
170 enum ModifyTimetableFlags {
171 	MTF_WAIT_TIME,    ///< Set wait time.
172 	MTF_TRAVEL_TIME,  ///< Set travel time.
173 	MTF_TRAVEL_SPEED, ///< Set max travel speed.
174 	MTF_END
175 };
176 template <> struct EnumPropsT<ModifyTimetableFlags> : MakeEnumPropsT<ModifyTimetableFlags, byte, MTF_WAIT_TIME, MTF_END, MTF_END, 2> {};
177 
178 
179 /** Clone actions. */
180 enum CloneOptions {
181 	CO_SHARE   = 0,
182 	CO_COPY    = 1,
183 	CO_UNSHARE = 2
184 };
185 
186 struct Order;
187 struct OrderList;
188 
189 #endif /* ORDER_TYPE_H */
190