changeset 11877:7fc0f3eb3a4f draft

(svn r16274) -Fix: Disable multitile houses for which the newgrf does not define proper additional tiles. (instead of crashing later)
author frosch <frosch@openttd.org>
date Sun, 10 May 2009 22:16:51 +0000
parents a5d501c26427
children ab145fbdb288
files src/newgrf.cpp src/town.h
diffstat 2 files changed, 19 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/newgrf.cpp
+++ b/src/newgrf.cpp
@@ -5835,10 +5835,25 @@
 
 		for (int i = 0; i < HOUSE_MAX; i++) {
 			HouseSpec *hs = file->housespec[i];
-			if (hs != NULL) {
-				_house_mngr.SetEntitySpec(hs);
-				if (hs->min_year < min_year) min_year = hs->min_year;
+
+			if (hs == NULL) continue;
+
+			const HouseSpec *next1 = (i + 1 < HOUSE_MAX ? file->housespec[i + 1] : NULL);
+			const HouseSpec *next2 = (i + 2 < HOUSE_MAX ? file->housespec[i + 2] : NULL);
+			const HouseSpec *next3 = (i + 3 < HOUSE_MAX ? file->housespec[i + 3] : NULL);
+
+			if (((hs->building_flags & BUILDING_HAS_2_TILES) != 0 &&
+						(next1 == NULL || !next1->enabled || (next1->building_flags & BUILDING_HAS_1_TILE) != 0)) ||
+					((hs->building_flags & BUILDING_HAS_4_TILES) != 0 &&
+						(next2 == NULL || !next2->enabled || (next2->building_flags & BUILDING_HAS_1_TILE) != 0 ||
+						next3 == NULL || !next3->enabled || (next3->building_flags & BUILDING_HAS_1_TILE) != 0))) {
+				hs->enabled = false;
+				DEBUG(grf, 1, "FinaliseHouseArray: %s defines house %d as multitile, but no suitable tiles follow. Disabling house.", file->filename, hs->local_id);
+				continue;
 			}
+
+			_house_mngr.SetEntitySpec(hs);
+			if (hs->min_year < min_year) min_year = hs->min_year;
 		}
 	}
 
--- a/src/town.h
+++ b/src/town.h
@@ -43,6 +43,7 @@
 	BUILDING_IS_CHURCH   = 1U << 6,
 	BUILDING_IS_STADIUM  = 1U << 7,
 	BUILDING_HAS_1_TILE  = TILE_SIZE_1x1 | TILE_SIZE_2x1 | TILE_SIZE_1x2 | TILE_SIZE_2x2,
+	BUILDING_HAS_2_TILES = TILE_SIZE_2x1 | TILE_SIZE_1x2 | TILE_SIZE_2x2,
 	BUILDING_2_TILES_X   = TILE_SIZE_2x1 | TILE_SIZE_2x2,
 	BUILDING_2_TILES_Y   = TILE_SIZE_1x2 | TILE_SIZE_2x2,
 	BUILDING_HAS_4_TILES = TILE_SIZE_2x2,