 cbdd9f84d8
			
		
	
	cbdd9f84d8
	
	
	
		
			
			# Conflicts: # src/console_gui.cpp # src/lang/korean.txt # src/video/sdl2_v.cpp # src/video/sdl2_v.h # src/window.cpp # src/window_gui.h
		
			
				
	
	
		
			146 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			146 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  * This file is part of OpenTTD.
 | |
|  * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
 | |
|  * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 | |
|  * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
 | |
|  */
 | |
| 
 | |
| /** @file cargoaction.h Actions to be applied to cargo packets. */
 | |
| 
 | |
| #ifndef CARGOACTION_H
 | |
| #define CARGOACTION_H
 | |
| 
 | |
| #include "cargopacket.h"
 | |
| #include <vector>
 | |
| 
 | |
| /**
 | |
|  * Abstract action of removing cargo from a vehicle or a station.
 | |
|  * @tparam Tsource CargoList subclass to remove cargo from.
 | |
|  */
 | |
| template<class Tsource>
 | |
| class CargoRemoval {
 | |
| protected:
 | |
| 	Tsource *source; ///< Source of the cargo.
 | |
| 	uint max_move;   ///< Maximum amount of cargo to be removed with this action.
 | |
| 	uint Preprocess(CargoPacket *cp);
 | |
| 	bool Postprocess(CargoPacket *cp, uint remove);
 | |
| public:
 | |
| 	CargoRemoval(Tsource *source, uint max_move) : source(source), max_move(max_move) {}
 | |
| 
 | |
| 	/**
 | |
| 	 * Returns how much more cargo can be removed with this action.
 | |
| 	 * @return Amount of cargo this action can still remove.
 | |
| 	 */
 | |
| 	uint MaxMove() { return this->max_move; }
 | |
| 
 | |
| 	bool operator()(CargoPacket *cp);
 | |
| };
 | |
| 
 | |
| /** Action of final delivery of cargo. */
 | |
