1
0
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:
jummy 2024-10-04 20:59:47 -05:00
parent ad18be075b
commit 4b335e4710
7 changed files with 381 additions and 360 deletions

View File

@ -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
(

View File

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

View File

@ -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

View File

@ -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()

View File

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

View File

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

View File

@ -97,8 +97,6 @@ protected:
HWND m_hWnd;
POINT m_dim;
RECT m_clipRect;
double originX;
double originY;
POINT m_mousePos;
int m_mouseSprite;