Changeset - r8838:ab02a7e7aabf
[Not reviewed]
master
0 6 0
rubidium - 16 years ago 2008-04-06 07:07:21
rubidium@openttd.org
(svn r12586) -Codechange: do not access an order's refit variables directly.
6 files changed with 55 insertions and 25 deletions:
0 comments (0 inline, 0 general)
src/autoreplace_cmd.cpp
Show inline comments
 
@@ -68,15 +68,15 @@ static bool VerifyAutoreplaceRefitForOrd
 
		u = v->First();
 
	} else {
 
		u = v;
 
	}
 

	
 
	FOR_VEHICLE_ORDERS(u, o) {
 
		if (!(o->refit_cargo < NUM_CARGO)) continue;
 
		if (!CanRefitTo(v->engine_type, o->refit_cargo)) continue;
 
		if (!CanRefitTo(engine_type, o->refit_cargo)) return false;
 
		if (!o->IsRefit()) continue;
 
		if (!CanRefitTo(v->engine_type, o->GetRefitCargo())) continue;
 
		if (!CanRefitTo(engine_type, o->GetRefitCargo())) return false;
 
	}
 

	
 
	return true;
 
}
 

	
 
/**
src/openttd.cpp
Show inline comments
 
@@ -1984,19 +1984,17 @@ bool AfterLoadGame()
 
	/* Setting no refit flags to all orders in savegames from before refit in orders were added */
 
	if (CheckSavegameVersion(36)) {
 
		Order *order;
 
		Vehicle *v;
 

	
 
		FOR_ALL_ORDERS(order) {
 
			order->refit_cargo   = CT_NO_REFIT;
 
			order->refit_subtype = CT_NO_REFIT;
 
			order->SetRefit(CT_NO_REFIT);
 
		}
 

	
 
		FOR_ALL_VEHICLES(v) {
 
			v->current_order.refit_cargo   = CT_NO_REFIT;
 
			v->current_order.refit_subtype = CT_NO_REFIT;
 
			v->current_order.SetRefit(CT_NO_REFIT);
 
		}
 
	}
 

	
 
	/* from version 38 we have optional elrails, since we cannot know the
 
	 * preference of a user, let elrails enabled; it can be disabled manually */
 
	if (CheckSavegameVersion(38)) _patches.disable_elrails = false;
src/order_base.h
Show inline comments
 
@@ -28,23 +28,23 @@ private:
 
	friend const struct SaveLoad *GetOrderDescription();                 ///< Saving and loading of orders.
 
	friend uint32 PackOrder(const Order *order);                         ///< 'Compressing' an order.
 
	friend Order UnpackOrder(uint32 packed);                             ///< 'Uncompressing' an order.
 
	friend Order UnpackOldOrder(uint16 packed);                          ///< 'Uncompressing' a loaded old 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:
 
	Order *next;          ///< Pointer to next order. If NULL, end of list
 

	
 
	uint8  flags;
 
	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 travel_time;  ///< How long in ticks the journey to this destination should take.
 

	
 
	Order() : refit_cargo(CT_NO_REFIT) {}
 
	~Order() { this->type = OT_NOTHING; }
 

	
 
@@ -80,14 +80,16 @@ public:
 
	void MakeGoToStation(StationID destination);
 

	
 
	/**
 
	 * Makes this order a Go To Depot order.
 
	 * @param destination the depot to go to.
 
	 * @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.
 
	 * @param destination the waypoint to go to.
 
	 */
 
	void MakeGoToWaypoint(WaypointID destination);
 
@@ -110,12 +112,41 @@ public:
 
	/**
 
	 * Free a complete order chain.
 
	 * @note do not use on "current_order" vehicle orders!
 
	 */
 
	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;
 

	
 
	/**
 
	 * Assign the given order to this one.
 
	 * @param other the data to copy (except next pointer).
 
	 */
src/order_cmd.cpp
Show inline comments
 
