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

📄 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 "StdAfx.h"
#include "NetStart.h"
#include "CoolServ.h"
#include "Resource.h"
#include "ServerUtils.h"
#include "Direct.h"
#include "io.h"


// Guids...

#ifdef _ADDON

DGUID GAMEGUID = { /* Add-On */
	0xc13e628, 0x418c, 0x11d2, 0x86, 0xa, 0x0, 0x60, 0x97, 0x18, 0xa9, 0x42
};

#else

DGUID GAMEGUID = { /* 0C13E629-419C-11D2-860A-00609719A842 */
	0xc13e629, 0x419c, 0x11d2, 0x86, 0xa, 0x0, 0x60, 0x97, 0x19, 0xa8, 0x42
};

#endif


// Defines...

#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 HOURS_PER_SEC	0.00027f


// Statics...

static	ServerInterface*	s_pServerMgr     = NULL;
static	ServerInfo*			s_pServerInfo    = NULL; 
static	ServerOptions*		s_pServerOptions = NULL;
static	NetGame*			s_pNetGame       = NULL;
static	HWND				s_hMainWnd       = NULL;
static	HICON				s_hIcon		     = NULL;
static	HINSTANCE			s_hInst			 = NULL;
							
static	char				s_sServerName[256]  = { "" };
static	char				s_sServiceName[256] = { "" };

static	int					s_nGameType         = NGT_DEATHMATCH;
static	int					s_nEndType          = NGE_FRAGS;
static	int					s_nEndFrags         = 25;
static	int					s_nEndTime          = 10;
static	int					s_nNetService       = 0;
static	int					s_nMaxPlayers       = MAX_MULTI_PLAYERS_DISPLAY;
static	int					s_nPort				= 0;
static	int					s_nAmmoLevel		= LEVEL_NORMAL;
static	int					s_nAmmoRespawn		= 15;
static	int					s_nArmorLevel		= LEVEL_NORMAL;
static	int					s_nArmorRespawn		= 45;
static	int					s_nHealthLevel		= LEVEL_NORMAL;
static	int					s_nHealthRespawn	= 30;
static	int					s_nPowerupsLevel	= LEVEL_NORMAL;
static	int					s_nPowerupsRespawn	= 60;
static	int					s_nHealingRate      = 0;
static	int					s_nTeam             = 0;
static	int					s_nErrorString		= IDS_NETERR_GENERIC;
static	int					s_nFlagValue		= 5;
static	int					s_nGoalValue        = 5;
static	int					s_nSocBallSkin      = 0;

static	BOOL				s_bFallDamage       = FALSE;
static	BOOL				s_bUpdateInfo		= TRUE;
static	BOOL				s_bServerReg		= TRUE;
static	BOOL				s_bUseGameSpy		= TRUE;
static	BOOL				s_bDashGoInfo       = FALSE;
static	BOOL				s_bIsTcpIp          = FALSE;
static	BOOL				s_bFriendlyFire	    = TRUE;
static	BOOL				s_bNegTeamFrags	    = TRUE;
static	BOOL				s_bOnlyFlagScores   = FALSE;
static	BOOL				s_bUseTeamSize	    = FALSE;
static	BOOL				s_bOnlyGoalScores   = FALSE;

static	CStringList			s_collLevels;
static	CStringList			s_collRezFiles;


// Macros...

#define RM_GET_FLOAT(s, f, d) { char sBuf[64] = {""}; UINT32 uSize = 62; rm.Get(s, sBuf, uSize, ""); if (strlen(sBuf) > 0) f = (float)atof(sBuf); else f = d; }
#define RM_SET_FLOAT(s, f) { char sBuf[64]; sprintf(sBuf, "%f", f); rm.Set(s, sBuf); }


// Prototypes...

BOOL NetStart_HandleDefaultDialogCommands(HWND hDlg, WPARAM wParam);
void NetStart_DisplayError();
BOOL NetStart_GetWorldNightColor(HWND hParenWnd);

BOOL NetStart_FillServiceList(HWND hList);
BOOL NetStart_SelectCurrentService(HWND hList);

BOOL NetStart_FillGameInfo(HWND hDlg);
BOOL NetStart_FillLevelList(HWND hList, char* sDir, int nData, BOOL bClearList = TRUE);
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_FillOptions(HWND hDlg);
BOOL NetStart_FillTeamOptions(HWND hDlg);
BOOL NetStart_FillCtfOptions(HWND hDlg);
BOOL NetStart_FillSoccerOptions(HWND hDlg);

