File diff r20053:1f0b373e9dce → r20054:152d076eb07b
src/cargopacket.h
Show inline comments
 
@@ -29,6 +29,7 @@ typedef Pool<CargoPacket, CargoPacketID,
 
extern CargoPacketPool _cargopacket_pool;
 

	
 
template <class Tinst> class CargoList;
 
class StationCargoList; // forward-declare, so we can use it in VehicleCargoList.
 
extern const struct SaveLoad *GetCargoPacketDesc();
 

	
 
/**
 
@@ -203,10 +204,13 @@ public:
 

	
 
	/** Kind of actions that could be done with packets on move. */
 
	enum MoveToAction {
 
		MTA_FINAL_DELIVERY, ///< "Deliver" the packet to the final destination, i.e. destroy the packet.
 
		MTA_CARGO_LOAD,     ///< Load the packet onto a vehicle, i.e. set the last loaded station ID.
 
		MTA_TRANSFER,       ///< The cargo is moved as part of a transfer.
 
		MTA_UNLOAD,         ///< The cargo is moved as part of a forced unload.
 
		MTA_BEGIN = 0,
 
		MTA_TRANSFER = 0, ///< Transfer the cargo to the station.
 
		MTA_DELIVER,      ///< Deliver the cargo to some town or industry.
 
		MTA_KEEP,         ///< Keep the cargo in the vehicle.
 
		MTA_LOAD,         ///< Load the cargo from the station.
 
		MTA_END,
 
		NUM_MOVE_TO_ACTION = MTA_END
 
	};
 

	
 
protected:
 
@@ -280,13 +284,8 @@ public:
 
		return this->count == 0 ? 0 : this->cargo_days_in_transit / this->count;
 
	}
 

	
 

	
 
	void Append(CargoPacket *cp);
 
	uint Truncate(uint max_move = UINT_MAX);
 

	
 
	template <class Tother_inst>
 
	bool MoveTo(Tother_inst *dest, uint count, MoveToAction mta, CargoPayment *payment, uint data = 0);
 

	
 
	void InvalidateCache();
 
};
 

	
 
@@ -298,11 +297,26 @@ protected:
 
	/** The (direct) parent of this class. */
 
	typedef CargoList<VehicleCargoList> Parent;
 

	
 
	Money feeder_share; ///< Cache for the feeder share.
 
	Money feeder_share;                     ///< Cache for the feeder share.
 
	uint action_counts[NUM_MOVE_TO_ACTION]; ///< Counts of cargo to be transfered, delivered, kept and loaded.
 

	
 
	/**
 
	 * Assert that the designation counts add up.
 
	 */
 
	inline void AssertCountConsistency() const
 
	{
 
		assert(this->action_counts[MTA_KEEP] +
 
				this->action_counts[MTA_DELIVER] +
 
				this->action_counts[MTA_TRANSFER] +
 
				this->action_counts[MTA_LOAD] == this->count);
 
	}
 

	
 
	void AddToCache(const CargoPacket *cp);
 
	void RemoveFromCache(const CargoPacket *cp, uint count);
 

	
 
	void AddToMeta(const CargoPacket *cp, MoveToAction action);
 
	void RemoveFromMeta(const CargoPacket *cp, MoveToAction action, uint count);
 

	
 
public:
 
	/** The super class ought to know what it's doing. */
 
	friend class CargoList<VehicleCargoList>;
 
