1
0
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:
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, 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
( (

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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