town_cmd.c
changeset 909 81bc9ef93f50
parent 900 feed1801fd35
child 919 b0d6c7642f99
--- a/town_cmd.c	Thu Jan 06 08:08:17 2005 +0000
+++ b/town_cmd.c	Thu Jan 06 11:39:00 2005 +0000
@@ -362,17 +362,17 @@
 }
 
 
-static const TileIndexDiff _roadblock_tileadd[4+3] = {
-	TILE_XY(0,-1),
-	TILE_XY(1,0),
-	TILE_XY(0,1),
-	TILE_XY(-1,0),
+static const TileIndexDiffC _roadblock_tileadd[] = {
+	{ 0, -1},
+	{ 1,  0},
+	{ 0,  1},
+	{-1,  0},
 
 	// Store the first 3 elements again.
 	// Lets us rotate without using &3.
-	TILE_XY(0,-1),
-	TILE_XY(1,0),
-	TILE_XY(0,1),
+	{ 0, -1},
+	{ 1,  0},
+	{ 0,  1}
 };
 
 static void TownTickHandler(Town *t)
@@ -448,10 +448,10 @@
 no_slope:
 			// Tile has no slope
 			// Disallow the road if any neighboring tile has a road.
-			if (HASBIT(GetTownRoadMask(TILE_ADD(tile, _roadblock_tileadd[dir+1])), dir^2) ||
-					HASBIT(GetTownRoadMask(TILE_ADD(tile, _roadblock_tileadd[dir+3])), dir^2) ||
-					HASBIT(GetTownRoadMask(TILE_ADD(tile, _roadblock_tileadd[dir+1] + _roadblock_tileadd[dir+2])), dir) ||
-					HASBIT(GetTownRoadMask(TILE_ADD(tile, _roadblock_tileadd[dir+3] + _roadblock_tileadd[dir+2])), dir))
+			if (HASBIT(GetTownRoadMask(TILE_ADD(tile, ToTileIndexDiff(_roadblock_tileadd[dir+1]))), dir^2) ||
+					HASBIT(GetTownRoadMask(TILE_ADD(tile, ToTileIndexDiff(_roadblock_tileadd[dir+3]))), dir^2) ||
+					HASBIT(GetTownRoadMask(TILE_ADD(tile, ToTileIndexDiff(_roadblock_tileadd[dir+1]) + ToTileIndexDiff(_roadblock_tileadd[dir+2]))), dir) ||
+					HASBIT(GetTownRoadMask(TILE_ADD(tile, ToTileIndexDiff(_roadblock_tileadd[dir+3]) + ToTileIndexDiff(_roadblock_tileadd[dir+2]))), dir))
 				return false;
 
 			// Otherwise allow
@@ -556,15 +556,15 @@
 			a = (int)Random() & 3;
 		} while(a == b);
 