@@ -314,6 +328,7 @@ public:
 
	friend class CargoDelivery;
 
	template<class Tsource>
 
	friend class CargoRemoval;
 
	friend class CargoReturn;
 

	
 
	/**
 
	 * Returns total sum of the feeder share for all packets.
 
@@ -324,10 +339,72 @@ public:
 
		return this->feeder_share;
 
	}
 

	
 
	/**
 
	 * Returns the amount of cargo designated for a given purpose.
 
	 * @param action Action the cargo is designated for.
 
	 * @return Amount of cargo designated for the given action.
 
	 */
 
	inline uint ActionCount(MoveToAction action) const
 
	{
 
		return this->action_counts[action];
 
	}
 

	
 
	/**
 
	 * Returns sum of cargo on board the vehicle (ie not only
 
	 * reserved).
 
	 * @return Cargo on board the vehicle.
 
	 */
 
	inline uint OnboardCount() const
 
	{
 
		return this->count - this->action_counts[MTA_LOAD];
 
	}
 

	
 
	/**
 
	 * Returns sum of cargo to be moved out of the vehicle at the current station.
 
	 * @return Cargo to be moved.
 
	 */
 
	inline uint UnloadCount() const
 
	{
 
		return this->action_counts[MTA_TRANSFER] + this->action_counts[MTA_DELIVER];
 
	}
 

	
 
	/**
 
	 * Returns the sum of cargo to be kept in the vehicle at the current station.
 
	 * @return Cargo to be kept or loaded.
 
	 */
 
	inline uint RemainingCount() const
 
	{
 
		return this->action_counts[MTA_KEEP] + this->action_counts[MTA_LOAD];
 
	}
 

	
 
	void Append(CargoPacket *cp, MoveToAction action = MTA_KEEP);
 

	
 
	void AgeCargo();
 

	
 
	void InvalidateCache();
 

	
 
	bool Stage(bool accepted, StationID current_station, uint8 order_flags);
 

	
 
	/**
 
	 * Marks all cargo in the vehicle as to be kept. This is mostly useful for
 
	 * loading old savegames. When loading is aborted the reserved cargo has
 
	 * to be returned first.
 
	 */
 
	inline void KeepAll()
 
	{
 
		this->action_counts[MTA_DELIVER] = this->action_counts[MTA_TRANSFER] = this->action_counts[MTA_LOAD] = 0;
 
		this->action_counts[MTA_KEEP] = this->count;
 
	}
 

	
 
	/* Methods for moving cargo around. First parameter is always maximum
 
	 * amount of cargo to be moved. Second parameter is destination (if
 
	 * applicable), return value is amount of cargo actually moved. */
 

	
 
	uint Reassign(uint max_move, MoveToAction from, MoveToAction to);
 
	uint Return(uint max_move, StationCargoList *dest);
 
	uint Unload(uint max_move, StationCargoList *dest, CargoPayment *payment);
 
	uint Shift(uint max_move, VehicleCargoList *dest);
 

	
 
	/**
 
	 * Are two the two CargoPackets mergeable in the context of
 
	 * a list of CargoPackets for a Vehicle?
 
@@ -349,6 +426,12 @@ public:
 
 * CargoList that is used for stations.
 
 */
 
class StationCargoList : public CargoList<StationCargoList> {
 
protected:
 
	/** The (direct) parent of this class. */
 
	typedef CargoList<StationCargoList> Parent;
 

	
 
	uint reserved_count; ///< Amount of cargo being reserved for loading.
 

	
 
public:
 
	/** The super class ought to know what it's doing. */
 
	friend class CargoList<StationCargoList>;
 
@@ -359,6 +442,17 @@ public:
 
	friend class CargoTransfer;
 
	template<class Tsource>
 
	friend class CargoRemoval;
 
	friend class CargoReservation;
 
	friend class CargoReturn;
 

	
 
	void Append(CargoPacket *cp);
 

	
 
	/* Methods for moving cargo around. First parameter is always maximum
 
	 * amount of cargo to be moved. Second parameter is destination (if
 
	 * applicable), return value is amount of cargo actually moved. */
 

	
 
	uint Reserve(uint max_move, VehicleCargoList *dest, TileIndex load_place);
 
	uint Load(uint max_move, VehicleCargoList *dest, TileIndex load_place);
 

	
 
	/**
 
	 * Are two the two CargoPackets mergeable in the context of