Changeset - r8848:6bd9c22eb5ec
[Not reviewed]
master
0 8 0
rubidium - 17 years ago 2008-04-07 08:59:04
rubidium@openttd.org
(svn r12600) -Codechange: make GetNonStopType return a more augmented type; not is there a non-stop order but the kind of non-stop order, so one doesn't need to check _patches.new_nonstop type everywhere.
8 files changed with 50 insertions and 44 deletions:
0 comments (0 inline, 0 general)
src/order_base.h
Show inline comments
 
@@ -165,7 +165,7 @@ public:
 
	/** How must the consist be unloaded? */
 
	inline byte GetUnloadType() const { return GB(this->flags, 0, 2); }
 
	/** Where must we stop? */
 
	inline byte GetNonStopType() const { return this->flags & OFB_NON_STOP; }
 
	OrderNonStopFlags GetNonStopType() const;
 
	/** What caused us going to the depot? */
 
	inline byte GetDepotOrderType() const { return this->flags; }
 
	/** What are we going to do when in the depot. */
 
@@ -176,7 +176,7 @@ public:
 
	/** Set how the consist must be unloaded. */
 
	inline void SetUnloadType(byte unload_type) { SB(this->flags, 0, 2, unload_type); }
 
	/** Set whether we must stop at stations or not. */
 
	inline void SetNonStopType(byte 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. */
 
	inline void SetDepotOrderType(byte depot_order_type) { this->flags = depot_order_type; }
 
	/** Set what we are going to do in the depot. */
src/order_cmd.cpp
Show inline comments
 
@@ -39,7 +39,16 @@ assert_compile(sizeof(DestinationID) >= 
 
TileIndex _backup_orders_tile;
 
BackuppedOrders _backup_orders_data;
 

	
 
DEFINE_OLD_POOL_GENERIC(Order, Order)
 
DEFINE_OLD_POOL_GENERIC(Order, Order);
 

	
 
OrderNonStopFlags Order::GetNonStopType() const
 
{
 
	return (this->flags & 0x8) ?
 
			((!_patches.new_nonstop || !this->IsType(OT_GOTO_STATION)) ?
 
					ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS :
 
					ONSF_NO_STOP_AT_DESTINATION_STATION) :
 
			ONSF_STOP_EVERYWHERE;
 
}
 

	
 
void Order::Free()
 
{
 
@@ -59,7 +68,12 @@ void Order::MakeGoToStation(StationID de
 
void Order::MakeGoToDepot(DepotID destination, bool order, CargoID cargo, byte subtype)
 
{
 
	this->type = OT_GOTO_DEPOT;
 
	this->flags = order ? OFB_PART_OF_ORDERS : OFB_NON_STOP;
 
	this->flags = 0;
 
	if (order) {
 
		this->SetDepotOrderType(OFB_PART_OF_ORDERS);
 
	} else {
 
		this->SetNonStopType(ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS);
 
	}
 
	this->dest = destination;
 
	this->SetRefit(cargo, subtype);
 
}
 
@@ -303,7 +317,7 @@ CommandCost CmdInsertOrder(TileIndex til
 
				default: return CMD_ERROR;
 
			}
 

	
 
			if (new_order.GetNonStopType() != OFB_NO_NON_STOP && v->type != VEH_TRAIN) return CMD_ERROR;
 
			if (new_order.GetNonStopType() != ONSF_STOP_EVERYWHERE && v->type != VEH_TRAIN) return CMD_ERROR;
 

	
 
			/* Order flags can be any of the following for stations:
 
			 * [full-load | unload] [+ transfer] [+ non-stop]
 
@@ -358,7 +372,7 @@ CommandCost CmdInsertOrder(TileIndex til
 
				}
 
			}
 

	
 
			if (new_order.GetNonStopType() != OFB_NO_NON_STOP && v->type != VEH_TRAIN) return CMD_ERROR;
 
			if (new_order.GetNonStopType() != ONSF_STOP_EVERYWHERE && v->type != VEH_TRAIN) return CMD_ERROR;
 

	
 
			/* Order flags can be any of the following for depots:
 
			 * order [+ halt] [+ non-stop]
 
@@ -385,16 +399,7 @@ CommandCost CmdInsertOrder(TileIndex til
 
			/* Order flags can be any of the following for waypoints:
 
			 * [non-stop]
 
			 * non-stop orders (if any) are only valid for trains */
 
			switch (new_order.GetNonStopType()) {
 
				case OFB_NO_NON_STOP: break;
 

	
 
				case OFB_NON_STOP:
 
					if (v->type != VEH_TRAIN) return CMD_ERROR;
 
					break;
 

	
 
				default: return CMD_ERROR;
 
			}
 
			break;
 
			if (new_order.GetNonStopType() != ONSF_STOP_EVERYWHERE && v->type != VEH_TRAIN) return CMD_ERROR;
 
		}
 

	
 
		default: return CMD_ERROR;
 
@@ -588,7 +593,7 @@ CommandCost CmdDeleteOrder(TileIndex til
 
			/* NON-stop flag is misused to see if a train is in a station that is
 
			 * on his order list or not */
 
			if (sel_ord == u->cur_order_index && u->current_order.IsType(OT_LOADING)) {
 
				u->current_order.SetNonStopType(OFB_NO_NON_STOP);
 
				u->current_order.SetNonStopType(ONSF_STOP_EVERYWHERE);
 
			}
 

	
 
			/* Update any possible open window of the vehicle */
 
@@ -772,7 +777,7 @@ CommandCost CmdModifyOrder(TileIndex til
 
				order->SetLoadType(0);
 
				break;
 
			case OF_NON_STOP:
 
				order->SetNonStopType(order->GetNonStopType() ^ OFB_NON_STOP);
 
				order->SetNonStopType(order->GetNonStopType() == ONSF_STOP_EVERYWHERE ? ONSF_NO_STOP_AT_ANY_STATION : ONSF_STOP_EVERYWHERE);
 
				break;
 
			case OF_TRANSFER:
 
				order->SetUnloadType(order->GetUnloadType() ^ OFB_TRANSFER);
 
@@ -1396,9 +1401,8 @@ bool ProcessOrders(Vehicle *v)
 
		v->cur_order_index++;
 
	}
 

	
 
	/* Check if we've reached a non-stop station while TTDPatch nonstop is enabled.. */
 
	if (_patches.new_nonstop &&
 
			v->current_order.GetNonStopType() & OFB_NON_STOP &&
 
	/* Check if we've reached a non-stop station.. */
 
	if ((v->current_order.GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION) &&
 
			IsTileType(v->tile, MP_STATION) &&
 
			v->current_order.GetDestination() == GetStationIndex(v->tile)) {
 
		v->last_station_visited = v->current_order.GetDestination();
 
@@ -1482,10 +1486,8 @@ bool Order::ShouldStopAtStation(const Ve
 
{
 
	return
 
			v->last_station_visited != station && // Do stop only when we've not just been there
 
			type == OT_GOTO_STATION &&            // Do stop only when going to a station
 
			/* Finally do stop when the non-stop flag is not set, or when we should stop at
 
			 * this station according to the new_nonstop setting. */
 
			(!(this->flags & OFB_NON_STOP) || ((this->dest != station) == _patches.new_nonstop));
 
			/* Finally do stop when there is no non-stop flag set for this type of station. */
 
			!(this->GetNonStopType() & ((this->dest == station) ? ONSF_NO_STOP_AT_DESTINATION_STATION : ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS));
 
}
 

	
 
void InitializeOrders()
src/order_gui.cpp
Show inline comments
 
@@ -215,7 +215,7 @@ static void DrawOrdersWindow(Window *w)
 
						SetDParam(2, GetDepot(order->GetDestination())->town_index);
 

	
 
						switch (v->type) {
 
							case VEH_TRAIN: s = (order->GetNonStopType() & OFB_NON_STOP) ? STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT : STR_GO_TO_TRAIN_DEPOT; break;
 
							case VEH_TRAIN: s = (order->GetNonStopType() & ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS) ? STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT : STR_GO_TO_TRAIN_DEPOT; break;
 
							case VEH_ROAD:  s = STR_GO_TO_ROADVEH_DEPOT; break;
 
							case VEH_SHIP:  s = STR_GO_TO_SHIP_DEPOT; break;
 
							default: break;
 
@@ -235,7 +235,7 @@ static void DrawOrdersWindow(Window *w)
 
				}
 

	
 
				case OT_GOTO_WAYPOINT:
 
					SetDParam(1, (order->GetNonStopType() & OFB_NON_STOP) ? STR_GO_NON_STOP_TO_WAYPOINT : STR_GO_TO_WAYPOINT);
 
					SetDParam(1, (order->GetNonStopType() & ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS) ? STR_GO_NON_STOP_TO_WAYPOINT : STR_GO_TO_WAYPOINT);
 
					SetDParam(2, order->GetDestination());
 
					break;
 

	
src/order_type.h
Show inline comments
 
@@ -59,12 +59,16 @@ enum OrderFlagMasks {
 
	OFB_HALT_IN_DEPOT      = 0x4,
 
	/** if OFB_PART_OF_ORDERS is set, this will cause the order only be come active if the vehicle needs servicing */
 
	OFB_SERVICE_IF_NEEDED  = 0x4, //used when OFB_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 */
 
	OFB_NO_NON_STOP        = 0x0,
 
	OFB_NON_STOP           = 0x8
 
/**
 
 * Non-stop order flags.
 
 */
 
enum OrderNonStopFlags {
 
	ONSF_STOP_EVERYWHERE                  = 0,
 
	ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS = 1,
 
	ONSF_NO_STOP_AT_DESTINATION_STATION   = 2,
 
	ONSF_NO_STOP_AT_ANY_STATION           = 3
 
};
 

	
 
/** Order flags bits - these are for the *BIT macros
src/roadveh_cmd.cpp
Show inline comments
 
@@ -1929,7 +1929,7 @@ static void CheckIfRoadVehNeedsService(V
 
	}
 

	
 
	if (v->current_order.IsType(OT_GOTO_DEPOT) &&
 
			v->current_order.GetNonStopType() & OFB_NON_STOP &&
 
			v->current_order.GetNonStopType() & ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS &&
 
			!Chance16(1, 20)) {
 
		return;
 
	}
src/timetable_cmd.cpp
Show inline comments
 
@@ -70,7 +70,7 @@ CommandCost CmdChangeTimetable(TileIndex
 
	bool is_journey = HasBit(p1, 24) || packed_time;
 
	if (!is_journey) {
 
		if (!order->IsType(OT_GOTO_STATION)) return_cmd_error(STR_TIMETABLE_ONLY_WAIT_AT_STATIONS);
 
		if (_patches.new_nonstop && (order->GetNonStopType() & OFB_NON_STOP)) return_cmd_error(STR_TIMETABLE_NOT_STOPPING_HERE);
 
		if (order->GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION) return_cmd_error(STR_TIMETABLE_NOT_STOPPING_HERE);
 
	}
 

	
 
	if (flags & DC_EXEC) {
src/timetable_gui.cpp
Show inline comments
 
@@ -79,7 +79,7 @@ static void DrawTimetableWindow(Window *
 
			w->EnableWidget(TTV_CLEAR_TIME);
 
		} else {
 
			const Order *order = GetVehicleOrder(v, (selected + 1) / 2);
 
			bool disable = order == NULL || !order->IsType(OT_GOTO_STATION) || (_patches.new_nonstop && (order->GetNonStopType() & OFB_NON_STOP));
 
			bool disable = order == NULL || !order->IsType(OT_GOTO_STATION) || (order->GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION);
 

	
 
			w->SetWidgetDisabledState(TTV_CHANGE_TIME, disable);
 
			w->SetWidgetDisabledState(TTV_CLEAR_TIME, disable);
 
@@ -119,7 +119,7 @@ static void DrawTimetableWindow(Window *
 
					break;
 

	
 
				case OT_GOTO_STATION:
 
					SetDParam(0, (order->GetNonStopType() & OFB_NON_STOP) ? STR_880A_GO_NON_STOP_TO : STR_8806_GO_TO);
 
					SetDParam(0, (order->GetNonStopType() != ONSF_STOP_EVERYWHERE) ? STR_880A_GO_NON_STOP_TO : STR_8806_GO_TO);
 
					SetDParam(1, order->GetDestination());
 

	
 
					if (order->wait_time > 0) {
 
@@ -139,7 +139,7 @@ static void DrawTimetableWindow(Window *
 
						SetDParam(1, GetDepot(order->GetDestination())->town_index);
 

	
 
						switch (v->type) {
 
							case VEH_TRAIN: string = (order->GetNonStopType() & OFB_NON_STOP) ? STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT : STR_GO_TO_TRAIN_DEPOT; break;
 
							case VEH_TRAIN: string = (order->GetNonStopType() != ONSF_STOP_EVERYWHERE) ? STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT : STR_GO_TO_TRAIN_DEPOT; break;
 
							case VEH_ROAD:  string = STR_GO_TO_ROADVEH_DEPOT; break;
 
							case VEH_SHIP:  string = STR_GO_TO_SHIP_DEPOT; break;
 
							default: break;
 
@@ -152,7 +152,7 @@ static void DrawTimetableWindow(Window *
 
				} break;
 

	
 
				case OT_GOTO_WAYPOINT:
 
					SetDParam(0, (order->GetNonStopType() & OFB_NON_STOP) ? STR_GO_NON_STOP_TO_WAYPOINT : STR_GO_TO_WAYPOINT);
 
					SetDParam(0, (order->GetNonStopType() != ONSF_STOP_EVERYWHERE) ? STR_GO_NON_STOP_TO_WAYPOINT : STR_GO_TO_WAYPOINT);
 
					SetDParam(1, order->GetDestination());
 
					break;
 

	
 
@@ -197,7 +197,7 @@ static void DrawTimetableWindow(Window *
 
		for (const Order *order = GetVehicleOrder(v, 0); order != NULL; order = order->next) {
 
			total_time += order->travel_time + order->wait_time;
 
			if (order->travel_time == 0) complete = false;
 
			if (order->wait_time == 0 && order->IsType(OT_GOTO_STATION) && !(_patches.new_nonstop && (order->GetNonStopType() & OFB_NON_STOP))) complete = false;
 
			if (order->wait_time == 0 && order->IsType(OT_GOTO_STATION) && !(order->GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION)) complete = false;
 
		}
 

	
 
		if (total_time != 0) {
src/vehicle.cpp
Show inline comments
 
@@ -3138,12 +3138,12 @@ void Vehicle::BeginLoading()
 
		 * necessary to be known for HandleTrainLoading to determine
 
		 * whether the train is lost or not; not marking a train lost
 
		 * that arrives at random stations is bad. */
 
		this->current_order.SetNonStopType(OFB_NON_STOP);
 
		this->current_order.SetNonStopType(ONSF_NO_STOP_AT_ANY_STATION);
 

	
 
		current_order.MakeLoading(true);
 
		UpdateVehicleTimetable(this, true);
 
	} else {
 
		this->current_order.SetNonStopType(OFB_NO_NON_STOP);
 
		this->current_order.SetNonStopType(ONSF_STOP_EVERYWHERE);
 
		current_order.MakeLoading(false);
 
	}
 

	
 
@@ -3165,7 +3165,7 @@ void Vehicle::LeaveStation()
 
	assert(current_order.IsType(OT_LOADING));
 

	
 
	/* Only update the timetable if the vehicle was supposed to stop here. */
 
	if (current_order.GetNonStopType() != OFB_NO_NON_STOP) UpdateVehicleTimetable(this, false);
 
	if (current_order.GetNonStopType() != ONSF_STOP_EVERYWHERE) UpdateVehicleTimetable(this, false);
 

	
 
	current_order.MakeLeaveStation();
 
	GetStation(this->last_station_visited)->loading_vehicles.remove(this);
 
@@ -3187,11 +3187,11 @@ void Vehicle::HandleLoading(bool mode)
 

	
 
			this->PlayLeaveStationSound();
 

	
 
			Order b = this->current_order;
 
			bool at_destination_station = this->current_order.GetNonStopType() != ONSF_STOP_EVERYWHERE;
 
			this->LeaveStation();
 

	
 
			/* If this was not the final order, don't remove it from the list. */
 
			if (!(b.GetNonStopType() & OFB_NON_STOP)) return;
 
			if (!at_destination_station) return;
 
			break;
 
		}
 

	
0 comments (0 inline, 0 general)