(svn r212) -Fix: Network-gui fixes (sign_de)

-Fix: any disabled button in a window doesn't receive WE_CLICK events
-Added network.h
This commit is contained in:
darkvater 2004-09-12 14:12:33 +00:00
parent 7a6512a654
commit 24512d3da5
17 changed files with 342 additions and 234 deletions

View File

@ -1,6 +1,8 @@
#ifndef FUNCTIONS_H #ifndef FUNCTIONS_H
#define FUNCTIONS_H #define FUNCTIONS_H
#include "network.h"
/* vehicle.c */ /* vehicle.c */
/* window.c */ /* window.c */
@ -144,16 +146,17 @@ void NetworkCoreShutdown();
void NetworkCoreDisconnect(); void NetworkCoreDisconnect();
void NetworkCoreLoop(bool incomming); void NetworkCoreLoop(bool incomming);
bool NetworkCoreConnectGame(const byte* b, unsigned short port); bool NetworkCoreConnectGame(const byte* b, unsigned short port);
bool NetworkCoreConnectGameStruct(NetworkGameList * item);
bool NetworkCoreStartGame(); bool NetworkCoreStartGame();
void NetworkLobbyShutdown(); void NetworkLobbyShutdown();
void NetworkLobbyInit(); void NetworkLobbyInit();
void NetworkGameListClear(); void NetworkGameListClear();
char * NetworkGameListAdd(); NetworkGameList * NetworkGameListAdd();
void NetworkGameListFromLAN(); void NetworkGameListFromLAN();
void NetworkGameListFromInternet(); void NetworkGameListFromInternet();
char * NetworkGameListItem(uint16 index); NetworkGameList * NetworkGameListItem(uint16 index);
void NetworkGameFillDefaults(); void NetworkGameFillDefaults();
void NetworkGameChangeDate(uint16 newdate); void NetworkGameChangeDate(uint16 newdate);

View File

@ -1145,6 +1145,8 @@ STR_NETWORK_MAP_SIZE_TIP :{BLACK}Size of the map
STR_NETWORK_INFO_ICONS_TIP :{BLACK}Language, server version, etc. 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_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_JOIN_GAME :{BLACK}Join game

View File

@ -1199,6 +1199,8 @@ STR_NETWORK_MAP_SIZE_TIP :{BLACK}Velikost mapy
STR_NETWORK_INFO_ICONS_TIP :{BLACK}Jazyk, verze serveru, atd. STR_NETWORK_INFO_ICONS_TIP :{BLACK}Jazyk, verze serveru, atd.
STR_NETWORK_CLICK_GAME_TO_SELECT :{BLACK}Hru vyberes kliknutim do seznamu 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 STR_NETWORK_JOIN_GAME :{BLACK}Pridat se

View File

@ -1144,6 +1144,8 @@ STR_NETWORK_MAP_SIZE_TIP :{BLACK}Grootte van de kaart
STR_NETWORK_INFO_ICONS_TIP :{BLACK}Taal, serverversie, etc. 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_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 STR_NETWORK_JOIN_GAME :{BLACK}Meespelen

View File

