changeset 14493:522dc4972f9f draft

(svn r19064) -Feature: Allow to select different land colours for the smallmap (reworked by Alberth).
author terkhen <terkhen@openttd.org>
date Mon, 08 Feb 2010 23:46:35 +0000
parents aaf7de90045e
children eb3d3072b85b
files src/lang/english.txt src/settings.cpp src/settings_gui.cpp src/settings_type.h src/smallmap_gui.cpp src/smallmap_gui.h src/table/settings.h
diffstat 7 files changed, 110 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/src/lang/english.txt
+++ b/src/lang/english.txt
@@ -1165,6 +1165,10 @@
 STR_CONFIG_SETTING_STATION_SPREAD                               :{LTBLUE}Max station spread: {ORANGE}{STRING1} {RED}Warning: High setting slows game
 STR_CONFIG_SETTING_SERVICEATHELIPAD                             :{LTBLUE}Service helicopters at helipads automatically: {ORANGE}{STRING1}
 STR_CONFIG_SETTING_LINK_TERRAFORM_TOOLBAR                       :{LTBLUE}Link landscape toolbar to rail/road/water/airport toolbars: {ORANGE}{STRING1}
+STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR                         :{LTBLUE}Land colour used at the smallmap: {ORANGE}{STRING1}
+STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_GREEN                   :Green
+STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_DARK_GREEN              :Dark green
+STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET                  :Violet
 STR_CONFIG_SETTING_REVERSE_SCROLLING                            :{LTBLUE}Reverse scroll direction: {ORANGE}{STRING1}
 STR_CONFIG_SETTING_SMOOTH_SCROLLING                             :{LTBLUE}Smooth viewport scrolling: {ORANGE}{STRING1}
 STR_CONFIG_SETTING_MEASURE_TOOLTIP                              :{LTBLUE}Show a measurement tooltip when using various build-tools: {ORANGE}{STRING1}
--- a/src/settings.cpp
+++ b/src/settings.cpp
@@ -63,6 +63,7 @@
 #include "ship.h"
 #include "company_base.h"
 #include "engine_base.h"
+#include "smallmap_gui.h"
 
 #include "void_map.h"
 #include "station_base.h"
@@ -658,6 +659,18 @@
 	return true;
 }
 
+/**
+ * Redraw the smallmap after a colour scheme change.
+ * @param p1 Callback parameter.
+ * @return Always true.
+ */
+static bool RedrawSmallmap(int32 p1)
+{
+	BuildLandLegend();
+	SetWindowClassesDirty(WC_SMALLMAP);
+	return true;
+}
+
 static bool InvalidateDetailsWindow(int32 p1)
 {
 	SetWindowClassesDirty(WC_VEHICLE_DETAILS);
--- a/src/settings_gui.cpp
+++ b/src/settings_gui.cpp
@@ -1256,6 +1256,7 @@
 	SettingEntry("gui.liveries"),
 	SettingEntry("gui.show_track_reservation"),
 	SettingEntry("gui.expenses_layout"),
+	SettingEntry("gui.smallmap_land_colour"),
 };
 /** Display options sub-page */
 static SettingsPage _settings_ui_display_page = {_settings_ui_display, lengthof(_settings_ui_display)};
--- a/src/settings_type.h
+++ b/src/settings_type.h
@@ -54,6 +54,7 @@
 	bool   autoscroll;                       ///< scroll when moving mouse to the edge
 	byte   errmsg_duration;                  ///< duration of error message
 	bool   link_terraform_toolbar;           ///< display terraform toolbar when displaying rail, road, water and airport toolbars
+	uint8  smallmap_land_colour;             ///< colour used for land and heightmap at the smallmap
 	bool   reverse_scroll;                   ///< right-Click-Scrolling scrolls in the opposite direction
 	bool   smooth_scroll;                    ///< smooth scroll viewports
 	bool   measure_tooltip;                  ///< show a permanent tooltip when dragging tools
