src/yapf/yapf_costrail.hpp
author KUDr
Fri, 29 Jun 2007 23:55:16 +0000
changeset 7121 ac2b3710f262
parent 7099 a1d7e197cb64
child 7149 1be298a5cc08
permissions -rw-r--r--
(svn r10394) -Fix [YAPF]: MP desync caused by incorrect last-red-signal penalties applied when cached segment was reused. Players that connected more recently (didn't have these segments cached yet) calculated those penalties correctly. This caused different YAPF results.
3900
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
     1
/* $Id$ */
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
     2
6121
2aae24b0881f (svn r8857) -Documentation: Added some doxygen @file tags, repaired others (the @file tag MUST be found before any line of code, that includes preprocessor directives).
celestar
parents: 6040
diff changeset
     3
/** @file yapf_costrail.hpp */
2aae24b0881f (svn r8857) -Documentation: Added some doxygen @file tags, repaired others (the @file tag MUST be found before any line of code, that includes preprocessor directives).
celestar
parents: 6040
diff changeset
     4
3900
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
     5
#ifndef  YAPF_COSTRAIL_HPP
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
     6
#define  YAPF_COSTRAIL_HPP
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
     7
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
     8
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
     9
template <class Types>
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
    10
class CYapfCostRailT
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
    11
	: public CYapfCostBase
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
    12
	, public CostRailSettings
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
    13
{
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
    14
public:
3914
6bdd22b93698 (svn r5018) [YAPF] Added some comments to YAPF implementation.
KUDr
parents: 3900
diff changeset
    15
	typedef typename Types::Tpf Tpf;              ///< the pathfinder class (derived from THIS class)
3900
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
    16
	typedef typename Types::TrackFollower TrackFollower;
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
    17
	typedef typename Types::NodeList::Titem Node; ///< this will be our node type
3914
6bdd22b93698 (svn r5018) [YAPF] Added some comments to YAPF implementation.
KUDr
parents: 3900
diff changeset
    18
	typedef typename Node::Key Key;               ///< key to hash tables
3900
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
    19
	typedef typename Node::CachedData CachedData;
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
    20
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
    21
protected:
7037
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
    22
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
    23
	/* Structure used inside PfCalcCost() to keep basic tile information. */
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
    24
	struct TILE {
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
    25
		TileIndex   tile;
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
    26
		Trackdir    td;
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
    27
		TileType    tile_type;
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
    28
		RailType    rail_type;
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
    29
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
    30
		TILE()
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
    31
		{
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
    32
			tile = INVALID_TILE;
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
    33
			td = INVALID_TRACKDIR;
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
    34
			tile_type = MP_VOID;
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
    35
			rail_type = INVALID_RAILTYPE;
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
    36
		}
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
    37
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
    38
		TILE(TileIndex tile, Trackdir td)
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
    39
		{
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
    40
			this->tile = tile;
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
    41
			this->td = td;
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
    42
			this->tile_type = GetTileType(tile);
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
    43
			this->rail_type = GetTileRailType(tile);
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
    44
		}
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
    45
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
    46
		TILE(const TILE &src)
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
    47
		{
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
    48
			tile = src.tile;
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
    49
			td = src.td;
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
    50
			tile_type = src.tile_type;
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
    51
			rail_type = src.rail_type;
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
    52
		}
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
    53
	};
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
    54
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
    55
protected:
3900
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
    56
	int           m_max_cost;
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
    57
	CBlobT<int>   m_sig_look_ahead_costs;
7099
a1d7e197cb64 (svn r10366) -Codechange [YAPF]: added DEBUG_YAPF_CACHE macro that (when set to 1) allows to track YAPF "cache errors". They are probably responsible for current MP desyncs. (thanks Rubidium for this great idea!).
KUDr
parents: 7040
diff changeset
    58
	bool          m_disable_cache;
7037
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
    59
5424
34b624b01ae1 (svn r7628) -Fix: [YAPF] suppress 'Train is lost' message if pathfinding ended on the first two-way red signal due to yapf.rail_firstred_twoway_eol option.
KUDr
parents: 5095
diff changeset
    60
public:
34b624b01ae1 (svn r7628) -Fix: [YAPF] suppress 'Train is lost' message if pathfinding ended on the first two-way red signal due to yapf.rail_firstred_twoway_eol option.
KUDr
parents: 5095
diff changeset
    61
	bool          m_stopped_on_first_two_way_signal;
34b624b01ae1 (svn r7628) -Fix: [YAPF] suppress 'Train is lost' message if pathfinding ended on the first two-way red signal due to yapf.rail_firstred_twoway_eol option.
KUDr
parents: 5095
diff changeset
    62
protected:
3900
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
    63
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
    64
	static const int s_max_segment_cost = 10000;
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
    65
5424
34b624b01ae1 (svn r7628) -Fix: [YAPF] suppress 'Train is lost' message if pathfinding ended on the first two-way red signal due to yapf.rail_firstred_twoway_eol option.
KUDr
parents: 5095
diff changeset
    66
	CYapfCostRailT()
34b624b01ae1 (svn r7628) -Fix: [YAPF] suppress 'Train is lost' message if pathfinding ended on the first two-way red signal due to yapf.rail_firstred_twoway_eol option.
KUDr
parents: 5095
diff changeset
    67
		: m_max_cost(0)
7099
a1d7e197cb64 (svn r10366) -Codechange [YAPF]: added DEBUG_YAPF_CACHE macro that (when set to 1) allows to track YAPF "cache errors". They are probably responsible for current MP desyncs. (thanks Rubidium for this great idea!).
KUDr
parents: 7040
diff changeset
    68
		, m_disable_cache(false)
5424
34b624b01ae1 (svn r7628) -Fix: [YAPF] suppress 'Train is lost' message if pathfinding ended on the first two-way red signal due to yapf.rail_firstred_twoway_eol option.
KUDr
parents: 5095
diff changeset
    69
		, m_stopped_on_first_two_way_signal(false)
3900
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
    70
	{
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
    71
		// pre-compute look-ahead penalties into array
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
    72
		int p0 = Yapf().PfGetSettings().rail_look_ahead_signal_p0;
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
    73
		int p1 = Yapf().PfGetSettings().rail_look_ahead_signal_p1;
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
    74
		int p2 = Yapf().PfGetSettings().rail_look_ahead_signal_p2;
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
    75
		int *pen = m_sig_look_ahead_costs.GrowSizeNC(Yapf().PfGetSettings().rail_look_ahead_max_signals);
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
    76
		for (uint i = 0; i < Yapf().PfGetSettings().rail_look_ahead_max_signals; i++)
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
    77
			pen[i] = p0 + i * (p1 + i * p2);
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
    78
	}
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
    79
3914
6bdd22b93698 (svn r5018) [YAPF] Added some comments to YAPF implementation.
KUDr
parents: 3900
diff changeset
    80
	/// to access inherited path finder
3900
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
    81
	Tpf& Yapf() {return *static_cast<Tpf*>(this);}
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
    82
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
    83
public:
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
    84
	FORCEINLINE int SlopeCost(TileIndex tile, Trackdir td)
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
    85
	{
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
    86
		CPerfStart perf_cost(Yapf().m_perf_slope_cost);
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
    87
		if (!stSlopeCost(tile, td)) return 0;
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
    88
		return Yapf().PfGetSettings().rail_slope_penalty;
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
    89
	}
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
    90
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
    91
	FORCEINLINE int CurveCost(Trackdir td1, Trackdir td2)
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
    92
	{
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
    93
		int cost = 0;
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
    94
		if (TrackFollower::Allow90degTurns()
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
    95
				&& ((TrackdirToTrackdirBits(td2) & (TrackdirBits)TrackdirCrossesTrackdirs(td1)) != 0)) {
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
    96
			// 90-deg curve penalty
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
    97
			cost += Yapf().PfGetSettings().rail_curve90_penalty;
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
    98
		} else if (td2 != NextTrackdir(td1)) {
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
    99
			// 45-deg curve penalty
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   100
			cost += Yapf().PfGetSettings().rail_curve45_penalty;
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   101
		}
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   102
		return cost;
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   103
	}
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   104
7037
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   105
	/** Return one tile cost (base cost + level crossing penalty). */
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   106
	FORCEINLINE int OneTileCost(TileIndex& tile, Trackdir trackdir)
3900
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   107
	{
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   108
		int cost = 0;
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   109
		// set base cost
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   110
		if (IsDiagonalTrackdir(trackdir)) {
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   111
			cost += YAPF_TILE_LENGTH;
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   112
			switch (GetTileType(tile)) {
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   113
				case MP_STREET:
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   114
					/* Increase the cost for level crossings */
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   115
					if (IsLevelCrossing(tile))
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   116
						cost += Yapf().PfGetSettings().rail_crossing_penalty;
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   117
					break;
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   118
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   119
				default:
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   120
					break;
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   121
			}
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   122
		} else {
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   123
			// non-diagonal trackdir
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   124
			cost = YAPF_TILE_CORNER_LENGTH;
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   125
		}
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   126
		return cost;
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   127
	}
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   128
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   129
	int SignalCost(Node& n, TileIndex tile, Trackdir trackdir)
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   130
	{
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   131
		int cost = 0;
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   132
		// if there is one-way signal in the opposite direction, then it is not our way
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   133
		CPerfStart perf_cost(Yapf().m_perf_other_cost);
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   134
		if (IsTileType(tile, MP_RAILWAY)) {
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   135
			bool has_signal_against = HasSignalOnTrackdir(tile, ReverseTrackdir(trackdir));
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   136
			bool has_signal_along = HasSignalOnTrackdir(tile, trackdir);
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   137
			if (has_signal_against && !has_signal_along) {
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   138
				// one-way signal in opposite direction
7037
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   139
				n.m_segment->m_end_segment_reason |= ESRB_DEAD_END;
3900
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   140
			} else if (has_signal_along) {
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   141
				SignalState sig_state = GetSignalStateByTrackdir(tile, trackdir);
5095
15148a0e3bb8 (svn r7164) -Fix: [YAPF] assert when look-ahead polynomial result (red-signal penalty) is negative. Such penalty is now added as positive penalty for the appropriate green signal. (DannyA)
KUDr
parents: 4549
diff changeset
   142
				// cache the look-ahead polynomial constant only if we didn't pass more signals than the look-ahead limit is
15148a0e3bb8 (svn r7164) -Fix: [YAPF] assert when look-ahead polynomial result (red-signal penalty) is negative. Such penalty is now added as positive penalty for the appropriate green signal. (DannyA)
KUDr
parents: 4549
diff changeset
   143
				int look_ahead_cost = (n.m_num_signals_passed < m_sig_look_ahead_costs.Size()) ? m_sig_look_ahead_costs.Data()[n.m_num_signals_passed] : 0;
3900
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   144
				if (sig_state != SIGNAL_STATE_RED) {
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   145
					// green signal
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   146
					n.flags_u.flags_s.m_last_signal_was_red = false;
5095
15148a0e3bb8 (svn r7164) -Fix: [YAPF] assert when look-ahead polynomial result (red-signal penalty) is negative. Such penalty is now added as positive penalty for the appropriate green signal. (DannyA)
KUDr
parents: 4549
diff changeset
   147
					// negative look-ahead red-signal penalties would cause problems later, so use them as positive penalties for green signal
15148a0e3bb8 (svn r7164) -Fix: [YAPF] assert when look-ahead polynomial result (red-signal penalty) is negative. Such penalty is now added as positive penalty for the appropriate green signal. (DannyA)
KUDr
parents: 4549
diff changeset
   148
					if (look_ahead_cost < 0) {
15148a0e3bb8 (svn r7164) -Fix: [YAPF] assert when look-ahead polynomial result (red-signal penalty) is negative. Such penalty is now added as positive penalty for the appropriate green signal. (DannyA)
KUDr
parents: 4549
diff changeset
   149
						// add its negation to the cost
15148a0e3bb8 (svn r7164) -Fix: [YAPF] assert when look-ahead polynomial result (red-signal penalty) is negative. Such penalty is now added as positive penalty for the appropriate green signal. (DannyA)
KUDr
parents: 4549
diff changeset
   150
						cost -= look_ahead_cost;
15148a0e3bb8 (svn r7164) -Fix: [YAPF] assert when look-ahead polynomial result (red-signal penalty) is negative. Such penalty is now added as positive penalty for the appropriate green signal. (DannyA)
KUDr
parents: 4549
diff changeset
   151
					}
3900
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   152
				} else {
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   153
					// we have a red signal in our direction
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   154
					// was it first signal which is two-way?
3979
a905fc0f50aa (svn r5163) - CodeChange: [YAPF] "treat first red two-way signal as dead end" is not applied if train didn't pass choice.
KUDr
parents: 3932
diff changeset
   155
					if (Yapf().TreatFirstRedTwoWaySignalAsEOL() && n.flags_u.flags_s.m_choice_seen && has_signal_against && n.m_num_signals_passed == 0) {
3900
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   156
						// yes, the first signal is two-way red signal => DEAD END
7037
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   157
						n.m_segment->m_end_segment_reason |= ESRB_DEAD_END;
5424
34b624b01ae1 (svn r7628) -Fix: [YAPF] suppress 'Train is lost' message if pathfinding ended on the first two-way red signal due to yapf.rail_firstred_twoway_eol option.
KUDr
parents: 5095
diff changeset
   158
						Yapf().m_stopped_on_first_two_way_signal = true;
3900
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   159
						return -1;
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   160
					}
6770
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6259
diff changeset
   161
					SignalType sig_type = GetSignalType(tile, TrackdirToTrack(trackdir));
3900
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   162
					n.m_last_red_signal_type = sig_type;
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   163
					n.flags_u.flags_s.m_last_signal_was_red = true;
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   164
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   165
					// look-ahead signal penalty
5095
15148a0e3bb8 (svn r7164) -Fix: [YAPF] assert when look-ahead polynomial result (red-signal penalty) is negative. Such penalty is now added as positive penalty for the appropriate green signal. (DannyA)
KUDr
parents: 4549
diff changeset
   166
					if (look_ahead_cost > 0) {
15148a0e3bb8 (svn r7164) -Fix: [YAPF] assert when look-ahead polynomial result (red-signal penalty) is negative. Such penalty is now added as positive penalty for the appropriate green signal. (DannyA)
KUDr
parents: 4549
diff changeset
   167
						// add the look ahead penalty only if it is positive
15148a0e3bb8 (svn r7164) -Fix: [YAPF] assert when look-ahead polynomial result (red-signal penalty) is negative. Such penalty is now added as positive penalty for the appropriate green signal. (DannyA)
KUDr
parents: 4549
diff changeset
   168
						cost += look_ahead_cost;
3900
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   169
					}
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   170
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   171
					// special signal penalties
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   172
					if (n.m_num_signals_passed == 0) {
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   173
						switch (sig_type) {
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   174
							case SIGTYPE_COMBO:
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   175
							case SIGTYPE_EXIT:   cost += Yapf().PfGetSettings().rail_firstred_exit_penalty; break; // first signal is red pre-signal-exit
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   176
							case SIGTYPE_NORMAL:
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   177
							case SIGTYPE_ENTRY:  cost += Yapf().PfGetSettings().rail_firstred_penalty; break;
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   178
						};
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   179
					}
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   180
				}
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   181
				n.m_num_signals_passed++;
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   182
				n.m_segment->m_last_signal_tile = tile;
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   183
				n.m_segment->m_last_signal_td = trackdir;
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   184
			}
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   185
		}
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   186
		return cost;
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   187
	}
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   188
3931
b946fc6e7188 (svn r5066) -Feature: [YAPF] Train selects the best station platform by length
KUDr
parents: 3930
diff changeset
   189
	FORCEINLINE int PlatformLengthPenalty(int platform_length)
b946fc6e7188 (svn r5066) -Feature: [YAPF] Train selects the best station platform by length
KUDr
parents: 3930
diff changeset
   190
	{
b946fc6e7188 (svn r5066) -Feature: [YAPF] Train selects the best station platform by length
KUDr
parents: 3930
diff changeset
   191
		int cost = 0;
b946fc6e7188 (svn r5066) -Feature: [YAPF] Train selects the best station platform by length
KUDr
parents: 3930
diff changeset
   192
		const Vehicle* v = Yapf().GetVehicle();
b946fc6e7188 (svn r5066) -Feature: [YAPF] Train selects the best station platform by length
KUDr
parents: 3930
diff changeset
   193
		assert(v != NULL);
6259
471b91a4b1d8 (svn r9068) -Codechange: capitalize the VEH_Train etc. enums to match the coding style (and rest of the code).
rubidium
parents: 6154
diff changeset
   194
		assert(v->type == VEH_TRAIN);
3931
b946fc6e7188 (svn r5066) -Feature: [YAPF] Train selects the best station platform by length
KUDr
parents: 3930
diff changeset
   195
		assert(v->u.rail.cached_total_length != 0);
b946fc6e7188 (svn r5066) -Feature: [YAPF] Train selects the best station platform by length
KUDr
parents: 3930
diff changeset
   196
		int needed_platform_length = (v->u.rail.cached_total_length + TILE_SIZE - 1) / TILE_SIZE;
b946fc6e7188 (svn r5066) -Feature: [YAPF] Train selects the best station platform by length
KUDr
parents: 3930
diff changeset
   197
		if (platform_length > needed_platform_length) {
b946fc6e7188 (svn r5066) -Feature: [YAPF] Train selects the best station platform by length
KUDr
parents: 3930
diff changeset
   198
			// apply penalty for longer platform than needed
3932
dfe10fa5ce4f (svn r5067) -Codechange: [YAPF] Platform selection feature now applies penalty per platform instead of per tile (should give better results)
KUDr
parents: 3931
diff changeset
   199
			cost += Yapf().PfGetSettings().rail_longer_platform_penalty;
dfe10fa5ce4f (svn r5067) -Codechange: [YAPF] Platform selection feature now applies penalty per platform instead of per tile (should give better results)
KUDr
parents: 3931
diff changeset
   200
		} else if (needed_platform_length > platform_length) {
3931
b946fc6e7188 (svn r5066) -Feature: [YAPF] Train selects the best station platform by length
KUDr
parents: 3930
diff changeset
   201
			// apply penalty for shorter platform than needed
3932
dfe10fa5ce4f (svn r5067) -Codechange: [YAPF] Platform selection feature now applies penalty per platform instead of per tile (should give better results)
KUDr
parents: 3931
diff changeset
   202
			cost += Yapf().PfGetSettings().rail_shorter_platform_penalty;
3931
b946fc6e7188 (svn r5066) -Feature: [YAPF] Train selects the best station platform by length
KUDr
parents: 3930
diff changeset
   203
		}
b946fc6e7188 (svn r5066) -Feature: [YAPF] Train selects the best station platform by length
KUDr
parents: 3930
diff changeset
   204
		return cost;
b946fc6e7188 (svn r5066) -Feature: [YAPF] Train selects the best station platform by length
KUDr
parents: 3930
diff changeset
   205
	}
b946fc6e7188 (svn r5066) -Feature: [YAPF] Train selects the best station platform by length
KUDr
parents: 3930
diff changeset
   206
3900
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   207
public:
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   208
	FORCEINLINE void SetMaxCost(int max_cost) {m_max_cost = max_cost;}
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   209
7037
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   210
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   211
3914
6bdd22b93698 (svn r5018) [YAPF] Added some comments to YAPF implementation.
KUDr
parents: 3900
diff changeset
   212
	/** Called by YAPF to calculate the cost from the origin to the given node.
4549
106ed18a7675 (svn r6381) -Cleanup: make the '/* */' comments that span multiple lines more uniform.
rubidium
parents: 3979
diff changeset
   213
	 *  Calculates only the cost of given node, adds it to the parent node cost
106ed18a7675 (svn r6381) -Cleanup: make the '/* */' comments that span multiple lines more uniform.
rubidium
parents: 3979
diff changeset
   214
	 *  and stores the result into Node::m_cost member */
7037
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   215
	FORCEINLINE bool PfCalcCost(Node &n, const TrackFollower *tf)
3900
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   216
	{
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   217
		assert(!n.flags_u.flags_s.m_targed_seen);
7037
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   218
		assert(tf->m_new_tile == n.m_key.m_tile);
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   219
		assert((TrackdirToTrackdirBits(n.m_key.m_td) & tf->m_new_td_bits) != TRACKDIR_BIT_NONE);
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   220
3900
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   221
		CPerfStart perf_cost(Yapf().m_perf_cost);
7037
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   222
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   223
		/* Does the node have some parent node? */
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   224
		bool has_parent = (n.m_parent != NULL);
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   225
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   226
		/* Do we already have a cached segment? */
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   227
		CachedData &segment = *n.m_segment;
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   228
		bool is_cached_segment = (segment.m_cost >= 0);
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   229
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   230
		int parent_cost = has_parent ? n.m_parent->m_cost : 0;
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   231
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   232
		/* Each node cost contains 2 or 3 main components:
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   233
		 *  1. Transition cost - cost of the move from previous node (tile):
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   234
		 *    - curve cost (or zero for straight move)
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   235
		 *  2. Tile cost:
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   236
		 *    - base tile cost
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   237
		 *      - YAPF_TILE_LENGTH for diagonal tiles
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   238
		 *      - YAPF_TILE_CORNER_LENGTH for non-diagonal tiles
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   239
		 *    - tile penalties
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   240
		 *      - tile slope penalty (upward slopes)
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   241
		 *      - red signal penalty
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   242
		 *      - level crossing penalty
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   243
		 *      - speed-limit penalty (bridges)
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   244
		 *      - station platform penalty
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   245
		 *      - penalty for reversing in the depot
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   246
		 *      - etc.
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   247
		 *  3. Extra cost (applies to the last node only)
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   248
		 *    - last red signal penalty
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   249
		 *    - penalty for too long or too short platform on the destination station
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   250
		 */
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   251
		int transition_cost = 0;
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   252
		int extra_cost = 0;
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   253
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   254
		/* Segment: one or more tiles connected by contiguous tracks of the same type.
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   255
		 * Each segment cost includes 'Tile cost' for all its tiles (including the first
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   256
		 * and last), and the 'Transition cost' between its tiles. The first transition
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   257
		 * cost of segment entry (move from the 'parent' node) is not included!
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   258
		 */
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   259
		int segment_entry_cost = 0;
3900
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   260
		int segment_cost = 0;
7037
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   261
3915
914d45c135c7 (svn r5033) -CodeChange: [YAPF] RoadFindPathToStop() can now use YAPF for multistop handling.
KUDr
parents: 3914
diff changeset
   262
		const Vehicle* v = Yapf().GetVehicle();
3900
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   263
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   264
		// start at n.m_key.m_tile / n.m_key.m_td and walk to the end of segment
7037
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   265
		TILE cur(n.m_key.m_tile, n.m_key.m_td);
3900
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   266
7037
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   267
		// the previous tile will be needed for transition cost calculations
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   268
		TILE prev = has_parent ? TILE() : TILE(n.m_parent->GetLastTile(), n.m_parent->GetLastTrackdir());
3900
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   269
7037
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   270
		EndSegmentReasonBits end_segment_reason = ESRB_NONE;
3900
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   271
7037
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   272
		TrackFollower tf_local(v, &Yapf().m_perf_ts_cost);
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   273
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   274
		if (!has_parent) {
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   275
			/* We will jump to the middle of the cost calculator assuming that segment cache is not used. */
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   276
			assert(!is_cached_segment);
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   277
			/* Skip the first transition cost calculation. */
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   278
			goto no_entry_cost;
6132
8b4edf37c5ff (svn r8869) [YAPF] -Fix: Large Train Stations/Trains makes OpenTTD crash (Jigsaw_Psyche)
KUDr
parents: 6130
diff changeset
   279
		}
8b4edf37c5ff (svn r8869) [YAPF] -Fix: Large Train Stations/Trains makes OpenTTD crash (Jigsaw_Psyche)
KUDr
parents: 6130
diff changeset
   280
7037
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   281
		for (;;) {
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   282
			/* Transition cost (cost of the move from previous tile) */
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   283
			transition_cost = Yapf().CurveCost(prev.td, cur.td);
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   284
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   285
			/* First transition cost counts against segment entry cost, other transitions
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   286
			 * inside segment will come to segment cost (and will be cached) */
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   287
			if (segment_cost == 0) {
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   288
				/* We just entered the loop. First transition cost goes to segment entry cost)*/
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   289
				segment_entry_cost = transition_cost;
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   290
				transition_cost = 0;
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   291
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   292
				/* It is the right time now to look if we can reuse the cached segment cost. */
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   293
				if (is_cached_segment) {
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   294
					/* Yes, we already know the segment cost. */
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   295
					segment_cost = segment.m_cost;
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   296
					/* We know also the reason why the segment ends. */
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   297
					end_segment_reason = segment.m_end_segment_reason;
7121
ac2b3710f262 (svn r10394) -Fix [YAPF]: MP desync caused by incorrect last-red-signal penalties applied when cached segment was reused. Players that connected more recently (didn't have these segments cached yet) calculated those penalties correctly. This caused different YAPF results.
KUDr
parents: 7099
diff changeset
   298
					/* We will need also some information about the last signal (if it was red). */
ac2b3710f262 (svn r10394) -Fix [YAPF]: MP desync caused by incorrect last-red-signal penalties applied when cached segment was reused. Players that connected more recently (didn't have these segments cached yet) calculated those penalties correctly. This caused different YAPF results.
KUDr
parents: 7099
diff changeset
   299
					if (segment.m_last_signal_tile != INVALID_TILE) {
ac2b3710f262 (svn r10394) -Fix [YAPF]: MP desync caused by incorrect last-red-signal penalties applied when cached segment was reused. Players that connected more recently (didn't have these segments cached yet) calculated those penalties correctly. This caused different YAPF results.
KUDr
parents: 7099
diff changeset
   300
						assert(HasSignalOnTrackdir(segment.m_last_signal_tile, segment.m_last_signal_td));
ac2b3710f262 (svn r10394) -Fix [YAPF]: MP desync caused by incorrect last-red-signal penalties applied when cached segment was reused. Players that connected more recently (didn't have these segments cached yet) calculated those penalties correctly. This caused different YAPF results.
KUDr
parents: 7099
diff changeset
   301
						SignalState sig_state = GetSignalStateByTrackdir(segment.m_last_signal_tile, segment.m_last_signal_td);
ac2b3710f262 (svn r10394) -Fix [YAPF]: MP desync caused by incorrect last-red-signal penalties applied when cached segment was reused. Players that connected more recently (didn't have these segments cached yet) calculated those penalties correctly. This caused different YAPF results.
KUDr
parents: 7099
diff changeset
   302
						bool is_red = (sig_state == SIGNAL_STATE_RED);
ac2b3710f262 (svn r10394) -Fix [YAPF]: MP desync caused by incorrect last-red-signal penalties applied when cached segment was reused. Players that connected more recently (didn't have these segments cached yet) calculated those penalties correctly. This caused different YAPF results.
KUDr
parents: 7099
diff changeset
   303
						n.flags_u.flags_s.m_last_signal_was_red = is_red;
ac2b3710f262 (svn r10394) -Fix [YAPF]: MP desync caused by incorrect last-red-signal penalties applied when cached segment was reused. Players that connected more recently (didn't have these segments cached yet) calculated those penalties correctly. This caused different YAPF results.
KUDr
parents: 7099
diff changeset
   304
						if (is_red) {
ac2b3710f262 (svn r10394) -Fix [YAPF]: MP desync caused by incorrect last-red-signal penalties applied when cached segment was reused. Players that connected more recently (didn't have these segments cached yet) calculated those penalties correctly. This caused different YAPF results.
KUDr
parents: 7099
diff changeset
   305
							n.m_last_red_signal_type = GetSignalType(segment.m_last_signal_tile, TrackdirToTrack(segment.m_last_signal_td));
ac2b3710f262 (svn r10394) -Fix [YAPF]: MP desync caused by incorrect last-red-signal penalties applied when cached segment was reused. Players that connected more recently (didn't have these segments cached yet) calculated those penalties correctly. This caused different YAPF results.
KUDr
parents: 7099
diff changeset
   306
						}
ac2b3710f262 (svn r10394) -Fix [YAPF]: MP desync caused by incorrect last-red-signal penalties applied when cached segment was reused. Players that connected more recently (didn't have these segments cached yet) calculated those penalties correctly. This caused different YAPF results.
KUDr
parents: 7099
diff changeset
   307
					}
7037
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   308
					/* No further calculation needed. */
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   309
					cur = TILE(n.GetLastTile(), n.GetLastTrackdir());
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   310
					break;
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   311
				}
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   312
			} else {
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   313
				/* Other than first transition cost count as the regular segment cost. */
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   314
				segment_cost += transition_cost;
3900
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   315
			}
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   316
7037
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   317
no_entry_cost: // jump here at the beginning if the node has no parent (it is the first node)
3900
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   318
7037
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   319
			/* All other tile costs will be calculated here. */
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   320
			segment_cost += Yapf().OneTileCost(cur.tile, cur.td);
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   321
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   322
			/* If we skipped some tunnel/bridge/station tiles, add their base cost */
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   323
			segment_cost += YAPF_TILE_LENGTH * tf->m_tiles_skipped;
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   324
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   325
			/* Slope cost. */
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   326
			segment_cost += Yapf().SlopeCost(cur.tile, cur.td);
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   327
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   328
			/* Signal cost (routine can modify segment data). */
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   329
			segment_cost += Yapf().SignalCost(n, cur.tile, cur.td);
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   330
			end_segment_reason = segment.m_end_segment_reason;
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   331
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   332
			/* Tests for 'potential target' reasons to close the segment. */
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   333
			if (cur.tile == prev.tile) {
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   334
				/* Penalty for reversing in a depot. */
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   335
				assert(IsRailDepot(cur.tile));
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   336
				segment_cost += Yapf().PfGetSettings().rail_depot_reverse_penalty;
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   337
				/* We will end in this pass (depot is possible target) */
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   338
				end_segment_reason |= ESRB_DEPOT;
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   339
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   340
			} else if (tf->m_is_station) {
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   341
				/* Station penalties. */
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   342
				uint platform_length = tf->m_tiles_skipped + 1;
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   343
				/* We don't know yet if the station is our target or not. Act like
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   344
				 * if it is pass-through station (not our destination). */
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   345
				segment_cost += Yapf().PfGetSettings().rail_station_penalty * platform_length;
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   346
				/* We will end in this pass (station is possible target) */
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   347
				end_segment_reason |= ESRB_STATION;
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   348
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   349
			} else if (cur.tile_type == MP_RAILWAY && IsRailWaypoint(cur.tile)) {
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   350
				/* Waypoint is also a good reason to finish. */
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   351
				end_segment_reason |= ESRB_WAYPOINT;
3900
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   352
			}
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   353
7037
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   354
			/* Apply min/max speed penalties only when inside the look-ahead radius. Otherwise
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   355
			 * it would cause desync in MP. */
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   356
			if (n.m_num_signals_passed < m_sig_look_ahead_costs.Size())
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   357
			{
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   358
				int min_speed = 0;
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   359
				int max_speed = tf->GetSpeedLimit(&min_speed);
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   360
				if (max_speed < v->max_speed)
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   361
					extra_cost += YAPF_TILE_LENGTH * (v->max_speed - max_speed) * (4 + tf->m_tiles_skipped) / v->max_speed;
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   362
				if (min_speed > v->max_speed)
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   363
					extra_cost += YAPF_TILE_LENGTH * (min_speed - v->max_speed);
3900
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   364
			}
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   365
7037
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   366
			/* Finish if we already exceeded the maximum path cost (i.e. when
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   367
			 * searching for the nearest depot). */
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   368
			if (m_max_cost > 0 && (parent_cost + segment_entry_cost + segment_cost) > m_max_cost) {
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   369
				end_segment_reason |= ESRB_PATH_TOO_LONG;
3900
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   370
			}
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   371
7037
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   372
			/* Move to the next tile/trackdir. */
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   373
			tf = &tf_local;
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   374
			tf_local.Init(v, &Yapf().m_perf_ts_cost);
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   375
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   376
			if (!tf_local.Follow(cur.tile, cur.td)) {
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   377
				/* Can't move to the next tile (EOL?). */
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   378
				end_segment_reason |= ESRB_DEAD_END;
3900
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   379
				break;
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   380
			}
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   381
7037
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   382
			/* Check if the next tile is not a choice. */
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   383
			if (KillFirstBit2x64(tf_local.m_new_td_bits) != 0) {
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   384
				/* More than one segment will follow. Close this one. */
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   385
				end_segment_reason |= ESRB_CHOICE_FOLLOWS;
3900
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   386
				break;
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   387
			}
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   388
7037
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   389
			/* Gather the next tile/trackdir/tile_type/rail_type. */
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   390
			TILE next(tf_local.m_new_tile, (Trackdir)FindFirstBit2x64(tf_local.m_new_td_bits));
3931
b946fc6e7188 (svn r5066) -Feature: [YAPF] Train selects the best station platform by length
KUDr
parents: 3930
diff changeset
   391
7037
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   392
			/* Check the next tile for the rail type. */
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   393
			if (next.rail_type != cur.rail_type) {
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   394
				/* Segment must consist from the same rail_type tiles. */
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   395
				end_segment_reason |= ESRB_RAIL_TYPE;
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   396
				break;
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   397
			}
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   398
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   399
			/* Avoid infinite looping. */
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   400
			if (next.tile == n.m_key.m_tile && next.td == n.m_key.m_td) {
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   401
				end_segment_reason |= ESRB_INFINITE_LOOP;
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   402
				break;
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   403
			}
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   404
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   405
			if (segment_cost > s_max_segment_cost) {
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   406
				/* Potentially in the infinite loop (or only very long segment?). We should
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   407
				 * not force it to finish prematurely unless we are on a regular tile. */
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   408
				if (IsTileType(tf->m_new_tile, MP_RAILWAY)) {
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   409
					end_segment_reason |= ESRB_SEGMENT_TOO_LONG;
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   410
					break;
3931
b946fc6e7188 (svn r5066) -Feature: [YAPF] Train selects the best station platform by length
KUDr
parents: 3930
diff changeset
   411
				}
b946fc6e7188 (svn r5066) -Feature: [YAPF] Train selects the best station platform by length
KUDr
parents: 3930
diff changeset
   412
			}
3900
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   413
7037
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   414
			/* Any other reason bit set? */
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   415
			if (end_segment_reason != ESRB_NONE) {
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   416
				break;
3900
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   417
			}
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   418
7037
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   419
			/* For the next loop set new prev and cur tile info. */
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   420
			prev = cur;
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   421
			cur = next;
3900
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   422
7037
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   423
		} // for (;;)
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   424
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   425
		bool target_seen = false;
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   426
		if ((end_segment_reason & ESRB_POSSIBLE_TARGET) != ESRB_NONE) {
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   427
			/* Depot, station or waypoint. */
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   428
			if (Yapf().PfDetectDestination(cur.tile, cur.td)) {
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   429
				/* Destination found. */
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   430
				target_seen = true;
3900
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   431
			}
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   432
		}
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   433
7037
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   434
		/* Update the segment if needed. */
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   435
		if (!is_cached_segment) {
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   436
			/* Write back the segment information so it can be reused the next time. */
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   437
			segment.m_cost = segment_cost;
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   438
			segment.m_end_segment_reason = end_segment_reason & ESRB_CACHED_MASK;
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   439
			/* Save end of segment back to the node. */
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   440
			n.SetLastTileTrackdir(cur.tile, cur.td);
3900
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   441
		}
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   442
7037
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   443
		/* Do we have an excuse why not to continue pathfinding in this direction? */
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   444
		if (!target_seen && (end_segment_reason & ESRB_ABORT_PF_MASK) != ESRB_NONE) {
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   445
			/* Reason to not continue. Stop this PF branch. */
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   446
			return false;
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   447
		}
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   448
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   449
		/* Special costs for the case we have reached our target. */
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   450
		if (target_seen) {
3900
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   451
			n.flags_u.flags_s.m_targed_seen = true;
7037
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   452
			/* Last-red and last-red-exit penalties. */
3900
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   453
			if (n.flags_u.flags_s.m_last_signal_was_red) {
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   454
				if (n.m_last_red_signal_type == SIGTYPE_EXIT) {
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   455
					// last signal was red pre-signal-exit
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   456
					extra_cost += Yapf().PfGetSettings().rail_lastred_exit_penalty;
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   457
				} else {
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   458
					// last signal was red, but not exit
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   459
					extra_cost += Yapf().PfGetSettings().rail_lastred_penalty;
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   460
				}
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   461
			}
7037
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   462
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   463
			/* Station platform-length penalty. */
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   464
			if ((end_segment_reason & ESRB_STATION) != ESRB_NONE) {
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   465
				Station *st = GetStationByTile(n.GetLastTile());
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   466
				assert(st != NULL);
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   467
				uint platform_length = st->GetPlatformLength(n.GetLastTile(), ReverseDiagDir(TrackdirToExitdir(n.GetLastTrackdir())));
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   468
				/* Reduce the extra cost caused by passing-station penalty (each station receives it in the segment cost). */
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   469
				extra_cost -= Yapf().PfGetSettings().rail_station_penalty * platform_length;
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   470
				/* Add penalty for the inappropriate platform length. */
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   471
				extra_cost += PlatformLengthPenalty(platform_length);
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   472
			}
3900
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   473
		}
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   474
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   475
		// total node cost
7037
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   476
		n.m_cost = parent_cost + segment_entry_cost + segment_cost + extra_cost;
3900
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   477
7037
64249224bb74 (svn r10301) -Fix [FS#901, YAPF]: another assert violation in some special cases (immeR)
KUDr
parents: 6945
diff changeset
   478
		return true;
3900
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   479
	}
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   480
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   481
	FORCEINLINE bool CanUseGlobalCache(Node& n) const
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   482
	{
7099
a1d7e197cb64 (svn r10366) -Codechange [YAPF]: added DEBUG_YAPF_CACHE macro that (when set to 1) allows to track YAPF "cache errors". They are probably responsible for current MP desyncs. (thanks Rubidium for this great idea!).
KUDr
parents: 7040
diff changeset
   483
		return !m_disable_cache
a1d7e197cb64 (svn r10366) -Codechange [YAPF]: added DEBUG_YAPF_CACHE macro that (when set to 1) allows to track YAPF "cache errors". They are probably responsible for current MP desyncs. (thanks Rubidium for this great idea!).
KUDr
parents: 7040
diff changeset
   484
			&& (n.m_parent != NULL)
3900
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   485
			&& (n.m_parent->m_num_signals_passed >= m_sig_look_ahead_costs.Size());
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   486
	}
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   487
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   488
	FORCEINLINE void ConnectNodeToCachedData(Node& n, CachedData& ci)
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   489
	{
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   490
		n.m_segment = &ci;
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   491
		if (n.m_segment->m_cost < 0) {
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   492
			n.m_segment->m_last_tile = n.m_key.m_tile;
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   493
			n.m_segment->m_last_td = n.m_key.m_td;
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   494
		}
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   495
	}
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   496
7099
a1d7e197cb64 (svn r10366) -Codechange [YAPF]: added DEBUG_YAPF_CACHE macro that (when set to 1) allows to track YAPF "cache errors". They are probably responsible for current MP desyncs. (thanks Rubidium for this great idea!).
KUDr
parents: 7040
diff changeset
   497
	void DisableCache(bool disable)
a1d7e197cb64 (svn r10366) -Codechange [YAPF]: added DEBUG_YAPF_CACHE macro that (when set to 1) allows to track YAPF "cache errors". They are probably responsible for current MP desyncs. (thanks Rubidium for this great idea!).
KUDr
parents: 7040
diff changeset
   498
	{
a1d7e197cb64 (svn r10366) -Codechange [YAPF]: added DEBUG_YAPF_CACHE macro that (when set to 1) allows to track YAPF "cache errors". They are probably responsible for current MP desyncs. (thanks Rubidium for this great idea!).
KUDr
parents: 7040
diff changeset
   499
		m_disable_cache = disable;
a1d7e197cb64 (svn r10366) -Codechange [YAPF]: added DEBUG_YAPF_CACHE macro that (when set to 1) allows to track YAPF "cache errors". They are probably responsible for current MP desyncs. (thanks Rubidium for this great idea!).
KUDr
parents: 7040
diff changeset
   500
	}
3900
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   501
};
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   502
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   503
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   504
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents:
diff changeset
   505
#endif /* YAPF_COSTRAIL_HPP */