From ad561fc6f242bb37f5b7ff0d4e764a393c2deb01 Mon Sep 17 00:00:00 2001 From: terkhen Date: Tue, 2 Feb 2010 22:27:03 +0000 Subject: [PATCH] (svn r18987) -Fix: [NoAI] Make building long rails fail for AIs if there is an obstacle in the way. --- src/ai/api/ai_rail.cpp | 2 +- src/ai/api/ai_rail.hpp | 1 + src/rail_cmd.cpp | 6 +++++- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/ai/api/ai_rail.cpp b/src/ai/api/ai_rail.cpp index 9b2974a301..ae349ccde0 100644 --- a/src/ai/api/ai_rail.cpp +++ b/src/ai/api/ai_rail.cpp @@ -332,7 +332,7 @@ static uint32 SimulateDrag(TileIndex from, TileIndex tile, TileIndex *to) (::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); } diff --git a/src/ai/api/ai_rail.hpp b/src/ai/api/ai_rail.hpp index 7170412ba8..e82d01ae9f 100644 --- a/src/ai/api/ai_rail.hpp +++ b/src/ai/api/ai_rail.hpp @@ -380,6 +380,7 @@ public: * @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); diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp index 22e45c7b8f..c9e2c3916d 100644 --- a/src/rail_cmd.cpp +++ b/src/rail_cmd.cpp @@ -698,6 +698,7 @@ static CommandCost ValidateAutoDrag(Trackdir *trackdir, TileIndex start, TileInd * - 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 @@ static CommandCost CmdRailTrackHelper(TileIndex tile, DoCommandFlag flags, uint3 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);