(svn r12613) [NoAI] -Add: support for GetLastError in AITile. Patch by Morloth.
--- 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");