(svn r12613) [NoAI] -Add: support for GetLastError in AITile. Patch by Morloth. noai
authorrubidium
Mon, 07 Apr 2008 18:37:23 +0000
branchnoai
changeset 10089 e351169bf3a5
parent 10088 922c6e6a8d3e
child 10090 d6a6cac2fb25
(svn r12613) [NoAI] -Add: support for GetLastError in AITile. Patch by Morloth.
src/ai/api/ai_error.hpp
src/ai/api/ai_error.hpp.sq
src/ai/api/ai_tile.cpp
src/ai/api/ai_tile.hpp
src/ai/api/ai_tile.hpp.sq
--- a/src/ai/api/ai_error.hpp	Mon Apr 07 18:32:42 2008 +0000
+++ b/src/ai/api/ai_error.hpp	Mon Apr 07 18:37:23 2008 +0000
@@ -36,6 +36,7 @@
 		ERR_CAT_STATION,  //!< Error messages related to building / maintaining stations.
 		ERR_CAT_BRIDGE,   //!< Error messages related to building / removing bridges.
 		ERR_CAT_TUNNEL,   //!< Error messages related to building / removing tunnels.
+		ERR_CAT_TILE,     //!< Error messages related to raising / lowering and demolishing tiles.
 
 		/**
 		 * DO NOT USE! The error bitsize determines how many errors can be stored in
@@ -70,7 +71,7 @@
 		ERR_ALREADY_BUILT,                            // [STR_1007_ALREADY_BUILT, STR_5007_MUST_DEMOLISH_BRIDGE_FIRST]
 
 		/** Area isn't clear, try to demolish the building on it */
-		ERR_AREA_NOT_CLEAR,                           // [STR_2004_BUILDING_MUST_BE_DEMOLISHED, STR_5007_MUST_DEMOLISH_BRIDGE_FIRST, STR_300B_MUST_DEMOLISH_RAILROAD, STR_300E_MUST_DEMOLISH_AIRPORT_FIRST, STR_MUST_DEMOLISH_CARGO_TRAM_STATION, STR_3047_MUST_DEMOLISH_TRUCK_STATION, STR_MUST_DEMOLISH_PASSENGER_TRAM_STATION, STR_3046_MUST_DEMOLISH_BUS_STATION, STR_306A_BUOY_IN_THE_WAY, STR_304D_MUST_DEMOLISH_DOCK_FIRST, STR_4800_IN_THE_WAY, STR_5804_COMPANY_HEADQUARTERS_IN, STR_5800_OBJECT_IN_THE_WAY, STR_1801_MUST_REMOVE_ROAD_FIRST, STR_1008_MUST_REMOVE_RAILROAD_TRACK, STR_5007_MUST_DEMOLISH_BRIDGE_FIRST, STR_5006_MUST_DEMOLISH_TUNNEL_FIRST]
+		ERR_AREA_NOT_CLEAR,                           // [STR_2004_BUILDING_MUST_BE_DEMOLISHED, STR_5007_MUST_DEMOLISH_BRIDGE_FIRST, STR_300B_MUST_DEMOLISH_RAILROAD, STR_300E_MUST_DEMOLISH_AIRPORT_FIRST, STR_MUST_DEMOLISH_CARGO_TRAM_STATION, STR_3047_MUST_DEMOLISH_TRUCK_STATION, STR_MUST_DEMOLISH_PASSENGER_TRAM_STATION, STR_3046_MUST_DEMOLISH_BUS_STATION, STR_306A_BUOY_IN_THE_WAY, STR_304D_MUST_DEMOLISH_DOCK_FIRST, STR_4800_IN_THE_WAY, STR_5804_COMPANY_HEADQUARTERS_IN, STR_5800_OBJECT_IN_THE_WAY, STR_1801_MUST_REMOVE_ROAD_FIRST, STR_1008_MUST_REMOVE_RAILROAD_TRACK, STR_5007_MUST_DEMOLISH_BRIDGE_FIRST, STR_5006_MUST_DEMOLISH_TUNNEL_FIRST, STR_1002_EXCAVATION_WOULD_DAMAGE]
 
 		/** Area is owned by another company */
 		ERR_AREA_IS_OWNED_BY_ANOTHER_COMPANY,         // [STR_1024_AREA_IS_OWNED_BY_ANOTHER]
--- a/src/ai/api/ai_error.hpp.sq	Mon Apr 07 18:32:42 2008 +0000
+++ b/src/ai/api/ai_error.hpp.sq	Mon Apr 07 18:37:23 2008 +0000
@@ -61,6 +61,7 @@
 	AIError::RegisterErrorMap(STR_1008_MUST_REMOVE_RAILROAD_TRACK,      AIError::ERR_AREA_NOT_CLEAR);
 	AIError::RegisterErrorMap(STR_5007_MUST_DEMOLISH_BRIDGE_FIRST,      AIError::ERR_AREA_NOT_CLEAR);
 	AIError::RegisterErrorMap(STR_5006_MUST_DEMOLISH_TUNNEL_FIRST,      AIError::ERR_AREA_NOT_CLEAR);
