changeset 14430:c6edaac902aa draft

(svn r18987) -Fix: [NoAI] Make building long rails fail for AIs if there is an obstacle in the way.
author terkhen <terkhen@openttd.org>
date Tue, 02 Feb 2010 22:27:03 +0000
parents 361ea03dee01
children e778a635a908
files src/ai/api/ai_rail.cpp src/ai/api/ai_rail.hpp src/rail_cmd.cpp
diffstat 3 files changed, 7 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/ai/api/ai_rail.cpp
+++ b/src/ai/api/ai_rail.cpp
@@ -332,7 +332,7 @@
 			(::TileX(from) == ::TileX(tile) && ::TileX(tile) == ::TileX(to)) ||
 			(::TileY(from) == ::TileY(tile) && ::TileY(tile) == ::TileY(to)));
 
-	uint32 p2 = SimulateDrag(from, tile, &to);
+	uint32 p2 = SimulateDrag(from, tile, &to) | 1 << 8;
 	return AIObject::DoCommand(tile, to, p2, CMD_BUILD_RAILROAD_TRACK);
 }
 
--- a/src/ai/api/ai_rail.hpp
+++ b/src/ai/api/ai_rail.hpp
@@ -380,6 +380,7 @@
 	 * @exception AIRail::ERR_CROSSING_ON_ONEWAY_ROAD
 	 * @exception AIRoad::ERR_ROAD_WORKS_IN_PROGRESS
 	 * @exception AIError::ERR_ALREADY_BUILT
+	 * @note Construction will fail if an obstacle is found between the start and end tiles.
 	 * @return Whether the rail has been/can be build or not.
 	 */
 	static bool BuildRail(TileIndex from, TileIndex tile, TileIndex to);
--- a/src/rail_cmd.cpp
+++ b/src/rail_cmd.cpp
@@ -698,6 +698,7 @@
  * - p2 = (bit 0-3) - railroad type normal/maglev (0 = normal, 1 = mono, 2 = maglev)
  * - p2 = (bit 4-6) - track-orientation, valid values: 0-5 (Track enum)
  * - p2 = (bit 7)   - 0 = build, 1 = remove tracks
+ * - p2 = (bit 8)   - 0 = build up to an obstacle, 1 = fail if an obstacle is found (used for AIs).
  * @param text unused
  * @return the cost of this operation or an error
  */
@@ -721,7 +722,10 @@
 		ret = DoCommand(tile, railtype, TrackdirToTrack(trackdir), flags, remove ? CMD_REMOVE_SINGLE_RAIL : CMD_BUILD_SINGLE_RAIL);
 
 		if (ret.Failed()) {
-			if (_error_message != STR_ERROR_ALREADY_BUILT && !remove) break;
+			if (_error_message != STR_ERROR_ALREADY_BUILT && !remove) {
+				if (HasBit(p2, 8)) return CMD_ERROR;
+				break;
+			}
 			_error_message = INVALID_STRING_ID;
 		} else {
 			total_cost.AddCost(ret);