(svn r7607) -Codechange: remove direct map accesses for snow/desert on tunnels and bridges.
authorrubidium
Fri, 29 Dec 2006 09:10:44 +0000
changeset 5410 2dae82c6ea63
parent 5409 725ef180e977
child 5411 9ad8285b2f0d
(svn r7607) -Codechange: remove direct map accesses for snow/desert on tunnels and bridges.
bridge_map.h
tunnel_map.h
tunnelbridge_cmd.c
--- a/bridge_map.h	Fri Dec 29 07:49:51 2006 +0000
+++ b/bridge_map.h	Fri Dec 29 09:10:44 2006 +0000
@@ -81,6 +81,19 @@
 }
 
 
+static inline bool HasBridgeSnowOrDesert(TileIndex t)
+{
+	assert(IsBridgeTile(t));
+	return HASBIT(_m[t].m4, 7);
+}
+
+
+static inline void SetBridgeSnowOrDesert(TileIndex t, bool snow_or_desert)
+{
+	assert(IsBridgeTile(t));
+	SB(_m[t].m4, 7, 1, snow_or_desert);
+}
+
 /**
  * Finds the end of a bridge in the specified direction starting at a middle tile
  */
--- a/tunnel_map.h	Fri Dec 29 07:49:51 2006 +0000
+++ b/tunnel_map.h	Fri Dec 29 09:10:44 2006 +0000
@@ -35,6 +35,18 @@
 	return (TransportType)GB(_m[t].m5, 2, 2);
 }
 
+static inline bool HasTunnelSnowOrDesert(TileIndex t)
+{
+	assert(IsTunnelTile(t));
+	return HASBIT(_m[t].m4, 7);
+}
+
+static inline void SetTunnelSnowOrDesert(TileIndex t, bool snow_or_desert)
+{
+	assert(IsTunnelTile(t));
+	SB(_m[t].m4, 7, 1, snow_or_desert);
+}
+
 
 TileIndex GetOtherTunnelEnd(TileIndex);
 bool IsTunnelInWay(TileIndex, uint z);
--- a/tunnelbridge_cmd.c	Fri Dec 29 07:49:51 2006 +0000
+++ b/tunnelbridge_cmd.c	Fri Dec 29 09:10:44 2006 +0000
@@ -798,7 +798,6 @@
 static void DrawTile_TunnelBridge(TileInfo *ti)
 {
 	uint32 image;
-	bool ice = _m[ti->tile].m4 & 0x80;
 
 	if (IsTunnel(ti->tile)) {
 		if (GetTunnelTransportType(ti->tile) == TRANSPORT_RAIL) {
@@ -807,7 +806,7 @@
 			image = SPR_TUNNEL_ENTRY_REAR_ROAD;
 		}
 
-		if (ice) image += 32;
+		if (HasTunnelSnowOrDesert(ti->tile)) image += 32;
 
 		image += GetTunnelDirection(ti->tile) * 2;
 		DrawGroundSprite(image);
@@ -817,6 +816,7 @@
 		DrawBridgeMiddle(ti);
 	} else if (IsBridge(ti->tile)) { // XXX is this necessary?
 		int base_offset;
+		bool ice = HasBridgeSnowOrDesert(ti->tile);
 
 		if (GetBridgeTransportType(ti->tile) == TRANSPORT_RAIL) {
 			base_offset = GetRailTypeInfo(GetRailType(ti->tile))->bridge_offset;
@@ -1109,17 +1109,26 @@
 
 static void TileLoop_TunnelBridge(TileIndex tile)
 {
+	bool snow_or_desert = IsTunnelTile(tile) ? HasTunnelSnowOrDesert(tile) : HasBridgeSnowOrDesert(tile);
 	switch (_opt.landscape) {
 		case LT_HILLY:
-			if (HASBIT(_m[tile].m4, 7) != (GetTileZ(tile) > _opt.snow_line)) {
-				TOGGLEBIT(_m[tile].m4, 7);
+			if (snow_or_desert != (GetTileZ(tile) > _opt.snow_line)) {
+				if (IsTunnelTile(tile)) {
+					SetTunnelSnowOrDesert(tile, !snow_or_desert);
+				} else {
+					SetBridgeSnowOrDesert(tile, !snow_or_desert);
+				}
 				MarkTileDirtyByTile(tile);
 			}
 			break;
 
 		case LT_DESERT:
-			if (GetTropicZone(tile) == TROPICZONE_DESERT && !(_m[tile].m4 & 0x80)) {
-				_m[tile].m4 |= 0x80;
+			if (GetTropicZone(tile) == TROPICZONE_DESERT && !snow_or_desert) {
+				if (IsTunnelTile(tile)) {
+					SetTunnelSnowOrDesert(tile, true);
+				} else {
+					SetBridgeSnowOrDesert(tile, true);
+				}
 				MarkTileDirtyByTile(tile);
 			}
 			break;