(svn r7641) -Codechange: remove the last direct map accesses from industry_cmd.
authorrubidium
Sat, 30 Dec 2006 11:51:37 +0000
changeset 5686 03c3d3b3e7eb
parent 5685 b88aca81aa7b
child 5687 a6f0e780d714
(svn r7641) -Codechange: remove the last direct map accesses from industry_cmd.
industry_cmd.c
industry_map.h
--- a/industry_cmd.c	Sat Dec 30 11:41:54 2006 +0000
+++ b/industry_cmd.c	Sat Dec 30 11:51:37 2006 +0000
@@ -123,7 +123,7 @@
 
 	if (!IsIndustryCompleted(ti->tile)) return;
 
-	d = &_draw_industry_spec1[_m[ti->tile].m3];
+	d = &_draw_industry_spec1[GetIndustryAnimationState(ti->tile)];
 
 	AddChildSpriteScreen(SPR_IT_SUGAR_MINE_SIEVE + d->image_1, d->x, 0);
 
@@ -142,7 +142,7 @@
 	int x = 0;
 
 	if (IsIndustryCompleted(ti->tile)) {
-		x = _industry_anim_offs[_m[ti->tile].m3];
+		x = _industry_anim_offs[GetIndustryAnimationState(ti->tile)];
 		if ( (byte)x == 0xFF)
 			x = 0;
 	}
@@ -154,7 +154,7 @@
 static void IndustryDrawBubbleGenerator( const TileInfo *ti)
 {
 	if (IsIndustryCompleted(ti->tile)) {
-		AddChildSpriteScreen(SPR_IT_BUBBLE_GENERATOR_BUBBLE, 5, _industry_anim_offs_2[_m[ti->tile].m3]);
+		AddChildSpriteScreen(SPR_IT_BUBBLE_GENERATOR_BUBBLE, 5, _industry_anim_offs_2[GetIndustryAnimationState(ti->tile)]);
 	} else {
 		AddChildSpriteScreen(SPR_IT_BUBBLE_GENERATOR_SPRING, 3, 67);
 	}
@@ -164,7 +164,7 @@
 {
 	const DrawIndustrySpec4Struct *d;
 
-	d = &_industry_anim_offs_3[_m[ti->tile].m3];
+	d = &_industry_anim_offs_3[GetIndustryAnimationState(ti->tile)];
 
 	if (d->image_1 != 0xFF) {
 		AddChildSpriteScreen(SPR_IT_TOY_FACTORY_CLAY, 50 - d->image_1 * 2, 96 + d->image_1);
@@ -181,7 +181,7 @@
 static void IndustryDrawCoalPlantSparks(const TileInfo *ti)
 {
 	if (IsIndustryCompleted(ti->tile)) {
-		uint image = GB(_m[ti->tile].m1, 2, 5);
+		uint image = GetIndustryAnimationState(ti->tile);
 
 		if (image != 0 && image < 7) {
 			AddChildSpriteScreen(image + SPR_IT_POWER_PLANT_TRANSFORMERS,
@@ -362,7 +362,7 @@
 	switch (GetIndustryGfx(tile)) {
 	case GFX_SUGAR_MINE_SIEVE:
 		if ((_tick_counter & 1) == 0) {
-			m = _m[tile].m3 + 1;
+			m = GetIndustryAnimationState(tile) + 1;
 
 			switch (m & 7) {
 			case 2: SndPlayTileFx(SND_2D_RIP_2, tile); break;
@@ -373,7 +373,7 @@
 				m = 0;
 				DeleteAnimatedTile(tile);
 			}
-			_m[tile].m3 = m;
+			SetIndustryAnimationState(tile, m);
 
 			MarkTileDirtyByTile(tile);
 		}
@@ -381,7 +381,7 @@
 
 	case GFX_TOFFEE_QUARY:
 		if ((_tick_counter & 3) == 0) {
-			m = _m[tile].m3;
+			m = GetIndustryAnimationState(tile);
 
 			if (_industry_anim_offs[m] == 0xFF) {
 				SndPlayTileFx(SND_30_CARTOON_SOUND, tile);
@@ -391,21 +391,21 @@
 				m = 0;
 				DeleteAnimatedTile(tile);
 			}
-			_m[tile].m3 = m;
+			SetIndustryAnimationState(tile, m);
 
 			MarkTileDirtyByTile(tile);
 		}
 		break;
 
 	case GFX_BUBBLE_CATCHER:
-		if ((_tick_counter&1) == 0) {
-			m = _m[tile].m3;
+		if ((_tick_counter & 1) == 0) {
+			m = GetIndustryAnimationState(tile);
 
 			if (++m >= 40) {
 				m = 0;
 				DeleteAnimatedTile(tile);
 			}
-			_m[tile].m3 = m;
+			SetIndustryAnimationState(tile, m);
 
 			MarkTileDirtyByTile(tile);
 		}
@@ -414,12 +414,12 @@
 	// Sparks on a coal plant
 	case GFX_POWERPLANT_SPARKS:
 		if ((_tick_counter & 3) == 0) {
-			m = _m[tile].m1;
-			if (GB(m, 2, 5) == 6) {
-				SB(_m[tile].m1, 2, 5, 0);
+			m = GetIndustryAnimationState(tile);
+			if (m == 6) {
+				SetIndustryAnimationState(tile, 0);
 				DeleteAnimatedTile(tile);
 			} else {
-				_m[tile].m1 = m + (1<<2);
+				SetIndustryAnimationState(tile, m + 1);
 				MarkTileDirtyByTile(tile);
 			}
 		}
@@ -427,7 +427,7 @@
 
 	case GFX_TOY_FACTORY:
 		if ((_tick_counter & 1) == 0) {
-			m = _m[tile].m3 + 1;
+			m = GetIndustryAnimationState(tile) + 1;
 
 			if (m == 1) {
 				SndPlayTileFx(SND_2C_MACHINERY, tile);
@@ -446,7 +446,7 @@
 				}
 				SetIndustryAnimationLoop(tile, n);
 			}
-			_m[tile].m3 = m;
+			SetIndustryAnimationState(tile, m);
 			MarkTileDirtyByTile(tile);
 		}
 		break;
@@ -471,13 +471,13 @@
 			bool b = CHANCE16(1,7);
 			IndustryGfx gfx = GetIndustryGfx(tile);
 
-			m = GB(_m[tile].m1, 0, 2) + 1;
+			m = GetIndustryAnimationState(tile) + 1;
 			if (m == 4 && (m = 0, ++gfx) == GFX_OILWELL_ANIMATED_3 + 1 && (gfx = GFX_OILWELL_ANIMATED_1, b)) {
-				_m[tile].m1 = 0x83;
 				SetIndustryGfx(tile, GFX_OILWELL_NOT_ANIMATED);
+				SetIndustryConstructionStage(tile, 3);
 				DeleteAnimatedTile(tile);
 			} else {
-				SB(_m[tile].m1, 0, 2, m);
+				SetIndustryAnimationState(tile, m);
 				SetIndustryGfx(tile, gfx);
 				MarkTileDirtyByTile(tile);
 			}
@@ -494,8 +494,9 @@
 
 			if (state < 0x1A0) {
 				if (state < 0x20 || state >= 0x180) {
-					if (!(_m[tile].m1 & 0x40)) {
-						_m[tile].m1 |= 0x40;
+					m = GetIndustryAnimationState(tile);
+					if (!(m & 0x40)) {
+						SetIndustryAnimationState(tile, m |= 0x40);
 						SndPlayTileFx(SND_0B_MINING_MACHINERY, tile);
 					}
 					if (state & 7)
@@ -504,9 +505,9 @@
 					if (state & 3)
 						return;
 				}
-				m = (_m[tile].m1 + 1) | 0x40;
+				m = (GetIndustryAnimationState(tile) + 1) | 0x40;
 				if (m > 0xC2) m = 0xC0;
-				_m[tile].m1 = m;
+				SetIndustryAnimationState(tile, m);
 				MarkTileDirtyByTile(tile);
 			} else if (state >= 0x200 && state < 0x3A0) {
 				int i;
@@ -514,9 +515,9 @@
 				if (state & i)
 					return;
 
-				m = (_m[tile].m1 & 0xBF) - 1;
+				m = (GetIndustryAnimationState(tile) & 0xBF) - 1;
 				if (m < 0x80) m = 0x82;
-				_m[tile].m1 = m;
+				SetIndustryAnimationState(tile, m);
 				MarkTileDirtyByTile(tile);
 			}
 		} break;
@@ -565,7 +566,7 @@
 	case GFX_TOY_FACTORY:
 	case GFX_BUBBLE_CATCHER:
 	case GFX_TOFFEE_QUARY:
-		_m[tile].m3 = 0;
+		SetIndustryAnimationState(tile, 0);
 		SetIndustryAnimationLoop(tile, 0);
 		break;
 
@@ -606,6 +607,7 @@
 static void TileLoop_Industry(TileIndex tile)
 {
 	IndustryGfx newgfx;
+	IndustryGfx gfx;
 
 	if (!IsIndustryCompleted(tile)) {
 		MakeIndustryTileBigger(tile);
@@ -624,10 +626,9 @@
 		return;
 	}
 
-#define SET_AND_ANIMATE(tile, a, b)   { SetIndustryGfx(tile, a); _m[tile].m1 = b; AddAnimatedTile(tile); }
-#define SET_AND_UNANIMATE(tile, a, b) { SetIndustryGfx(tile, a); _m[tile].m1 = b; DeleteAnimatedTile(tile); }
+	gfx = GetIndustryGfx(tile);
 
-	switch (GetIndustryGfx(tile)) {
+	switch (gfx) {
 	case GFX_OILRIG_1: // coast line at oilrigs
 	case GFX_OILRIG_2:
 	case GFX_OILRIG_3:
@@ -637,38 +638,42 @@
 		break;
 
 	case GFX_COAL_MINE_TOWER_NOT_ANIMATED:
-		if (!(_tick_counter & 0x400) && CHANCE16(1,2))
-			SET_AND_ANIMATE(tile, GFX_COAL_MINE_TOWER_ANIMATED, 0x80);
-		break;
-
 	case GFX_COPPER_MINE_TOWER_NOT_ANIMATED:
-		if (!(_tick_counter & 0x400) && CHANCE16(1,2))
-			SET_AND_ANIMATE(tile, GFX_COPPER_MINE_TOWER_ANIMATED, 0x80);
-		break;
-
 	case GFX_GOLD_MINE_TOWER_NOT_ANIMATED:
-		if (!(_tick_counter & 0x400) && CHANCE16(1,2))
-			SET_AND_ANIMATE(tile, GFX_GOLD_MINE_TOWER_ANIMATED, 0x80);
+		if (!(_tick_counter & 0x400) && CHANCE16(1, 2)) {
+			switch (gfx) {
+				case GFX_COAL_MINE_TOWER_NOT_ANIMATED:   gfx = GFX_COAL_MINE_TOWER_ANIMATED;   break;
+				case GFX_COPPER_MINE_TOWER_NOT_ANIMATED: gfx = GFX_COPPER_MINE_TOWER_ANIMATED; break;
+				case GFX_GOLD_MINE_TOWER_NOT_ANIMATED:   gfx = GFX_GOLD_MINE_TOWER_ANIMATED;   break;
+			}
+			SetIndustryGfx(tile, gfx);
+			SetIndustryAnimationState(tile, 0x80);
+			AddAnimatedTile(tile);
+		}
 		break;
 
 	case GFX_OILWELL_NOT_ANIMATED:
-		if (CHANCE16(1,6))
-			SET_AND_ANIMATE(tile, GFX_OILWELL_ANIMATED_1, 0x80);
+		if (CHANCE16(1, 6)) {
+			SetIndustryGfx(tile, GFX_OILWELL_ANIMATED_1);
+			SetIndustryAnimationState(tile, 0);
+			AddAnimatedTile(tile);
+		}
 		break;
 
 	case GFX_COAL_MINE_TOWER_ANIMATED:
-		if (!(_tick_counter & 0x400))
-			SET_AND_UNANIMATE(tile, GFX_COAL_MINE_TOWER_NOT_ANIMATED, 0x83);
-		break;
-
 	case GFX_COPPER_MINE_TOWER_ANIMATED:
-		if (!(_tick_counter & 0x400))
-			SET_AND_UNANIMATE(tile, GFX_COPPER_MINE_TOWER_NOT_ANIMATED, 0x83);
-		break;
-
 	case GFX_GOLD_MINE_TOWER_ANIMATED:
-		if (!(_tick_counter & 0x400))
-			SET_AND_UNANIMATE(tile, GFX_GOLD_MINE_TOWER_NOT_ANIMATED, 0x83);
+		if (!(_tick_counter & 0x400)) {
+			switch (gfx) {
+				case GFX_COAL_MINE_TOWER_ANIMATED:   gfx = GFX_COAL_MINE_TOWER_NOT_ANIMATED;   break;
+				case GFX_COPPER_MINE_TOWER_ANIMATED: gfx = GFX_COPPER_MINE_TOWER_NOT_ANIMATED; break;
+				case GFX_GOLD_MINE_TOWER_ANIMATED:   gfx = GFX_GOLD_MINE_TOWER_NOT_ANIMATED;   break;
+			}
+			SetIndustryGfx(tile, gfx);
+			SetIndustryCompleted(tile, true);
+			SetIndustryConstructionStage(tile, 3);
+			DeleteAnimatedTile(tile);
+		}
 		break;
 
 	case GFX_POWERPLANT_SPARKS:
@@ -1408,7 +1413,10 @@
 			DoCommand(cur_tile, 0, 0, DC_EXEC, CMD_LANDSCAPE_CLEAR);
 
 			MakeIndustry(cur_tile, i->index, it->gfx);
-			if (_generating_world) _m[cur_tile].m1 = 0x1E; /* maturity */
+			if (_generating_world) {
+				SetIndustryConstructionCounter(cur_tile, 3);
+				SetIndustryConstructionStage(cur_tile, 2);
+			}
 		}
 	} while ((++it)->ti.x != -0x80);
 
--- a/industry_map.h	Sat Dec 30 11:41:54 2006 +0000
+++ b/industry_map.h	Sat Dec 30 11:51:37 2006 +0000
@@ -233,4 +233,64 @@
 	_m[tile].m4 = count;
 }
 
+/**
+ * Get the animation state
+ * @param tile the tile to get the animation state of
+ * @pre IsTileType(tile, MP_INDUSTRY)
+ */
+static inline byte GetIndustryAnimationState(TileIndex tile)
+{
+	assert(IsTileType(tile, MP_INDUSTRY));
+	switch (GetIndustryGfx(tile)) {
+		case GFX_POWERPLANT_SPARKS:
+			return GB(_m[tile].m1, 2, 5);
+			break;
+
+		case GFX_OILWELL_ANIMATED_1:
+		case GFX_OILWELL_ANIMATED_2:
+		case GFX_OILWELL_ANIMATED_3:
+			return GB(_m[tile].m1, 0, 2);
+
+		case GFX_COAL_MINE_TOWER_ANIMATED:
+		case GFX_COPPER_MINE_TOWER_ANIMATED:
+		case GFX_GOLD_MINE_TOWER_ANIMATED:
+			return _m[tile].m1;
+
+		default:
+			return _m[tile].m3;
+	}
+}
+
+/**
+ * Set the animation state
+ * @param tile the tile to set the animation state of
+ * @param count the new animation state
+ * @pre IsTileType(tile, MP_INDUSTRY)
+ */
+static inline void SetIndustryAnimationState(TileIndex tile, byte state)
+{
+	assert(IsTileType(tile, MP_INDUSTRY));
+	switch (GetIndustryGfx(tile)) {
+		case GFX_POWERPLANT_SPARKS:
+			SB(_m[tile].m1, 2, 5, state);
+			break;
+
+		case GFX_OILWELL_ANIMATED_1:
+		case GFX_OILWELL_ANIMATED_2:
+		case GFX_OILWELL_ANIMATED_3:
+			SB(_m[tile].m1, 0, 2, state);
+			break;
+
+		case GFX_COAL_MINE_TOWER_ANIMATED:
+		case GFX_COPPER_MINE_TOWER_ANIMATED:
+		case GFX_GOLD_MINE_TOWER_ANIMATED:
+			_m[tile].m1 = state;
+			break;
+
+		default:
+			_m[tile].m3 = state;
+			break;
+	}
+}
+
 #endif /* INDUSTRY_MAP_H */