+	AIError::RegisterErrorMap(STR_1002_EXCAVATION_WOULD_DAMAGE,         AIError::ERR_AREA_NOT_CLEAR);
 	AIError::RegisterErrorMap(STR_1024_AREA_IS_OWNED_BY_ANOTHER,        AIError::ERR_AREA_IS_OWNED_BY_ANOTHER_COMPANY);
 	AIError::RegisterErrorMap(STR_NAME_MUST_BE_UNIQUE,                  AIError::ERR_NAME_IS_NOT_UNIQUE);
 	AIError::RegisterErrorMap(STR_0007_FLAT_LAND_REQUIRED,              AIError::ERR_FLAT_LAND_REQUIRED);
--- a/src/ai/api/ai_tile.cpp	Mon Apr 07 18:32:42 2008 +0000
+++ b/src/ai/api/ai_tile.cpp	Mon Apr 07 18:37:23 2008 +0000
@@ -99,19 +99,21 @@
 
 /* static */ bool AITile::RaiseTile(TileIndex tile, int32 slope)
 {
-	if (!::IsValidTile(tile)) return false;
+	EnforcePrecondition(false, ::IsValidTile(tile));
 
 	return AIObject::DoCommand(tile, slope, 1, CMD_TERRAFORM_LAND);
 }
 
 /* static */ bool AITile::LowerTile(TileIndex tile, int32 slope)
 {
-	if (!::IsValidTile(tile)) return false;
+	EnforcePrecondition(false, ::IsValidTile(tile));
 
 	return AIObject::DoCommand(tile, slope, 0, CMD_TERRAFORM_LAND);
 }
 
-/* static */ bool AITile::DemolishTile(TileIndex t)
+/* static */ bool AITile::DemolishTile(TileIndex tile)
 {
-	return AIObject::DoCommand(t, 0, 0, CMD_LANDSCAPE_CLEAR);
+	EnforcePrecondition(false, ::IsValidTile(tile));
+
+	return AIObject::DoCommand(tile, 0, 0, CMD_LANDSCAPE_CLEAR);
 }
--- a/src/ai/api/ai_tile.hpp	Mon Apr 07 18:32:42 2008 +0000
+++ b/src/ai/api/ai_tile.hpp	Mon Apr 07 18:37:23 2008 +0000
@@ -6,6 +6,7 @@
 #define AI_TILE_HPP
 
 #include "ai_abstractlist.hpp"
+#include "ai_error.hpp"
 
 /**
  * Class that handles all tile related functions.
@@ -15,6 +16,24 @@
 	static const char *GetClassName() { return "AITile"; }
 
 	/**
+	 * Error messages related to modifying tiles.
+	 */
+	enum ErrorMessages {
+
+		/** Base for tile related errors */
+		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]
+
+		/** 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]
+	};
+
+	/**
 	 * Enumeration for the slope-type (from slopes.h).
 	 *
 	 * This enumeration use the chars N, E, S, W corresponding the
@@ -142,6 +161,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
 	 * @return 0 means failed, 1 means success.
 	 */
 	static bool RaiseTile(TileIndex tile, int32 slope);
@@ -152,6 +174,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
 	 * @return 0 means failed, 1 means success.
 	 */
 	static bool LowerTile(TileIndex tile, int32 slope);
@@ -160,6 +185,7 @@
 	 * Destroy everything on the given tile.
 	 * @param tile The tile to demolish.
 	 * @pre AIMap::IsValidTile(tile).
+	 * @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	Mon Apr 07 18:32:42 2008 +0000
+++ b/src/ai/api/ai_tile.hpp.sq	Mon Apr 07 18:37:23 2008 +0000
@@ -2,6 +2,8 @@
 
 namespace SQConvert {
 	/* Allow enums to be used as Squirrel parameters */
+	template <> AITile::ErrorMessages GetParam(ForceType<AITile::ErrorMessages>, HSQUIRRELVM vm, int index) { SQInteger tmp; sq_getinteger(vm, index, &tmp); return (AITile::ErrorMessages)tmp; }
+	template <> int Return<AITile::ErrorMessages>(HSQUIRRELVM vm, AITile::ErrorMessages res) { sq_pushinteger(vm, (int32)res); return 1; }
 	template <> AITile::Slope GetParam(ForceType<AITile::Slope>, HSQUIRRELVM vm, int index) { SQInteger tmp; sq_getinteger(vm, index, &tmp); return (AITile::Slope)tmp; }
 	template <> int Return<AITile::Slope>(HSQUIRRELVM vm, AITile::Slope res) { sq_pushinteger(vm, (int32)res); return 1; }
 
@@ -18,27 +20,39 @@
 	SQAITile.PreRegister(engine);
 	SQAITile.AddConstructor<void (AITile::*)(), 1>(engine, "x");
 
-	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::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");
+
+	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::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");
 
 	SQAITile.DefSQStaticMethod(engine, &AITile::GetClassName,               "GetClassName",               1, "x");
 	SQAITile.DefSQStaticMethod(engine, &AITile::IsBuildable,                "IsBuildable",                2, "xi");