1 /* $Id$ */ |
1 /* $Id$ */ |
2 |
2 |
3 /** @file ai_road.cpp Implementation of AIRoad. */ |
3 /** @file ai_road.cpp Implementation of AIRoad. */ |
4 |
4 |
5 #include "ai_road.hpp" |
5 #include "ai_road.hpp" |
|
6 #include "ai_map.hpp" |
6 #include "../../openttd.h" |
7 #include "../../openttd.h" |
7 #include "../../road_map.h" |
8 #include "../../road_map.h" |
8 #include "../../station_map.h" |
9 #include "../../station_map.h" |
9 #include "../../command_type.h" |
10 #include "../../command_type.h" |
|
11 #include "../../player_func.h" |
10 |
12 |
11 /* static */ bool AIRoad::IsRoadTile(TileIndex tile) |
13 /* static */ bool AIRoad::IsRoadTile(TileIndex tile) |
12 { |
14 { |
13 if (!::IsValidTile(tile)) return false; |
15 if (!::IsValidTile(tile)) return false; |
14 |
16 |
35 if (!::IsValidTile(tile)) return false; |
37 if (!::IsValidTile(tile)) return false; |
36 |
38 |
37 return ::IsDriveThroughStopTile(tile); |
39 return ::IsDriveThroughStopTile(tile); |
38 } |
40 } |
39 |
41 |
|
42 /* static */ bool AIRoad::IsRoadTypeAvailable(RoadType road_type) |
|
43 { |
|
44 return ::HasRoadTypesAvail(_current_player, ::RoadTypeToRoadTypes((::RoadType)road_type)); |
|
45 } |
|
46 |
|
47 /* static */ AIRoad::RoadType AIRoad::GetCurrentRoadType() |
|
48 { |
|
49 return (RoadType)AIObject::GetRoadType(); |
|
50 } |
|
51 |
|
52 /* static */ void AIRoad::SetCurrentRoadType(RoadType road_type) |
|
53 { |
|
54 if (!IsRoadTypeAvailable(road_type)) return; |
|
55 |
|
56 AIObject::SetRoadType((::RoadType)road_type); |
|
57 } |
|
58 |
|
59 /* static */ bool AIRoad::HasRoadType(TileIndex tile, RoadType road_type) |
|
60 { |
|
61 if (!AIMap::IsValidTile(tile)) return false; |
|
62 if (!IsRoadTypeAvailable(road_type)) return false; |
|
63 return ::GetAnyRoadBits(tile, (::RoadType)road_type, false) != ROAD_NONE; |
|
64 } |
|
65 |
40 /* static */ bool AIRoad::AreRoadTilesConnected(TileIndex t1, TileIndex t2) |
66 /* static */ bool AIRoad::AreRoadTilesConnected(TileIndex t1, TileIndex t2) |
41 { |
67 { |
42 if (!::IsValidTile(t1)) return false; |
68 if (!::IsValidTile(t1)) return false; |
43 if (!::IsValidTile(t2)) return false; |
69 if (!::IsValidTile(t2)) return false; |
44 |
70 |
45 /* Tiles not neighbouring */ |
71 /* Tiles not neighbouring */ |
46 if ((abs((int)::TileX(t1) - (int)::TileX(t2)) + abs((int)::TileY(t1) - (int)::TileY(t2))) != 1) return false; |
72 if ((abs((int)::TileX(t1) - (int)::TileX(t2)) + abs((int)::TileY(t1) - (int)::TileY(t2))) != 1) return false; |
47 |
73 |
48 RoadBits r1 = ::GetAnyRoadBits(t1, ROADTYPE_ROAD); |
74 RoadBits r1 = ::GetAnyRoadBits(t1, AIObject::GetRoadType()); |
49 RoadBits r2 = ::GetAnyRoadBits(t2, ROADTYPE_ROAD); |
75 RoadBits r2 = ::GetAnyRoadBits(t2, AIObject::GetRoadType()); |
50 |
76 |
51 DiagDirection dir_1 = (DiagDirection)((::TileX(t1) == ::TileX(t2)) ? (::TileY(t1) < ::TileY(t2) ? 2 : 0) : (::TileX(t1) < ::TileX(t2) ? 1 : 3)); |
77 DiagDirection dir_1 = (DiagDirection)((::TileX(t1) == ::TileX(t2)) ? (::TileY(t1) < ::TileY(t2) ? 2 : 0) : (::TileX(t1) < ::TileX(t2) ? 1 : 3)); |
52 DiagDirection dir_2 = ::ReverseDiagDir(dir_1); |
78 DiagDirection dir_2 = ::ReverseDiagDir(dir_1); |
53 |
79 |
54 return HasBit(r1, dir_1) && HasBit(r2, dir_2); |
80 return HasBit(r1, dir_1) && HasBit(r2, dir_2); |
94 EnforcePrecondition(false, start != end); |
120 EnforcePrecondition(false, start != end); |
95 EnforcePrecondition(false, ::IsValidTile(start)); |
121 EnforcePrecondition(false, ::IsValidTile(start)); |
96 EnforcePrecondition(false, ::IsValidTile(end)); |
122 EnforcePrecondition(false, ::IsValidTile(end)); |
97 EnforcePrecondition(false, TileX(start) == TileX(end) || TileY(start) == TileY(end)); |
123 EnforcePrecondition(false, TileX(start) == TileX(end) || TileY(start) == TileY(end)); |
98 |
124 |
99 return AIObject::DoCommand(end, start, (TileY(start) != TileY(end) ? 4 : 0) | (start < end ? 1 : 2) | (ROADTYPE_ROAD << 3), CMD_BUILD_LONG_ROAD); |
125 return AIObject::DoCommand(end, start, (TileY(start) != TileY(end) ? 4 : 0) | (start < end ? 1 : 2) | (AIObject::GetRoadType() << 3), CMD_BUILD_LONG_ROAD); |
100 } |
126 } |
101 |
127 |
102 /* static */ bool AIRoad::BuildRoadFull(TileIndex start, TileIndex end) |
128 /* static */ bool AIRoad::BuildRoadFull(TileIndex start, TileIndex end) |
103 { |
129 { |
104 EnforcePrecondition(false, start != end); |
130 EnforcePrecondition(false, start != end); |
105 EnforcePrecondition(false, ::IsValidTile(start)); |
131 EnforcePrecondition(false, ::IsValidTile(start)); |
106 EnforcePrecondition(false, ::IsValidTile(end)); |
132 EnforcePrecondition(false, ::IsValidTile(end)); |
107 EnforcePrecondition(false, TileX(start) == TileX(end) || TileY(start) == TileY(end)); |
133 EnforcePrecondition(false, TileX(start) == TileX(end) || TileY(start) == TileY(end)); |
108 |
134 |
109 return AIObject::DoCommand(end, start, (TileY(start) != TileY(end) ? 4 : 0) | (start < end ? 2 : 1), CMD_BUILD_LONG_ROAD); |
135 return AIObject::DoCommand(end, start, (TileY(start) != TileY(end) ? 4 : 0) | (start < end ? 2 : 1) | (AIObject::GetRoadType() << 3), CMD_BUILD_LONG_ROAD); |
110 } |
136 } |
111 |
137 |
112 /* static */ bool AIRoad::BuildRoadDepot(TileIndex tile, TileIndex front) |
138 /* static */ bool AIRoad::BuildRoadDepot(TileIndex tile, TileIndex front) |
113 { |
139 { |
114 EnforcePrecondition(false, tile != front); |
140 EnforcePrecondition(false, tile != front); |
115 EnforcePrecondition(false, ::IsValidTile(tile)); |
141 EnforcePrecondition(false, ::IsValidTile(tile)); |
116 EnforcePrecondition(false, ::IsValidTile(front)); |
142 EnforcePrecondition(false, ::IsValidTile(front)); |
117 |
143 |
118 uint entrance_dir = (TileX(tile) == TileX(front)) ? (TileY(tile) < TileY(front) ? 1 : 3) : (TileX(tile) < TileX(front) ? 2 : 0); |
144 uint entrance_dir = (TileX(tile) == TileX(front)) ? (TileY(tile) < TileY(front) ? 1 : 3) : (TileX(tile) < TileX(front) ? 2 : 0); |
119 |
145 |
120 return AIObject::DoCommand(tile, entrance_dir, ROADTYPE_ROAD << 2, CMD_BUILD_ROAD_DEPOT); |
146 return AIObject::DoCommand(tile, entrance_dir, AIObject::GetRoadType() << 2, CMD_BUILD_ROAD_DEPOT); |
121 } |
147 } |
122 |
148 |
123 /* static */ bool AIRoad::BuildRoadStation(TileIndex tile, TileIndex front, bool truck, bool drive_through) |
149 /* static */ bool AIRoad::BuildRoadStation(TileIndex tile, TileIndex front, bool truck, bool drive_through) |
124 { |
150 { |
125 EnforcePrecondition(false, tile != front); |
151 EnforcePrecondition(false, tile != front); |
131 entrance_dir = TileY(tile) != TileY(front); |
157 entrance_dir = TileY(tile) != TileY(front); |
132 } else { |
158 } else { |
133 entrance_dir = (TileX(tile) == TileX(front)) ? (TileY(tile) < TileY(front) ? 1 : 3) : (TileX(tile) < TileX(front) ? 2 : 0); |
159 entrance_dir = (TileX(tile) == TileX(front)) ? (TileY(tile) < TileY(front) ? 1 : 3) : (TileX(tile) < TileX(front) ? 2 : 0); |
134 } |
160 } |
135 |
161 |
136 return AIObject::DoCommand(tile, entrance_dir, (drive_through ? 2 : 0) | (truck ? 1 : 0) | (ROADTYPES_ROAD << 2), CMD_BUILD_ROAD_STOP); |
162 return AIObject::DoCommand(tile, entrance_dir, (drive_through ? 2 : 0) | (truck ? 1 : 0) | (::RoadTypeToRoadTypes(AIObject::GetRoadType()) << 2), CMD_BUILD_ROAD_STOP); |
137 } |
163 } |
138 |
164 |
139 /* static */ bool AIRoad::RemoveRoad(TileIndex start, TileIndex end) |
165 /* static */ bool AIRoad::RemoveRoad(TileIndex start, TileIndex end) |
140 { |
166 { |
141 EnforcePrecondition(false, ::IsValidTile(start)); |
167 EnforcePrecondition(false, ::IsValidTile(start)); |
142 EnforcePrecondition(false, ::IsValidTile(end)); |
168 EnforcePrecondition(false, ::IsValidTile(end)); |
143 EnforcePrecondition(false, TileX(start) == TileX(end) || TileY(start) == TileY(end)); |
169 EnforcePrecondition(false, TileX(start) == TileX(end) || TileY(start) == TileY(end)); |
144 |
170 |
145 return AIObject::DoCommand(end, start, (TileY(start) != TileY(end) ? 4 : 0) | (start < end ? 1 : 2) | (ROADTYPE_ROAD << 3), CMD_REMOVE_LONG_ROAD); |
171 return AIObject::DoCommand(end, start, (TileY(start) != TileY(end) ? 4 : 0) | (start < end ? 1 : 2) | (AIObject::GetRoadType() << 3), CMD_REMOVE_LONG_ROAD); |
146 } |
172 } |
147 |
173 |
148 /* static */ bool AIRoad::RemoveRoadFull(TileIndex start, TileIndex end) |
174 /* static */ bool AIRoad::RemoveRoadFull(TileIndex start, TileIndex end) |
149 { |
175 { |
150 EnforcePrecondition(false, ::IsValidTile(start)); |
176 EnforcePrecondition(false, ::IsValidTile(start)); |
151 EnforcePrecondition(false, ::IsValidTile(end)); |
177 EnforcePrecondition(false, ::IsValidTile(end)); |
152 EnforcePrecondition(false, TileX(start) == TileX(end) || TileY(start) == TileY(end)); |
178 EnforcePrecondition(false, TileX(start) == TileX(end) || TileY(start) == TileY(end)); |
153 |
179 |
154 return AIObject::DoCommand(end, start, (TileY(start) != TileY(end) ? 4 : 0) | (start < end ? 2 : 1), CMD_REMOVE_LONG_ROAD); |
180 return AIObject::DoCommand(end, start, (TileY(start) != TileY(end) ? 4 : 0) | (start < end ? 2 : 1) | (AIObject::GetRoadType() << 3), CMD_REMOVE_LONG_ROAD); |
155 } |
181 } |
156 |
182 |
157 /* static */ bool AIRoad::RemoveRoadDepot(TileIndex tile) |
183 /* static */ bool AIRoad::RemoveRoadDepot(TileIndex tile) |
158 { |
184 { |
159 EnforcePrecondition(false, ::IsValidTile(tile)); |
185 EnforcePrecondition(false, ::IsValidTile(tile)); |