(svn r9494) [NoAI] -Fix: IsRoadTile returns true for all tiles that can be used to traverse a tile. This includes drive through road stops and excluded 'normal' road stations and road depots.
/* $Id$ */
/** @file ai_map.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.
*
* Roads are always build from tile center to tile center.
* Furthermore stations and depots need to be build on tiles
* that already have road on them. For depots and non-drive
* through stations that means that only one roadbit may be
* built at the location. The advantage of this method is
* that the AI does not need to think about pointing the
* exit of the depots and roadstations towards the correct
* direction. For drive-through roadstops this works about
* the same, though they have to be built on straight roads.
*/
class AIRoad : public AIObject {
public:
/**
* The name of the class, needed by several sub-processes.
*/
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 tile is always positive and smaller than AIMap::GetMapSize().
* @return true if and only if the tile has road.
*/
bool IsRoadTile(TileIndex tile);
/**
* Checks whether the given tile is actually a tile with a road depot.
* @param tile the tile to check.
* @pre tile is always positive and smaller than AIMap::GetMapSize().
* @return true if and only if the tile has a road depot.
*/
bool IsRoadDepotTile(TileIndex tile);
/**
* Checks whether the given tile is actually a tile with a road station.
* @param tile the tile to check.
* @pre tile is always positive and smaller than AIMap::GetMapSize().
* @return true if and only if the tile has a road station.
*/
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 tile is always positive and smaller than AIMap::GetMapSize().
* @return true if and only if the tile has a drive through road station.
*/
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 t1 the source tile.
* @param t2 the destination tile.
* @pre t1 is always positive and smaller than AIMap::GetMapSize().
* @pre t2 is always positive and smaller than AIMap::GetMapSize().
* @pre t1 and t2 are directly neighbouring tiles.
* @return true if and only if a road vehicle can go from t1 to t2.
*/
bool AreRoadTilesConnected(TileIndex t1, TileIndex t2);
/**
* 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.
*/
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.
*/
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.
*/
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 start is always positive and smaller than AIMap::GetMapSize().
* @pre end is always positive and smaller than AIMap::GetMapSize().
* @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.
*/
bool BuildRoad(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 tile is always positive and smaller than AIMap::GetMapSize().
* @pre front is always positive and smaller than AIMap::GetMapSize().
* @pre tile is not equal to front
* @return whether the road depot has been/can be build or not.
*/
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 tile is always positive and smaller than AIMap::GetMapSize().
* @pre front is always positive and smaller than AIMap::GetMapSize().
* @pre tile is not equal to front
* @return whether the station has been/can be build or not.
*/
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 start is always positive and smaller than AIMap::GetMapSize().
* @pre end is always positive and smaller than AIMap::GetMapSize().
* @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.
*/
bool RemoveRoad(TileIndex start, TileIndex end);
/**
* Removes a road depot.
* @param tile place to remove the depot from.
* @pre tile is always positive and smaller than AIMap::GetMapSize().
* @pre tile is a road depot.
* @return whether the road depot has been/can be removed or not.
*/
bool RemoveRoadDepot(TileIndex tile);
/**
* Removes a road bus or truck station.
* @param tile place to remove the station from.
* @pre tile is always positive and smaller than AIMap::GetMapSize().
* @pre tile is a road station.
* @return whether the station has been/can be removed or not.
*/
bool RemoveRoadStation(TileIndex tile);
};
#ifdef DEFINE_SQUIRREL_CLASS
namespace SQConvert {
/* Allow AIRoad to be used as Squirrel parameter */
template <> AIRoad *GetParam(ForceType<AIRoad *>, HSQUIRRELVM vm, int index) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return (AIRoad *)instance; }
}; // namespace SQConvert
void SQAIRoadRegister(Squirrel *engine) {
DefSQClass <AIRoad> SQAIRoad("AIRoad");
SQAIRoad.PreRegister(engine);
SQAIRoad.AddConstructor(engine);
SQAIRoad.DefSQStaticMethod(engine, &AIRoad::GetClassName, "GetClassName", 1, "x");
SQAIRoad.DefSQMethod(engine, &AIRoad::IsRoadTile, "IsRoadTile", 2, "xi");
SQAIRoad.DefSQMethod(engine, &AIRoad::IsRoadDepotTile, "IsRoadDepotTile", 2, "xi");
SQAIRoad.DefSQMethod(engine, &AIRoad::IsRoadStationTile, "IsRoadStationTile", 2, "xi");
SQAIRoad.DefSQMethod(engine, &AIRoad::IsDriveThroughRoadStationTile, "IsDriveThroughRoadStationTile", 2, "xi");
SQAIRoad.DefSQMethod(engine, &AIRoad::AreRoadTilesConnected, "AreRoadTilesConnected", 3, "xii");
SQAIRoad.DefSQMethod(engine, &AIRoad::GetRoadDepotFrontTile, "GetRoadDepotFrontTile", 2, "xi");
SQAIRoad.DefSQMethod(engine, &AIRoad::GetRoadStationFrontTile, "GetRoadStationFrontTile", 2, "xi");
SQAIRoad.DefSQMethod(engine, &AIRoad::GetDriveThroughBackTile, "GetDriveThroughBackTile", 2, "xi");
SQAIRoad.DefSQMethod(engine, &AIRoad::BuildRoad, "BuildRoad", 3, "xii");
SQAIRoad.DefSQMethod(engine, &AIRoad::BuildRoadDepot, "BuildRoadDepot", 3, "xii");
SQAIRoad.DefSQMethod(engine, &AIRoad::BuildRoadStation, "BuildRoadStation", 5, "xiibb");
SQAIRoad.DefSQMethod(engine, &AIRoad::RemoveRoad, "RemoveRoad", 3, "xii");
SQAIRoad.DefSQMethod(engine, &AIRoad::RemoveRoadDepot, "RemoveRoadDepot", 2, "xi");
SQAIRoad.DefSQMethod(engine, &AIRoad::RemoveRoadStation, "RemoveRoadStation", 2, "xi");
SQAIRoad.PostRegister(engine);
}
#endif /* DEFINE_SQUIRREL_CLASS */
#endif /* AI_ROAD_HPP */