From abbc38728ed8147a845bfe484e5317ee8bf3e744 Mon Sep 17 00:00:00 2001 From: Pavel Stupnikov Date: Wed, 5 Feb 2020 00:44:34 +0300 Subject: [PATCH] Tint every grount/structure tile when using new highlights --- bin/data/cmclient-2.grf | Bin 95266 -> 96151 bytes grf/cmclient.nml | 35 +++++--- grf/recolourgen.py | 15 ++-- grf/sprites/innerhighlight00.png | Bin 4666 -> 4295 bytes src/citymania/zoning.cpp | 134 ++++++++++++++++++------------- src/citymania/zoning.hpp | 3 + src/industry_cmd.cpp | 8 +- src/rev.cpp | 2 +- src/table/sprites.h | 40 ++++----- src/town_cmd.cpp | 5 +- src/viewport.cpp | 13 +-- src/zoning_cmd.cpp | 19 ++--- 12 files changed, 154 insertions(+), 120 deletions(-) diff --git a/bin/data/cmclient-2.grf b/bin/data/cmclient-2.grf index 3de68ee384b4cbb2167fae5104242185b2e1bbcb..a36612fc2552d4d8624e20acde7e4195afea1e48 100644 GIT binary patch delta 4860 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 delta 3951 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 FCIAEj%H99~ delta 3889 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[j] == CT_INVALID) continue; + if (ind->last_month_production[j] == 0 && ind->this_month_production[j] == 0) continue; + n_produced++; + if (ind->last_month_transported[j] > 0 || ind->last_month_transported[j] > 0) + n_serviced++; + } + if (n_serviced < n_produced) + return (n_serviced == 0 ? PALETTE_TINT_RED_DEEP : PALETTE_TINT_ORANGE_DEEP); + return PAL_NONE; +} + TileHighlight GetTileHighlight(const TileInfo *ti) { TileHighlight th; + if (ti->tile == INVALID_TILE) return th; if (_zoning.outer == CHECKTOWNZONES) { auto p = GetTownZoneBorder(ti->tile); th.border = p.first; + auto pal = PAL_NONE; switch (p.second) { - default: th.border_color = SPR_PALETTE_ZONING_WHITE; break; // Tz0 - case 2: th.border_color = SPR_PALETTE_ZONING_YELLOW; break; // Tz1 - case 3: th.border_color = SPR_PALETTE_ZONING_ORANGE; break; // Tz2 - case 4: th.border_color = SPR_PALETTE_ZONING_ORANGE; break; // Tz3 - case 5: th.border_color = SPR_PALETTE_ZONING_RED; break; // Tz4 - center + default: break; // Tz0 + case 1: th.border_color = SPR_PALETTE_ZONING_WHITE; pal = PALETTE_TINT_WHITE; break; // Tz0 + case 2: th.border_color = SPR_PALETTE_ZONING_YELLOW; pal = PALETTE_TINT_YELLOW; break; // Tz1 + case 3: th.border_color = SPR_PALETTE_ZONING_ORANGE; pal = PALETTE_TINT_ORANGE; break; // Tz2 + case 4: th.border_color = SPR_PALETTE_ZONING_ORANGE; pal = PALETTE_TINT_ORANGE; break; // Tz3 + case 5: th.border_color = SPR_PALETTE_ZONING_RED; pal = PALETTE_TINT_RED; break; // Tz4 - center }; - } else if (_zoning.outer == CHECKBULUNSER || _zoning.outer == CHECKINDUNSER) { - // handled in house drawing + th.ground_pal = th.structure_pal = pal; } else if (_zoning.outer == CHECKSTACATCH) { th.border = citymania::GetAnyStationCatchmentBorder(ti->tile); th.border_color = SPR_PALETTE_ZONING_LIGHT_BLUE; + } else if (_zoning.outer == CHECKTOWNGROWTHTILES) { + auto tgt = max(_towns_growth_tiles[ti->tile], _towns_growth_tiles_last_month[ti->tile]); + // if (tgt == TGTS_NEW_HOUSE) th.sprite = SPR_IMG_HOUSE_NEW; + switch (tgt) { + case TGTS_CB_HOUSE_REMOVED_NOGROW: + case TGTS_RH_REMOVED: + th.selection = SPR_PALETTE_ZONING_LIGHT_BLUE; + th.ground_pal = PALETTE_TINT_CYAN; + break; + case TGTS_RH_REBUILT: + th.selection = SPR_PALETTE_ZONING_WHITE; + th.ground_pal = th.structure_pal = PALETTE_TINT_WHITE; + break; + case TGTS_NEW_HOUSE: + th.selection = SPR_PALETTE_ZONING_GREEN; + th.ground_pal = th.structure_pal = PALETTE_TINT_GREEN; + break; + case TGTS_CYCLE_SKIPPED: + th.selection = SPR_PALETTE_ZONING_ORANGE; + th.ground_pal = PALETTE_TINT_ORANGE; + break; + case TGTS_HOUSE_SKIPPED: + th.selection = SPR_PALETTE_ZONING_YELLOW; + th.ground_pal = PALETTE_TINT_YELLOW; + break; + case TGTS_CB_HOUSE_REMOVED: + th.selection = SPR_PALETTE_ZONING_RED; + th.ground_pal = PALETTE_TINT_RED; + break; + default: th.selection = PAL_NONE; + } + } else if (_zoning.outer == CHECKBULUNSER) { + if (IsTileType (ti->tile, MP_HOUSE)) { + StationFinder stations(TileArea(ti->tile, 1, 1)); + + // TODO check cargos + if (stations.GetStations()->empty()) + th.ground_pal = th.structure_pal = PALETTE_TINT_RED_DEEP; + } + } else if (_zoning.outer == CHECKINDUNSER) { + auto pal = GetIndustryZoningPalette(ti->tile); + if (pal) th.ground_pal = th.structure_pal = PALETTE_TINT_RED_DEEP; } return th; } @@ -73,6 +134,14 @@ TileHighlight GetTileHighlight(const TileInfo *ti) { void DrawTileSelection(const TileInfo *ti, const TileHighlight &th) { if (th.border != ZoningBorder::NONE) DrawBorderSprites(ti, th.border, th.border_color); + if (th.sprite) { + DrawSelectionSprite(th.sprite, PAL_NONE, ti, 0, FOUNDATION_PART_NORMAL); + } + if (th.selection) { + DrawBorderSprites(ti, ZoningBorder::FULL, th.selection); + // DrawSelectionSprite(SPR_SELECT_TILE + _tileh_to_sprite[ti->tileh], + // th.selection, ti, 0, FOUNDATION_PART_NORMAL); + } } void AllocateZoningMap(uint map_size) { @@ -192,55 +261,4 @@ ZoningBorder GetAnyStationCatchmentBorder(TileIndex tile) { return border; } -SpriteID GetTownTileZoningPalette(TileIndex tile) { - if (_zoning.outer == CHECKBULUNSER) { - StationFinder stations(TileArea(tile, 1, 1)); - - if (stations.GetStations()->empty()) - return SPR_RECOLOUR_RED; - } else if (_zoning.outer == CHECKTOWNZONES) { - HouseZonesBits next_zone = HZB_BEGIN, tz = HZB_END; - - for (Town *town : Town::Iterate()) { - uint dist = DistanceSquare(tile, town->xy); - // town code uses <= for checking town borders (tz0) but < for other zones - while (next_zone < HZB_END - && (town->cache.squared_town_zone_radius[next_zone] == 0 - || dist <= town->cache.squared_town_zone_radius[next_zone] - (next_zone == HZB_BEGIN ? 0 : 1)) - ){ - if(town->cache.squared_town_zone_radius[next_zone] != 0) tz = next_zone; - next_zone++; - } - } - - switch (tz) { - case HZB_TOWN_EDGE: return SPR_RECOLOUR_WHITE; // Tz0 - case HZB_TOWN_OUTSKIRT: return SPR_RECOLOUR_YELLOW; // Tz1 - case HZB_TOWN_OUTER_SUBURB: return SPR_RECOLOUR_ORANGE; // Tz2 - case HZB_TOWN_INNER_SUBURB: return SPR_RECOLOUR_ORANGE; // Tz3 - case HZB_TOWN_CENTRE: return SPR_RECOLOUR_RED; // Tz4 - center - default: return PAL_NONE; // no town - } - } - return PAL_NONE; -} - -SpriteID GetIndustryTileZoningPalette(TileIndex tile, Industry *ind) { - if (_zoning.outer == CHECKINDUNSER) { - auto n_produced = 0; - auto n_serviced = 0; - for (auto j = 0; j < INDUSTRY_NUM_OUTPUTS; j++) { - if (ind->produced_cargo[j] == CT_INVALID) continue; - if (ind->last_month_production[j] == 0 && ind->this_month_production[j] == 0) continue; - n_produced++; - if (ind->last_month_transported[j] > 0 || ind->last_month_transported[j] > 0) - n_serviced++; - } - if (n_serviced < n_produced) - return (n_serviced == 0 ? SPR_RECOLOUR_RED : SPR_RECOLOUR_ORANGE); - } - - return PAL_NONE; -} - } // namespace citymania diff --git a/src/citymania/zoning.hpp b/src/citymania/zoning.hpp index 5d540357ba..c346c7c786 100644 --- a/src/citymania/zoning.hpp +++ b/src/citymania/zoning.hpp @@ -23,12 +23,15 @@ enum ZoningBorder: uint8 { RIGHT_CORNER = 32, BOTTOM_CORNER = 64, LEFT_CORNER = 128, + FULL = TOP_LEFT | TOP_RIGHT | BOTTOM_LEFT | BOTTOM_RIGHT, }; class TileHighlight { public: SpriteID ground_pal = PAL_NONE; SpriteID structure_pal = PAL_NONE; + SpriteID sprite = 0; + SpriteID selection = PAL_NONE; ZoningBorder border = ZoningBorder::NONE; SpriteID border_color; }; diff --git a/src/industry_cmd.cpp b/src/industry_cmd.cpp index 90b9b6cf65..b76367c877 100644 --- a/src/industry_cmd.cpp +++ b/src/industry_cmd.cpp @@ -44,8 +44,6 @@ #include "table/industry_land.h" #include "table/build_industry.h" -#include "citymania/zoning.hpp" - #include "safeguards.h" IndustryPool _industry_pool("Industry"); @@ -350,14 +348,12 @@ static void DrawTile_Industry(TileInfo *ti) /* DrawFoundation() modifies ti->z and ti->tileh */ if (ti->tileh != SLOPE_FLAT) DrawFoundation(ti, FOUNDATION_LEVELED); - auto zoning_pal = citymania::GetIndustryTileZoningPalette(ti->tile, ind); - /* If the ground sprite is the default flat water sprite, draw also canal/river borders. * Do not do this if the tile's WaterClass is 'land'. */ if (image == SPR_FLAT_WATER_TILE && IsTileOnWater(ti->tile)) { DrawWaterClassGround(ti); } else { - DrawGroundSprite(image, zoning_pal == PAL_NONE ? GroundSpritePaletteTransform(image, dits->ground.pal, GENERAL_SPRITE_COLOUR(ind->random_colour)) : zoning_pal); + DrawGroundSprite(image, GroundSpritePaletteTransform(image, dits->ground.pal, GENERAL_SPRITE_COLOUR(ind->random_colour))); // DrawGroundSprite(image, GroundSpritePaletteTransform(image, dits->ground.pal, GENERAL_SPRITE_COLOUR(ind->random_colour))); } @@ -367,7 +363,7 @@ static void DrawTile_Industry(TileInfo *ti) /* Add industry on top of the ground? */ image = dits->building.sprite; if (image != 0) { - AddSortableSpriteToDraw(image, zoning_pal == PAL_NONE ? SpriteLayoutPaletteTransform(image, dits->building.pal, GENERAL_SPRITE_COLOUR(ind->random_colour)) : zoning_pal, + AddSortableSpriteToDraw(image, SpriteLayoutPaletteTransform(image, dits->building.pal, GENERAL_SPRITE_COLOUR(ind->random_colour)), ti->x + dits->subtile_x, ti->y + dits->subtile_y, dits->width, diff --git a/src/rev.cpp b/src/rev.cpp index 16bc31d965..f507c0b488 100644 --- a/src/rev.cpp +++ b/src/rev.cpp @@ -83,4 +83,4 @@ const byte _openttd_revision_tagged = 1; const uint32 _openttd_newgrf_version = 1 << 28 | 10 << 24 | 0 << 20 | 0 << 19 | 28004; -const char _citymania_version[] = "20200203-master-md10a631d93 03.02.20"; +const char _citymania_version[] = "20200204-master-ma3890d4e5f 04.02.20"; diff --git a/src/table/sprites.h b/src/table/sprites.h index 9757c7253d..513cdf89ee 100644 --- a/src/table/sprites.h +++ b/src/table/sprites.h @@ -305,29 +305,33 @@ static const uint16 PALETTE_SPRITE_COUNT = 1; static const SpriteID SPR_INNER_HIGHLIGHT_BASE = SPR_PALETTE_BASE + PALETTE_SPRITE_COUNT; static const SpriteID SPR_IMG_COMPANY_CARGO = SPR_INNER_HIGHLIGHT_BASE + 19; static const SpriteID SPR_IMG_COMPANY_GOAL = SPR_INNER_HIGHLIGHT_BASE + 20; -static const SpriteID SPR_PALETTE_ZONING_RED = SPR_INNER_HIGHLIGHT_BASE + 21; -static const SpriteID SPR_PALETTE_ZONING_GREEN = SPR_INNER_HIGHLIGHT_BASE + 22; -static const SpriteID SPR_PALETTE_ZONING_BLACK = SPR_INNER_HIGHLIGHT_BASE + 23; -static const SpriteID SPR_PALETTE_ZONING_LIGHT_BLUE = SPR_INNER_HIGHLIGHT_BASE + 24; -static const SpriteID SPR_PALETTE_ZONING_ORANGE = SPR_INNER_HIGHLIGHT_BASE + 25; -static const SpriteID SPR_PALETTE_ZONING_WHITE = SPR_INNER_HIGHLIGHT_BASE + 26; -static const SpriteID SPR_PALETTE_ZONING_YELLOW = SPR_INNER_HIGHLIGHT_BASE + 27; -static const SpriteID SPR_PALETTE_ZONING_PURPLE = SPR_INNER_HIGHLIGHT_BASE + 28; -static const SpriteID SPR_INNER_HIGHLIGHT_COUNT = 29; +static const SpriteID SPR_IMG_HOUSE_NEW = SPR_INNER_HIGHLIGHT_BASE + 21; +static const SpriteID SPR_PALETTE_ZONING_RED = SPR_INNER_HIGHLIGHT_BASE + 22; +static const SpriteID SPR_PALETTE_ZONING_GREEN = SPR_INNER_HIGHLIGHT_BASE + 23; +static const SpriteID SPR_PALETTE_ZONING_BLACK = SPR_INNER_HIGHLIGHT_BASE + 24; +static const SpriteID SPR_PALETTE_ZONING_LIGHT_BLUE = SPR_INNER_HIGHLIGHT_BASE + 25; +static const SpriteID SPR_PALETTE_ZONING_ORANGE = SPR_INNER_HIGHLIGHT_BASE + 26; +static const SpriteID SPR_PALETTE_ZONING_WHITE = SPR_INNER_HIGHLIGHT_BASE + 27; +static const SpriteID SPR_PALETTE_ZONING_YELLOW = SPR_INNER_HIGHLIGHT_BASE + 28; +static const SpriteID SPR_PALETTE_ZONING_PURPLE = SPR_INNER_HIGHLIGHT_BASE + 29; +static const SpriteID SPR_INNER_HIGHLIGHT_COUNT = 30; static const SpriteID SPR_BORDER_HIGHLIGHT_BASE = SPR_INNER_HIGHLIGHT_BASE + SPR_INNER_HIGHLIGHT_COUNT + 1; static const SpriteID SPR_BORDER_HIGHLIGHT_COUNT = 19 * 19; -static const SpriteID SPR_RECOLOUR_BASE = SPR_BORDER_HIGHLIGHT_BASE + SPR_BORDER_HIGHLIGHT_COUNT; -static const SpriteID SPR_RECOLOUR_RED = SPR_RECOLOUR_BASE; -static const SpriteID SPR_RECOLOUR_ORANGE = SPR_RECOLOUR_BASE + 1; -static const SpriteID SPR_RECOLOUR_YELLOW = SPR_RECOLOUR_BASE + 2; -static const SpriteID SPR_RECOLOUR_YELLOW_WHITE = SPR_RECOLOUR_BASE + 3; -static const SpriteID SPR_RECOLOUR_WHITE = SPR_RECOLOUR_BASE + 4; -static const SpriteID SPR_RECOLOUR_GREEN = SPR_RECOLOUR_BASE + 5; -static const SpriteID SPR_RECOLOUR_COUNT = 5; +static const SpriteID PALETTE_TINT_BASE = SPR_BORDER_HIGHLIGHT_BASE + SPR_BORDER_HIGHLIGHT_COUNT; +static const SpriteID PALETTE_TINT_RED_DEEP = PALETTE_TINT_BASE; +static const SpriteID PALETTE_TINT_ORANGE_DEEP = PALETTE_TINT_BASE + 1; +static const SpriteID PALETTE_TINT_RED = PALETTE_TINT_BASE + 2; +static const SpriteID PALETTE_TINT_ORANGE = PALETTE_TINT_BASE + 3; +static const SpriteID PALETTE_TINT_YELLOW = PALETTE_TINT_BASE + 4; +static const SpriteID PALETTE_TINT_YELLOW_WHITE = PALETTE_TINT_BASE + 5; +static const SpriteID PALETTE_TINT_WHITE = PALETTE_TINT_BASE + 6; +static const SpriteID PALETTE_TINT_GREEN = PALETTE_TINT_BASE + 7; +static const SpriteID PALETTE_TINT_CYAN = PALETTE_TINT_BASE + 8; +static const SpriteID PALETTE_TINT_COUNT = 8; /* From where can we start putting NewGRFs? */ -static const SpriteID SPR_NEWGRFS_BASE = SPR_RECOLOUR_BASE + SPR_RECOLOUR_COUNT; +static const SpriteID SPR_NEWGRFS_BASE = PALETTE_TINT_BASE + PALETTE_TINT_COUNT; /* Manager face sprites */ static const SpriteID SPR_GRADIENT = 874; // background gradient behind manager face diff --git a/src/town_cmd.cpp b/src/town_cmd.cpp index c2f2ed17d9..4e709acfe8 100644 --- a/src/town_cmd.cpp +++ b/src/town_cmd.cpp @@ -301,8 +301,7 @@ static void DrawTile_Town(TileInfo *ti) if (ti->tileh != SLOPE_FLAT) DrawFoundation(ti, FOUNDATION_LEVELED); - auto zoning_pal = citymania::GetTownTileZoningPalette(ti->tile); - DrawGroundSprite(dcts->ground.sprite, zoning_pal == PAL_NONE ? dcts->ground.pal : zoning_pal); + DrawGroundSprite(dcts->ground.sprite, dcts->ground.pal); /* If houses are invisible, do not draw the upper part */ if (IsInvisibilitySet(TO_HOUSES)) return; @@ -310,7 +309,7 @@ static void DrawTile_Town(TileInfo *ti) /* Add a house on top of the ground? */ SpriteID image = dcts->building.sprite; if (image != 0) { - AddSortableSpriteToDraw(image, zoning_pal == PAL_NONE ? dcts->building.pal : zoning_pal, + AddSortableSpriteToDraw(image, dcts->building.pal, ti->x + dcts->subtile_x, ti->y + dcts->subtile_y, dcts->width, diff --git a/src/viewport.cpp b/src/viewport.cpp index 4bdd7fbf2c..4671cd5e08 100644 --- a/src/viewport.cpp +++ b/src/viewport.cpp @@ -205,7 +205,7 @@ struct ViewportDrawer { int *last_foundation_child[FOUNDATION_PART_END]; ///< Tail of ChildSprite list of the foundations. (index into child_screen_sprites_to_draw) Point foundation_offset[FOUNDATION_PART_END]; ///< Pixel offset for ground sprites on the foundations. - citymania::TileHighlight zoning; + citymania::TileHighlight cm_highlight; }; static void MarkViewportDirty(const ViewPort *vp, int left, int top, int right, int bottom); @@ -594,7 +594,7 @@ void DrawGroundSpriteAt(SpriteID image, PaletteID pal, int32 x, int32 y, int z, { /* Switch to first foundation part, if no foundation was drawn */ if (_vd.foundation_part == FOUNDATION_PART_NONE) _vd.foundation_part = FOUNDATION_PART_NORMAL; - + if (_vd.cm_highlight.ground_pal) pal = _vd.cm_highlight.ground_pal; if (_vd.foundation[_vd.foundation_part] != -1) { Point pt = RemapCoords(x, y, z); AddChildSpriteToFoundation(image, pal, sub, _vd.foundation_part, pt.x + extra_offs_x * ZOOM_LVL_BASE, pt.y + extra_offs_y * ZOOM_LVL_BASE); @@ -703,6 +703,8 @@ void AddSortableSpriteToDraw(SpriteID image, PaletteID pal, int x, int y, int w, assert((image & SPRITE_MASK) < MAX_SPRITES); + if (_vd.cm_highlight.structure_pal) pal = _vd.cm_highlight.structure_pal; + /* make the sprites transparent with the right palette */ if (transparent) { SetBit(image, PALETTE_MODIFIER_TRANSPARENT); @@ -1118,9 +1120,6 @@ static void DrawTileSelection(const TileInfo *ti) /* Highlight tiles insede local authority of selected towns. */ HighlightTownLocalAuthorityTiles(ti); - auto cmth = citymania::GetTileHighlight(ti); - citymania::DrawTileSelection(ti, cmth); - /* Draw a red error square? */ bool is_redsq = _thd.redsq == ti->tile; if (is_redsq) DrawTileSelectionRect(ti, PALETTE_TILE_RED_PULSATING); @@ -1323,16 +1322,20 @@ static void ViewportAddLandscape() _vd.foundation[1] = -1; _vd.last_foundation_child[0] = nullptr; _vd.last_foundation_child[1] = nullptr; + _vd.cm_highlight = citymania::GetTileHighlight(&tile_info); _tile_type_procs[tile_type]->draw_tile_proc(&tile_info); + if (tile_info.tile != INVALID_TILE){ DrawTileZoning(&tile_info); + citymania::DrawTileSelection(&tile_info, _vd.cm_highlight); DrawIndustryForbiddenTiles(&tile_info); DrawTileSelection(&tile_info); } } } } + _vd.cm_highlight = citymania::TileHighlight(); } /** diff --git a/src/zoning_cmd.cpp b/src/zoning_cmd.cpp index fd53cd6f8c..43c827dbb4 100644 --- a/src/zoning_cmd.cpp +++ b/src/zoning_cmd.cpp @@ -419,22 +419,15 @@ void DrawBorderSprites(const TileInfo *ti, citymania::ZoningBorder border, Sprit */ void DrawTileZoning(const TileInfo *ti) { - // AddSortableSpriteToDraw((SPR_FLAT_BARE_LAND|(1U << PALETTE_MODIFIER_TRANSPARENT)) + _tileh_to_sprite[ti->tileh], - // SPR_RECOLOUR_RED, ti->x, ti->y, 0x10, 0x10, 1, ti->z); - // AddSortableSpriteToDraw(SPR_FLAT_BARE_LAND + _tileh_to_sprite[ti->tileh], SPR_RECOLOUR_RED, ti->x, ti->y, 0x10, 0x10, 1, ti->z + 7, false); if(_zoning.outer == CHECKNOTHING && _zoning.inner == CHECKNOTHING) return; //nothing to do if (_game_mode != GM_NORMAL || ti->tile >= MapSize() || IsTileType(ti->tile, MP_VOID)) return; //check invalid if (_zoning.outer != CHECKNOTHING){ - if (_zoning.outer == CHECKTOWNZONES) { - // auto p = citymania::GetTownZoneBorder(ti->tile); - // if (p.first && p.second) { - // DrawBorderSprites(ti, p.first, GetTownZoneBorderColor(p.second)); - // } - } else if (_zoning.outer == CHECKBULUNSER || _zoning.outer == CHECKINDUNSER) { - // handled in house drawing - } else if (_zoning.outer == CHECKSTACATCH) { - // auto b = citymania::GetAnyStationCatchmentBorder(ti->tile); - // DrawBorderSprites(ti, b, SPR_PALETTE_ZONING_LIGHT_BLUE); + if (_zoning.outer == CHECKTOWNZONES || + _zoning.outer == CHECKBULUNSER || + _zoning.outer == CHECKINDUNSER || + _zoning.outer == CHECKSTACATCH || + _zoning.outer == CHECKTOWNGROWTHTILES) { + // handled by citymania zoning } else { DrawZoningSprites(SPR_SELECT_TILE, TileZoningSpriteEvaluation(ti->tile, _local_company, _zoning.outer), ti); }