diff --git a/src/ai/api/ai_road.cpp b/src/ai/api/ai_road.cpp index 27694ac10f..24789bcf12 100644 --- a/src/ai/api/ai_road.cpp +++ b/src/ai/api/ai_road.cpp @@ -471,7 +471,7 @@ static bool NeighbourHasReachableRoad(::RoadTypes rts, TileIndex start_tile, Dia EnforcePrecondition(false, !one_way || AIObject::GetRoadType() == ::ROADTYPE_ROAD); EnforcePrecondition(false, IsRoadTypeAvailable(GetCurrentRoadType())); - return AIObject::DoCommand(start, end, (::TileY(start) != ::TileY(end) ? 4 : 0) | (((start < end) == !full) ? 1 : 2) | (AIObject::GetRoadType() << 3) | ((one_way ? 1 : 0) << 5), CMD_BUILD_LONG_ROAD); + return AIObject::DoCommand(start, end, (::TileY(start) != ::TileY(end) ? 4 : 0) | (((start < end) == !full) ? 1 : 2) | (AIObject::GetRoadType() << 3) | ((one_way ? 1 : 0) << 5) | 1 << 6, CMD_BUILD_LONG_ROAD); } /* static */ bool AIRoad::BuildRoad(TileIndex start, TileIndex end) diff --git a/src/ai/api/ai_road.hpp b/src/ai/api/ai_road.hpp index a0bc131e6a..0e71095e6b 100644 --- a/src/ai/api/ai_road.hpp +++ b/src/ai/api/ai_road.hpp @@ -263,6 +263,7 @@ public: * @exception AIRoad::ERR_ROAD_ONE_WAY_ROADS_CANNOT_HAVE_JUNCTIONS * @exception AIRoad::ERR_ROAD_WORKS_IN_PROGRESS * @exception AIError::ERR_VEHICLE_IN_THE_WAY + * @note Construction will fail if an obstacle is found between the start and end tiles. * @return Whether the road has been/can be build or not. */ static bool BuildRoad(TileIndex start, TileIndex end); @@ -289,6 +290,7 @@ public: * @exception AIRoad::ERR_ROAD_ONE_WAY_ROADS_CANNOT_HAVE_JUNCTIONS * @exception AIRoad::ERR_ROAD_WORKS_IN_PROGRESS * @exception AIError::ERR_VEHICLE_IN_THE_WAY + * @note Construction will fail if an obstacle is found between the start and end tiles. * @return Whether the road has been/can be build or not. */ static bool BuildOneWayRoad(TileIndex start, TileIndex end); @@ -311,6 +313,7 @@ public: * @exception AIRoad::ERR_ROAD_ONE_WAY_ROADS_CANNOT_HAVE_JUNCTIONS * @exception AIRoad::ERR_ROAD_WORKS_IN_PROGRESS * @exception AIError::ERR_VEHICLE_IN_THE_WAY + * @note Construction will fail if an obstacle is found between the start and end tiles. * @return Whether the road has been/can be build or not. */ static bool BuildRoadFull(TileIndex start, TileIndex end); @@ -338,6 +341,7 @@ public: * @exception AIRoad::ERR_ROAD_ONE_WAY_ROADS_CANNOT_HAVE_JUNCTIONS * @exception AIRoad::ERR_ROAD_WORKS_IN_PROGRESS * @exception AIError::ERR_VEHICLE_IN_THE_WAY + * @note Construction will fail if an obstacle is found between the start and end tiles. * @return Whether the road has been/can be build or not. */ static bool BuildOneWayRoadFull(TileIndex start, TileIndex end); diff --git a/src/road_cmd.cpp b/src/road_cmd.cpp index 477c35059a..aa5c149434 100644 --- a/src/road_cmd.cpp +++ b/src/road_cmd.cpp @@ -690,6 +690,7 @@ do_clear:; * - p2 = (bit 2) - direction: 0 = along x-axis, 1 = along y-axis (p2 & 4) * - p2 = (bit 3 + 4) - road type * - p2 = (bit 5) - set road direction + * - p2 = (bit 6) - 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 */ @@ -742,7 +743,10 @@ CommandCost CmdBuildLongRoad(TileIndex start_tile, DoCommandFlag flags, uint32 p _error_message = INVALID_STRING_ID; CommandCost ret = DoCommand(tile, drd << 6 | rt << 4 | bits, 0, flags, CMD_BUILD_ROAD); if (ret.Failed()) { - if (_error_message != STR_ERROR_ALREADY_BUILT) break; + if (_error_message != STR_ERROR_ALREADY_BUILT) { + if (HasBit(p2, 6)) return CMD_ERROR; + break; + } } else { had_success = true; /* Only pay for the upgrade on one side of the bridges and tunnels */