mirror of https://github.com/OpenTTD/OpenTTD.git
(svn r12586) -Codechange: do not access an order's refit variables directly.
This commit is contained in:
parent
630d5ad766
commit
e68b2088ce
|
@ -71,9 +71,9 @@ static bool VerifyAutoreplaceRefitForOrders(const Vehicle *v, const EngineID eng
|
||||||
}
|
}
|
||||||
|
|
||||||
FOR_VEHICLE_ORDERS(u, o) {
|
FOR_VEHICLE_ORDERS(u, o) {
|
||||||
if (!(o->refit_cargo < NUM_CARGO)) continue;
|
if (!o->IsRefit()) continue;
|
||||||
if (!CanRefitTo(v->engine_type, o->refit_cargo)) continue;
|
if (!CanRefitTo(v->engine_type, o->GetRefitCargo())) continue;
|
||||||
if (!CanRefitTo(engine_type, o->refit_cargo)) return false;
|
if (!CanRefitTo(engine_type, o->GetRefitCargo())) return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -1987,13 +1987,11 @@ bool AfterLoadGame()
|
||||||
Vehicle *v;
|
Vehicle *v;
|
||||||
|
|
||||||
FOR_ALL_ORDERS(order) {
|
FOR_ALL_ORDERS(order) {
|
||||||
order->refit_cargo = CT_NO_REFIT;
|
order->SetRefit(CT_NO_REFIT);
|
||||||
order->refit_subtype = CT_NO_REFIT;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
FOR_ALL_VEHICLES(v) {
|
FOR_ALL_VEHICLES(v) {
|
||||||
v->current_order.refit_cargo = CT_NO_REFIT;
|
v->current_order.SetRefit(CT_NO_REFIT);
|
||||||
v->current_order.refit_subtype = CT_NO_REFIT;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -31,7 +31,10 @@ private:
|
||||||
friend Order UnpackOldOrder(uint16 packed); ///< 'Uncompressing' a loaded old order.
|
friend Order UnpackOldOrder(uint16 packed); ///< 'Uncompressing' a loaded old order.
|
||||||
friend Order UnpackVersion4Order(uint16 packed); ///< 'Uncompressing' a loaded ancient order.
|
friend Order UnpackVersion4Order(uint16 packed); ///< 'Uncompressing' a loaded ancient order.
|
||||||
|
|
||||||
OrderTypeByte type;
|
OrderTypeByte type; ///< The type of order
|
||||||
|
|
||||||
|
CargoID refit_cargo; ///< Refit CargoID
|
||||||
|
byte refit_subtype; ///< Refit subtype
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Order *next; ///< Pointer to next order. If NULL, end of list
|
Order *next; ///< Pointer to next order. If NULL, end of list
|
||||||
|
@ -39,9 +42,6 @@ public:
|
||||||
uint8 flags;
|
uint8 flags;
|
||||||
DestinationID dest; ///< The destionation of the order.
|
DestinationID dest; ///< The destionation of the order.
|
||||||
|
|
||||||
CargoID refit_cargo; // Refit CargoID
|
|
||||||
byte refit_subtype; // Refit subtype
|
|
||||||
|
|
||||||
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.
|
||||||
|
|
||||||
|
@ -83,8 +83,10 @@ public:
|
||||||
* Makes this order a Go To Depot order.
|
* Makes this order a Go To Depot order.
|
||||||
* @param destination the depot to go to.
|
* @param destination the depot to go to.
|
||||||
* @param order is this order a 'default' order, or an overriden vehicle order?
|
* @param order is this order a 'default' order, or an overriden vehicle order?
|
||||||
|
* @param cargo the cargo type to change to.
|
||||||
|
* @param subtype the subtype to change to.
|
||||||
*/
|
*/
|
||||||
void MakeGoToDepot(DepotID destination, bool order);
|
void MakeGoToDepot(DepotID destination, bool order, CargoID cargo = CT_NO_REFIT, byte subtype = 0);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Makes this order a Go To Waypoint order.
|
* Makes this order a Go To Waypoint order.
|
||||||
|
@ -113,6 +115,35 @@ public:
|
||||||
*/
|
*/
|
||||||
void FreeChain();
|
void FreeChain();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Is this order a refit order.
|
||||||
|
* @pre IsType(OT_GOTO_DEPOT)
|
||||||
|
* @return true if a refit should happen.
|
||||||
|
*/
|
||||||
|
inline bool IsRefit() const { return this->refit_cargo < NUM_CARGO; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the cargo to to refit to.
|
||||||
|
* @pre IsType(OT_GOTO_DEPOT)
|
||||||
|
* @return the cargo type.
|
||||||
|
*/
|
||||||
|
inline CargoID GetRefitCargo() const { return this->refit_cargo; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the cargo subtype to to refit to.
|
||||||
|
* @pre IsType(OT_GOTO_DEPOT)
|
||||||
|
* @return the cargo subtype.
|
||||||
|
*/
|
||||||
|
inline byte GetRefitSubtype() const { return this->refit_subtype; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Make this depot order also a refit order.
|
||||||
|
* @param cargo the cargo type to change to.
|
||||||
|
* @param subtype the subtype to change to.
|
||||||
|
* @pre IsType(OT_GOTO_DEPOT).
|
||||||
|
*/
|
||||||
|
void SetRefit(CargoID cargo, byte subtype = 0);
|
||||||
|
|
||||||
bool ShouldStopAtStation(const Vehicle *v, StationID station) const;
|
bool ShouldStopAtStation(const Vehicle *v, StationID station) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -55,13 +55,12 @@ void Order::MakeGoToStation(StationID destination)
|
||||||
this->dest = destination;
|
this->dest = destination;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Order::MakeGoToDepot(DepotID destination, bool order)
|
void Order::MakeGoToDepot(DepotID destination, bool order, CargoID cargo, byte subtype)
|
||||||
{
|
{
|
||||||
this->type = OT_GOTO_DEPOT;
|
this->type = OT_GOTO_DEPOT;
|
||||||
this->flags = order ? OFB_PART_OF_ORDERS : OFB_NON_STOP;
|
this->flags = order ? OFB_PART_OF_ORDERS : OFB_NON_STOP;
|
||||||
this->dest = destination;
|
this->dest = destination;
|
||||||
this->refit_cargo = CT_NO_REFIT;
|
this->SetRefit(cargo, subtype);
|
||||||
this->refit_subtype = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Order::MakeGoToWaypoint(WaypointID destination)
|
void Order::MakeGoToWaypoint(WaypointID destination)
|
||||||
|
@ -88,6 +87,12 @@ void Order::MakeDummy()
|
||||||
this->flags = 0;
|
this->flags = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Order::SetRefit(CargoID cargo, byte subtype)
|
||||||
|
{
|
||||||
|
this->refit_cargo = cargo;
|
||||||
|
this->refit_subtype = subtype;
|
||||||
|
}
|
||||||
|
|
||||||
void Order::FreeChain()
|
void Order::FreeChain()
|
||||||
{
|
{
|
||||||
if (next != NULL) next->FreeChain();
|
if (next != NULL) next->FreeChain();
|
||||||
|
@ -1002,8 +1007,7 @@ CommandCost CmdOrderRefit(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
|
||||||
if (flags & DC_EXEC) {
|
if (flags & DC_EXEC) {
|
||||||
Vehicle *u;
|
Vehicle *u;
|
||||||
|
|
||||||
order->refit_cargo = cargo;
|
order->SetRefit(cargo, subtype);
|
||||||
order->refit_subtype = subtype;
|
|
||||||
|
|
||||||
u = GetFirstVehicleFromSharedList(v);
|
u = GetFirstVehicleFromSharedList(v);
|
||||||
for (; u != NULL; u = u->next_shared) {
|
for (; u != NULL; u = u->next_shared) {
|
||||||
|
@ -1012,8 +1016,7 @@ CommandCost CmdOrderRefit(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
|
||||||
|
|
||||||
/* If the vehicle already got the current depot set as current order, then update current order as well */
|
/* If the vehicle already got the current depot set as current order, then update current order as well */
|
||||||
if (u->cur_order_index == order_number && HasBit(u->current_order.flags, OF_PART_OF_ORDERS)) {
|
if (u->cur_order_index == order_number && HasBit(u->current_order.flags, OF_PART_OF_ORDERS)) {
|
||||||
u->current_order.refit_cargo = cargo;
|
u->current_order.SetRefit(cargo, subtype);
|
||||||
u->current_order.refit_subtype = subtype;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -225,9 +225,9 @@ static void DrawOrdersWindow(Window *w)
|
||||||
if (order->flags & OFB_FULL_LOAD) s++; /* service at */
|
if (order->flags & OFB_FULL_LOAD) s++; /* service at */
|
||||||
|
|
||||||
SetDParam(1, s);
|
SetDParam(1, s);
|
||||||
if (order->refit_cargo < NUM_CARGO) {
|
if (order->IsRefit()) {
|
||||||
SetDParam(3, STR_REFIT_ORDER);
|
SetDParam(3, STR_REFIT_ORDER);
|
||||||
SetDParam(4, GetCargo(order->refit_cargo)->name);
|
SetDParam(4, GetCargo(order->GetRefitCargo())->name);
|
||||||
} else {
|
} else {
|
||||||
SetDParam(3, STR_EMPTY);
|
SetDParam(3, STR_EMPTY);
|
||||||
}
|
}
|
||||||
|
@ -263,8 +263,6 @@ static Order GetOrderCmdFromTile(const Vehicle *v, TileIndex tile)
|
||||||
Order order;
|
Order order;
|
||||||
order.next = NULL;
|
order.next = NULL;
|
||||||
order.index = 0;
|
order.index = 0;
|
||||||
order.refit_cargo = CT_INVALID;
|
|
||||||
order.refit_subtype = 0;
|
|
||||||
|
|
||||||
// check depot first
|
// check depot first
|
||||||
if (_patches.gotodepot) {
|
if (_patches.gotodepot) {
|
||||||
|
|
|
@ -2243,11 +2243,11 @@ void VehicleEnterDepot(Vehicle *v)
|
||||||
t = v->current_order;
|
t = v->current_order;
|
||||||
v->current_order.MakeDummy();
|
v->current_order.MakeDummy();
|
||||||
|
|
||||||
if (t.refit_cargo < NUM_CARGO) {
|
if (t.IsRefit()) {
|
||||||
CommandCost cost;
|
CommandCost cost;
|
||||||
|
|
||||||
_current_player = v->owner;
|
_current_player = v->owner;
|
||||||
cost = DoCommand(v->tile, v->index, t.refit_cargo | t.refit_subtype << 8, DC_EXEC, GetCmdRefitVeh(v));
|
cost = DoCommand(v->tile, v->index, t.GetRefitCargo() | t.GetRefitSubtype() << 8, DC_EXEC, GetCmdRefitVeh(v));
|
||||||
|
|
||||||
if (CmdFailed(cost)) {
|
if (CmdFailed(cost)) {
|
||||||
v->leave_depot_instantly = false; // We ensure that the vehicle stays in the depot
|
v->leave_depot_instantly = false; // We ensure that the vehicle stays in the depot
|
||||||
|
|
Loading…
Reference in New Issue