BOOL NetStart_InitGameType(HWND hDlg);
BOOL NetStart_InitGameItems(HWND hDlg);
BOOL NetStart_InitGameDamage(HWND hDlg);
BOOL NetStart_InitOptions(HWND hDlg);
BOOL NetStart_InitTeamOptions(HWND hDlg);
BOOL NetStart_InitCtfOptions(HWND hDlg);
BOOL NetStart_InitSoccerOptions(HWND hDlg);

BOOL NetStart_SetEndGameInfo(HWND hDlg);

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_Game(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_GameEnd(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
BOOL CALLBACK NetDlg_GameLevels(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);
BOOL CALLBACK NetDlg_Finished(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
BOOL CALLBACK NetDlg_RezFiles(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);

void ForceActiveFocus(HWND hWnd);
void SetIcon(HWND hWnd);

BOOL AddSelToList(HWND hSrcList, HWND hDestList);
BOOL RemoveSelFromList(HWND hList);
void UpdateGameLevelControls(HWND hDlg);

void LoadLevelStrings();
void SaveLevelStrings();

int  FillAvailableRez(HWND hList);
int  FillSelectedRez(HWND hList);
BOOL AddSelectedRez(HWND hSourceList, HWND hDestList);
BOOL RemoveSelectedRez(HWND hSourceList, HWND hDestList);
BOOL IsRezSelected(HWND hDestList, const char* sRez);
BOOL IsSourceItemAddable(HWND hSourceList, HWND hDestList);
BOOL IsDestItemRemovable(HWND hSourceList, HWND hDestList);
void UpdateRezControls(HWND hDlg);
int	 AddSelectedToList(HWND hDestList);
void SaveRezStrings();
void LoadRezStrings();
void InitGameLevels(HWND hDlg);
void UpdateSaveGameLevels(HWND hDlg);

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);


// Functions...

// ----------------------------------------------------------------------- //
// These functions get/set console variable values.
// For the Get functions, the value you pass in is used as the default value.
// ----------------------------------------------------------------------- //

BOOL SetGameVar(const char *pName, const char *pVal)
{
	char str[512];

	if(!s_pServerMgr)
		return FALSE;

	sprintf(str, "\"+%s\" \"%s\"", pName, pVal);
	s_pServerMgr->RunConsoleString(str);
	return TRUE;
}

void SetGameVar(const char *pName, float val)
{
	char valStr[256];

	sprintf(valStr, "%f", val);
	SetGameVar(pName, valStr);
}

void SetGameVar(const char *pName, int val)
{
	char valStr[256];

	sprintf(valStr, "%d", val);
	SetGameVar(pName, valStr);
}


BOOL NS_GetGameVar(char *pName, char *pVal, DWORD maxLen)
{
	HCONSOLEVAR hVar;

	if(!s_pServerMgr)
		return FALSE;
		
	if(s_pServerMgr->GetConsoleVar(pName, &hVar, pVal) == LT_OK)
	{
		return s_pServerMgr->GetVarValueString(hVar, pVal, maxLen) == LT_OK;
	}
	else
	{
		return SetGameVar(pName, pVal);
	}
}

BOOL NS_GetGameVar(char *pName, int &val)
{
	HCONSOLEVAR hVar;
	char valStr[256];

	if(!s_pServerMgr)
		return FALSE;

	sprintf(valStr, "%d", val);
	if(s_pServerMgr->GetConsoleVar(pName, &hVar, valStr) == LT_OK)
	{
		if(s_pServerMgr->GetVarValueString(hVar, valStr, sizeof(valStr)) == LT_OK)
		{
			val = atoi(valStr);
			return TRUE;
		}
		else
		{
			return FALSE;
		}
	}
	else
	{
		return SetGameVar(pName, valStr);
	}
}

BOOL NS_GetGameVar(char *pName, float &val)
{
	HCONSOLEVAR hVar;
	char valStr[256];

	if(!s_pServerMgr)
		return FALSE;

	sprintf(valStr, "%f", val);
	if(s_pServerMgr->GetConsoleVar(pName, &hVar, valStr) == LT_OK)
	{
		if(s_pServerMgr->GetVarValueString(hVar, valStr, sizeof(valStr)) == LT_OK)
		{
			val = (float)atof(valStr);
			return TRUE;
		}
		else
		{
			return FALSE;
		}
	}
	else
	{
		return SetGameVar(pName, valStr);
	}
}


// ----------------------------------------------------------------------- //
// These load/save all the relevant console vars.
// ----------------------------------------------------------------------- //

void NetStart_LoadConsoleVars()
{
	NS_GetGameVar("ServerName", s_sServerName, sizeof(s_sServerName));
	NS_GetGameVar("ServiceName", s_sServiceName, sizeof(s_sServiceName));

	NS_GetGameVar("GameType", s_nGameType);
	NS_GetGameVar("EndType", s_nEndType);
	NS_GetGameVar("EndFrags", s_nEndFrags);
	NS_GetGameVar("EndTime", s_nEndTime);
	NS_GetGameVar("NetService", s_nNetService);
	NS_GetGameVar("MaxPlayers", s_nMaxPlayers);
	NS_GetGameVar("UpdateInfo", s_bUpdateInfo);
	NS_GetGameVar("ServerReg", s_bServerReg);
	NS_GetGameVar("UseGameSpy", s_bUseGameSpy);
	NS_GetGameVar("DashGoInfo", s_bDashGoInfo);
	NS_GetGameVar("Port", s_nPort);

	NS_GetGameVar("WorldColorNight", s_pServerOptions->m_sWorldNightColor, sizeof(s_pServerOptions->m_sWorldNightColor));
	NS_GetGameVar("RunSpeed", s_pServerOptions->m_fRunSpeed);
	NS_GetGameVar("MissileSpeed", s_pServerOptions->m_fMissileSpeed);
	NS_GetGameVar("WorldTimeSpeed", s_pServerOptions->m_fWorldTimeSpeed);

	NS_GetGameVar("AmmoLevel", s_nAmmoLevel);
	NS_GetGameVar("AmmoRespawn", s_nAmmoRespawn);
	NS_GetGameVar("ArmorLevel", s_nArmorLevel);
	NS_GetGameVar("ArmorRespawn", s_nArmorRespawn);
	NS_GetGameVar("HealthLevel", s_nHealthLevel);
	NS_GetGameVar("HealthRespawn", s_nHealthRespawn);
	NS_GetGameVar("PowerupsLevel", s_nPowerupsLevel);
	NS_GetGameVar("PowerupsRespawn", s_nPowerupsRespawn);
	NS_GetGameVar("HealingRate", s_nHealingRate);
	NS_GetGameVar("Team", s_nTeam);
	NS_GetGameVar("FallDamage", s_bFallDamage);

	NS_GetGameVar("FriendlyFire", s_bFriendlyFire);
	NS_GetGameVar("NegTeamFrags", s_bNegTeamFrags);
	NS_GetGameVar("OnlyFlagScores", s_bOnlyFlagScores);
	NS_GetGameVar("OnlyGoalScores", s_bOnlyGoalScores);
	NS_GetGameVar("UseTeamSize", s_bUseTeamSize);
	NS_GetGameVar("FlagValue", s_nFlagValue);
	NS_GetGameVar("GoalValue", s_nGoalValue);
	NS_GetGameVar("SocBallSkin", s_nSocBallSkin);

#ifndef _ADDON
	if (s_nGameType == NGT_SOCCER) s_nGameType = NGT_DEATHMATCH;
#endif

}

void NetStart_SaveConsoleVars()
{
	SetGameVar("ServerName", s_sServerName);
	SetGameVar("ServiceName", s_sServiceName);

	SetGameVar("GameType", s_nGameType);
	SetGameVar("EndType", s_nEndType);
	SetGameVar("EndFrags", s_nEndFrags);
	SetGameVar("EndTime", s_nEndTime);
	SetGameVar("NetService", s_nNetService);
	SetGameVar("MaxPlayers", s_nMaxPlayers);
	SetGameVar("UpdateInfo", s_bUpdateInfo);
	SetGameVar("ServerReg", s_bServerReg);
	SetGameVar("UseGameSpy", s_bUseGameSpy);
	SetGameVar("DashGoInfo", 1);
	SetGameVar("Port", s_nPort);

	SetGameVar("WorldColorNight", s_pServerOptions->m_sWorldNightColor);
	SetGameVar("RunSpeed", s_pServerOptions->m_fRunSpeed);
	SetGameVar("MissileSpeed", s_pServerOptions->m_fMissileSpeed);
	SetGameVar("WorldTimeSpeed", s_pServerOptions->m_fWorldTimeSpeed);

	SetGameVar("AmmoLevel", s_nAmmoLevel);
	SetGameVar("AmmoRespawn", s_nAmmoRespawn);
	SetGameVar("ArmorLevel", s_nArmorLevel);
	SetGameVar("ArmorRespawn", s_nArmorRespawn);
	SetGameVar("HealthLevel", s_nHealthLevel);
	SetGameVar("HealthRespawn", s_nHealthRespawn);
	SetGameVar("PowerupsLevel", s_nPowerupsLevel);
	SetGameVar("PowerupsRespawn", s_nPowerupsRespawn);
	SetGameVar("HealingRate", s_nHealingRate);
	SetGameVar("Team", s_nTeam);
	SetGameVar("FallDamage", s_bFallDamage);

	SetGameVar("FriendlyFire", s_bFriendlyFire);
	SetGameVar("NegTeamFrags", s_bNegTeamFrags);
	SetGameVar("OnlyFlagScores", s_bOnlyFlagScores);
	SetGameVar("OnlyGoalScores", s_bOnlyGoalScores);
	SetGameVar("UseTeamSize", s_bUseTeamSize);
	SetGameVar("FlagValue", s_nFlagValue);
	SetGameVar("GoalValue", s_nGoalValue);
	SetGameVar("SocBallSkin", s_nSocBallSkin);
}

DRESULT NetStart_SaveConfigFile(char *pFilename)
{
	if (!s_pServerMgr)
		return LT_ERROR;

	return s_pServerMgr->SaveConfigFile(pFilename);
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	NetStart_DoWizard
//
//	PURPOSE:	Starts the multiplayer wizard
//
// ----------------------------------------------------------------------- //

BOOL NetStart_DoWizard(HINSTANCE hInst, ServerInfo* pServerInfo, ServerOptions* pServerOptions, NetGame* pNetGame, BOOL bNoDlgs, char *pConfig)
{
	// Sanity checks...

	if (!pServerInfo) return(FALSE);
	if (!pServerOptions) return(FALSE);
	if (!pNetGame) return(FALSE);


	// Set our static pointers...

	s_pServerInfo    = pServerInfo;
	s_pServerOptions = pServerOptions;
	s_pNetGame       = pNetGame;
	s_hInst          = hInst;


	// Clear the structures...

	memset(s_pServerInfo, 0, sizeof(ServerInfo));
	memset(s_pServerOptions, 0, sizeof(ServerOptions));
	memset(s_pNetGame, 0, sizeof(NetGame));


	// Fill in the default server options...

	s_pServerOptions->m_fWorldTimeSpeed = -1.0f;
	s_pServerOptions->m_fRunSpeed       = 1.0;
	s_pServerOptions->m_fMissileSpeed   = 1.0;

	strcpy(s_pServerOptions->m_sWorldNightColor, "0.5 0.5 0.5");


	// Load some string resources...

#ifdef _ADDON
	LoadString(s_hInst, IDS_DEFAULTSERVERNAME_AO, s_sServerName, 250);
#else
	LoadString(s_hInst, IDS_DEFAULTSERVERNAME, s_sServerName, 250);
#endif


	// Get the server interface...

	s_pServerMgr = GetServerInterface();
	if (!s_pServerMgr) 
	{
		return(FALSE);
	}


	// Load the server config file...

	s_pServerMgr->LoadConfigFile(pConfig);


	// Declare local variables we'll be using...

	int		nRet;
	int		cRezFiles       = 0;
	HWND	hParentWnd      = NULL;
	BOOL	bAddedResources = FALSE;


	// Load our icon...

	s_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);


	// Init the networking...

	BOOL bRet = s_pServerMgr->InitNetworking(NULL, 0);
	if (!bRet)
	{
		s_nErrorString = IDS_NETERR_INIT;
		goto Failure;
	}


	// Load some info...

	NetStart_LoadConsoleVars();

	LoadLevelStrings();
	LoadRezStrings();


	// Check if we should skip the dialogs...

	if (bNoDlgs)
	{
		if (NetStart_GoNoDialogs(pServerInfo, pNetGame))
		{
			return(TRUE);
		}
	}


	// Do the services dialog...

ServicesDlg:
	nRet = DialogBox(hInst, "NET_SERVICES", hParentWnd, (DLGPROC)NetDlg_Services);

	if (nRet == DLG_ERROR) goto Failure;
	if (nRet == DLG_CANCEL) goto Cancel;


	// Do the rez files dialog...

RezFilesDlg:
	cRezFiles = FillAvailableRez(NULL);
	if (cRezFiles <= 0) goto GameDlg;

	nRet = DialogBox(hInst, "NET_REZFILES", hParentWnd, (DLGPROC)NetDlg_RezFiles);

	if (nRet == DLG_BACK) goto ServicesDlg;
	if (nRet == DLG_ERROR) goto Failure;
	if (nRet == DLG_CANCEL) goto Cancel;


	// Do the game dialog...

GameDlg:

#ifdef _ADDON
	nRet = DialogBox(hInst, "NET_GAME_AO", hParentWnd, (DLGPROC)NetDlg_Game);
#else
	nRet = DialogBox(hInst, "NET_GAME", hParentWnd, (DLGPROC)NetDlg_Game);
#endif

	if (nRet == DLG_BACK && cRezFiles <= 0) goto ServicesDlg;
	if (nRet == DLG_BACK && cRezFiles > 0) goto RezFilesDlg;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -