changeset 16560:642abe0d6818 draft

(svn r21288) -Codechange: Add helper function to find entries in _cleared_object_areas.
author frosch <frosch@openttd.org>
date Sun, 21 Nov 2010 17:05:23 +0000
parents 501ce98e1480
children 7ca019b56d4e
files src/landscape.cpp src/object_base.h src/object_cmd.cpp
diffstat 3 files changed, 29 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/src/landscape.cpp
+++ b/src/landscape.cpp
@@ -614,22 +614,22 @@
 		do_clear = true;
 		cost.AddCost(GetWaterClass(tile) == WATER_CLASS_CANAL ? _price[PR_CLEAR_CANAL] : _price[PR_CLEAR_WATER]);
 	}
-	for (uint i = 0; i < _cleared_object_areas.Length(); i++) {
-		/* If this tile was the first tile which caused object destruction, always
-		 * pass it on to the tile_type_proc. That way multiple test runs and the exec run stay consistent. */
-		if (_cleared_object_areas[i].first_tile == tile) break;
+
+	const ClearedObjectArea *coa = FindClearedObject(tile);
 
+	/* If this tile was the first tile which caused object destruction, always
+	 * pass it on to the tile_type_proc. That way multiple test runs and the exec run stay consistent. */
+	if (coa != NULL && coa->first_tile != tile) {
 		/* If this tile belongs to an object which was already cleared via another tile, pretend it has been
 		 * already removed.
 		 * However, we need to check stuff, which is not the same for all object tiles. (e.g. being on water or not) */
-		if (_cleared_object_areas[i].area.Intersects(TileArea(tile, 1, 1))) {
-			/* If a object is removed, it leaves either bare land or water. */
-			if ((flags & DC_NO_WATER) && HasTileWaterClass(tile) && IsTileOnWater(tile)) {
-				return_cmd_error(STR_ERROR_CAN_T_BUILD_ON_WATER);
-			}
-			if (do_clear && (flags & DC_EXEC)) DoClearSquare(tile);
-			return cost;
+
+		/* If a object is removed, it leaves either bare land or water. */
+		if ((flags & DC_NO_WATER) && HasTileWaterClass(tile) && IsTileOnWater(tile)) {
+			return_cmd_error(STR_ERROR_CAN_T_BUILD_ON_WATER);
 		}
+		if (do_clear && (flags & DC_EXEC)) DoClearSquare(tile);
+		return cost;
 	}
 	cost.AddCost(_tile_type_procs[GetTileType(tile)]->clear_tile_proc(tile, flags));
 	if (do_clear && (flags & DC_EXEC)) DoClearSquare(tile);
--- a/src/object_base.h
+++ b/src/object_base.h
@@ -95,6 +95,7 @@
 	TileArea area;         ///< The area of the object.
 };
 
+ClearedObjectArea *FindClearedObject(TileIndex tile);
 extern SmallVector<ClearedObjectArea, 4> _cleared_object_areas;
 
 #endif /* OBJECT_BASE_H */
--- a/src/object_cmd.cpp
+++ b/src/object_cmd.cpp
@@ -371,6 +371,23 @@
 
 SmallVector<ClearedObjectArea, 4> _cleared_object_areas;
 
+/**
+ * Find the entry in _cleared_object_areas which occupies a certain tile.
+ * @param tile Tile of interest
+ * @return Occupying entry, or NULL if none
+ */
+ClearedObjectArea *FindClearedObject(TileIndex tile)
+{
+	TileArea ta = TileArea(tile, 1, 1);
+
+	const ClearedObjectArea *end = _cleared_object_areas.End();
+	for (ClearedObjectArea *coa = _cleared_object_areas.Begin(); coa != end; coa++) {
+		if (coa->area.Intersects(ta)) return coa;
+	}
+
+	return NULL;
+}
+
 static CommandCost ClearTile_Object(TileIndex tile, DoCommandFlag flags)
 {
 	ObjectType type = GetObjectType(tile);