truelight@1024: #ifndef ORDER_H truelight@1024: #define ORDER_H truelight@1024: truelight@1024: /* Order types */ truelight@1024: enum { truelight@1024: OT_NOTHING = 0, truelight@1024: OT_GOTO_STATION = 1, truelight@1024: OT_GOTO_DEPOT = 2, truelight@1024: OT_LOADING = 3, truelight@1024: OT_LEAVESTATION = 4, truelight@1024: OT_DUMMY = 5, truelight@1024: OT_GOTO_WAYPOINT = 6 truelight@1024: }; truelight@1024: truelight@1024: /* Order flags -- please use OFB instead OF and use HASBIT/SETBIT/CLEARBIT */ truelight@1024: enum { truelight@1024: OF_UNLOAD = 0x2, truelight@1024: OF_FULL_LOAD = 0x4, // Also used when to force an aircraft into a depot truelight@1024: OF_NON_STOP = 0x8 truelight@1024: }; truelight@1024: truelight@1024: /* Order flags bits */ truelight@1024: enum { truelight@1024: OFB_UNLOAD = 1, truelight@1024: OFB_FULL_LOAD = 2, truelight@1024: OFB_NON_STOP = 3 truelight@1024: }; truelight@1024: truelight@1024: /* Possible clone options */ truelight@1024: enum { truelight@1024: CO_SHARE = 0, truelight@1024: CO_COPY = 1, truelight@1024: CO_UNSHARE = 2 truelight@1024: }; truelight@1024: celestar@1053: /* Modes for the order checker */ celestar@1053: enum { celestar@1053: OC_INIT = 0, //the order checker can initialize a news message celestar@1053: OC_VALIDATE = 1, //the order checker validates a news message celestar@1053: }; celestar@1053: truelight@1024: /* If you change this, keep in mind that it is saved on 3 places: truelight@1024: - Load_ORDR, all the global orders truelight@1024: - Vehicle -> current_order truelight@1024: - REF_SHEDULE (all REFs are currently limited to 16 bits!!) */ truelight@1024: typedef struct Order { truelight@1024: uint8 type; truelight@1024: uint8 flags; truelight@1024: uint16 station; truelight@1024: truelight@1024: struct Order *next; //! Pointer to next order. If NULL, end of list truelight@1024: truelight@1024: uint16 index; //! Index of the order, is not saved or anything, just for reference truelight@1024: } Order; truelight@1024: truelight@1024: typedef struct { truelight@1024: VehicleID clone; truelight@1024: byte orderindex; truelight@1024: Order order[41]; truelight@1024: uint16 service_interval; truelight@1024: char name[32]; truelight@1024: } BackuppedOrders; truelight@1024: truelight@1024: VARDEF TileIndex _backup_orders_tile; truelight@1024: VARDEF BackuppedOrders _backup_orders_data[1]; truelight@1024: truelight@1024: VARDEF Order _orders[5000]; truelight@1024: VARDEF uint32 _orders_size; truelight@1024: truelight@1024: static inline Order *GetOrder(uint index) truelight@1024: { truelight@1024: assert(index < _orders_size); truelight@1024: return &_orders[index]; truelight@1024: } truelight@1024: truelight@1024: #define FOR_ALL_ORDERS_FROM(o, from) for(o = GetOrder(from); o != &_orders[_orders_size]; o++) truelight@1024: #define FOR_ALL_ORDERS(o) FOR_ALL_ORDERS_FROM(o, 0) truelight@1024: truelight@1024: #define FOR_VEHICLE_ORDERS(v, order) for (order = v->orders; order != NULL; order = order->next) truelight@1024: truelight@1024: static inline bool HasOrderPoolFree(uint amount) truelight@1024: { truelight@1043: const Order *order; truelight@1024: truelight@1024: FOR_ALL_ORDERS(order) truelight@1024: if (order->type == OT_NOTHING) truelight@1024: if (--amount == 0) truelight@1024: return true; truelight@1024: truelight@1024: return false; truelight@1024: } truelight@1024: tron@1093: static inline bool IsOrderPoolFull(void) truelight@1024: { truelight@1024: return !HasOrderPoolFree(1); truelight@1024: } truelight@1024: truelight@1024: /* Pack and unpack routines */ truelight@1024: truelight@1024: static inline uint32 PackOrder(const Order *order) truelight@1024: { truelight@1024: return order->station << 16 | order->flags << 8 | order->type; truelight@1024: } truelight@1024: truelight@1024: static inline Order UnpackOrder(uint32 packed) truelight@1024: { truelight@1024: Order order; truelight@1024: order.type = (packed & 0x000000FF); truelight@1024: order.flags = (packed & 0x0000FF00) >> 8; truelight@1024: order.station = (packed & 0xFFFF0000) >> 16; truelight@1024: order.next = NULL; truelight@1024: return order; truelight@1024: } truelight@1024: truelight@1024: /* Functions */ truelight@1024: void BackupVehicleOrders(Vehicle *v, BackuppedOrders *order); truelight@1024: void RestoreVehicleOrders(Vehicle *v, BackuppedOrders *order); truelight@1024: void DeleteDestinationFromVehicleOrder(Order dest); truelight@1024: void InvalidateVehicleOrder(const Vehicle *v); truelight@1024: bool VehicleHasDepotOrders(const Vehicle *v); celestar@1053: bool CheckOrders(uint data_a, uint data_b); truelight@1024: void DeleteVehicleOrders(Vehicle *v); truelight@1024: bool IsOrderListShared(const Vehicle *v); truelight@1024: void AssignOrder(Order *order, Order data); truelight@1024: bool CheckForValidOrders(Vehicle *v); truelight@1024: truelight@1024: Order UnpackVersion4Order(uint16 packed); truelight@1024: Order UnpackOldOrder(uint16 packed); truelight@1024: truelight@1024: #endif /* ORDER_H */