(svn r212) -Fix: Network-gui fixes (sign_de)
authordarkvater
Sun, 12 Sep 2004 14:12:33 +0000
changeset 211 2954c4b30525
parent 210 6d715f410a2f
child 212 0f38a4514384
(svn r212) -Fix: Network-gui fixes (sign_de)
-Fix: any disabled button in a window doesn't receive WE_CLICK events
-Added network.h
functions.h
lang/american.txt
lang/czech.txt
lang/dutch.txt
lang/english.txt
lang/french.txt
lang/galician.txt
lang/german.txt
lang/hungarian.txt
lang/italian.txt
lang/polish.txt
lang/swedish.txt
network.c
network.h
network_gui.c
ttd.vcproj
window.c
--- a/functions.h	Sun Sep 12 14:10:40 2004 +0000
+++ b/functions.h	Sun Sep 12 14:12:33 2004 +0000
@@ -1,6 +1,8 @@
 #ifndef FUNCTIONS_H
 #define FUNCTIONS_H
 
+#include "network.h"
+
 /* vehicle.c */
 
 /* window.c */
@@ -144,16 +146,17 @@
 void NetworkCoreDisconnect();
 void NetworkCoreLoop(bool incomming);
 bool NetworkCoreConnectGame(const byte* b, unsigned short port);
+bool NetworkCoreConnectGameStruct(NetworkGameList * item);
 bool NetworkCoreStartGame();
 
 void NetworkLobbyShutdown();
 void NetworkLobbyInit();
 
 void NetworkGameListClear();
-char * NetworkGameListAdd();
+NetworkGameList * NetworkGameListAdd();
 void NetworkGameListFromLAN();
 void NetworkGameListFromInternet();
-char * NetworkGameListItem(uint16 index);
+NetworkGameList * NetworkGameListItem(uint16 index);
 
 void NetworkGameFillDefaults();
 void NetworkGameChangeDate(uint16 newdate);
--- a/lang/american.txt	Sun Sep 12 14:10:40 2004 +0000
+++ b/lang/american.txt	Sun Sep 12 14:12:33 2004 +0000
@@ -1145,6 +1145,8 @@
 STR_NETWORK_INFO_ICONS_TIP				:{BLACK}Language, server version, etc.
 STR_NETWORK_CLICK_GAME_TO_SELECT	:{BLACK}Click a game from the list to select it
 
+STR_NETWORK_PLAYERS_VAL						:{BLACK}{COMMA8}/{COMMA8}
+
 STR_NETWORK_JOIN_GAME							:{BLACK}Join game
 
 
--- a/lang/czech.txt	Sun Sep 12 14:10:40 2004 +0000
+++ b/lang/czech.txt	Sun Sep 12 14:12:33 2004 +0000
@@ -1199,6 +1199,8 @@
 STR_NETWORK_INFO_ICONS_TIP					:{BLACK}Jazyk, verze serveru, atd.
 STR_NETWORK_CLICK_GAME_TO_SELECT				:{BLACK}Hru vyberes kliknutim do seznamu
 
+STR_NETWORK_PLAYERS_VAL					:{BLACK}{COMMA8}/{COMMA8}
+
 STR_NETWORK_JOIN_GAME						:{BLACK}Pridat se
 
 
--- a/lang/dutch.txt	Sun Sep 12 14:10:40 2004 +0000
+++ b/lang/dutch.txt	Sun Sep 12 14:12:33 2004 +0000
@@ -1144,6 +1144,8 @@
 STR_NETWORK_INFO_ICONS_TIP					:{BLACK}Taal, serverversie, etc.
 STR_NETWORK_CLICK_GAME_TO_SELECT				:{BLACK}Klik op een spel uit de lijst om deze te selecteren
 
+STR_NETWORK_PLAYERS_VAL					:{BLACK}{COMMA8}/{COMMA8}
+
 STR_NETWORK_JOIN_GAME						:{BLACK}Meespelen
 
 
--- a/lang/english.txt	Sun Sep 12 14:10:40 2004 +0000
+++ b/lang/english.txt	Sun Sep 12 14:12:33 2004 +0000
@@ -799,10 +799,10 @@
 STR_02FD_VIEW_DEMONSTRATIONS_TUTORIALS	:{BLACK}View demonstrations/tutorials
 STR_02FE_CREATE_A_CUSTOMIZED_GAME				:{BLACK}Create a customized game world/scenario
 STR_02FF_SELECT_SINGLE_PLAYER_GAME			:{BLACK}Select single-player game
-STR_0300_SELECT_TWO_PLAYER_GAME					:{BLACK}Select two-player game
+STR_0300_SELECT_TWO_PLAYER_GAME					:{BLACK}Select multiplayer game of 2-8 players
 STR_0301_DISPLAY_GAME_OPTIONS						:{BLACK}Display game options
 STR_0302_DISPLAY_DIFFICULTY_OPTIONS			:{BLACK}Display difficulty options
-STR_0303_START_A_NEW_GAME_USING					:{BLACK}Start a new game, using a customized scenario
+STR_0303_START_A_NEW_GAME_USING					:{BLACK}Start a new game, using a customized scenario from disk
 STR_0304_QUIT														:{BLACK}Quit
 STR_0305_LEAVE_OPENTTD									:{BLACK}Leave 'OpenTTD', and quit
 STR_0306_VIEW_DEMONSTRATION_TUTORIAL		:{BLACK}View demonstration/tutorial
@@ -956,9 +956,9 @@
 STR_SHIP_AUTORENEW_FAILED				:{WHITE}Autorenew failed on ship {COMMA16} (money limit)
 STR_AIRCRAFT_AUTORENEW_FAILED				:{WHITE}Autorenew failed on aircraft {COMMA16} (money limit)
 
-STR_CONFIG_PATCHES						:{BLACK}Configure Patches
-STR_CONFIG_PATCHES_TIP					:{BLACK}Configure the patches
-STR_CONFIG_PATCHES_CAPTION				:{WHITE}Configure Patches
+STR_CONFIG_PATCHES									:{BLACK}Configure Patches
+STR_CONFIG_PATCHES_TIP							:{BLACK}Configure the patches
+STR_CONFIG_PATCHES_CAPTION					:{WHITE}Configure Patches
 
 STR_CONFIG_PATCHES_OFF					:Off
 STR_CONFIG_PATCHES_ON					:On
