2 * This file is part of OpenTTD.
3 * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
4 * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
5 * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
8 /** @file yapf_type.hpp Types used by YAPF. */
16 /* Enum used in PfCalcCost() to see why was the segment closed. */
17 enum EndSegmentReason
{
18 /* The following reasons can be saved into cached segment */
19 ESR_DEAD_END
= 0, ///< track ends here
20 ESR_RAIL_TYPE
, ///< the next tile has a different rail type than our tiles
21 ESR_INFINITE_LOOP
, ///< infinite loop detected
22 ESR_SEGMENT_TOO_LONG
, ///< the segment is too long (possible infinite loop)
23 ESR_CHOICE_FOLLOWS
, ///< the next tile contains a choice (the track splits to more than one segments)
24 ESR_DEPOT
, ///< stop in the depot (could be a target next time)
25 ESR_WAYPOINT
, ///< waypoint encountered (could be a target next time)
26 ESR_STATION
, ///< station encountered (could be a target next time)
27 ESR_SAFE_TILE
, ///< safe waiting position found (could be a target)
29 /* The following reasons are used only internally by PfCalcCost().
30 * They should not be found in the cached segment. */
31 ESR_PATH_TOO_LONG
, ///< the path is too long (searching for the nearest depot in the given radius)
32 ESR_FIRST_TWO_WAY_RED
, ///< first signal was 2-way and it was red
33 ESR_LOOK_AHEAD_END
, ///< we have just passed the last look-ahead signal
34 ESR_TARGET_REACHED
, ///< we have just reached the destination
37 ESR_NONE
= 0xFF, ///< no reason to end the segment here
40 enum EndSegmentReasonBits
{
43 ESRB_DEAD_END
= 1 << ESR_DEAD_END
,
44 ESRB_RAIL_TYPE
= 1 << ESR_RAIL_TYPE
,
45 ESRB_INFINITE_LOOP
= 1 << ESR_INFINITE_LOOP
,
46 ESRB_SEGMENT_TOO_LONG
= 1 << ESR_SEGMENT_TOO_LONG
,
47 ESRB_CHOICE_FOLLOWS
= 1 << ESR_CHOICE_FOLLOWS
,
48 ESRB_DEPOT
= 1 << ESR_DEPOT
,
49 ESRB_WAYPOINT
= 1 << ESR_WAYPOINT
,
50 ESRB_STATION
= 1 << ESR_STATION
,
51 ESRB_SAFE_TILE
= 1 << ESR_SAFE_TILE
,
53 ESRB_PATH_TOO_LONG
= 1 << ESR_PATH_TOO_LONG
,
54 ESRB_FIRST_TWO_WAY_RED
= 1 << ESR_FIRST_TWO_WAY_RED
,
55 ESRB_LOOK_AHEAD_END
= 1 << ESR_LOOK_AHEAD_END
,
56 ESRB_TARGET_REACHED
= 1 << ESR_TARGET_REACHED
,
58 /* Additional (composite) values. */
60 /* What reasons mean that the target can be found and needs to be detected. */
61 ESRB_POSSIBLE_TARGET
= ESRB_DEPOT
| ESRB_WAYPOINT
| ESRB_STATION
| ESRB_SAFE_TILE
,
63 /* What reasons can be stored back into cached segment. */
64 ESRB_CACHED_MASK
= ESRB_DEAD_END
| ESRB_RAIL_TYPE
| ESRB_INFINITE_LOOP
| ESRB_SEGMENT_TOO_LONG
| ESRB_CHOICE_FOLLOWS
| ESRB_DEPOT
| ESRB_WAYPOINT
| ESRB_STATION
| ESRB_SAFE_TILE
,
66 /* Reasons to abort pathfinding in this direction. */
67 ESRB_ABORT_PF_MASK
= ESRB_DEAD_END
| ESRB_PATH_TOO_LONG
| ESRB_INFINITE_LOOP
| ESRB_FIRST_TWO_WAY_RED
,
70 DECLARE_ENUM_AS_BIT_SET(EndSegmentReasonBits
)
72 inline std::string
ValueStr(EndSegmentReasonBits bits
)
74 static const char * const end_segment_reason_names
[] = {
75 "DEAD_END", "RAIL_TYPE", "INFINITE_LOOP", "SEGMENT_TOO_LONG", "CHOICE_FOLLOWS",
76 "DEPOT", "WAYPOINT", "STATION", "SAFE_TILE",
77 "PATH_TOO_LONG", "FIRST_TWO_WAY_RED", "LOOK_AHEAD_END", "TARGET_REACHED"
81 ss
<< "0x" << std::setfill('0') << std::setw(4) << std::hex
<< bits
; // 0x%04X
82 ss
<< " (" << ComposeNameT(bits
, end_segment_reason_names
, "UNK", ESRB_NONE
, "NONE") << ")";
86 #endif /* YAPF_TYPE_HPP */