Move Order::cargo_type_flags into a separately allocated object.
Change savegame format, add a new chunk for cargo_type_flags.
This commit is contained in:
@@ -28,6 +28,12 @@ typedef Pool<OrderList, OrderListID, 128, 64000> OrderListPool;
|
|||||||
extern OrderPool _order_pool;
|
extern OrderPool _order_pool;
|
||||||
extern OrderListPool _orderlist_pool;
|
extern OrderListPool _orderlist_pool;
|
||||||
|
|
||||||
|
struct OrderExtraInfo {
|
||||||
|
uint8 cargo_type_flags[NUM_CARGO]; ///< Load/unload types for each cargo type.
|
||||||
|
|
||||||
|
OrderExtraInfo();
|
||||||
|
};
|
||||||
|
|
||||||
/* If you change this, keep in mind that it is saved on 3 places:
|
/* If you change this, keep in mind that it is saved on 3 places:
|
||||||
* - Load_ORDR, all the global orders
|
* - Load_ORDR, all the global orders
|
||||||
* - Vehicle -> current_order
|
* - Vehicle -> current_order
|
||||||
@@ -38,6 +44,8 @@ private:
|
|||||||
friend const struct SaveLoad *GetVehicleDescription(VehicleType vt); ///< Saving and loading the current order of vehicles.
|
friend const struct SaveLoad *GetVehicleDescription(VehicleType vt); ///< Saving and loading the current order of vehicles.
|
||||||
friend void Load_VEHS(); ///< Loading of ancient vehicles.
|
friend void Load_VEHS(); ///< Loading of ancient vehicles.
|
||||||
friend const struct SaveLoad *GetOrderDescription(); ///< Saving and loading of orders.
|
friend const struct SaveLoad *GetOrderDescription(); ///< Saving and loading of orders.
|
||||||
|
friend void Load_ORDX(); ///< Saving and loading of orders.
|
||||||
|
friend void Save_ORDX(); ///< Saving and loading of orders.
|
||||||
|
|
||||||
uint8 type; ///< The type of order + non-stop flags
|
uint8 type; ///< The type of order + non-stop flags
|
||||||
uint8 flags; ///< Load/unload types, depot order/action types.
|
uint8 flags; ///< Load/unload types, depot order/action types.
|
||||||
@@ -45,20 +53,41 @@ private:
|
|||||||
|
|
||||||
CargoID refit_cargo; ///< Refit CargoID
|
CargoID refit_cargo; ///< Refit CargoID
|
||||||
|
|
||||||
uint8 cargo_type_flags[NUM_CARGO]; ///< Load/unload types for each cargo type.
|
OrderExtraInfo *extra;///< Extra order info
|
||||||
|
|
||||||
uint16 wait_time; ///< How long in ticks to wait at the destination.
|
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.
|
uint16 travel_time; ///< How long in ticks the journey to this destination should take.
|
||||||
uint16 max_speed; ///< How fast the vehicle may go on the way to the destination.
|
uint16 max_speed; ///< How fast the vehicle may go on the way to the destination.
|
||||||
|
|
||||||
|
void AllocExtraInfo();
|
||||||
|
void DeAllocExtraInfo();
|
||||||
|
|
||||||
|
inline void CheckExtraInfoAlloced()
|
||||||
|
{
|
||||||
|
if (!this->extra) this->AllocExtraInfo();
|
||||||
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Order *next; ///< Pointer to next order. If NULL, end of list
|
Order *next; ///< Pointer to next order. If NULL, end of list
|
||||||
|
|
||||||
Order() : refit_cargo(CT_NO_REFIT), max_speed(UINT16_MAX) {}
|
Order() : refit_cargo(CT_NO_REFIT), extra(NULL), max_speed(UINT16_MAX) {}
|
||||||
~Order();
|
~Order();
|
||||||
|
|
||||||
Order(uint32 packed);
|
Order(uint32 packed);
|
||||||
|
|
||||||
|
Order(const Order& other) : extra(NULL)
|
||||||
|
{
|
||||||
|
*this = other;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline Order& operator=(Order const& other)
|
||||||
|
{
|
||||||
|
AssignOrder(other);
|
||||||
|
this->next = other.next;
|
||||||
|
this->index = other.index;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check whether this order is of the given type.
|
* Check whether this order is of the given type.
|
||||||
* @param type the type to check against.
|
* @param type the type to check against.
|
||||||
@@ -141,7 +170,8 @@ public:
|
|||||||
inline OrderLoadFlags GetCargoLoadTypeRaw(CargoID cargo_id) const
|
inline OrderLoadFlags GetCargoLoadTypeRaw(CargoID cargo_id) const
|
||||||
{
|
{
|
||||||
assert(cargo_id < NUM_CARGO);
|
assert(cargo_id < NUM_CARGO);
|
||||||
return (OrderLoadFlags) GB(this->cargo_type_flags[cargo_id], 4, 4);
|
if (!this->extra) return OLF_LOAD_IF_POSSIBLE;
|
||||||
|
return (OrderLoadFlags) GB(this->extra->cargo_type_flags[cargo_id], 4, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -169,7 +199,8 @@ public:
|
|||||||
inline OrderUnloadFlags GetCargoUnloadTypeRaw(CargoID cargo_id) const
|
inline OrderUnloadFlags GetCargoUnloadTypeRaw(CargoID cargo_id) const
|
||||||
{
|
{
|
||||||
assert(cargo_id < NUM_CARGO);
|
assert(cargo_id < NUM_CARGO);
|
||||||
return (OrderUnloadFlags) GB(this->cargo_type_flags[cargo_id], 0, 4);
|
if (!this->extra) return OUF_UNLOAD_IF_POSSIBLE;
|
||||||
|
return (OrderUnloadFlags) GB(this->extra->cargo_type_flags[cargo_id], 0, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -214,7 +245,8 @@ public:
|
|||||||
inline void SetLoadType(OrderLoadFlags load_type, CargoID cargo_id)
|
inline void SetLoadType(OrderLoadFlags load_type, CargoID cargo_id)
|
||||||
{
|
{
|
||||||
assert(cargo_id < NUM_CARGO);
|
assert(cargo_id < NUM_CARGO);
|
||||||
SB(this->cargo_type_flags[cargo_id], 4, 4, load_type);
|
this->CheckExtraInfoAlloced();
|
||||||
|
SB(this->extra->cargo_type_flags[cargo_id], 4, 4, load_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Set how the consist must be unloaded. */
|
/** Set how the consist must be unloaded. */
|
||||||
@@ -229,7 +261,8 @@ public:
|
|||||||
inline void SetUnloadType(OrderUnloadFlags unload_type, CargoID cargo_id)
|
inline void SetUnloadType(OrderUnloadFlags unload_type, CargoID cargo_id)
|
||||||
{
|
{
|
||||||
assert(cargo_id < NUM_CARGO);
|
assert(cargo_id < NUM_CARGO);
|
||||||
SB(this->cargo_type_flags[cargo_id], 0, 4, unload_type);
|
this->CheckExtraInfoAlloced();
|
||||||
|
SB(this->extra->cargo_type_flags[cargo_id], 0, 4, unload_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Set whether we must stop at stations or not. */
|
/** Set whether we must stop at stations or not. */
|
||||||
|
@@ -48,6 +48,7 @@ INSTANTIATE_POOL_METHODS(OrderList)
|
|||||||
/** Clean everything up. */
|
/** Clean everything up. */
|
||||||
Order::~Order()
|
Order::~Order()
|
||||||
{
|
{
|
||||||
|
DeAllocExtraInfo();
|
||||||
if (CleaningPool()) return;
|
if (CleaningPool()) return;
|
||||||
|
|
||||||
/* We can visit oil rigs and buoys that are not our own. They will be shown in
|
/* We can visit oil rigs and buoys that are not our own. They will be shown in
|
||||||
@@ -68,6 +69,7 @@ void Order::Free()
|
|||||||
this->flags = 0;
|
this->flags = 0;
|
||||||
this->dest = 0;
|
this->dest = 0;
|
||||||
this->next = NULL;
|
this->next = NULL;
|
||||||
|
DeAllocExtraInfo();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -238,6 +240,7 @@ Order::Order(uint32 packed)
|
|||||||
this->type = (OrderType)GB(packed, 0, 8);
|
this->type = (OrderType)GB(packed, 0, 8);
|
||||||
this->flags = GB(packed, 8, 8);
|
this->flags = GB(packed, 8, 8);
|
||||||
this->dest = GB(packed, 16, 16);
|
this->dest = GB(packed, 16, 16);
|
||||||
|
this->extra = NULL;
|
||||||
this->next = NULL;
|
this->next = NULL;
|
||||||
this->refit_cargo = CT_NO_REFIT;
|
this->refit_cargo = CT_NO_REFIT;
|
||||||
this->wait_time = 0;
|
this->wait_time = 0;
|
||||||
@@ -284,13 +287,34 @@ void Order::AssignOrder(const Order &other)
|
|||||||
this->travel_time = other.travel_time;
|
this->travel_time = other.travel_time;
|
||||||
this->max_speed = other.max_speed;
|
this->max_speed = other.max_speed;
|
||||||
|
|
||||||
if (this->GetUnloadType() == OUFB_CARGO_TYPE_UNLOAD || this->GetLoadType() == OLFB_CARGO_TYPE_LOAD) {
|
if ((this->GetUnloadType() == OUFB_CARGO_TYPE_UNLOAD || this->GetLoadType() == OLFB_CARGO_TYPE_LOAD) && other.extra != NULL) {
|
||||||
for (uint i = 0; i < NUM_CARGO; i++) {
|
this->AllocExtraInfo();
|
||||||
this->cargo_type_flags[i] = other.cargo_type_flags[i];
|
*(this->extra) = *(other.extra);
|
||||||
|
} else {
|
||||||
|
this->DeAllocExtraInfo();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Order::AllocExtraInfo()
|
||||||
|
{
|
||||||
|
if (this->extra == NULL) {
|
||||||
|
this->extra = new OrderExtraInfo();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Order::DeAllocExtraInfo()
|
||||||
|
{
|
||||||
|
if (this->extra != NULL) {
|
||||||
|
delete this->extra;
|
||||||
|
this->extra = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
OrderExtraInfo::OrderExtraInfo()
|
||||||
|
{
|
||||||
|
memset(cargo_type_flags, 0, sizeof(cargo_type_flags));
|
||||||
|
}
|
||||||
|
|
||||||
void CargoStationIDStackSet::FillNextStoppingStation(const Vehicle *v, const OrderList *o, const Order *first, uint hops)
|
void CargoStationIDStackSet::FillNextStoppingStation(const Vehicle *v, const OrderList *o, const Order *first, uint hops)
|
||||||
{
|
{
|
||||||
this->more.clear();
|
this->more.clear();
|
||||||
|
@@ -45,7 +45,7 @@ std::vector<uint32> _sl_xv_discardable_chunk_ids; ///< list of chunks
|
|||||||
static const uint32 _sl_xv_slxi_chunk_version = 0; ///< current version os SLXI chunk
|
static const uint32 _sl_xv_slxi_chunk_version = 0; ///< current version os SLXI chunk
|
||||||
|
|
||||||
const SlxiSubChunkInfo _sl_xv_sub_chunk_infos[] = {
|
const SlxiSubChunkInfo _sl_xv_sub_chunk_infos[] = {
|
||||||
{ XSLFI_CARGO_TYPE_ORDERS, XSCF_NULL, 1, 1, "cargo_type_orders", NULL, NULL, NULL },
|
{ XSLFI_CARGO_TYPE_ORDERS, XSCF_NULL, 1, 1, "cargo_type_orders", NULL, NULL, "ORDX" },
|
||||||
|
|
||||||
{ XSLFI_NULL, XSCF_NULL, 0, 0, NULL, NULL, NULL, NULL },// This is the end marker
|
{ XSLFI_NULL, XSCF_NULL, 0, 0, NULL, NULL, NULL, NULL },// This is the end marker
|
||||||
};
|
};
|
||||||
|
@@ -113,7 +113,6 @@ const SaveLoad *GetOrderDescription()
|
|||||||
SLE_CONDVAR(Order, wait_time, SLE_UINT16, 67, 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),
|
SLE_CONDVAR(Order, travel_time, SLE_UINT16, 67, SL_MAX_VERSION),
|
||||||
SLE_CONDVAR(Order, max_speed, SLE_UINT16, 172, SL_MAX_VERSION),
|
SLE_CONDVAR(Order, max_speed, SLE_UINT16, 172, SL_MAX_VERSION),
|
||||||
SLE_CONDARR_X(Order, cargo_type_flags, SLE_UINT8, NUM_CARGO, 0, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_CARGO_TYPE_ORDERS, 1)),
|
|
||||||
|
|
||||||
/* Leftover from the minor savegame version stuff
|
/* 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 */
|
* We will never use those free bytes, but we have to keep this line to allow loading of old savegames */
|
||||||
@@ -195,6 +194,39 @@ static void Load_ORDR()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const SaveLoad *GetOrderExtraInfoDescription()
|
||||||
|
{
|
||||||
|
static const SaveLoad _order_extra_info_desc[] = {
|
||||||
|
SLE_ARR(OrderExtraInfo, cargo_type_flags, SLE_UINT8, NUM_CARGO),
|
||||||
|
SLE_END()
|
||||||
|
};
|
||||||
|
|
||||||
|
return _order_extra_info_desc;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Save_ORDX()
|
||||||
|
{
|
||||||
|
Order *order;
|
||||||
|
|
||||||
|
FOR_ALL_ORDERS(order) {
|
||||||
|
if (order->extra != NULL) {
|
||||||
|
SlSetArrayIndex(order->index);
|
||||||
|
SlObject(order->extra, GetOrderExtraInfoDescription());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Load_ORDX()
|
||||||
|
{
|
||||||
|
int index;
|
||||||
|
while ((index = SlIterateArray()) != -1) {
|
||||||
|
Order *order = Order::GetIfValid(index);
|
||||||
|
assert(order != NULL);
|
||||||
|
order->AllocExtraInfo();
|
||||||
|
SlObject(order->extra, GetOrderExtraInfoDescription());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void Ptrs_ORDR()
|
static void Ptrs_ORDR()
|
||||||
{
|
{
|
||||||
/* Orders from old savegames have pointers corrected in Load_ORDR */
|
/* Orders from old savegames have pointers corrected in Load_ORDR */
|
||||||
@@ -309,5 +341,6 @@ static void Ptrs_BKOR()
|
|||||||
extern const ChunkHandler _order_chunk_handlers[] = {
|
extern const ChunkHandler _order_chunk_handlers[] = {
|
||||||
{ 'BKOR', Save_BKOR, Load_BKOR, Ptrs_BKOR, NULL, CH_ARRAY},
|
{ 'BKOR', Save_BKOR, Load_BKOR, Ptrs_BKOR, NULL, CH_ARRAY},
|
||||||
{ 'ORDR', Save_ORDR, Load_ORDR, Ptrs_ORDR, NULL, CH_ARRAY},
|
{ 'ORDR', Save_ORDR, Load_ORDR, Ptrs_ORDR, NULL, CH_ARRAY},
|
||||||
{ 'ORDL', Save_ORDL, Load_ORDL, Ptrs_ORDL, NULL, CH_ARRAY | CH_LAST},
|
{ 'ORDL', Save_ORDL, Load_ORDL, Ptrs_ORDL, NULL, CH_ARRAY},
|
||||||
|
{ 'ORDX', Save_ORDX, Load_ORDX, NULL, NULL, CH_SPARSE_ARRAY | CH_LAST},
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user