(svn r13634) -Codechange: Let house var 0x65 ignore the house, the variable is queried for.
authorfrosch
Wed, 25 Jun 2008 20:04:27 +0000
changeset 11077 eed344c0481e
parent 11076 a7126859e799
child 11080 e84a6e1c340c
(svn r13634) -Codechange: Let house var 0x65 ignore the house, the variable is queried for.
src/newgrf_house.cpp
src/town.h
src/town_cmd.cpp
--- a/src/newgrf_house.cpp	Wed Jun 25 19:33:11 2008 +0000
+++ b/src/newgrf_house.cpp	Wed Jun 25 20:04:27 2008 +0000
@@ -201,20 +201,30 @@
 	return GetNearbyTileInformation(tile);
 }
 
+/** Structure with user-data for SearchNearbyHouseXXX - functions */
+typedef struct {
+	const HouseSpec *hs;  ///< Specs of the house, that startet the search
+	TileIndex north_tile; ///< Northern tile of the house.
+} SearchNearbyHouseData;
+
 /** Callback function to search a house by its HouseID
  * @param tile TileIndex to be examined
- * @param user_data house id, in order to get the specs
+ * @param user_data SearchNearbyHouseData
  * @return true or false, if found or not
  */
 static bool SearchNearbyHouseID(TileIndex tile, void *user_data)
 {
 	if (IsTileType(tile, MP_HOUSE)) {
-		const HouseSpec *hs = GetHouseSpecs(GetHouseType(tile)); // tile been examined
+		HouseID house = GetHouseType(tile); // tile been examined
+		const HouseSpec *hs = GetHouseSpecs(house);
 		if (hs->grffile != NULL) { // must be one from a grf file
-			HouseID *test_house = (HouseID *)user_data;
-			const HouseSpec *test_hs = GetHouseSpecs(*test_house);
-			return hs->local_id == test_hs->local_id &&  // same local id as the one requested
-				hs->grffile->grfid == test_hs->grffile->grfid;  // from the same grf
+			SearchNearbyHouseData *nbhd = (SearchNearbyHouseData *)user_data;
+
+			TileIndex north_tile = tile + GetHouseNorthPart(house); // modifies 'house'!
+			if (north_tile == nbhd->north_tile) return false; // Always ignore origin house
+
+			return hs->local_id == nbhd->hs->local_id &&  // same local id as the one requested
+				hs->grffile->grfid == nbhd->hs->grffile->grfid;  // from the same grf
 		}
 	}
 	return false;
@@ -222,18 +232,22 @@
 
 /** Callback function to search a house by its classID
  * @param tile TileIndex to be examined
- * @param user_data house id, in order to get the specs
+ * @param user_data SearchNearbyHouseData
  * @return true or false, if found or not
  */
 static bool SearchNearbyHouseClass(TileIndex tile, void *user_data)
 {
 	if (IsTileType(tile, MP_HOUSE)) {
-		const HouseSpec *hs = GetHouseSpecs(GetHouseType(tile)); // tile been examined
+		HouseID house = GetHouseType(tile); // tile been examined
+		const HouseSpec *hs = GetHouseSpecs(house);
 		if (hs->grffile != NULL) { // must be one from a grf file
-			HouseID *test_house = (HouseID *)user_data;
-			const HouseSpec *test_hs = GetHouseSpecs(*test_house);
-			return hs->class_id == test_hs->class_id &&  // same classid as the one requested
-				hs->grffile->grfid == test_hs->grffile->grfid;  // from the same grf
+			SearchNearbyHouseData *nbhd = (SearchNearbyHouseData *)user_data;
+
+			TileIndex north_tile = tile + GetHouseNorthPart(house); // modifies 'house'!
+			if (north_tile == nbhd->north_tile) return false; // Always ignore origin house
+
+			return hs->class_id == nbhd->hs->class_id &&  // same classid as the one requested
+				hs->grffile->grfid == nbhd->hs->grffile->grfid;  // from the same grf
 		}
 	}
 	return false;
@@ -241,17 +255,21 @@
 
 /** Callback function to search a house by its grfID
  * @param tile TileIndex to be examined
- * @param user_data house id, in order to get the specs
+ * @param user_data SearchNearbyHouseData
  * @return true or false, if found or not
  */
 static bool SearchNearbyHouseGRFID(TileIndex tile, void *user_data)
 {
 	if (IsTileType(tile, MP_HOUSE)) {
-		const HouseSpec *hs = GetHouseSpecs(GetHouseType(tile)); // tile been examined
+		HouseID house = GetHouseType(tile); // tile been examined
+		const HouseSpec *hs = GetHouseSpecs(house);
 		if (hs->grffile != NULL) { // must be one from a grf file
-			HouseID *test_house = (HouseID *)user_data;
-			const HouseSpec *test_hs = GetHouseSpecs(*test_house);
-			return hs->grffile->grfid == test_hs->grffile->grfid;  // from the same grf
+			SearchNearbyHouseData *nbhd = (SearchNearbyHouseData *)user_data;
+
+			TileIndex north_tile = tile + GetHouseNorthPart(house); // modifies 'house'!
+			if (north_tile == nbhd->north_tile) return false; // Always ignore origin house
+
+			return hs->grffile->grfid == nbhd->hs->grffile->grfid;  // from the same grf
 		}
 	}
 	return false;
@@ -279,8 +297,12 @@
 	if (searchtype >= lengthof(search_procs)) return 0;  // do not run on ill-defined code
 	if (searchradius < 1) return 0; // do not use a too low radius
 
+	SearchNearbyHouseData nbhd;
+	nbhd.hs = GetHouseSpecs(house);
+	nbhd.north_tile = tile + GetHouseNorthPart(house); // modifies 'house'!
+
 	/* Use a pointer for the tile to start the search. Will be required for calculating the distance*/
-	if (CircularTileSearch(&found_tile, 2 * searchradius + 1, search_procs[searchtype], &house)) {
+	if (CircularTileSearch(&found_tile, 2 * searchradius + 1, search_procs[searchtype], &nbhd)) {
 		return DistanceManhattan(found_tile, tile);
 	}
 	return 0;
--- a/src/town.h	Wed Jun 25 19:33:11 2008 +0000
+++ b/src/town.h	Wed Jun 25 20:04:27 2008 +0000
@@ -299,6 +299,8 @@
 	return &_house_specs[house_id];
 }
 
+TileIndex GetHouseNorthPart(HouseID &house);
+
 /**
  * Check if a TownID is valid.
  * @param index to inquiry in the pool of town
--- a/src/town_cmd.cpp	Wed Jun 25 19:33:11 2008 +0000
+++ b/src/town_cmd.cpp	Wed Jun 25 20:04:27 2008 +0000
@@ -2011,7 +2011,7 @@
  * @param house Is changed to the HouseID of the north tile of the same house
  * @return TileDiff from the tile of the given HouseID to the north tile
  */
-static TileIndex GetHouseNorthPart(HouseID &house)
+TileIndex GetHouseNorthPart(HouseID &house)
 {
 	if (house >= 3) { // house id 0,1,2 MUST be single tile houses, or this code breaks.
 		if (GetHouseSpecs(house - 1)->building_flags & TILE_SIZE_2x1) {