Files
@ r5312:ffd375effb01
Branch filter:
Location: cpp/openttd-patchpack/source/order.h - annotation
r5312:ffd375effb01
5.5 KiB
text/x-c
(svn r7468) -Codechange: [win32] Add some comments to MB/WIDE_TO_WIDE/MB_[BUFFER] macros and
use them some more in win32 code. Also for the clipboard use the convert_from_fs
function instead of calling Win32 API directly. Make the static buffers in OTTD2FS
and FS2OTTD the same size (character-length wise)
use them some more in win32 code. Also for the clipboard use the convert_from_fs
function instead of calling Win32 API directly. Make the static buffers in OTTD2FS
and FS2OTTD the same size (character-length wise)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 | r2186:5ee653b1b5e1 r2186:5ee653b1b5e1 r4549:76b9213799ac r2214:59bf23688ead r1024:c7c4672d839e r1024:c7c4672d839e r1024:c7c4672d839e r2159:2c706fe6b0a7 r5216:bdd3aa57475e r1314:8a8968a910c2 r4408:ae655935e525 r4712:ace1fd623579 r4712:ace1fd623579 r4408:ae655935e525 r4408:ae655935e525 r1024:c7c4672d839e r4421:63e05c75add8 r1024:c7c4672d839e r1024:c7c4672d839e r1024:c7c4672d839e r1024:c7c4672d839e r1024:c7c4672d839e r1024:c7c4672d839e r4421:63e05c75add8 r4421:63e05c75add8 r4421:63e05c75add8 r4421:63e05c75add8 r1024:c7c4672d839e r1024:c7c4672d839e r1615:6d516e05db7d r2214:59bf23688ead r2214:59bf23688ead r1530:c89d38477ba0 r2214:59bf23688ead r2214:59bf23688ead r2214:59bf23688ead r2214:59bf23688ead r2214:59bf23688ead r2214:59bf23688ead r2214:59bf23688ead r2214:59bf23688ead r1530:c89d38477ba0 r1530:c89d38477ba0 r2214:59bf23688ead r4344:bff007ae1fd1 r2214:59bf23688ead r2214:59bf23688ead r2214:59bf23688ead r2214:59bf23688ead r1530:c89d38477ba0 r1530:c89d38477ba0 r2214:59bf23688ead r2214:59bf23688ead r2214:59bf23688ead r1024:c7c4672d839e r1024:c7c4672d839e r2214:59bf23688ead r4077:259c4c4aacad r4077:259c4c4aacad r4077:259c4c4aacad r1024:c7c4672d839e r2214:59bf23688ead r2214:59bf23688ead r2214:59bf23688ead r2214:59bf23688ead r2214:59bf23688ead r2214:59bf23688ead r2214:59bf23688ead r1024:c7c4672d839e r1024:c7c4672d839e r1615:6d516e05db7d r1024:c7c4672d839e r1024:c7c4672d839e r1024:c7c4672d839e r1024:c7c4672d839e r1024:c7c4672d839e r1024:c7c4672d839e r1024:c7c4672d839e r1024:c7c4672d839e r4077:259c4c4aacad r4077:259c4c4aacad r4077:259c4c4aacad r4077:259c4c4aacad r1024:c7c4672d839e r4351:04a502e12263 r1024:c7c4672d839e r4389:7f4a6b884ac1 r1024:c7c4672d839e r3173:acfc19891f47 r1024:c7c4672d839e r4392:143d079f55b6 r4712:ace1fd623579 r4712:ace1fd623579 r4712:ace1fd623579 r1024:c7c4672d839e r1024:c7c4672d839e r2433:404fea06bb41 r2433:404fea06bb41 r1024:c7c4672d839e r1024:c7c4672d839e r4391:418e95a851ff r2433:404fea06bb41 r1024:c7c4672d839e r1024:c7c4672d839e r1024:c7c4672d839e r1024:c7c4672d839e r1024:c7c4672d839e r1024:c7c4672d839e r1024:c7c4672d839e r5216:bdd3aa57475e r1314:8a8968a910c2 r5247:1abbd3b3cd80 r4354:95cd3ce6deea r4354:95cd3ce6deea r4354:95cd3ce6deea r5247:1abbd3b3cd80 r4354:95cd3ce6deea r4354:95cd3ce6deea r5247:1abbd3b3cd80 r5247:1abbd3b3cd80 r5247:1abbd3b3cd80 r5247:1abbd3b3cd80 r5247:1abbd3b3cd80 r4354:95cd3ce6deea r4354:95cd3ce6deea r4354:95cd3ce6deea r4346:fa4ac6b6f852 r4346:fa4ac6b6f852 r4346:fa4ac6b6f852 r4346:fa4ac6b6f852 r4346:fa4ac6b6f852 r4346:fa4ac6b6f852 r4346:fa4ac6b6f852 r4346:fa4ac6b6f852 r4384:792750cf5e5e r4384:792750cf5e5e r4384:792750cf5e5e r4384:792750cf5e5e r4384:792750cf5e5e r4384:792750cf5e5e r4977:7eee4b937913 r1314:8a8968a910c2 r1314:8a8968a910c2 r1024:c7c4672d839e r1024:c7c4672d839e r1024:c7c4672d839e r1024:c7c4672d839e r1024:c7c4672d839e r1043:4bce03f32f7e r1024:c7c4672d839e r1314:8a8968a910c2 r4977:7eee4b937913 r1314:8a8968a910c2 r1314:8a8968a910c2 r1024:c7c4672d839e r1024:c7c4672d839e r1024:c7c4672d839e r1024:c7c4672d839e r1024:c7c4672d839e r1024:c7c4672d839e r1024:c7c4672d839e r1024:c7c4672d839e r1093:18f56ef2d029 r1024:c7c4672d839e r1024:c7c4672d839e r1024:c7c4672d839e r1024:c7c4672d839e r1024:c7c4672d839e r1024:c7c4672d839e r1024:c7c4672d839e r1024:c7c4672d839e r4527:4b01e6756ce8 r1024:c7c4672d839e r1024:c7c4672d839e r1024:c7c4672d839e r1024:c7c4672d839e r1024:c7c4672d839e r4351:04a502e12263 r2140:efb49af98a17 r4527:4b01e6756ce8 r1024:c7c4672d839e r1884:a82518e64689 r4780:0ef30790502a r4715:52fbd16444f0 r1024:c7c4672d839e r1024:c7c4672d839e r1024:c7c4672d839e r1024:c7c4672d839e r1796:4bbf4ea0805e r2630:73464cd368d6 r4389:7f4a6b884ac1 r1024:c7c4672d839e r1024:c7c4672d839e r3140:72affb391e90 r1024:c7c4672d839e r1024:c7c4672d839e r1024:c7c4672d839e r2630:73464cd368d6 r1024:c7c4672d839e r1024:c7c4672d839e r1024:c7c4672d839e r1024:c7c4672d839e | /* $Id$ */
/** @file order.h */
#ifndef ORDER_H
#define ORDER_H
#include "macros.h"
#include "oldpool.h"
enum {
INVALID_VEH_ORDER_ID = 0xFF,
INVALID_ORDER = 0xFFFF,
};
/* Order types */
enum OrderTypes {
OT_NOTHING = 0,
OT_GOTO_STATION = 1,
OT_GOTO_DEPOT = 2,
OT_LOADING = 3,
OT_LEAVESTATION = 4,
OT_DUMMY = 5,
OT_GOTO_WAYPOINT = 6,
};
/* It needs to be 8bits, because we save and load it as such */
typedef uint8 OrderType;
/* Order flags -- please use OFB instead OF and use HASBIT/SETBIT/CLEARBIT */
/** Order flag masks - these are for direct bit operations */
enum OrderFlagMasks {
//Flags for stations:
/** vehicle will transfer cargo (i. e. not deliver to nearby industry/town even if accepted there) */
OF_TRANSFER = 0x1,
/** If OF_TRANSFER is not set, drop any cargo loaded. If accepted, deliver, otherwise cargo remains at the station.
* No new cargo is loaded onto the vehicle whatsoever */
OF_UNLOAD = 0x2,
/** Wait for full load of all vehicles, or of at least one cargo type, depending on patch setting
* @todo make this two different flags */
OF_FULL_LOAD = 0x4,
//Flags for depots:
/** The current depot-order was initiated because it was in the vehicle's order list */
OF_PART_OF_ORDERS = 0x2,
/** if OF_PART_OF_ORDERS is not set, this will cause the vehicle to be stopped in the depot */
OF_HALT_IN_DEPOT = 0x4,
/** if OF_PART_OF_ORDERS is set, this will cause the order only be come active if the vehicle needs servicing */
OF_SERVICE_IF_NEEDED = 0x4, //used when OF_PART_OF_ORDERS is set.
//Common flags
/** This causes the vehicle not to stop at intermediate OR the destination station (depending on patch settings)
* @todo make this two different flags */
OF_NON_STOP = 0x8
};
/** Order flags bits - these are for the *BIT macros
* for descrption of flags, see OrderFlagMasks
* @see OrderFlagMasks
*/
enum {
OFB_TRANSFER = 0,
OFB_UNLOAD = 1,
OFB_FULL_LOAD = 2,
OFB_PART_OF_ORDERS = 1,
OFB_HALT_IN_DEPOT = 2,
OFB_SERVICE_IF_NEEDED = 2,
OFB_NON_STOP = 3
};
/* Possible clone options */
enum {
CO_SHARE = 0,
CO_COPY = 1,
CO_UNSHARE = 2
};
/* If you change this, keep in mind that it is saved on 3 places:
* - Load_ORDR, all the global orders
* - Vehicle -> current_order
* - REF_SHEDULE (all REFs are currently limited to 16 bits!!)
*/
typedef struct Order {
OrderType type;
uint8 flags;
DestinationID dest; ///< The destionation of the order.
struct Order *next; ///< Pointer to next order. If NULL, end of list
OrderID index; ///< Index of the order, is not saved or anything, just for reference
CargoID refit_cargo; // Refit CargoID
byte refit_subtype; // Refit subtype
} Order;
#define MAX_BACKUP_ORDER_COUNT 40
typedef struct {
VehicleID clone;
VehicleOrderID orderindex;
Order order[MAX_BACKUP_ORDER_COUNT + 1];
uint16 service_interval;
char name[32];
} BackuppedOrders;
VARDEF TileIndex _backup_orders_tile;
VARDEF BackuppedOrders _backup_orders_data[1];
DECLARE_OLD_POOL(Order, Order, 6, 1000)
static inline VehicleOrderID GetMaxOrderIndex(void)
{
/* TODO - This isn't the real content of the function, but
* with the new pool-system this will be replaced with one that
* _really_ returns the highest index. Now it just returns
* the next safe value we are sure about everything is below.
*/
return GetOrderPoolSize() - 1;
}
static inline VehicleOrderID GetNumOrders(void)
{
return GetOrderPoolSize();
}
/**
* Check if a Order really exists.
*/
static inline bool IsValidOrder(const Order *o)
{
return o->type != OT_NOTHING;
}
static inline void DeleteOrder(Order *o)
{
o->type = OT_NOTHING;
o->next = NULL;
}
#define FOR_ALL_ORDERS_FROM(order, start) for (order = GetOrder(start); order != NULL; order = (order->index + 1U < GetOrderPoolSize()) ? GetOrder(order->index + 1U) : NULL) if (IsValidOrder(order))
#define FOR_ALL_ORDERS(order) FOR_ALL_ORDERS_FROM(order, 0)
#define FOR_VEHICLE_ORDERS(v, order) for (order = v->orders; order != NULL; order = order->next)
static inline bool HasOrderPoolFree(uint amount)
{
const Order *order;
/* There is always room if not all blocks in the pool are reserved */
if (_Order_pool.current_blocks < _Order_pool.max_blocks)
return true;
FOR_ALL_ORDERS(order)
if (order->type == OT_NOTHING)
if (--amount == 0)
return true;
return false;
}
static inline bool IsOrderPoolFull(void)
{
return !HasOrderPoolFree(1);
}
/* Pack and unpack routines */
static inline uint32 PackOrder(const Order *order)
{
return order->dest << 16 | order->flags << 8 | order->type;
}
static inline Order UnpackOrder(uint32 packed)
{
Order order;
order.type = (OrderType)GB(packed, 0, 8);
order.flags = GB(packed, 8, 8);
order.dest = GB(packed, 16, 16);
order.next = NULL;
order.index = 0; // avoid compiler warning
order.refit_cargo = CT_NO_REFIT;
order.refit_subtype = 0;
return order;
}
/* Functions */
void BackupVehicleOrders(const Vehicle *v, BackuppedOrders *order);
void RestoreVehicleOrders(const Vehicle* v, const BackuppedOrders* order);
void RemoveOrderFromAllVehicles(OrderType type, DestinationID destination);
void InvalidateVehicleOrder(const Vehicle *v);
bool VehicleHasDepotOrders(const Vehicle *v);
void CheckOrders(const Vehicle*);
void DeleteVehicleOrders(Vehicle *v);
bool IsOrderListShared(const Vehicle *v);
void AssignOrder(Order *order, Order data);
bool CheckForValidOrders(const Vehicle* v);
Order UnpackOldOrder(uint16 packed);
#endif /* ORDER_H */
|