diff --git a/bridge_map.h b/bridge_map.h index 34da494bfb..1cda0da9da 100644 --- a/bridge_map.h +++ b/bridge_map.h @@ -81,6 +81,19 @@ static inline TransportType GetBridgeTransportType(TileIndex t) } +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 */ diff --git a/tunnel_map.h b/tunnel_map.h index 9ad54d07ed..c9a3a36a39 100644 --- a/tunnel_map.h +++ b/tunnel_map.h @@ -35,6 +35,18 @@ static inline TransportType GetTunnelTransportType(TileIndex t) 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); diff --git a/tunnelbridge_cmd.c b/tunnelbridge_cmd.c index a3c2ba4785..7e38814c43 100644 --- a/tunnelbridge_cmd.c +++ b/tunnelbridge_cmd.c @@ -798,7 +798,6 @@ uint GetBridgeFoundation(Slope tileh, Axis axis) 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 @@ static void DrawTile_TunnelBridge(TileInfo *ti) 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 @@ static void DrawTile_TunnelBridge(TileInfo *ti) 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 AnimateTile_TunnelBridge(TileIndex tile) 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;