mirror of
https://github.com/jummy0/sb2-decomp
synced 2025-03-14 20:23:30 +01:00
new #define to toggle old broken code
This commit is contained in:
parent
ad18be075b
commit
4b335e4710
@ -714,9 +714,15 @@ static BOOL DoInit(HINSTANCE hInstance, LPSTR lpCmdLine, int nCmdShow)
|
||||
|
||||
SetRect(&WindowRect, (sx - LXIMAGE) / 2, (sy - LYIMAGE) / 2,
|
||||
(sx + LXIMAGE) / 2, (sy + LYIMAGE) / 2);
|
||||
//AdjustWindowRect(&WindowRect, WS_POPUPWINDOW | WS_CAPTION, TRUE); // old faulty behavior
|
||||
//WindowRect.top += GetSystemMetrics(SM_CYCAPTION);
|
||||
AdjustWindowRect(&WindowRect, WS_POPUPWINDOW | WS_CAPTION, FALSE); // fixed behavior
|
||||
|
||||
#if _LEGACY
|
||||
// Old behavior is semantically incorrect.
|
||||
// The game window becomes too short on modern versions of Windows.
|
||||
AdjustWindowRect(&WindowRect, WS_POPUPWINDOW | WS_CAPTION, TRUE);
|
||||
WindowRect.top += GetSystemMetrics(SM_CYCAPTION);
|
||||
#else
|
||||
AdjustWindowRect(&WindowRect, WS_POPUPWINDOW | WS_CAPTION, FALSE);
|
||||
#endif
|
||||
|
||||
g_hWnd = CreateWindow
|
||||
(
|
||||
|
@ -16,10 +16,6 @@
|
||||
#include "ddutil.h"
|
||||
#include "misc.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
#define DIRECTDRAW_VERSION 0x0500
|
||||
|
||||
BOOL g_bDebug = TRUE;
|
||||
|
||||
void DDSetDebug(BOOL bDebug)
|
||||
|
@ -17,8 +17,9 @@
|
||||
#define _INTRO FALSE // TRUE si images d'introduction
|
||||
|
||||
// additional flags
|
||||
#define _CD FALSE // whether to require the game CD
|
||||
#define _BYE !_EGAMES // whether to show exit image (like _INTRO)
|
||||
#define _CD FALSE // if TRUE, require the game CD
|
||||
#define _BYE !_EGAMES // if TRUE, show exit image (like _INTRO)
|
||||
#define _LEGACY FALSE // if TRUE, keep broken/quirky legacy code
|
||||
|
||||
#define MAXGAMER 8
|
||||
|
||||
|
@ -5722,6 +5722,22 @@ BOOL CEvent::CopyMission(char *srcFileName, char *dstFileName)
|
||||
destFile = fopen(dstFileName, "wb");
|
||||
if (destFile)
|
||||
{
|
||||
|
||||
#if _LEGACY and defined(_IOERR)
|
||||
// original code relies on implementation-specific behavior.
|
||||
// incompatible with modern toolsets.
|
||||
do
|
||||
{
|
||||
num = fread(buffer, 1, 2560, srcFile);
|
||||
if (srcFile->_flag & _IOERR) break;
|
||||
if (num <= 0)
|
||||
{
|
||||
bOK = FALSE;
|
||||
break;
|
||||
}
|
||||
fwrite(buffer, 1, num, destFile);
|
||||
} while (!(destFile->_flag & _IOERR));
|
||||
#else
|
||||
do
|
||||
{
|
||||
num = fread(buffer, 1, 2560, srcFile);
|
||||
@ -5733,6 +5749,8 @@ BOOL CEvent::CopyMission(char *srcFileName, char *dstFileName)
|
||||
}
|
||||
fwrite(buffer, 1, num, destFile);
|
||||
} while (!ferror(destFile)); // *
|
||||
#endif // _LEGACY
|
||||
|
||||
}
|
||||
}
|
||||
if (srcFile) fclose(srcFile);
|
||||
@ -5740,11 +5758,7 @@ die:
|
||||
if (destFile) fclose(destFile);
|
||||
if (buffer) free(buffer);
|
||||
return bOK;
|
||||
|
||||
// *
|
||||
// original code relies on undefined behavior specific to older msvc :
|
||||
// if (srcFile->_flag & _IOERR)
|
||||
// while (!(destFile->_flag & _IOERR))
|
||||
|
||||
}
|
||||
|
||||
void CEvent::DrawMap()
|
||||
|
573
src/network.cpp
573
src/network.cpp
@ -10,209 +10,162 @@
|
||||
// a0f94abe-11c3-d111-be62-0040f6944838
|
||||
#define APP_GUID { 0xbe4af9a0, 0xc311, 0x11d1, { 0xbe, 0x62, 0x00, 0x40, 0xf6, 0x94, 0x48, 0x38 } };
|
||||
|
||||
CNetwork::CNetwork()
|
||||
{
|
||||
m_pDP = NULL;
|
||||
m_dpid = 0;
|
||||
m_bHost = FALSE;
|
||||
m_providers.nb = 0;
|
||||
m_providers.pList = NULL;
|
||||
m_sessions.nb = 0;
|
||||
m_sessions.pList = NULL;
|
||||
m_unknown.nb = 0;
|
||||
m_unknown.pList = NULL;
|
||||
}
|
||||
|
||||
CNetwork::~CNetwork()
|
||||
{
|
||||
FreeProviderList();
|
||||
FreeSessionList();
|
||||
FreeUnknownList();
|
||||
if (m_pDP) m_pDP->Release();
|
||||
}
|
||||
|
||||
static BOOL EnumProvidersCallback(LPGUID lpguidSP, LPSTR lpSPName,
|
||||
DWORD dwMajorVersion, DWORD dwMinorVersion, NamedGUIDList* lpContext)
|
||||
{
|
||||
if (lpContext->nb < MAXSESSION)
|
||||
extern "C" {
|
||||
CNetwork::CNetwork()
|
||||
{
|
||||
lpContext->pList[lpContext->nb]->guid = *lpguidSP;
|
||||
strcpy(lpContext->pList[lpContext->nb]->name, lpSPName);
|
||||
lpContext->nb++;
|
||||
m_pDP = NULL;
|
||||
m_dpid = 0;
|
||||
m_bHost = FALSE;
|
||||
m_providers.nb = 0;
|
||||
m_providers.pList = NULL;
|
||||
m_sessions.nb = 0;
|
||||
m_sessions.pList = NULL;
|
||||
m_unknown.nb = 0;
|
||||
m_unknown.pList = NULL;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL CNetwork::EnumProviders()
|
||||
{
|
||||
FreeProviderList();
|
||||
m_providers.nb = 0;
|
||||
m_providers.pList = (NamedGUID(*)[MAXSESSION]) malloc(MAXSESSION * sizeof(NamedGUID));
|
||||
|
||||
if (!m_providers.pList) return FALSE;
|
||||
#ifdef _UNICODE
|
||||
if (DirectPlayEnumerate((LPDPENUMDPCALLBACK)EnumProvidersCallback, &m_providers) != DP_OK)
|
||||
#else
|
||||
if (DirectPlayEnumerate((LPDPENUMDPCALLBACKA)EnumProvidersCallback, &m_providers) != DP_OK)
|
||||
#endif
|
||||
CNetwork::~CNetwork()
|
||||
{
|
||||
FreeProviderList();
|
||||
return FALSE;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
int CNetwork::GetNbProviders()
|
||||
{
|
||||
return m_providers.nb;
|
||||
}
|
||||
|
||||
char* CNetwork::GetProviderName(int index)
|
||||
{
|
||||
if (index >= m_providers.nb) return NULL;
|
||||
return m_providers.pList[index]->name;
|
||||
}
|
||||
|
||||
BOOL CNetwork::CreateProvider(int index)
|
||||
{
|
||||
LPDIRECTPLAY lpDP;
|
||||
BOOL bOK = FALSE;
|
||||
|
||||
if (index >= m_providers.nb) return FALSE;
|
||||
|
||||
if (DirectPlayCreate(&m_providers.pList[index]->guid, &lpDP, 0) == DP_OK)
|
||||
{
|
||||
if (lpDP->QueryInterface(IID_IDirectPlay2A, (LPVOID*)&m_pDP) == DP_OK)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
if (lpDP) lpDP->Release();
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void CNetwork::FreeProviderList()
|
||||
{
|
||||
if (m_providers.pList) free(m_providers.pList); // wrong
|
||||
|
||||
m_providers.nb = 0;
|
||||
m_providers.pList = NULL;
|
||||
}
|
||||
|
||||
|
||||
static BOOL EnumSessionsCallback(LPDPSESSIONDESC2 lpThisSD,
|
||||
LPDWORD lpdwTimeOut, DWORD dwFlags, NamedGUIDList* lpContext)
|
||||
{
|
||||
if (dwFlags & DPESC_TIMEDOUT) return FALSE;
|
||||
|
||||
if (lpContext->nb < MAXSESSION)
|
||||
{
|
||||
lpContext->pList[lpContext->nb]->guid = lpThisSD->guidInstance;
|
||||
strcpy(lpContext->pList[lpContext->nb]->name, lpThisSD->lpszSessionNameA);
|
||||
lpContext->nb++;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL CNetwork::EnumSessions()
|
||||
{
|
||||
DPSESSIONDESC2 desc;
|
||||
|
||||
FreeSessionList();
|
||||
m_sessions.nb = 0;
|
||||
m_sessions.pList = (NamedGUID(*)[MAXSESSION]) malloc(MAXSESSION * sizeof(NamedGUID));
|
||||
|
||||
if (!m_sessions.pList) return FALSE;
|
||||
|
||||
ZeroMemory(&desc, sizeof(desc));
|
||||
|
||||
desc.guidApplication = APP_GUID;
|
||||
desc.dwSize = sizeof(desc);
|
||||
|
||||
if (m_pDP->EnumSessions(&desc, 0, (LPDPENUMSESSIONSCALLBACK2)EnumSessionsCallback, &m_sessions, DPENUMSESSIONS_AVAILABLE) != DP_OK)
|
||||
{
|
||||
FreeSessionList();
|
||||
return FALSE;
|
||||
FreeUnknownList();
|
||||
if (m_pDP) m_pDP->Release();
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
char* CNetwork::GetSessionName(int index)
|
||||
{
|
||||
if (index >= m_sessions.nb) return NULL;
|
||||
return m_sessions.pList[index]->name;
|
||||
}
|
||||
|
||||
BOOL CNetwork::JoinSession(int index, char* pPlayerName)
|
||||
{
|
||||
DPNAME name;
|
||||
DPSESSIONDESC2 desc;
|
||||
HRESULT hr;
|
||||
|
||||
if (index > m_sessions.nb) return FALSE;
|
||||
|
||||
ZeroMemory(&desc, sizeof(desc));
|
||||
|
||||
desc.guidInstance = m_sessions.pList[index]->guid;
|
||||
|
||||
hr = m_pDP->Open(&desc, DPOPEN_OPENSESSION);
|
||||
if (hr != DP_OK)
|
||||
static BOOL EnumProvidersCallback(LPGUID lpguidSP, LPSTR lpSPName,
|
||||
DWORD dwMajorVersion, DWORD dwMinorVersion, NamedGUIDList* lpContext)
|
||||
{
|
||||
TraceErrorDP(hr);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
name.dwSize = 16;
|
||||
name.dwFlags = 0;
|
||||
name.lpszShortNameA = pPlayerName;
|
||||
name.lpszLongNameA = NULL;
|
||||
hr = m_pDP->CreatePlayer(&m_dpid, &name, NULL, NULL, 0, 0);
|
||||
if (hr != DP_OK)
|
||||
{
|
||||
TraceErrorDP(hr);
|
||||
m_pDP->Close();
|
||||
return FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_bHost = FALSE;
|
||||
if (lpContext->nb < MAXSESSION)
|
||||
{
|
||||
lpContext->pList[lpContext->nb]->guid = *lpguidSP;
|
||||
strcpy(lpContext->pList[lpContext->nb]->name, lpSPName);
|
||||
lpContext->nb++;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
void CNetwork::FreeSessionList()
|
||||
{
|
||||
if (m_sessions.pList) free(m_sessions.pList);
|
||||
|
||||
m_sessions.nb = 0;
|
||||
m_sessions.pList = NULL;
|
||||
}
|
||||
|
||||
BOOL CNetwork::CreateSession(char* pSessionName, char* pPlayerName)
|
||||
{
|
||||
DPNAME name;
|
||||
DPSESSIONDESC2 desc;
|
||||
HRESULT hr;
|
||||
|
||||
ZeroMemory(&desc, sizeof(desc));
|
||||
|
||||
desc.guidApplication = APP_GUID;
|
||||
desc.lpszSessionNameA = pSessionName;
|
||||
desc.dwSize = sizeof(desc);
|
||||
desc.dwFlags = DPSESSION_KEEPALIVE | DPSESSION_MIGRATEHOST;
|
||||
desc.dwMaxPlayers = MAXPLAYERS;
|
||||
|
||||
hr = m_pDP->Open(&desc, DPOPEN_CREATE);
|
||||
if (hr != DP_OK)
|
||||
BOOL CNetwork::EnumProviders()
|
||||
{
|
||||
TraceErrorDP(hr);
|
||||
FreeProviderList();
|
||||
m_providers.nb = 0;
|
||||
m_providers.pList = (NamedGUID(*)[MAXSESSION]) malloc(MAXSESSION * sizeof(NamedGUID));
|
||||
|
||||
if (!m_providers.pList) return FALSE;
|
||||
#ifdef _UNICODE
|
||||
if (DirectPlayEnumerate((LPDPENUMDPCALLBACK)EnumProvidersCallback, &m_providers) != DP_OK)
|
||||
#else
|
||||
if (DirectPlayEnumerate((LPDPENUMDPCALLBACKA)EnumProvidersCallback, &m_providers) != DP_OK)
|
||||
#endif
|
||||
{
|
||||
FreeProviderList();
|
||||
return FALSE;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
int CNetwork::GetNbProviders()
|
||||
{
|
||||
return m_providers.nb;
|
||||
}
|
||||
|
||||
char* CNetwork::GetProviderName(int index)
|
||||
{
|
||||
if (index >= m_providers.nb) return NULL;
|
||||
return m_providers.pList[index]->name;
|
||||
}
|
||||
|
||||
BOOL CNetwork::CreateProvider(int index)
|
||||
{
|
||||
LPDIRECTPLAY lpDP;
|
||||
BOOL bOK = FALSE;
|
||||
|
||||
if (index >= m_providers.nb) return FALSE;
|
||||
|
||||
if (DirectPlayCreate(&m_providers.pList[index]->guid, &lpDP, 0) == DP_OK)
|
||||
{
|
||||
if (lpDP->QueryInterface(IID_IDirectPlay2A, (LPVOID*)&m_pDP) == DP_OK)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
if (lpDP) lpDP->Release();
|
||||
return FALSE;
|
||||
}
|
||||
else
|
||||
|
||||
void CNetwork::FreeProviderList()
|
||||
{
|
||||
name.dwSize = 16;
|
||||
if (m_providers.pList) free(m_providers.pList); // wrong
|
||||
|
||||
m_providers.nb = 0;
|
||||
m_providers.pList = NULL;
|
||||
}
|
||||
|
||||
|
||||
static BOOL EnumSessionsCallback(LPDPSESSIONDESC2 lpThisSD,
|
||||
LPDWORD lpdwTimeOut, DWORD dwFlags, NamedGUIDList* lpContext)
|
||||
{
|
||||
if (dwFlags & DPESC_TIMEDOUT) return FALSE;
|
||||
|
||||
if (lpContext->nb < MAXSESSION)
|
||||
{
|
||||
lpContext->pList[lpContext->nb]->guid = lpThisSD->guidInstance;
|
||||
strcpy(lpContext->pList[lpContext->nb]->name, lpThisSD->lpszSessionNameA);
|
||||
lpContext->nb++;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL CNetwork::EnumSessions()
|
||||
{
|
||||
DPSESSIONDESC2 desc;
|
||||
|
||||
FreeSessionList();
|
||||
m_sessions.nb = 0;
|
||||
m_sessions.pList = (NamedGUID(*)[MAXSESSION]) malloc(MAXSESSION * sizeof(NamedGUID));
|
||||
|
||||
if (!m_sessions.pList) return FALSE;
|
||||
|
||||
ZeroMemory(&desc, sizeof(desc));
|
||||
|
||||
desc.guidApplication = APP_GUID;
|
||||
desc.dwSize = sizeof(desc);
|
||||
|
||||
if (m_pDP->EnumSessions(&desc, 0, (LPDPENUMSESSIONSCALLBACK2)EnumSessionsCallback, &m_sessions, DPENUMSESSIONS_AVAILABLE) != DP_OK)
|
||||
{
|
||||
FreeSessionList();
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
char* CNetwork::GetSessionName(int index)
|
||||
{
|
||||
if (index >= m_sessions.nb) return NULL;
|
||||
return m_sessions.pList[index]->name;
|
||||
}
|
||||
|
||||
BOOL CNetwork::JoinSession(int index, char* pPlayerName)
|
||||
{
|
||||
DPNAME name;
|
||||
DPSESSIONDESC2 desc;
|
||||
HRESULT hr;
|
||||
|
||||
if (index > m_sessions.nb) return FALSE;
|
||||
|
||||
ZeroMemory(&desc, sizeof(desc));
|
||||
|
||||
desc.guidInstance = m_sessions.pList[index]->guid;
|
||||
|
||||
hr = m_pDP->Open(&desc, DPOPEN_OPENSESSION);
|
||||
if (hr != DP_OK)
|
||||
{
|
||||
TraceErrorDP(hr);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
name.dwSize = sizeof(name);
|
||||
name.dwFlags = 0;
|
||||
name.lpszShortNameA = pPlayerName;
|
||||
name.lpszLongNameA = NULL;
|
||||
@ -225,118 +178,168 @@ BOOL CNetwork::CreateSession(char* pSessionName, char* pPlayerName)
|
||||
}
|
||||
else
|
||||
{
|
||||
m_bHost = TRUE;
|
||||
m_bHost = FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
BOOL CNetwork::Send(LPVOID lpData, DWORD dwDataSize, DWORD dwFlags)
|
||||
{
|
||||
HRESULT hr;
|
||||
|
||||
if (!m_pDP) return FALSE;
|
||||
|
||||
if (hr = m_pDP->Send(m_dpid, 0, !!dwFlags, lpData, dwDataSize), hr != DP_OK)
|
||||
void CNetwork::FreeSessionList()
|
||||
{
|
||||
TraceErrorDP(hr);
|
||||
return FALSE;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
if (m_sessions.pList) free(m_sessions.pList);
|
||||
|
||||
BOOL CNetwork::Receive(LPVOID pDest, DWORD dwDataSize, LPDWORD lpdwPlayer)
|
||||
{
|
||||
DPID from = 0, to = 0, dataSize = 500;
|
||||
char dataBuffer[500];
|
||||
HRESULT hr;
|
||||
|
||||
hr = m_pDP->Receive(&from, &to, DPRECEIVE_ALL, dataBuffer, &dataSize);
|
||||
if (hr != DP_OK)
|
||||
{
|
||||
if (hr != DPERR_NOMESSAGES) TraceErrorDP(hr);
|
||||
return FALSE;
|
||||
m_sessions.nb = 0;
|
||||
m_sessions.pList = NULL;
|
||||
}
|
||||
|
||||
ZeroMemory(pDest, dwDataSize);
|
||||
|
||||
*lpdwPlayer = -1;
|
||||
for (int i = 0; i < MAXPLAYERS; i++)
|
||||
BOOL CNetwork::CreateSession(char* pSessionName, char* pPlayerName)
|
||||
{
|
||||
if (m_players[i].bIsPresent && from == i)
|
||||
DPNAME name;
|
||||
DPSESSIONDESC2 desc;
|
||||
HRESULT hr;
|
||||
|
||||
ZeroMemory(&desc, sizeof(desc));
|
||||
|
||||
desc.guidApplication = APP_GUID;
|
||||
desc.lpszSessionNameA = pSessionName;
|
||||
desc.dwSize = sizeof(desc);
|
||||
desc.dwFlags = DPSESSION_KEEPALIVE | DPSESSION_MIGRATEHOST;
|
||||
desc.dwMaxPlayers = MAXPLAYERS;
|
||||
|
||||
hr = m_pDP->Open(&desc, DPOPEN_CREATE);
|
||||
if (hr != DP_OK)
|
||||
{
|
||||
*lpdwPlayer = i;
|
||||
break;
|
||||
TraceErrorDP(hr);
|
||||
return FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
name.dwSize = sizeof(name);
|
||||
name.dwFlags = 0;
|
||||
name.lpszShortNameA = pPlayerName;
|
||||
name.lpszLongNameA = NULL;
|
||||
hr = m_pDP->CreatePlayer(&m_dpid, &name, NULL, NULL, 0, 0);
|
||||
if (hr != DP_OK)
|
||||
{
|
||||
TraceErrorDP(hr);
|
||||
m_pDP->Close();
|
||||
return FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_bHost = TRUE;
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL CNetwork::Close()
|
||||
{
|
||||
return m_pDP->Close() == DP_OK;
|
||||
}
|
||||
|
||||
void CNetwork::FreeUnknownList()
|
||||
{
|
||||
if (m_unknown.pList) free(m_unknown.pList);
|
||||
|
||||
m_unknown.nb = 0;
|
||||
m_unknown.pList = NULL;
|
||||
}
|
||||
|
||||
BOOL CNetwork::IsHost()
|
||||
{
|
||||
return m_bHost;
|
||||
}
|
||||
|
||||
void TraceErrorDP(HRESULT hErr)
|
||||
{
|
||||
char dperr[256];
|
||||
char err[1024];
|
||||
|
||||
switch (hErr)
|
||||
BOOL CNetwork::Send(LPVOID lpData, DWORD dwDataSize, DWORD dwFlags)
|
||||
{
|
||||
case DPERR_OUTOFMEMORY: sprintf(dperr, "DPERR_OUTOFMEMORY"); break;
|
||||
case DPERR_UNSUPPORTED: sprintf(dperr, "DPERR_UNSUPPORTED"); break;
|
||||
case DPERR_NOINTERFACE: sprintf(dperr, "DPERR_NOINTERFACE"); break;
|
||||
case DPERR_GENERIC: sprintf(dperr, "DPERR_GENERIC"); break;
|
||||
case DPERR_INVALIDPARAMS: sprintf(dperr, "DPERR_INVALIDPARAMS"); break;
|
||||
case DPERR_ACTIVEPLAYERS: sprintf(dperr, "DPERR_ACTIVEPLAYERS"); break;
|
||||
case DPERR_ACCESSDENIED: sprintf(dperr, "DPERR_ACCESSDENIED"); break;
|
||||
case DPERR_CANTADDPLAYER: sprintf(dperr, "DPERR_CANTADDPLAYER"); break;
|
||||
case DPERR_CANTCREATEPLAYER: sprintf(dperr, "DPERR_CANTCREATEPLAYER"); break;
|
||||
case DPERR_CANTCREATEGROUP: sprintf(dperr, "DPERR_CANTCREATEGROUP"); break;
|
||||
case DPERR_CANTCREATESESSION: sprintf(dperr, "DPERR_CANTCREATESESSION"); break;
|
||||
case DPERR_CAPSNOTAVAILABLEYET: sprintf(dperr, "DPERR_CAPTSNOTAVAILABLEYET"); break;
|
||||
case DPERR_ALREADYINITIALIZED: sprintf(dperr, "DPERR_ALREADYINITIALIZED"); break;
|
||||
case DPERR_INVALIDFLAGS: sprintf(dperr, "DPERR_INVALIDFLAGS"); break;
|
||||
case DPERR_EXCEPTION: sprintf(dperr, "DPERR_EXCEPTION"); break;
|
||||
case DPERR_INVALIDPLAYER: sprintf(dperr, "DPERR_INVALIDPLAYER"); break;
|
||||
case DPERR_INVALIDOBJECT: sprintf(dperr, "DPERR_INVALIDOBJECT"); break;
|
||||
case DPERR_NOCONNECTION: sprintf(dperr, "DPERR_NOCONNECTION"); break;
|
||||
case DPERR_NONAMESERVERFOUND: sprintf(dperr, "DPERR_NONAMESERVERFOUND"); break;
|
||||
case DPERR_NOMESSAGES: sprintf(dperr, "DPERR_NOMESSAGES"); break;
|
||||
case DPERR_NOSESSIONS: sprintf(dperr, "DPERR_NOSESSIONS"); break;
|
||||
case DPERR_NOPLAYERS: sprintf(dperr, "DPERR_NOPLAYERS"); break;
|
||||
case DPERR_TIMEOUT: sprintf(dperr, "DPERR_TIMEOUT"); break;
|
||||
case DPERR_SENDTOOBIG: sprintf(dperr, "DPERR_SENDTOOBIG"); break;
|
||||
case DPERR_BUSY: sprintf(dperr, "DPERR_BUSY"); break;
|
||||
case DPERR_UNAVAILABLE: sprintf(dperr, "DPERR_UNAVAILABLE"); break;
|
||||
case DPERR_PLAYERLOST: sprintf(dperr, "DPERR_PLAYERLOST"); break;
|
||||
case DPERR_USERCANCEL: sprintf(dperr, "DPERR_USERCANCEL"); break;
|
||||
case DPERR_BUFFERTOOLARGE: sprintf(dperr, "DPERR_BUFFERTOOLARGE"); break;
|
||||
case DPERR_SESSIONLOST: sprintf(dperr, "DPERR_SESSIONLOST"); break;
|
||||
case DPERR_APPNOTSTARTED: sprintf(dperr, "DPERR_APPNOTSTARTED"); break;
|
||||
case DPERR_CANTCREATEPROCESS: sprintf(dperr, "DPERR_CANTCREATEPROCESS"); break;
|
||||
case DPERR_UNKNOWNAPPLICATION: sprintf(dperr, "DPERR_UNKNOWNAPPLICATION"); break;
|
||||
case DPERR_INVALIDINTERFACE: sprintf(dperr, "DPERR_INVALIDINTERFACE"); break;
|
||||
case DPERR_NOTLOBBIED: sprintf(dperr, "DPERR_NOTLOBBIED"); break;
|
||||
case DP_OK: sprintf(dperr, "DP_OK"); break;
|
||||
HRESULT hr;
|
||||
|
||||
default: sprintf(dperr, "Unknown Error"); break;
|
||||
if (!m_pDP) return FALSE;
|
||||
|
||||
if (hr = m_pDP->Send(m_dpid, 0, !!dwFlags, lpData, dwDataSize), hr != DP_OK)
|
||||
{
|
||||
TraceErrorDP(hr);
|
||||
return FALSE;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL CNetwork::Receive(LPVOID pDest, DWORD dwDataSize, LPDWORD lpdwPlayer)
|
||||
{
|
||||
DPID from = 0, to = 0;
|
||||
DWORD dataSize = 500;
|
||||
char dataBuffer[500];
|
||||
HRESULT hr;
|
||||
|
||||
hr = m_pDP->Receive(&from, &to, DPRECEIVE_ALL, dataBuffer, &dataSize);
|
||||
if (hr != DP_OK)
|
||||
{
|
||||
if (hr != DPERR_NOMESSAGES) TraceErrorDP(hr);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
ZeroMemory(pDest, dwDataSize);
|
||||
|
||||
*lpdwPlayer = -1;
|
||||
for (int i = 0; i < MAXPLAYERS; i++)
|
||||
{
|
||||
if (m_players[i].bIsPresent && from == i)
|
||||
{
|
||||
*lpdwPlayer = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL CNetwork::Close()
|
||||
{
|
||||
return m_pDP->Close() == DP_OK;
|
||||
}
|
||||
|
||||
void CNetwork::FreeUnknownList()
|
||||
{
|
||||
if (m_unknown.pList) free(m_unknown.pList);
|
||||
|
||||
m_unknown.nb = 0;
|
||||
m_unknown.pList = NULL;
|
||||
}
|
||||
|
||||
BOOL CNetwork::IsHost()
|
||||
{
|
||||
return m_bHost;
|
||||
}
|
||||
|
||||
void TraceErrorDP(HRESULT hErr)
|
||||
{
|
||||
char dperr[256];
|
||||
char err[1024];
|
||||
|
||||
switch (hErr)
|
||||
{
|
||||
case DPERR_OUTOFMEMORY: sprintf(dperr, "DPERR_OUTOFMEMORY"); break;
|
||||
case DPERR_UNSUPPORTED: sprintf(dperr, "DPERR_UNSUPPORTED"); break;
|
||||
case DPERR_NOINTERFACE: sprintf(dperr, "DPERR_NOINTERFACE"); break;
|
||||
case DPERR_GENERIC: sprintf(dperr, "DPERR_GENERIC"); break;
|
||||
case DPERR_INVALIDPARAMS: sprintf(dperr, "DPERR_INVALIDPARAMS"); break;
|
||||
case DPERR_ACTIVEPLAYERS: sprintf(dperr, "DPERR_ACTIVEPLAYERS"); break;
|
||||
case DPERR_ACCESSDENIED: sprintf(dperr, "DPERR_ACCESSDENIED"); break;
|
||||
case DPERR_CANTADDPLAYER: sprintf(dperr, "DPERR_CANTADDPLAYER"); break;
|
||||
case DPERR_CANTCREATEPLAYER: sprintf(dperr, "DPERR_CANTCREATEPLAYER"); break;
|
||||
case DPERR_CANTCREATEGROUP: sprintf(dperr, "DPERR_CANTCREATEGROUP"); break;
|
||||
case DPERR_CANTCREATESESSION: sprintf(dperr, "DPERR_CANTCREATESESSION"); break;
|
||||
case DPERR_CAPSNOTAVAILABLEYET: sprintf(dperr, "DPERR_CAPTSNOTAVAILABLEYET"); break;
|
||||
case DPERR_ALREADYINITIALIZED: sprintf(dperr, "DPERR_ALREADYINITIALIZED"); break;
|
||||
case DPERR_INVALIDFLAGS: sprintf(dperr, "DPERR_INVALIDFLAGS"); break;
|
||||
case DPERR_EXCEPTION: sprintf(dperr, "DPERR_EXCEPTION"); break;
|
||||
case DPERR_INVALIDPLAYER: sprintf(dperr, "DPERR_INVALIDPLAYER"); break;
|
||||
case DPERR_INVALIDOBJECT: sprintf(dperr, "DPERR_INVALIDOBJECT"); break;
|
||||
case DPERR_NOCONNECTION: sprintf(dperr, "DPERR_NOCONNECTION"); break;
|
||||
case DPERR_NONAMESERVERFOUND: sprintf(dperr, "DPERR_NONAMESERVERFOUND"); break;
|
||||
case DPERR_NOMESSAGES: sprintf(dperr, "DPERR_NOMESSAGES"); break;
|
||||
case DPERR_NOSESSIONS: sprintf(dperr, "DPERR_NOSESSIONS"); break;
|
||||
case DPERR_NOPLAYERS: sprintf(dperr, "DPERR_NOPLAYERS"); break;
|
||||
case DPERR_TIMEOUT: sprintf(dperr, "DPERR_TIMEOUT"); break;
|
||||
case DPERR_SENDTOOBIG: sprintf(dperr, "DPERR_SENDTOOBIG"); break;
|
||||
case DPERR_BUSY: sprintf(dperr, "DPERR_BUSY"); break;
|
||||
case DPERR_UNAVAILABLE: sprintf(dperr, "DPERR_UNAVAILABLE"); break;
|
||||
case DPERR_PLAYERLOST: sprintf(dperr, "DPERR_PLAYERLOST"); break;
|
||||
case DPERR_USERCANCEL: sprintf(dperr, "DPERR_USERCANCEL"); break;
|
||||
case DPERR_BUFFERTOOLARGE: sprintf(dperr, "DPERR_BUFFERTOOLARGE"); break;
|
||||
case DPERR_SESSIONLOST: sprintf(dperr, "DPERR_SESSIONLOST"); break;
|
||||
case DPERR_APPNOTSTARTED: sprintf(dperr, "DPERR_APPNOTSTARTED"); break;
|
||||
case DPERR_CANTCREATEPROCESS: sprintf(dperr, "DPERR_CANTCREATEPROCESS"); break;
|
||||
case DPERR_UNKNOWNAPPLICATION: sprintf(dperr, "DPERR_UNKNOWNAPPLICATION"); break;
|
||||
case DPERR_INVALIDINTERFACE: sprintf(dperr, "DPERR_INVALIDINTERFACE"); break;
|
||||
case DPERR_NOTLOBBIED: sprintf(dperr, "DPERR_NOTLOBBIED"); break;
|
||||
case DP_OK: sprintf(dperr, "DP_OK"); break;
|
||||
|
||||
default: sprintf(dperr, "Unknown Error"); break;
|
||||
}
|
||||
sprintf(err, "DirectPlay Error %s\n", dperr);
|
||||
OutputDebug(err);
|
||||
}
|
||||
sprintf(err, "DirectPlay Error %s\n", dperr);
|
||||
OutputDebug(err);
|
||||
}
|
121
src/network.h
121
src/network.h
@ -9,71 +9,74 @@
|
||||
#define MAXSESSION 100
|
||||
#define MAXPLAYERS 4
|
||||
|
||||
typedef struct
|
||||
{
|
||||
char bIsPresent;
|
||||
char ready;
|
||||
char unk_2;
|
||||
char unk_3;
|
||||
DPID dpid;
|
||||
short team;
|
||||
char name[22];
|
||||
}
|
||||
NetPlayer;
|
||||
extern "C" {
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GUID guid;
|
||||
char name[100];
|
||||
}
|
||||
NamedGUID;
|
||||
typedef struct
|
||||
{
|
||||
char bIsPresent;
|
||||
char ready;
|
||||
char unk_2;
|
||||
char unk_3;
|
||||
DPID dpid;
|
||||
short team;
|
||||
char name[22];
|
||||
}
|
||||
NetPlayer;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int nb;
|
||||
NamedGUID (*pList)[MAXSESSION];
|
||||
}
|
||||
NamedGUIDList;
|
||||
typedef struct
|
||||
{
|
||||
GUID guid;
|
||||
char name[100];
|
||||
}
|
||||
NamedGUID;
|
||||
|
||||
class CNetwork
|
||||
{
|
||||
public:
|
||||
CNetwork();
|
||||
~CNetwork();
|
||||
typedef struct
|
||||
{
|
||||
int nb;
|
||||
NamedGUID(*pList)[MAXSESSION];
|
||||
}
|
||||
NamedGUIDList;
|
||||
|
||||
BOOL EnumProviders();
|
||||
BOOL GetNbProviders();
|
||||
char* GetProviderName(int index);
|
||||
BOOL CreateProvider(int index);
|
||||
void FreeProviderList();
|
||||
BOOL EnumSessions();
|
||||
char* GetSessionName(int index);
|
||||
BOOL JoinSession(int index, char* pPlayerName);
|
||||
void FreeSessionList();
|
||||
BOOL CreateSession(char* pSessionName, char* pPlayerName);
|
||||
BOOL Send(LPVOID lpData, DWORD dwDataSize, DWORD dwFlags);
|
||||
BOOL Receive(LPVOID pDest, DWORD dwDataSize, LPDWORD lpdwPlayer);
|
||||
BOOL Close();
|
||||
void FreeUnknownList();
|
||||
BOOL IsHost();
|
||||
class CNetwork
|
||||
{
|
||||
public:
|
||||
CNetwork();
|
||||
~CNetwork();
|
||||
|
||||
NetPlayer m_players[4];
|
||||
DPID m_dpid;
|
||||
BOOL EnumProviders();
|
||||
BOOL GetNbProviders();
|
||||
char* GetProviderName(int index);
|
||||
BOOL CreateProvider(int index);
|
||||
void FreeProviderList();
|
||||
BOOL EnumSessions();
|
||||
char* GetSessionName(int index);
|
||||
BOOL JoinSession(int index, char* pPlayerName);
|
||||
void FreeSessionList();
|
||||
BOOL CreateSession(char* pSessionName, char* pPlayerName);
|
||||
BOOL Send(LPVOID lpData, DWORD dwDataSize, DWORD dwFlags);
|
||||
BOOL Receive(LPVOID pDest, DWORD dwDataSize, LPDWORD lpdwPlayer);
|
||||
BOOL Close();
|
||||
void FreeUnknownList();
|
||||
BOOL IsHost();
|
||||
|
||||
protected:
|
||||
LPDIRECTPLAY2 m_pDP;
|
||||
NamedGUIDList m_providers;
|
||||
NamedGUIDList m_sessions;
|
||||
NamedGUIDList m_unknown;
|
||||
BOOL m_bHost;
|
||||
|
||||
// NetPlayer m_players[4];
|
||||
};
|
||||
NetPlayer m_players[4];
|
||||
DPID m_dpid;
|
||||
|
||||
static BOOL EnumProvidersCallback(LPGUID lpguidSP, LPSTR lpSTName,
|
||||
DWORD dwMajorVersion, DWORD dwMinorVersion, NamedGUIDList* lpContext);
|
||||
protected:
|
||||
LPDIRECTPLAY2 m_pDP;
|
||||
NamedGUIDList m_providers;
|
||||
NamedGUIDList m_sessions;
|
||||
NamedGUIDList m_unknown;
|
||||
BOOL m_bHost;
|
||||
|
||||
static BOOL EnumSessionsCallback(LPDPSESSIONDESC2 lpThisSD,
|
||||
LPDWORD lpdwTimeOut, DWORD dwFlags, NamedGUIDList* lpContext);
|
||||
// NetPlayer m_players[4];
|
||||
};
|
||||
|
||||
void TraceErrorDP(HRESULT hErr);
|
||||
static BOOL EnumProvidersCallback(LPGUID lpguidSP, LPSTR lpSTName,
|
||||
DWORD dwMajorVersion, DWORD dwMinorVersion, NamedGUIDList* lpContext);
|
||||
|
||||
static BOOL EnumSessionsCallback(LPDPSESSIONDESC2 lpThisSD,
|
||||
LPDWORD lpdwTimeOut, DWORD dwFlags, NamedGUIDList* lpContext);
|
||||
|
||||
void TraceErrorDP(HRESULT hErr);
|
||||
}
|
@ -97,8 +97,6 @@ protected:
|
||||
HWND m_hWnd;
|
||||
POINT m_dim;
|
||||
RECT m_clipRect;
|
||||
double originX;
|
||||
double originY;
|
||||
|
||||
POINT m_mousePos;
|
||||
int m_mouseSprite;
|
||||
|
Loading…
x
Reference in New Issue
Block a user