(svn r12625) [NoAI] -Add: support for GetLastError in AIRoad. Patch by Morloth. noai
authorrubidium
Tue, 08 Apr 2008 07:24:23 +0000
branchnoai
changeset 10094 e737405b06dd
parent 10093 b3849a19d137
child 10095 7483ad241067
(svn r12625) [NoAI] -Add: support for GetLastError in AIRoad. Patch by Morloth.
src/ai/api/ai_error.hpp
src/ai/api/ai_error.hpp.sq
src/ai/api/ai_marine.cpp
src/ai/api/ai_marine.hpp
src/ai/api/ai_marine.hpp.sq
src/ai/api/ai_road.cpp
src/ai/api/ai_road.hpp
src/ai/api/ai_road.hpp.sq
src/ai/api/ai_station.hpp
src/ai/api/ai_station.hpp.sq
src/ai/api/ai_tile.hpp
src/ai/api/ai_tile.hpp.sq
--- a/src/ai/api/ai_error.hpp	Tue Apr 08 07:19:02 2008 +0000
+++ b/src/ai/api/ai_error.hpp	Tue Apr 08 07:24:23 2008 +0000
@@ -40,6 +40,7 @@
 		ERR_CAT_SIGN,     //!< Error messages related to building / removing signs.
 		ERR_CAT_ROAD,     //!< Error messages related to building / maintaining roads.
 		ERR_CAT_ORDER,    //!< Error messages related to managing orders.
+		ERR_CAT_MARINE,   //!< Error messages related to building / removing ships, docks and channels.
 
 		/**
 		 * DO NOT USE! The error bitsize determines how many errors can be stored in
@@ -89,7 +90,13 @@
 		ERR_LAND_SLOPED_WRONG,                        // [STR_1000_LAND_SLOPED_IN_WRONG_DIRECTION]
 
 		/** A vehicle is in the way */
