(svn r13367) -Codechange: Allow CircularTileSearch function to return the tile where search has been successful, or INVALID_TILE if it has not
authorbelugas
Tue, 03 Jun 2008 02:20:27 +0000
changeset 9449 240fedf4ed2c
parent 9448 1c58609bae95
child 9450 9e7d05b0b1e5
(svn r13367) -Codechange: Allow CircularTileSearch function to return the tile where search has been successful, or INVALID_TILE if it has not
src/industry_cmd.cpp
src/map.cpp
src/map_func.h
src/town_cmd.cpp
--- a/src/industry_cmd.cpp	Tue Jun 03 00:23:54 2008 +0000
+++ b/src/industry_cmd.cpp	Tue Jun 03 02:20:27 2008 +0000
@@ -995,7 +995,7 @@
 
 	if (!IsIndustryCompleted(tile)) return;  ///< Can't proceed if not completed
 
-	if (CircularTileSearch(tile, 40, SearchLumberMillTrees, 0)) ///< 40x40 tiles  to search
+	if (CircularTileSearch(&tile, 40, SearchLumberMillTrees, 0)) ///< 40x40 tiles  to search
 		i->produced_cargo_waiting[0] = min(0xffff, i->produced_cargo_waiting[0] + 45); ///< Found a tree, add according value to waiting cargo
 }
 
--- a/src/map.cpp	Tue Jun 03 00:23:54 2008 +0000
+++ b/src/map.cpp	Tue Jun 03 02:20:27 2008 +0000
@@ -258,7 +258,7 @@
  * Although it really is a square search...
  * Every tile will be tested by means of the callback function proc,
  * which will determine if yes or no the given tile meets criteria of search.
- * @param tile to start the search from
+ * @param tile to start the search from. Upon completion, it will return the tile matching the search
  * @param size: number of tiles per side of the desired search area
  * @param proc: callback testing function pointer.
  * @param data to be passed to the callback function. Depends on the implementation
@@ -266,7 +266,7 @@
  * @pre proc != NULL
  * @pre size > 0
  */
-bool CircularTileSearch(TileIndex tile, uint size, TestTileOnSearchProc proc, uint32 data)
+bool CircularTileSearch(TileIndex *tile, uint size, TestTileOnSearchProc proc, uint32 data)
 {
 	uint n, x, y;
 	DiagDirection dir;
@@ -274,14 +274,17 @@
 	assert(proc != NULL);
 	assert(size > 0);
 
-	x = TileX(tile);
-	y = TileY(tile);
+	x = TileX(*tile);
+	y = TileY(*tile);
 
 	if (size % 2 == 1) {
 		/* If the length of the side is uneven, the center has to be checked
 		 * separately, as the pattern of uneven sides requires to go around the center */
 		n = 2;
-		if (proc(TileXY(x, y), data)) return true;
+		if (proc(TileXY(x, y), data)) {
+			*tile = TileXY(x, y);
+			return true;
+		}
 
 		/* If tile test is not successful, get one tile down and left,
 		 * ready for a test in first circle around center tile */
@@ -302,6 +305,7 @@
 			for (j = n; j != 0; j--) {
 				if (x <= MapMaxX() && y <= MapMaxY() && ///< Is the tile within the map?
 						proc(TileXY(x, y), data)) {     ///< Is the callback successful?
+					*tile = TileXY(x, y);
 					return true;                        ///< then stop the search
 				}
 
@@ -314,5 +318,7 @@
 		x += _tileoffs_by_dir[DIR_W].x;
 		y += _tileoffs_by_dir[DIR_W].y;
 	}
+
+	*tile = INVALID_TILE;
 	return false;
 }
--- a/src/map_func.h	Tue Jun 03 00:23:54 2008 +0000
+++ b/src/map_func.h	Tue Jun 03 02:20:27 2008 +0000
@@ -391,7 +391,7 @@
 /**
  * Searches for some cirumstances of a tile around a given tile with a helper function.
  */
-bool CircularTileSearch(TileIndex tile, uint size, TestTileOnSearchProc proc, uint32 data);
+bool CircularTileSearch(TileIndex *tile, uint size, TestTileOnSearchProc proc, uint32 data);
 
 /**
  * Get a random tile out of a given seed.
--- a/src/town_cmd.cpp	Tue Jun 03 00:23:54 2008 +0000
+++ b/src/town_cmd.cpp	Tue Jun 03 02:20:27 2008 +0000
@@ -2193,7 +2193,7 @@
 {
 	TileIndex tile = t->xy;
 
-	if (CircularTileSearch(tile, 9, SearchTileForStatue, t->index)) {
+	if (CircularTileSearch(&tile, 9, SearchTileForStatue, t->index)) {
 		SetBit(t->statues, _current_player); // Once found and built, "inform" the Town
 	}
 }