mirror of
https://github.com/kevinbentley/Descent3.git
synced 2025-01-22 19:55:23 +00:00
727 lines
22 KiB
C++
727 lines
22 KiB
C++
/*
|
|
* Descent 3
|
|
* Copyright (C) 2024 Parallax Software
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
--- HISTORICAL COMMENTS FOLLOW ---
|
|
|
|
* $Logfile: /DescentIII/Main/lanclient/lanclient.cpp $
|
|
* $Revision: 1.3 $
|
|
* $Date: 2004/02/25 00:04:06 $
|
|
* $Author: ryan $
|
|
*
|
|
* LAN Client DLL
|
|
*
|
|
* $Log: lanclient.cpp,v $
|
|
* Revision 1.3 2004/02/25 00:04:06 ryan
|
|
* Removed loki_utils dependency and ported to MacOS X (runs, but incomplete).
|
|
*
|
|
* Revision 1.2 2000/05/29 05:30:46 icculus
|
|
* support for static linking into main executable.
|
|
*
|
|
* Revision 1.1.1.1 2000/04/18 00:00:38 icculus
|
|
* initial checkin
|
|
*
|
|
*
|
|
* 75 10/21/99 9:27p Jeff
|
|
* B.A. Macintosh code merge
|
|
*
|
|
* 74 8/24/99 5:47p Kevin
|
|
* Macintosh crap
|
|
*
|
|
* 73 5/23/99 2:38a Kevin
|
|
* fixed text overlapping thingy
|
|
*
|
|
* 72 5/20/99 9:18p Kevin
|
|
* removed invisible hotspot
|
|
*
|
|
* 71 5/04/99 5:39p Kevin
|
|
* connection dll & pxo game tracking improvements (added server type to
|
|
* list)
|
|
*
|
|
* 70 5/01/99 3:16p Kevin
|
|
*
|
|
* 69 4/29/99 11:49a Kevin
|
|
* enabled the 'i' key in the game list
|
|
*
|
|
* 68 4/28/99 6:39p Kevin
|
|
* Build 182 fixes
|
|
*
|
|
* 67 4/25/99 5:20p Kevin
|
|
* fixed a bug where the last item would never dissapear
|
|
*
|
|
* 66 4/25/99 5:02p Kevin
|
|
* Bunches of multiplayer UI improvements
|
|
*
|
|
* 65 4/22/99 3:43p Kevin
|
|
* Training missions show controls on screen
|
|
*
|
|
* 64 4/18/99 3:12p Jeff
|
|
* got working for linux
|
|
*
|
|
* 63 4/17/99 3:44p Kevin
|
|
* Demo2 changes & fixes
|
|
*
|
|
* 62 4/14/99 1:22a Jeff
|
|
* fixed case mismatched #includes
|
|
*
|
|
* 61 4/03/99 9:26p Jeff
|
|
* changed dialogs that weren't using UID_OK and UID_CANCEL to use and
|
|
* handle them properly
|
|
*
|
|
* 60 3/17/99 4:08p Kevin
|
|
* Changed the way games appear and timeout in the game list.
|
|
*
|
|
* 59 2/19/99 5:21p Kevin
|
|
* Fixed some connection DLLs and a Direct Sound bug with threads.
|
|
*
|
|
* 58 2/08/99 11:44p Kevin
|
|
* Fixed a bug with entering addresses
|
|
*
|
|
* 57 2/03/99 4:20p Kevin
|
|
* Got multiplayer working with .mn3 files, and setup autodownloading
|
|
*
|
|
* 56 1/23/99 3:19p Kevin
|
|
* Made gamelist boxes not sort
|
|
*
|
|
* 55 1/07/99 11:51a Kevin
|
|
* Added support for joining servers on alternate ports and hosting behind
|
|
* a proxy/firewall
|
|
*
|
|
* 54 12/30/98 12:16p Kevin
|
|
* Auto Mission Download system
|
|
*
|
|
* 53 12/14/98 10:53a Jason
|
|
* added bright player ships option
|
|
*
|
|
* 52 12/04/98 4:37p Kevin
|
|
* Fixed selection being reset in game lists...
|
|
*
|
|
* 51 12/01/98 12:47p Jason
|
|
* got rid of NF_DROPMISORDERED and added NF_USE_SMOOTHING
|
|
*
|
|
* 50 11/18/98 3:26p Kevin
|
|
* Put multiplayer options into con_dll.h
|
|
*
|
|
* 49 10/19/98 2:48p Kevin
|
|
* Added accurate weapon thingy for Chris
|
|
*
|
|
* 48 10/17/98 2:32p Kevin
|
|
* FIxed problem with banned users getting stuck on the ban message
|
|
* screen.
|
|
*
|
|
* 47 10/15/98 12:08p Kevin
|
|
* Changed game list to line up differently
|
|
*
|
|
* 46 10/13/98 3:41p Kevin
|
|
* bug fixes
|
|
*
|
|
* 45 10/12/98 8:39p Kevin
|
|
* removed mprintf's and fixed some smallish bugs
|
|
*
|
|
* 44 10/08/98 3:37p Jeff
|
|
* removed time_left from Netgame
|
|
*
|
|
* 43 10/01/98 11:37a Kevin
|
|
* UI fixes and stuff
|
|
*
|
|
* 42 9/29/98 2:23p Kevin
|
|
* More UI tweaks
|
|
*
|
|
* 41 9/28/98 4:21p Kevin
|
|
* Redesigned game list menus
|
|
*
|
|
* 40 9/28/98 11:25a Kevin
|
|
*
|
|
* 39 9/28/98 11:24a Kevin
|
|
* More UI improvements
|
|
*
|
|
* 38 9/28/98 11:02a Kevin
|
|
* added Networking defer, and fixed some UI issues
|
|
*
|
|
* 37 9/28/98 9:53a Kevin
|
|
* Fixing misc UI problems, and fixed some bugs that VC 6 found
|
|
*
|
|
* 36 9/25/98 11:07a Kevin
|
|
* fixed columns to line up and cleaned up some PXO bugs
|
|
*
|
|
* 35 9/24/98 12:50p Kevin
|
|
* Added UI for rotational velocity and drop out of order packets in net
|
|
* games
|
|
*
|
|
* 34 9/23/98 6:33p Kevin
|
|
* Fixed load settings
|
|
*
|
|
* 33 9/23/98 2:55p Kevin
|
|
* Saved multi config and changed UI to conform
|
|
*
|
|
* 32 9/22/98 3:55p Kevin
|
|
* Removed obsolete function
|
|
*
|
|
* 31 9/22/98 2:29p Kevin
|
|
* moved ships allowed code out of dll and into main app. Also added
|
|
* powerup exclusions
|
|
*
|
|
* 30 9/21/98 11:19a Kevin
|
|
* check protocol before entering multiplayer screens
|
|
*
|
|
* 29 9/15/98 12:42p Jason
|
|
* got dedicated server actually working
|
|
*
|
|
* 28 9/14/98 2:36p Kevin
|
|
* fixed some UI issues
|
|
*
|
|
* 27 9/09/98 12:41p Kevin
|
|
* Fixed up some UI issues
|
|
*
|
|
* 26 9/04/98 3:46p Kevin
|
|
* Added ping_time to Netplayers struct. It's updated in peer-peer and
|
|
* client server
|
|
*
|
|
* 25 8/27/98 5:03p Kevin
|
|
* Prettied up multiplayer screens and fixed some bugs.
|
|
*
|
|
* 24 8/24/98 5:04p Kevin
|
|
* Made msn files have the option to not be playable in multiplayer
|
|
*
|
|
* 23 8/24/98 12:37p Kevin
|
|
* added background bmp things
|
|
*
|
|
* 22 8/19/98 11:49a Kevin
|
|
* Got DirectPlay IPX working, and localized connection DLLs
|
|
*
|
|
* 21 8/17/98 11:00a Kevin
|
|
* Moved DLLs into subdirectories
|
|
*
|
|
* 20 8/07/98 12:39p Jeff
|
|
* added "allowed ships" to multiplayer options
|
|
*
|
|
* 19 8/04/98 10:26a Kevin
|
|
* Custom sound and bmp exchange system
|
|
*
|
|
* 18 7/21/98 1:49p Kevin
|
|
* IPX support and peer-peer option for multi
|
|
*
|
|
* 17 7/20/98 6:20p Kevin
|
|
* peer-peer stuff
|
|
*
|
|
* 16 7/20/98 2:34p Kevin
|
|
* Re-wrote the DLL wrapper, to allow for better expandability
|
|
*
|
|
* 13 7/02/98 4:52p Kevin
|
|
* direct ip list fixes
|
|
*
|
|
* 12 7/02/98 12:19p Kevin
|
|
* misc network fixes
|
|
*
|
|
* 11 6/30/98 3:20p Kevin
|
|
* fixed ping time
|
|
*
|
|
* 10 6/25/98 10:03a Kevin
|
|
* Minor chat fixes in PXO
|
|
*
|
|
* 9 6/24/98 6:40p Kevin
|
|
* Added help to main dll menu
|
|
*
|
|
* 8 6/24/98 5:12p Kevin
|
|
* Fixed bug with main menu crashing
|
|
*
|
|
* 7 6/24/98 3:24p Kevin
|
|
* Updated PXO screens with chat, etc.
|
|
*
|
|
* 6 6/18/98 4:49p Kevin
|
|
* Updated multiplayer menus
|
|
*
|
|
* 5 6/11/98 1:56p Jeff
|
|
* looks for d3m files instead of dll
|
|
*
|
|
* 4 6/05/98 2:58p Jeff
|
|
* changes made for new module library
|
|
*
|
|
* 3 6/01/98 3:52p Kevin
|
|
* changed listbox item to be white
|
|
*
|
|
* 2 6/01/98 10:10a Kevin
|
|
* Added DLL connection interface and auto update DLL
|
|
*
|
|
* 1 5/28/98 12:14p Kevin
|
|
*
|
|
* 1 5/18/98 12:47p Kevin
|
|
*
|
|
* $NoKeywords: $
|
|
*/
|
|
|
|
#include "ui.h"
|
|
#include "newui.h"
|
|
#include "grdefs.h"
|
|
#include "player.h"
|
|
#include "game.h"
|
|
#include "pilot.h"
|
|
#include "module.h"
|
|
#include "ddio_common.h"
|
|
|
|
#include "inetgetfile.h"
|
|
|
|
#ifdef __STATIC_NETWORK_CLIENTS
|
|
#define DLLMultiCall DLLMultiCall_LAN
|
|
#define DLLMultiInit DLLMultiInit_LAN
|
|
#define DLLMultiClose DLLMultiClose_LAN
|
|
#define MainMultiplayerMenu MainMultiplayerMenu_LAN
|
|
#define AutoLoginAndJoinGame AutoLoginAndJoinGame_LAN
|
|
#endif
|
|
|
|
#define TXT_DLL_SAVESETTINGS TXT(27)
|
|
#define TXT_DLL_LOADSETTINGS TXT(28)
|
|
|
|
///////////////////////////////////////////////
|
|
// localization header
|
|
#include "lanstrings.h"
|
|
|
|
#define TXT_GEN_MPLYROPTIONS TXT_LC_MPLYROPTIONS
|
|
#define TXT_GEN_TIMELIMIT TXT_LC_TIMELIMIT
|
|
#define TXT_GEN_KILLGOAL TXT_LC_KILLGOAL
|
|
#define TXT_GEN_PPS TXT_LC_PPS
|
|
#define TXT_GEN_RESPAWNRATE TXT_LC_RESPAWNRATE
|
|
#define TXT_GEN_MAXPLAYERS TXT_LC_MAXPLAYERS
|
|
#define TXT_GEN_PREVMENU TXT_LC_PREVMENU
|
|
#define TXT_GEN_CANCEL TXT_LC_CANCEL
|
|
#define TXT_GEN_CFGALLOWEDSHIP TXT_LC_CFGALLOWEDSHIP
|
|
#define TXT_GEN_USEROTVEL TXT_LC_USEROTVEL
|
|
#define TXT_GEN_USEROTVEL TXT_LC_USEROTVEL
|
|
#define TXT_GEN_USESMOOTHING TXT_LC_USESMOOTHING
|
|
#define TXT_GEN_CLIENTSERVER TXT_LC_CLIENTSERVER
|
|
#define TXT_GEN_PEERPEER TXT_LC_PEERPEER
|
|
#define TXT_GEN_ACC_WEAP_COLL TXT_LC_ACC_WEAP_COLL
|
|
#define TXT_GEN_BRIGHT_PLAYERS TXT_LC_BRIGHT_PLAYERS
|
|
|
|
#define MULTI_USE_ALL_OPTIONS 1
|
|
|
|
#include "lanclient.h"
|
|
#include "DLLUiItems.h"
|
|
|
|
using namespace lanclient;
|
|
|
|
// int DLLUIClass_CurrID = 0xD0;
|
|
|
|
#define MAX_NET_GAMES 100
|
|
#define JEFF_RED GR_RGB(255, 40, 40)
|
|
#define JEFF_BLUE GR_RGB(40, 40, 255)
|
|
#define JEFF_GREEN GR_RGB(40, 255, 40)
|
|
#define NETPOLLINTERVAL 10.0
|
|
|
|
extern int MTAVersionCheck(uint32_t oldver, char *URL);
|
|
/////////////////////////////
|
|
// Defines
|
|
|
|
// These next two function prototypes MUST appear in the extern "C" block if called
|
|
// from a CPP file.
|
|
extern "C" {
|
|
DLLEXPORT void DLLFUNCCALL DLLMultiInit(int *api_func);
|
|
DLLEXPORT void DLLFUNCCALL DLLMultiCall(int eventnum);
|
|
DLLEXPORT void DLLFUNCCALL DLLMultiClose();
|
|
}
|
|
|
|
static bool All_ok = true;
|
|
// Initializes the game function pointers
|
|
void DLLFUNCCALL DLLMultiInit(int *api_func) {
|
|
Use_netgame_flags = 1;
|
|
#include "mdllinit.h"
|
|
DLLCreateStringTable("lanclient.str", &StringTable, &StringTableSize);
|
|
DLLmprintf(0, "%d strings loaded from string table\n", StringTableSize);
|
|
if (!StringTableSize) {
|
|
All_ok = false;
|
|
return;
|
|
}
|
|
*DLLUse_DirectPlay = false;
|
|
}
|
|
|
|
// Called when the DLL is shutdown
|
|
void DLLFUNCCALL DLLMultiClose() { DLLDestroyStringTable(StringTable, StringTableSize); }
|
|
|
|
// The main entry point where the game calls the dll
|
|
void DLLFUNCCALL DLLMultiCall(int eventnum) {
|
|
|
|
switch (eventnum) {
|
|
case MT_EVT_GET_HELP:
|
|
strcpy(DLLHelpText1, TXT_LC_HELP1);
|
|
strcpy(DLLHelpText2, TXT_LC_HELP2);
|
|
strcpy(DLLHelpText3, TXT_LC_HELP3);
|
|
strcpy(DLLHelpText4, TXT_LC_HELP4);
|
|
break;
|
|
case MT_AUTO_START:
|
|
if (!All_ok)
|
|
*DLLMultiGameStarting = 0;
|
|
else
|
|
*DLLMultiGameStarting = 1;
|
|
break;
|
|
case MT_RETURN_TO_GAME_LIST:
|
|
case MT_EVT_LOGIN:
|
|
if (!DLLTCP_active) {
|
|
DLLDoMessageBox(TXT_LC_ERROR, TXT_LC_NO_TCPIP, MSGBOX_OK, UICOL_WINDOW_TITLE, UICOL_TEXT_NORMAL);
|
|
*DLLMultiGameStarting = 0;
|
|
break;
|
|
}
|
|
if (!All_ok)
|
|
*DLLMultiGameStarting = 0;
|
|
else
|
|
*DLLMultiGameStarting = MainMultiplayerMenu();
|
|
break;
|
|
case MT_EVT_FRAME:
|
|
|
|
break;
|
|
case MT_EVT_FIRST_FRAME:
|
|
|
|
break;
|
|
case MT_EVT_GAME_OVER:
|
|
break;
|
|
case MT_AUTO_LOGIN:
|
|
if (!DLLTCP_active) {
|
|
DLLDoMessageBox(TXT_LC_ERROR, TXT_LC_NO_TCPIP, MSGBOX_OK, UICOL_WINDOW_TITLE, UICOL_TEXT_NORMAL);
|
|
*DLLMultiGameStarting = 0;
|
|
break;
|
|
}
|
|
if (All_ok)
|
|
AutoLoginAndJoinGame();
|
|
break;
|
|
}
|
|
}
|
|
|
|
namespace lanclient {
|
|
#define GET_INFO_ID 50
|
|
// The first multiplayer menu that the user will see...all multiplayer stuff is
|
|
// reached from this menu
|
|
// Returns true if we're starting a multiplayer game
|
|
int MainMultiplayerMenu() {
|
|
|
|
char selgame[200] = "";
|
|
void *join_LC_text = DLLCreateNewUITextItem(TXT_LC_RETURNMAIN, GR_BLACK); // return_menu
|
|
void *list_head_txt = DLLCreateNewUITextItem(TXT_LC_GAMELISTHDR, UICOL_TEXT_NORMAL);
|
|
void *exit_on_text = DLLCreateNewUITextItem(TXT_LC_EXIT, UICOL_HOTSPOT_HI);
|
|
void *exit_off_text = DLLCreateNewUITextItem(TXT_LC_EXIT, UICOL_HOTSPOT_LO);
|
|
void *join_on_text = DLLCreateNewUITextItem(TXT_LC_JOINSEL, UICOL_HOTSPOT_HI);
|
|
void *join_off_text = DLLCreateNewUITextItem(TXT_LC_JOINSEL, UICOL_HOTSPOT_LO);
|
|
void *start_on_text = DLLCreateNewUITextItem(TXT_LC_STARTNEW, UICOL_HOTSPOT_HI);
|
|
void *start_off_text = DLLCreateNewUITextItem(TXT_LC_STARTNEW, UICOL_HOTSPOT_LO);
|
|
void *srch_on_text = DLLCreateNewUITextItem(TXT_LC_SRCHADDR, UICOL_HOTSPOT_HI);
|
|
void *srch_off_text = DLLCreateNewUITextItem(TXT_LC_SRCHADDR, UICOL_HOTSPOT_LO);
|
|
void *scan_on_text = DLLCreateNewUITextItem(TXT_LC_SCANLOCAL, UICOL_HOTSPOT_HI);
|
|
void *scan_off_text = DLLCreateNewUITextItem(TXT_LC_SCANLOCAL, UICOL_HOTSPOT_LO);
|
|
void *game_hdr_text = DLLCreateNewUITextItem(TXT_LC_GAMEHEADER, UICOL_WINDOW_TITLE, DLL_BIG_BRIEFING_FONT);
|
|
|
|
int exit_menu = 0;
|
|
void *net_game_txt_items[MAX_NET_GAMES];
|
|
int a;
|
|
for (a = 0; a < MAX_NET_GAMES; a++)
|
|
net_game_txt_items[a] = NULL;
|
|
int ret = 0;
|
|
uint8_t oldalpha = *DLLNewUIWindow_alpha;
|
|
int cury = 40;
|
|
|
|
DLLSetScreenMode(SM_MENU);
|
|
*DLLNewUIWindow_alpha = 255;
|
|
|
|
void *main_wnd = DLLNewUIWindowCreate(0, 0, 640, 480, UIF_PROCESS_ALL);
|
|
|
|
void *info_on_text = DLLCreateNewUITextItem("", UICOL_HOTSPOT_HI);
|
|
void *info_hs = DLLHotSpotCreate(main_wnd, GET_INFO_ID, KEY_I, info_on_text, info_on_text, 1, 1, 1, 1, 0);
|
|
|
|
void *screen_header = DLLTextCreate(main_wnd, game_hdr_text, 45, cury, UIF_CENTER);
|
|
cury += 35;
|
|
void *start_hs = DLLHotSpotCreate(main_wnd, 7, KEY_S, start_off_text, start_on_text, 320, cury, 150, 15, UIF_CENTER);
|
|
cury += 25;
|
|
void *srch_hs = DLLHotSpotCreate(main_wnd, 9, KEY_A, srch_off_text, srch_on_text, 320, cury, 250, 15, UIF_CENTER);
|
|
cury += 25;
|
|
void *edit_box = DLLEditCreate(main_wnd, 9, 10, cury, 300, 15, UIF_CENTER);
|
|
cury += 35;
|
|
void *scan_hs = DLLHotSpotCreate(main_wnd, 8, KEY_L, scan_off_text, scan_on_text, 320, cury, 200, 15, UIF_CENTER);
|
|
cury += 50;
|
|
void *list_header = DLLTextCreate(main_wnd, list_head_txt, 45, cury, 0);
|
|
cury += 13;
|
|
void *main_list = DLLListCreate(main_wnd, UID_OK, 10, cury, 600, 170, UIF_CENTER | UILB_NOSORT);
|
|
cury += 200;
|
|
void *join_hs = DLLHotSpotCreate(main_wnd, UID_OK, KEY_ENTER, join_off_text, join_on_text, 100, cury, 130, 15, 0);
|
|
void *exit_hs = DLLHotSpotCreate(main_wnd, UID_CANCEL, KEY_ESC, exit_off_text, exit_on_text, 400, cury, 70, 15, 0);
|
|
char szdip[30] = "";
|
|
int diplen = 29;
|
|
DLLDatabaseRead("DirectIP", szdip, &diplen);
|
|
DLLEditSetText(edit_box, szdip);
|
|
|
|
DLLNewUIWindowLoadBackgroundImage(main_wnd, "multimain.ogf");
|
|
DLLNewUIWindowOpen(main_wnd);
|
|
*DLLNum_network_games_known = 0;
|
|
int lastgamesfound = 0;
|
|
int itemp;
|
|
int looklocal = 1;
|
|
void *selti = NULL;
|
|
|
|
float lastpoll = DLLtimer_GetTime();
|
|
DLLSearchForLocalGamesTCP(0xffffffffl, htons(DEFAULT_GAME_PORT));
|
|
// Menu loop
|
|
while (!exit_menu) {
|
|
int res;
|
|
int selno;
|
|
DLLUpdateAndPackGameList();
|
|
|
|
if (((itemp = DLLSearchForLocalGamesTCP(0, 0)) != 0) || (*DLLMulti_Gamelist_changed)) {
|
|
// if(itemp != lastgamesfound)
|
|
if (*DLLMulti_Gamelist_changed) {
|
|
// We found a new game!
|
|
*DLLMulti_Gamelist_changed = false;
|
|
selti = NULL;
|
|
lastgamesfound = itemp;
|
|
// Get the currently selected item
|
|
// char * psel = DLLListGetItem(main_list,DLLListGetSelectedIndex(main_list)) ;
|
|
// selno = DLLListGetSelectedIndex(main_list);
|
|
// strcpy(selgame,DLLNetwork_games[selno].name);
|
|
DLLmprintf(0, "Selected item = %s\n", selgame);
|
|
selti = NULL;
|
|
DLLListRemoveAll(main_list);
|
|
for (int k = 0; k < *DLLNum_network_games_known; k++) {
|
|
char fmtline[200];
|
|
char server_mode[20];
|
|
|
|
if (DLLNetwork_games[k].flags & NF_PEER_PEER) {
|
|
strcpy(server_mode, "PP");
|
|
} else if (DLLNetwork_games[k].flags & NF_PERMISSABLE) {
|
|
strcpy(server_mode, "PS");
|
|
} else {
|
|
strcpy(server_mode, "CS");
|
|
}
|
|
|
|
if (DLLNetwork_games[k].flags & NF_ALLOW_MLOOK) {
|
|
strcat(server_mode, "-ML");
|
|
}
|
|
|
|
DLLmprintf(0, "Found game: %s\n", DLLNetwork_games[k].name);
|
|
snprintf(fmtline, sizeof(fmtline), "%.20s\t\x02\x02b%s %.10s\x02\x45%.15s\x02\x63%d\x02\x6d%d/%d\x02\x7e%.3f",
|
|
DLLNetwork_games[k].name, server_mode, DLLNetwork_games[k].scriptname,
|
|
DLLNetwork_games[k].mission_name, DLLNetwork_games[k].level_num,
|
|
DLLNetwork_games[k].curr_num_players, DLLNetwork_games[k].max_num_players,
|
|
DLLNetwork_games[k].server_response_time);
|
|
|
|
if (DLLNetwork_games[k].dedicated_server) {
|
|
net_game_txt_items[k] = DLLCreateNewUITextItem(fmtline, GR_WHITE);
|
|
} else {
|
|
net_game_txt_items[k] = DLLCreateNewUITextItem(fmtline, GR_LIGHTGRAY);
|
|
}
|
|
|
|
selgame[20] = '\0';
|
|
if (strncmp(selgame, DLLNetwork_games[k].name, 19) == 0) {
|
|
selti = net_game_txt_items[k];
|
|
DLLmprintf(0, "Found previously selected game in list, reselecting...\n");
|
|
}
|
|
DLLListAddItem(main_list, net_game_txt_items[k]);
|
|
}
|
|
if (selti) {
|
|
DLLListSelectItem(main_list, selti);
|
|
}
|
|
}
|
|
}
|
|
if ((looklocal) && ((DLLtimer_GetTime() - lastpoll) > NETPOLLINTERVAL)) {
|
|
DLLSearchForLocalGamesTCP(0xffffffffl, htons(DEFAULT_GAME_PORT));
|
|
//*DLLNum_network_games_known = 0;
|
|
// DLLListRemoveAll(main_list);
|
|
lastgamesfound = 0;
|
|
lastpoll = DLLtimer_GetTime();
|
|
selno = DLLListGetSelectedIndex(main_list);
|
|
if (selno >= 0)
|
|
strcpy(selgame, DLLNetwork_games[selno].name);
|
|
else
|
|
selgame[0] = '\0';
|
|
}
|
|
res = DLLPollUI();
|
|
|
|
if (res == -1) {
|
|
continue;
|
|
}
|
|
// handle all UI results.
|
|
switch (res) {
|
|
|
|
case UID_CANCEL:
|
|
DLLNewUIWindowClose(main_wnd);
|
|
exit_menu = 1;
|
|
break;
|
|
case UID_OK:
|
|
// Double click on listbox, or join selected hit.
|
|
if (*DLLNum_network_games_known) {
|
|
// Get the appropriate game address
|
|
int gameno;
|
|
gameno = DLLListGetSelectedIndex(main_list);
|
|
DLLmprintf(0, "Selected item is %d\n", gameno);
|
|
network_address s_address;
|
|
memcpy(&s_address, &DLLNetwork_games[gameno].addr, sizeof(network_address));
|
|
s_address.connection_type = NP_TCP;
|
|
// s_address.port=&DLLNetwork_games[gameno].addr.port;//DEFAULT_GAME_PORT;
|
|
*DLLGame_is_master_tracker_game = 0;
|
|
DLLMultiStartClient(NULL);
|
|
if (DLLDoPlayerMouselookCheck(DLLNetwork_games[gameno].flags)) {
|
|
if (DLLmsn_CheckGetMission(&s_address, DLLNetwork_games[gameno].mission)) {
|
|
if ((DLLTryToJoinServer(&s_address))) {
|
|
DLLmprintf(0, "Menu: Game joined!\n");
|
|
DLLNewUIWindowClose(main_wnd);
|
|
exit_menu = 1;
|
|
ret = 1;
|
|
} else {
|
|
DLLNewUIWindowClose(main_wnd);
|
|
DLLNewUIWindowOpen(main_wnd);
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
DLLDoMessageBox(TXT_LC_ERROR, TXT_LC_NO_GAMES, MSGBOX_OK, UICOL_WINDOW_TITLE, UICOL_TEXT_NORMAL);
|
|
}
|
|
break;
|
|
case 7:
|
|
// Start a new game
|
|
// Start a netgame
|
|
DLLNewUIWindowClose(main_wnd);
|
|
*DLLGame_is_master_tracker_game = 0;
|
|
if (StartMultiplayerGameMenu()) {
|
|
exit_menu = 1;
|
|
ret = 1;
|
|
} else {
|
|
DLLNewUIWindowOpen(main_wnd);
|
|
}
|
|
break;
|
|
case 8:
|
|
// Scan for local games
|
|
*DLLMulti_Gamelist_changed = true;
|
|
*DLLNum_network_games_known = 0;
|
|
looklocal = 1;
|
|
lastgamesfound = 0;
|
|
selno = DLLListGetSelectedIndex(main_list);
|
|
if (selno >= 0)
|
|
strcpy(selgame, DLLNetwork_games[selno].name);
|
|
else
|
|
selgame[0] = '\0';
|
|
|
|
DLLSearchForLocalGamesTCP(0xffffffffl, htons(DEFAULT_GAME_PORT));
|
|
DLLListRemoveAll(main_list);
|
|
for (a = 0; a < MAX_NET_GAMES; a++)
|
|
if (net_game_txt_items[a])
|
|
DLLRemoveUITextItem(net_game_txt_items[a]);
|
|
for (a = 0; a < MAX_NET_GAMES; a++)
|
|
net_game_txt_items[a] = NULL;
|
|
break;
|
|
case 9: {
|
|
// Scan a specific IP
|
|
uint16_t iport = DEFAULT_GAME_PORT;
|
|
looklocal = 0;
|
|
uint32_t iaddr;
|
|
lastgamesfound = 0;
|
|
DLLEditGetText(edit_box, szdip, 25);
|
|
// Make this IP the default
|
|
DLLDatabaseWrite("DirectIP", szdip, strlen(szdip) + 1);
|
|
|
|
char *pport = strchr(szdip, ':');
|
|
if (pport) {
|
|
*pport = '\0';
|
|
pport++;
|
|
iport = atoi(pport);
|
|
}
|
|
|
|
iaddr = inet_addr(szdip);
|
|
DLLmprintf(0, "Local inet_addr %x\n", iaddr);
|
|
if (iaddr && (INADDR_NONE != iaddr))
|
|
DLLSearchForLocalGamesTCP(iaddr, htons(iport));
|
|
else
|
|
DLLmprintf(0, "Invalid IP for local search\n");
|
|
DLLListRemoveAll(main_list);
|
|
for (a = 0; a < MAX_NET_GAMES; a++)
|
|
if (net_game_txt_items[a])
|
|
DLLRemoveUITextItem(net_game_txt_items[a]);
|
|
for (a = 0; a < MAX_NET_GAMES; a++)
|
|
net_game_txt_items[a] = NULL;
|
|
} break;
|
|
case GET_INFO_ID: {
|
|
if (*DLLNum_network_games_known) {
|
|
int gameno;
|
|
gameno = DLLListGetSelectedIndex(main_list);
|
|
DLLShowNetgameInfo(&DLLNetwork_games[gameno]);
|
|
}
|
|
} break;
|
|
}
|
|
}
|
|
DLLNewUIWindowDestroy(main_wnd);
|
|
|
|
*DLLNewUIWindow_alpha = oldalpha;
|
|
for (a = 0; a < MAX_NET_GAMES; a++)
|
|
if (net_game_txt_items[a])
|
|
DLLRemoveUITextItem(net_game_txt_items[a]);
|
|
// Cleanup
|
|
DLLDeleteUIItem(screen_header);
|
|
DLLDeleteUIItem(main_wnd);
|
|
DLLDeleteUIItem(main_list);
|
|
DLLDeleteUIItem(list_header);
|
|
DLLDeleteUIItem(exit_hs);
|
|
DLLDeleteUIItem(join_hs);
|
|
DLLDeleteUIItem(start_hs);
|
|
DLLDeleteUIItem(srch_hs);
|
|
DLLDeleteUIItem(scan_hs);
|
|
DLLDeleteUIItem(edit_box);
|
|
|
|
DLLDeleteUIItem(info_hs);
|
|
DLLRemoveUITextItem(info_on_text);
|
|
DLLRemoveUITextItem(game_hdr_text);
|
|
DLLRemoveUITextItem(join_LC_text);
|
|
DLLRemoveUITextItem(list_head_txt);
|
|
DLLRemoveUITextItem(exit_on_text);
|
|
DLLRemoveUITextItem(exit_off_text);
|
|
DLLRemoveUITextItem(join_on_text);
|
|
DLLRemoveUITextItem(join_off_text);
|
|
DLLRemoveUITextItem(start_on_text);
|
|
DLLRemoveUITextItem(start_off_text);
|
|
DLLRemoveUITextItem(srch_on_text);
|
|
DLLRemoveUITextItem(srch_off_text);
|
|
DLLRemoveUITextItem(scan_on_text);
|
|
DLLRemoveUITextItem(scan_off_text);
|
|
return ret;
|
|
}
|
|
|
|
// MTS: only used in this file
|
|
void AutoLoginAndJoinGame(void) {
|
|
uint16_t port;
|
|
uint32_t iaddr;
|
|
|
|
*DLLMultiGameStarting = 0;
|
|
|
|
if (!*DLLAuto_login_addr) {
|
|
DLLmprintf(0, "Can't autostart because no IP address was specified!!\n");
|
|
return;
|
|
}
|
|
if (*DLLAuto_login_port) {
|
|
port = atoi(DLLAuto_login_port);
|
|
} else {
|
|
port = DEFAULT_GAME_PORT;
|
|
}
|
|
|
|
// Now actually connect to the server!
|
|
|
|
network_address s_address;
|
|
iaddr = inet_addr(DLLAuto_login_addr);
|
|
memcpy(&s_address.address, &iaddr, sizeof(uint32_t));
|
|
s_address.port = port;
|
|
s_address.connection_type = NP_TCP;
|
|
*DLLGame_is_master_tracker_game = 0;
|
|
DLLMultiStartClient(NULL);
|
|
|
|
if ((DLLTryToJoinServer(&s_address))) {
|
|
DLLmprintf(0, "Menu: Game joined!\n");
|
|
*DLLMultiGameStarting = 1;
|
|
}
|
|
}
|
|
|
|
} // namespace lanclient
|