@@ -52,19 +52,18 @@ void Order::MakeGoToStation(StationID de
 
{
 
	this->type = OT_GOTO_STATION;
 
	this->flags = 0;
 
	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->flags = order ? OFB_PART_OF_ORDERS : OFB_NON_STOP;
 
	this->dest = destination;
 
	this->refit_cargo = CT_NO_REFIT;
 
	this->refit_subtype = 0;
 
	this->SetRefit(cargo, subtype);
 
}
 

	
 
void Order::MakeGoToWaypoint(WaypointID destination)
 
{
 
	this->type = OT_GOTO_WAYPOINT;
 
	this->flags = 0;
 
@@ -85,12 +84,18 @@ void Order::MakeLeaveStation()
 
void Order::MakeDummy()
 
{
 
	this->type = OT_DUMMY;
 
	this->flags = 0;
 
}
 

	
 
void Order::SetRefit(CargoID cargo, byte subtype)
 
{
 
	this->refit_cargo = cargo;
 
	this->refit_subtype = subtype;
 
}
 

	
 
void Order::FreeChain()
 
{
 
	if (next != NULL) next->FreeChain();
 
	delete this;
 
}
 

	
 
@@ -999,24 +1004,22 @@ CommandCost CmdOrderRefit(TileIndex tile
 
	order = GetVehicleOrder(v, order_number);
 
	if (order == NULL) return CMD_ERROR;
 

	
 
	if (flags & DC_EXEC) {
 
		Vehicle *u;
 

	
 
		order->refit_cargo = cargo;
 
		order->refit_subtype = subtype;
 
		order->SetRefit(cargo, subtype);
 

	
 
		u = GetFirstVehicleFromSharedList(v);
 
		for (; u != NULL; u = u->next_shared) {
 
			/* Update any possible open window of the vehicle */
 
			InvalidateVehicleOrder(u);
 

	
 
			/* 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)) {
 
				u->current_order.refit_cargo = cargo;
 
				u->current_order.refit_subtype = subtype;
 
				u->current_order.SetRefit(cargo, subtype);
 
			}
 
		}
 
	}
 

	
 
	return CommandCost();
 
}
src/order_gui.cpp
Show inline comments
 
@@ -222,15 +222,15 @@ static void DrawOrdersWindow(Window *w)
 
						}
 
					}
 

	
 
					if (order->flags & OFB_FULL_LOAD) s++; /* service at */
 

	
 
					SetDParam(1, s);
 
					if (order->refit_cargo < NUM_CARGO) {
 
					if (order->IsRefit()) {
 
						SetDParam(3, STR_REFIT_ORDER);
 
						SetDParam(4, GetCargo(order->refit_cargo)->name);
 
						SetDParam(4, GetCargo(order->GetRefitCargo())->name);
 
					} else {
 
						SetDParam(3, STR_EMPTY);
 
					}
 
					break;
 
				}
 

	
 
@@ -260,14 +260,12 @@ static void DrawOrdersWindow(Window *w)
 

	
 
static Order GetOrderCmdFromTile(const Vehicle *v, TileIndex tile)
 
{
 
	Order order;
 
	order.next  = NULL;
 
	order.index = 0;
 
	order.refit_cargo   = CT_INVALID;
 
	order.refit_subtype = 0;
 

	
 
	// check depot first
 
	if (_patches.gotodepot) {
 
		switch (GetTileType(tile)) {
 
		case MP_RAILWAY:
 
			if (v->type == VEH_TRAIN && IsTileOwner(tile, _local_player)) {
src/vehicle.cpp
Show inline comments
 
@@ -2240,17 +2240,17 @@ void VehicleEnterDepot(Vehicle *v)
 

	
 
		InvalidateWindow(WC_VEHICLE_VIEW, v->index);
 

	
 
		t = v->current_order;
 
		v->current_order.MakeDummy();
 

	
 
		if (t.refit_cargo < NUM_CARGO) {
 
		if (t.IsRefit()) {
 
			CommandCost cost;
 

	
 
			_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)) {
 
				v->leave_depot_instantly = false; // We ensure that the vehicle stays in the depot
 
				if (v->owner == _local_player) {
 
					/* Notify the user that we stopped the vehicle */
 
					SetDParam(0, _vehicle_type_names[v->type]);
0 comments (0 inline, 0 general)