# HG changeset patch # User rubidium # Date 2014-09-27 14:49:37 # Node ID a6f3571b069212a2a5c71723010f0c390301d55e # Parent 009b9d2827ccdaabf8e3efb4b9fc9e2973538a8e (svn r26929) -Change: accounts for maximum height when filling the height legend of the smallmap diff --git a/src/smallmap_gui.cpp b/src/smallmap_gui.cpp --- a/src/smallmap_gui.cpp +++ b/src/smallmap_gui.cpp @@ -50,7 +50,7 @@ static const uint8 PC_WATER = #define MK(a, b) {a, b, INVALID_INDUSTRYTYPE, 0, INVALID_COMPANY, true, false, false} /** Macro for a height legend entry with configurable colour. */ -#define MC(height) {0, STR_TINY_BLACK_HEIGHT, INVALID_INDUSTRYTYPE, height, INVALID_COMPANY, true, false, false} +#define MC(col_break) {0, STR_TINY_BLACK_HEIGHT, INVALID_INDUSTRYTYPE, 0, INVALID_COMPANY, true, false, col_break} /** Macro for non-company owned property entry of LegendAndColour */ #define MO(a, b) {a, b, INVALID_INDUSTRYTYPE, 0, INVALID_COMPANY, true, false, false} @@ -69,18 +69,27 @@ static const uint8 PC_WATER = /** Legend text giving the colours to look for on the minimap */ static LegendAndColour _legend_land_contours[] = { - /* The colours for the following values are set at BuildLandLegend() based on each colour scheme. */ - MC(0), - MC(4), - MC(8), - MC(12), - MC(14), - - MS(PC_BLACK, STR_SMALLMAP_LEGENDA_ROADS), + MK(PC_BLACK, STR_SMALLMAP_LEGENDA_ROADS), MK(PC_GREY, STR_SMALLMAP_LEGENDA_RAILROADS), MK(PC_LIGHT_BLUE, STR_SMALLMAP_LEGENDA_STATIONS_AIRPORTS_DOCKS), MK(PC_DARK_RED, STR_SMALLMAP_LEGENDA_BUILDINGS_INDUSTRIES), MK(PC_WHITE, STR_SMALLMAP_LEGENDA_VEHICLES), + + /* Placeholders for the colours and heights of the legend. + * The following values are set at BuildLandLegend() based + * on each colour scheme and the maximum map height. */ + MC(true), + MC(false), + MC(false), + MC(false), + MC(false), + MC(false), + MC(true), + MC(false), + MC(false), + MC(false), + MC(false), + MC(false), MKEND() }; @@ -270,9 +279,47 @@ static SmallMapColourScheme _heightmap_s */ void BuildLandLegend() { - for (LegendAndColour *lc = _legend_land_contours; lc->legend == STR_TINY_BLACK_HEIGHT; lc++) { - lc->colour = _heightmap_schemes[_settings_client.gui.smallmap_land_colour].height_colours[lc->height]; + /* + * The general idea of this function is to fill the legend with an appropriate evenly spaced + * selection of height levels. All entries with STR_TINY_BLACK_HEIGHT are reserved for this. + * At the moment there are twelve of these. + * + * The table below defines up to which height level a particular delta in the legend should be + * used. One could opt for just dividing the maximum height and use that as delta, but that + * creates many "ugly" legend labels, e.g. once every 950 meter. As a result, this table will + * reduce the number of deltas to 7: every 100m, 200m, 300m, 500m, 750m, 1000m and 1250m. The + * deltas are closer together at the lower numbers because going from 12 entries to just 4, as + * would happen when replacing 200m and 300m by 250m, would mean the legend would be short and + * that might not be considered appropriate. + * + * The current method yields at least 7 legend entries and at most 12. It can be increased to + * 8 by adding a 150m and 400m option, but especially 150m creates ugly heights. + * + * It tries to evenly space the legend items over the two columns that are there for the legend. + */ + + /* Table for delta; if max_height is less than the first column, use the second column as value. */ + uint deltas[][2] = { { 24, 2 }, { 48, 4 }, { 72, 6 }, { 120, 10 }, { 180, 15 }, { 240, 20 }, { MAX_TILE_HEIGHT + 1, 25 }}; + uint i = 0; + for (; _settings_game.construction.max_heightlevel >= deltas[i][0]; i++) { + /* Nothing to do here. */ } + uint delta = deltas[i][1]; + + int total_entries = (_settings_game.construction.max_heightlevel / delta) + 1; + int rows = CeilDiv(total_entries, 2); + int j = 0; + + for (i = 0; i < lengthof(_legend_land_contours) - 1 && j < total_entries; i++) { + if (_legend_land_contours[i].legend != STR_TINY_BLACK_HEIGHT) continue; + + _legend_land_contours[i].col_break = j % rows == 0; + _legend_land_contours[i].end = false; + _legend_land_contours[i].height = j * delta; + _legend_land_contours[i].colour = _heightmap_schemes[_settings_client.gui.smallmap_land_colour].height_colours[j * delta]; + j++; + } + _legend_land_contours[i].end = true; } /** @@ -1025,7 +1072,6 @@ SmallMapWindow::SmallMapWindow(WindowDes this->RebuildColourIndexIfNecessary(); - BuildLandLegend(); this->SetWidgetLoweredState(WID_SM_SHOW_HEIGHT, _smallmap_show_heightmap); this->SetWidgetLoweredState(WID_SM_TOGGLETOWNNAME, this->show_towns); @@ -1059,6 +1105,7 @@ void SmallMapWindow::RebuildColourIndexI } SmallMapWindow::max_heightlevel = _settings_game.construction.max_heightlevel; + BuildLandLegend(); } /* virtual */ void SmallMapWindow::SetStringParameters(int widget) const