1 /*
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/>.
6  */
7 
8 /** @file station_type.h Types related to stations. */
9 
10 #ifndef STATION_TYPE_H
11 #define STATION_TYPE_H
12 
13 #include "core/smallstack_type.hpp"
14 #include "tilearea_type.h"
15 #include <set>
16 
17 typedef uint16 StationID;
18 typedef uint16 RoadStopID;
19 
20 struct BaseStation;
21 struct Station;
22 struct RoadStop;
23 struct StationSpec;
24 struct Waypoint;
25 
26 static const StationID NEW_STATION = 0xFFFE;
27 static const StationID INVALID_STATION = 0xFFFF;
28 
29 typedef SmallStack<StationID, StationID, INVALID_STATION, 8, 0xFFFD> StationIDStack;
30 
31 /** Station types */
32 enum StationType {
33 	STATION_RAIL,
34 	STATION_AIRPORT,
35 	STATION_TRUCK,
36 	STATION_BUS,
37 	STATION_OILRIG,
38 	STATION_DOCK,
39 	STATION_BUOY,
40 	STATION_WAYPOINT,
41 };
42 
43 /** Types of RoadStops */
44 enum RoadStopType {
45 	ROADSTOP_BUS,    ///< A standard stop for buses
46 	ROADSTOP_TRUCK,  ///< A standard stop for trucks
47 };
48 
49 /** The facilities a station might be having */
50 enum StationFacility : byte {
51 	FACIL_NONE       = 0,      ///< The station has no facilities at all
52 	FACIL_TRAIN      = 1 << 0, ///< Station with train station
53 	FACIL_TRUCK_STOP = 1 << 1, ///< Station with truck stops
54 	FACIL_BUS_STOP   = 1 << 2, ///< Station with bus stops
55 	FACIL_AIRPORT    = 1 << 3, ///< Station with an airport
56 	FACIL_DOCK       = 1 << 4, ///< Station with a dock
57 	FACIL_WAYPOINT   = 1 << 7, ///< Station is a waypoint
58 };
59 DECLARE_ENUM_AS_BIT_SET(StationFacility)
60 
61 /** The vehicles that may have visited a station */
62 enum StationHadVehicleOfType : byte {
63 	HVOT_NONE     = 0,      ///< Station has seen no vehicles
64 	HVOT_TRAIN    = 1 << 1, ///< Station has seen a train
65 	HVOT_BUS      = 1 << 2, ///< Station has seen a bus
66 	HVOT_TRUCK    = 1 << 3, ///< Station has seen a truck
67 	HVOT_AIRCRAFT = 1 << 4, ///< Station has seen an aircraft
68 	HVOT_SHIP     = 1 << 5, ///< Station has seen a ship
69 
70 	HVOT_WAYPOINT = 1 << 6, ///< Station is a waypoint (NewGRF only!)
71 };
72 DECLARE_ENUM_AS_BIT_SET(StationHadVehicleOfType)
73 
74 /** The different catchment areas used */
75 enum CatchmentArea {
76 	CA_NONE            =  0, ///< Catchment when the station has no facilities
77 	CA_BUS             =  3, ///< Catchment for bus stops with "modified catchment" enabled
78 	CA_TRUCK           =  3, ///< Catchment for truck stops with "modified catchment" enabled
79 	CA_TRAIN           =  4, ///< Catchment for train stations with "modified catchment" enabled
80 	CA_DOCK            =  5, ///< Catchment for docks with "modified catchment" enabled
81 
82 	CA_UNMODIFIED      =  4, ///< Catchment for all stations with "modified catchment" disabled
83 
84 	MAX_CATCHMENT      = 10, ///< Maximum catchment for airports with "modified catchment" enabled
85 };
86 
87 static const uint MAX_LENGTH_STATION_NAME_CHARS = 32; ///< The maximum length of a station name in characters including '\0'
88 
89 struct StationCompare {
90 	bool operator() (const Station *lhs, const Station *rhs) const;
91 };
92 
93 /** List of stations */
94 typedef std::set<Station *, StationCompare> StationList;
95 
96 /**
97  * Structure contains cached list of stations nearby. The list
98  * is created upon first call to GetStations()
99  */
100 class StationFinder : TileArea {
101 	StationList stations; ///< List of stations nearby
102 public:
103 	/**
104 	 * Constructs StationFinder
105 	 * @param area the area to search from
106 	 */
StationFinder(const TileArea & area)107 	StationFinder(const TileArea &area) : TileArea(area) {}
108 	const StationList *GetStations();
109 };
110 
111 #endif /* STATION_TYPE_H */
112