Files
firestorm/Gameleap/code/mw4/Code/MW4GameEd2/ctcl.cpp
T
Cyd 2b8ca921cb Initial full mirror of c:\VWE (source + assets + toolchain + outputs) via Git LFS
Complete disaster-recovery snapshot: engine/game source, game data assets,
VC6 toolchain + DX SDKs, build outputs, deployed game, and _UNUSED archive.
Large binaries in Git LFS; text preserved byte-for-byte (core.autocrlf=false,
no eol attributes). See RECOVERY.md for the one-clone rebuild procedure.
2026-06-24 21:28:16 -05:00

1990 lines
61 KiB
C++

// ctcl.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
#include "ctcls.h"
#include "ctcl.h"
#if !defined(CTCLS_EXPORTS) && !defined(CTCL_LAUNCHER)
#include "recscore.h"
#endif // !defined(CTCLS_EXPORTS) && !defined(CTCL_LAUNCHER)
#define MAX_TESLAS 16
#define MAX_CAMERAS 4
#define PORT_Launcher 1000
#define PORT_Game 1001
#define PORT_CameraShip 1001
#define TCKS_GameInfo 1000
class CTeslaInfo;
#if !defined(CTCL_LAUNCHER)
extern void _stdcall GetFileName4GUID(char szBuf[256], const char* pcszDrv, const char* pcszPath, const char* pcszExt, const GUID& guid = *(const GUID*)NULL);
extern const char* g_pcszGameDataSavePath;
extern const char* g_pcszGameDataExtPR;
extern const char* g_pcszGameDataExtMR;
extern HWND hWindow;
#endif // !defined(CTCL_LAUNCHER)
int GetCTCLTypePort(int nCTCLType);
CSOCClient* CreateSOCClient(const CSOCListen& SOCListen, DWORD dwCSCParam1, DWORD dwCSCParam2);
class CSOC_Server : public CSOCServer
{
DECLARE_PACKET_MAP(CSOC_Server);
public:
CTeslaInfo* m_pTI;
DWORD m_dwLastGameInfo;
int m_nGameReturn;
public:
CSOC_Server(CTeslaInfo& TI);
virtual ~CSOC_Server();
virtual void OnConnect();
BOOL CheckLastGameInfo();
void OnGameReturn();
#if !defined(CTCL_LAUNCHER)
void OnSendFile();
void OnInviteCOOP();
#endif // !defined(CTCL_LAUNCHER)
};
class CSOC_2Launcher : public CSOC_Server
{
DECLARE_PACKET_MAP(CSOC_2Launcher);
public:
BOOL m_bMissionReview;
public:
CSOC_2Launcher(CTeslaInfo& TI);
virtual ~CSOC_2Launcher();
virtual void OnConnect();
void CheckConnection();
void OnGameInfo();
};
class CSOC_2Game : public CSOC_Server
{
DECLARE_PACKET_MAP(CSOC_2Game);
public:
public:
CSOC_2Game(CTeslaInfo& TI);
virtual ~CSOC_2Game();
};
class CSOC_2CameraShip : public CSOC_Server
{
DECLARE_PACKET_MAP(CSOC_2CameraShip);
public:
public:
CSOC_2CameraShip(CTeslaInfo& TI);
virtual ~CSOC_2CameraShip();
};
class CSOC_Client : public CSOCClient
{
DECLARE_PACKET_MAP(CSOC_Client);
public:
public:
CSOC_Client();
virtual ~CSOC_Client();
virtual void OnAccept();
void OnOrderAppl();
void OnErrorStartGame();
void OnReadyStartGame();
void OnBOTS();
void OnSetMechs();
void OnDoLaunch();
#if !defined(CTCL_LAUNCHER)
void OnSendFile();
void OnInviteCOOP();
#endif // !defined(CTCL_LAUNCHER)
};
#if defined(CTCL_LAUNCHER)
class CSOC_Launcher : public CSOC_Client
{
DECLARE_PACKET_MAP(CSOC_Launcher);
public:
public:
CSOC_Launcher();
virtual ~CSOC_Launcher();
void OnGameInfo();
void OnOrderAppl();
};
#else // !defined(CTCL_LAUNCHER)
class CSOC_Game : public CSOC_Client
{
DECLARE_PACKET_MAP(CSOC_Game);
public:
public:
CSOC_Game();
virtual ~CSOC_Game();
};
class CSOC_CameraShip : public CSOC_Client
{
DECLARE_PACKET_MAP(CSOC_CameraShip);
public:
public:
CSOC_CameraShip();
virtual ~CSOC_CameraShip();
};
#endif // defined(CTCL_LAUNCHER)
DECLARE_TARRAYREF(CTeslaInfo);
class CTeslaInfo : public CStr
{
public:
BOOL m_bCameraShip;
CStr m_strHost;
u_long m_ulAddr;
CSOC_2Launcher m_2Launcher;
CSOC_2Game* m_p2Game;
CSOC_2CameraShip* m_p2CameraShip;
int m_nApplType;
int m_nApplState;
int m_nGameState;
int m_nGameTime;
int m_nGameIsServer;
CInviteCOOP m_COOP;
public:
CTeslaInfo();
void SetTeslaInfo();
void CheckConnection();
CSOC_Server& GetGameSOC() const
{
if (m_bCameraShip) {
return *m_p2CameraShip;
} else {
return *m_p2Game;
}
}
};
class CTeslas : public TARRAYREF(CTeslaInfo)
{
public:
int m_nCameraShips;
public:
CTeslas()
{
m_nCameraShips = 0;
}
~CTeslas()
{
m_nCameraShips = 0;
}
CTeslaInfo& AddNew(int nAllocType);
CTeslaInfo& GetMissionReview() const;
};
#if !defined(CTCL_LAUNCHER)
class CSendFile : public TDBLNK(CSendFile*)
{
public:
SYSTEMTIME m_SysTime;
GUID m_guid;
int m_nType;
DWORD m_dwLast;
bool m_bProcessed;
CStr m_strHost;
DWORD m_dwTickCreated;
DWORD m_dwTickDelay;
public:
CSendFile(const SYSTEMTIME& SysTime, const GUID& guid, int nType);
void Check();
};
class CSendFileManager : public TDBLNKDESTROY(CSendFile)
{
public:
public:
CSendFileManager();
CSendFile* Find(const GUID& guid, int nType) const;
};
#endif // !defined(CTCL_LAUNCHER)
class CCTCLManager : public CSOCManager
{
public:
CTeslas m_aTIs;
CStr m_aCmds[_EAT_MAX][2]; // game & cameraship
#if !defined(CTCLS_EXPORTS)
// Mech4 only
TARRAY(BYTE) m_aNMP;
#if !defined(CTCL_LAUNCHER)
CSendFileManager m_SFM_Send;
CSendFileManager m_SFM_Recv;
CSendFileManager m_SFM_Done;
#endif // !defined(CTCL_LAUNCHER)
#endif // !defined(CTCLS_EXPORTS)
public:
CCTCLManager() : CSOCManager(1000) { }
BOOL Start(int nCTCLType);
void Stop();
void Run();
#if !defined(CTCLS_EXPORTS)
void DoMech4Comm();
void SaveNMP(const void* p, int nSize);
void* LoadNMP(int& nSize);
#if !defined(CTCL_LAUNCHER)
void SendFile(const SYSTEMTIME& SysTime, const GUID& guid, int nType);
bool DoReprintOrCheck(bool bRealPrint);
bool IsPendingMissionReplayRequest() const;
#endif / !defined(CTCL_LAUNCHER)
#endif // !defined(CTCLS_EXPORTS)
};
CCTCLManager* g_pCTCLManager = NULL;
#if !defined(CTCL_LAUNCHER)
// not extern "C"
extern bool g_bCOOP; // COin OPeration
extern int g_nCoinCount;
extern int g_nCoinCountTemp;
extern int g_nCoinPerGame;
#endif // !defined(CTCL_LAUNCHER)
#if defined(CTCL_LAUNCHER)
char g_szTeslaName[128];
#else // !defined(CTCL_LAUNCHER)
extern char g_szTeslaName[128];
extern char g_szTeslaAddr[128];
extern DWORD g_dwTeslaAddr;
extern char g_szTeslaInviter[128];
#endif // !defined(CTCL_LAUNCHER)
extern "C" {
int g_nCTCLType = _ECTCL_None;
int g_nCTCL_DoLaunchGame = 0;
#if !defined(CTCLS_EXPORTS)
CInviteCOOP g_InviteCOOP;
// Mech4 only
int g_nMech4Comm = 0;
BOOL g_bIsServer = FALSE;
SPlayerInfo g_aPlayerInfos[20];
int g_nPlayerInfos;
int g_nServer;
int g_nTeslas;
int g_nPrintOut;
int g_nMissionReview;
SYSTEMTIME g_SysTime;
GUID g_guidGameDatas;
char g_szGameName[128];
int g_nBOTs;
DWORD g_dwJoinStartTicks;
#endif // !defined(CTCLS_EXPORTS)
const char PROF_INI[] = "c:\\ctcl.ini";
const char SECT_TESLAS[] = "teslas";
#ifdef _DEBUG
const char SECT_GAMES[] = "games4dbg";
#else // !_DEBUG
const char SECT_GAMES[] = "games";
#endif // _DEBUG
const char SECT_CONFIG[] = "config";
const char SECT_AUX1TEAM[] = "aux1team";
const char SECT_AUX1FFA[] = "aux1ffa";
const char SECT_AUX1MISC[] = "aux1misc";
const char SECT_SND1TEAM[] = "snd1team";
const char SECT_SND1FFA[] = "snd1ffa";
const char SECT_SND1MISC[] = "snd1misc";
} // end of extern "C"
BEGIN_PACKET_MAP(CSOC_Server, CSOCServer)
PACKET_MAP_ENTRY(CSOC_Server, S_GameReturn, OnGameReturn)
#if !defined(CTCL_LAUNCHER)
PACKET_MAP_ENTRY(CSOC_Server, S_SendFile, OnSendFile)
PACKET_MAP_ENTRY(CSOC_Server, S_InviteCOOP, OnInviteCOOP)
#endif // !defined(CTCL_LAUNCHER)
END_PACKET_MAP(CSOC_Server)
BEGIN_PACKET_MAP(CSOC_2Launcher, CSOC_Server)
PACKET_MAP_ENTRY(CSOC_2Launcher, S_GameInfo, OnGameInfo)
END_PACKET_MAP(CSOC_2Launcher)
BEGIN_PACKET_MAP(CSOC_2Game, CSOC_Server)
END_PACKET_MAP(CSOC_2Game)
BEGIN_PACKET_MAP(CSOC_2CameraShip, CSOC_Server)
END_PACKET_MAP(CSOC_2CameraShip)
BEGIN_PACKET_MAP(CSOC_Client, CSOCClient)
PACKET_MAP_ENTRY(CSOC_Client, C_OrderAppl, OnOrderAppl)
PACKET_MAP_ENTRY(CSOC_Client, C_ErrorStartGame, OnErrorStartGame)
PACKET_MAP_ENTRY(CSOC_Client, C_ReadyStartGame, OnReadyStartGame)
PACKET_MAP_ENTRY(CSOC_Client, C_BOTS, OnBOTS)
PACKET_MAP_ENTRY(CSOC_Client, C_SetMechs, OnSetMechs)
PACKET_MAP_ENTRY(CSOC_Client, C_DoLaunch, OnDoLaunch)
#if !defined(CTCL_LAUNCHER)
PACKET_MAP_ENTRY(CSOC_Client, C_SendFile, OnSendFile)
PACKET_MAP_ENTRY(CSOC_Client, C_InviteCOOP, OnInviteCOOP)
#endif // !defined(CTCL_LAUNCHER)
END_PACKET_MAP(CSOC_Client)
#if defined(CTCL_LAUNCHER)
BEGIN_PACKET_MAP(CSOC_Launcher, CSOC_Client)
PACKET_MAP_ENTRY(CSOC_Launcher, C_GameInfo, OnGameInfo)
PACKET_MAP_ENTRY(CSOC_Launcher, C_OrderAppl, OnOrderAppl)
END_PACKET_MAP(CSOC_Launcher)
#else // !defined(CTCL_LAUNCHER)
BEGIN_PACKET_MAP(CSOC_Game, CSOC_Client)
END_PACKET_MAP(CSOC_Game)
BEGIN_PACKET_MAP(CSOC_CameraShip, CSOC_Client)
END_PACKET_MAP(CSOC_CameraShip)
#endif // defined(CTCL_LAUNCHER)
#if !(defined(CTCLS_EXPORTS) || defined(CTCL_LAUNCHER))
void LoadAux1Data();
#endif // !(defined(CTCLS_EXPORTS) || defined(CTCL_LAUNCHER))
#if !(defined(CTCLS_EXPORTS) || defined(CTCL_LAUNCHER))
void LoadAux1Data()
{
extern char aux1_messages[14 + 2][60];
extern char aux1_sounds[14 + 2][60];
char sz[4 + 60 + 10/*safety*/];
char szName[64];
char* psz = &sz[4];
for(int i = 1; i <= 7; i++) {
sprintf(szName, "%d", i);
sprintf(sz, "%d - ", i);
GetPrivateProfileString(SECT_AUX1TEAM, szName, "", psz, 60 - 4, PROF_INI);
if (psz[0]) {
strcpy(&aux1_messages[i - 1][0], sz);
}
GetPrivateProfileString(SECT_AUX1FFA, szName, "", psz, 60 - 4, PROF_INI);
if (psz[0]) {
strcpy(&aux1_messages[i - 1 + 7][0], sz);
}
if (i <= 2) { // misc
GetPrivateProfileString(SECT_AUX1MISC, szName, "", psz, 60 - 4, PROF_INI);
if (sz[0]) {
strcpy(&aux1_messages[i - 1 + 14][0], sz);
}
}
GetPrivateProfileString(SECT_SND1TEAM, szName, "", sz, 60, PROF_INI);
if (sz[0]) {
strcat(sz, "{handle}");
strcpy(&aux1_sounds[i - 1][0], sz);
}
GetPrivateProfileString(SECT_SND1FFA, szName, "", sz, 60, PROF_INI);
if (sz[0]) {
strcat(sz, "{handle}");
strcpy(&aux1_sounds[i - 1 + 7][0], sz);
}
if (i <= 2) { // misc
GetPrivateProfileString(SECT_SND1MISC, szName, "", sz, 60, PROF_INI);
if (sz[0]) {
strcat(sz, "{handle}");
strcpy(&aux1_sounds[i - 1 + 14][0], sz);
}
}
}
}
#endif // !(defined(CTCLS_EXPORTS) || defined(CTCL_LAUNCHER))
bool _stdcall RunExec(const CStr& strExec)
{
if (strExec.GetLength() > 0) {
CStr strDir;
int nStart = 0, nLen;
const char* pcszExec = strExec.String();
if (*pcszExec == '"') {
nStart++;
nLen = strExec.Find('"');
if (nLen != -1) {
nLen--;
}
} else {
nLen = strExec.Find(' ');
}
strDir.Assign(&pcszExec[nStart], nLen);
strDir.AsDirectory(TRUE);
char szBuf[512];
strcpy(szBuf, strExec.String());
STARTUPINFO si;
memset(&si, 0, sizeof(si));
si.cb = sizeof(si);
si.dwX = si.dwY = si.dwXSize = si.dwYSize = CW_USEDEFAULT;
PROCESS_INFORMATION pi;
return !!CreateProcess(NULL, szBuf, NULL, NULL, FALSE, CREATE_DEFAULT_ERROR_MODE | CREATE_NEW_PROCESS_GROUP | HIGH_PRIORITY_CLASS, NULL, strDir.String(), &si, &pi);
}
return false;
}
int GetCTCLTypePort(int nCTCLType)
{
switch(nCTCLType) {
case _ECTCL_Launcher:
return PORT_Launcher;
case _ECTCL_Game:
return PORT_Game;
case _ECTCL_CameraShip:
return PORT_CameraShip;
default:
ASSERT(FALSE);
return 0;
}
}
CSOCClient* CreateSOCClient(const CSOCListen& SOCListen, DWORD dwCSCParam1, DWORD dwCSCParam2)
{
&dwCSCParam1, &dwCSCParam2;
switch(dwCSCParam1) {
#if defined(CTCL_LAUNCHER)
case _ECTCL_Launcher:
return new CSOC_Launcher();
#else // !defined(CTCL_LAUNCHER)
case _ECTCL_Game:
return new CSOC_Game();
case _ECTCL_CameraShip:
return new CSOC_CameraShip();
#endif // defined(CTCL_LAUNCHER)
default:
ASSERT(FALSE);
return NULL;
}
}
#if !defined(CTCLS_EXPORTS)
CInviteCOOP::CInviteCOOP()
{
m_pParent = NULL;
Clear();
}
void CInviteCOOP::Clear()
{
m_nTimeInvite = 0;
m_nResult = 0;
m_nResultAccepted = 0;
memset(&m_guidGameData, 0, sizeof(m_guidGameData));
}
#endif // !defined(CTCLS_EXPORTS)
CSOC_Server::CSOC_Server(CTeslaInfo& TI)
: m_pTI(&TI)
{
m_dwLastGameInfo = 0;
m_nGameReturn = _EGR_NotConnected;
}
CSOC_Server::~CSOC_Server()
{
}
void CSOC_Server::OnConnect()
{
m_nGameReturn = _EGR_Connected;
}
BOOL CSOC_Server::CheckLastGameInfo()
{
DWORD dwTicks = GetTickCount();
if (m_dwLastGameInfo) {
if ((m_dwLastGameInfo + TCKS_GameInfo) <= dwTicks) {
m_dwLastGameInfo = dwTicks;
return TRUE;
}
} else {
m_dwLastGameInfo = dwTicks - TCKS_GameInfo + (rand() % TCKS_GameInfo);
}
return FALSE;
}
void CSOC_Server::OnGameReturn()
{
Disassemble("n", &m_nGameReturn);
}
#if !defined(CTCL_LAUNCHER)
void CSOC_Server::OnSendFile()
{
BYTE bCode;
if (Disassemble("B", &bCode)) {
ASSERT((bCode == 0) || (bCode == 3));
// 받아가시오 from Game to console...
SYSTEMTIME* pSysTime;
WORD wSysTimeSize;
GUID* pGUID;
WORD wSize;
int nType;
DWORD dwTickDelay;
if (Disassemble("xxnD", &pSysTime, &wSysTimeSize, &pGUID, &wSize, &nType, &dwTickDelay)) {
if (pSysTime && (wSysTimeSize == sizeof(SYSTEMTIME)) && pGUID && (wSize == sizeof(GUID))) {
CSendFile* pSF;
pSF = g_pCTCLManager->m_SFM_Done.Find(*pGUID, nType);
if (!pSF) {
// not already processed...
pSF = g_pCTCLManager->m_SFM_Recv.Find(*pGUID, nType);
if (pSF) {
if (bCode == 3) {
// 미션리뷰 서버가 mission review 받았다는 것을 받았느냐?
pSF->m_bProcessed = true;
g_pCTCLManager->m_SFM_Recv.Cut(pSF);
g_pCTCLManager->m_SFM_Done.AddTail(pSF);
}
} else {
// not already receieved...
pSF = new CSendFile(*pSysTime, *pGUID, nType);
pSF->m_strHost.Assign(m_pTI->m_strHost);
pSF->m_dwTickDelay = dwTickDelay;
g_pCTCLManager->m_SFM_Recv.AddTail(pSF);
}
}
if (bCode == 0)
DoSendX("BBxxnD", C_SendFile, 1, pSysTime, wSysTimeSize, pGUID, wSize, nType, 0);
}
}
}
}
void CSOC_Server::OnInviteCOOP()
{
int nTimeInvite;
GUID* pGUID;
WORD wGUID;
int nResult;
if (Disassemble("nxn", &nTimeInvite, &pGUID, &wGUID, &nResult)) {
if (pGUID && (wGUID == sizeof(GUID))) {
CInviteCOOP& COOP = m_pTI->m_COOP;
if ((COOP.m_nTimeInvite == nTimeInvite) && (memcmp(&COOP.m_guidGameData, pGUID, sizeof(GUID)) == 0)) {
DoSendX("Bnxn", S_InviteCOOP, nTimeInvite, pGUID, wGUID, -1); // result accepted...
COOP.m_nResult = nResult;
} else {
DoSendX("Bnxn", S_InviteCOOP, nTimeInvite, pGUID, wGUID, -2); // forget result... I don't know...
}
}
}
}
#endif // !defined(CTCL_LAUNCHER)
CSOC_2Launcher::CSOC_2Launcher(CTeslaInfo& TI)
: CSOC_Server(TI), m_bMissionReview(FALSE)
{
}
CSOC_2Launcher::~CSOC_2Launcher()
{
}
void CSOC_2Launcher::OnConnect()
{
CSOC_Server::OnConnect();
DoSendX("B", C_GameInfo);
}
void CSOC_2Launcher::CheckConnection()
{
#if !defined(CTCLS_EXPORTS) && !defined(CTCL_LAUNCHER)
if (g_bCOOP) {
m_pTI->CheckConnection();
} else {
#endif // !defined(CTCLS_EXPORTS) && !defined(CTCL_LAUNCHER)
if (/*!m_bMissionReview && */!IsValid()) {
g_pCTCLManager->DoConnect(this);
} else {
if (GetConnectionState() == +1) {
if (CheckLastGameInfo()) {
DoSendX("B", C_GameInfo);
}
m_pTI->CheckConnection();
}
}
#if !defined(CTCLS_EXPORTS) && !defined(CTCL_LAUNCHER)
}
#endif // !defined(CTCLS_EXPORTS) && !defined(CTCL_LAUNCHER)
}
void CSOC_2Launcher::OnGameInfo()
{
BYTE bApplType;
BYTE bApplState;
BYTE bGameState;
int nGameTime;
BYTE bGameIsServer;
if (Disassemble("BBBDB", &bApplType, &bApplState, &bGameState, &nGameTime, &bGameIsServer)) {
m_pTI->m_nApplType = bApplType;
m_pTI->m_nApplState = bApplState;
m_pTI->m_nGameState = bGameState;
m_pTI->m_nGameTime = nGameTime;
m_pTI->m_nGameIsServer = bGameIsServer;
}
}
CSOC_2Game::CSOC_2Game(CTeslaInfo& TI)
: CSOC_Server(TI)
{
SetTarget(TI.m_ulAddr);
SetPort(PORT_Game);
SetSOCPP((CSOC **)&TI.m_p2Game);
}
CSOC_2Game::~CSOC_2Game()
{
}
CSOC_2CameraShip::CSOC_2CameraShip(CTeslaInfo& TI)
: CSOC_Server(TI)
{
SetTarget(TI.m_ulAddr);
SetPort(PORT_CameraShip);
SetSOCPP((CSOC **)&TI.m_p2CameraShip);
}
CSOC_2CameraShip::~CSOC_2CameraShip()
{
}
CSOC_Client::CSOC_Client()
{
}
CSOC_Client::~CSOC_Client()
{
if (g_InviteCOOP.m_pParent == this) {
g_InviteCOOP.m_pParent = NULL;
//?g_InviteCOOP.Clear();
}
}
void CSOC_Client::OnOrderAppl()
{
BYTE bOrder, bCameraShip;
int nParam;
if (Disassemble("BDB", &bOrder, &nParam, &bCameraShip)) {
switch(bOrder) {
case _CTCL_Order_Terminate: // terminate
CTCL_DoTerminateAppl();
break;
case _CTCL_Order_EndMission: // End Mission
CTCL_DoEndMission();
break;
}
}
}
#if defined(CTCL_LAUNCHER)
CSOC_Launcher::CSOC_Launcher()
{
}
CSOC_Launcher::~CSOC_Launcher()
{
}
void CSOC_Launcher::OnGameInfo()
{
int nApplType = CTCL_GetApplType();
int nApplState = CTCL_GetApplState();
int nGameState = CTCL_GetGameState();
int nGameTime = CTCL_GetGameTime();
int nGameIsServer = CTCL_GetGameIsServer();
DoSendX("BBBBDB", S_GameInfo, nApplType, nApplState, nGameState, nGameTime, nGameIsServer);
}
void CSOC_Launcher::OnOrderAppl()
{
BYTE bOrder, bCameraShip;
int nParam;
if (Disassemble("BDB", &bOrder, &nParam, &bCameraShip)) {
switch(bOrder) {
case _CTCL_Order_Launch: // Launch
if ((0 < nParam) && (nParam <= _EAT_MAX)) {
nParam--;
const CStr& strExec = g_pCTCLManager->m_aCmds[nParam][bCameraShip ? 1: 0];
if (strExec.GetLength() > 0) {
//WinExec(strExec, SW_SHOWNORMAL);
RunExec(strExec);
}
} else {
ASSERT(FALSE);
}
break;
case _CTCL_Order_Shutdown:
case _CTCL_Order_Reboot:
{
HANDLE hToken;
TOKEN_PRIVILEGES TokenPrivileges;
int nErr = 0;
if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) {
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME/*SE_REMOTE_SHUTDOWN_NAME*/, &(TokenPrivileges.Privileges[0].Luid));
TokenPrivileges.PrivilegeCount = 1;
TokenPrivileges.Privileges[0].Attributes = 2;
AdjustTokenPrivileges(hToken, FALSE, &TokenPrivileges, sizeof(TOKEN_PRIVILEGES), NULL, NULL);
CloseHandle(hToken);
#if 1
if (!ExitWindowsEx((bOrder == _CTCL_Order_Shutdown) ? EWX_POWEROFF: EWX_REBOOT, 0)) {
GetLastError();
}
#else
if (!InitiateSystemShutdown(NULL, // name of computer to shut down
NULL, // address of message to display
10, // time to display dialog box
TRUE, // force applications with unsaved changes flag
FALSE))
{
GetLastError();
}
#endif
}
break;
}
case _CTCL_Order_Unload:
PostQuitMessage(0);
break;
}
}
}
#else // !defined(CTCL_LAUNCHER)
CSOC_Game::CSOC_Game()
{
}
CSOC_Game::~CSOC_Game()
{
}
CSOC_CameraShip::CSOC_CameraShip()
{
}
CSOC_CameraShip::~CSOC_CameraShip()
{
}
#endif // defined(CTCL_LAUNCHER)
void CSOC_Client::OnAccept()
{
// include launcher?
g_pCTCLManager->m_aNMP.Reset();
g_bIsServer = FALSE;
g_nPlayerInfos = 0;
g_nServer = -1;
g_nTeslas = 0;
g_nBOTs = 0;
g_szGameName[0] = '\0';
}
void CSOC_Client::OnErrorStartGame()
{
#if !defined(CTCLS_EXPORTS)
// to main menu....
//$$COOP
if (g_nMech4Comm) {
if (g_bIsServer) {
} else {
}
}
#endif // !defined(CTCLS_EXPORTS)
}
void CSOC_Client::OnReadyStartGame()
{
#if !defined(CTCLS_EXPORTS)
//$$COOP
BYTE bType;
BYTE* p;
WORD wLen;
BYTE bTeam;
const char* pcszName;
int nMechIndex;
short fileID;
WORD recordID;
const char* pcszMech;
int nTeamOrSkin;
int nDecal;
DWORD dwAddr;
BYTE bPrintOut;
BYTE bMissionReview;
BYTE* pGUID;
WORD wGuidSize;
SYSTEMTIME* pSysTime;
WORD wSysTime;
if (Disassemble("BnnxBsDWwsnnDBBxx", &bType, &g_nTeslas, &g_nBOTs, &p, &wLen, &bTeam, &pcszName,
&nMechIndex, &fileID, &recordID, &pcszMech, &nTeamOrSkin, &nDecal, &dwAddr,
&bPrintOut, &bMissionReview, &pGUID, &wGuidSize, &pSysTime, &wSysTime)) {
if (pGUID && (wGuidSize == sizeof(GUID)) && pSysTime && (wSysTime == sizeof(SYSTEMTIME))) {
g_nPlayerInfos = 1 + g_nBOTs + g_nTeslas;
g_bIsServer = (bType == 1) ? TRUE: FALSE;
const GUID& guid = *(const GUID*)pGUID;
sprintf(g_szGameName, "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
guid.Data1, guid.Data2, guid.Data3,
guid.Data4[0], guid.Data4[1],
guid.Data4[2], guid.Data4[3], guid.Data4[4], guid.Data4[5], guid.Data4[6], guid.Data4[7]);
g_pCTCLManager->SaveNMP(p, wLen);
SPlayerInfo& PI = g_aPlayerInfos[0];
PI.m_bBot = FALSE;
PI.m_bTeam = bTeam;
PI.m_nLevelOrTesla = 0; // never mind
strcpy(PI.m_szName, pcszName);
PI.m_uPlayerID = 0;
PI.m_nMechIndex = nMechIndex;
PI.m_fileID = fileID;
PI.m_recordID = recordID;
strcpy(PI.m_szMech, pcszMech);
PI.m_nTeamOrSkin = nTeamOrSkin;
PI.m_nDecal = nDecal;
PI.m_dwAddr = dwAddr;
g_nPrintOut = bPrintOut;
g_nMissionReview = bMissionReview;
g_guidGameDatas = *(GUID*)pGUID;
g_SysTime = *pSysTime;
CTCL_DoSendGameReturn(_EGR_PreparingStarted);
} else {
Drop();
}
}
#endif // !defined(CTCLS_EXPORTS)
}
void CSOC_Client::OnBOTS()
{
#if !defined(CTCLS_EXPORTS)
//$$COOP
ASSERT(g_bIsServer);
int i;
BYTE bBOT;
int nLevelOrTesla;
const char* pcszName;
int nMechIndex;
short fileID;
WORD recordID;
const char* pcszMech;
int nTeamOrSkin;
int nDecal;
for(i = 1; i < g_nPlayerInfos; i++) {
if (Disassemble("BnsDWwsnn", &bBOT, &nLevelOrTesla, &pcszName, &nMechIndex, &fileID, &recordID, &pcszMech, &nTeamOrSkin, &nDecal)) {
SPlayerInfo& PI = g_aPlayerInfos[i];
PI.m_bBot = bBOT ? TRUE: FALSE;
PI.m_nLevelOrTesla = nLevelOrTesla;
strcpy(PI.m_szName, pcszName);
PI.m_uPlayerID = 0;
PI.m_nMechIndex = nMechIndex;
PI.m_fileID = fileID;
PI.m_recordID = recordID;
strcpy(PI.m_szMech, pcszMech);
PI.m_nTeamOrSkin = nTeamOrSkin;
PI.m_nDecal = nDecal;
} else {
return;
}
}
g_nMech4Comm = 1;
#endif // !defined(CTCLS_EXPORTS)
}
void CSOC_Client::OnSetMechs()
{
ASSERT(!g_bIsServer);
CTCL_DoJoinGame();
}
void CSOC_Client::OnDoLaunch()
{
CTCL_StartGame(TRUE);
}
#if !defined(CTCL_LAUNCHER)
void CSOC_Client::OnSendFile()
{
BYTE bCode;
if (Disassemble("B", &bCode)) {
ASSERT((bCode == 1) || (bCode == 2));
// 받았오 from console to Game...
SYSTEMTIME* pSysTime;
WORD wSysTimeSize;
GUID* pGUID;
WORD wSize;
int nType;
if (Disassemble("xxn", &pSysTime, &wSysTimeSize, &pGUID, &wSize, &nType)) {
if (pSysTime && (wSysTimeSize == sizeof(SYSTEMTIME)) && pGUID && (wSize == sizeof(GUID))) {
CSendFile* pSF;
if (bCode == 1) {
pSF = g_pCTCLManager->m_SFM_Send.Find(*pGUID, nType);
if (pSF) {
// receieved by ...
g_pCTCLManager->m_SFM_Send.Cut(pSF);
delete pSF;
}
} else {
ASSERT(bCode == 2);
const char* pcszFile;
if (Disassemble("s", &pcszFile)) {
pSF = g_pCTCLManager->m_SFM_Done.Find(*pGUID, nType);
if (!pSF) {
pSF = g_pCTCLManager->m_SFM_Recv.Find(*pGUID, nType);
if (!pSF) {
CSendFile* pSF = new CSendFile(*pSysTime, *pGUID, nType);
pSF->m_strHost.Assign(pcszFile);
if ((nType == 1) && (g_nCTCLType == _ECTCL_CameraShip) && (*pSF->m_strHost.String() != '\0')) {
g_pCTCLManager->m_SFM_Recv.AddTail(pSF);
CTCL_SetGameState(_EGS_Preparing);
} else {
g_pCTCLManager->m_SFM_Done.AddTail(pSF);
}
}
}
DoSendX("BBxxnD", S_SendFile, 3, pSysTime, wSysTimeSize, pGUID, wSize, nType, 0);
}
}
}
}
}
}
void CSOC_Client::OnInviteCOOP()
{
int nTimeInvite;
GUID* pGUID;
WORD wGUID;
int nResult;
if (Disassemble("nxn", &nTimeInvite, &pGUID, &wGUID, &nResult)) {
if (pGUID && (wGUID == sizeof(GUID))) {
if (nResult == 0) { // requested...
if (nTimeInvite == -999) {
if (g_InviteCOOP.m_pParent == this) {
g_InviteCOOP.Clear();
g_InviteCOOP.m_pParent = NULL;
}
DoSendX("Bnxn", C_InviteCOOP, nTimeInvite, pGUID, wGUID, -1);
return;
/*} else if (g_nCoinCount < g_nCoinPerGame) {
g_InviteCOOP.Clear();
g_InviteCOOP.m_pParent = NULL;
DoSendX("Bnxn", C_InviteCOOP, nTimeInvite, pGUID, wGUID, 0);
return;*/
} else if (g_InviteCOOP.m_pParent) {
if (g_InviteCOOP.m_pParent == this) {
if ((g_InviteCOOP.m_nTimeInvite == nTimeInvite) && (memcmp(&g_InviteCOOP.m_guidGameData, pGUID, sizeof(GUID)) == 0)) {
if (g_InviteCOOP.m_nResult == 0) {
g_InviteCOOP.m_nResult = 1;
}
DoSendX("Bnxn", C_InviteCOOP, nTimeInvite, pGUID, wGUID, g_InviteCOOP.m_nResult);
} else {
goto as_new;
}
} else {
if (g_InviteCOOP.m_nResult == 2) {
if (g_InviteCOOP.m_nResultAccepted)
goto as_new;
}
}
} else {
as_new:
g_InviteCOOP.m_pParent = this;
g_InviteCOOP.m_nTimeInvite = nTimeInvite;
g_InviteCOOP.m_nResult = 0;
g_InviteCOOP.m_nResultAccepted = 0;
memcpy(&g_InviteCOOP.m_guidGameData, pGUID, sizeof(GUID));
const char* pcszTesla = "Unknown";
const CTeslas& aTIs = g_pCTCLManager->m_aTIs;
int i, nTesla = aTIs.GetSize();
for(i = 0; i < nTesla; i++)
{
CTeslaInfo& ti = aTIs.GetAt(i);
if (ti.m_ulAddr == m_Addr.GetTargetAddr()) {
pcszTesla = ti.String();
break;
}
}
strcpy(&g_szTeslaInviter[0], pcszTesla);
}
} else {
ASSERT((nResult == -1) || (nResult == -2));
if (g_InviteCOOP.m_pParent == this) {
if ((g_InviteCOOP.m_nTimeInvite == nTimeInvite) && (memcmp(&g_InviteCOOP.m_guidGameData, pGUID, sizeof(GUID)) == 0)) {
g_InviteCOOP.m_nResultAccepted = 1;
}
}
}
}
}
}
#endif // !defined(CTCL_LAUNCHER)
CTeslaInfo::CTeslaInfo()
: m_2Launcher(*this)
{
m_bCameraShip = FALSE;
m_ulAddr = INADDR_ANY;
m_2Launcher.SetAutoDelete(FALSE);
m_p2Game = NULL;
m_p2CameraShip = NULL;
}
void CTeslaInfo::SetTeslaInfo()
{
m_2Launcher.m_pTI = this;
#if !defined(CTCL_LAUNCHER)
if (g_bCOOP) {
const char* pcszHost = m_strHost.String();
ASSERT((pcszHost[0] == '\\') && (pcszHost[1] == '\\'));
CSockAddr addr(0, &pcszHost[2]);
u_long ulAddr = addr.GetTargetAddr();
if ((ulAddr != INADDR_NONE) && (ulAddr != INADDR_ANY) && (ulAddr != INADDR_LOOPBACK)) {
m_ulAddr = ulAddr;
}
}
#endif // !defined(CTCL_LAUNCHER)
}
void CTeslaInfo::CheckConnection()
{
#if !defined(CTCLS_EXPORTS) && !defined(CTCL_LAUNCHER)
if (g_bCOOP || (m_nApplType != _EAT_None))
#else // !defined(CTCLS_EXPORTS) && !defined(CTCL_LAUNCHER)
if (m_nApplType != _EAT_None)
#endif // !defined(CTCLS_EXPORTS) && !defined(CTCL_LAUNCHER)
{
if (m_bCameraShip) {
if (m_p2CameraShip)
return;
m_p2CameraShip = new CSOC_2CameraShip(*this);
g_pCTCLManager->DoConnect(m_p2CameraShip);
} else {
if (m_p2Game)
return;
m_p2Game = new CSOC_2Game(*this);
g_pCTCLManager->DoConnect(m_p2Game);
}
}
}
CTeslaInfo& CTeslas::AddNew(int nAllocType)
{
if (nAllocType < 0) {
int nSize = GetSize();
if (nAllocType == -2) {
nAllocType = nSize;
} else {
ASSERT(nAllocType == -1);
int nStart = nSize - m_nCameraShips;
while(nStart < nSize) {
CTeslaInfo& ti = GetAt(nStart);
if (ti.m_2Launcher.m_bMissionReview)
break;
nStart++;
}
nAllocType = nStart;
}
}
return Ins(nAllocType);
}
CTeslaInfo& CTeslas::GetMissionReview() const
{
if (m_nCameraShips > 0) {
CTeslaInfo* pTI = &GetAt(GetSize() - m_nCameraShips);
CTeslaInfo* pTIEnd = &pTI[m_nCameraShips];
while(pTI < pTIEnd) {
if (pTI->m_2Launcher.m_bMissionReview) {
return *pTI;
}
pTI++;
}
//return pTIEnd[-1];
}
return *(CTeslaInfo*)NULL;
}
BOOL CTCL_API CTCL_Start(int nCTCLType)
{
ASSERT(g_nCTCLType == _ECTCL_None);
g_pCTCLManager = new CCTCLManager();
if (g_pCTCLManager) {
if (g_pCTCLManager->Start(nCTCLType)) {
return TRUE;
}
delete g_pCTCLManager;
g_pCTCLManager = NULL;
}
return FALSE;
}
void CTCL_API CTCL_Stop()
{
if (g_pCTCLManager) {
g_pCTCLManager->Stop();
delete g_pCTCLManager;
g_pCTCLManager = NULL;
}
}
void CTCL_API CTCL_Run()
{
if (g_pCTCLManager) {
g_pCTCLManager->Run();
}
}
#if !defined(CTCLS_EXPORTS)
#if !defined(CTCL_LAUNCHER)
CSendFile::CSendFile(const SYSTEMTIME& SysTime, const GUID& guid, int nType)
: m_SysTime(SysTime), m_guid(guid), m_nType(nType), m_dwLast(0), m_bProcessed(false), m_dwTickCreated(GetTickCount()), m_dwTickDelay(0)
{
extern int g_nSecsMissionReplay;
extern int g_nSecsMissionReport;
if (m_nType == 1) { // mission replay file...
m_dwTickDelay = g_nSecsMissionReplay * 1000;
}
}
void CSendFile::Check()
{
CSOC& SOC = *g_pCTCLManager->FindSOC(0);
if (SOC.GetConnectionState() == 1) {
DWORD dw = GetTickCount();
if ((m_dwLast == 0) || ((m_dwLast + 500) < dw)) {
m_dwLast = dw;
DWORD dwTickDelay = m_dwTickDelay;
DWORD dwElapsed = GetTickCount() - m_dwTickCreated;
if (dwElapsed > dwTickDelay)
dwTickDelay = 0;
else
dwTickDelay -= dwElapsed;
SOC.DoSendX("BBxxnD", S_SendFile, 0, &m_SysTime, sizeof(m_SysTime), &m_guid, sizeof(m_guid), m_nType, dwTickDelay);
}
}
}
CSendFileManager::CSendFileManager()
{
}
CSendFile* CSendFileManager::Find(const GUID& guid, int nType) const
{
CSendFile* pSF = GetHead();
while(pSF) {
if ((memcmp(&pSF->m_guid, &guid, sizeof(guid)) == 0) && (pSF->m_nType == nType))
return pSF;
pSF = pSF->m_pNext;
}
return pSF;
}
#endif // !defined(CTCL_LAUNCHER)
#endif // !defined(CTCLS_EXPORTS)
BOOL CCTCLManager::Start(int nCTCLType)
{
if (Init()) {
g_nCTCLType = nCTCLType;
#if !(defined(CTCLS_EXPORTS) || defined(CTCL_LAUNCHER))
if ((nCTCLType == _ECTCL_Game) || (nCTCLType == _ECTCL_CameraShip)) {
LoadAux1Data();
}
#endif // !(defined(CTCLS_EXPORTS) || defined(CTCL_LAUNCHER))
CSockAddr addrHost(0, GetHostAddress());
#if !defined(CTCL_LAUNCHER)
strcpy(&g_szTeslaName[0], addrHost.GetTarget());
//g_szTeslaAddr[0] = '\x01';
strcpy(&g_szTeslaAddr[0], addrHost.GetTarget());
g_dwTeslaAddr = addrHost.GetTargetAddr();
#endif // !defined(CTCL_LAUNCHER)
char sz[1024];
char szName[256];
if (CTCL_IsConsoleOrCOOP()) {
// Load TeslaInfos...
bool bMissionReviewFound = false;
sz[0] = '\0';
GetPrivateProfileString(SECT_TESLAS, NULL, "", sz, sizeof(sz), PROF_INI);
const char* pcsz = &sz[0];
int nTIs = 0;
while(*pcsz)
{
char c = pcsz[0];
BOOL bCameraShip;
if ((c == '#') || (c == '*')) {
pcsz++;
bCameraShip = TRUE;
} else {
bCameraShip = FALSE;
}
CSockAddr addr(0, pcsz);
u_long ulAddr = addr.GetTargetAddr();
int i, n = m_aTIs.GetSize();
bool bOK = false;
if ((ulAddr != INADDR_NONE) && (ulAddr != INADDR_ANY) && (ulAddr != INADDR_LOOPBACK)) {
for(i = 0; i < n; i++) {
const CTeslaInfo& TI = m_aTIs.GetAt(i);
if (TI.m_ulAddr == ulAddr)
break;
}
if (i == n) {
bOK = true;
}
}
if (bOK) {
GetPrivateProfileString(SECT_TESLAS, bCameraShip ? &pcsz[-1]: pcsz, "", szName, sizeof(szName), PROF_INI);
char* pComma = strchr(szName,',');
if (pComma) {
*pComma++ = '\0';
CStr strName(szName), strHost(pComma);
strName.TrimAll();
strHost.TrimAll();
if ((strName.GetLength() > 0) && (strHost.GetLength() > 0)) {
BOOL bAdd = FALSE;
if (addrHost.GetTargetAddr() == ulAddr) {
strcpy(&g_szTeslaName[0], strName);
} else {
if (bCameraShip) {
if (m_aTIs.m_nCameraShips < MAX_CAMERAS)
bAdd = TRUE;
} else {
if (nTIs < MAX_TESLAS)
bAdd = TRUE;
}
}
if (bAdd) {
int nAllocType;
if (bCameraShip) {
if (bMissionReviewFound || (pcsz[-1] == '*'))
nAllocType = -2;
else
nAllocType = -1;
} else {
nAllocType = nTIs;
}
CTeslaInfo& TI = m_aTIs.AddNew(nAllocType);
TI.Assign(strName);
TI.m_bCameraShip = bCameraShip;
TI.m_strHost.Assign("\\\\");
TI.m_strHost += strHost;
TI.m_ulAddr = ulAddr;
TI.m_2Launcher.SetTarget(ulAddr);
TI.m_2Launcher.SetPort(PORT_Launcher);
if (bCameraShip) {
m_aTIs.m_nCameraShips++;
if (!bMissionReviewFound && (nAllocType == -2)) {
TI.m_2Launcher.m_bMissionReview = TRUE;
bMissionReviewFound = true;
}
} else {
nTIs++;
}
}
}
}
}
pcsz += strlen(pcsz) + 1;
}
for(int i = 0; i < m_aTIs.GetSize(); i++) {
m_aTIs.GetAt(i).SetTeslaInfo();
}
if (
#if !defined(CTCL_LAUNCHER)
!g_bCOOP &&
#endif // !defined(CTCL_LAUNCHER)
(nTIs <= 0) && (m_aTIs.m_nCameraShips <= 0)) {
Exit();
g_nCTCLType = _ECTCL_None;
MessageBox(NULL, "no valid tesla infos!!!", "ctcl.ini error", MB_OK);
return FALSE;
}
} else {
#ifdef CTCL_LAUNCHER
if (nCTCLType == _ECTCL_Launcher) {
for(int i = 1; i <= _EAT_MAX; i++) {
sprintf(szName, "%d", i); // game
GetPrivateProfileString(SECT_GAMES, szName, "", sz, sizeof(sz), PROF_INI);
CStr& str1 = m_aCmds[i - 1][0];
str1.Assign(sz);
str1.TrimAll();
sprintf(szName, "#%d", i); // camera ship
GetPrivateProfileString(SECT_GAMES, szName, "", sz, sizeof(sz), PROF_INI);
CStr& str2 = m_aCmds[i - 1][1];
str2.Assign(sz);
str2.TrimAll();
}
}
#endif // CTCL_LAUNCHER
}
if (nCTCLType != _ECTCL_Console) {
if (!DoListen(GetCTCLTypePort(nCTCLType), CreateSOCClient, nCTCLType, 0)) {
Exit();
g_nCTCLType = _ECTCL_None;
return FALSE;
}
}
return TRUE;
}
return FALSE;
}
void CCTCLManager::Stop()
{
ASSERT(g_nCTCLType != _ECTCL_None);
Exit();
if (g_nCTCLType == _ECTCL_Console) {
m_aTIs.Reset();
}
g_nCTCLType = _ECTCL_None;
}
void CCTCLManager::Run()
{
static BOOL s_bRunning = FALSE;
int i, nSize;
if (!s_bRunning) {
if (CTCL_IsConsoleX()) {
CTCL_SetApplState(_EAS_Launched);
CTCL_SetGameState(_EGS_Idle);
}
s_bRunning = TRUE;
}
if (CTCL_IsConsoleOrCOOP()) {
static DWORD s_dwLast = 0;
if ((s_dwLast == 0) || ((s_dwLast + 500) <= GetTickCount())) {
nSize = m_aTIs.GetSize();
for(i = 0; i < nSize; i++) {
m_aTIs.GetAt(i).m_2Launcher.CheckConnection();
}
s_dwLast = GetTickCount();
}
}
if (g_nCTCLType == _ECTCL_Console) {
#if !defined(CTCL_LAUNCHER)
bool bPrinted = false, bMissionReplay = false;
CSendFile* pSF = m_SFM_Recv.GetHead();
while(pSF && !(bPrinted && bMissionReplay)) {
CSendFile* pSFNext = pSF->m_pNext;
DWORD dw = GetTickCount();
if ((pSF->m_dwLast == 0) || ((pSF->m_dwLast + 500) < dw)) {
pSF->m_dwLast = dw;
MW4PRINT_COPYDATASTRUCT cd;
if (pSF->m_nType == 0) {
if (!bPrinted) {
HWND hWndPrint = FindWindow(NULL, "mw4print");
if (hWndPrint) {
GetFileName4GUID(cd.m_szFile, pSF->m_strHost, g_pcszGameDataSavePath, g_pcszGameDataExtPR, pSF->m_guid);
cd.dwData = MW4PRINT_COPYDATA_META;
cd.cbData = sizeof(cd) - sizeof(COPYDATASTRUCT);
cd.lpData = &cd.m_GUID;
cd.m_GUID = GUID_NULL;
if (::SendMessage(hWndPrint, WM_COPYDATA, (WPARAM)hWindow, (LPARAM)&cd) == 1) {
pSF->m_bProcessed = true;
m_SFM_Recv.Cut(pSF);
m_SFM_Done.AddTail(pSF);
}
}
bPrinted = true;
}
} else if (pSF->m_nType == 1) {
if (!bMissionReplay) {
DWORD dwTickDelay = GetTickCount() - pSF->m_dwTickCreated;
if (pSF->m_dwTickDelay <= dwTickDelay) {
GetFileName4GUID(cd.m_szFile, pSF->m_strHost, g_pcszGameDataSavePath, g_pcszGameDataExtMR, pSF->m_guid);
CTeslaInfo& TI = m_aTIs.GetMissionReview();
if (&TI) {
ASSERT(TI.m_bCameraShip && TI.m_2Launcher.m_bMissionReview);
CSOC_Server& SOC = TI.GetGameSOC();
if (SOC.GetConnectionState() == +1) {
SOC.DoSendX("BBxxnsD", S_SendFile, 2, &pSF->m_SysTime, sizeof(pSF->m_SysTime), &pSF->m_guid, sizeof(pSF->m_guid), pSF->m_nType, cd.m_szFile, 0);
}
}
}
bMissionReplay = true;
}
} else {
if (pSF->m_nType == 2) {
extern void _stdcall CTCL_SaveLogGameEnd(const SYSTEMTIME& SysTime, const GUID& guid, const char* pcszHost);
CTCL_SaveLogGameEnd(pSF->m_SysTime, pSF->m_guid, pSF->m_strHost.String());
} else {
// error...
}
pSF->m_bProcessed = true;
m_SFM_Recv.Cut(pSF);
m_SFM_Done.AddTail(pSF);
}
}
pSF = pSFNext;
}
#endif // !defined(CTCL_LAUNCHER)
} else {
/*
클라이언트나 서버의 경우 실행되는 코드이다.
*있을수 있는 상태들
서버/클라이언트가 결정되기전.. 명령 대기상태
(종료/서버시작/클라이언트 시작등의 명령이 올수 있다.)
서버로 실행되어 서버 메크 설정에 대한 데이타를 기다리는 상태
(CreateSession가 실행된 상태이다.)
서버로 실행되어 Bot들에 대한 정보를 기다리는 상태
(클라이언트의 참여는 클라이언트와 서버간에 자동으로 이루어진다.)
서버로 실행되어 Launch를 기다리는 상태
==>클라이언트는 실행즉시 데이타들이 전달되므로 대기상태가 없다.
==>각각의 상태를 정의하고 각 상태에 맞는 처리를 해주면 된다.
switch(state){
}
*/
#if !defined(CTCL_LAUNCHER)
CSendFile* pSF;
pSF = m_SFM_Send.GetHead();
while(pSF) {
pSF->Check();
pSF = pSF->m_pNext;
}
if (g_nMech4Comm == 0) {
pSF = m_SFM_Recv.GetHead();
if (pSF) {
extern bool _stdcall CTCL_DoMissionReplay(const char* pcszFile);
if (CTCL_DoMissionReplay(pSF->m_strHost)) {
m_SFM_Recv.Cut(pSF);
m_SFM_Done.AddTail(pSF);
}
}
}
#endif // !defined(CTCL_LAUNCHER)
}
#if !defined(CTCLS_EXPORTS)
// Mech4 only...
if (g_nMech4Comm) {
DoMech4Comm();
}
#endif // !defined(CTCLS_EXPORTS)
SingleStep();
}
#if !defined(CTCLS_EXPORTS)
void CCTCLManager::DoMech4Comm()
{
//$$COOP
ASSERT(g_nMech4Comm);
if (CTCL_IsConsole()) {
int i, nMech4CommOld = g_nMech4Comm;
SPlayerInfo& SVR_PI = g_aPlayerInfos[g_nServer];
const CTeslaInfo& SVR = m_aTIs.GetAt(SVR_PI.m_nLevelOrTesla);
CSOC_Server& SOCGame = SVR.GetGameSOC();
for(i = 0; g_nMech4Comm && (i < g_nPlayerInfos); i++) {
SPlayerInfo& pi = g_aPlayerInfos[i];
if (!pi.m_bBot) {
CTeslaInfo& ti = m_aTIs.GetAt(pi.m_nLevelOrTesla);
CSOC_Server& soc = ti.GetGameSOC();
if (soc.GetConnectionState() == 1) {
if (g_nMech4Comm == 1) {
soc.m_nGameReturn = _EGR_NoError;
} else {
switch(soc.m_nGameReturn) {
case _EGR_Connected: //newly connected
case _EGR_ErrCreateSession:
case _EGR_ErrJoinSession:
g_nMech4Comm = 0;
break;
}
}
} else {
g_nMech4Comm = 0;
}
}
}
switch(g_nMech4Comm)
{
case 0: // all error goes to here!!!
if (nMech4CommOld != 1) {
for(i = 0; i < g_nPlayerInfos; i++) {
SPlayerInfo& pi = g_aPlayerInfos[i];
if (!pi.m_bBot) {
CTeslaInfo& ti = m_aTIs.GetAt(pi.m_nLevelOrTesla);
CSOC_Server& soc = ti.GetGameSOC();
if (soc.GetConnectionState() == 1) {
// error to main screen...
soc.DoSendCmdWOP(C_ErrorStartGame);
}
}
}
}
break;
case 1:
//서버/클라이언트로서 실행준비하도록 명령을 전달한다.
//또한 서버를 실행하는데 필요한 모든 파라미터도 함께 전달한다.
for(i = 0; i < g_nPlayerInfos; i++) {
SPlayerInfo& pi = g_aPlayerInfos[i];
if (!pi.m_bBot) {
CTeslaInfo& ti = m_aTIs.GetAt(pi.m_nLevelOrTesla);
CSOC_Server& soc = ti.GetGameSOC();
if (&soc) {
soc.DoSendX("BBnnxBsDWwsnnDBBxx", C_ReadyStartGame, (i == g_nServer) ? 1: 0, g_nTeslas, g_nPlayerInfos - g_nTeslas - 1, &m_aNMP.GetAt(0), m_aNMP.GetSize(),
pi.m_bTeam, pi.m_szName, pi.m_nMechIndex, pi.m_fileID, pi.m_recordID, pi.m_szMech, pi.m_nTeamOrSkin, pi.m_nDecal, SVR.m_ulAddr,
!!g_nPrintOut, !!g_nMissionReview, &g_guidGameDatas, sizeof(g_guidGameDatas), &g_SysTime, sizeof(g_SysTime));
}
}
}
g_nMech4Comm = 2;
break;
case 2:
for(i = 0; i < g_nPlayerInfos; i++) {
SPlayerInfo& pi = g_aPlayerInfos[i];
if (!pi.m_bBot) {
CTeslaInfo& ti = m_aTIs.GetAt(pi.m_nLevelOrTesla);
CSOC_Server& soc = ti.GetGameSOC();
if (soc.m_nGameReturn != _EGR_PreparingStarted) {
break;
}
}
}
if (i == g_nPlayerInfos) {
// Bot들에 대한 정보를 모두 한데 묶어서 보낸다.
CPacket pak(&SVR.GetGameSOC());
pak.Assemble("B", C_BOTS);
for(i = 0; i < g_nPlayerInfos; i++) {
if (i != g_nServer) { // 원래 Bot만 지금은 서버를 제외한 전부...
SPlayerInfo& pi = g_aPlayerInfos[i];
pak.Assemble("BnsDWwsnn", pi.m_bBot, pi.m_nLevelOrTesla, pi.m_szName, pi.m_nMechIndex, pi.m_fileID, pi.m_recordID, pi.m_szMech, pi.m_nTeamOrSkin, pi.m_nDecal);
}
}
SOCGame.DoSend(pak);
g_nMech4Comm = 4;
}
break;
case 4:
// 게임이 성공적으로 만들어지면 서버와 클라이언트들의 Mech에 대한 정보들을 Set한다...
if (SOCGame.m_nGameReturn == _EGR_OkCreateSession) {
for(i = 0; i < g_nPlayerInfos; i++) {
if (i != g_nServer) { // 서버는 이미 SetMech에 진입한 상태...
SPlayerInfo& pi = g_aPlayerInfos[i];
if (!pi.m_bBot) {
CTeslaInfo& ti = m_aTIs.GetAt(pi.m_nLevelOrTesla);
CSOC_Server& soc = ti.GetGameSOC();
soc.DoSendCmdWOP(C_SetMechs);
}
}
}
g_nMech4Comm = 6;
}
break;
case 6:
//모든 클라이언드들이 서버에 참여하기를 기다린다.<==이 응답은 서버로 부터 얻을 수 있다.
//참여가 모두 끝났으면, 서버로 하여금 게임을 Launch시키도록 한다.
if (SOCGame.m_nGameReturn == _EGR_OkLaunchReady) {
g_nMech4Comm = 9;
}
break;
case 9:
// wait...
break;
case 10:
SOCGame.DoSendX("B", C_DoLaunch);
g_nMech4Comm = 0;
break;
}
} else if (g_bIsServer) { // server
switch(g_nMech4Comm)
{
case -1:
g_nMech4Comm = +1;
break;
case -3:
g_nMech4Comm = -2;
break;
case -2:
CTCL_StartGame(TRUE);
break;
case 1:
CTCL_DoCreateGame();
break;
case 2: // wait SendRequestConnectionMessage
CTCL_CheckNetConnectedToServer();
break;
case 3:
CTCL_SetMissionParams();
break;
case 5:
CTCL_SetMechs();
break;
case 7:
CTCL_CheckClientReady();
break;
case 8:
CTCL_CheckServerReady();
break;
case 9:
// wait... load
break;
case 10:
// wait... C_DoLaunch
break;
case 11:
// wait... launch
break;
}
} else { // clients
switch(g_nMech4Comm)
{
case 1:
CTCL_CheckJoinGame();
break;
case 2: // wait SendRequestConnectionMessage
CTCL_CheckNetConnectedToServer();
break;
case 4:
CTCL_CheckMissionParams();
break;
case 5:
CTCL_SetMechs();
break;
case 7:
CTCL_CheckClientReady();
break;
}
}
}
void CCTCLManager::SaveNMP(const void* p, int nSize)
{
m_aNMP.SetSize(nSize);
BYTE* p2 = &m_aNMP.GetAt(0);
if (nSize > 0) {
memcpy(p2, p, nSize);
}
m_aNMP.FreeExtra();
}
void* CCTCLManager::LoadNMP(int& nSize)
{
//if (g_bIsServer) {
nSize = m_aNMP.GetSize();
if (nSize > 0) {
return &m_aNMP.GetAt(0);
}
//}
return NULL;
}
#if !defined(CTCL_LAUNCHER)
void CCTCLManager::SendFile(const SYSTEMTIME& SysTime, const GUID& guid, int nType)
{
CSendFile* pSF = new CSendFile(SysTime, guid, nType);
m_SFM_Send.AddTail(pSF);
pSF->Check();
}
bool CCTCLManager::DoReprintOrCheck(bool bRealPrint)
{
if (this) {
CSendFile* pSFFound = NULL;
CSendFile* pSF = m_SFM_Done.GetHead();
while(pSF) {
if (pSF->m_nType == 0) {
pSFFound = pSF;
if (!bRealPrint)
break;
}
pSF = pSF->m_pNext;
}
if (pSFFound) {
if (bRealPrint) {
pSF = pSFFound;
HWND hWndPrint = FindWindow(NULL, "mw4print");
if (hWndPrint) {
MW4PRINT_COPYDATASTRUCT cd;
GetFileName4GUID(cd.m_szFile, pSF->m_strHost, g_pcszGameDataSavePath, g_pcszGameDataExtPR, pSF->m_guid);
cd.dwData = MW4PRINT_COPYDATA_META;
cd.cbData = sizeof(cd) - sizeof(COPYDATASTRUCT);
cd.lpData = &cd.m_GUID;
cd.m_GUID = GUID_NULL;
if (::SendMessage(hWndPrint, WM_COPYDATA, (WPARAM)hWindow, (LPARAM)&cd) == 1) {
return true;
}
}
return false;
} else {
return true;
}
}
}
return false;
}
bool CCTCLManager::IsPendingMissionReplayRequest() const
{
CSendFile* pSF = m_SFM_Recv.GetHead();
while(pSF) {
if (pSF->m_nType == 1)
return true;
pSF = pSF->m_pNext;
}
return false;
}
#endif // !defined(CTCL_LAUNCHER)
#endif // !defined(CTCLS_EXPORTS)
int CTCL_API CTCL_GetType()
{
return g_nCTCLType;
}
BOOL CTCL_API CTCL_IsNone()
{
return g_nCTCLType == _ECTCL_None;
}
BOOL CTCL_API CTCL_IsConsole()
{
return g_nCTCLType == _ECTCL_Console;
}
bool CTCL_API CTCL_IsCOOP()
{
#if defined(CTCL_LAUNCHER)
return false;
#else // !defined(CTCL_LAUNCHER)
return g_bCOOP;
#endif // defined(CTCL_LAUNCHER)
}
BOOL CTCL_API CTCL_IsConsoleOrCOOP()
{
#if defined(CTCL_LAUNCHER)
return g_nCTCLType == _ECTCL_Console;
#else // !defined(CTCL_LAUNCHER)
return (g_nCTCLType == _ECTCL_Console) || g_bCOOP;
#endif // defined(CTCL_LAUNCHER)
}
BOOL CTCL_API CTCL_IsConsoleX()
{
return (g_nCTCLType == _ECTCL_Game) || (g_nCTCLType == _ECTCL_CameraShip);
}
int CTCL_API CTCL_GetTeslaCountAll()
{
ASSERT(CTCL_IsConsoleOrCOOP());
if (g_pCTCLManager)
return g_pCTCLManager->m_aTIs.GetSize();
return 0;
}
int CTCL_API CTCL_GetTeslaCount()
{
ASSERT(CTCL_IsConsoleOrCOOP());
if (g_pCTCLManager)
return g_pCTCLManager->m_aTIs.GetSize() - g_pCTCLManager->m_aTIs.m_nCameraShips;
return 0;
}
#if !defined(CTCL_LAUNCHER)
TESLA_HANDLE CTCL_API CTCL_GetTeslaInfo(int nIndex, STeslaInfo& TI)
{
ASSERT(CTCL_IsConsole());
if ((0 <= nIndex) && (nIndex < g_pCTCLManager->m_aTIs.GetSize())) {
CTeslaInfo& ti = g_pCTCLManager->m_aTIs.GetAt(nIndex);
TI.m_bCameraShip = ti.m_bCameraShip;
TI.m_ulAddr = ti.m_ulAddr;
TI.m_pcsz = ti;
TI.m_nLauncherConnection = ti.m_2Launcher.GetConnectionState();
TI.m_nConnection2 = ti.GetGameSOC().GetConnectionState();
TI.m_nApplType = ti.m_nApplType;
TI.m_nApplState = ti.m_nApplState;
TI.m_nGameState = ti.m_nGameState;
TI.m_nGameTime = ti.m_nGameTime;
TI.m_nGameIsServer = ti.m_nGameIsServer;
if (ti.m_2Launcher.m_bMissionReview) {
if (g_pCTCLManager->IsPendingMissionReplayRequest()) {
if ((ti.m_nApplType != _EAT_None) && (ti.m_nApplState == _EAS_Launched)) {
if (TI.m_nGameState == _EGS_Idle) {
TI.m_nGameState = _EGS_Preparing;
} else {
}
} else {
}
}
}
return (TESLA_HANDLE)&ti;
}
return (TESLA_HANDLE)NULL;
}
int CTCL_API CTCL_InviteCOOP(int nTimeInvite, int& nYes, int& nNo, int& nProcessings)
{
ASSERT(CTCL_IsConsoleOrCOOP());
int i, nTesla = CTCL_GetTeslaCountAll();
int nTotal = 0;
nYes = nNo = nProcessings = 0;
for(i = 0; i < nTesla; i++)
{
CTeslaInfo& ti = g_pCTCLManager->m_aTIs.GetAt(i);
CSOC_Server& SOC = ti.GetGameSOC();
CInviteCOOP& COOP = ti.m_COOP;
if (SOC.GetConnectionState() == +1) {
if (nTimeInvite == -999) {
if ((COOP.m_nTimeInvite != -999) || (COOP.m_nResult != -1)) {
if (COOP.m_nTimeInvite != -999) {
COOP.Clear();
COOP.m_nTimeInvite = -999;
}
SOC.DoSendX("Bnxn", C_InviteCOOP, nTimeInvite, &COOP.m_guidGameData, sizeof(GUID), 0);
}
nTotal++;
} else if (nTimeInvite) {
bool bInvite = false;
if (nTimeInvite < 0) {
// invite cameraship : -1 1st-camera, -2 2nd camera...
if (ti.m_bCameraShip) {
if (nTimeInvite == -(i - CTCL_GetTeslaCount()+ 1)) {
bInvite = true;
}
}
} else {
// invite players
if (!ti.m_bCameraShip)
bInvite = true;
}
if (bInvite) {
if ((COOP.m_nTimeInvite == nTimeInvite) && (memcmp(&COOP.m_guidGameData, &g_guidGameDatas, sizeof(GUID)) == 0)) {
if ((COOP.m_nResult == 0) || (COOP.m_nResult == 1)) {
SOC.DoSendX("Bnxn", C_InviteCOOP, nTimeInvite, &COOP.m_guidGameData, sizeof(GUID), 0);
if (COOP.m_nResult == 1)
nProcessings++;
} else {
ASSERT((COOP.m_nResult == 2) || (COOP.m_nResult == 3));
if (COOP.m_nResult == 2)
nNo++;
else
nYes++;
}
} else {
COOP.Clear();
COOP.m_nTimeInvite = nTimeInvite;
//COOP.m_nResult = 0;
//COOP.m_nResultAccepted = 0;
memcpy(&COOP.m_guidGameData, &g_guidGameDatas, sizeof(GUID));
}
nTotal++;
}
} else {
COOP.Clear();
nTotal++;
}
} else {
COOP.Clear();
}
}
return nTotal; // nTesla;
}
#endif // !defined(CTCL_LAUNCHER)
const char* CTCL_API CTCL_GetTeslaName(int nIndex)
{
ASSERT(CTCL_IsConsole());
return g_pCTCLManager->m_aTIs.GetAt(nIndex).String();
}
int CTCL_API CTCL_OrderAppl(int nIndex, int nOrder, int nParam)
{
int nRet = 0;
if ((0 <= nIndex) && (nIndex < g_pCTCLManager->m_aTIs.GetSize())) {
CTeslaInfo& ti = g_pCTCLManager->m_aTIs.GetAt(nIndex);
if (100 <= nOrder) {
if (ti.m_2Launcher.GetConnectionState() == +1) {
ti.m_2Launcher.DoSendX("BBDB", C_OrderAppl, nOrder, nParam, ti.m_bCameraShip);
nRet = 1;
}
} else {
CSOC_Server& SOC = ti.GetGameSOC();
if (SOC.GetConnectionState() == +1) {
SOC.DoSendX("BBDB", C_OrderAppl, nOrder, nParam, ti.m_bCameraShip);
nRet = 1;
}
}
}
return nRet;
}
#if !defined(CTCLS_EXPORTS)
void CTCL_API CTCL_DoSendGameReturn(int nValue)
{
CSOC& SOC = *g_pCTCLManager->FindSOC(0);
if (SOC.GetConnectionState() == 1)
SOC.DoSendX("Bn", S_GameReturn, nValue);
}
void CTCL_API CTCL_SaveNMP(const void* p, int nSize)
{
g_pCTCLManager->SaveNMP(p, nSize);
}
void* CTCL_API CTCL_LoadNMP(int& nSize)
{
return g_pCTCLManager->LoadNMP(nSize);
}
#if !defined(CTCL_LAUNCHER)
void CTCL_API CTCL_SendFile(const SYSTEMTIME& SysTime, const GUID& guid, int nType)
{
g_pCTCLManager->SendFile(SysTime, guid, nType);
}
bool CTCL_API CTCL_DoReprintOrCheck(bool bRealPrint)
{
return g_pCTCLManager->DoReprintOrCheck(bRealPrint);
}
void CTCL_API CTCL_SetGameStateAsIdle()
{
CSendFile* pSF;
pSF = g_pCTCLManager->m_SFM_Recv.GetHead();
while(pSF) {
if (pSF->m_nType == 1) {
CTCL_SetGameState(_EGS_Preparing);
return;
}
pSF = pSF->m_pNext;
}
CTCL_SetGameState(_EGS_Idle);
}
#endif // !defined(CTCL_LAUNCHER)
#endif // !defined(CTCLS_EXPORTS)