(svn r12555) [NoAI] -Add: support for GetLastError for AICompany.
/* $Id$ */
/** @file ai_road.hpp Everything to query and build roads. */
#ifndef AI_ROAD_HPP
#define AI_ROAD_HPP
#include "ai_object.hpp"
/**
* Class that handles all road related functions.
*/
class AIRoad : public AIObject {
public:
static const char *GetClassName() { return "AIRoad"; }
/**
* Checks whether the given tile is actually a tile with road that can be
* used to traverse a tile. This excludes road depots and 'normal' road
* stations, but includes drive through stations.
* @param tile The tile to check.
* @pre AIMap::IsValidTile(tile).
* @return True if and only if the tile has road.
*/
static bool IsRoadTile(TileIndex tile);
/**
* Checks whether the given tile is actually a tile with a road depot.
* @param tile The tile to check.
* @pre AIMap::IsValidTile(tile).
* @return True if and only if the tile has a road depot.
*/
static bool IsRoadDepotTile(TileIndex tile);
/**
* Checks whether the given tile is actually a tile with a road station.
* @param tile The tile to check.
* @pre AIMap::IsValidTile(tile).
* @return True if and only if the tile has a road station.
*/
static bool IsRoadStationTile(TileIndex tile);
/**
* Checks whether the given tile is actually a tile with a drive through
* road station.
* @param tile The tile to check.
* @pre AIMap::IsValidTile(tile).
* @return True if and only if the tile has a drive through road station.
*/
static bool IsDriveThroughRoadStationTile(TileIndex tile);
/**
* Checks whether the given tiles are directly connected, i.e. whether
* a road vehicle can travel from the center of the first tile to the
* center of the second tile.
* @param tile_from The source tile.
* @param tile_to The destination tile.
* @pre AIMap::IsValidTile(tile_from).
* @pre AIMap::IsValidTile(tile_to).
* @pre 'tile_from' and 'tile_to' are directly neighbouring tiles.
* @return True if and only if a road vehicle can go from tile_from to tile_to.
*/
static bool AreRoadTilesConnected(TileIndex tile_from, TileIndex tile_to);
/**
* Count how many neighbours are road.
* @param tile The tile to check on.
* @pre AIMap::IsValidTile(tile).
* @return 0 means no neighbour road; max value is 4.
*/
static int32 GetNeighbourRoadCount(TileIndex tile);
/**
* Gets the tile in front of a road depot.
* @param depot The road depot tile.
* @pre IsRoadDepotTile(depot).
* @return The tile in front of the depot.
*/
static TileIndex GetRoadDepotFrontTile(TileIndex depot);
/**
* Gets the tile in front of a road station.
* @param station The road station tile.
* @pre IsRoadStationTile(station).
* @return The tile in front of the road station.
*/
static TileIndex GetRoadStationFrontTile(TileIndex station);
/**
* Gets the tile at the back of a drive through road station.
* So, one side of the drive through station is retrieved with
* GetTileInFrontOfStation, the other with this function.
* @param station The road station tile.
* @pre IsDriveThroughRoadStationTile(station).
* @return The tile at the back of the drive through road station.
*/
static TileIndex GetDriveThroughBackTile(TileIndex station);
/**
* Builds a road from the center of tile start to the center of tile end.
* @param start The start tile of the road.
* @param end The end tile of the road.
* @pre 'start' is not equal to 'end'.
* @pre AIMap::IsValidTile(start).
* @pre AIMap::IsValidTile(end).
* @pre 'start' and 'end' are in a straight line, i.e.
* AIMap::GetTileX(start) == AIMap::GetTileX(end) or
* AIMap::GetTileY(start) == AIMap::GetTileY(end).
* @return Whether the road has been/can be build or not.
*/
static bool BuildRoad(TileIndex start, TileIndex end);
/**
* Builds a road from the edge of tile start to the edge of tile end (both
* included).
* @param start The start tile of the road.
* @param end The end tile of the road.
* @pre 'start' is not equal to 'end'.
* @pre AIMap::IsValidTile(start).
* @pre AIMap::IsValidTile(end).
* @pre 'start' and 'end' are in a straight line, i.e.
* AIMap::GetTileX(start) == AIMap::GetTileX(end) or
* AIMap::GetTileY(start) == AIMap::GetTileY(end).
* @return Whether the road has been/can be build or not.
*/
static bool BuildRoadFull(TileIndex start, TileIndex end);
/**
* Builds a road depot.
* @param tile Place to build the depot.
* @param front The tile exactly in front of the depot.
* @pre AIMap::IsValidTile(tile).
* @pre AIMap::IsValidTile(front).
* @pre Tile is not equal to front.
* @return Whether the road depot has been/can be build or not.
*/
static bool BuildRoadDepot(TileIndex tile, TileIndex front);
/**
* Builds a road bus or truck station.
* @param tile Place to build the depot.
* @param front The tile exactly in front of the station.
* For drive-through stations either entrance side can be used.
* @param truck Whether to build a truck (true) or bus (false) station.
* @param drive_through Whether to make the station drive through or not.
* @pre AIMap::IsValidTile(tile).
* @pre AIMap::IsValidTile(front).
* @pre 'tile' is not equal to 'front'.
* @return Whether the station has been/can be build or not.
*/
static bool BuildRoadStation(TileIndex tile, TileIndex front, bool truck, bool drive_through);
/**
* Removes a road from the center of tile start to the center of tile end.
* @param start The start tile of the road.
* @param end The end tile of the road.
* @pre AIMap::IsValidTile(start).
* @pre AIMap::IsValidTile(end).
* @pre 'start' and 'end' are in a straight line, i.e.
* AIMap::GetTileX(start) == AIMap::GetTileX(end) or
* AIMap::GetTileY(start) == AIMap::GetTileY(end).
* @return Whether the road has been/can be removed or not.
*/
static bool RemoveRoad(TileIndex start, TileIndex end);
/**
* Removes a road from the edge of tile start to the edge of tile end (both
* included).
* @param start The start tile of the road.
* @param end The end tile of the road.
* @pre AIMap::IsValidTile(start).
* @pre AIMap::IsValidTile(end).
* @pre 'start' and 'end' are in a straight line, i.e.
* AIMap::GetTileX(start) == AIMap::GetTileX(end) or
* AIMap::GetTileY(start) == AIMap::GetTileY(end).
* @return Whether the road has been/can be removed or not.
*/
static bool RemoveRoadFull(TileIndex start, TileIndex end);
/**
* Removes a road depot.
* @param tile Place to remove the depot from.
* @pre AIMap::IsValidTile(tile).
* @pre Tile is a road depot.
* @return Whether the road depot has been/can be removed or not.
*/
static bool RemoveRoadDepot(TileIndex tile);
/**
* Removes a road bus or truck station.
* @param tile Place to remove the station from.
* @pre AIMap::IsValidTile(tile).
* @pre Tile is a road station.
* @return Whether the station has been/can be removed or not.
*/
static bool RemoveRoadStation(TileIndex tile);
};
#endif /* AI_ROAD_HPP */