changeset 7742:948592b47ff4 draft

(svn r11279) -Codechange: use a typedeffed type for all magic with GameDifficulty instead on relying ints to always be 32 bits, which they are not.
author rubidium <rubidium@openttd.org>
date Tue, 16 Oct 2007 21:15:34 +0000
parents ebb1669ac65d
children d0af601fef9d
files src/misc_cmd.cpp src/openttd.h src/settings.cpp src/settings_gui.cpp
diffstat 4 files changed, 32 insertions(+), 30 deletions(-) [+]
line wrap: on
line diff
--- a/src/misc_cmd.cpp
+++ b/src/misc_cmd.cpp
@@ -380,7 +380,7 @@
 
 	if (flags & DC_EXEC) {
 		if (p1 != (uint32)-1L) {
-			((int*)&_opt_ptr->diff)[p1] = p2;
+			((GDType*)&_opt_ptr->diff)[p1] = p2;
 			_opt_ptr->diff_level = 3; // custom difficulty level
 		} else {
 			_opt_ptr->diff_level = p2;
--- a/src/openttd.h
+++ b/src/openttd.h
@@ -280,25 +280,27 @@
 
 #define GAME_DIFFICULTY_NUM 18
 
+/** Specific type for Game Difficulty to ease changing the type */
+typedef uint16 GDType;
 struct GameDifficulty {
-	int max_no_competitors;
-	int competitor_start_time;
-	int number_towns;
-	int number_industries;
-	int max_loan;
-	int initial_interest;
-	int vehicle_costs;
-	int competitor_speed;
-	int competitor_intelligence; // no longer in use
-	int vehicle_breakdowns;
-	int subsidy_multiplier;
-	int construction_cost;
-	int terrain_type;
-	int quantity_sea_lakes;
-	int economy;
-	int line_reverse_mode;
-	int disasters;
-	int town_council_tolerance; // minimum required town ratings to be allowed to demolish stuff
+	GDType max_no_competitors;
+	GDType competitor_start_time;
+	GDType number_towns;
+	GDType number_industries;
+	GDType max_loan;
+	GDType initial_interest;
+	GDType vehicle_costs;
+	GDType competitor_speed;
+	GDType competitor_intelligence; // no longer in use
+	GDType vehicle_breakdowns;
+	GDType subsidy_multiplier;
+	GDType construction_cost;
+	GDType terrain_type;
+	GDType quantity_sea_lakes;
+	GDType economy;
+	GDType line_reverse_mode;
+	GDType disasters;
+	GDType town_council_tolerance; // minimum required town ratings to be allowed to demolish stuff
 };
 
 enum {
--- a/src/settings.cpp
+++ b/src/settings.cpp
@@ -1304,8 +1304,8 @@
 	 * XXX - To save file-space and since values are never bigger than about 10? only
 	 * save the first 16 bits in the savegame. Question is why the values are still int32
 	 * and why not byte for example? */
-	SDT_GENERAL("diff_custom", SDT_INTLIST, SL_ARR, (SLE_FILE_I16 | SLE_VAR_I32), 0, 0, GameOptions, diff, 17, 0, 0, 0, 0, NULL, STR_NULL, NULL, NULL, 0, 3),
-	SDT_GENERAL("diff_custom", SDT_INTLIST, SL_ARR, (SLE_FILE_I16 | SLE_VAR_I32), 0, 0, GameOptions, diff, 18, 0, 0, 0, 0, NULL, STR_NULL, NULL, NULL, 4, SL_MAX_VERSION),
+	SDT_GENERAL("diff_custom", SDT_INTLIST, SL_ARR, SLE_UINT16, 0, 0, GameOptions, diff, 17, 0, 0, 0, 0, NULL, STR_NULL, NULL, NULL, 0, 3),
+	SDT_GENERAL("diff_custom", SDT_INTLIST, SL_ARR, SLE_UINT16, 0, 0, GameOptions, diff, 18, 0, 0, 0, 0, NULL, STR_NULL, NULL, NULL, 4, SL_MAX_VERSION),
 	    SDT_VAR(GameOptions, diff_level, SLE_UINT8, 0, 0, 0, 0,  3, 0, STR_NULL, NULL),
 	  SDT_OMANY(GameOptions, currency,  SLE_UINT8, N, 0, 0, CUSTOM_CURRENCY_ID, "GBP|USD|EUR|YEN|ATS|BEF|CHF|CZK|DEM|DKK|ESP|FIM|FRF|GRD|HUF|ISK|ITL|NLG|NOK|PLN|ROL|RUR|SIT|SEK|YTL|SKK|BRR|custom", STR_NULL, NULL, NULL),
 	  SDT_OMANY(GameOptions, units,     SLE_UINT8, N, 0, 1,     2, "imperial|metric|si", STR_NULL, NULL, NULL),
--- a/src/settings_gui.cpp
+++ b/src/settings_gui.cpp
@@ -399,7 +399,7 @@
  * Q: disasters
  * R: area restructuring (0 = permissive, 2 = hostile)
  */
-static const int16 _default_game_diff[3][GAME_DIFFICULTY_NUM] = { /*
+static const GDType _default_game_diff[3][GAME_DIFFICULTY_NUM] = { /*
 	 A, B, C, D,   E, F, G, H, I, J, K, L, M, N, O, P, Q, R*/
 	{2, 2, 1, 4, 300, 2, 0, 2, 0, 1, 2, 0, 1, 0, 0, 0, 0, 0}, ///< easy
 	{4, 1, 1, 3, 150, 3, 1, 3, 1, 2, 1, 1, 2, 1, 1, 1, 1, 1}, ///< medium
@@ -414,7 +414,7 @@
 	gm_opt->diff_level = mode;
 	if (mode != 3) { // not custom
 		for (i = 0; i != GAME_DIFFICULTY_NUM; i++)
-			((int*)&gm_opt->diff)[i] = _default_game_diff[mode][i];
+			((GDType*)&gm_opt->diff)[i] = _default_game_diff[mode][i];
 	}
 }
 
@@ -428,7 +428,7 @@
 		SetDifficultyLevel(_opt_newgame.diff_level, &_opt_newgame);
 	} else {
 		for (uint i = 0; i < GAME_DIFFICULTY_NUM; i++) {
-			int *diff = ((int*)&_opt_newgame.diff) + i;
+			GDType *diff = ((GDType*)&_opt_newgame.diff) + i;
 			*diff = clamp(*diff, _game_setting_info[i].min, _game_setting_info[i].max);
 			*diff -= *diff % _game_setting_info[i].step;
 		}
@@ -489,7 +489,7 @@
 			DrawStringCentered(20, y, STR_681A, 0);
 
 
-			value = _game_setting_info[i].str + ((int*)&_opt_mod_temp.diff)[i];
+			value = _game_setting_info[i].str + ((GDType*)&_opt_mod_temp.diff)[i];
 			if (i == 4) value *= 1000; // XXX - handle currency option
 			SetDParam(0, value);
 			DrawString(30, y, STR_6805_MAXIMUM_NO_COMPETITORS + i, 0);
@@ -531,7 +531,7 @@
 
 			_difficulty_timeout = 5;
 
-			val = ((int*)&_opt_mod_temp.diff)[btn];
+			val = ((GDType*)&_opt_mod_temp.diff)[btn];
 
 			info = &_game_setting_info[btn]; // get information about the difficulty setting
 			if (x >= 10) {
@@ -546,7 +546,7 @@
 			}
 
 			// save value in temporary variable
-			((int*)&_opt_mod_temp.diff)[btn] = val;
+			((GDType*)&_opt_mod_temp.diff)[btn] = val;
 			RaiseWindowWidget(w, _opt_mod_temp.diff_level + 3);
 			SetDifficultyLevel(3, &_opt_mod_temp); // set difficulty level to custom
 			LowerWindowWidget(w, _opt_mod_temp.diff_level + 3);
@@ -563,11 +563,11 @@
 			ShowHighscoreTable(_opt_mod_temp.diff_level, -1);
 			break;
 		case 10: { /* Save button - save changes */
-			int btn, val;
+			GDType btn, val;
 			for (btn = 0; btn != GAME_DIFFICULTY_NUM; btn++) {
-				val = ((int*)&_opt_mod_temp.diff)[btn];
+				val = ((GDType*)&_opt_mod_temp.diff)[btn];
 				// if setting has changed, change it
-				if (val != ((int*)&_opt_ptr->diff)[btn])
+				if (val != ((GDType*)&_opt_ptr->diff)[btn])
 					DoCommandP(0, btn, val, NULL, CMD_CHANGE_DIFFICULTY_LEVEL);
 			}
 			DoCommandP(0, UINT_MAX, _opt_mod_temp.diff_level, NULL, CMD_CHANGE_DIFFICULTY_LEVEL);