(svn r12617) -Codechange: add type safety to the Order's load and unload types.

This commit is contained in:
rubidium 2008-04-07 20:03:46 +00:00
parent 42a66ef990
commit d74c6ffb62
9 changed files with 56 additions and 57 deletions

View File

@ -2554,9 +2554,9 @@ handle_nocash:
order.MakeGoToStation(AiGetStationIdByDef(aib->use_tile, aib->cur_building_rule)); order.MakeGoToStation(AiGetStationIdByDef(aib->use_tile, aib->cur_building_rule));
if (!is_pass && i == 1) order.SetUnloadType(OFB_UNLOAD); if (!is_pass && i == 1) order.SetUnloadType(OUFB_UNLOAD);
if (_players_ai[p->index].num_want_fullload != 0 && (is_pass || i == 0)) if (_players_ai[p->index].num_want_fullload != 0 && (is_pass || i == 0))
order.SetLoadType(OFB_FULL_LOAD); order.SetLoadType(OLFB_FULL_LOAD);
DoCommand(0, loco_id + (i << 16), order.Pack(), DC_EXEC, CMD_INSERT_ORDER); DoCommand(0, loco_id + (i << 16), order.Pack(), DC_EXEC, CMD_INSERT_ORDER);
} }
@ -3289,9 +3289,9 @@ static void AiStateBuildRoadVehicles(Player *p)
order.MakeGoToStation(AiGetStationIdFromRoadBlock(aib->use_tile, aib->cur_building_rule)); order.MakeGoToStation(AiGetStationIdFromRoadBlock(aib->use_tile, aib->cur_building_rule));
if (!is_pass && i == 1) order.SetUnloadType(OFB_UNLOAD); if (!is_pass && i == 1) order.SetUnloadType(OUFB_UNLOAD);
if (_players_ai[p->index].num_want_fullload != 0 && (is_pass || i == 0)) if (_players_ai[p->index].num_want_fullload != 0 && (is_pass || i == 0))
order.SetLoadType(OFB_FULL_LOAD); order.SetLoadType(OLFB_FULL_LOAD);
DoCommand(0, loco_id + (i << 16), order.Pack(), DC_EXEC, CMD_INSERT_ORDER); DoCommand(0, loco_id + (i << 16), order.Pack(), DC_EXEC, CMD_INSERT_ORDER);
} }
@ -3568,9 +3568,9 @@ static void AiStateBuildAircraftVehicles(Player *p)
order.MakeGoToStation(AiGetStationIdFromAircraftBlock(aib->use_tile, aib->cur_building_rule)); order.MakeGoToStation(AiGetStationIdFromAircraftBlock(aib->use_tile, aib->cur_building_rule));
if (!is_pass && i == 1) order.SetUnloadType(OFB_UNLOAD); if (!is_pass && i == 1) order.SetUnloadType(OUFB_UNLOAD);
if (_players_ai[p->index].num_want_fullload != 0 && (is_pass || i == 0)) if (_players_ai[p->index].num_want_fullload != 0 && (is_pass || i == 0))
order.SetLoadType(OFB_FULL_LOAD); order.SetLoadType(OLFB_FULL_LOAD);
DoCommand(0, loco_id + (i << 16), order.Pack(), DC_EXEC, CMD_INSERT_ORDER); DoCommand(0, loco_id + (i << 16), order.Pack(), DC_EXEC, CMD_INSERT_ORDER);
} }

View File

@ -1190,14 +1190,12 @@ static void AiNew_State_GiveOrders(Player *p)
idx = 0; idx = 0;
order.MakeGoToStation(GetStationIndex(_players_ainew[p->index].to_tile)); order.MakeGoToStation(GetStationIndex(_players_ainew[p->index].to_tile));
if (_players_ainew[p->index].tbt == AI_TRUCK && _players_ainew[p->index].to_deliver) if (_players_ainew[p->index].tbt == AI_TRUCK && _players_ainew[p->index].to_deliver) order.SetLoadType(OLFB_FULL_LOAD);
order.SetLoadType(OFB_FULL_LOAD);
AI_DoCommand(0, _players_ainew[p->index].veh_id + (idx << 16), order.Pack(), DC_EXEC, CMD_INSERT_ORDER); AI_DoCommand(0, _players_ainew[p->index].veh_id + (idx << 16), order.Pack(), DC_EXEC, CMD_INSERT_ORDER);
idx = 0; idx = 0;
order.MakeGoToStation(GetStationIndex(_players_ainew[p->index].from_tile)); order.MakeGoToStation(GetStationIndex(_players_ainew[p->index].from_tile));
if (_players_ainew[p->index].tbt == AI_TRUCK && _players_ainew[p->index].from_deliver) if (_players_ainew[p->index].tbt == AI_TRUCK && _players_ainew[p->index].from_deliver) order.SetLoadType(OLFB_FULL_LOAD);
order.SetLoadType(OFB_FULL_LOAD);
AI_DoCommand(0, _players_ainew[p->index].veh_id + (idx << 16), order.Pack(), DC_EXEC, CMD_INSERT_ORDER); AI_DoCommand(0, _players_ainew[p->index].veh_id + (idx << 16), order.Pack(), DC_EXEC, CMD_INSERT_ORDER);
// Start the engines! // Start the engines!

View File

@ -1489,7 +1489,7 @@ void VehiclePayment(Vehicle *front_v)
if (!cp->paid_for && if (!cp->paid_for &&
cp->source != last_visited && cp->source != last_visited &&
HasBit(ge->acceptance_pickup, GoodsEntry::ACCEPTANCE) && HasBit(ge->acceptance_pickup, GoodsEntry::ACCEPTANCE) &&
(front_v->current_order.GetUnloadType() & OFB_TRANSFER) == 0) { (front_v->current_order.GetUnloadType() & OUFB_TRANSFER) == 0) {
/* Deliver goods to the station */ /* Deliver goods to the station */
st->time_since_unload = 0; st->time_since_unload = 0;
@ -1502,8 +1502,8 @@ void VehiclePayment(Vehicle *front_v)
result |= 1; result |= 1;
SetBit(v->vehicle_flags, VF_CARGO_UNLOADING); SetBit(v->vehicle_flags, VF_CARGO_UNLOADING);
} else if (front_v->current_order.GetUnloadType() & (OFB_UNLOAD | OFB_TRANSFER)) { } else if (front_v->current_order.GetUnloadType() & (OUFB_UNLOAD | OUFB_TRANSFER)) {
if (!cp->paid_for && (front_v->current_order.GetUnloadType() & OFB_TRANSFER) != 0) { if (!cp->paid_for && (front_v->current_order.GetUnloadType() & OUFB_TRANSFER) != 0) {
Money profit = GetTransportedGoodsIncome( Money profit = GetTransportedGoodsIncome(
cp->count, cp->count,
/* pay transfer vehicle for only the part of transfer it has done: ie. cargo_loaded_at_xy to here */ /* pay transfer vehicle for only the part of transfer it has done: ie. cargo_loaded_at_xy to here */
@ -1556,7 +1556,7 @@ static void LoadUnloadVehicle(Vehicle *v, int *cargo_left)
/* We have not waited enough time till the next round of loading/unloading */ /* We have not waited enough time till the next round of loading/unloading */
if (--v->load_unload_time_rem != 0) { if (--v->load_unload_time_rem != 0) {
if (_patches.improved_load && HasBit(v->current_order.GetLoadType(), OF_FULL_LOAD)) { if (_patches.improved_load && (v->current_order.GetLoadType() & OLFB_FULL_LOAD)) {
/* 'Reserve' this cargo for this vehicle, because we were first. */ /* 'Reserve' this cargo for this vehicle, because we were first. */
for (; v != NULL; v = v->Next()) { for (; v != NULL; v = v->Next()) {
if (v->cargo_cap != 0) cargo_left[v->cargo_type] -= v->cargo_cap - v->cargo.Count(); if (v->cargo_cap != 0) cargo_left[v->cargo_type] -= v->cargo_cap - v->cargo.Count();
@ -1604,12 +1604,12 @@ static void LoadUnloadVehicle(Vehicle *v, int *cargo_left)
uint amount_unloaded = _patches.gradual_loading ? min(cargo_count, load_amount) : cargo_count; uint amount_unloaded = _patches.gradual_loading ? min(cargo_count, load_amount) : cargo_count;
bool remaining; // Are there cargo entities in this vehicle that can still be unloaded here? bool remaining; // Are there cargo entities in this vehicle that can still be unloaded here?
if (HasBit(ge->acceptance_pickup, GoodsEntry::ACCEPTANCE) && !(u->current_order.GetUnloadType() & OFB_TRANSFER)) { if (HasBit(ge->acceptance_pickup, GoodsEntry::ACCEPTANCE) && !(u->current_order.GetUnloadType() & OUFB_TRANSFER)) {
/* The cargo has reached it's final destination, the packets may now be destroyed */ /* The cargo has reached it's final destination, the packets may now be destroyed */
remaining = v->cargo.MoveTo(NULL, amount_unloaded, CargoList::MTA_FINAL_DELIVERY, last_visited); remaining = v->cargo.MoveTo(NULL, amount_unloaded, CargoList::MTA_FINAL_DELIVERY, last_visited);
result |= 1; result |= 1;
} else if (u->current_order.GetUnloadType() & (OFB_UNLOAD | OFB_TRANSFER)) { } else if (u->current_order.GetUnloadType() & (OUFB_UNLOAD | OUFB_TRANSFER)) {
remaining = v->cargo.MoveTo(&ge->cargo, amount_unloaded); remaining = v->cargo.MoveTo(&ge->cargo, amount_unloaded);
SetBit(ge->acceptance_pickup, GoodsEntry::PICKUP); SetBit(ge->acceptance_pickup, GoodsEntry::PICKUP);
@ -1638,7 +1638,7 @@ static void LoadUnloadVehicle(Vehicle *v, int *cargo_left)
} }
/* Do not pick up goods that we unloaded */ /* Do not pick up goods that we unloaded */
if (u->current_order.GetUnloadType() & OFB_UNLOAD) continue; if (u->current_order.GetUnloadType() & OUFB_UNLOAD) continue;
/* update stats */ /* update stats */
int t; int t;
@ -1710,7 +1710,7 @@ static void LoadUnloadVehicle(Vehicle *v, int *cargo_left)
* all wagons at the same time instead of using the same 'improved' * all wagons at the same time instead of using the same 'improved'
* loading algorithm for the wagons (only fill wagon when there is * loading algorithm for the wagons (only fill wagon when there is
* enough to fill the previous wagons) */ * enough to fill the previous wagons) */
if (_patches.improved_load && HasBit(u->current_order.GetLoadType(), OF_FULL_LOAD)) { if (_patches.improved_load && (u->current_order.GetLoadType() & OLFB_FULL_LOAD)) {
/* Update left cargo */ /* Update left cargo */
for (v = u; v != NULL; v = v->Next()) { for (v = u; v != NULL; v = v->Next()) {
if (v->cargo_cap != 0) cargo_left[v->cargo_type] -= v->cargo_cap - v->cargo.Count(); if (v->cargo_cap != 0) cargo_left[v->cargo_type] -= v->cargo_cap - v->cargo.Count();
@ -1729,7 +1729,7 @@ static void LoadUnloadVehicle(Vehicle *v, int *cargo_left)
} }
} else { } else {
bool finished_loading = true; bool finished_loading = true;
if (HasBit(v->current_order.GetLoadType(), OF_FULL_LOAD)) { if (v->current_order.GetLoadType() & OLFB_FULL_LOAD) {
if (_patches.full_load_any) { if (_patches.full_load_any) {
/* if the aircraft carries passengers and is NOT full, then /* if the aircraft carries passengers and is NOT full, then
* continue loading, no matter how much mail is in */ * continue loading, no matter how much mail is in */

View File

@ -1968,13 +1968,13 @@ int WhoCanServiceIndustry(Industry* ind)
*/ */
const Order *o; const Order *o;
FOR_VEHICLE_ORDERS(v, o) { FOR_VEHICLE_ORDERS(v, o) {
if (o->IsType(OT_GOTO_STATION) && !HasBit(o->GetUnloadType(), OF_TRANSFER)) { if (o->IsType(OT_GOTO_STATION) && !(o->GetUnloadType() & OUFB_TRANSFER)) {
/* Vehicle visits a station to load or unload */ /* Vehicle visits a station to load or unload */
Station *st = GetStation(o->GetDestination()); Station *st = GetStation(o->GetDestination());
if (!st->IsValid()) continue; if (!st->IsValid()) continue;
/* Same cargo produced by industry is dropped here => not serviced by vehicle v */ /* Same cargo produced by industry is dropped here => not serviced by vehicle v */
if (HasBit(o->GetUnloadType(), OF_UNLOAD) && !c_accepts) break; if ((o->GetUnloadType() & OUFB_UNLOAD) && !c_accepts) break;
if (stations.find(st) != stations.end()) { if (stations.find(st) != stations.end()) {
if (v->owner == _local_player) return 2; // Player services industry if (v->owner == _local_player) return 2; // Player services industry

View File

@ -2306,8 +2306,8 @@ bool AfterLoadGame()
Order *order; Order *order;
FOR_ALL_ORDERS(order) { FOR_ALL_ORDERS(order) {
if (order->IsType(OT_GOTO_STATION) && GetStation(order->GetDestination())->IsBuoy()) { if (order->IsType(OT_GOTO_STATION) && GetStation(order->GetDestination())->IsBuoy()) {
order->SetLoadType(0); order->SetLoadType(OLF_LOAD_IF_POSSIBLE);
order->SetUnloadType(0); order->SetUnloadType(OUF_UNLOAD_IF_POSSIBLE);
} }
} }

View File

@ -161,9 +161,9 @@ public:
void SetRefit(CargoID cargo, byte subtype = 0); void SetRefit(CargoID cargo, byte subtype = 0);
/** How must the consist be loaded? */ /** How must the consist be loaded? */
inline byte GetLoadType() const { return this->flags & OFB_FULL_LOAD; } inline OrderLoadFlags GetLoadType() const { return (OrderLoadFlags)(this->flags & OLFB_FULL_LOAD); }
/** How must the consist be unloaded? */ /** How must the consist be unloaded? */
inline byte GetUnloadType() const { return GB(this->flags, 0, 2); } inline OrderUnloadFlags GetUnloadType() const { return (OrderUnloadFlags)GB(this->flags, 0, 2); }
/** Where must we stop? */ /** Where must we stop? */
OrderNonStopFlags GetNonStopType() const; OrderNonStopFlags GetNonStopType() const;
/** What caused us going to the depot? */ /** What caused us going to the depot? */
@ -172,9 +172,9 @@ public:
inline OrderDepotActionFlags GetDepotActionType() const { return (OrderDepotActionFlags)this->flags; } inline OrderDepotActionFlags GetDepotActionType() const { return (OrderDepotActionFlags)this->flags; }
/** Set how the consist must be loaded. */ /** Set how the consist must be loaded. */
inline void SetLoadType(byte load_type) { SB(this->flags, 2, 1, !!load_type); } inline void SetLoadType(OrderLoadFlags load_type) { SB(this->flags, 2, 1, !!load_type); }
/** Set how the consist must be unloaded. */ /** Set how the consist must be unloaded. */
inline void SetUnloadType(byte unload_type) { SB(this->flags, 0, 2, unload_type); } inline void SetUnloadType(OrderUnloadFlags unload_type) { SB(this->flags, 0, 2, unload_type); }
/** Set whether we must stop at stations or not. */ /** Set whether we must stop at stations or not. */
inline void SetNonStopType(OrderNonStopFlags non_stop_type) { SB(this->flags, 3, 1, !!non_stop_type); } inline void SetNonStopType(OrderNonStopFlags non_stop_type) { SB(this->flags, 3, 1, !!non_stop_type); }
/** Set the cause to go to the depot. */ /** Set the cause to go to the depot. */

View File

@ -322,11 +322,11 @@ CommandCost CmdInsertOrder(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
* non-stop orders (if any) are only valid for trains */ * non-stop orders (if any) are only valid for trains */
switch (new_order.GetLoadType() | new_order.GetUnloadType()) { switch (new_order.GetLoadType() | new_order.GetUnloadType()) {
case 0: case 0:
case OFB_FULL_LOAD: case OLFB_FULL_LOAD:
case OFB_FULL_LOAD | OFB_TRANSFER: case OLFB_FULL_LOAD | OUFB_TRANSFER:
case OFB_UNLOAD: case OUFB_UNLOAD:
case OFB_UNLOAD | OFB_TRANSFER: case OUFB_UNLOAD | OUFB_TRANSFER:
case OFB_TRANSFER: case OUFB_TRANSFER:
break; break;
default: return CMD_ERROR; default: return CMD_ERROR;
@ -766,19 +766,19 @@ CommandCost CmdModifyOrder(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
if (order->IsType(OT_GOTO_DEPOT)) { if (order->IsType(OT_GOTO_DEPOT)) {
order->SetDepotOrderType((OrderDepotTypeFlags)(order->GetDepotOrderType() ^ ODTFB_SERVICE)); order->SetDepotOrderType((OrderDepotTypeFlags)(order->GetDepotOrderType() ^ ODTFB_SERVICE));
} else { } else {
order->SetLoadType(order->GetLoadType() ^ OFB_FULL_LOAD); order->SetLoadType((OrderLoadFlags)(order->GetLoadType() ^ OLFB_FULL_LOAD));
order->SetUnloadType(order->GetUnloadType() & ~OFB_UNLOAD); order->SetUnloadType((OrderUnloadFlags)(order->GetUnloadType() & ~OUFB_UNLOAD));
} }
break; break;
case OF_UNLOAD: case OF_UNLOAD:
order->SetUnloadType(order->GetUnloadType() ^ OFB_UNLOAD); order->SetUnloadType((OrderUnloadFlags)(order->GetUnloadType() ^ OUFB_UNLOAD));
order->SetLoadType(0); order->SetLoadType(OLF_LOAD_IF_POSSIBLE);
break; break;
case OF_NON_STOP: case OF_NON_STOP:
order->SetNonStopType(order->GetNonStopType() == ONSF_STOP_EVERYWHERE ? ONSF_NO_STOP_AT_ANY_STATION : ONSF_STOP_EVERYWHERE); order->SetNonStopType(order->GetNonStopType() == ONSF_STOP_EVERYWHERE ? ONSF_NO_STOP_AT_ANY_STATION : ONSF_STOP_EVERYWHERE);
break; break;
case OF_TRANSFER: case OF_TRANSFER:
order->SetUnloadType(order->GetUnloadType() ^ OFB_TRANSFER); order->SetUnloadType((OrderUnloadFlags)(order->GetUnloadType() ^ OUFB_TRANSFER));
break; break;
default: NOT_REACHED(); default: NOT_REACHED();
} }

View File

@ -36,29 +36,31 @@ template <> struct EnumPropsT<OrderType> : MakeEnumPropsT<OrderType, byte, OT_BE
typedef TinyEnumT<OrderType> OrderTypeByte; typedef TinyEnumT<OrderType> OrderTypeByte;
/* Order flags -- please use OF instead OF and use HASBIT/SETBIT/CLEARBIT */ /**
* Flags related to the unloading order.
*/
enum OrderUnloadFlags {
OUF_UNLOAD_IF_POSSIBLE = 0, ///< Unload all cargo that the station accepts.
OUFB_TRANSFER = 1 << 0, ///< Transfer all cargo onto the platform.
OUFB_UNLOAD = 1 << 1, ///< Force unloading all cargo onto the platform, possibly not getting paid.
};
/** Order flag masks - these are for direct bit operations */ /**
enum OrderFlagMasks { * Flags related to the loading order.
//Flags for stations: */
/** vehicle will transfer cargo (i. e. not deliver to nearby industry/town even if accepted there) */ enum OrderLoadFlags {
OFB_TRANSFER = 0x1, OLF_LOAD_IF_POSSIBLE = 0, ///< Load as long as there is cargo that fits in the train.
/** If OFB_TRANSFER is not set, drop any cargo loaded. If accepted, deliver, otherwise cargo remains at the station. OLFB_FULL_LOAD = 1 << 2, ///< Full load the complete (or a single cargo) of the consist.
* No new cargo is loaded onto the vehicle whatsoever */
OFB_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 */
OFB_FULL_LOAD = 0x4,
}; };
/** /**
* Non-stop order flags. * Non-stop order flags.
*/ */
enum OrderNonStopFlags { enum OrderNonStopFlags {
ONSF_STOP_EVERYWHERE = 0, ONSF_STOP_EVERYWHERE = 0, ///< The vehicle will stop at any station it passes and the destination.
ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS = 1, ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS = 1, ///< The vehicle will not stop at any stations it passes except the destination.
ONSF_NO_STOP_AT_DESTINATION_STATION = 2, ONSF_NO_STOP_AT_DESTINATION_STATION = 2, ///< The vehicle will stop at any station it passes except the destination.
ONSF_NO_STOP_AT_ANY_STATION = 3 ONSF_NO_STOP_AT_ANY_STATION = 3, ///< The vehicle will not stop at any stations it passes including the destination.
}; };
/** /**
@ -78,9 +80,8 @@ enum OrderDepotActionFlags {
ODATFB_HALT = 1 << 2, ///< Service the vehicle and then halt it. ODATFB_HALT = 1 << 2, ///< Service the vehicle and then halt it.
}; };
/** Order flags bits - these are for the *BIT macros /**
* for descrption of flags, see OrderFlagMasks * Enumeration for the 'flag' to toggle in CmdModifyOrder.
* @see OrderFlagMasks
*/ */
enum { enum {
OF_TRANSFER = 0, OF_TRANSFER = 0,

View File

@ -2175,7 +2175,7 @@ uint8 CalcPercentVehicleFilled(Vehicle *v, StringID *color)
max += v->cargo_cap; max += v->cargo_cap;
if (v->cargo_cap != 0) { if (v->cargo_cap != 0) {
unloading += HasBit(v->vehicle_flags, VF_CARGO_UNLOADING) ? 1 : 0; unloading += HasBit(v->vehicle_flags, VF_CARGO_UNLOADING) ? 1 : 0;
loading |= !HasBit(u->current_order.GetUnloadType(), OF_UNLOAD) && st->goods[v->cargo_type].days_since_pickup != 255; loading |= !(u->current_order.GetUnloadType() & OUFB_UNLOAD) && st->goods[v->cargo_type].days_since_pickup != 255;
cars++; cars++;
} }
} }