Merge branch 'pr-138' into jgrpp
This commit is contained in:
		@@ -11,6 +11,7 @@
 | 
				
			|||||||
#include "yapf.hpp"
 | 
					#include "yapf.hpp"
 | 
				
			||||||
#include "yapf_node_road.hpp"
 | 
					#include "yapf_node_road.hpp"
 | 
				
			||||||
#include "../../roadstop_base.h"
 | 
					#include "../../roadstop_base.h"
 | 
				
			||||||
 | 
					#include "../../vehicle_func.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "../../safeguards.h"
 | 
					#include "../../safeguards.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -23,6 +24,8 @@
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
const uint MAX_RV_PF_TILES = 1 << 11;
 | 
					const uint MAX_RV_PF_TILES = 1 << 11;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const int MAX_RV_LEADER_TARGETS = 4;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template <class Types>
 | 
					template <class Types>
 | 
				
			||||||
class CYapfCostRoadT
 | 
					class CYapfCostRoadT
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -68,6 +71,15 @@ protected:
 | 
				
			|||||||
	inline int OneTileCost(TileIndex tile, Trackdir trackdir)
 | 
						inline int OneTileCost(TileIndex tile, Trackdir trackdir)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		int cost = 0;
 | 
							int cost = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							bool predicted_occupied = false;
 | 
				
			||||||
 | 
							for (int i = 0; i < MAX_RV_LEADER_TARGETS && Yapf().leader_targets[i] != INVALID_TILE; ++i) {
 | 
				
			||||||
 | 
								if (Yapf().leader_targets[i] != tile) continue;
 | 
				
			||||||
 | 
								cost += Yapf().PfGetSettings().road_curve_penalty;
 | 
				
			||||||
 | 
								predicted_occupied = true;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* set base cost */
 | 
							/* set base cost */
 | 
				
			||||||
		if (IsDiagonalTrackdir(trackdir)) {
 | 
							if (IsDiagonalTrackdir(trackdir)) {
 | 
				
			||||||
			cost += YAPF_TILE_LENGTH;
 | 
								cost += YAPF_TILE_LENGTH;
 | 
				
			||||||
@@ -91,10 +103,18 @@ protected:
 | 
				
			|||||||
							const RoadStop::Entry *entry = rs->GetEntry(dir);
 | 
												const RoadStop::Entry *entry = rs->GetEntry(dir);
 | 
				
			||||||
							cost += entry->GetOccupied() * Yapf().PfGetSettings().road_stop_occupied_penalty / entry->GetLength();
 | 
												cost += entry->GetOccupied() * Yapf().PfGetSettings().road_stop_occupied_penalty / entry->GetLength();
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
											if (predicted_occupied) {
 | 
				
			||||||
 | 
												cost += Yapf().PfGetSettings().road_stop_occupied_penalty;
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
					} else {
 | 
										} else {
 | 
				
			||||||
						/* Increase cost for filled road stops */
 | 
											/* Increase cost for filled road stops */
 | 
				
			||||||
						cost += Yapf().PfGetSettings().road_stop_bay_occupied_penalty * (!rs->IsFreeBay(0) + !rs->IsFreeBay(1)) / 2;
 | 
											cost += Yapf().PfGetSettings().road_stop_bay_occupied_penalty * (!rs->IsFreeBay(0) + !rs->IsFreeBay(1)) / 2;
 | 
				
			||||||
 | 
											if (predicted_occupied) {
 | 
				
			||||||
 | 
												cost += Yapf().PfGetSettings().road_stop_bay_occupied_penalty;
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					break;
 | 
										break;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -326,7 +346,38 @@ public:
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct FindVehiclesOnTileProcData {
 | 
				
			||||||
 | 
						const Vehicle *origin_vehicle;
 | 
				
			||||||
 | 
						TileIndex (*targets)[MAX_RV_LEADER_TARGETS];
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static Vehicle * FindVehiclesOnTileProc(Vehicle *v, void *_data)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						FindVehiclesOnTileProcData *data = (FindVehiclesOnTileProcData*)(_data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (data->origin_vehicle == v) {
 | 
				
			||||||
 | 
							return nullptr;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* only consider vehicles going to the same station as us */
 | 
				
			||||||
 | 
						if (!v->current_order.IsType(OT_GOTO_STATION) || data->origin_vehicle->current_order.GetDestination() != v->current_order.GetDestination()) {
 | 
				
			||||||
 | 
							return nullptr;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						TileIndex ti = v->tile + TileOffsByDir(v->direction);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (int i = 0; i < MAX_RV_LEADER_TARGETS; i++) {
 | 
				
			||||||
 | 
							if ((*data->targets)[i] == INVALID_TILE) {
 | 
				
			||||||
 | 
								(*data->targets)[i] = ti;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if ((*data->targets)[i] == ti) {
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return nullptr;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template <class Types>
 | 
					template <class Types>
 | 
				
			||||||
class CYapfFollowRoadT
 | 
					class CYapfFollowRoadT
 | 
				
			||||||
@@ -392,6 +443,16 @@ public:
 | 
				
			|||||||
		Yapf().SetOrigin(src_tile, src_trackdirs);
 | 
							Yapf().SetOrigin(src_tile, src_trackdirs);
 | 
				
			||||||
		Yapf().SetDestination(v);
 | 
							Yapf().SetDestination(v);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							for (int i = 0; i < MAX_RV_LEADER_TARGETS; ++i) {
 | 
				
			||||||
 | 
								Yapf().leader_targets[i] = INVALID_TILE;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (v->current_order.IsType(OT_GOTO_STATION)) {
 | 
				
			||||||
 | 
								FindVehiclesOnTileProcData data;
 | 
				
			||||||
 | 
								data.origin_vehicle = v;
 | 
				
			||||||
 | 
								data.targets = &Yapf().leader_targets;
 | 
				
			||||||
 | 
								FindVehicleOnPos(tile, VEH_ROAD, &data, &FindVehiclesOnTileProc);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* find the best path */
 | 
							/* find the best path */
 | 
				
			||||||
		path_found = Yapf().FindPath(v);
 | 
							path_found = Yapf().FindPath(v);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -537,11 +598,16 @@ struct CYapfRoad_TypesT
 | 
				
			|||||||
	typedef CYapfCostRoadT<Types>             PfCost;
 | 
						typedef CYapfCostRoadT<Types>             PfCost;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct CYapfRoad1         : CYapfT<CYapfRoad_TypesT<CYapfRoad1        , CRoadNodeListTrackDir, CYapfDestinationTileRoadT    > > {};
 | 
					template <class Types>
 | 
				
			||||||
struct CYapfRoad2         : CYapfT<CYapfRoad_TypesT<CYapfRoad2        , CRoadNodeListExitDir , CYapfDestinationTileRoadT    > > {};
 | 
					struct CYapfRoadCommon : CYapfT<Types> {
 | 
				
			||||||
 | 
						TileIndex leader_targets[MAX_RV_LEADER_TARGETS]; ///< the tiles targeted by vehicles in front of the current vehicle
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct CYapfRoadAnyDepot1 : CYapfT<CYapfRoad_TypesT<CYapfRoadAnyDepot1, CRoadNodeListTrackDir, CYapfDestinationAnyDepotRoadT> > {};
 | 
					struct CYapfRoad1         : CYapfRoadCommon<CYapfRoad_TypesT<CYapfRoad1        , CRoadNodeListTrackDir, CYapfDestinationTileRoadT    > > {};
 | 
				
			||||||
struct CYapfRoadAnyDepot2 : CYapfT<CYapfRoad_TypesT<CYapfRoadAnyDepot2, CRoadNodeListExitDir , CYapfDestinationAnyDepotRoadT> > {};
 | 
					struct CYapfRoad2         : CYapfRoadCommon<CYapfRoad_TypesT<CYapfRoad2        , CRoadNodeListExitDir , CYapfDestinationTileRoadT    > > {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct CYapfRoadAnyDepot1 : CYapfRoadCommon<CYapfRoad_TypesT<CYapfRoadAnyDepot1, CRoadNodeListTrackDir, CYapfDestinationAnyDepotRoadT> > {};
 | 
				
			||||||
 | 
					struct CYapfRoadAnyDepot2 : CYapfRoadCommon<CYapfRoad_TypesT<CYapfRoadAnyDepot2, CRoadNodeListExitDir , CYapfDestinationAnyDepotRoadT> > {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Trackdir YapfRoadVehicleChooseTrack(const RoadVehicle *v, TileIndex tile, DiagDirection enterdir, TrackdirBits trackdirs, bool &path_found, RoadVehPathCache &path_cache)
 | 
					Trackdir YapfRoadVehicleChooseTrack(const RoadVehicle *v, TileIndex tile, DiagDirection enterdir, TrackdirBits trackdirs, bool &path_found, RoadVehPathCache &path_cache)
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user