rubidium@9453: /* $Id$ */ rubidium@9453: rubidium@9513: /** @file ai_road.cpp handles the functions of the AIRoad class */ rubidium@9453: rubidium@9453: #include "ai_road.hpp" rubidium@9453: #include "../../command.h" rubidium@9453: #include "../../road_map.h" rubidium@9453: #include "../../station_map.h" rubidium@9453: rubidium@9453: bool AIRoad::IsRoadTile(TileIndex tile) rubidium@9453: { rubidium@9453: /* Outside of the map */ rubidium@9453: if (tile >= _map_size) return false; rubidium@9453: rubidium@9453: return IsTileType(tile, MP_STREET) && GetRoadTileType(tile) != ROAD_TILE_DEPOT; rubidium@9453: } rubidium@9453: rubidium@9453: bool AIRoad::BuildRoad(TileIndex start, TileIndex end) rubidium@9453: { rubidium@9453: /* Outside of the map */ rubidium@9453: if (start >= _map_size || end >= _map_size || start == end) return false; rubidium@9453: /* Not on one line */ rubidium@9453: if (TileX(start) != TileX(end) && rubidium@9453: TileY(start) != TileY(end)) return false; rubidium@9453: glx@9504: return this->DoCommand(end, start, (TileY(start) != TileY(end) ? 4 : 0) | (start < end ? 1 : 2), CMD_BUILD_LONG_ROAD); rubidium@9453: } rubidium@9453: rubidium@9453: bool AIRoad::BuildRoadDepot(TileIndex tile, TileIndex front) rubidium@9453: { rubidium@9453: /* Outside of the map */ rubidium@9453: if (tile >= _map_size || tile == front) return false; 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: truelight@9486: return this->DoCommand(tile, entrance_dir, 0, CMD_BUILD_ROAD_DEPOT); rubidium@9453: } rubidium@9453: rubidium@9503: bool AIRoad::BuildRoadStation(TileIndex tile, TileIndex front, bool truck, bool drive_through) rubidium@9453: { rubidium@9453: /* Outside of the map */ rubidium@9453: if (tile >= _map_size || tile == front) return false; 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: glx@9504: return this->DoCommand(tile, entrance_dir, (drive_through ? 2 : 0) | (truck ? 1 : 0), CMD_BUILD_ROAD_STOP); rubidium@9453: } rubidium@9453: rubidium@9453: bool AIRoad::RemoveRoad(TileIndex start, TileIndex end) rubidium@9453: { rubidium@9453: /* Outside of the map */ rubidium@9453: if (start >= _map_size || end >= _map_size) return false; rubidium@9453: /* Not on one line */ rubidium@9453: if (TileX(start) != TileX(end) && rubidium@9453: TileY(start) != TileY(end)) return false; rubidium@9453: glx@9504: return this->DoCommand(end, start, (TileY(start) != TileY(end) ? 4 : 0) | (start < end ? 1 : 2), CMD_REMOVE_LONG_ROAD); rubidium@9453: } rubidium@9453: rubidium@9453: bool AIRoad::RemoveRoadDepot(TileIndex tile) rubidium@9453: { rubidium@9453: /* Outside of the map */ rubidium@9453: if (tile >= _map_size) return false; rubidium@9453: rubidium@9453: /* Not a road depot tile */ rubidium@9453: if (!IsTileType(tile, MP_STREET) || GetRoadTileType(tile) != ROAD_TILE_DEPOT) return false; rubidium@9453: truelight@9486: return this->DoCommand(tile, 0, 0, CMD_LANDSCAPE_CLEAR); rubidium@9453: } rubidium@9453: rubidium@9453: bool AIRoad::RemoveRoadStation(TileIndex tile) rubidium@9453: { rubidium@9453: /* Outside of the map */ rubidium@9453: if (tile >= _map_size) return false; rubidium@9453: rubidium@9453: /* Not a road station tile */ rubidium@9453: if (!IsTileType(tile, MP_STATION) || !IsRoadStop(tile)) return false; rubidium@9453: truelight@9486: return this->DoCommand(tile, 0, GetRoadStopType(tile), CMD_REMOVE_ROAD_STOP); rubidium@9453: }