-		if (!IsRoadAllowedHere(TILE_ADD(tile,_roadblock_tileadd[a]), a)) {
+		if (!IsRoadAllowedHere(TILE_ADD(tile, ToTileIndexDiff(_roadblock_tileadd[a])), a)) {
 			// A road is not allowed to continue the randomized road,
 			//   return if the road we're trying to build is curved.
 			if ( a != (b^2))
 				return;
 
 			// Return if neither side of the new road is a house
-			if (!IS_TILETYPE(TILE_ADD(tile,_roadblock_tileadd[a+1]), MP_HOUSE) &&
-					!IS_TILETYPE(TILE_ADD(tile,_roadblock_tileadd[a+3]), MP_HOUSE))
+			if (!IS_TILETYPE(TILE_ADD(tile, ToTileIndexDiff(_roadblock_tileadd[a + 1])), MP_HOUSE) &&
+					!IS_TILETYPE(TILE_ADD(tile, ToTileIndexDiff(_roadblock_tileadd[a + 3])), MP_HOUSE))
 				return;
 
 			// That means that the road is only allowed if there is a house
@@ -597,7 +597,7 @@
 			return;
 
 		// This is the tile we will reach if we extend to this direction.
-		tmptile = TILE_ADD(tile,_roadblock_tileadd[i]);
+		tmptile = TILE_ADD(tile, ToTileIndexDiff(_roadblock_tileadd[i]));
 
 		// Don't do it if it reaches to water.
 		if (IS_WATER_TILE(tmptile))
@@ -708,7 +708,7 @@
 		// Select a random bit from the blockmask, walk a step
 		// and continue the search from there.
 		do block = Random() & 3; while (!HASBIT(mask,block));
-		tile += _roadblock_tileadd[block];
+		tile += ToTileIndexDiff(_roadblock_tileadd[block]);
 
 		// Max number of times is checked.
 	} while (--_grow_town_result >= 0);
@@ -732,25 +732,24 @@
 bool GrowTown(Town *t)
 {
 	uint tile;
-	const TileIndexDiff *ptr;
-	int offs;
+	const TileIndexDiffC *ptr;
 	TileInfo ti;
 	byte old_player;
 
-	static const TileIndexDiff _town_coord_mod[] = {
-		TILE_XY(-1,0),
-		TILE_XY(1,1),
-		TILE_XY(1,-1),
-		TILE_XY(-1,-1),
-		TILE_XY(-1,0),
-		TILE_XY(0,2),
-		TILE_XY(2,0),
-		TILE_XY(0,-2),
-		TILE_XY(-1,-1),
-		TILE_XY(-2,2),
-		TILE_XY(2,2),
-		TILE_XY(2,-2),
-		0,
+	static const TileIndexDiffC _town_coord_mod[] = {
+		{-1,  0},
+		{ 1,  1},
+		{ 1, -1},
+		{-1, -1},
+		{-1,  0},
+		{ 0,  2},
+		{ 2,  0},
+		{ 0, -2},
+		{-1, -1},
+		{-2,  2},
+		{ 2,  2},
+		{ 2, -2},
+		{ 0,  0}
 	};
 
 	// Current player is a town
@@ -759,23 +758,19 @@
 
 	// Find a road that we can base the construction on.
 	tile = t->xy;
-	ptr = _town_coord_mod;
-	do {
+	for (ptr = _town_coord_mod; ptr != endof(_town_coord_mod); ++ptr) {
 		if (GetRoadBitsByTile(tile) != 0) {
 			int r = GrowTownAtRoad(t, tile);
 			_current_player = old_player;
 			return r;
 		}
-		offs = *ptr++;
-
-		tile = TILE_ADD(tile, offs);
-	} while (offs);
+		tile = TILE_ADD(tile, ToTileIndexDiff(*ptr));
+	}
 
 	// No road available, try to build a random road block by
 	// clearing some land and then building a road there.
 	tile = t->xy;
-	ptr = _town_coord_mod;
-	do {
+	for (ptr = _town_coord_mod; ptr != endof(_town_coord_mod); ++ptr) {
 		FindLandscapeHeightByTile(&ti, tile);
 
 		// Only work with plain land that not already has a house with map5=0
@@ -786,9 +781,8 @@
 				return true;
 			}
 		}
-		offs = *ptr++;
-		tile = TILE_ADD(tile, offs);
-	} while (offs != 0);
+		tile = TILE_ADD(tile, ToTileIndexDiff(*ptr));
+	}
 
 	_current_player = old_player;
 	return false;
@@ -1085,15 +1079,15 @@
 	Town *t;
 	int i;
 
-	static const TileIndexDiff _tile_add[4] = {
-		TILE_XY(0,0),
-		TILE_XY(0,1) - TILE_XY(0,0),
-		TILE_XY(1,0) - TILE_XY(0,1),
-		TILE_XY(1,1) - TILE_XY(1,0),
+	static const TileIndexDiffC _tile_add[] = {
+		{0    , 0    },
+		{0 - 0, 1 - 0},
+		{1 - 0, 0 - 1},
+		{1 - 1, 1 - 0}
 	};
 
 	for(i=0; i!=4; i++) {
-		tile += _tile_add[i];
+		tile += ToTileIndexDiff(_tile_add[i]);
 
 		t = ClosestTownFromTile(tile, (uint)-1);
 		if (t1 != t)
@@ -1503,41 +1497,36 @@
 static void TownActionBuildStatue(Town *t, int action)
 {
 	// Layouted as an outward spiral
-	static const TileIndexDiff _statue_tiles[] = {
-	  TILE_XY(-1,0), TILE_XY(0,1),  TILE_XY(1,0),  TILE_XY(1,0),
-	  TILE_XY(0,-1), TILE_XY(0,-1), TILE_XY(-1,0), TILE_XY(-1,0),
-	  TILE_XY(-1,0), TILE_XY(0,1),  TILE_XY(0,1),  TILE_XY(0,1),
-	  TILE_XY(1,0),  TILE_XY(1,0),  TILE_XY(1,0),  TILE_XY(1,0),
-	  TILE_XY(0,-1), TILE_XY(0,-1), TILE_XY(0,-1), TILE_XY(0,-1),
-	  TILE_XY(-1,0), TILE_XY(-1,0), TILE_XY(-1,0), TILE_XY(-1,0),
-	  TILE_XY(-1,0), TILE_XY(0,1),  TILE_XY(0,1),  TILE_XY(0,1),
-	  TILE_XY(0,1),  TILE_XY(0,1),  TILE_XY(1,0),  TILE_XY(1,0),
-	  TILE_XY(1,0),  TILE_XY(1,0),  TILE_XY(1,0),  TILE_XY(1,0),
-	  TILE_XY(0,-1), TILE_XY(0,-1), TILE_XY(0,-1), TILE_XY(0,-1),
-	  TILE_XY(0,-1), TILE_XY(0,-1), TILE_XY(-1,0), TILE_XY(-1,0),
-	  TILE_XY(-1,0), TILE_XY(-1,0), TILE_XY(-1,0), TILE_XY(-1,0),
-	  TILE_XY(-1,0), TILE_XY(0,1),  TILE_XY(0,1),  TILE_XY(0,1),
-	  TILE_XY(0,1),  TILE_XY(0,1),  TILE_XY(0,1),  TILE_XY(0,1),
-	  TILE_XY(1,0),  TILE_XY(1,0),  TILE_XY(1,0),  TILE_XY(1,0),
-	  TILE_XY(1,0),  TILE_XY(1,0),  TILE_XY(1,0),  TILE_XY(1,0),
-	  TILE_XY(0,-1), TILE_XY(0,-1), TILE_XY(0,-1), TILE_XY(0,-1),
-	  TILE_XY(0,-1), TILE_XY(0,-1), TILE_XY(0,-1), TILE_XY(0,-1),
-	  TILE_XY(-1,0), TILE_XY(-1,0), TILE_XY(-1,0), TILE_XY(-1,0),
-	  TILE_XY(-1,0), TILE_XY(-1,0), TILE_XY(-1,0), TILE_XY(-1,0),
-	  0,
-    };
-	int offs;
+	static const TileIndexDiffC _statue_tiles[] = {
+		{-1, 0},
+		{ 0, 1},
+		{ 1, 0}, { 1, 0},
+		{ 0,-1}, { 0,-1},
+		{-1, 0}, {-1, 0}, {-1, 0},
+		{ 0, 1}, { 0, 1}, { 0, 1},
+		{ 1, 0}, { 1, 0}, { 1, 0}, { 1, 0},
+		{ 0,-1}, { 0,-1}, { 0,-1}, { 0,-1},
+		{-1, 0}, {-1, 0}, {-1, 0}, {-1, 0}, {-1, 0},
+		{ 0, 1}, { 0, 1}, { 0, 1}, { 0, 1}, { 0, 1},
+		{ 1, 0}, { 1, 0}, { 1, 0}, { 1, 0}, { 1, 0}, { 1, 0},
+		{ 0,-1}, { 0,-1}, { 0,-1}, { 0,-1}, { 0,-1}, { 0,-1},
+		{-1, 0}, {-1, 0}, {-1, 0}, {-1, 0}, {-1, 0}, {-1, 0}, {-1, 0},
+		{ 0, 1}, { 0, 1}, { 0, 1}, { 0, 1}, { 0, 1}, { 0, 1}, { 0, 1},
+		{ 1, 0}, { 1, 0}, { 1, 0}, { 1, 0}, { 1, 0}, { 1, 0}, { 1, 0}, { 1, 0},
+		{ 0,-1}, { 0,-1}, { 0,-1}, { 0,-1}, { 0,-1}, { 0,-1}, { 0,-1}, { 0,-1},
+		{-1, 0}, {-1, 0}, {-1, 0}, {-1, 0}, {-1, 0}, {-1, 0}, {-1, 0}, {-1, 0},
+		{ 0, 0}
+	};
 	uint tile = t->xy;
-	const TileIndexDiff *p = _statue_tiles;
+	const TileIndexDiffC *p;
 
 	SETBIT(t->statues, _current_player);
 
-	do {
+	for (p = _statue_tiles; p != endof(_statue_tiles); ++p) {
 		if (DoBuildStatueOfCompany(tile))
 			return;
-		offs = *p++;
-		tile = TILE_ADD(tile, offs);
-	} while (offs);
+		tile = TILE_ADD(tile, ToTileIndexDiff(*p));
+	}
 }
 
 static void TownActionFundBuildings(Town *t, int action)