-		ERR_VEHICLE_IN_THE_WAY,                  // [STR_8803_TRAIN_IN_THE_WAY, STR_9000_ROAD_VEHICLE_IN_THE_WAY, STR_980E_SHIP_IN_THE_WAY, STR_A015_AIRCRAFT_IN_THE_WAY]
+		ERR_VEHICLE_IN_THE_WAY,                       // [STR_8803_TRAIN_IN_THE_WAY, STR_9000_ROAD_VEHICLE_IN_THE_WAY, STR_980E_SHIP_IN_THE_WAY, STR_A015_AIRCRAFT_IN_THE_WAY]
+
+		/** Site is unsuitable */
+		ERR_SITE_UNSUITABLE,                          // [STR_0239_SITE_UNSUITABLE, STR_304B_SITE_UNSUITABLE]
+
+		/** Too close to the edge of the map */
+		ERR_TOO_CLOSE_TO_EDGE,                        // [STR_0002_TOO_CLOSE_TO_EDGE_OF_MAP]
 	};
 
 	/**
--- a/src/ai/api/ai_error.hpp.sq	Tue Apr 08 07:19:02 2008 +0000
+++ b/src/ai/api/ai_error.hpp.sq	Tue Apr 08 07:24:23 2008 +0000
@@ -30,6 +30,7 @@
 	SQAIError.DefSQConst(engine, AIError::ERR_CAT_SIGN,                 "ERR_CAT_SIGN");
 	SQAIError.DefSQConst(engine, AIError::ERR_CAT_ROAD,                 "ERR_CAT_ROAD");
 	SQAIError.DefSQConst(engine, AIError::ERR_CAT_ORDER,                "ERR_CAT_ORDER");
+	SQAIError.DefSQConst(engine, AIError::ERR_CAT_MARINE,               "ERR_CAT_MARINE");
 	SQAIError.DefSQConst(engine, AIError::ERR_CAT_BIT_SIZE,             "ERR_CAT_BIT_SIZE");
 	SQAIError.DefSQConst(engine, AIError::ERR_NONE,                     "ERR_NONE");
 	SQAIError.DefSQConst(engine, AIError::ERR_UNKNOWN,                  "ERR_UNKNOWN");
@@ -45,6 +46,8 @@
 	SQAIError.DefSQConst(engine, AIError::ERR_FLAT_LAND_REQUIRED,       "ERR_FLAT_LAND_REQUIRED");
 	SQAIError.DefSQConst(engine, AIError::ERR_LAND_SLOPED_WRONG,        "ERR_LAND_SLOPED_WRONG");
 	SQAIError.DefSQConst(engine, AIError::ERR_VEHICLE_IN_THE_WAY,       "ERR_VEHICLE_IN_THE_WAY");
+	SQAIError.DefSQConst(engine, AIError::ERR_SITE_UNSUITABLE,          "ERR_SITE_UNSUITABLE");
+	SQAIError.DefSQConst(engine, AIError::ERR_TOO_CLOSE_TO_EDGE,        "ERR_TOO_CLOSE_TO_EDGE");
 
 	AIError::RegisterErrorMap(STR_0003_NOT_ENOUGH_CASH_REQUIRES,        AIError::ERR_NOT_ENOUGH_CASH);
 	AIError::RegisterErrorMap(STR_2009_LOCAL_AUTHORITY_REFUSES,         AIError::ERR_LOCAL_AUTHORITY_REFUSES);
@@ -77,6 +80,9 @@
 	AIError::RegisterErrorMap(STR_9000_ROAD_VEHICLE_IN_THE_WAY,         AIError::ERR_VEHICLE_IN_THE_WAY);
 	AIError::RegisterErrorMap(STR_980E_SHIP_IN_THE_WAY,                 AIError::ERR_VEHICLE_IN_THE_WAY);
 	AIError::RegisterErrorMap(STR_A015_AIRCRAFT_IN_THE_WAY,             AIError::ERR_VEHICLE_IN_THE_WAY);
+	AIError::RegisterErrorMap(STR_0239_SITE_UNSUITABLE,                 AIError::ERR_SITE_UNSUITABLE);
+	AIError::RegisterErrorMap(STR_304B_SITE_UNSUITABLE,                 AIError::ERR_SITE_UNSUITABLE);
+	AIError::RegisterErrorMap(STR_0002_TOO_CLOSE_TO_EDGE_OF_MAP,        AIError::ERR_TOO_CLOSE_TO_EDGE);
 
 	AIError::RegisterErrorMapString(AIError::ERR_NONE,                     "ERR_NONE");
 	AIError::RegisterErrorMapString(AIError::ERR_UNKNOWN,                  "ERR_UNKNOWN");
@@ -91,6 +97,8 @@
 	AIError::RegisterErrorMapString(AIError::ERR_FLAT_LAND_REQUIRED,       "ERR_FLAT_LAND_REQUIRED");
 	AIError::RegisterErrorMapString(AIError::ERR_LAND_SLOPED_WRONG,        "ERR_LAND_SLOPED_WRONG");
 	AIError::RegisterErrorMapString(AIError::ERR_VEHICLE_IN_THE_WAY,       "ERR_VEHICLE_IN_THE_WAY");
+	AIError::RegisterErrorMapString(AIError::ERR_SITE_UNSUITABLE,          "ERR_SITE_UNSUITABLE");
+	AIError::RegisterErrorMapString(AIError::ERR_TOO_CLOSE_TO_EDGE,        "ERR_TOO_CLOSE_TO_EDGE");
 
 	SQAIError.DefSQStaticMethod(engine, &AIError::GetClassName,           "GetClassName",           1, "x");
 	SQAIError.DefSQStaticMethod(engine, &AIError::GetErrorCategory,       "GetErrorCategory",       1, "x");
--- a/src/ai/api/ai_marine.cpp	Tue Apr 08 07:19:02 2008 +0000
+++ b/src/ai/api/ai_marine.cpp	Tue Apr 08 07:24:23 2008 +0000
@@ -46,75 +46,75 @@
 
 /* static */ bool AIMarine::BuildWaterDepot(TileIndex tile, bool vertical)
 {
-	if (!::IsValidTile(tile)) return false;
+	EnforcePrecondition(false, ::IsValidTile(tile));
 
 	return AIObject::DoCommand(tile, vertical, 0, CMD_BUILD_SHIP_DEPOT, false);
 }
 
 /* static */ bool AIMarine::BuildDock(TileIndex tile)
 {
-	if (!::IsValidTile(tile)) return false;
+	EnforcePrecondition(false, ::IsValidTile(tile));
 
 	return AIObject::DoCommand(tile, 1, 0, CMD_BUILD_DOCK, false);
 }
 
 /* static */ bool AIMarine::BuildBuoy(TileIndex tile)
 {
-	if (!::IsValidTile(tile)) return false;
+	EnforcePrecondition(false, ::IsValidTile(tile));
 
 	return AIObject::DoCommand(tile, 0, 0, CMD_BUILD_BUOY, false);
 }
 
 /* static */ bool AIMarine::BuildLock(TileIndex tile)
 {
-	if (!::IsValidTile(tile)) return false;
+	EnforcePrecondition(false, ::IsValidTile(tile));
 
 	return AIObject::DoCommand(tile, 0, 0, CMD_BUILD_LOCK, false);
 }
 
 /* static */ bool AIMarine::BuildCanal(TileIndex tile)
 {
-	if (!::IsValidTile(tile)) return false;
+	EnforcePrecondition(false, ::IsValidTile(tile));
 
 	return AIObject::DoCommand(tile, tile, 0, CMD_BUILD_CANAL, false);
 }
 
 /* static */ bool AIMarine::RemoveWaterDepot(TileIndex tile)
 {
-	if (!::IsValidTile(tile)) return false;
-	if (!IsWaterDepotTile(tile)) return false;
+	EnforcePrecondition(false, ::IsValidTile(tile));
+	EnforcePrecondition(false, IsWaterDepotTile(tile));
 
 	return AIObject::DoCommand(tile, 0, 0, CMD_LANDSCAPE_CLEAR, false);
 }
 
 /* static */ bool AIMarine::RemoveDock(TileIndex tile)
 {
-	if (!::IsValidTile(tile)) return false;
-	if (!IsDockTile(tile)) return false;
+	EnforcePrecondition(false, ::IsValidTile(tile));
+	EnforcePrecondition(false, IsDockTile(tile));
 
 	return AIObject::DoCommand(tile, 0, 0, CMD_LANDSCAPE_CLEAR, false);
 }
 
 /* static */ bool AIMarine::RemoveBuoy(TileIndex tile)
 {
-	if (!::IsValidTile(tile)) return false;
-	if (!IsBuoyTile(tile)) return false;
+	EnforcePrecondition(false, ::IsValidTile(tile));
+	EnforcePrecondition(false, IsBuoyTile(tile));
 
 	return AIObject::DoCommand(tile, 0, 0, CMD_LANDSCAPE_CLEAR, false);
 }
 
 /* static */ bool AIMarine::RemoveLock(TileIndex tile)
 {
-	if (!::IsValidTile(tile)) return false;
-	if (!IsLockTile(tile)) return false;
+	EnforcePrecondition(false, ::IsValidTile(tile));
+	EnforcePrecondition(false, IsLockTile(tile));
 
 	return AIObject::DoCommand(tile, 0, 0, CMD_LANDSCAPE_CLEAR, false);
 }
 
 /* static */ bool AIMarine::RemoveCanal(TileIndex tile)
 {
-	if (!::IsValidTile(tile)) return false;
-	if (!IsCanalTile(tile)) return false;
+	EnforcePrecondition(false, ::IsValidTile(tile));
+	EnforcePrecondition(false, IsCanalTile(tile));
 
 	return AIObject::DoCommand(tile, 0, 0, CMD_LANDSCAPE_CLEAR, false);
 }
--- a/src/ai/api/ai_marine.hpp	Tue Apr 08 07:19:02 2008 +0000
+++ b/src/ai/api/ai_marine.hpp	Tue Apr 08 07:24:23 2008 +0000
@@ -6,6 +6,7 @@
 #define AI_MARINE_HPP
 
 #include "ai_object.hpp"
+#include "ai_error.hpp"
 
 /**
  * Class that handles all marine related functions.
@@ -14,6 +15,14 @@
 public:
 	static const char *GetClassName() { return "AIMarine"; }
 
+	enum ErrorMessages {
+		/** Base for marine related errors */
+		ERR_MARINE_BASE = AIError::ERR_CAT_MARINE << AIError::ERR_CAT_BIT_SIZE,
+
+		/** Infrastructure must be built on water */
+		ERR_MARINE_MUST_BE_BUILT_ON_WATER,                  // [STR_3801_MUST_BE_BUILT_ON_WATER]
+	};
+
 	/**
 	 * Checks whether the given tile is actually a tile with a water depot.
 	 * @param tile The tile to check.
@@ -59,6 +68,9 @@
 	 * @param tile The tile where the water depot will be build.
 	 * @param vertical If true, depot will be vertical, else horizontal.
 	 * @pre AIMap::IsValidTile(tile).
+	 * @exception AIError::ERR_AREA_NOT_CLEAR
+	 * @exception AIError::ERR_SITE_UNSUITABLE
+	 * @exception AIMarine::ERR_MARINE_MUST_BE_BUILT_ON_WATER
 	 * @return Whether the water depot has been/can be build or not.
 	 */
 	static bool BuildWaterDepot(TileIndex tile, bool vertical);
