(svn r10035) -Change: simplified network language string sorting
authorglx
Mon, 04 Jun 2007 19:49:00 +0000
changeset 7292 d4cf2baf26ae
parent 7291 b77a88be0fd8
child 7293 e5b1b6ef83db
(svn r10035) -Change: simplified network language string sorting
src/network/network.h
src/network/network_gui.cpp
--- a/src/network/network.h	Mon Jun 04 19:39:16 2007 +0000
+++ b/src/network/network.h	Mon Jun 04 19:49:00 2007 +0000
@@ -107,7 +107,7 @@
 	NETLANG_SWEDISH,
 	NETLANG_TURKISH,
 	NETLANG_UKRAINIAN,
-	NETLANG_LAST
+	NETLANG_COUNT
 };
 
 VARDEF NetworkGameInfo _network_game_info;
--- a/src/network/network_gui.cpp	Mon Jun 04 19:39:16 2007 +0000
+++ b/src/network/network_gui.cpp	Mon Jun 04 19:49:00 2007 +0000
@@ -85,55 +85,17 @@
 	INVALID_STRING_ID
 };
 
-static StringID _language_dropdown[] = {
-	STR_NETWORK_LANG_ANY,
-	STR_NETWORK_LANG_ENGLISH,
-	STR_NETWORK_LANG_GERMAN,
-	STR_NETWORK_LANG_FRENCH,
-	STR_NETWORK_LANG_BRAZILIAN,
-	STR_NETWORK_LANG_BULGARIAN,
-	STR_NETWORK_LANG_CHINESE,
-	STR_NETWORK_LANG_CZECH,
-	STR_NETWORK_LANG_DANISH,
-	STR_NETWORK_LANG_DUTCH,
-	STR_NETWORK_LANG_ESPERANTO,
-	STR_NETWORK_LANG_FINNISH,
-	STR_NETWORK_LANG_HUNGARIAN,
-	STR_NETWORK_LANG_ICELANDIC,
-	STR_NETWORK_LANG_ITALIAN,
-	STR_NETWORK_LANG_JAPANESE,
-	STR_NETWORK_LANG_KOREAN,
-	STR_NETWORK_LANG_LITHUANIAN,
-	STR_NETWORK_LANG_NORWEGIAN,
-	STR_NETWORK_LANG_POLISH,
-	STR_NETWORK_LANG_PORTUGUESE,
-	STR_NETWORK_LANG_ROMANIAN,
-	STR_NETWORK_LANG_RUSSIAN,
-	STR_NETWORK_LANG_SLOVAK,
-	STR_NETWORK_LANG_SLOVENIAN,
-	STR_NETWORK_LANG_SPANISH,
-	STR_NETWORK_LANG_SWEDISH,
-	STR_NETWORK_LANG_TURKISH,
-	STR_NETWORK_LANG_UKRAINIAN,
-	INVALID_STRING_ID
-};
-
-/* Used to map the _server_lang value to the sorted string. */
-static int _server_lang_to_string[NETLANG_LAST] = {0};
+static StringID _language_dropdown[NETLANG_COUNT + 1] = {STR_NULL};
 
 void SortNetworkLanguages() {
-	/* Sort the strings (we don't move 'any' and the 'invalid' one) */
-	qsort(&_language_dropdown[1], NETLANG_LAST - 1, sizeof(StringID), &StringIDSorter);
+	/* Init the strings */
+	if (_language_dropdown[0] == STR_NULL) {
+		for (int i = 0; i < NETLANG_COUNT; i++) _language_dropdown[i] = STR_NETWORK_LANG_ANY + i;
+		_language_dropdown[NETLANG_COUNT] = INVALID_STRING_ID;
+	}
 
-	/* Update the lookup table */
-	for (int i = NETLANG_ANY; i < NETLANG_LAST; i++) {
-		for (int j = NETLANG_ANY; j < NETLANG_LAST; j++) {
-			if (_language_dropdown[j] - STR_NETWORK_LANG_ANY == i) {
-				_server_lang_to_string[i] = j;
-				break;
-			}
-		}
-	}
+	/* Sort the strings (we don't move 'any' and the 'invalid' one) */
+	qsort(&_language_dropdown[1], NETLANG_COUNT - 1, sizeof(StringID), &StringIDSorter);
 }
 
 enum {
@@ -385,7 +347,7 @@
 			DrawString(x, y, STR_NETWORK_CLIENTS, 2);
 			y += 10;
 
-			SetDParam(0, _language_dropdown[_server_lang_to_string[sel->info.server_lang]]);
+			SetDParam(0, STR_NETWORK_LANG_ANY + sel->info.server_lang);
 			DrawString(x, y, STR_NETWORK_LANGUAGE, 2); // server language
 			y += 10;
 
@@ -652,7 +614,7 @@
 		SetDParam( 9, _players_dropdown[_network_game_info.clients_max]);
 		SetDParam(11, _players_dropdown[_network_game_info.companies_max]);
 		SetDParam(13, _players_dropdown[_network_game_info.spectators_max]);
-		SetDParam(15, _language_dropdown[_server_lang_to_string[_network_game_info.server_lang]]);
+		SetDParam(15, STR_NETWORK_LANG_ANY + _network_game_info.server_lang);
 		DrawWindowWidgets(w);
 
 		GfxFillRect(11, 63, 258, 215, 0xD7);
@@ -722,9 +684,17 @@
 		case 13: case 14: /* Number of Spectators */
 			ShowDropDownMenu(w, _players_dropdown, _network_game_info.spectators_max, 14, 0, 0);
 			break;
-		case 15: case 16: /* Language */
-			ShowDropDownMenu(w, _language_dropdown, _server_lang_to_string[_network_game_info.server_lang], 16, 0, 0);
+		case 15: case 16: { /* Language */
+			int sel;
+			for (uint i = 0; i < lengthof(_language_dropdown) - 1; i++) {
+				if (_language_dropdown[i] == STR_NETWORK_LANG_ANY + _network_game_info.server_lang) {
+					sel = i;
+					break;
+				}
+			}
+			ShowDropDownMenu(w, _language_dropdown, sel, 16, 0, 0);
 			break;
+		}
 		case 17: /* Start game */
 			_is_network_server = true;
 
@@ -759,11 +729,7 @@
 			case 12: _network_game_info.companies_max  = e->we.dropdown.index;        break;
 			case 14: _network_game_info.spectators_max = e->we.dropdown.index;        break;
 			case 16:
-				for (uint i = 0; i < lengthof(_server_lang_to_string); i++) {
-					if (_server_lang_to_string[i] == e->we.dropdown.index) {
-						_network_game_info.server_lang = i;
-					}
-				}
+				_network_game_info.server_lang = _language_dropdown[e->we.dropdown.index] - STR_NETWORK_LANG_ANY;
 				break;
 		}