--- a/src/smallmap_gui.cpp
+++ b/src/smallmap_gui.cpp
@@ -56,6 +56,8 @@
 
 /** Macro for ordinary entry of LegendAndColour */
 #define MK(a, b) {a, b, INVALID_INDUSTRYTYPE, true, false, false}
+/** Macro for an entry with configurable colour. */
+#define MC(b) MK(0, b)
 /** Macro for end of list marker in arrays of LegendAndColour */
 #define MKEND() {0, STR_NULL, INVALID_INDUSTRYTYPE, true, true, false}
 /** Macro for break marker in arrays of LegendAndColour.
@@ -73,12 +75,13 @@
 };
 
 /** Legend text giving the colours to look for on the minimap */
-static const LegendAndColour _legend_land_contours[] = {
-	MK(0x5A, STR_SMALLMAP_LEGENDA_100M),
-	MK(0x5C, STR_SMALLMAP_LEGENDA_200M),
-	MK(0x5E, STR_SMALLMAP_LEGENDA_300M),
-	MK(0x1F, STR_SMALLMAP_LEGENDA_400M),
-	MK(0x27, STR_SMALLMAP_LEGENDA_500M),
+static LegendAndColour _legend_land_contours[] = {
+	/* The colours for the following values are set at BuildLandLegend() based on each colour scheme. */
+	MC(STR_SMALLMAP_LEGENDA_100M),
+	MC(STR_SMALLMAP_LEGENDA_200M),
+	MC(STR_SMALLMAP_LEGENDA_300M),
+	MC(STR_SMALLMAP_LEGENDA_400M),
+	MC(STR_SMALLMAP_LEGENDA_500M),
 
 	MS(0xD7, STR_SMALLMAP_LEGENDA_ROADS),
 	MK(0x0A, STR_SMALLMAP_LEGENDA_RAILROADS),
@@ -136,6 +139,7 @@
 	MKEND()
 };
 #undef MK
+#undef MC
 #undef MS
 #undef MKEND
 
@@ -188,10 +192,8 @@
 
 #define MKCOLOUR(x) TO_LE32X(x)
 
-/**
- * Height encodings; MAX_TILE_HEIGHT + 1 levels, from 0 to MAX_TILE_HEIGHT
- */
-static const uint32 _map_height_bits[] = {
+/** Height map colours for the green colour scheme, ordered by height. */
+static const uint32 _green_map_heights[] = {
 	MKCOLOUR(0x5A5A5A5A),
 	MKCOLOUR(0x5A5B5A5B),
 	MKCOLOUR(0x5B5B5B5B),
@@ -209,7 +211,71 @@
 	MKCOLOUR(0x27272727),
 	MKCOLOUR(0x27272727),
 };
-assert_compile(lengthof(_map_height_bits) == MAX_TILE_HEIGHT + 1);
+assert_compile(lengthof(_green_map_heights) == MAX_TILE_HEIGHT + 1);
+
+/** Height map colours for the dark green colour scheme, ordered by height. */
+static const uint32 _dark_green_map_heights[] = {
+	MKCOLOUR(0x60606060),
+	MKCOLOUR(0x60616061),
+	MKCOLOUR(0x61616161),
+	MKCOLOUR(0x61626162),
+	MKCOLOUR(0x62626262),
+	MKCOLOUR(0x62636263),
+	MKCOLOUR(0x63636363),
+	MKCOLOUR(0x63646364),
+	MKCOLOUR(0x64646464),
+	MKCOLOUR(0x64656465),
+	MKCOLOUR(0x65656565),
+	MKCOLOUR(0x65666566),
+	MKCOLOUR(0x66666666),
+	MKCOLOUR(0x66676667),
+	MKCOLOUR(0x67676767),
+	MKCOLOUR(0x67676767),
+};
+assert_compile(lengthof(_dark_green_map_heights) == MAX_TILE_HEIGHT + 1);
+
+/** Height map colours for the violet colour scheme, ordered by height. */
+static const uint32 _violet_map_heights[] = {
+	MKCOLOUR(0x80808080),
+	MKCOLOUR(0x80818081),
+	MKCOLOUR(0x81818181),
+	MKCOLOUR(0x81828182),
+	MKCOLOUR(0x82828282),
+	MKCOLOUR(0x82838283),
+	MKCOLOUR(0x83838383),
+	MKCOLOUR(0x83848384),
+	MKCOLOUR(0x84848484),
+	MKCOLOUR(0x84858485),
+	MKCOLOUR(0x85858585),
+	MKCOLOUR(0x85868586),
+	MKCOLOUR(0x86868686),
+	MKCOLOUR(0x86878687),
+	MKCOLOUR(0x87878787),
+	MKCOLOUR(0x87878787),
+};
+assert_compile(lengthof(_violet_map_heights) == MAX_TILE_HEIGHT + 1);
+
+/** Colour scheme of the smallmap. */
+struct SmallMapColourScheme {
+	const uint32 *height_colours; ///< Colour of each level in a heightmap.
+	uint32 default_colour;   ///< Default colour of the land.
+};
+
+/** Available colour schemes for height maps. */
+static const SmallMapColourScheme _heightmap_schemes[] = {
+	{_green_map_heights,      MKCOLOUR(0x54545454)}, ///< Green colour scheme.
+	{_dark_green_map_heights, MKCOLOUR(0x62626262)}, ///< Dark green colour scheme.
+	{_violet_map_heights,     MKCOLOUR(0x82828282)}, ///< Violet colour scheme.
+};
+
+void BuildLandLegend()
+{
+	_legend_land_contours[0].colour = _heightmap_schemes[_settings_client.gui.smallmap_land_colour].height_colours[0];
+	_legend_land_contours[1].colour = _heightmap_schemes[_settings_client.gui.smallmap_land_colour].height_colours[4];
+	_legend_land_contours[2].colour = _heightmap_schemes[_settings_client.gui.smallmap_land_colour].height_colours[8];
+	_legend_land_contours[3].colour = _heightmap_schemes[_settings_client.gui.smallmap_land_colour].height_colours[12];
+	_legend_land_contours[4].colour = _heightmap_schemes[_settings_client.gui.smallmap_land_colour].height_colours[14];
+}
 
 struct AndOr {
 	uint32 mor;
@@ -295,7 +361,8 @@
  */
 static inline uint32 GetSmallMapContoursPixels(TileIndex tile, TileType t)
 {
-	return ApplyMask(_map_height_bits[TileHeight(tile)], &_smallmap_contours_andor[t]);
+	const SmallMapColourScheme *cs = &_heightmap_schemes[_settings_client.gui.smallmap_land_colour];
+	return ApplyMask(cs->height_colours[TileHeight(tile)], &_smallmap_contours_andor[t]);
 }
 
 /**
@@ -307,7 +374,8 @@
  */
 static inline uint32 GetSmallMapVehiclesPixels(TileIndex tile, TileType t)
 {
-	return ApplyMask(MKCOLOUR(0x54545454), &_smallmap_vehicles_andor[t]);
+	const SmallMapColourScheme *cs = &_heightmap_schemes[_settings_client.gui.smallmap_land_colour];
+	return ApplyMask(cs->default_colour, &_smallmap_vehicles_andor[t]);
 }
 
 /**
@@ -329,7 +397,8 @@
 		}
 	}
 
-	return ApplyMask(_smallmap_industry_show_heightmap ? _map_height_bits[TileHeight(tile)] : MKCOLOUR(0x54545454), &_smallmap_vehicles_andor[t]);
+	const SmallMapColourScheme *cs = &_heightmap_schemes[_settings_client.gui.smallmap_land_colour];
+	return ApplyMask(_smallmap_industry_show_heightmap ? cs->height_colours[TileHeight(tile)] : cs->default_colour, &_smallmap_vehicles_andor[t]);
 }
 
 /**
@@ -353,7 +422,8 @@
 	}
 
 	/* Ground colour */
-	return ApplyMask(MKCOLOUR(0x54545454), &_smallmap_contours_andor[t]);
+	const SmallMapColourScheme *cs = &_heightmap_schemes[_settings_client.gui.smallmap_land_colour];
+	return ApplyMask(cs->default_colour, &_smallmap_contours_andor[t]);
 }
 
 
@@ -794,7 +864,7 @@
 
 			/* Fill with some special colours */
 			_owner_colours[OWNER_TOWN]  = MKCOLOUR(0xB4B4B4B4);
-			_owner_colours[OWNER_NONE]  = MKCOLOUR(0x54545454);
+			_owner_colours[OWNER_NONE]  = _heightmap_schemes[_settings_client.gui.smallmap_land_colour].default_colour;
 			_owner_colours[OWNER_WATER] = MKCOLOUR(0xCACACACA);
 			_owner_colours[OWNER_END]   = MKCOLOUR(0x20202020); // Industry
 
@@ -858,6 +928,7 @@
 		this->LowerWidget(this->map_type + SM_WIDGET_CONTOUR);
 
 		_smallmap_industry_show_heightmap = false;
+		BuildLandLegend();
 		this->SetWidgetLoweredState(SM_WIDGET_SHOW_HEIGHT, _smallmap_industry_show_heightmap);
 
 		this->SetWidgetLoweredState(SM_WIDGET_TOGGLETOWNNAME, this->show_towns);
--- a/src/smallmap_gui.h
+++ b/src/smallmap_gui.h
@@ -7,12 +7,13 @@
  * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
  */
 
-/** @file smallmap_gui.h Smallmap GUI functions, used at newgrf.cpp and toolbar_gui.cpp. */
+/** @file smallmap_gui.h Smallmap GUI functions. */
 
 #ifndef SMALLMAP_GUI_H
 #define SMALLMAP_GUI_H
 
 void BuildIndustriesLegend();
 void ShowSmallMap();
+void BuildLandLegend();
 
 #endif /* SMALLMAP_GUI_H */
--- a/src/table/settings.h
+++ b/src/table/settings.h
@@ -13,6 +13,7 @@
 static bool v_PositionMainToolbar(int32 p1);
 static bool PopulationInLabelActive(int32 p1);
 static bool RedrawScreen(int32 p1);
+static bool RedrawSmallmap(int32 p1);
 static bool InvalidateDetailsWindow(int32 p1);
 static bool InvalidateStationBuildWindow(int32 p1);
 static bool InvalidateBuildIndustryWindow(int32 p1);
@@ -555,6 +556,7 @@
 	  SDTC_VAR(gui.window_soft_limit,         SLE_UINT8, S, D0,    20,        5,      255, 1, STR_CONFIG_SETTING_SOFT_LIMIT,                  NULL),
 	 SDTC_BOOL(gui.population_in_label,                  S,  0,  true,                        STR_CONFIG_SETTING_POPULATION_IN_LABEL,         PopulationInLabelActive),
 	 SDTC_BOOL(gui.link_terraform_toolbar,               S,  0, false,                        STR_CONFIG_SETTING_LINK_TERRAFORM_TOOLBAR,      NULL),
+	  SDTC_VAR(gui.smallmap_land_colour,      SLE_UINT8, S, MS,     0,        0,        2, 0, STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR,        RedrawSmallmap),
 	  SDTC_VAR(gui.liveries,                  SLE_UINT8, S, MS,     2,        0,        2, 0, STR_CONFIG_SETTING_LIVERIES,                    RedrawScreen),
 	 SDTC_BOOL(gui.prefer_teamchat,                      S,  0, false,                        STR_CONFIG_SETTING_PREFER_TEAMCHAT,             NULL),
 	  SDTC_VAR(gui.scrollwheel_scrolling,     SLE_UINT8, S, MS,     0,        0,        2, 0, STR_CONFIG_SETTING_SCROLLWHEEL_SCROLLING,       NULL),