⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 netstart.cpp

📁 Blood 2全套源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:

/****************************************************************************
;
;	 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 + -