@@ -67,6 +79,10 @@
 	 * Builds a dock where tile is the tile still on land.
 	 * @param tile The tile still on land of the dock.
 	 * @pre AIMap::IsValidTile(tile).
+	 * @exception AIError::ERR_AREA_NOT_CLEAR
+	 * @exception AIError::ERR_SITE_UNSUITABLE
+	 * @exception AIStation::ERR_STATION_TOO_CLOSE_TO_ANOTHER_STATION
+	 * @exception AIStation::ERR_STATION_TOO_MANY_STATIONS
 	 * @return Whether the dock has been/can be build or not.
 	 */
 	static bool BuildDock(TileIndex tile);
@@ -75,6 +91,9 @@
 	 * Builds a buoy on tile.
 	 * @param tile The tile where the buoy will be build.
 	 * @pre AIMap::IsValidTile(tile).
+	 * @exception AIError::ERR_AREA_NOT_CLEAR
+	 * @exception AIError::ERR_SITE_UNSUITABLE
+	 * @exception AIStation::ERR_STATION_TOO_MANY_STATIONS
 	 * @return Whether the buoy has been/can be build or not.
 	 */
 	static bool BuildBuoy(TileIndex tile);
@@ -83,6 +102,8 @@
 	 * Builds a lock on tile.
 	 * @param tile The tile where the lock will be build.
 	 * @pre AIMap::IsValidTile(tile).
+	 * @exception AIError::ERR_LAND_SLOPED_WRONG
+	 * @exception AIError::ERR_SITE_UNSUITABLE
 	 * @return Whether the lock has been/can be build or not.
 	 */
 	static bool BuildLock(TileIndex tile);
@@ -91,6 +112,10 @@
 	 * Builds a canal on tile.
 	 * @param tile The tile where the canal will be build.
 	 * @pre AIMap::IsValidTile(tile).
+	 * @exception AIError::ERR_AREA_NOT_CLEAR
+	 * @exception AIError::ERR_LAND_SLOPED_WRONG
+	 * @exception AIError::ERR_OWNED_BY_ANOTHER_COMPANY
+	 * @exception AIError::ERR_ALREADY_BUILT
 	 * @return Whether the canal has been/can be build or not.
 	 */
 	static bool BuildCanal(TileIndex tile);
@@ -99,6 +124,7 @@
 	 * Removes a water depot.
 	 * @param tile Any tile of the water depot.
 	 * @pre AIMap::IsValidTile(tile).
+	 * @exception AIError::ERR_OWNED_BY_ANOTHER_COMPANY
 	 * @return Whether the water depot has been/can be removed or not.
 	 */
 	static bool RemoveWaterDepot(TileIndex tile);
@@ -107,6 +133,7 @@
 	 * Removes a dock.
 	 * @param tile Any tile of the dock.
 	 * @pre AIMap::IsValidTile(tile).
+	 * @exception AIError::ERR_OWNED_BY_ANOTHER_COMPANY
 	 * @return Whether the dock has been/can be removed or not.
 	 */
 	static bool RemoveDock(TileIndex tile);
@@ -115,6 +142,7 @@
 	 * Removes a buoy.
 	 * @param tile Any tile of the buoy.
 	 * @pre AIMap::IsValidTile(tile).
+	 * @exception AIError::ERR_OWNED_BY_ANOTHER_COMPANY
 	 * @return Whether the buoy has been/can be removed or not.
 	 */
 	static bool RemoveBuoy(TileIndex tile);
@@ -123,6 +151,7 @@
 	 * Removes a lock.
 	 * @param tile Any tile of the lock.
 	 * @pre AIMap::IsValidTile(tile).
+	 * @exception AIError::ERR_OWNED_BY_ANOTHER_COMPANY
 	 * @return Whether the lock has been/can be removed or not.
 	 */
 	static bool RemoveLock(TileIndex tile);
@@ -131,6 +160,7 @@
 	 * Removes a canal.
 	 * @param tile Any tile of the canal.
 	 * @pre AIMap::IsValidTile(tile).
+	 * @exception AIError::ERR_OWNED_BY_ANOTHER_COMPANY
 	 * @return Whether the canal has been/can be removed or not.
 	 */
 	static bool RemoveCanal(TileIndex tile);
--- a/src/ai/api/ai_marine.hpp.sq	Tue Apr 08 07:19:02 2008 +0000
+++ b/src/ai/api/ai_marine.hpp.sq	Tue Apr 08 07:24:23 2008 +0000
@@ -1,6 +1,10 @@
 #include "ai_marine.hpp"
 
 namespace SQConvert {
+	/* Allow enums to be used as Squirrel parameters */
+	template <> AIMarine::ErrorMessages GetParam(ForceType<AIMarine::ErrorMessages>, HSQUIRRELVM vm, int index) { SQInteger tmp; sq_getinteger(vm, index, &tmp); return (AIMarine::ErrorMessages)tmp; }
+	template <> int Return<AIMarine::ErrorMessages>(HSQUIRRELVM vm, AIMarine::ErrorMessages res) { sq_pushinteger(vm, (int32)res); return 1; }
+
 	/* Allow AIMarine to be used as Squirrel parameter */
 	template <> AIMarine *GetParam(ForceType<AIMarine *>, HSQUIRRELVM vm, int index) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return  (AIMarine *)instance; }
 	template <> AIMarine &GetParam(ForceType<AIMarine &>, HSQUIRRELVM vm, int index) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return *(AIMarine *)instance; }
@@ -14,6 +18,13 @@
 	SQAIMarine.PreRegister(engine);
 	SQAIMarine.AddConstructor<void (AIMarine::*)(), 1>(engine, "x");
 
+	SQAIMarine.DefSQConst(engine, AIMarine::ERR_MARINE_BASE,                   "ERR_MARINE_BASE");
+	SQAIMarine.DefSQConst(engine, AIMarine::ERR_MARINE_MUST_BE_BUILT_ON_WATER, "ERR_MARINE_MUST_BE_BUILT_ON_WATER");
+
+	AIError::RegisterErrorMap(STR_3801_MUST_BE_BUILT_ON_WATER, AIMarine::ERR_MARINE_MUST_BE_BUILT_ON_WATER);
+
+	AIError::RegisterErrorMapString(AIMarine::ERR_MARINE_MUST_BE_BUILT_ON_WATER, "ERR_MARINE_MUST_BE_BUILT_ON_WATER");
+
 	SQAIMarine.DefSQStaticMethod(engine, &AIMarine::GetClassName,     "GetClassName",     1, "x");
 	SQAIMarine.DefSQStaticMethod(engine, &AIMarine::IsWaterDepotTile, "IsWaterDepotTile", 2, "xi");
 	SQAIMarine.DefSQStaticMethod(engine, &AIMarine::IsDockTile,       "IsDockTile",       2, "xi");
