📄 netstart.cpp
字号:
/****************************************************************************
;
; MODULE: NetStart (.CPP)
;
; PURPOSE: Network game start/join/host dialog code
;
; HISTORY: 06/28/98 [blg] This file was created
;
; COMMENT: Copyright (c) 1998, Monolith Productions Inc.
;
****************************************************************************/
// Includes...
#include "Windows.h"
#include <stdio.h>
#include "NetStart.h"
#include "NetInfo.h"
#include "IpMgr.h"
#include "Sparam.h"
#include "ConfigMgr.h"
#include "dplobby.h"
#include "..\Shared\ClientRes.h"
#include <mbstring.h>
// Defines...
#define LASTHOSTPORT_VARNAME "LastHostPort"
#define DLG_NEXT 1
#define DLG_CANCEL 2
#define DLG_BACK 3
#define DLG_ERROR 4
#define RETAIL_LEVEL 0
#define CUSTOM_LEVEL 1
#define ADDON_LEVEL 2
#define NET_JOIN 0
#define NET_HOST 1
#define CONNECT_FULL 0
#define CONNECT_TCPIP 1
#define CONNECT_TCPIP_QUICK 2
#define CONNECT_TCPIP_HOST 3
#define HIGHPING_UPDATERATE 3
#define MODEM_UPDATERATE 5
#define ISDN_UPDATERATE 9
#define LAN_UPDATERATE 18
#define DEFAULT_UPDATERATE MODEM_UPDATERATE
#define MAX_NETSTART_SERVICES 16
#define HOURS_PER_SEC 0.00027f
#define TIMER_UPDATEQUERY 2
#define TIMER_UPDATEDIALOG 3
// Macros...
#define IsKeyDown(key) (GetAsyncKeyState(key) & 0x80000000)
#define WasKeyDown(key) (GetAsyncKeyState(key) & 0x00000001)
#define WisKeyDown(key) (GetAsyncKeyState(key) & 0x80000001)
// Globals...
ServerOptions g_ServerOptions;
// Statics...
// Used for the tcp/ip address dialog.
static char *g_DlgIP;
static DWORD g_DlgIPLen;
static CClientDE* s_pClient = NULL;
static NetStart* s_pNetStart = NULL;
static ServerOptions* s_pServerOptions = NULL;
static HWND s_hMainWnd = NULL;
static HINSTANCE s_hInst = NULL;
static CNinfoMgr s_NinfoMgr;
static CConfigMgr s_ConfigMgr;
static CIpMgr s_IpMgr;
static HNETSERVICE g_ServiceHandles[MAX_NETSTART_SERVICES];
static DDWORD g_ServiceFlags[MAX_NETSTART_SERVICES];
static HNETSERVICE g_SelectedService=0;
static DDWORD g_HostPort=0;
static char s_sSessionName[128] = { "" };
static char s_sPlayerName[32] = { "" };
static char s_sFirstLevel[128] = { "" };
static char s_sPlayerInfoNotSent[80]= { "(player info not sent)" };
static char s_sNetConfigFile[128] = { "Caleb.b2c" };
static char s_sHighPing[50] = { "High-Ping/Modem" };
static char s_sModem[50] = { "28.8k-56k Modem" };
static char s_sIsdn[50] = { "ISDN-T1 Internet" };
static char s_sLan[50] = { "LAN Game" };
static char s_sCustom[50] = { "Custom" };
static char s_sDefaultSessionName[128] = { "" };
static int s_nGameType = 0;
static int s_nEndType = 0;
static int s_nEndFrags = 0;
static int s_nEndTime = 0;
static int s_nPlayerColor = 0;
static int s_nMech = 0;
static int s_nNetService = 0;
static int s_nNetJoinHost = 0;
static int s_nNetLatency = DEFAULT_UPDATERATE;
static int s_nMaxPlayers = MAX_MULTI_PLAYERS_DISPLAY;
static int s_nFpsLimit = 30;
static int s_nErrorString = IDS_NETERR_GENERIC;
static int s_nConnectType = CONNECT_FULL;
static int s_nNetAmmoLevel = LEVEL_NORMAL;
static int s_nNetAmmoRespawn = 15;
static int s_nNetArmorLevel = LEVEL_NORMAL;
static int s_nNetArmorRespawn = 45;
static int s_nNetHealthLevel = LEVEL_NORMAL;
static int s_nNetHealthRespawn = 30;
static int s_nNetPowerupsLevel = LEVEL_NORMAL;
static int s_nNetPowerupsRespawn = 60;
static int s_nNetHealingRate = 0;
static int s_nNetTeam = 0;
static int s_nNumJoinRetries = 0;
static int s_nInternalJoinHost = NET_UNKNOWN;
static int s_nNetFlagValue = 5;
static int s_nNetGoalValue = 5;
static int s_nNetSocBallSkin = 0;
static BOOL s_bLimitFps = FALSE;
static BOOL s_bSaveLevels = TRUE;
static BOOL s_bLobbyLaunch = FALSE;
static BOOL s_bDontDisplayNoSessions = FALSE;
static BOOL s_bDontDisplaySettingsDialog = FALSE;
static BOOL s_bHaveSettingInfo = FALSE;
static BOOL s_bNetFallDamage = FALSE;
static BOOL s_bNetFriendlyFire = TRUE;
static BOOL s_bNetNegTeamFrags = TRUE;
static BOOL s_bNetOnlyFlagScores = FALSE;
static BOOL s_bNetUseTeamSize = FALSE;
static BOOL s_bNetOnlyGoalScores = FALSE;
static NetPlayer s_NetPlayer;
static NetGame s_NetGame;
static NetClientData s_NetClientData;
static RMode s_RMode;
static NetSession* s_pSessionList = NULL;
// Externs...
extern HINSTANCE g_hLTDLLInstance;
extern DBOOL g_bIsHost;
// Macros...
#ifdef _DEBUG
#define DEBUG_MSG(s) MessageBox(NULL, s, "Blood2 Debug", MB_OK);
#define DEBUG_NUM(s, n) { char sBuf[128]; wsprintf(sBuf, "%s = %i", s, n); DEBUG_MSG(sBuf); }
#else
#define DEBUG_MSG(s) /* */
#define DEBUG_NUM(s, n) /* */
#endif
#define SET_NODRAW(hWnd) SendMessage(hWnd, WM_SETREDRAW, 0, 0);
#define SET_REDRAW(hWnd) SendMessage(hWnd, WM_SETREDRAW, 1, 0); InvalidateRect(hWnd, NULL, FALSE); UpdateWindow(hWnd);
// Prototypes...
BOOL NetStart_HandleDefaultDialogCommands(HWND hDlg, WPARAM wParam);
void NetStart_DisplayError(HINSTANCE hInst);
BOOL NetStart_FillServiceList(HWND hList);
BOOL NetStart_SelectCurrentService(HWND hList);
BOOL NetStart_SelectJoinHost(HWND hDlg);
BOOL NetStart_SelectNetSpeed(HWND hComboBox);
int NetStart_FillSessionList(HWND hDlg);
int NetStart_FillSessionListTcpIp(HWND hDlg);
BOOL NetStart_JoinCurrentSession(HWND hList);
BOOL NetStart_HostSession1(HWND hDlg);
BOOL NetStart_HostSession2(HWND hDlg);
BOOL NetStart_DisplaySelectedSessionInfo(HWND hDlg);
BOOL NetStart_ClearSelectedSessionInfo(HWND hDlg);
BOOL NetStart_FillLevelList(HWND hList, char* sDir, int nData, BOOL bClearList = TRUE);
BOOL NetStart_FillPlayerStruct(HWND hDlg, BOOL bUseComboConfig = FALSE);
BOOL NetStart_FillGameStruct(HWND hDlg);
BOOL NetStart_FillGameLevels(HWND hDlg);
BOOL NetStart_FillGameEnd(HWND hDlg);
BOOL NetStart_FillGameItems(HWND hDlg);
BOOL NetStart_FillGameDamage(HWND hDlg);
BOOL NetStart_FillGameType(HWND hDlg);
BOOL NetStart_FillNetSpeed(HWND hDlg);
BOOL NetStart_SetEndGameInfo(HWND hDlg);
void NetStart_InitFpsLimit(HWND hDlg);
void NetStart_FillFpsLimit(HWND hDlg);
int NetStart_GetConnectCommands(CClientDE* pClient, NetStart* pNetStart);
BOOL NetStart_DoTcpIpDialog(HINSTANCE hInst, HWND hParentWnd);
BOOL NetStart_InitOptions(HWND hDlg);
BOOL NetStart_FillOptions(HWND hDlg);
BOOL NetStart_InitTeamOptions(HWND hDlg);
BOOL NetStart_FillTeamOptions(HWND hDlg);
BOOL NetStart_InitCtfOptions(HWND hDlg);
BOOL NetStart_FillCtfOptions(HWND hDlg);
BOOL NetStart_InitSoccerOptions(HWND hDlg);
BOOL NetStart_FillSoccerOptions(HWND hDlg);
BOOL NetStart_InitPlayer(HWND hDlg);
BOOL NetStart_InitGameItems(HWND hDlg);
BOOL NetStart_InitGameDamage(HWND hDlg);
BOOL NetStart_InitConfigCombo(HWND hDlg);
BOOL NetStart_InitGameType(HWND hDlg);
BOOL NetStart_HostTcpIp(CClientDE* pClientDE);
BOOL NetStart_IsOkToDisplayLevel(char* sLevel);
BOOL CALLBACK NetDlg_Welcome(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
BOOL CALLBACK NetDlg_Services(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
BOOL CALLBACK NetDlg_JoinHost(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
BOOL CALLBACK NetDlg_Sessions(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
BOOL CALLBACK NetDlg_SessionsTcpIp(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
BOOL CALLBACK NetDlg_Player(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
BOOL CALLBACK NetDlg_Game(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
BOOL CALLBACK NetDlg_GameLevels(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
BOOL CALLBACK NetDlg_Finished(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
BOOL CALLBACK NetDlg_NoSessions(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
BOOL CALLBACK NetDlg_Options(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
BOOL CALLBACK NetDlg_TeamOptions(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
BOOL CALLBACK NetDlg_CtfOptions(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
BOOL CALLBACK NetDlg_SoccerOptions(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
BOOL CALLBACK NetDlg_Settings(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
BOOL CALLBACK NetDlg_GameItems(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
BOOL CALLBACK NetDlg_GameDamage(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
void ForceActiveFocus(HWND hWnd);
int GetConsoleInt(char* sKey, int nDefault);
void GetConsoleString(char* sKey, char* sDest, char* sDefault);
void WriteConsoleString(char* sKey, char* sValue);
void WriteConsoleInt(char* sKey, int nValue);
DFLOAT GetConsoleFloat(char* sKey, DFLOAT fDefault);
void WriteConsoleFloat(char* sKey, DFLOAT fValue);
BOOL AddSelToList(HWND hSrcList, HWND hDestList);
BOOL RemoveSelFromList(HWND hList);
void UpdateGameLevelControls(HWND hDlg);
int AddComboInfo(HWND hComboBox, char* sText, DWORD dwValue);
int DoNoSessionsMessage(HWND hParentWnd);
void FixAddress(char* sAddress);
BOOL DoOptionHelp(HWND hParentWnd, int iMsg, int iTitle);
void SetDlgItemFloat(HWND hDlg, int iCtrl, float fValue);
float GetDlgItemFloat(HWND hDlg, int iCtrl);
void SetItemLevel(HWND hDlg, UINT idControl, int nLevel);
int GetItemLevel(HWND hDlg, UINT idControl);
void SetItemRespawn(HWND hDlg, UINT idControl, int nRespawn);
int GetItemRespawn(HWND hDlg, UINT idControl);
void SetHealingRate(HWND hDlg, UINT idControl, int nLevel);
int GetHealingRate(HWND hDlg, UINT idControl);
void PostProcessName(char* sName);
// Functions...
// ----------------------------------------------------------------------- //
// Return the flags for the currently selected service.
// ----------------------------------------------------------------------- //
DWORD GetSelectedServiceFlags()
{
DWORD i;
for(i=0; i < MAX_NETSTART_SERVICES; i++)
{
if(g_ServiceHandles[i] == g_SelectedService)
{
return g_ServiceFlags[i];
}
}
return 0;
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: NetStart_DoWizard
//
// PURPOSE: Starts the multiplayer wizard
//
// ----------------------------------------------------------------------- //
DBOOL NetStart_DoWizard(CClientDE* pClientDE)
{
// Sanity checks...
if (!pClientDE) return(DFALSE);
// Let the main function do the real wizard work...
NetStart ns;
DBOOL bRet = NetStart_DoWizard(pClientDE, &ns, NET_UNKNOWN);
if (!bRet) return(DFALSE);
// Start the game as requested...
StartGameRequest req;
memset(&req, 0, sizeof(req));
if (ns.m_bHost)
{
req.m_Type = STARTGAME_HOST;
strcpy(req.m_WorldName, ns.m_sLevel);
memcpy(&req.m_HostInfo, &ns.m_NetHost, sizeof(NetHost));
g_bIsHost = DTRUE;
}
else
{
req.m_Type = STARTGAME_CLIENT;
req.m_pNetSession = ns.m_pNetSession;
if (ns.m_bHaveTcpIp)
{
req.m_Type = STARTGAME_CLIENTTCP;
strcpy(req.m_TCPAddress, ns.m_sAddress);
}
g_bIsHost = DFALSE;
}
req.m_pGameInfo = NetStart_GetGameStruct();
req.m_GameInfoLen = sizeof(NetGame_t);
req.m_pClientData = NetStart_GetClientDataStruct();
req.m_ClientDataLen = sizeof(NetClientData_t);
DRESULT dr = pClientDE->StartGame(&req);
if (dr != LT_OK && req.m_Type == STARTGAME_CLIENTTCP)
{
while (dr != LT_OK && s_nNumJoinRetries > 0)
{
s_nNumJoinRetries--;
Sleep(1000);
dr = pClientDE->StartGame(&req);
}
}
NetStart_FreeSessionList(pClientDE);
if (dr == LT_OK)
{
NetStart_RunServerOptions(pClientDE, s_pServerOptions);
}
else
{
HINSTANCE hInst;
void* hModule;
g_pClientDE->GetEngineHook("cres_hinstance",&hModule);
hInst = (HINSTANCE)hModule;
if (!hInst) return (DFALSE);
if(dr == LT_CANTBINDTOPORT)
s_nErrorString = IDS_NETERR_CANTBINDTOPORT;
else if(dr == LT_REJECTED)
s_nErrorString = IDS_NETERR_CONNECTIONREJECTED;
else if (dr == LT_NOTSAMEGUID)
s_nErrorString = IDS_NETERR_NOTSAMEGUID;
else
s_nErrorString = IDS_NETERR_GENERIC;
NetStart_DisplayError(hInst);
return(DFALSE);
}
// All done...
return(DTRUE);
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: NetStart_DoWizard
//
// PURPOSE: Starts the multiplayer wizard
//
// ----------------------------------------------------------------------- //
DBOOL NetStart_DoWizard(CClientDE* pClient, NetStart* pNetStart, int nJoinHost)
{
// Sanity checks...
if (!pClient) return(DFALSE);
if (!pNetStart) return(DFALSE);
// Set our static pointers...
s_pClient = pClient;
s_pNetStart = pNetStart;
s_pServerOptions = &g_ServerOptions;
s_bLobbyLaunch = FALSE;
s_nInternalJoinHost = nJoinHost;
// Init the net game info manager...
s_NinfoMgr.Term();
s_NinfoMgr.Init(s_pClient);
// Clear the NetStart structure...
memset(s_pNetStart, 0, sizeof(NetStart));
// Clear our static player and game structures...
memset(&s_NetPlayer, 0, sizeof(NetPlayer));
memset(&s_NetGame, 0, sizeof(NetGame));
memset(&s_NetClientData, 0, sizeof(NetClientData));
// Fill in the default server options...
memset(s_pServerOptions, 0, sizeof(ServerOptions));
s_pServerOptions->m_fWorldTimeSpeed = -1.0f;
s_pServerOptions->m_fRunSpeed = 1.3f;
s_pServerOptions->m_fMissileSpeed = 1.0;
strcpy(s_pServerOptions->m_sWorldNightColor, "0.5 0.5 0.5");
// Get the module handle...
HINSTANCE hInst;
void* hModule;
g_pClientDE->GetEngineHook("cres_hinstance",&hModule);
hInst = (HINSTANCE)hModule;
if (!hInst) return(NULL);
s_hInst = hInst;
// Init the engine's networking...
DRESULT dr = pClient->InitNetworking(NULL, 0);
if (dr != LT_OK)
{
s_nErrorString = IDS_NETERR_INIT;
NetStart_DisplayError(hInst);
return(DFALSE);
}
// Set some default values...
LoadString(hInst, IDS_NETWIZ_DEFAULTSESSIONNAME, s_sDefaultSessionName, 120);
LoadString(hInst, IDS_NETWIZ_DEFAULTSESSIONNAME, s_sSessionName, 120);
LoadString(hInst, IDS_NETWIZ_DEFAULTPLAYERNAME, s_sPlayerName, 30);
LoadString(hInst, IDS_NETWIZ_PLAYERINFONOTSENT, s_sPlayerInfoNotSent, 70);
LoadString(hInst, IDS_NETWIZ_MODEM, s_sModem, 50);
LoadString(hInst, IDS_NETWIZ_ISDN, s_sIsdn, 50);
LoadString(hInst, IDS_NETWIZ_LAN, s_sLan, 50);
LoadString(hInst, IDS_NETWIZ_CUSTOM, s_sCustom, 50);
#ifdef _DEMO
LoadString(hInst, IDS_NETWIZ_DEFAULTDEMOSESSIONNAME, s_sSessionName, 120);
LoadString(hInst, IDS_NETWIZ_DEFAULTDEMOSESSIONNAME, s_sDefaultSessionName, 120);
#endif
// Read some default values from the console...
GetConsoleString("NetConfigFile", s_sNetConfigFile, s_sNetConfigFile);
GetConsoleString("NetSessionName", s_sSessionName, s_sSessionName);
GetConsoleString("Name", s_sPlayerName, "");
if (s_sPlayerName[0] == '\0')
{
LoadString(hInst, IDS_NETWIZ_DEFAULTPLAYERNAME, s_sPlayerName, 30);
GetConsoleString("NetPlayerName", s_sPlayerName, s_sPlayerName);
}
PostProcessName(s_sPlayerName);
GetConsoleString("NetSessionName", s_sSessionName, s_sSessionName);
s_nGameType = GetConsoleInt("NetGameType", NGT_DEATHMATCH);
s_nEndType = GetConsoleInt("NetGameEnd", NGE_FRAGS);
s_nEndFrags = GetConsoleInt("NetEndFrags", 25);
s_nEndTime = GetConsoleInt("NetEndTime", 15);
s_nNetService = GetConsoleInt("NetService", 0);
s_nNetJoinHost = GetConsoleInt("NetJoinHost", 0);
s_nNetLatency = GetConsoleInt("UpdateRate", DEFAULT_UPDATERATE);
s_nMaxPlayers = GetConsoleInt("NetMaxPlayers", MAX_MULTI_PLAYERS_DISPLAY);
s_nFpsLimit = GetConsoleInt("NetFpsLimit", s_nFpsLimit);
s_bLimitFps = GetConsoleInt("NetLimitFps", s_bLimitFps);
s_bSaveLevels = GetConsoleInt("NetSaveLevels", s_bSaveLevels);
s_nNumJoinRetries = GetConsoleInt("NetJoinRetry", s_nNumJoinRetries);
s_bDontDisplayNoSessions = GetConsoleInt("DontDisplayNoSessions", 0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -