mirror of
https://github.com/jummy0/sb2-decomp
synced 2025-03-15 04:24:48 +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,
|
SetRect(&WindowRect, (sx - LXIMAGE) / 2, (sy - LYIMAGE) / 2,
|
||||||
(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);
|
#if _LEGACY
|
||||||
AdjustWindowRect(&WindowRect, WS_POPUPWINDOW | WS_CAPTION, FALSE); // fixed behavior
|
// 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
|
g_hWnd = CreateWindow
|
||||||
(
|
(
|
||||||
|
@ -16,10 +16,6 @@
|
|||||||
#include "ddutil.h"
|
#include "ddutil.h"
|
||||||
#include "misc.h"
|
#include "misc.h"
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
#define DIRECTDRAW_VERSION 0x0500
|
|
||||||
|
|
||||||
BOOL g_bDebug = TRUE;
|
BOOL g_bDebug = TRUE;
|
||||||
|
|
||||||
void DDSetDebug(BOOL bDebug)
|
void DDSetDebug(BOOL bDebug)
|
||||||
|
@ -17,8 +17,9 @@
|
|||||||
#define _INTRO FALSE // TRUE si images d'introduction
|
#define _INTRO FALSE // TRUE si images d'introduction
|
||||||
|
|
||||||
// additional flags
|
// additional flags
|
||||||
#define _CD FALSE // whether to require the game CD
|
#define _CD FALSE // if TRUE, require the game CD
|
||||||
#define _BYE !_EGAMES // whether to show exit image (like _INTRO)
|
#define _BYE !_EGAMES // if TRUE, show exit image (like _INTRO)
|
||||||
|
#define _LEGACY FALSE // if TRUE, keep broken/quirky legacy code
|
||||||
|
|
||||||
#define MAXGAMER 8
|
#define MAXGAMER 8
|
||||||
|
|
||||||
|
@ -5722,6 +5722,22 @@ BOOL CEvent::CopyMission(char *srcFileName, char *dstFileName)
|
|||||||
destFile = fopen(dstFileName, "wb");
|
destFile = fopen(dstFileName, "wb");
|
||||||
if (destFile)
|
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
|
do
|
||||||
{
|
{
|
||||||
num = fread(buffer, 1, 2560, srcFile);
|
num = fread(buffer, 1, 2560, srcFile);
|
||||||
@ -5733,6 +5749,8 @@ BOOL CEvent::CopyMission(char *srcFileName, char *dstFileName)
|
|||||||
}
|
}
|
||||||
fwrite(buffer, 1, num, destFile);
|
fwrite(buffer, 1, num, destFile);
|
||||||
} while (!ferror(destFile)); // *
|
} while (!ferror(destFile)); // *
|
||||||
|
#endif // _LEGACY
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (srcFile) fclose(srcFile);
|
if (srcFile) fclose(srcFile);
|
||||||
@ -5740,11 +5758,7 @@ die:
|
|||||||
if (destFile) fclose(destFile);
|
if (destFile) fclose(destFile);
|
||||||
if (buffer) free(buffer);
|
if (buffer) free(buffer);
|
||||||
return bOK;
|
return bOK;
|
||||||
|
|
||||||
// *
|
|
||||||
// original code relies on undefined behavior specific to older msvc :
|
|
||||||
// if (srcFile->_flag & _IOERR)
|
|
||||||
// while (!(destFile->_flag & _IOERR))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CEvent::DrawMap()
|
void CEvent::DrawMap()
|
||||||
|
573
src/network.cpp
573
src/network.cpp
@ -10,209 +10,162 @@
|
|||||||
// a0f94abe-11c3-d111-be62-0040f6944838
|
// a0f94abe-11c3-d111-be62-0040f6944838
|
||||||
#define APP_GUID { 0xbe4af9a0, 0xc311, 0x11d1, { 0xbe, 0x62, 0x00, 0x40, 0xf6, 0x94, 0x48, 0x38 } };
|
#define APP_GUID { 0xbe4af9a0, 0xc311, 0x11d1, { 0xbe, 0x62, 0x00, 0x40, 0xf6, 0x94, 0x48, 0x38 } };
|
||||||
|
|
||||||
CNetwork::CNetwork()
|
extern "C" {
|
||||||
{
|
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)
|
|
||||||
{
|
{
|
||||||
lpContext->pList[lpContext->nb]->guid = *lpguidSP;
|
m_pDP = NULL;
|
||||||
strcpy(lpContext->pList[lpContext->nb]->name, lpSPName);
|
m_dpid = 0;
|
||||||
lpContext->nb++;
|
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()
|
CNetwork::~CNetwork()
|
||||||
{
|
|
||||||
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();
|
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();
|
FreeSessionList();
|
||||||
return FALSE;
|
FreeUnknownList();
|
||||||
|
if (m_pDP) m_pDP->Release();
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
static BOOL EnumProvidersCallback(LPGUID lpguidSP, LPSTR lpSPName,
|
||||||
}
|
DWORD dwMajorVersion, DWORD dwMinorVersion, NamedGUIDList* lpContext)
|
||||||
|
|
||||||
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);
|
if (lpContext->nb < MAXSESSION)
|
||||||
return FALSE;
|
{
|
||||||
}
|
lpContext->pList[lpContext->nb]->guid = *lpguidSP;
|
||||||
|
strcpy(lpContext->pList[lpContext->nb]->name, lpSPName);
|
||||||
name.dwSize = 16;
|
lpContext->nb++;
|
||||||
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;
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void CNetwork::FreeSessionList()
|
BOOL CNetwork::EnumProviders()
|
||||||
{
|
|
||||||
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)
|
|
||||||
{
|
{
|
||||||
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;
|
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.dwFlags = 0;
|
||||||
name.lpszShortNameA = pPlayerName;
|
name.lpszShortNameA = pPlayerName;
|
||||||
name.lpszLongNameA = NULL;
|
name.lpszLongNameA = NULL;
|
||||||
@ -225,118 +178,168 @@ BOOL CNetwork::CreateSession(char* pSessionName, char* pPlayerName)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_bHost = TRUE;
|
m_bHost = FALSE;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
BOOL CNetwork::Send(LPVOID lpData, DWORD dwDataSize, DWORD dwFlags)
|
void CNetwork::FreeSessionList()
|
||||||
{
|
|
||||||
HRESULT hr;
|
|
||||||
|
|
||||||
if (!m_pDP) return FALSE;
|
|
||||||
|
|
||||||
if (hr = m_pDP->Send(m_dpid, 0, !!dwFlags, lpData, dwDataSize), hr != DP_OK)
|
|
||||||
{
|
{
|
||||||
TraceErrorDP(hr);
|
if (m_sessions.pList) free(m_sessions.pList);
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOL CNetwork::Receive(LPVOID pDest, DWORD dwDataSize, LPDWORD lpdwPlayer)
|
m_sessions.nb = 0;
|
||||||
{
|
m_sessions.pList = NULL;
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ZeroMemory(pDest, dwDataSize);
|
BOOL CNetwork::CreateSession(char* pSessionName, char* pPlayerName)
|
||||||
|
|
||||||
*lpdwPlayer = -1;
|
|
||||||
for (int i = 0; i < MAXPLAYERS; i++)
|
|
||||||
{
|
{
|
||||||
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;
|
TraceErrorDP(hr);
|
||||||
break;
|
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::Send(LPVOID lpData, DWORD dwDataSize, DWORD dwFlags)
|
||||||
}
|
|
||||||
|
|
||||||
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;
|
HRESULT hr;
|
||||||
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;
|
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 MAXSESSION 100
|
||||||
#define MAXPLAYERS 4
|
#define MAXPLAYERS 4
|
||||||
|
|
||||||
typedef struct
|
extern "C" {
|
||||||
{
|
|
||||||
char bIsPresent;
|
|
||||||
char ready;
|
|
||||||
char unk_2;
|
|
||||||
char unk_3;
|
|
||||||
DPID dpid;
|
|
||||||
short team;
|
|
||||||
char name[22];
|
|
||||||
}
|
|
||||||
NetPlayer;
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
GUID guid;
|
char bIsPresent;
|
||||||
char name[100];
|
char ready;
|
||||||
}
|
char unk_2;
|
||||||
NamedGUID;
|
char unk_3;
|
||||||
|
DPID dpid;
|
||||||
|
short team;
|
||||||
|
char name[22];
|
||||||
|
}
|
||||||
|
NetPlayer;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
int nb;
|
GUID guid;
|
||||||
NamedGUID (*pList)[MAXSESSION];
|
char name[100];
|
||||||
}
|
}
|
||||||
NamedGUIDList;
|
NamedGUID;
|
||||||
|
|
||||||
class CNetwork
|
typedef struct
|
||||||
{
|
{
|
||||||
public:
|
int nb;
|
||||||
CNetwork();
|
NamedGUID(*pList)[MAXSESSION];
|
||||||
~CNetwork();
|
}
|
||||||
|
NamedGUIDList;
|
||||||
|
|
||||||
BOOL EnumProviders();
|
class CNetwork
|
||||||
BOOL GetNbProviders();
|
{
|
||||||
char* GetProviderName(int index);
|
public:
|
||||||
BOOL CreateProvider(int index);
|
CNetwork();
|
||||||
void FreeProviderList();
|
~CNetwork();
|
||||||
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();
|
|
||||||
|
|
||||||
NetPlayer m_players[4];
|
BOOL EnumProviders();
|
||||||
DPID m_dpid;
|
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:
|
NetPlayer m_players[4];
|
||||||
LPDIRECTPLAY2 m_pDP;
|
DPID m_dpid;
|
||||||
NamedGUIDList m_providers;
|
|
||||||
NamedGUIDList m_sessions;
|
|
||||||
NamedGUIDList m_unknown;
|
|
||||||
BOOL m_bHost;
|
|
||||||
|
|
||||||
// NetPlayer m_players[4];
|
|
||||||
};
|
|
||||||
|
|
||||||
static BOOL EnumProvidersCallback(LPGUID lpguidSP, LPSTR lpSTName,
|
protected:
|
||||||
DWORD dwMajorVersion, DWORD dwMinorVersion, NamedGUIDList* lpContext);
|
LPDIRECTPLAY2 m_pDP;
|
||||||
|
NamedGUIDList m_providers;
|
||||||
|
NamedGUIDList m_sessions;
|
||||||
|
NamedGUIDList m_unknown;
|
||||||
|
BOOL m_bHost;
|
||||||
|
|
||||||
static BOOL EnumSessionsCallback(LPDPSESSIONDESC2 lpThisSD,
|
// NetPlayer m_players[4];
|
||||||
LPDWORD lpdwTimeOut, DWORD dwFlags, NamedGUIDList* lpContext);
|
};
|
||||||
|
|
||||||
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;
|
HWND m_hWnd;
|
||||||
POINT m_dim;
|
POINT m_dim;
|
||||||
RECT m_clipRect;
|
RECT m_clipRect;
|
||||||
double originX;
|
|
||||||
double originY;
|
|
||||||
|
|
||||||
POINT m_mousePos;
|
POINT m_mousePos;
|
||||||
int m_mouseSprite;
|
int m_mouseSprite;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user