--- a/src/ai/api/ai_road.cpp	Tue Apr 08 07:19:02 2008 +0000
+++ b/src/ai/api/ai_road.cpp	Tue Apr 08 07:24:23 2008 +0000
@@ -155,7 +155,8 @@
 /* static */ bool AIRoad::RemoveRoadDepot(TileIndex tile)
 {
 	EnforcePrecondition(false, ::IsValidTile(tile));
-	EnforcePrecondition(false, IsTileType(tile, MP_ROAD) && GetRoadTileType(tile) == ROAD_TILE_DEPOT);
+	EnforcePrecondition(false, IsTileType(tile, MP_ROAD))
+	EnforcePrecondition(false, GetRoadTileType(tile) == ROAD_TILE_DEPOT);
 
 	return AIObject::DoCommand(tile, 0, 0, CMD_LANDSCAPE_CLEAR);
 }
@@ -163,7 +164,8 @@
 /* static */ bool AIRoad::RemoveRoadStation(TileIndex tile)
 {
 	EnforcePrecondition(false, ::IsValidTile(tile));
-	EnforcePrecondition(false, IsTileType(tile, MP_STATION) && IsRoadStop(tile));
+	EnforcePrecondition(false, IsTileType(tile, MP_STATION));
+	EnforcePrecondition(false, IsRoadStop(tile));
 
 	return AIObject::DoCommand(tile, 0, GetRoadStopType(tile), CMD_REMOVE_ROAD_STOP);
 }
--- a/src/ai/api/ai_road.hpp	Tue Apr 08 07:19:02 2008 +0000
+++ b/src/ai/api/ai_road.hpp	Tue Apr 08 07:24:23 2008 +0000
@@ -28,14 +28,6 @@
 		/** Drive through roads can't be build on town owned roads */
 		ERR_ROAD_CANNOT_BUILD_ON_TOWN_ROAD,           // [STR_DRIVE_THROUGH_ERROR_ON_TOWN_ROAD]
 
-		/** There are too many stations in the game */
-		ERR_ROAD_TOO_MANY_STATIONS,                   // [STR_3008_TOO_MANY_STATIONS_LOADING, STR_TOO_MANY_TRUCK_STOPS, STR_TOO_MANY_BUS_STOPS]
-
-		/** There are too many stations in a town */
-		ERR_ROAD_TOO_MANY_STATIONS_IN_TOWN,           // [STR_3007_TOO_MANY_STATIONS_LOADING]
-
-		/** The station is too close to another station */
-		ERR_ROAD_TOO_CLOSE_TO_ANOTHER_STATION,        // [STR_3009_TOO_CLOSE_TO_ANOTHER_STATION]
 
 		/** One way roads can't have junctions */
 		ERR_ROAD_ONE_WAY_ROADS_CANNOT_HAVE_JUNCTIONS, // [STR_ERR_ONEWAY_ROADS_CAN_T_HAVE_JUNCTION]
@@ -138,7 +130,7 @@
 	 * @exception AIError::ERR_AREA_NOT_CLEAR
 	 * @exception AIRoad::ERR_ROAD_ONE_WAY_ROADS_CANNOT_HAVE_JUNCTIONS
 	 * @exception AIRoad::ERR_ROAD_WORKS_IN_PROGRESS
-	 * @exception AIRoad::ERR_VEHICLE_IN_THE_WAY
+	 * @exception AIError::ERR_VEHICLE_IN_THE_WAY
 	 * @return Whether the road has been/can be build or not.
 	 */
 	static bool BuildRoad(TileIndex start, TileIndex end);
@@ -159,7 +151,7 @@
 	 * @exception AIError::ERR_AREA_NOT_CLEAR
 	 * @exception AIRoad::ERR_ROAD_ONE_WAY_ROADS_CANNOT_HAVE_JUNCTIONS
 	 * @exception AIRoad::ERR_ROAD_WORKS_IN_PROGRESS
-	 * @exception AIRoad::ERR_VEHICLE_IN_THE_WAY
+	 * @exception AIError::ERR_VEHICLE_IN_THE_WAY
 	 * @return Whether the road has been/can be build or not.
 	 */
 	static bool BuildRoadFull(TileIndex start, TileIndex end);
@@ -192,10 +184,10 @@
 	 * @exception AIError::ERR_FLAT_LAND_REQUIRED
 	 * @exception AIRoad::ERR_ROAD_DRIVE_THROUGH_WRONG_DIRECTION
 	 * @exception AIRoad::ERR_ROAD_CANNOT_BUILD_ON_TOWN_ROAD
-	 * @exception AIRoad::ERR_VEHICLE_IN_THE_WAY
-	 * @exception AIRoad::ERR_ROAD_TOO_CLOSE_TO_ANOTHER_STATION
-	 * @exception AIRoad::ERR_ROAD_TOO_MANY_STATIONS
-	 * @exception AIRoad::ERR_ROAD_TOO_MANY_STATIONS_IN_TOWN
+	 * @exception AIError:ERR_VEHICLE_IN_THE_WAY
+	 * @exception AIStation::ERR_STATION_TOO_CLOSE_TO_ANOTHER_STATION
+	 * @exception AIStation::ERR_STATION_TOO_MANY_STATIONS
+	 * @exception AIStation::ERR_STATION_TOO_MANY_STATIONS_IN_TOWN
 	 * @return Whether the station has been/can be build or not.
 	 */
 	static bool BuildRoadStation(TileIndex tile, TileIndex front, bool truck, bool drive_through);
@@ -210,7 +202,7 @@
 	 *  AIMap::GetTileX(start) == AIMap::GetTileX(end) or
 	 *  AIMap::GetTileY(start) == AIMap::GetTileY(end).
 	 * @exception AIError::ERR_OWNED_BY_ANOTHER_COMPANY
-	 * @exception AIRoad::ERR_VEHICLE_IN_THE_WAY
+	 * @exception AIError::ERR_VEHICLE_IN_THE_WAY
 	 * @exception AIRoad::ERR_ROAD_WORKS_IN_PROGRESS
 	 * @return Whether the road has been/can be removed or not.
 	 */
@@ -227,7 +219,7 @@
 	 *  AIMap::GetTileX(start) == AIMap::GetTileX(end) or
 	 *  AIMap::GetTileY(start) == AIMap::GetTileY(end).
 	 * @exception AIError::ERR_OWNED_BY_ANOTHER_COMPANY