@@ -1169,7 +1169,7 @@
 
 ############ network gui strings
 
-TEMP_STRING_NO_NETWORK						:{WHITE}Network interface is not fully working yet!{}Some options work, but others like lobby, etc. don't. Just so you know.
+TEMP_STRING_NO_NETWORK						:{WHITE}Network interface is not yet fully operational!{}Not working items have been disabled.
 
 STR_NETWORK_MULTIPLAYER						:{WHITE}Multiplayer
 
@@ -1185,7 +1185,7 @@
 STR_NETWORK_ENTER_NAME_TIP				:{BLACK}This is the name other players will identify you by
 
 STR_NETWORK_SELECT_CONNECTION			:{BLACK}Select connection type:
-STR_NETWORK_CONNECTION_TYPE_TIP		:{BLACK}Chose between an internet game or a local area nework game
+STR_NETWORK_CONNECTION_TYPE_TIP		:{BLACK}Choose between an internet game or a local area nework game
 STR_NETWORK_COMBO1								:{BLACK}{SKIP}{SKIP}{STRING}
 STR_NETWORK_LAN										:LAN
 STR_NETWORK_INTERNET							:Internet
@@ -1199,10 +1199,12 @@
 STR_NETWORK_INFO_ICONS_TIP				:{BLACK}Language, server version, etc.
 STR_NETWORK_CLICK_GAME_TO_SELECT	:{BLACK}Click a game from the list to select it
 
+STR_NETWORK_PLAYERS_VAL						:{BLACK}{COMMA8}/{COMMA8}
+
 STR_NETWORK_JOIN_GAME							:{BLACK}Join game
 
 
-STR_NETWORK_START_GAME_WINDOW			:{WHITE}Start new game
+STR_NETWORK_START_GAME_WINDOW			:{WHITE}Start new multiplayer game
 
 STR_NETWORK_NEW_GAME_NAME					:{BLACK}Game name:
 STR_NETWORK_NEW_GAME_NAME_TIP			:{BLACK}The game name will be displayed to other players in the multiplayer game selection menu
@@ -1211,7 +1213,7 @@
 STR_NETWORK_SELECT_MAP						:{BLACK}Select a map:
 STR_NETWORK_SELECT_MAP_TIP				:{BLACK}Which map do you want to play?
 STR_NETWORK_NUMBER_OF_PLAYERS			:{BLACK}Number of players:
-STR_NETWORK_NUMBER_OF_PLAYERS_TIP	:{BLACK}Chose a maximum number of players. Not all slots need to be filled.
+STR_NETWORK_NUMBER_OF_PLAYERS_TIP	:{BLACK}Choose a maximum number of players. Not all slots need to be filled.
 STR_NETWORK_COMBO2								:{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
 STR_NETWORK_2_PLAYERS							:2 players
 STR_NETWORK_3_PLAYERS							:3 players
@@ -1221,8 +1223,11 @@
 STR_NETWORK_7_PLAYERS							:7 players
 STR_NETWORK_8_PLAYERS							:8 players
 STR_NETWORK_START_GAME						:{BLACK}Start Game
+STR_NETWORK_START_GAME_TIP				:{BLACK}Start a new network game from a random map, or scenario
 STR_NETWORK_LOAD_GAME							:{BLACK}Load Game
+STR_NETWORK_LOAD_GAME_TIP					:{BLACK}Resume an earlier saved multiplayer game (be sure to connect as the correct player)
 STR_NETWORK_LOAD_SCENARIO					:{BLACK}Load Scenario
+STR_NETWORK_LOAD_SCENARIO_TIP			:{BLACK}Start a new network game from a scenario
 
 STR_NETWORK_GAME_LOBBY						:{WHITE}Multiplayer game lobby
 
@@ -1237,7 +1242,7 @@
 STR_NETWORK_READY									:{BLACK}Ready
 
 STR_NETWORK_ERR_NOTAVAILABLE			:{WHITE} No network devices found or compiled without ENABLE_NETWORK
-STR_NETWORK_ERR_NOSERVER			:{WHITE} Could not find any network game
+STR_NETWORK_ERR_NOSERVER			:{WHITE} Could not find any network games
 STR_NETWORK_ERR_NOCONNECTION			:{WHITE} The server didn't answer the request
 STR_NETWORK_ERR_DESYNC				:{WHITE} Network-Game synchronization failed.
 STR_NETWORK_ERR_LOSTCONNECTION			:{WHITE} Network-Game connection lost.
--- a/lang/french.txt	Sun Sep 12 14:10:40 2004 +0000
+++ b/lang/french.txt	Sun Sep 12 14:12:33 2004 +0000
@@ -1199,6 +1199,8 @@
 STR_NETWORK_INFO_ICONS_TIP					:{BLACK}Langage, version du serveur, etc.
 STR_NETWORK_CLICK_GAME_TO_SELECT				:{BLACK}Cliquez une partie de la liste pour la sélectionner
 
+STR_NETWORK_PLAYERS_VAL					:{BLACK}{COMMA8}/{COMMA8}
+
 STR_NETWORK_JOIN_GAME						:{BLACK}Rejoindre la partie
 
 
--- a/lang/galician.txt	Sun Sep 12 14:10:40 2004 +0000
+++ b/lang/galician.txt	Sun Sep 12 14:12:33 2004 +0000
@@ -1145,6 +1145,8 @@
 STR_NETWORK_INFO_ICONS_TIP				:{BLACK}Idioma, versión do servidor, etc.
 STR_NETWORK_CLICK_GAME_TO_SELECT	:{BLACK}Pincha nunha partida da lista para seleccionala
 
+STR_NETWORK_PLAYERS_VAL						:{BLACK}{COMMA8}/{COMMA8}
+
 STR_NETWORK_JOIN_GAME							:{BLACK}Unirse á partida
 
 
--- a/lang/german.txt	Sun Sep 12 14:10:40 2004 +0000
+++ b/lang/german.txt	Sun Sep 12 14:12:33 2004 +0000
@@ -1199,6 +1199,8 @@
 STR_NETWORK_INFO_ICONS_TIP					:{BLACK}Sprache, Server version, etc.
 STR_NETWORK_CLICK_GAME_TO_SELECT				:{BLACK}Ein Spiel der Liste mit Anklicken wählen
 
+STR_NETWORK_PLAYERS_VAL					:{BLACK}{COMMA8}/{COMMA8}
+
 STR_NETWORK_JOIN_GAME						:{BLACK}Zum Spiel beitreten
 
 
--- a/lang/hungarian.txt	Sun Sep 12 14:10:40 2004 +0000
+++ b/lang/hungarian.txt	Sun Sep 12 14:12:33 2004 +0000
@@ -1199,6 +1199,8 @@
 STR_NETWORK_INFO_ICONS_TIP					:{BLACK}Nyelv, szerver verzió, stb.
 STR_NETWORK_CLICK_GAME_TO_SELECT				:{BLACK}Kattints a listában a jatékra hogy kiválaszd
 
+STR_NETWORK_PLAYERS_VAL					:{BLACK}{COMMA8}/{COMMA8}
+
 STR_NETWORK_JOIN_GAME						:{BLACK}Csatlakozás a játékhoz
 
 
--- a/lang/italian.txt	Sun Sep 12 14:10:40 2004 +0000
+++ b/lang/italian.txt	Sun Sep 12 14:12:33 2004 +0000
@@ -1162,6 +1162,8 @@
 STR_NETWORK_INFO_ICONS_TIP				:{BLACK}Lingua, versione server, ecc.
 STR_NETWORK_CLICK_GAME_TO_SELECT	:{BLACK}Clicca su un nome della lista per selezionarlo 
 
+STR_NETWORK_PLAYERS_VAL						:{BLACK}{COMMA8}/{COMMA8}
+
 STR_NETWORK_JOIN_GAME							:{BLACK}Entra nel gioco 
 
 
--- a/lang/polish.txt	Sun Sep 12 14:10:40 2004 +0000
+++ b/lang/polish.txt	Sun Sep 12 14:12:33 2004 +0000
@@ -1111,6 +1111,8 @@
 STR_NETWORK_INFO_ICONS_TIP              :{BLACK}Jezyk, wersja serwera, itp.
 STR_NETWORK_CLICK_GAME_TO_SELECT        :{BLACK}Klinknij na grze z listy by ja wybrac
 
+STR_NETWORK_PLAYERS_VAL									:{BLACK}{COMMA8}/{COMMA8}
+
 STR_NETWORK_JOIN_GAME                   :{BLACK}Przylacz sie do gry
 
 
--- a/lang/swedish.txt	Sun Sep 12 14:10:40 2004 +0000
+++ b/lang/swedish.txt	Sun Sep 12 14:12:33 2004 +0000
@@ -1117,6 +1117,8 @@
 STR_NETWORK_INFO_ICONS_TIP					:{BLACK}Sprĺk, server version, mm
 STR_NETWORK_CLICK_GAME_TO_SELECT				:{BLACK}Klicka pĺ ett spel frĺn listan för att välja det
 
+STR_NETWORK_PLAYERS_VAL					:{BLACK}{COMMA8}/{COMMA8}
+
 STR_NETWORK_JOIN_GAME						:{BLACK}Gĺ med i spelet
 
 
--- a/network.c	Sun Sep 12 14:10:40 2004 +0000
+++ b/network.c	Sun Sep 12 14:12:33 2004 +0000
@@ -246,31 +246,6 @@
 
 static FILE *_recv_file;
 
-typedef struct NetworkGameInfo {
-	char server_name[40];			// name of the game
-	char server_revision[8];	// server game version
-	byte server_lang;					// langid
-	byte players_max;					// max players allowed on server
-	byte players_on;					// current count of players on server
-	uint16 game_date;					// current date
-	char game_password[10];		// should fit ... 10 chars
-	char map_name[40];				// map which is played ["random" for a randomized map]
-	uint map_width;						// map width / 8
-	uint map_height;					// map height / 8
-	byte map_set;							// graphical set
-} NetworkGameInfo;
-
-typedef struct NetworkGameList {
-	NetworkGameInfo item;
-	uint32 ip;
-	uint16 port;
-	char * _next;
-} NetworkGameList;
-
-static NetworkGameInfo _network_game;
-static NetworkGameList * _network_game_list = NULL;
-
-
 /* multi os compatible sleep function */
 void CSleep(int milliseconds) {
 #if defined(WIN32)
@@ -327,6 +302,7 @@
 		_switch_mode = SM_MENU;
 		_switch_mode_errorstr = STR_NETWORK_ERR_LOSTCONNECTION;
 }
+
 static void NetworkHandleDeSync()
 {
 	DEBUG(net, 0) ("[NET] Fatal ERROR: network sync error at frame %i", _frame_counter);
@@ -354,7 +330,8 @@
 	return qp;
 }
 
-static void QueueClear(CommandQueue *nq) {
+static void QueueClear(CommandQueue *nq)
+{
 	QueuedCommand *qp;
 	while ((qp=nq->head)) {
 		// unlink it.
@@ -676,7 +653,8 @@
 	}
 }
 
-static void HandleWelcomePacket(WelcomePacket *wp) {
+static void HandleWelcomePacket(WelcomePacket *wp)
+{
 	int i;
 	for (i=0; i<MAX_PLAYERS; i++) {
 		_player_seeds[i][0]=wp->player_seeds[i][0];
@@ -1036,7 +1014,6 @@
 	//  * sync - games are in sync
 }
 
-
 static void SendQueuedCommandsToNewClient(ClientState *cs)
 {
 	// send the commands in the server queue to the new client.
@@ -1072,8 +1049,8 @@
 
 }
 
-
-bool NetworkCheckClientReady() {
+bool NetworkCheckClientReady()
+{
 	bool ready_all = true;
 	uint16 count = 0;
 	ClientState *cs;
@@ -1095,7 +1072,8 @@
 // * TCP Networking         * //
 // ************************** //
 
-unsigned long NetworkResolveHost(const char *hostname) {
+unsigned long NetworkResolveHost(const char *hostname)
+{
 	struct hostent* remotehost;
 
 	if ((hostname[0]<0x30) || (hostname[0]>0x39)) {
@@ -1291,6 +1269,7 @@
 	QueueClear(&_command_queue);
 	QueueClear(&_ack_queue);
 	_command_queue.last = &_command_queue.head;
+	_network_game_list = NULL;
 
 	// invalidate all clients
 	for(cs=_clients; cs != &_clients[MAX_CLIENTS]; cs++)
@@ -1298,7 +1277,8 @@
 
 }
 
-void NetworkClose(bool client) {
+void NetworkClose(bool client)
+{
 
 	ClientState *cs;
 	// invalidate all clients
@@ -1312,7 +1292,7 @@
 		closesocket(_listensocket);
 		_listensocket= INVALID_SOCKET;
 		DEBUG(net, 1) ("[NET][TCP] closed listener on port %i", _network_server_port);
-		}
+	}
 }
 
 void NetworkShutdown()
@@ -1331,6 +1311,7 @@
 	DEBUG(net, 3) ("[NET][SYNC] switching to synced game mode");
 	_networking_sync = true;
 	_frame_counter = 0;
+
 	if (fcreset) {
 		_frame_counter_max = 0;
 		_frame_counter_srv = 0;
@@ -1339,22 +1320,23 @@
 	_num_future_seed = 0;
 	_sync_seed_1 = _sync_seed_2 = 0;
 	memset(_my_seed_list, 0, sizeof(_my_seed_list));
-
 }
 
 // ********************************* //
 // * Network Core Console Commands * //
 // ********************************* //
 
-static _iconsole_var * NetworkConsoleCmdConnect(byte argc, byte* argv[], byte argt[]) {
+static _iconsole_var * NetworkConsoleCmdConnect(byte argc, byte* argv[], byte argt[])
+{
 	if (argc<2) return NULL;
-	if (argc==2) {
+
+	if (argc == 2) {
 		IConsolePrintF(_iconsole_color_default, "connecting to %s",argv[1]);
 		NetworkCoreConnectGame(argv[1],_network_server_port);
-	} else if (argc==3) {
+	} else if (argc == 3) {
 		IConsolePrintF(_iconsole_color_default, "connecting to %s on port %s",argv[1],argv[2]);
 		NetworkCoreConnectGame(argv[1],atoi(argv[2]));
-	} else if (argc==4) {
+	} else if (argc == 4) {
 		IConsolePrintF(_iconsole_color_default, "connecting to %s on port %s as player %s",argv[1],argv[2],argv[3]);
 		_network_playas = atoi(argv[3]);
 		NetworkCoreConnectGame(argv[1],atoi(argv[2]));
@@ -1401,7 +1383,8 @@
 
 }
 
-void NetworkUDPClose(bool client) {
+void NetworkUDPClose(bool client)
+{
 	if (client) {
 		DEBUG(net, 1) ("[NET][UDP] closed listener on port %i", _network_client_port);
 		closesocket(_udp_client_socket);
@@ -1413,7 +1396,8 @@
 		};
 	}
 
-void NetworkUDPReceive(bool client) {
+void NetworkUDPReceive(bool client)
+{
 	struct sockaddr_in client_addr;
 #ifndef __MORPHOS__
 	int client_len;
@@ -1465,9 +1449,8 @@
 	}
 }
 
-
-
-void NetworkUDPBroadCast(bool client, struct UDPPacket packet) {
+void NetworkUDPBroadCast(bool client, struct UDPPacket packet)
+{
 	int i=0, res;
 	struct sockaddr_in out_addr;
 	uint32 bcaddr;
@@ -1490,8 +1473,8 @@
 
 }
 
-void NetworkUDPSend(bool client, struct sockaddr_in recv,struct UDPPacket packet) {
-
+void NetworkUDPSend(bool client, struct sockaddr_in recv,struct UDPPacket packet)
+{
 	SOCKET udp;
 	if (client) udp=_udp_client_socket; else udp=_udp_server_socket;
 
@@ -1499,7 +1482,8 @@
 }
 
 
-bool NetworkUDPSearchGame(const byte ** _network_detected_serverip, unsigned short * _network_detected_serverport) {
+bool NetworkUDPSearchGame(const byte ** _network_detected_serverip, unsigned short * _network_detected_serverport)
+{
 	struct UDPPacket packet;
 	int timeout=3000;
 
@@ -1537,7 +1521,8 @@
 // * New Network Core System * //
 // *************************** //
 
-void NetworkIPListInit() {
+void NetworkIPListInit()
+{
 	struct hostent* he = NULL;
 	char hostname[250];
 	uint32 bcaddr;
@@ -1573,103 +1558,98 @@
 
 /* *************************************************** */
 
-void NetworkCoreInit() {
-
-DEBUG(net, 3) ("[NET][Core] init()");
-_network_available=true;
-_network_client_timeout=300;
-
-// [win32] winsock startup
-
-#if defined(WIN32)
+void NetworkCoreInit()
 {
-	WSADATA wsa;
-	DEBUG(net, 3) ("[NET][Core] using windows socket library");
-	if (WSAStartup(MAKEWORD(2,0), &wsa) != 0) {
-		DEBUG(net, 3) ("[NET][Core] error: WSAStartup failed");
-		_network_available=false;
-		}
-}
-#else
+	DEBUG(net, 3) ("[NET][Core] init()");
+	_network_available=true;
+	_network_client_timeout=300;
 
-// [morphos/amigaos] bsd-socket startup
+	// [win32] winsock startup
 
-#if defined(__MORPHOS__) || defined(__AMIGA__)
-{
-	DEBUG(misc,3) ("[NET][Core] using bsd socket library");
-	if (!(SocketBase = OpenLibrary("bsdsocket.library", 4))) {
-		DEBUG(net, 3) ("[NET][Core] Couldn't open bsdsocket.library version 4.");
-		_network_available=false;
-		}
+	#if defined(WIN32)
+	{
+		WSADATA wsa;
+		DEBUG(net, 3) ("[NET][Core] using windows socket library");
+		if (WSAStartup(MAKEWORD(2,0), &wsa) != 0) {
+			DEBUG(net, 3) ("[NET][Core] error: WSAStartup failed");
+			_network_available=false;
+			}
+	}
+	#else
 
-	#if !defined(__MORPHOS__)
-	// for usleep() implementation (only required for legacy AmigaOS builds)
-	if ( (TimerPort = CreateMsgPort()) ) {
-		if ( (TimerRequest = (struct timerequest *) CreateIORequest(TimerPort, sizeof(struct timerequest))) ) {
-			if ( OpenDevice("timer.device", UNIT_MICROHZ, (struct IORequest *) TimerRequest, 0) == 0 ) {
-				if ( !(TimerBase = TimerRequest->tr_node.io_Device) ) {
-					// free ressources...
-					DEBUG(net, 3) ("[NET][Core] Couldn't initialize timer.");
-					_network_available=false;
+	// [morphos/amigaos] bsd-socket startup
+
+	#if defined(__MORPHOS__) || defined(__AMIGA__)
+	{
+		DEBUG(misc,3) ("[NET][Core] using bsd socket library");
+		if (!(SocketBase = OpenLibrary("bsdsocket.library", 4))) {
+			DEBUG(net, 3) ("[NET][Core] Couldn't open bsdsocket.library version 4.");
+			_network_available=false;
+			}
+
+		#if !defined(__MORPHOS__)
+		// for usleep() implementation (only required for legacy AmigaOS builds)
+		if ( (TimerPort = CreateMsgPort()) ) {
+			if ( (TimerRequest = (struct timerequest *) CreateIORequest(TimerPort, sizeof(struct timerequest))) ) {
+				if ( OpenDevice("timer.device", UNIT_MICROHZ, (struct IORequest *) TimerRequest, 0) == 0 ) {
+					if ( !(TimerBase = TimerRequest->tr_node.io_Device) ) {
+						// free ressources...
+						DEBUG(net, 3) ("[NET][Core] Couldn't initialize timer.");
+						_network_available=false;
+					}
 				}
 			}
 		}
+		#endif
+
+	}
+	#else
+
+	// [linux/macos] unix-socket startup
+
+		DEBUG(net, 3) ("[NET][Core] using unix socket library");
+
+	#endif
+
+	#endif
+
+
+	if (_network_available) {
+		DEBUG(net, 3) ("[NET][Core] OK: multiplayer available");
+		// initiate network ip list
+		NetworkIPListInit();
+		IConsoleCmdRegister("connect",NetworkConsoleCmdConnect);
+		IConsoleVarRegister("net_client_timeout",&_network_client_timeout,ICONSOLE_VAR_UINT16);
+		IConsoleVarRegister("net_ready_ahead",&_network_ready_ahead,ICONSOLE_VAR_UINT16);
+		IConsoleVarRegister("net_sync_freq",&_network_sync_freq,ICONSOLE_VAR_UINT16);
+	} else
+		DEBUG(net, 3) ("[NET][Core] FAILED: multiplayer not available");
+}
+
+/* *************************************************** */
+
+void NetworkCoreShutdown()
+{
+	DEBUG(net, 3) ("[NET][Core] shutdown()");
+
+	#if defined(__MORPHOS__) || defined(__AMIGA__)
+	{
+		// free allocated ressources
+		#if !defined(__MORPHOS__)
+		if (TimerBase)    { CloseDevice((struct IORequest *) TimerRequest); }
+		if (TimerRequest) { DeleteIORequest(TimerRequest); }
+		if (TimerPort)    { DeleteMsgPort(TimerPort); }
+		#endif
+
+		if (SocketBase) {
+			CloseLibrary(SocketBase);
+		}
 	}
 	#endif
 
-}
-#else
-
-// [linux/macos] unix-socket startup
-
-	DEBUG(net, 3) ("[NET][Core] using unix socket library");
-
-#endif
-
-#endif
-
-
-if (_network_available) {
-	DEBUG(net, 3) ("[NET][Core] OK: multiplayer available");
-	// initiate network ip list
-	NetworkIPListInit();
-	IConsoleCmdRegister("connect",NetworkConsoleCmdConnect);
-	IConsoleVarRegister("net_client_timeout",&_network_client_timeout,ICONSOLE_VAR_UINT16);
-	IConsoleVarRegister("net_ready_ahead",&_network_ready_ahead,ICONSOLE_VAR_UINT16);
-	IConsoleVarRegister("net_sync_freq",&_network_sync_freq,ICONSOLE_VAR_UINT16);
-	} else {
-	DEBUG(net, 3) ("[NET][Core] FAILED: multiplayer not available");
-	}
-}
-
-/* *************************************************** */
-
-void NetworkCoreShutdown() {
-
-DEBUG(net, 3) ("[NET][Core] shutdown()");
-
-#if defined(__MORPHOS__) || defined(__AMIGA__)
-{
-	// free allocated ressources
-	#if !defined(__MORPHOS__)
-  if (TimerBase)    { CloseDevice((struct IORequest *) TimerRequest); }
-  if (TimerRequest) { DeleteIORequest(TimerRequest); }
-  if (TimerPort)    { DeleteMsgPort(TimerPort); }
+	#if defined(WIN32)
+	{ WSACleanup();}
 	#endif
-
-	if (SocketBase) {
-		CloseLibrary(SocketBase);
-	}
-}
-#endif
-
-
-#if defined(WIN32)
-{
-	WSACleanup();
-}
-#endif
-
 }
 
 /* *************************************************** */
@@ -1707,6 +1687,13 @@
 
 /* *************************************************** */
 
+bool NetworkCoreConnectGameStruct(NetworkGameList * item)
+{
+	return NetworkCoreConnectGame(inet_ntoa(*(struct in_addr *) &item->ip),item->port);
+}
+
+/* *************************************************** */
+
 bool NetworkCoreStartGame()
 {
 	if (!_network_available) return false;
@@ -1741,39 +1728,33 @@
 
 /* *************************************************** */
 
-void NetworkCoreLoop(bool incomming) {
-
-
-if (incomming) {
+void NetworkCoreLoop(bool incomming)
+{
+	if (incomming) {
+		// incomming
+		if ( _udp_client_socket != INVALID_SOCKET ) NetworkUDPReceive(true);
+		if ( _udp_server_socket != INVALID_SOCKET ) NetworkUDPReceive(false);
 
-	// incomming
-
-	if ( _udp_client_socket != INVALID_SOCKET ) NetworkUDPReceive(true);
-	if ( _udp_server_socket != INVALID_SOCKET ) NetworkUDPReceive(false);
-
-	if (_networking) {
-		NetworkReceive();
-		}
+		if (_networking)
+			NetworkReceive();
 
 	} else {
-
-	if ( _udp_client_socket != INVALID_SOCKET ) NetworkUDPReceive(true);
-	if ( _udp_server_socket != INVALID_SOCKET ) NetworkUDPReceive(false);
+		if ( _udp_client_socket != INVALID_SOCKET ) NetworkUDPReceive(true);
+		if ( _udp_server_socket != INVALID_SOCKET ) NetworkUDPReceive(false);
 
-	if (_networking) {
-		NetworkSend();
-		}
-
+		if (_networking)
+			NetworkSend();
 	}
-
 }
 
-void NetworkLobbyInit() {
+void NetworkLobbyInit()
+{
 	DEBUG(net, 3) ("[NET][Lobby] init()");
 	NetworkUDPListen(true);
 }
 
-void NetworkLobbyShutdown() {
+void NetworkLobbyShutdown()
+{
 	DEBUG(net, 3) ("[NET][Lobby] shutdown()");
 	NetworkUDPClose(true);
 }
@@ -1783,46 +1764,52 @@
 // * Network Game List Extensions * //
 // ******************************** //
 
-void NetworkGameListClear() {
-NetworkGameList * item;
-NetworkGameList * next;
-
-DEBUG(net, 4) ("[NET][G-List] cleared server list");
+void NetworkGameListClear()
+{
+	NetworkGameList * item;
+	NetworkGameList * next;
 
-item = _network_game_list;
-while (item != NULL) {
-	next = (NetworkGameList *) item -> _next;
-	free (item);
-	item = next;
+	DEBUG(net, 4) ("[NET][G-List] cleared server list");
+
+	item = _network_game_list;
+
+	while (item != NULL) {
+		next = (NetworkGameList *) item -> _next;
+		free (item);
+		item = next;
 	}
-_network_game_list=NULL;
-_network_game_count=0;
+	_network_game_list=NULL;
+	_network_game_count=0;
 }
 
-char * NetworkGameListAdd() {
-NetworkGameList * item;
-NetworkGameList * before;
+NetworkGameList * NetworkGameListAdd()
+{
+	NetworkGameList * item;
+	NetworkGameList * before;
 
-DEBUG(net, 4) ("[NET][G-List] added server to list");
+	DEBUG(net, 4) ("[NET][G-List] added server to list");
 
-item = _network_game_list;
-before = item;
-while (item != NULL) {
+	item = _network_game_list;
 	before = item;
-	item = (NetworkGameList *) item -> _next;
+	while (item != NULL) {
+		before = item;
+		item = (NetworkGameList *) item -> _next;
 	}
-item = malloc(sizeof(NetworkGameList));
-item -> _next = NULL;
-if (before == NULL) {
-	_network_game_list = item;
-	} else {
-	before -> _next = (char *) item;
-	}
-_network_game_count++;
-return (char *) item;
+
+	item = malloc(sizeof(NetworkGameList));
+	item -> _next = NULL;
+
+	if (before == NULL) {
+		_network_game_list = item;
+	} else
+		before -> _next = item;
+
+	_network_game_count++;
+	return item;
 }
 
-void NetworkGameListFromLAN() {
+void NetworkGameListFromLAN()
+{
 	struct UDPPacket packet;
 	DEBUG(net, 2) ("[NET][G-List] searching server over lan");
 	NetworkGameListClear();
@@ -1831,35 +1818,37 @@
 	NetworkUDPBroadCast(true,packet);
 }
 
-void NetworkGameListFromInternet() {
+void NetworkGameListFromInternet()
+{
 	DEBUG(net, 2) ("[NET][G-List] searching servers over internet");
 	NetworkGameListClear();
 
 	// **TODO** masterserver communication [internet protocol list]
-
 }
 
-char * NetworkGameListItem(uint16 index) {
-NetworkGameList * item;
-NetworkGameList * next;
-uint16 cnt = 0;
+NetworkGameList * NetworkGameListItem(uint16 index)
+{
+	NetworkGameList * item;
+	NetworkGameList * next;
+	uint16 cnt = 0;
 
-item = _network_game_list;
+	item = _network_game_list;
 
-while ((item != NULL) && (cnt != index)) {
-	next = (NetworkGameList *) item -> _next;
-	item = next;
-	cnt++;
+	while ((item != NULL) && (cnt != index)) {
+		next = (NetworkGameList *) item -> _next;
+		item = next;
+		cnt++;
 	}
 
-return (char *) item;
+	return item;
 }
 
 // *************************** //
 // * Network Game Extensions * //
 // *************************** //
 
-void NetworkGameFillDefaults() {
+void NetworkGameFillDefaults()
+{
 	NetworkGameInfo * game = &_network_game;
 #if defined(WITH_REV)
 	extern char _openttd_revision[];
@@ -1887,10 +1876,10 @@
 	game->server_lang=_dynlang.curr;
 }
 
-void NetworkGameChangeDate(uint16 newdate) {
-	if (_networking_server) {
+void NetworkGameChangeDate(uint16 newdate)
+{
+	if (_networking_server)
 		_network_game.game_date = newdate;
-		}
 }
 
 #else // not ENABLE_NETWORK
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/network.h	Sun Sep 12 14:12:33 2004 +0000
@@ -0,0 +1,30 @@
+#ifndef NETWORK_H
+#define NETWORK_H
+
+typedef struct NetworkGameInfo {
+	char server_name[40];			// name of the game
+	char server_revision[8];	// server game version
+	byte server_lang;					// langid
+	byte players_max;					// max players allowed on server
+	byte players_on;					// current count of players on server
+	uint16 game_date;					// current date
+	char game_password[10];		// should fit ... 10 chars
+	char map_name[40];				// map which is played ["random" for a randomized map]
+	uint map_width;						// map width / 8
+	uint map_height;					// map height / 8
+	byte map_set;							// graphical set
+} NetworkGameInfo;
+
+//typedef struct NetworkGameList;
+
+typedef struct NetworkGameList {
+	NetworkGameInfo item;
+	uint32 ip;
+	uint16 port;
+	struct NetworkGameList * _next;
+} NetworkGameList;
+
+NetworkGameInfo _network_game;
+NetworkGameList * _network_game_list;
+
+#endif /* NETWORK_H */
--- a/network_gui.c	Sun Sep 12 14:10:40 2004 +0000
+++ b/network_gui.c	Sun Sep 12 14:12:33 2004 +0000
@@ -4,6 +4,7 @@
 #include "gui.h"
 #include "gfx.h"
 #include "command.h"
+#include "network.h"
 
 #define BGC 5
 #define BTC 15
@@ -33,15 +34,16 @@
 static byte _network_connection;
 static uint16 _network_game_count_last;
 
+enum {
+  NET_PRC__OFFSET_TOP_WIDGET	= 93,
+	NET_PRC__SIZE_OF_ROW				= 14,
+};
+
+static NetworkGameList *selected_item = NULL;
+
 static void NetworkGameWindowWndProc(Window *w, WindowEvent *e)
 {
 	switch(e->event) {
-	case WE_TICK: {
-		if (_network_game_count_last != _network_game_count) {
-			SetWindowDirty(w);
-			}
-		}
-		break;
 	case WE_PAINT: {
 
 		SET_DPARAM16(0, 0x00);
@@ -57,6 +59,26 @@
 		DrawString(238, 82, STR_NETWORK_PLAYERS, 2);
 		DrawString(288, 82, STR_NETWORK_MAP_SIZE, 2);
 
+		{ // draw list of games
+			uint16 y = NET_PRC__OFFSET_TOP_WIDGET + 3;
+			int32 n = 0;
+			NetworkGameList *cur_item = _network_game_list;
+			while (cur_item != NULL) {
+				if (cur_item == selected_item)
+					GfxFillRect(11, y - 2, 380, y + 9, 10); // show highlighted item with a different colour
+
+				DoDrawString(cur_item->item.server_name, 15, y, 16); // server name
+
+				SET_DPARAM8(0, cur_item->item.players_on);
+				SET_DPARAM8(1, cur_item->item.players_max);
+				DrawString(238, y, STR_NETWORK_PLAYERS_VAL, 2); // #/#
+
+				DoDrawString(cur_item->item.map_name, 288, y, 16); // map size
+				cur_item = cur_item->_next;
+				y += NET_PRC__SIZE_OF_ROW;
+				if (++n == w->vscroll.cap) { break;} // max number of games in the window
+			}
+		}
 	}	break;
 
 	case WE_CLICK:
@@ -88,23 +110,48 @@
 		case 7: case 8: /* Connection type */
 			ShowDropDownMenu(w, _connection_types_dropdown, _network_connection, 8, 0); // do it for widget 8
 			return;
+		case 14: { /* Matrix to show networkgames */
+			uint32 id_v = (e->click.pt.y - NET_PRC__OFFSET_TOP_WIDGET) / NET_PRC__SIZE_OF_ROW;
+
+			if (id_v >= w->vscroll.cap) { return;} // click out of bounds
+
+			id_v += w->vscroll.pos;
+
+			{
+				NetworkGameList *cur_item = _network_game_list;
+				int32 n = 0;
+				while (cur_item != NULL) {
+					if (n++ == id_v) { break;} // found clicked item
+
+					cur_item = cur_item->_next;
+				}
+
+				if (cur_item == NULL) { return;} // click out of vehicle bounds
+
+				selected_item = cur_item;
+			}
+		} break;
+		case 16: /* Join Game */
+			if (selected_item != NULL)
+				NetworkCoreConnectGameStruct(selected_item);
+			break;
 		}
 		break;
 
 	case WE_DROPDOWN_SELECT: /* we have selected a dropdown item in the list */
 		_network_connection = e->dropdown.index;
 		switch (_network_connection) {
-		case 0:
+		case 0: /* LAN */
 			NetworkGameListFromLAN();
-			_network_game_count_last = _network_game_count;
-			SetWindowDirty(w);
 			break;
-		case 1:
+		case 1: /* Internet */
 			NetworkGameListFromInternet();
-			_network_game_count_last = _network_game_count;
-			SetWindowDirty(w);
 			break;
 		}
+		
+		_network_game_count_last = _network_game_count;
+		SetWindowDirty(w);
+
 		break;
 
 	case WE_MOUSELOOP:
@@ -126,16 +173,20 @@
 
 	case WE_ON_EDIT_TEXT: {
 		const byte *b = e->edittext.str;
-		if (*b == 0)
-			return;
-		NetworkCoreConnectGame(b,_network_server_port);
+		if (*b != 0)
+			NetworkCoreConnectGame(b, _network_server_port);
+	} break;
+
+	case WE_TICK: {
+		if (_network_game_count_last != _network_game_count)
+			SetWindowDirty(w);
 	} break;
 
 	}
 }
 
 static const Widget _network_game_window_widgets[] = {
-{ WWT_PUSHTXTBTN,   BGC,     0,    10,     0,    13, STR_00C5,										STR_018B_CLOSE_WINDOW},
+{   WWT_CLOSEBOX,   BGC,     0,    10,     0,    13, STR_00C5,										STR_018B_CLOSE_WINDOW},
 {    WWT_CAPTION,   BGC,    10,   399,     0,    13, STR_NETWORK_MULTIPLAYER,			STR_NULL},
 {     WWT_IMGBTN,   BGC,     0,   399,    14,   199, 0x0,													STR_NULL},
 
@@ -148,14 +199,14 @@
 {          WWT_6,   BGC,   250,   393,    62,    73, STR_NETWORK_COMBO1,					STR_NETWORK_CONNECTION_TYPE_TIP},
 {   WWT_CLOSEBOX,   BGC,   382,   392,    63,    72, STR_0225,										STR_NETWORK_CONNECTION_TYPE_TIP},
 
-{  WWT_SCROLLBAR,   BGC,   382,   392,    81,   175, 0x0,													STR_0190_SCROLL_BAR_SCROLLS_LIST},
+{  WWT_SCROLLBAR,   BGC,   382,   392,    81,   176, 0x0,													STR_0190_SCROLL_BAR_SCROLLS_LIST},
 
 {     WWT_IMGBTN,   BTC,    10,   231,    81,    92, 0x0,													STR_NETWORK_GAME_NAME_TIP },
 {     WWT_IMGBTN,   BTC,   232,   281,    81,    92, 0x0,													STR_NETWORK_PLAYERS_TIP },
 {     WWT_IMGBTN,   BTC,   282,   331,    81,    92, 0x0,													STR_NETWORK_MAP_SIZE_TIP },
 {     WWT_IMGBTN,   BTC,   332,   381,    81,    92, 0x0,													STR_NETWORK_INFO_ICONS_TIP },
 
-{     WWT_MATRIX,   BGC,    10,   381,    93,   175, 0x601,												STR_NETWORK_CLICK_GAME_TO_SELECT},
+{     WWT_MATRIX,   BGC,    10,   381,    93,   176, 0x601,												STR_NETWORK_CLICK_GAME_TO_SELECT},
 
 { WWT_PUSHTXTBTN,   BTC,   145,   255,   180,   191, STR_012E_CANCEL,							STR_NULL},
 { WWT_PUSHTXTBTN,   BTC,   270,   392,   180,   191, STR_NETWORK_JOIN_GAME,				STR_NULL},
@@ -180,6 +231,9 @@
 
 	w = AllocateWindowDesc(&_network_game_window_desc);
 	strcpy(_edit_str_buf, "Your name");
+	w->vscroll.cap = 6;
+	w->disabled_state = (1<<6) | (1<<7) | (1<<8); // disable buttons not yet working
+	NetworkGameListFromLAN(); // default dropdown item is LAN, so fill that array
 
 	_network_game_count_last = _network_game_count;
 
@@ -232,18 +286,21 @@
 			return;
 		case  9: /* Start game */
 			NetworkCoreStartGame();
+			strcpy(_network_game.server_name,	WP(w,querystr_d).buf);
 			//ShowNetworkLobbyWindow();
 			DoCommandP(0, 0, 0, NULL, CMD_START_NEW_GAME);
 			break;
 		case 10: /* Load game */
 			NetworkCoreStartGame();
+			strcpy(_network_game.server_name,	WP(w,querystr_d).buf);
 			//ShowNetworkLobbyWindow();
 			ShowSaveLoadDialog(SLD_LOAD_GAME);
 			break;
 		case 11: /* Load scenario */
 			NetworkCoreStartGame();
+			strcpy(_network_game.server_name,	WP(w,querystr_d).buf);
 			//ShowNetworkLobbyWindow();
-			ShowSaveLoadDialog(SLD_LOAD_SCENARIO);;
+			ShowSaveLoadDialog(SLD_LOAD_SCENARIO);
 			break;
 		}
 		break;
@@ -287,9 +344,9 @@
 {          WWT_6,   BGC,   260,   390,    81,    92, STR_NETWORK_COMBO2,						STR_NETWORK_NUMBER_OF_PLAYERS_TIP},
 {   WWT_CLOSEBOX,   BGC,   379,   389,    82,    91, STR_0225,											STR_NETWORK_NUMBER_OF_PLAYERS_TIP},
 
-{ WWT_PUSHTXTBTN,   BTC,    10,   100,   180,   191, STR_NETWORK_START_GAME,				STR_NULL},
-{ WWT_PUSHTXTBTN,   BTC,   110,   200,   180,   191, STR_NETWORK_LOAD_GAME,					STR_NULL},
-{ WWT_PUSHTXTBTN,   BTC,   210,   300,   180,   191, STR_NETWORK_LOAD_SCENARIO,			STR_NULL},
+{ WWT_PUSHTXTBTN,   BTC,    10,   100,   180,   191, STR_NETWORK_START_GAME,				STR_NETWORK_START_GAME_TIP},
+{ WWT_PUSHTXTBTN,   BTC,   110,   200,   180,   191, STR_NETWORK_LOAD_GAME,					STR_NETWORK_LOAD_GAME_TIP},
+{ WWT_PUSHTXTBTN,   BTC,   210,   300,   180,   191, STR_NETWORK_LOAD_SCENARIO,			STR_NETWORK_LOAD_SCENARIO_TIP},
 { WWT_PUSHTXTBTN,   BTC,   310,   390,   180,   191, STR_012E_CANCEL,								STR_NULL},
 {   WIDGETS_END},
 };
@@ -309,6 +366,7 @@
 
 	w = AllocateWindowDesc(&_network_start_server_window_desc);
 	strcpy(_edit_str_buf, "");
+	w->disabled_state = (1<<4) | (1<<5) | (1<<6) | (1<<7) | (1<<8); // disable buttons not yet working
 
 	WP(w,querystr_d).caret = 1;
 	WP(w,querystr_d).maxlen = MAX_QUERYSTR_LEN;
@@ -375,7 +433,7 @@
 }
 
 static const Widget _network_lobby_window_widgets[] = {
-{ WWT_PUSHTXTBTN,   BGC,     0,    10,     0,    13, STR_00C5,									STR_018B_CLOSE_WINDOW },
+{   WWT_CLOSEBOX,   BGC,     0,    10,     0,    13, STR_00C5,									STR_018B_CLOSE_WINDOW },
 {    WWT_CAPTION,   BGC,    10,   399,     0,    13, STR_NETWORK_GAME_LOBBY,		STR_NULL},
 {     WWT_IMGBTN,   BGC,     0,   399,    14,   299, 0x0,												STR_NULL},
 
--- a/ttd.vcproj	Sun Sep 12 14:10:40 2004 +0000
+++ b/ttd.vcproj	Sun Sep 12 14:12:33 2004 +0000
@@ -1135,6 +1135,9 @@
 				RelativePath="macros.h">
 			</File>
 			<File
+				RelativePath=".\network.h">
+			</File>
+			<File
 				RelativePath="news.h">
 			</File>
 			<File
--- a/window.c	Sun Sep 12 14:10:40 2004 +0000
+++ b/window.c	Sun Sep 12 14:12:33 2004 +0000
@@ -25,19 +25,19 @@
 		if (e.click.widget < 0) return; /* exit if clicked outside of widgets */
 
 		wi = &w->widget[e.click.widget];
+				
+		/* don't allow any interaction if the button has been disabled */
+		if (HASBIT(w->disabled_state, e.click.widget))
+			return;
 
 		if (wi->type & 0xE0) {
-			/* special widget handling */
+			/* special widget handling for buttons*/
 			switch(wi->type) {
-			case WWT_IMGBTN | WWB_PUSHBUTTON:
-			case WWT_TEXTBTN | WWB_PUSHBUTTON:
-				if (HASBIT(w->disabled_state, e.click.widget))
-					return; /* don't allow click if disabled */
+			case WWT_IMGBTN  | WWB_PUSHBUTTON: /* WWT_PUSHIMGBTN */
+			case WWT_TEXTBTN | WWB_PUSHBUTTON: /* WWT_PUSHTXTBTN */
 				HandleButtonClick(w, e.click.widget);
 				break;
 			case WWT_NODISTXTBTN:
-				if (HASBIT(w->disabled_state, e.click.widget))
-					return; /* don't allow click if disabled */
 				break;
 			}
 		} else if (wi->type == WWT_SCROLLBAR || wi->type == WWT_HSCROLLBAR) {