87 return station + ::TileOffsByDiagDir(::ReverseDiagDir(::GetRoadStopDir(station))); |
87 return station + ::TileOffsByDiagDir(::ReverseDiagDir(::GetRoadStopDir(station))); |
88 } |
88 } |
89 |
89 |
90 /* static */ bool AIRoad::BuildRoad(TileIndex start, TileIndex end) |
90 /* static */ bool AIRoad::BuildRoad(TileIndex start, TileIndex end) |
91 { |
91 { |
92 if (start == end) return false; |
92 EnforcePrecondition(false, start != end); |
93 if (!::IsValidTile(start)) return false; |
93 EnforcePrecondition(false, ::IsValidTile(start)); |
94 if (!::IsValidTile(end)) return false; |
94 EnforcePrecondition(false, ::IsValidTile(end)); |
95 /* Not on one line */ |
95 EnforcePrecondition(false, TileX(start) == TileX(end) || TileY(start) == TileY(end)); |
96 if (TileX(start) != TileX(end) && |
|
97 TileY(start) != TileY(end)) return false; |
|
98 |
96 |
99 return AIObject::DoCommand(end, start, (TileY(start) != TileY(end) ? 4 : 0) | (start < end ? 1 : 2) | (ROADTYPE_ROAD << 3), CMD_BUILD_LONG_ROAD); |
97 return AIObject::DoCommand(end, start, (TileY(start) != TileY(end) ? 4 : 0) | (start < end ? 1 : 2) | (ROADTYPE_ROAD << 3), CMD_BUILD_LONG_ROAD); |
100 } |
98 } |
101 |
99 |
102 /* static */ bool AIRoad::BuildRoadFull(TileIndex start, TileIndex end) |
100 /* static */ bool AIRoad::BuildRoadFull(TileIndex start, TileIndex end) |
103 { |
101 { |
104 if (start == end) return false; |
102 EnforcePrecondition(false, start != end); |
105 if (!::IsValidTile(start)) return false; |
103 EnforcePrecondition(false, ::IsValidTile(start)); |
106 if (!::IsValidTile(end)) return false; |
104 EnforcePrecondition(false, ::IsValidTile(end)); |
107 /* Not on one line */ |
105 EnforcePrecondition(false, TileX(start) == TileX(end) || TileY(start) == TileY(end)); |
108 if (TileX(start) != TileX(end) && |
|
109 TileY(start) != TileY(end)) return false; |
|
110 |
106 |
111 return AIObject::DoCommand(end, start, (TileY(start) != TileY(end) ? 4 : 0) | (start < end ? 2 : 1), CMD_BUILD_LONG_ROAD); |
107 return AIObject::DoCommand(end, start, (TileY(start) != TileY(end) ? 4 : 0) | (start < end ? 2 : 1), CMD_BUILD_LONG_ROAD); |
112 } |
108 } |
113 |
109 |
114 /* static */ bool AIRoad::BuildRoadDepot(TileIndex tile, TileIndex front) |
110 /* static */ bool AIRoad::BuildRoadDepot(TileIndex tile, TileIndex front) |
115 { |
111 { |
116 if (tile == front) return false; |
112 EnforcePrecondition(false, tile != front); |
117 if (!::IsValidTile(tile)) return false; |
113 EnforcePrecondition(false, ::IsValidTile(tile)); |
118 if (!::IsValidTile(front)) return false; |
114 EnforcePrecondition(false, ::IsValidTile(front)); |
119 |
115 |
120 uint entrance_dir = (TileX(tile) == TileX(front)) ? (TileY(tile) < TileY(front) ? 1 : 3) : (TileX(tile) < TileX(front) ? 2 : 0); |
116 uint entrance_dir = (TileX(tile) == TileX(front)) ? (TileY(tile) < TileY(front) ? 1 : 3) : (TileX(tile) < TileX(front) ? 2 : 0); |
121 |
117 |
122 return AIObject::DoCommand(tile, entrance_dir, ROADTYPE_ROAD << 2, CMD_BUILD_ROAD_DEPOT); |
118 return AIObject::DoCommand(tile, entrance_dir, ROADTYPE_ROAD << 2, CMD_BUILD_ROAD_DEPOT); |
123 } |
119 } |
124 |
120 |
125 /* static */ bool AIRoad::BuildRoadStation(TileIndex tile, TileIndex front, bool truck, bool drive_through) |
121 /* static */ bool AIRoad::BuildRoadStation(TileIndex tile, TileIndex front, bool truck, bool drive_through) |
126 { |
122 { |
127 if (tile == front) return false; |
123 EnforcePrecondition(false, tile != front); |
128 if (!::IsValidTile(tile)) return false; |
124 EnforcePrecondition(false, ::IsValidTile(tile)); |
129 if (!::IsValidTile(front)) return false; |
125 EnforcePrecondition(false, ::IsValidTile(front)); |
130 |
126 |
131 uint entrance_dir; |
127 uint entrance_dir; |
132 if (drive_through) { |
128 if (drive_through) { |
133 entrance_dir = TileY(tile) != TileY(front); |
129 entrance_dir = TileY(tile) != TileY(front); |
134 } else { |
130 } else { |
138 return AIObject::DoCommand(tile, entrance_dir, (drive_through ? 2 : 0) | (truck ? 1 : 0) | (ROADTYPES_ROAD << 2), CMD_BUILD_ROAD_STOP); |
134 return AIObject::DoCommand(tile, entrance_dir, (drive_through ? 2 : 0) | (truck ? 1 : 0) | (ROADTYPES_ROAD << 2), CMD_BUILD_ROAD_STOP); |
139 } |
135 } |
140 |
136 |
141 /* static */ bool AIRoad::RemoveRoad(TileIndex start, TileIndex end) |
137 /* static */ bool AIRoad::RemoveRoad(TileIndex start, TileIndex end) |
142 { |
138 { |
143 if (!::IsValidTile(start)) return false; |
139 EnforcePrecondition(false, ::IsValidTile(start)); |
144 if (!::IsValidTile(end)) return false; |
140 EnforcePrecondition(false, ::IsValidTile(end)); |
145 /* Not on one line */ |
141 EnforcePrecondition(false, TileX(start) == TileX(end) || TileY(start) == TileY(end)); |
146 if (TileX(start) != TileX(end) && |
|
147 TileY(start) != TileY(end)) return false; |
|
148 |
142 |
149 return AIObject::DoCommand(end, start, (TileY(start) != TileY(end) ? 4 : 0) | (start < end ? 1 : 2) | (ROADTYPE_ROAD << 3), CMD_REMOVE_LONG_ROAD); |
143 return AIObject::DoCommand(end, start, (TileY(start) != TileY(end) ? 4 : 0) | (start < end ? 1 : 2) | (ROADTYPE_ROAD << 3), CMD_REMOVE_LONG_ROAD); |
150 } |
144 } |
151 |
145 |
152 /* static */ bool AIRoad::RemoveRoadFull(TileIndex start, TileIndex end) |
146 /* static */ bool AIRoad::RemoveRoadFull(TileIndex start, TileIndex end) |
153 { |
147 { |
154 if (!::IsValidTile(start)) return false; |
148 EnforcePrecondition(false, ::IsValidTile(start)); |
155 if (!::IsValidTile(end)) return false; |
149 EnforcePrecondition(false, ::IsValidTile(end)); |
156 /* Not on one line */ |
150 EnforcePrecondition(false, TileX(start) == TileX(end) || TileY(start) == TileY(end)); |
157 if (TileX(start) != TileX(end) && |
|
158 TileY(start) != TileY(end)) return false; |
|
159 |
151 |
160 return AIObject::DoCommand(end, start, (TileY(start) != TileY(end) ? 4 : 0) | (start < end ? 2 : 1), CMD_REMOVE_LONG_ROAD); |
152 return AIObject::DoCommand(end, start, (TileY(start) != TileY(end) ? 4 : 0) | (start < end ? 2 : 1), CMD_REMOVE_LONG_ROAD); |
161 } |
153 } |
162 |
154 |
163 /* static */ bool AIRoad::RemoveRoadDepot(TileIndex tile) |
155 /* static */ bool AIRoad::RemoveRoadDepot(TileIndex tile) |
164 { |
156 { |
165 if (!::IsValidTile(tile)) return false; |
157 EnforcePrecondition(false, ::IsValidTile(tile)); |
166 if (!IsTileType(tile, MP_ROAD) || GetRoadTileType(tile) != ROAD_TILE_DEPOT) return false; |
158 EnforcePrecondition(false, IsTileType(tile, MP_ROAD) && GetRoadTileType(tile) == ROAD_TILE_DEPOT); |
167 |
159 |
168 return AIObject::DoCommand(tile, 0, 0, CMD_LANDSCAPE_CLEAR); |
160 return AIObject::DoCommand(tile, 0, 0, CMD_LANDSCAPE_CLEAR); |
169 } |
161 } |
170 |
162 |
171 /* static */ bool AIRoad::RemoveRoadStation(TileIndex tile) |
163 /* static */ bool AIRoad::RemoveRoadStation(TileIndex tile) |
172 { |
164 { |
173 if (!::IsValidTile(tile)) return false; |
165 EnforcePrecondition(false, ::IsValidTile(tile)); |
174 if (!IsTileType(tile, MP_STATION) || !IsRoadStop(tile)) return false; |
166 EnforcePrecondition(false, IsTileType(tile, MP_STATION) && IsRoadStop(tile)); |
175 |
167 |
176 return AIObject::DoCommand(tile, 0, GetRoadStopType(tile), CMD_REMOVE_ROAD_STOP); |
168 return AIObject::DoCommand(tile, 0, GetRoadStopType(tile), CMD_REMOVE_ROAD_STOP); |
177 } |
169 } |