-	 * @exception AIRoad::ERR_VEHICLE_IN_THE_WAY
+	 * @exception AIError::ERR_VEHICLE_IN_THE_WAY
 	 * @exception AIRoad::ERR_ROAD_WORKS_IN_PROGRESS
 	 * @return Whether the road has been/can be removed or not.
 	 */
@@ -239,7 +231,7 @@
 	 * @pre AIMap::IsValidTile(tile).
 	 * @pre Tile is a road depot.
 	 * @exception AIError::ERR_OWNED_BY_ANOTHER_COMPANY
-	 * @exception AIRoad::ERR_VEHICLE_IN_THE_WAY
+	 * @exception AIError::ERR_VEHICLE_IN_THE_WAY
 	 * @return Whether the road depot has been/can be removed or not.
 	 */
 	static bool RemoveRoadDepot(TileIndex tile);
@@ -250,7 +242,7 @@
 	 * @pre AIMap::IsValidTile(tile).
 	 * @pre Tile is a road station.
 	 * @exception AIError::ERR_OWNED_BY_ANOTHER_COMPANY
-	 * @exception AIRoad::ERR_VEHICLE_IN_THE_WAY
+	 * @exception AIError::ERR_VEHICLE_IN_THE_WAY
 	 * @return Whether the station has been/can be removed or not.
 	 */
 	static bool RemoveRoadStation(TileIndex tile);
--- a/src/ai/api/ai_road.hpp.sq	Tue Apr 08 07:19:02 2008 +0000
+++ b/src/ai/api/ai_road.hpp.sq	Tue Apr 08 07:24:23 2008 +0000
@@ -22,27 +22,16 @@
 	SQAIRoad.DefSQConst(engine, AIRoad::ERR_ROAD_WORKS_IN_PROGRESS,                   "ERR_ROAD_WORKS_IN_PROGRESS");
 	SQAIRoad.DefSQConst(engine, AIRoad::ERR_ROAD_DRIVE_THROUGH_WRONG_DIRECTION,       "ERR_ROAD_DRIVE_THROUGH_WRONG_DIRECTION");
 	SQAIRoad.DefSQConst(engine, AIRoad::ERR_ROAD_CANNOT_BUILD_ON_TOWN_ROAD,           "ERR_ROAD_CANNOT_BUILD_ON_TOWN_ROAD");
-	SQAIRoad.DefSQConst(engine, AIRoad::ERR_ROAD_TOO_MANY_STATIONS,                   "ERR_ROAD_TOO_MANY_STATIONS");
-	SQAIRoad.DefSQConst(engine, AIRoad::ERR_ROAD_TOO_MANY_STATIONS_IN_TOWN,           "ERR_ROAD_TOO_MANY_STATIONS_IN_TOWN");
-	SQAIRoad.DefSQConst(engine, AIRoad::ERR_ROAD_TOO_CLOSE_TO_ANOTHER_STATION,        "ERR_ROAD_TOO_CLOSE_TO_ANOTHER_STATION");
 	SQAIRoad.DefSQConst(engine, AIRoad::ERR_ROAD_ONE_WAY_ROADS_CANNOT_HAVE_JUNCTIONS, "ERR_ROAD_ONE_WAY_ROADS_CANNOT_HAVE_JUNCTIONS");
 
 	AIError::RegisterErrorMap(STR_ROAD_WORKS_IN_PROGRESS,               AIRoad::ERR_ROAD_WORKS_IN_PROGRESS);
 	AIError::RegisterErrorMap(STR_DRIVE_THROUGH_ERROR_DIRECTION,        AIRoad::ERR_ROAD_DRIVE_THROUGH_WRONG_DIRECTION);
 	AIError::RegisterErrorMap(STR_DRIVE_THROUGH_ERROR_ON_TOWN_ROAD,     AIRoad::ERR_ROAD_CANNOT_BUILD_ON_TOWN_ROAD);
-	AIError::RegisterErrorMap(STR_3008_TOO_MANY_STATIONS_LOADING,       AIRoad::ERR_ROAD_TOO_MANY_STATIONS);
-	AIError::RegisterErrorMap(STR_TOO_MANY_TRUCK_STOPS,                 AIRoad::ERR_ROAD_TOO_MANY_STATIONS);
-	AIError::RegisterErrorMap(STR_TOO_MANY_BUS_STOPS,                   AIRoad::ERR_ROAD_TOO_MANY_STATIONS);
-	AIError::RegisterErrorMap(STR_3007_TOO_MANY_STATIONS_LOADING,       AIRoad::ERR_ROAD_TOO_MANY_STATIONS_IN_TOWN);
-	AIError::RegisterErrorMap(STR_3009_TOO_CLOSE_TO_ANOTHER_STATION,    AIRoad::ERR_ROAD_TOO_CLOSE_TO_ANOTHER_STATION);
 	AIError::RegisterErrorMap(STR_ERR_ONEWAY_ROADS_CAN_T_HAVE_JUNCTION, AIRoad::ERR_ROAD_ONE_WAY_ROADS_CANNOT_HAVE_JUNCTIONS);
 
 	AIError::RegisterErrorMapString(AIRoad::ERR_ROAD_WORKS_IN_PROGRESS,                   "ERR_ROAD_WORKS_IN_PROGRESS");
 	AIError::RegisterErrorMapString(AIRoad::ERR_ROAD_DRIVE_THROUGH_WRONG_DIRECTION,       "ERR_ROAD_DRIVE_THROUGH_WRONG_DIRECTION");
 	AIError::RegisterErrorMapString(AIRoad::ERR_ROAD_CANNOT_BUILD_ON_TOWN_ROAD,           "ERR_ROAD_CANNOT_BUILD_ON_TOWN_ROAD");
-	AIError::RegisterErrorMapString(AIRoad::ERR_ROAD_TOO_MANY_STATIONS,                   "ERR_ROAD_TOO_MANY_STATIONS");
-	AIError::RegisterErrorMapString(AIRoad::ERR_ROAD_TOO_MANY_STATIONS_IN_TOWN,           "ERR_ROAD_TOO_MANY_STATIONS_IN_TOWN");
-	AIError::RegisterErrorMapString(AIRoad::ERR_ROAD_TOO_CLOSE_TO_ANOTHER_STATION,        "ERR_ROAD_TOO_CLOSE_TO_ANOTHER_STATION");
 	AIError::RegisterErrorMapString(AIRoad::ERR_ROAD_ONE_WAY_ROADS_CANNOT_HAVE_JUNCTIONS, "ERR_ROAD_ONE_WAY_ROADS_CANNOT_HAVE_JUNCTIONS");
 
 	SQAIRoad.DefSQStaticMethod(engine, &AIRoad::GetClassName,                  "GetClassName",                  1, "x");
