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