📄 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 "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 + -