--- a/src/ai/api/ai_station.hpp	Tue Apr 08 07:19:02 2008 +0000
+++ b/src/ai/api/ai_station.hpp	Tue Apr 08 07:24:23 2008 +0000
@@ -24,10 +24,16 @@
 		ERR_STATION_BASE = AIError::ERR_CAT_STATION << AIError::ERR_CAT_BIT_SIZE,
 
 		/** The station size exceeds the station spread */
-		ERR_STATION_TOO_LARGE,                  // [STR_306C_STATION_TOO_SPREAD_OUT]
+		ERR_STATION_TOO_LARGE,                    // [STR_306C_STATION_TOO_SPREAD_OUT]
 
-		/** The station is build too close to another station */
-		ERR_STATION_TOO_CLOSE_TO_OTHER_STATION, // [STR_300D_TOO_CLOSE_TO_ANOTHER_AIRPORT, STR_3009_TOO_CLOSE_TO_ANOTHER_STATION]
+		/** The station is build too close to another station, airport or dock */
+		ERR_STATION_TOO_CLOSE_TO_ANOTHER_STATION, // [STR_300D_TOO_CLOSE_TO_ANOTHER_AIRPORT, STR_3009_TOO_CLOSE_TO_ANOTHER_STATION, STR_304C_TOO_CLOSE_TO_ANOTHER_DOCK]
+
+		/** There are too many stations, airports and docks in the game */
+		ERR_STATION_TOO_MANY_STATIONS,            // [STR_3008_TOO_MANY_STATIONS_LOADING, STR_TOO_MANY_TRUCK_STOPS, STR_TOO_MANY_BUS_STOPS]
+
+		/** There are too many stations, airports of docks in a town */
+		ERR_STATION_TOO_MANY_STATIONS_IN_TOWN,    // [STR_3007_TOO_MANY_STATIONS_LOADING]
 	};
 
 	/**
--- a/src/ai/api/ai_station.hpp.sq	Tue Apr 08 07:19:02 2008 +0000
+++ b/src/ai/api/ai_station.hpp.sq	Tue Apr 08 07:24:23 2008 +0000
@@ -20,22 +20,31 @@
 	SQAIStation.PreRegister(engine);
 	SQAIStation.AddConstructor<void (AIStation::*)(), 1>(engine, "x");
 
-	SQAIStation.DefSQConst(engine, AIStation::ERR_STATION_BASE,                       "ERR_STATION_BASE");
-	SQAIStation.DefSQConst(engine, AIStation::ERR_STATION_TOO_LARGE,                  "ERR_STATION_TOO_LARGE");
-	SQAIStation.DefSQConst(engine, AIStation::ERR_STATION_TOO_CLOSE_TO_OTHER_STATION, "ERR_STATION_TOO_CLOSE_TO_OTHER_STATION");
-	SQAIStation.DefSQConst(engine, AIStation::STATION_ANY,                            "STATION_ANY");
-	SQAIStation.DefSQConst(engine, AIStation::STATION_TRAIN,                          "STATION_TRAIN");
-	SQAIStation.DefSQConst(engine, AIStation::STATION_TRUCK_STOP,                     "STATION_TRUCK_STOP");
-	SQAIStation.DefSQConst(engine, AIStation::STATION_BUS_STOP,                       "STATION_BUS_STOP");
-	SQAIStation.DefSQConst(engine, AIStation::STATION_AIRPORT,                        "STATION_AIRPORT");
-	SQAIStation.DefSQConst(engine, AIStation::STATION_DOCK,                           "STATION_DOCK");
+	SQAIStation.DefSQConst(engine, AIStation::ERR_STATION_BASE,                         "ERR_STATION_BASE");
+	SQAIStation.DefSQConst(engine, AIStation::ERR_STATION_TOO_LARGE,                    "ERR_STATION_TOO_LARGE");
+	SQAIStation.DefSQConst(engine, AIStation::ERR_STATION_TOO_CLOSE_TO_ANOTHER_STATION, "ERR_STATION_TOO_CLOSE_TO_ANOTHER_STATION");
+	SQAIStation.DefSQConst(engine, AIStation::ERR_STATION_TOO_MANY_STATIONS,            "ERR_STATION_TOO_MANY_STATIONS");
+	SQAIStation.DefSQConst(engine, AIStation::ERR_STATION_TOO_MANY_STATIONS_IN_TOWN,    "ERR_STATION_TOO_MANY_STATIONS_IN_TOWN");
+	SQAIStation.DefSQConst(engine, AIStation::STATION_ANY,                              "STATION_ANY");
+	SQAIStation.DefSQConst(engine, AIStation::STATION_TRAIN,                            "STATION_TRAIN");
+	SQAIStation.DefSQConst(engine, AIStation::STATION_TRUCK_STOP,                       "STATION_TRUCK_STOP");
+	SQAIStation.DefSQConst(engine, AIStation::STATION_BUS_STOP,                         "STATION_BUS_STOP");
+	SQAIStation.DefSQConst(engine, AIStation::STATION_AIRPORT,                          "STATION_AIRPORT");
+	SQAIStation.DefSQConst(engine, AIStation::STATION_DOCK,                             "STATION_DOCK");
 
 	AIError::RegisterErrorMap(STR_306C_STATION_TOO_SPREAD_OUT,       AIStation::ERR_STATION_TOO_LARGE);
-	AIError::RegisterErrorMap(STR_300D_TOO_CLOSE_TO_ANOTHER_AIRPORT, AIStation::ERR_STATION_TOO_CLOSE_TO_OTHER_STATION);
-	AIError::RegisterErrorMap(STR_3009_TOO_CLOSE_TO_ANOTHER_STATION, AIStation::ERR_STATION_TOO_CLOSE_TO_OTHER_STATION);
+	AIError::RegisterErrorMap(STR_300D_TOO_CLOSE_TO_ANOTHER_AIRPORT, AIStation::ERR_STATION_TOO_CLOSE_TO_ANOTHER_STATION);
+	AIError::RegisterErrorMap(STR_3009_TOO_CLOSE_TO_ANOTHER_STATION, AIStation::ERR_STATION_TOO_CLOSE_TO_ANOTHER_STATION);
+	AIError::RegisterErrorMap(STR_304C_TOO_CLOSE_TO_ANOTHER_DOCK,    AIStation::ERR_STATION_TOO_CLOSE_TO_ANOTHER_STATION);
+	AIError::RegisterErrorMap(STR_3008_TOO_MANY_STATIONS_LOADING,    AIStation::ERR_STATION_TOO_MANY_STATIONS);
+	AIError::RegisterErrorMap(STR_TOO_MANY_TRUCK_STOPS,              AIStation::ERR_STATION_TOO_MANY_STATIONS);
+	AIError::RegisterErrorMap(STR_TOO_MANY_BUS_STOPS,                AIStation::ERR_STATION_TOO_MANY_STATIONS);
+	AIError::RegisterErrorMap(STR_3007_TOO_MANY_STATIONS_LOADING,    AIStation::ERR_STATION_TOO_MANY_STATIONS_IN_TOWN);
 
-	AIError::RegisterErrorMapString(AIStation::ERR_STATION_TOO_LARGE,                  "ERR_STATION_TOO_LARGE");
-	AIError::RegisterErrorMapString(AIStation::ERR_STATION_TOO_CLOSE_TO_OTHER_STATION, "ERR_STATION_TOO_CLOSE_TO_OTHER_STATION");
+	AIError::RegisterErrorMapString(AIStation::ERR_STATION_TOO_LARGE,                    "ERR_STATION_TOO_LARGE");
+	AIError::RegisterErrorMapString(AIStation::ERR_STATION_TOO_CLOSE_TO_ANOTHER_STATION, "ERR_STATION_TOO_CLOSE_TO_ANOTHER_STATION");
+	AIError::RegisterErrorMapString(AIStation::ERR_STATION_TOO_MANY_STATIONS,            "ERR_STATION_TOO_MANY_STATIONS");
+	AIError::RegisterErrorMapString(AIStation::ERR_STATION_TOO_MANY_STATIONS_IN_TOWN,    "ERR_STATION_TOO_MANY_STATIONS_IN_TOWN");
 
 	SQAIStation.DefSQStaticMethod(engine, &AIStation::GetClassName,               "GetClassName",               1, "x");
 	SQAIStation.DefSQStaticMethod(engine, &AIStation::IsValidStation,             "IsValidStation",             2, "xi");
--- a/src/ai/api/ai_tile.hpp	Tue Apr 08 07:19:02 2008 +0000
+++ b/src/ai/api/ai_tile.hpp	Tue Apr 08 07:24:23 2008 +0000
@@ -24,13 +24,10 @@
 		ERR_TILE_BASE = AIError::ERR_CAT_TILE << AIError::ERR_CAT_BIT_SIZE,
 
 		/** Tile can't be raised any higher */
-		ERR_TILE_TOO_HIGH,                     //< [STR_1003_ALREADY_AT_SEA_LEVEL]
+		ERR_TILE_TOO_HIGH,                     // [STR_1003_ALREADY_AT_SEA_LEVEL]
 
 		/** Tile can't be lowered any lower */
-		ERR_TILE_TOO_LOW,                      //< [STR_1003_ALREADY_AT_SEA_LEVEL]
-
-		/** Tile can't be raised or lowered because it is to close to the map */
-		ERR_TILE_TOO_CLOSE_TO_EDGE,            //< [STR_0002_TOO_CLOSE_TO_EDGE_OF_MAP]
+		ERR_TILE_TOO_LOW,                      // [STR_1003_ALREADY_AT_SEA_LEVEL]
 	};
 
 	/**
@@ -161,9 +158,9 @@
 	 * @param tile The tile to raise.
 	 * @param slope Corners to raise (SLOPE_xxx).
 	 * @pre AIMap::IsValidTile(tile).
-	 * @exception AIERROR::ERR_AREA_NOT_CLEAR
-	 * @exception AITILE::ERR_TILE_TOO_HIGH
-	 * @exception AITILE::ERR_TILE_CLOSE_TO_EDGE
+	 * @exception AIError::ERR_AREA_NOT_CLEAR
+	 * @exception AIError::ERR_TOO_CLOSE_TO_EDGE
+	 * @exception AITile::ERR_TILE_TOO_HIGH
 	 * @return 0 means failed, 1 means success.
 	 */
 	static bool RaiseTile(TileIndex tile, int32 slope);
@@ -174,9 +171,9 @@
 	 * @param tile The tile to lower.
 	 * @param slope Corners to lower (SLOPE_xxx).
 	 * @pre AIMap::IsValidTile(tile).
-	 * @exception AIERROR::ERR_AREA_NOT_CLEAR
-	 * @exception AITILE::ERR_TILE_TOO_LOW
-	 * @exception AITILE::ERR_TILE_CLOSE_TO_EDGE
+	 * @exception AIError::ERR_AREA_NOT_CLEAR
+	 * @exception AIError::ERR_TOO_CLOSE_TO_EDGE
+	 * @exception AITile::ERR_TILE_TOO_LOW
 	 * @return 0 means failed, 1 means success.
 	 */
 	static bool LowerTile(TileIndex tile, int32 slope);
@@ -185,7 +182,7 @@
 	 * Destroy everything on the given tile.
 	 * @param tile The tile to demolish.
 	 * @pre AIMap::IsValidTile(tile).
-	 * @exception AIERROR::ERR_AREA_NOT_CLEAR
+	 * @exception AIError::ERR_AREA_NOT_CLEAR
 	 * @return True if and only if the tile was demolished.
 	 */
 	static bool DemolishTile(TileIndex tile);
--- a/src/ai/api/ai_tile.hpp.sq	Tue Apr 08 07:19:02 2008 +0000
+++ b/src/ai/api/ai_tile.hpp.sq	Tue Apr 08 07:24:23 2008 +0000
@@ -20,39 +20,36 @@
 	SQAITile.PreRegister(engine);
 	SQAITile.AddConstructor<void (AITile::*)(), 1>(engine, "x");
 
