rubidium@9453: /* $Id$ */ rubidium@9453: truebrain@9833: /** @file ai_road.cpp Implementation of AIRoad. */ rubidium@9453: rubidium@9453: #include "ai_road.hpp" rubidium@9453: #include "../../road_map.h" rubidium@9453: #include "../../station_map.h" rubidium@9453: truebrain@9737: /* static */ bool AIRoad::IsRoadTile(TileIndex tile) rubidium@9453: { truebrain@9801: if (!::IsValidTile(tile)) return false; rubidium@9453: rubidium@9694: return (::IsTileType(tile, MP_ROAD) && ::GetRoadTileType(tile) != ROAD_TILE_DEPOT) || truebrain@9737: IsDriveThroughRoadStationTile(tile); rubidium@9551: } rubidium@9551: truebrain@9737: /* static */ bool AIRoad::IsRoadDepotTile(TileIndex tile) rubidium@9551: { truebrain@9801: if (!::IsValidTile(tile)) return false; rubidium@9551: rubidium@9694: return ::IsTileType(tile, MP_ROAD) && ::GetRoadTileType(tile) == ROAD_TILE_DEPOT; rubidium@9551: } rubidium@9551: truebrain@9737: /* static */ bool AIRoad::IsRoadStationTile(TileIndex tile) rubidium@9551: { truebrain@9801: if (!::IsValidTile(tile)) return false; rubidium@9551: rubidium@9551: return ::IsRoadStopTile(tile); rubidium@9551: } rubidium@9551: truebrain@9737: /* static */ bool AIRoad::IsDriveThroughRoadStationTile(TileIndex tile) rubidium@9551: { truebrain@9801: if (!::IsValidTile(tile)) return false; rubidium@9551: rubidium@9551: return ::IsDriveThroughStopTile(tile); rubidium@9551: } rubidium@9551: truebrain@9737: /* static */ bool AIRoad::AreRoadTilesConnected(TileIndex t1, TileIndex t2) rubidium@9551: { truebrain@9801: if (!::IsValidTile(t1)) return false; truebrain@9801: if (!::IsValidTile(t2)) return false; rubidium@9551: rubidium@9551: /* Tiles not neighbouring */ rubidium@9551: if ((abs((int)::TileX(t1) - (int)::TileX(t2)) + abs((int)::TileY(t1) - (int)::TileY(t2))) != 1) return false; rubidium@9551: glx@9624: RoadBits r1 = ::GetAnyRoadBits(t1, ROADTYPE_ROAD); glx@9624: RoadBits r2 = ::GetAnyRoadBits(t2, ROADTYPE_ROAD); rubidium@9551: rubidium@9551: DiagDirection dir_1 = (DiagDirection)((::TileX(t1) == ::TileX(t2)) ? (::TileY(t1) < ::TileY(t2) ? 2 : 0) : (::TileX(t1) < ::TileX(t2) ? 1 : 3)); rubidium@9551: DiagDirection dir_2 = ::ReverseDiagDir(dir_1); rubidium@9551: rubidium@9722: return HasBit(r1, dir_1) && HasBit(r2, dir_2); rubidium@9551: } rubidium@9551: truebrain@9737: /* static */ int32 AIRoad::GetNeighbourRoadCount(TileIndex tile) truelight@9617: { truebrain@9801: if (!::IsValidTile(tile)) return false; truelight@9617: truelight@9617: int32 neighbour = 0; truelight@9617: rubidium@9694: if (::IsTileType(tile + ::TileDiffXY(-1, 0), MP_ROAD) && ::GetRoadTileType(tile + ::TileDiffXY(-1, 0)) != ROAD_TILE_DEPOT) neighbour++; rubidium@9694: if (::IsTileType(tile + ::TileDiffXY( 1, 0), MP_ROAD) && ::GetRoadTileType(tile + ::TileDiffXY( 1, 0)) != ROAD_TILE_DEPOT) neighbour++; rubidium@9694: if (::IsTileType(tile + ::TileDiffXY( 0,-1), MP_ROAD) && ::GetRoadTileType(tile + ::TileDiffXY( 0,-1)) != ROAD_TILE_DEPOT) neighbour++; rubidium@9694: if (::IsTileType(tile + ::TileDiffXY( 0, 1), MP_ROAD) && ::GetRoadTileType(tile + ::TileDiffXY( 0, 1)) != ROAD_TILE_DEPOT) neighbour++; truelight@9617: truelight@9617: return neighbour; truelight@9617: } truelight@9617: truebrain@9737: /* static */ TileIndex AIRoad::GetRoadDepotFrontTile(TileIndex depot) rubidium@9551: { truebrain@9737: if (!IsRoadDepotTile(depot)) return INVALID_TILE; rubidium@9551: rubidium@9551: return depot + ::TileOffsByDiagDir(::GetRoadDepotDirection(depot)); rubidium@9551: } rubidium@9551: truebrain@9737: /* static */ TileIndex AIRoad::GetRoadStationFrontTile(TileIndex station) rubidium@9551: { truebrain@9737: if (!IsRoadStationTile(station)) return INVALID_TILE; rubidium@9551: rubidium@9551: return station + ::TileOffsByDiagDir(::GetRoadStopDir(station)); rubidium@9551: } rubidium@9551: truebrain@9737: /* static */ TileIndex AIRoad::GetDriveThroughBackTile(TileIndex station) rubidium@9551: { truebrain@9737: if (!IsDriveThroughRoadStationTile(station)) return INVALID_TILE; rubidium@9551: rubidium@9551: return station + ::TileOffsByDiagDir(::ReverseDiagDir(::GetRoadStopDir(station))); rubidium@9453: } rubidium@9453: truebrain@9737: /* static */ bool AIRoad::BuildRoad(TileIndex start, TileIndex end) rubidium@9453: { rubidium@10091: EnforcePrecondition(false, start != end); rubidium@10091: EnforcePrecondition(false, ::IsValidTile(start)); rubidium@10091: EnforcePrecondition(false, ::IsValidTile(end)); rubidium@10091: EnforcePrecondition(false, TileX(start) == TileX(end) || TileY(start) == TileY(end)); rubidium@9453: truebrain@9737: return AIObject::DoCommand(end, start, (TileY(start) != TileY(end) ? 4 : 0) | (start < end ? 1 : 2) | (ROADTYPE_ROAD << 3), CMD_BUILD_LONG_ROAD); rubidium@9453: } rubidium@9453: truebrain@9737: /* static */ bool AIRoad::BuildRoadFull(TileIndex start, TileIndex end) glx@9659: { rubidium@10091: EnforcePrecondition(false, start != end); rubidium@10091: EnforcePrecondition(false, ::IsValidTile(start)); rubidium@10091: EnforcePrecondition(false, ::IsValidTile(end)); rubidium@10091: EnforcePrecondition(false, TileX(start) == TileX(end) || TileY(start) == TileY(end)); glx@9659: truebrain@9737: return AIObject::DoCommand(end, start, (TileY(start) != TileY(end) ? 4 : 0) | (start < end ? 2 : 1), CMD_BUILD_LONG_ROAD); glx@9659: } glx@9659: truebrain@9737: /* static */ bool AIRoad::BuildRoadDepot(TileIndex tile, TileIndex front) rubidium@9453: { rubidium@10091: EnforcePrecondition(false, tile != front); rubidium@10091: EnforcePrecondition(false, ::IsValidTile(tile)); rubidium@10091: EnforcePrecondition(false, ::IsValidTile(front)); rubidium@9453: glx@9504: uint entrance_dir = (TileX(tile) == TileX(front)) ? (TileY(tile) < TileY(front) ? 1 : 3) : (TileX(tile) < TileX(front) ? 2 : 0); rubidium@9453: truebrain@9737: return AIObject::DoCommand(tile, entrance_dir, ROADTYPE_ROAD << 2, CMD_BUILD_ROAD_DEPOT); rubidium@9453: } rubidium@9453: truebrain@9737: /* static */ bool AIRoad::BuildRoadStation(TileIndex tile, TileIndex front, bool truck, bool drive_through) rubidium@9453: { rubidium@10091: EnforcePrecondition(false, tile != front); rubidium@10091: EnforcePrecondition(false, ::IsValidTile(tile)); rubidium@10091: EnforcePrecondition(false, ::IsValidTile(front)); rubidium@9453: rubidium@9453: uint entrance_dir; rubidium@9453: if (drive_through) { truelight@9482: entrance_dir = TileY(tile) != TileY(front); rubidium@9453: } else { glx@9504: entrance_dir = (TileX(tile) == TileX(front)) ? (TileY(tile) < TileY(front) ? 1 : 3) : (TileX(tile) < TileX(front) ? 2 : 0); rubidium@9453: } rubidium@9453: truebrain@9737: return AIObject::DoCommand(tile, entrance_dir, (drive_through ? 2 : 0) | (truck ? 1 : 0) | (ROADTYPES_ROAD << 2), CMD_BUILD_ROAD_STOP); rubidium@9453: } rubidium@9453: truebrain@9737: /* static */ bool AIRoad::RemoveRoad(TileIndex start, TileIndex end) glx@9659: { rubidium@10091: EnforcePrecondition(false, ::IsValidTile(start)); rubidium@10091: EnforcePrecondition(false, ::IsValidTile(end)); rubidium@10091: EnforcePrecondition(false, TileX(start) == TileX(end) || TileY(start) == TileY(end)); glx@9659: truebrain@9737: return AIObject::DoCommand(end, start, (TileY(start) != TileY(end) ? 4 : 0) | (start < end ? 1 : 2) | (ROADTYPE_ROAD << 3), CMD_REMOVE_LONG_ROAD); glx@9659: } glx@9659: truebrain@9737: /* static */ bool AIRoad::RemoveRoadFull(TileIndex start, TileIndex end) truebrain@9737: { rubidium@10091: EnforcePrecondition(false, ::IsValidTile(start)); rubidium@10091: EnforcePrecondition(false, ::IsValidTile(end)); rubidium@10091: EnforcePrecondition(false, TileX(start) == TileX(end) || TileY(start) == TileY(end)); truebrain@9737: truebrain@9737: return AIObject::DoCommand(end, start, (TileY(start) != TileY(end) ? 4 : 0) | (start < end ? 2 : 1), CMD_REMOVE_LONG_ROAD); truebrain@9737: } truebrain@9737: truebrain@9737: /* static */ bool AIRoad::RemoveRoadDepot(TileIndex tile) rubidium@9453: { rubidium@10091: EnforcePrecondition(false, ::IsValidTile(tile)); rubidium@10094: EnforcePrecondition(false, IsTileType(tile, MP_ROAD)) rubidium@10094: EnforcePrecondition(false, GetRoadTileType(tile) == ROAD_TILE_DEPOT); rubidium@9453: truebrain@9737: return AIObject::DoCommand(tile, 0, 0, CMD_LANDSCAPE_CLEAR); rubidium@9453: } rubidium@9453: truebrain@9737: /* static */ bool AIRoad::RemoveRoadStation(TileIndex tile) rubidium@9453: { rubidium@10091: EnforcePrecondition(false, ::IsValidTile(tile)); rubidium@10094: EnforcePrecondition(false, IsTileType(tile, MP_STATION)); rubidium@10094: EnforcePrecondition(false, IsRoadStop(tile)); rubidium@9453: truebrain@9737: return AIObject::DoCommand(tile, 0, GetRoadStopType(tile), CMD_REMOVE_ROAD_STOP); rubidium@9453: }