| class CargoDelivery : public CargoRemoval<VehicleCargoList> {
 | |
| protected:
 | |
| 	CargoPayment *payment; ///< Payment object where payments will be registered.
 | |
| public:
 | |
| 	CargoDelivery(VehicleCargoList *source, uint max_move, CargoPayment *payment) :
 | |
| 			CargoRemoval<VehicleCargoList>(source, max_move), payment(payment) {}
 | |
| 	bool operator()(CargoPacket *cp);
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * Abstract action for moving cargo from one list to another.
 | |
|  * @tparam Tsource CargoList subclass to remove cargo from.
 | |
|  * @tparam Tdest CargoList subclass to add cargo to.
 | |
|  */
 | |
| template<class Tsource, class Tdest>
 | |
| class CargoMovement {
 | |
| protected:
 | |
| 	Tsource *source;    ///< Source of the cargo.
 | |
| 	Tdest *destination; ///< Destination for the cargo.
 | |
| 	uint max_move;      ///< Maximum amount of cargo to be moved with this action.
 | |
| 	CargoPacket *Preprocess(CargoPacket *cp);
 | |
| public:
 | |
| 	CargoMovement(Tsource *source, Tdest *destination, uint max_move) : source(source), destination(destination), max_move(max_move) {}
 | |
| 
 | |
| 	/**
 | |
| 	 * Returns how much more cargo can be moved with this action.
 | |
| 	 * @return Amount of cargo this action can still move.
 | |
| 	 */
 | |
| 	uint MaxMove() { return this->max_move; }
 | |
| };
 | |
| 
 | |
| /** Action of transferring cargo from a vehicle to a station. */
 | |
| class CargoTransfer : public CargoMovement<VehicleCargoList, StationCargoList> {
 | |
| public:
 | |
| 	CargoTransfer(VehicleCargoList *source, StationCargoList *destination, uint max_move) :
 | |
| 			CargoMovement<VehicleCargoList, StationCargoList>(source, destination, max_move) {}
 | |
| 	bool operator()(CargoPacket *cp);
 | |
| };
 | |
| 
 | |
| /** Action of loading cargo from a station onto a vehicle. */
 | |
| class CargoLoad : public CargoMovement<StationCargoList, VehicleCargoList> {
 | |
| protected:
 | |
| 	TileIndex load_place; ///< TileIndex to be saved in the packets' loaded_at_xy.
 | |
| public:
 | |
| 	CargoLoad(StationCargoList *source, VehicleCargoList *destination, uint max_move, TileIndex load_place) :
 | |
| 			CargoMovement<StationCargoList, VehicleCargoList>(source, destination, max_move), load_place(load_place) {}
 | |
| 	bool operator()(CargoPacket *cp);
 | |
| };
 | |
| 
 | |
| /** Action of reserving cargo from a station to be loaded onto a vehicle. */
 | |
| class CargoReservation : public CargoLoad {
 | |
| public:
 | |
| 	CargoReservation(StationCargoList *source, VehicleCargoList *destination, uint max_move, TileIndex load_place) :
 | |
| 			CargoLoad(source, destination, max_move, load_place) {}
 | |
| 	bool operator()(CargoPacket *cp);
 | |
| };
 | |
| 
 | |
| /** Action of returning previously reserved cargo from the vehicle to the station. */
 | |
| class CargoReturn : public CargoMovement<VehicleCargoList, StationCargoList> {
 | |
| 	StationID next;
 | |
| public:
 | |
| 	CargoReturn(VehicleCargoList *source, StationCargoList *destination, uint max_move, StationID next) :
 | |
| 			CargoMovement<VehicleCargoList, StationCargoList>(source, destination, max_move), next(next) {}
 | |
| 	bool operator()(CargoPacket *cp);
 | |
| };
 | |
| 
 | |
| /** Action of shifting cargo from one vehicle to another. */
 | |
| class CargoShift : public CargoMovement<VehicleCargoList, VehicleCargoList> {
 | |
| public:
 | |
| 	CargoShift(VehicleCargoList *source, VehicleCargoList *destination, uint max_move) :
 | |
| 			CargoMovement<VehicleCargoList, VehicleCargoList>(source, destination, max_move) {}
 | |
| 	bool operator()(CargoPacket *cp);
 | |
| };
 | |
| 
 | |
| /** Action of rerouting cargo between different cargo lists and/or next hops. */
 | |
| template<class Tlist>
 | |
| class CargoReroute : public CargoMovement<Tlist, Tlist> {
 | |
| protected:
 | |
| 	StationID avoid;
 | |
| 	StationID avoid2;
 | |
| 	const GoodsEntry *ge;
 | |
| public:
 | |
| 	CargoReroute(Tlist *source, Tlist *dest, uint max_move, StationID avoid, StationID avoid2, const GoodsEntry *ge) :
 | |
| 			CargoMovement<Tlist, Tlist>(source, dest, max_move), avoid(avoid), avoid2(avoid2), ge(ge) {}
 | |
| };
 | |
| 
 | |
| /** Action of rerouting cargo in a station. */
 | |
| class StationCargoReroute : public CargoReroute<StationCargoList> {
 | |
| public:
 | |
| 	StationCargoReroute(StationCargoList *source, StationCargoList *dest, uint max_move, StationID avoid, StationID avoid2, const GoodsEntry *ge) :
 | |
| 				CargoReroute<StationCargoList>(source, dest, max_move, avoid, avoid2, ge) {}
 | |
| 	bool operator()(CargoPacket *cp);
 | |
| };
 | |
| 
 | |
| /** Action of rerouting cargo staged for transfer in a vehicle. */
 | |
| class VehicleCargoReroute : public CargoReroute<VehicleCargoList> {
 | |
| public:
 | |
| 	VehicleCargoReroute(VehicleCargoList *source, VehicleCargoList *dest, uint max_move, StationID avoid, StationID avoid2, const GoodsEntry *ge) :
 | |
| 			CargoReroute<VehicleCargoList>(source, dest, max_move, avoid, avoid2, ge)
 | |
| 	{
 | |
| 		assert(this->max_move <= source->ActionCount(VehicleCargoList::MTA_TRANSFER));
 | |
| 	}
 | |
| 	bool operator()(CargoPacket *cp, std::vector<CargoPacket *> &front_insert);
 | |
| };
 | |
| 
 | |
| #endif /* CARGOACTION_H */
 |