diff --git a/src/clear_cmd.cpp b/src/clear_cmd.cpp index a47cda5181..c093ecaf64 100644 --- a/src/clear_cmd.cpp +++ b/src/clear_cmd.cpp @@ -25,13 +25,15 @@ static CommandCost ClearTile_Clear(TileIndex tile, DoCommandFlags flags) { - static constexpr Price clear_price_table[] = { - Price::ClearGrass, - Price::ClearRough, - Price::ClearRocks, - Price::ClearFields, - Price::ClearRough, - Price::ClearRough, + static constexpr Price clear_price_table[to_underlying(ClearGround::MaxSize)] = { + Price::ClearGrass, // Base price for clearing grass. + Price::ClearRough, // Base price for clearing rough land. + Price::ClearRocks, // Base price for clearing rocks. + Price::ClearFields, // Base price for clearing fields. + Price::ClearRough, // Unused. + Price::ClearRough, // Base price for clearing desert. + Price::ClearRough, // Unused. + Price::ClearRough, // Unused. }; CommandCost price(EXPENSES_CONSTRUCTION); @@ -154,6 +156,9 @@ static void DrawTile_Clear(TileInfo *ti) case ClearGround::Desert: DrawGroundSprite(_clear_land_sprites_snow_desert[GetClearDensity(ti->tile)] + SlopeToSpriteOffset(ti->tileh), PAL_NONE); break; + + default: + NOT_REACHED(); } DrawBridgeMiddle(ti, {}); @@ -370,13 +375,15 @@ static TrackStatus GetTileTrackStatus_Clear(TileIndex, TransportType, uint, Diag static void GetTileDesc_Clear(TileIndex tile, TileDesc &td) { /* Each pair holds a normal and a snowy ClearGround description. */ - static constexpr std::pair clear_land_str[] = { - {STR_LAI_CLEAR_DESCRIPTION_GRASS, STR_LAI_CLEAR_DESCRIPTION_SNOWY_GRASS}, - {STR_LAI_CLEAR_DESCRIPTION_ROUGH_LAND, STR_LAI_CLEAR_DESCRIPTION_SNOWY_ROUGH_LAND}, - {STR_LAI_CLEAR_DESCRIPTION_ROCKS, STR_LAI_CLEAR_DESCRIPTION_SNOWY_ROCKS}, - {STR_LAI_CLEAR_DESCRIPTION_FIELDS, STR_EMPTY}, + static constexpr std::pair clear_land_str[to_underlying(ClearGround::MaxSize)] = { + {STR_LAI_CLEAR_DESCRIPTION_GRASS, STR_LAI_CLEAR_DESCRIPTION_SNOWY_GRASS}, // Description for grass. + {STR_LAI_CLEAR_DESCRIPTION_ROUGH_LAND, STR_LAI_CLEAR_DESCRIPTION_SNOWY_ROUGH_LAND}, // Description for rough land. + {STR_LAI_CLEAR_DESCRIPTION_ROCKS, STR_LAI_CLEAR_DESCRIPTION_SNOWY_ROCKS}, // Description for rocks. + {STR_LAI_CLEAR_DESCRIPTION_FIELDS, STR_EMPTY}, // Description for fields. + {STR_EMPTY, STR_EMPTY}, // unused entry does not appear in the map. + {STR_LAI_CLEAR_DESCRIPTION_DESERT, STR_EMPTY}, // Description for desert. + {STR_EMPTY, STR_EMPTY}, // unused entry does not appear in the map. {STR_EMPTY, STR_EMPTY}, // unused entry does not appear in the map. - {STR_LAI_CLEAR_DESCRIPTION_DESERT, STR_EMPTY}, }; if (!IsSnowTile(tile) && IsClearGround(tile, ClearGround::Grass) && GetClearDensity(tile) == 0) { diff --git a/src/clear_map.h b/src/clear_map.h index 5bc6d1df86..6153a8949b 100644 --- a/src/clear_map.h +++ b/src/clear_map.h @@ -13,6 +13,8 @@ #include "bridge_map.h" #include "industry_type.h" +static constexpr size_t CLEAR_GROUND_BITS = 3; ///< How many bits in map array are dedicated for clear ground type. + /** * Ground types. Valid densities in comments after the enum. */ @@ -22,8 +24,12 @@ enum class ClearGround : uint8_t { Rocks = 2, ///< Rocks with snow transition (0-3) Fields = 3, ///< Farm fields (3) Desert = 5, ///< Desert with transition (1,3) + + End, ///< End marker. + MaxSize = 1U << CLEAR_GROUND_BITS, ///< The maximum possible number of clear ground types to be stored in map. }; +static_assert(ClearGround::End <= ClearGround::MaxSize); /** * Test if a tile is covered with snow. @@ -46,7 +52,7 @@ inline bool IsSnowTile(Tile t) inline ClearGround GetClearGround(Tile t) { assert(IsTileType(t, TileType::Clear)); - return static_cast(GB(t.m5(), 2, 3)); + return static_cast(GB(t.m5(), 2, CLEAR_GROUND_BITS)); } /** diff --git a/src/smallmap_gui.cpp b/src/smallmap_gui.cpp index 19b645a076..cecfa3ca23 100644 --- a/src/smallmap_gui.cpp +++ b/src/smallmap_gui.cpp @@ -526,7 +526,8 @@ static inline uint32_t GetSmallMapLinkStatsPixels(TileIndex tile, TileType t) return _smallmap_show_heightmap ? GetSmallMapContoursPixels(tile, t) : GetSmallMapRoutesPixels(tile, t); } -static const uint32_t _vegetation_clear_bits[] = { +/** Lookup table of minimap colours to use for each ClearGround type. */ +static constexpr uint32_t _vegetation_clear_bits[to_underlying(ClearGround::MaxSize)] = { MKCOLOUR_XXXX(PC_GRASS_LAND), ///< full grass MKCOLOUR_XXXX(PC_ROUGH_LAND), ///< rough land MKCOLOUR_XXXX(PC_GREY), ///< rocks