@ -799,10 +799,10 @@ STR_02FC_LOAD_A_SAVED_GAME_FROM :{BLACK}Load a saved game from disk
STR_02FD_VIEW_DEMONSTRATIONS_TUTORIALS :{BLACK}View demonstrations/tutorials STR_02FD_VIEW_DEMONSTRATIONS_TUTORIALS :{BLACK}View demonstrations/tutorials
STR_02FE_CREATE_A_CUSTOMIZED_GAME :{BLACK}Create a customized game world/scenario 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_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_0301_DISPLAY_GAME_OPTIONS :{BLACK}Display game options
STR_0302_DISPLAY_DIFFICULTY_OPTIONS :{BLACK}Display difficulty 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_0304_QUIT :{BLACK}Quit
STR_0305_LEAVE_OPENTTD :{BLACK}Leave 'OpenTTD', and quit STR_0305_LEAVE_OPENTTD :{BLACK}Leave 'OpenTTD', and quit
STR_0306_VIEW_DEMONSTRATION_TUTORIAL :{BLACK}View demonstration/tutorial STR_0306_VIEW_DEMONSTRATION_TUTORIAL :{BLACK}View demonstration/tutorial
@ -956,9 +956,9 @@ STR_ROADVEHICLE_AUTORENEW_FAILED :{WHITE}Autorenew failed on road vehicle {CO
STR_SHIP_AUTORENEW_FAILED :{WHITE}Autorenew failed on ship {COMMA16} (money limit) 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_AIRCRAFT_AUTORENEW_FAILED :{WHITE}Autorenew failed on aircraft {COMMA16} (money limit)
STR_CONFIG_PATCHES :{BLACK}Configure Patches STR_CONFIG_PATCHES :{BLACK}Configure Patches
STR_CONFIG_PATCHES_TIP :{BLACK}Configure the patches STR_CONFIG_PATCHES_TIP :{BLACK}Configure the patches
STR_CONFIG_PATCHES_CAPTION :{WHITE}Configure Patches STR_CONFIG_PATCHES_CAPTION :{WHITE}Configure Patches
STR_CONFIG_PATCHES_OFF :Off STR_CONFIG_PATCHES_OFF :Off
STR_CONFIG_PATCHES_ON :On STR_CONFIG_PATCHES_ON :On
@ -1169,7 +1169,7 @@ TEMP_AI_ACTIVATED :{WHITE}Warning: this new AI is still alpha! Currently, o
############ network gui strings ############ 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 STR_NETWORK_MULTIPLAYER :{WHITE}Multiplayer
@ -1185,7 +1185,7 @@ STR_NETWORK_PLAYER_NAME :{BLACK}Player name:
STR_NETWORK_ENTER_NAME_TIP :{BLACK}This is the name other players will identify you by 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_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_COMBO1 :{BLACK}{SKIP}{SKIP}{STRING}
STR_NETWORK_LAN :LAN STR_NETWORK_LAN :LAN
STR_NETWORK_INTERNET :Internet STR_NETWORK_INTERNET :Internet
@ -1199,10 +1199,12 @@ STR_NETWORK_MAP_SIZE_TIP :{BLACK}Size of the map
STR_NETWORK_INFO_ICONS_TIP :{BLACK}Language, server version, etc. 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_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_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 :{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 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_PASSWORD_TIP :{BLACK}Protect your game with a password if you do
STR_NETWORK_SELECT_MAP :{BLACK}Select a map: STR_NETWORK_SELECT_MAP :{BLACK}Select a map:
STR_NETWORK_SELECT_MAP_TIP :{BLACK}Which map do you want to play? 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 :{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_COMBO2 :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
STR_NETWORK_2_PLAYERS :2 players STR_NETWORK_2_PLAYERS :2 players
STR_NETWORK_3_PLAYERS :3 players STR_NETWORK_3_PLAYERS :3 players
@ -1221,8 +1223,11 @@ STR_NETWORK_6_PLAYERS :6 players
STR_NETWORK_7_PLAYERS :7 players STR_NETWORK_7_PLAYERS :7 players
STR_NETWORK_8_PLAYERS :8 players STR_NETWORK_8_PLAYERS :8 players
STR_NETWORK_START_GAME :{BLACK}Start Game 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 :{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 :{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 STR_NETWORK_GAME_LOBBY :{WHITE}Multiplayer game lobby
@ -1237,7 +1242,7 @@ STR_NETWORK_NEW_COMPANY_TIP :{BLACK}Open a new company
STR_NETWORK_READY :{BLACK}Ready STR_NETWORK_READY :{BLACK}Ready
STR_NETWORK_ERR_NOTAVAILABLE :{WHITE} No network devices found or compiled without ENABLE_NETWORK 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_NOCONNECTION :{WHITE} The server didn't answer the request
STR_NETWORK_ERR_DESYNC :{WHITE} Network-Game synchronization failed. STR_NETWORK_ERR_DESYNC :{WHITE} Network-Game synchronization failed.
STR_NETWORK_ERR_LOSTCONNECTION :{WHITE} Network-Game connection lost. STR_NETWORK_ERR_LOSTCONNECTION :{WHITE} Network-Game connection lost.

View File

@ -1199,6 +1199,8 @@ STR_NETWORK_MAP_SIZE_TIP :{BLACK}Taille de la carte
STR_NETWORK_INFO_ICONS_TIP :{BLACK}Langage, version du serveur, etc. 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_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 STR_NETWORK_JOIN_GAME :{BLACK}Rejoindre la partie

View File

@ -1145,6 +1145,8 @@ STR_NETWORK_MAP_SIZE_TIP :{BLACK}Tama
STR_NETWORK_INFO_ICONS_TIP :{BLACK}Idioma, versión do servidor, etc. 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_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 STR_NETWORK_JOIN_GAME :{BLACK}Unirse á partida

View File

@ -1199,6 +1199,8 @@ STR_NETWORK_MAP_SIZE_TIP :{BLACK}Gr
STR_NETWORK_INFO_ICONS_TIP :{BLACK}Sprache, Server version, etc. 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_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 STR_NETWORK_JOIN_GAME :{BLACK}Zum Spiel beitreten

View File

@ -1199,6 +1199,8 @@ STR_NETWORK_MAP_SIZE_TIP :{BLACK}A t
STR_NETWORK_INFO_ICONS_TIP :{BLACK}Nyelv, szerver verzió, stb. 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_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 STR_NETWORK_JOIN_GAME :{BLACK}Csatlakozás a játékhoz

View File

@ -1162,6 +1162,8 @@ STR_NETWORK_MAP_SIZE_TIP :{BLACK}Dimensione della mappa
STR_NETWORK_INFO_ICONS_TIP :{BLACK}Lingua, versione server, ecc. 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_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 STR_NETWORK_JOIN_GAME :{BLACK}Entra nel gioco

View File

@ -1111,6 +1111,8 @@ STR_NETWORK_MAP_SIZE_TIP :{BLACK}Rozmiar mapy
STR_NETWORK_INFO_ICONS_TIP :{BLACK}Jezyk, wersja serwera, itp. 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_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 STR_NETWORK_JOIN_GAME :{BLACK}Przylacz sie do gry

View File

@ -1117,6 +1117,8 @@ STR_NETWORK_MAP_SIZE_TIP :{BLACK}Storlek p
STR_NETWORK_INFO_ICONS_TIP :{BLACK}Språk, server version, mm 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_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 STR_NETWORK_JOIN_GAME :{BLACK}Gå med i spelet

373
network.c
View File

@ -246,31 +246,6 @@ static size_t _transmit_file_size;
static FILE *_recv_file; 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 */ /* multi os compatible sleep function */
void CSleep(int milliseconds) { void CSleep(int milliseconds) {
#if defined(WIN32) #if defined(WIN32)
@ -327,6 +302,7 @@ static void NetworkHandleConnectionLost()
_switch_mode = SM_MENU; _switch_mode = SM_MENU;
_switch_mode_errorstr = STR_NETWORK_ERR_LOSTCONNECTION; _switch_mode_errorstr = STR_NETWORK_ERR_LOSTCONNECTION;
} }
static void NetworkHandleDeSync() static void NetworkHandleDeSync()
{ {
DEBUG(net, 0) ("[NET] Fatal ERROR: network sync error at frame %i", _frame_counter); DEBUG(net, 0) ("[NET] Fatal ERROR: network sync error at frame %i", _frame_counter);
@ -354,7 +330,8 @@ static QueuedCommand *AllocQueuedCommand(CommandQueue *nq)
return qp; return qp;
} }
static void QueueClear(CommandQueue *nq) { static void QueueClear(CommandQueue *nq)
{
QueuedCommand *qp; QueuedCommand *qp;
while ((qp=nq->head)) { while ((qp=nq->head)) {
// unlink it. // unlink it.
@ -676,7 +653,8 @@ static void HandleFilePacket(FilePacketHdr *fp)
} }
} }
static void HandleWelcomePacket(WelcomePacket *wp) { static void HandleWelcomePacket(WelcomePacket *wp)
{
int i; int i;
for (i=0; i<MAX_PLAYERS; i++) { for (i=0; i<MAX_PLAYERS; i++) {
_player_seeds[i][0]=wp->player_seeds[i][0]; _player_seeds[i][0]=wp->player_seeds[i][0];
@ -1036,7 +1014,6 @@ static void NetworkAcceptClients()
// * sync - games are in sync // * sync - games are in sync
} }
static void SendQueuedCommandsToNewClient(ClientState *cs) static void SendQueuedCommandsToNewClient(ClientState *cs)
{ {
// send the commands in the server queue to the new client. // send the commands in the server queue to the new client.
@ -1072,8 +1049,8 @@ static void SendQueuedCommandsToNewClient(ClientState *cs)
} }
bool NetworkCheckClientReady()
bool NetworkCheckClientReady() { {
bool ready_all = true; bool ready_all = true;
uint16 count = 0; uint16 count = 0;
ClientState *cs; ClientState *cs;
@ -1095,7 +1072,8 @@ bool NetworkCheckClientReady() {
// * TCP Networking * // // * TCP Networking * //
// ************************** // // ************************** //
unsigned long NetworkResolveHost(const char *hostname) { unsigned long NetworkResolveHost(const char *hostname)
{
struct hostent* remotehost; struct hostent* remotehost;
if ((hostname[0]<0x30) || (hostname[0]>0x39)) { if ((hostname[0]<0x30) || (hostname[0]>0x39)) {
@ -1291,6 +1269,7 @@ void NetworkInitialize()
QueueClear(&_command_queue); QueueClear(&_command_queue);
QueueClear(&_ack_queue); QueueClear(&_ack_queue);
_command_queue.last = &_command_queue.head; _command_queue.last = &_command_queue.head;
_network_game_list = NULL;
// invalidate all clients // invalidate all clients
for(cs=_clients; cs != &_clients[MAX_CLIENTS]; cs++) for(cs=_clients; cs != &_clients[MAX_CLIENTS]; cs++)
@ -1298,7 +1277,8 @@ void NetworkInitialize()
} }
void NetworkClose(bool client) { void NetworkClose(bool client)
{
ClientState *cs; ClientState *cs;
// invalidate all clients // invalidate all clients
@ -1312,7 +1292,7 @@ void NetworkClose(bool client) {
closesocket(_listensocket); closesocket(_listensocket);
_listensocket= INVALID_SOCKET; _listensocket= INVALID_SOCKET;
DEBUG(net, 1) ("[NET][TCP] closed listener on port %i", _network_server_port); DEBUG(net, 1) ("[NET][TCP] closed listener on port %i", _network_server_port);
} }
} }
void NetworkShutdown() void NetworkShutdown()
@ -1331,6 +1311,7 @@ void NetworkStartSync(bool fcreset)
DEBUG(net, 3) ("[NET][SYNC] switching to synced game mode"); DEBUG(net, 3) ("[NET][SYNC] switching to synced game mode");
_networking_sync = true; _networking_sync = true;
_frame_counter = 0; _frame_counter = 0;
if (fcreset) { if (fcreset) {
_frame_counter_max = 0; _frame_counter_max = 0;
_frame_counter_srv = 0; _frame_counter_srv = 0;
@ -1339,22 +1320,23 @@ void NetworkStartSync(bool fcreset)
_num_future_seed = 0; _num_future_seed = 0;
_sync_seed_1 = _sync_seed_2 = 0; _sync_seed_1 = _sync_seed_2 = 0;
memset(_my_seed_list, 0, sizeof(_my_seed_list)); memset(_my_seed_list, 0, sizeof(_my_seed_list));
} }
// ********************************* // // ********************************* //
// * Network Core Console Commands * // // * 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) return NULL;
if (argc==2) {
if (argc == 2) {
IConsolePrintF(_iconsole_color_default, "connecting to %s",argv[1]); IConsolePrintF(_iconsole_color_default, "connecting to %s",argv[1]);
NetworkCoreConnectGame(argv[1],_network_server_port); 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]); IConsolePrintF(_iconsole_color_default, "connecting to %s on port %s",argv[1],argv[2]);
NetworkCoreConnectGame(argv[1],atoi(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]); IConsolePrintF(_iconsole_color_default, "connecting to %s on port %s as player %s",argv[1],argv[2],argv[3]);
_network_playas = atoi(argv[3]); _network_playas = atoi(argv[3]);
NetworkCoreConnectGame(argv[1],atoi(argv[2])); NetworkCoreConnectGame(argv[1],atoi(argv[2]));
@ -1401,7 +1383,8 @@ void NetworkUDPListen(bool client)
} }
void NetworkUDPClose(bool client) { void NetworkUDPClose(bool client)
{
if (client) { if (client) {
DEBUG(net, 1) ("[NET][UDP] closed listener on port %i", _network_client_port); DEBUG(net, 1) ("[NET][UDP] closed listener on port %i", _network_client_port);
closesocket(_udp_client_socket); closesocket(_udp_client_socket);
@ -1413,7 +1396,8 @@ void NetworkUDPClose(bool client) {
}; };
} }
void NetworkUDPReceive(bool client) { void NetworkUDPReceive(bool client)
{
struct sockaddr_in client_addr; struct sockaddr_in client_addr;
#ifndef __MORPHOS__ #ifndef __MORPHOS__
int client_len; int client_len;
@ -1465,9 +1449,8 @@ void NetworkUDPReceive(bool client) {
} }
} }
void NetworkUDPBroadCast(bool client, struct UDPPacket packet)
{
void NetworkUDPBroadCast(bool client, struct UDPPacket packet) {
int i=0, res; int i=0, res;
struct sockaddr_in out_addr; struct sockaddr_in out_addr;
uint32 bcaddr; uint32 bcaddr;
@ -1490,8 +1473,8 @@ void NetworkUDPBroadCast(bool client, struct UDPPacket packet) {
} }
void NetworkUDPSend(bool client, struct sockaddr_in recv,struct UDPPacket packet) { void NetworkUDPSend(bool client, struct sockaddr_in recv,struct UDPPacket packet)
{
SOCKET udp; SOCKET udp;
if (client) udp=_udp_client_socket; else udp=_udp_server_socket; if (client) udp=_udp_client_socket; else udp=_udp_server_socket;
@ -1499,7 +1482,8 @@ void NetworkUDPSend(bool client, struct sockaddr_in recv,struct UDPPacket packet
} }
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; struct UDPPacket packet;
int timeout=3000; int timeout=3000;
@ -1537,7 +1521,8 @@ bool NetworkUDPSearchGame(const byte ** _network_detected_serverip, unsigned sho
// * New Network Core System * // // * New Network Core System * //
// *************************** // // *************************** //
void NetworkIPListInit() { void NetworkIPListInit()
{
struct hostent* he = NULL; struct hostent* he = NULL;
char hostname[250]; char hostname[250];
uint32 bcaddr; uint32 bcaddr;
@ -1573,103 +1558,98 @@ void NetworkIPListInit() {
/* *************************************************** */ /* *************************************************** */
void NetworkCoreInit() { void NetworkCoreInit()
DEBUG(net, 3) ("[NET][Core] init()");
_network_available=true;
_network_client_timeout=300;
// [win32] winsock startup
#if defined(WIN32)
{ {
WSADATA wsa; DEBUG(net, 3) ("[NET][Core] init()");
DEBUG(net, 3) ("[NET][Core] using windows socket library"); _network_available=true;
if (WSAStartup(MAKEWORD(2,0), &wsa) != 0) { _network_client_timeout=300;
DEBUG(net, 3) ("[NET][Core] error: WSAStartup failed");
_network_available=false;
}
}
#else
// [morphos/amigaos] bsd-socket startup // [win32] winsock startup
#if defined(__MORPHOS__) || defined(__AMIGA__) #if defined(WIN32)
{ {
DEBUG(misc,3) ("[NET][Core] using bsd socket library"); WSADATA wsa;
if (!(SocketBase = OpenLibrary("bsdsocket.library", 4))) { DEBUG(net, 3) ("[NET][Core] using windows socket library");
DEBUG(net, 3) ("[NET][Core] Couldn't open bsdsocket.library version 4."); if (WSAStartup(MAKEWORD(2,0), &wsa) != 0) {
_network_available=false; DEBUG(net, 3) ("[NET][Core] error: WSAStartup failed");
} _network_available=false;
}
}
#else
#if !defined(__MORPHOS__) // [morphos/amigaos] bsd-socket startup
// for usleep() implementation (only required for legacy AmigaOS builds)
if ( (TimerPort = CreateMsgPort()) ) { #if defined(__MORPHOS__) || defined(__AMIGA__)
if ( (TimerRequest = (struct timerequest *) CreateIORequest(TimerPort, sizeof(struct timerequest))) ) { {
if ( OpenDevice("timer.device", UNIT_MICROHZ, (struct IORequest *) TimerRequest, 0) == 0 ) { DEBUG(misc,3) ("[NET][Core] using bsd socket library");
if ( !(TimerBase = TimerRequest->tr_node.io_Device) ) { if (!(SocketBase = OpenLibrary("bsdsocket.library", 4))) {
// free ressources... DEBUG(net, 3) ("[NET][Core] Couldn't open bsdsocket.library version 4.");
DEBUG(net, 3) ("[NET][Core] Couldn't initialize timer."); _network_available=false;
_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
} #endif
#else
// [linux/macos] unix-socket startup
DEBUG(net, 3) ("[NET][Core] using unix socket library");
#endif
#endif
if (_network_available) { if (_network_available) {
DEBUG(net, 3) ("[NET][Core] OK: multiplayer available"); DEBUG(net, 3) ("[NET][Core] OK: multiplayer available");
// initiate network ip list // initiate network ip list
NetworkIPListInit(); NetworkIPListInit();
IConsoleCmdRegister("connect",NetworkConsoleCmdConnect); IConsoleCmdRegister("connect",NetworkConsoleCmdConnect);
IConsoleVarRegister("net_client_timeout",&_network_client_timeout,ICONSOLE_VAR_UINT16); IConsoleVarRegister("net_client_timeout",&_network_client_timeout,ICONSOLE_VAR_UINT16);
IConsoleVarRegister("net_ready_ahead",&_network_ready_ahead,ICONSOLE_VAR_UINT16); IConsoleVarRegister("net_ready_ahead",&_network_ready_ahead,ICONSOLE_VAR_UINT16);
IConsoleVarRegister("net_sync_freq",&_network_sync_freq,ICONSOLE_VAR_UINT16); IConsoleVarRegister("net_sync_freq",&_network_sync_freq,ICONSOLE_VAR_UINT16);
} else { } else
DEBUG(net, 3) ("[NET][Core] FAILED: multiplayer not available"); DEBUG(net, 3) ("[NET][Core] FAILED: multiplayer not available");
}
} }
/* *************************************************** */ /* *************************************************** */
void NetworkCoreShutdown() { void NetworkCoreShutdown()
DEBUG(net, 3) ("[NET][Core] shutdown()");
#if defined(__MORPHOS__) || defined(__AMIGA__)
{ {
// free allocated ressources DEBUG(net, 3) ("[NET][Core] shutdown()");
#if !defined(__MORPHOS__)
if (TimerBase) { CloseDevice((struct IORequest *) TimerRequest); } #if defined(__MORPHOS__) || defined(__AMIGA__)
if (TimerRequest) { DeleteIORequest(TimerRequest); } {
if (TimerPort) { DeleteMsgPort(TimerPort); } // 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 #endif
if (SocketBase) { #if defined(WIN32)
CloseLibrary(SocketBase); { WSACleanup();}
} #endif
}
#endif
#if defined(WIN32)
{
WSACleanup();
}
#endif
} }
/* *************************************************** */ /* *************************************************** */
@ -1707,6 +1687,13 @@ bool NetworkCoreConnectGame(const byte* b, unsigned short port)
/* *************************************************** */ /* *************************************************** */
bool NetworkCoreConnectGameStruct(NetworkGameList * item)
{
return NetworkCoreConnectGame(inet_ntoa(*(struct in_addr *) &item->ip),item->port);
}
/* *************************************************** */
bool NetworkCoreStartGame() bool NetworkCoreStartGame()
{ {
if (!_network_available) return false; if (!_network_available) return false;
@ -1741,39 +1728,33 @@ void NetworkCoreDisconnect()
/* *************************************************** */ /* *************************************************** */
void NetworkCoreLoop(bool incomming) { void NetworkCoreLoop(bool incomming)
{
if (incomming) {
// incomming
if ( _udp_client_socket != INVALID_SOCKET ) NetworkUDPReceive(true);
if ( _udp_server_socket != INVALID_SOCKET ) NetworkUDPReceive(false);
if (_networking)
if (incomming) { NetworkReceive();
// incomming
if ( _udp_client_socket != INVALID_SOCKET ) NetworkUDPReceive(true);
if ( _udp_server_socket != INVALID_SOCKET ) NetworkUDPReceive(false);
if (_networking) {
NetworkReceive();
}
} else { } 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 (_networking)
if ( _udp_server_socket != INVALID_SOCKET ) NetworkUDPReceive(false); NetworkSend();
if (_networking) {
NetworkSend();
}
} }
} }
void NetworkLobbyInit() { void NetworkLobbyInit()
{
DEBUG(net, 3) ("[NET][Lobby] init()"); DEBUG(net, 3) ("[NET][Lobby] init()");
NetworkUDPListen(true); NetworkUDPListen(true);
} }
void NetworkLobbyShutdown() { void NetworkLobbyShutdown()
{
DEBUG(net, 3) ("[NET][Lobby] shutdown()"); DEBUG(net, 3) ("[NET][Lobby] shutdown()");
NetworkUDPClose(true); NetworkUDPClose(true);
} }
@ -1783,46 +1764,52 @@ void NetworkLobbyShutdown() {
// * Network Game List Extensions * // // * Network Game List Extensions * //
// ******************************** // // ******************************** //
void NetworkGameListClear() { void NetworkGameListClear()
NetworkGameList * item; {
NetworkGameList * next; NetworkGameList * item;
NetworkGameList * next;
DEBUG(net, 4) ("[NET][G-List] cleared server list"); DEBUG(net, 4) ("[NET][G-List] cleared server list");
item = _network_game_list; item = _network_game_list;
while (item != NULL) {
next = (NetworkGameList *) item -> _next; while (item != NULL) {
free (item); next = (NetworkGameList *) item -> _next;
item = next; free (item);
item = next;
} }
_network_game_list=NULL; _network_game_list=NULL;
_network_game_count=0; _network_game_count=0;
} }
char * NetworkGameListAdd() { NetworkGameList * NetworkGameListAdd()
NetworkGameList * item; {
NetworkGameList * before; 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; item = _network_game_list;
before = item;
while (item != NULL) {
before = item; before = item;
item = (NetworkGameList *) item -> _next; while (item != NULL) {
before = item;
item = (NetworkGameList *) item -> _next;
} }
item = malloc(sizeof(NetworkGameList));
item -> _next = NULL; item = malloc(sizeof(NetworkGameList));
if (before == NULL) { item -> _next = NULL;
_network_game_list = item;
} else { if (before == NULL) {
before -> _next = (char *) item; _network_game_list = item;
} } else
_network_game_count++; before -> _next = item;
return (char *) item;
_network_game_count++;
return item;
} }
void NetworkGameListFromLAN() { void NetworkGameListFromLAN()
{
struct UDPPacket packet; struct UDPPacket packet;
DEBUG(net, 2) ("[NET][G-List] searching server over lan"); DEBUG(net, 2) ("[NET][G-List] searching server over lan");
NetworkGameListClear(); NetworkGameListClear();
@ -1831,35 +1818,37 @@ void NetworkGameListFromLAN() {
NetworkUDPBroadCast(true,packet); NetworkUDPBroadCast(true,packet);
} }
void NetworkGameListFromInternet() { void NetworkGameListFromInternet()
{
DEBUG(net, 2) ("[NET][G-List] searching servers over internet"); DEBUG(net, 2) ("[NET][G-List] searching servers over internet");
NetworkGameListClear(); NetworkGameListClear();
// **TODO** masterserver communication [internet protocol list] // **TODO** masterserver communication [internet protocol list]
} }
char * NetworkGameListItem(uint16 index) { NetworkGameList * NetworkGameListItem(uint16 index)
NetworkGameList * item; {
NetworkGameList * next; NetworkGameList * item;
uint16 cnt = 0; NetworkGameList * next;
uint16 cnt = 0;
item = _network_game_list; item = _network_game_list;
while ((item != NULL) && (cnt != index)) { while ((item != NULL) && (cnt != index)) {
next = (NetworkGameList *) item -> _next; next = (NetworkGameList *) item -> _next;
item = next; item = next;
cnt++; cnt++;
} }
return (char *) item; return item;
} }
// *************************** // // *************************** //
// * Network Game Extensions * // // * Network Game Extensions * //
// *************************** // // *************************** //
void NetworkGameFillDefaults() { void NetworkGameFillDefaults()
{
NetworkGameInfo * game = &_network_game; NetworkGameInfo * game = &_network_game;
#if defined(WITH_REV) #if defined(WITH_REV)
extern char _openttd_revision[]; extern char _openttd_revision[];
@ -1887,10 +1876,10 @@ void NetworkGameFillDefaults() {
game->server_lang=_dynlang.curr; game->server_lang=_dynlang.curr;
} }
void NetworkGameChangeDate(uint16 newdate) { void NetworkGameChangeDate(uint16 newdate)
if (_networking_server) { {
if (_networking_server)
_network_game.game_date = newdate; _network_game.game_date = newdate;
}
} }
#else // not ENABLE_NETWORK #else // not ENABLE_NETWORK

30
network.h Normal file
View File

@ -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 */

View File

@ -4,6 +4,7 @@
#include "gui.h" #include "gui.h"
#include "gfx.h" #include "gfx.h"
#include "command.h" #include "command.h"
#include "network.h"
#define BGC 5 #define BGC 5
#define BTC 15 #define BTC 15
@ -33,15 +34,16 @@ static byte _players_max;
static byte _network_connection; static byte _network_connection;
static uint16 _network_game_count_last; 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) static void NetworkGameWindowWndProc(Window *w, WindowEvent *e)
{ {
switch(e->event) { switch(e->event) {
case WE_TICK: {
if (_network_game_count_last != _network_game_count) {
SetWindowDirty(w);
}
}
break;
case WE_PAINT: { case WE_PAINT: {
SET_DPARAM16(0, 0x00); SET_DPARAM16(0, 0x00);
@ -57,6 +59,26 @@ static void NetworkGameWindowWndProc(Window *w, WindowEvent *e)
DrawString(238, 82, STR_NETWORK_PLAYERS, 2); DrawString(238, 82, STR_NETWORK_PLAYERS, 2);
DrawString(288, 82, STR_NETWORK_MAP_SIZE, 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; } break;
case WE_CLICK: case WE_CLICK:
@ -88,23 +110,48 @@ static void NetworkGameWindowWndProc(Window *w, WindowEvent *e)
case 7: case 8: /* Connection type */ case 7: case 8: /* Connection type */
ShowDropDownMenu(w, _connection_types_dropdown, _network_connection, 8, 0); // do it for widget 8 ShowDropDownMenu(w, _connection_types_dropdown, _network_connection, 8, 0); // do it for widget 8
return; 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; break;
case WE_DROPDOWN_SELECT: /* we have selected a dropdown item in the list */ case WE_DROPDOWN_SELECT: /* we have selected a dropdown item in the list */
_network_connection = e->dropdown.index; _network_connection = e->dropdown.index;
switch (_network_connection) { switch (_network_connection) {
case 0: case 0: /* LAN */
NetworkGameListFromLAN(); NetworkGameListFromLAN();
_network_game_count_last = _network_game_count;
SetWindowDirty(w);
break; break;
case 1: case 1: /* Internet */
NetworkGameListFromInternet(); NetworkGameListFromInternet();
_network_game_count_last = _network_game_count;
SetWindowDirty(w);
break; break;
} }
_network_game_count_last = _network_game_count;
SetWindowDirty(w);
break; break;
case WE_MOUSELOOP: case WE_MOUSELOOP:
@ -126,16 +173,20 @@ static void NetworkGameWindowWndProc(Window *w, WindowEvent *e)
case WE_ON_EDIT_TEXT: { case WE_ON_EDIT_TEXT: {
const byte *b = e->edittext.str; const byte *b = e->edittext.str;
if (*b == 0) if (*b != 0)
return; NetworkCoreConnectGame(b, _network_server_port);
NetworkCoreConnectGame(b,_network_server_port); } break;
case WE_TICK: {
if (_network_game_count_last != _network_game_count)
SetWindowDirty(w);
} break; } break;
} }
} }
static const Widget _network_game_window_widgets[] = { 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_CAPTION, BGC, 10, 399, 0, 13, STR_NETWORK_MULTIPLAYER, STR_NULL},
{ WWT_IMGBTN, BGC, 0, 399, 14, 199, 0x0, STR_NULL}, { WWT_IMGBTN, BGC, 0, 399, 14, 199, 0x0, STR_NULL},
@ -148,14 +199,14 @@ static const Widget _network_game_window_widgets[] = {
{ WWT_6, BGC, 250, 393, 62, 73, STR_NETWORK_COMBO1, STR_NETWORK_CONNECTION_TYPE_TIP}, { 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_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, 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, 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, 282, 331, 81, 92, 0x0, STR_NETWORK_MAP_SIZE_TIP },
{ WWT_IMGBTN, BTC, 332, 381, 81, 92, 0x0, STR_NETWORK_INFO_ICONS_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, 145, 255, 180, 191, STR_012E_CANCEL, STR_NULL},
{ WWT_PUSHTXTBTN, BTC, 270, 392, 180, 191, STR_NETWORK_JOIN_GAME, STR_NULL}, { WWT_PUSHTXTBTN, BTC, 270, 392, 180, 191, STR_NETWORK_JOIN_GAME, STR_NULL},
@ -180,6 +231,9 @@ void ShowNetworkGameWindow()
w = AllocateWindowDesc(&_network_game_window_desc); w = AllocateWindowDesc(&_network_game_window_desc);
strcpy(_edit_str_buf, "Your name"); 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; _network_game_count_last = _network_game_count;
@ -232,18 +286,21 @@ static void NetworkStartServerWindowWndProc(Window *w, WindowEvent *e)
return; return;
case 9: /* Start game */ case 9: /* Start game */
NetworkCoreStartGame(); NetworkCoreStartGame();
strcpy(_network_game.server_name, WP(w,querystr_d).buf);
//ShowNetworkLobbyWindow(); //ShowNetworkLobbyWindow();
DoCommandP(0, 0, 0, NULL, CMD_START_NEW_GAME); DoCommandP(0, 0, 0, NULL, CMD_START_NEW_GAME);
break; break;
case 10: /* Load game */ case 10: /* Load game */
NetworkCoreStartGame(); NetworkCoreStartGame();
strcpy(_network_game.server_name, WP(w,querystr_d).buf);
//ShowNetworkLobbyWindow(); //ShowNetworkLobbyWindow();
ShowSaveLoadDialog(SLD_LOAD_GAME); ShowSaveLoadDialog(SLD_LOAD_GAME);
break; break;
case 11: /* Load scenario */ case 11: /* Load scenario */
NetworkCoreStartGame(); NetworkCoreStartGame();
strcpy(_network_game.server_name, WP(w,querystr_d).buf);
//ShowNetworkLobbyWindow(); //ShowNetworkLobbyWindow();
ShowSaveLoadDialog(SLD_LOAD_SCENARIO);; ShowSaveLoadDialog(SLD_LOAD_SCENARIO);
break; break;
} }
break; break;
@ -287,9 +344,9 @@ static const Widget _network_start_server_window_widgets[] = {
{ WWT_6, BGC, 260, 390, 81, 92, STR_NETWORK_COMBO2, STR_NETWORK_NUMBER_OF_PLAYERS_TIP}, { 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_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, 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_NULL}, { 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_NULL}, { 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}, { WWT_PUSHTXTBTN, BTC, 310, 390, 180, 191, STR_012E_CANCEL, STR_NULL},
{ WIDGETS_END}, { WIDGETS_END},
}; };
@ -309,6 +366,7 @@ static void ShowNetworkStartServerWindow()
w = AllocateWindowDesc(&_network_start_server_window_desc); w = AllocateWindowDesc(&_network_start_server_window_desc);
strcpy(_edit_str_buf, ""); 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).caret = 1;
WP(w,querystr_d).maxlen = MAX_QUERYSTR_LEN; WP(w,querystr_d).maxlen = MAX_QUERYSTR_LEN;
@ -375,7 +433,7 @@ static void NetworkLobbyWindowWndProc(Window *w, WindowEvent *e)
} }
static const Widget _network_lobby_window_widgets[] = { 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_CAPTION, BGC, 10, 399, 0, 13, STR_NETWORK_GAME_LOBBY, STR_NULL},
{ WWT_IMGBTN, BGC, 0, 399, 14, 299, 0x0, STR_NULL}, { WWT_IMGBTN, BGC, 0, 399, 14, 299, 0x0, STR_NULL},

View File

@ -1134,6 +1134,9 @@
<File <File
RelativePath="macros.h"> RelativePath="macros.h">
</File> </File>
<File
RelativePath=".\network.h">
</File>
<File <File
RelativePath="news.h"> RelativePath="news.h">
</File> </File>

View File

@ -25,19 +25,19 @@ void DispatchLeftClickEvent(Window *w, int x, int y) {
if (e.click.widget < 0) return; /* exit if clicked outside of widgets */ if (e.click.widget < 0) return; /* exit if clicked outside of widgets */
wi = &w->widget[e.click.widget]; 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) { if (wi->type & 0xE0) {
/* special widget handling */ /* special widget handling for buttons*/
switch(wi->type) { switch(wi->type) {
case WWT_IMGBTN | WWB_PUSHBUTTON: case WWT_IMGBTN | WWB_PUSHBUTTON: /* WWT_PUSHIMGBTN */
case WWT_TEXTBTN | WWB_PUSHBUTTON: case WWT_TEXTBTN | WWB_PUSHBUTTON: /* WWT_PUSHTXTBTN */
if (HASBIT(w->disabled_state, e.click.widget))
return; /* don't allow click if disabled */
HandleButtonClick(w, e.click.widget); HandleButtonClick(w, e.click.widget);
break; break;
case WWT_NODISTXTBTN: case WWT_NODISTXTBTN:
if (HASBIT(w->disabled_state, e.click.widget))
return; /* don't allow click if disabled */
break; break;
} }
} else if (wi->type == WWT_SCROLLBAR || wi->type == WWT_HSCROLLBAR) { } else if (wi->type == WWT_SCROLLBAR || wi->type == WWT_HSCROLLBAR) {