-	SQAITile.DefSQConst(engine, AITile::ERR_TILE_BASE,              "ERR_TILE_BASE");
-	SQAITile.DefSQConst(engine, AITile::ERR_TILE_TOO_HIGH,          "ERR_TILE_TOO_HIGH");
-	SQAITile.DefSQConst(engine, AITile::ERR_TILE_TOO_LOW,           "ERR_TILE_TOO_LOW");
-	SQAITile.DefSQConst(engine, AITile::ERR_TILE_TOO_CLOSE_TO_EDGE, "ERR_TILE_TOO_CLOSE_TO_EDGE");
-	SQAITile.DefSQConst(engine, AITile::SLOPE_FLAT,                 "SLOPE_FLAT");
-	SQAITile.DefSQConst(engine, AITile::SLOPE_W,                    "SLOPE_W");
-	SQAITile.DefSQConst(engine, AITile::SLOPE_S,                    "SLOPE_S");
-	SQAITile.DefSQConst(engine, AITile::SLOPE_E,                    "SLOPE_E");
-	SQAITile.DefSQConst(engine, AITile::SLOPE_N,                    "SLOPE_N");
-	SQAITile.DefSQConst(engine, AITile::SLOPE_STEEP,                "SLOPE_STEEP");
-	SQAITile.DefSQConst(engine, AITile::SLOPE_NW,                   "SLOPE_NW");
-	SQAITile.DefSQConst(engine, AITile::SLOPE_SW,                   "SLOPE_SW");
-	SQAITile.DefSQConst(engine, AITile::SLOPE_SE,                   "SLOPE_SE");
-	SQAITile.DefSQConst(engine, AITile::SLOPE_NE,                   "SLOPE_NE");
-	SQAITile.DefSQConst(engine, AITile::SLOPE_EW,                   "SLOPE_EW");
-	SQAITile.DefSQConst(engine, AITile::SLOPE_NS,                   "SLOPE_NS");
-	SQAITile.DefSQConst(engine, AITile::SLOPE_ELEVATED,             "SLOPE_ELEVATED");
-	SQAITile.DefSQConst(engine, AITile::SLOPE_NWS,                  "SLOPE_NWS");
-	SQAITile.DefSQConst(engine, AITile::SLOPE_WSE,                  "SLOPE_WSE");
-	SQAITile.DefSQConst(engine, AITile::SLOPE_SEN,                  "SLOPE_SEN");
-	SQAITile.DefSQConst(engine, AITile::SLOPE_ENW,                  "SLOPE_ENW");
-	SQAITile.DefSQConst(engine, AITile::SLOPE_STEEP_W,              "SLOPE_STEEP_W");
-	SQAITile.DefSQConst(engine, AITile::SLOPE_STEEP_S,              "SLOPE_STEEP_S");
-	SQAITile.DefSQConst(engine, AITile::SLOPE_STEEP_E,              "SLOPE_STEEP_E");
-	SQAITile.DefSQConst(engine, AITile::SLOPE_STEEP_N,              "SLOPE_STEEP_N");
+	SQAITile.DefSQConst(engine, AITile::ERR_TILE_BASE,     "ERR_TILE_BASE");
+	SQAITile.DefSQConst(engine, AITile::ERR_TILE_TOO_HIGH, "ERR_TILE_TOO_HIGH");
+	SQAITile.DefSQConst(engine, AITile::ERR_TILE_TOO_LOW,  "ERR_TILE_TOO_LOW");
+	SQAITile.DefSQConst(engine, AITile::SLOPE_FLAT,        "SLOPE_FLAT");
+	SQAITile.DefSQConst(engine, AITile::SLOPE_W,           "SLOPE_W");
+	SQAITile.DefSQConst(engine, AITile::SLOPE_S,           "SLOPE_S");
+	SQAITile.DefSQConst(engine, AITile::SLOPE_E,           "SLOPE_E");
+	SQAITile.DefSQConst(engine, AITile::SLOPE_N,           "SLOPE_N");
+	SQAITile.DefSQConst(engine, AITile::SLOPE_STEEP,       "SLOPE_STEEP");
+	SQAITile.DefSQConst(engine, AITile::SLOPE_NW,          "SLOPE_NW");
+	SQAITile.DefSQConst(engine, AITile::SLOPE_SW,          "SLOPE_SW");
+	SQAITile.DefSQConst(engine, AITile::SLOPE_SE,          "SLOPE_SE");
+	SQAITile.DefSQConst(engine, AITile::SLOPE_NE,          "SLOPE_NE");
+	SQAITile.DefSQConst(engine, AITile::SLOPE_EW,          "SLOPE_EW");
+	SQAITile.DefSQConst(engine, AITile::SLOPE_NS,          "SLOPE_NS");
+	SQAITile.DefSQConst(engine, AITile::SLOPE_ELEVATED,    "SLOPE_ELEVATED");
+	SQAITile.DefSQConst(engine, AITile::SLOPE_NWS,         "SLOPE_NWS");
+	SQAITile.DefSQConst(engine, AITile::SLOPE_WSE,         "SLOPE_WSE");
+	SQAITile.DefSQConst(engine, AITile::SLOPE_SEN,         "SLOPE_SEN");
+	SQAITile.DefSQConst(engine, AITile::SLOPE_ENW,         "SLOPE_ENW");
+	SQAITile.DefSQConst(engine, AITile::SLOPE_STEEP_W,     "SLOPE_STEEP_W");
+	SQAITile.DefSQConst(engine, AITile::SLOPE_STEEP_S,     "SLOPE_STEEP_S");
+	SQAITile.DefSQConst(engine, AITile::SLOPE_STEEP_E,     "SLOPE_STEEP_E");
+	SQAITile.DefSQConst(engine, AITile::SLOPE_STEEP_N,     "SLOPE_STEEP_N");
 
-	AIError::RegisterErrorMap(STR_1003_ALREADY_AT_SEA_LEVEL,     AITile::ERR_TILE_TOO_HIGH);
-	AIError::RegisterErrorMap(STR_1003_ALREADY_AT_SEA_LEVEL,     AITile::ERR_TILE_TOO_LOW);
-	AIError::RegisterErrorMap(STR_0002_TOO_CLOSE_TO_EDGE_OF_MAP, AITile::ERR_TILE_TOO_CLOSE_TO_EDGE);
+	AIError::RegisterErrorMap(STR_1003_ALREADY_AT_SEA_LEVEL, AITile::ERR_TILE_TOO_HIGH);
+	AIError::RegisterErrorMap(STR_1003_ALREADY_AT_SEA_LEVEL, AITile::ERR_TILE_TOO_LOW);
 
-	AIError::RegisterErrorMapString(AITile::ERR_TILE_TOO_HIGH,          "ERR_TILE_TOO_HIGH");
-	AIError::RegisterErrorMapString(AITile::ERR_TILE_TOO_LOW,           "ERR_TILE_TOO_LOW");
-	AIError::RegisterErrorMapString(AITile::ERR_TILE_TOO_CLOSE_TO_EDGE, "ERR_TILE_TOO_CLOSE_TO_EDGE");
+	AIError::RegisterErrorMapString(AITile::ERR_TILE_TOO_HIGH, "ERR_TILE_TOO_HIGH");
+	AIError::RegisterErrorMapString(AITile::ERR_TILE_TOO_LOW,  "ERR_TILE_TOO_LOW");
 
 	SQAITile.DefSQStaticMethod(engine, &AITile::GetClassName,               "GetClassName",               1, "x");
 	SQAITile.DefSQStaticMethod(engine, &AITile::IsBuildable,                "IsBuildable",                2, "xi");