Network server mode accepts multiple connections
This commit is contained in:
@@ -16,13 +16,13 @@
|
|||||||
#include "GameConstantsAndTypes.h"
|
#include "GameConstantsAndTypes.h"
|
||||||
#include "PrefsManager.h"
|
#include "PrefsManager.h"
|
||||||
#include "Quad.h"
|
#include "Quad.h"
|
||||||
|
#include "RageNetwork.h"
|
||||||
|
|
||||||
|
|
||||||
ScreenSandbox::ScreenSandbox()
|
ScreenSandbox::ScreenSandbox()
|
||||||
{
|
{
|
||||||
m_text.LoadFromFont( THEME->GetPathTo("Fonts","normal") );
|
m_text.LoadFromFont( THEME->GetPathTo("Fonts","normal") );
|
||||||
m_text.SetXY( CENTER_X, CENTER_Y );
|
m_text.SetXY( CENTER_X, CENTER_Y );
|
||||||
m_text.SetText( "Press Left to Become Server\nRight to become Client." );
|
|
||||||
this->AddChild( &m_text );
|
this->AddChild( &m_text );
|
||||||
|
|
||||||
// m_Menu.Load(
|
// m_Menu.Load(
|
||||||
@@ -41,6 +41,13 @@ ScreenSandbox::ScreenSandbox()
|
|||||||
void ScreenSandbox::Update( float fDeltaTime )
|
void ScreenSandbox::Update( float fDeltaTime )
|
||||||
{
|
{
|
||||||
Screen::Update( fDeltaTime );
|
Screen::Update( fDeltaTime );
|
||||||
|
|
||||||
|
CArray<Packet,Packet> aPackets;
|
||||||
|
NETWORK->Recv( aPackets );
|
||||||
|
for( unsigned int i=0; i<aPackets.size(); i++ )
|
||||||
|
{
|
||||||
|
m_text.SetText( "Message received." );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScreenSandbox::DrawPrimitives()
|
void ScreenSandbox::DrawPrimitives()
|
||||||
@@ -59,10 +66,7 @@ void ScreenSandbox::Input( const DeviceInput& DeviceI, const InputEventType type
|
|||||||
switch( DeviceI.button )
|
switch( DeviceI.button )
|
||||||
{
|
{
|
||||||
case DIK_LEFT:
|
case DIK_LEFT:
|
||||||
m_text.SetText( "You are the server." );
|
m_text.SetText( "Message sent." );
|
||||||
break;
|
|
||||||
case DIK_RIGHT:
|
|
||||||
m_text.SetText( "You are the client." );
|
|
||||||
break;
|
break;
|
||||||
case DIK_T:
|
case DIK_T:
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -635,3 +635,12 @@ bool SongManager::ChooseRandomSong()
|
|||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Song* SongManager::GetSongFromPath( const CString &sSongPath )
|
||||||
|
{
|
||||||
|
for( unsigned int i=0; i<m_pSongs.size(); i++ )
|
||||||
|
if( sSongPath.CompareNoCase(m_pSongs[i]->GetSongFilePath()) == 0 )
|
||||||
|
return m_pSongs[i];
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|||||||
@@ -62,6 +62,8 @@ public:
|
|||||||
* if successful, false if no song could be found. */
|
* if successful, false if no song could be found. */
|
||||||
bool ChooseRandomSong();
|
bool ChooseRandomSong();
|
||||||
|
|
||||||
|
Song* GetSongFromPath( const CString &sSongPath );
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void LoadStepManiaSongDir( CString sDir, void(*callback)() );
|
void LoadStepManiaSongDir( CString sDir, void(*callback)() );
|
||||||
void LoadDWISongDir( CString sDir );
|
void LoadDWISongDir( CString sDir );
|
||||||
|
|||||||
@@ -85,6 +85,14 @@ HANDLE g_hMutex; // Used to check if an instance of our app is already
|
|||||||
const DWORD g_dwWindowStyle = WS_POPUP|WS_CAPTION|WS_MINIMIZEBOX|WS_MAXIMIZEBOX|WS_SYSMENU;
|
const DWORD g_dwWindowStyle = WS_POPUP|WS_CAPTION|WS_MINIMIZEBOX|WS_MAXIMIZEBOX|WS_SYSMENU;
|
||||||
BOOL g_bIsActive = FALSE; // Whether the focus is on our app
|
BOOL g_bIsActive = FALSE; // Whether the focus is on our app
|
||||||
|
|
||||||
|
// command line arguments
|
||||||
|
CString g_sSongPath = "";
|
||||||
|
bool g_bBeClient = false;
|
||||||
|
bool g_bBeServer = false;
|
||||||
|
CString g_sServerIP = "";
|
||||||
|
int g_iNumClients = 0;
|
||||||
|
|
||||||
|
const int SM_PORT = 26573; // Quake port + "Ko" + "na" + "mitsu"
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Function prototypes
|
// Function prototypes
|
||||||
@@ -139,11 +147,13 @@ void StructuredExceptionHandler(unsigned int uCode,
|
|||||||
}
|
}
|
||||||
throw std::exception(msg);
|
throw std::exception(msg);
|
||||||
}
|
}
|
||||||
void SplitCommandLine(const char *lpCmdLine, CStringArray &aCmds) {
|
void SplitCommandLine(const char *lpCmdLine, CStringArray &aCmds)
|
||||||
|
{
|
||||||
const char *s = lpCmdLine;
|
const char *s = lpCmdLine;
|
||||||
|
|
||||||
/* Split a string on whitespace, but never between quotes. */
|
/* Split a string on whitespace, but never between quotes. */
|
||||||
while(*s) {
|
while(*s)
|
||||||
|
{
|
||||||
CString cmd;
|
CString cmd;
|
||||||
|
|
||||||
while( isspace(*s) ) s++;
|
while( isspace(*s) ) s++;
|
||||||
@@ -181,9 +191,41 @@ int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE, LPSTR CmdLine, int nCmdShow
|
|||||||
|
|
||||||
CStringArray Cmds;
|
CStringArray Cmds;
|
||||||
SplitCommandLine(CmdLine, Cmds);
|
SplitCommandLine(CmdLine, Cmds);
|
||||||
for(unsigned i = 0; i < Cmds.size(); ++i)
|
for(unsigned i = 0; i < Cmds.size(); )
|
||||||
{
|
{
|
||||||
if(Cmds[i] == "--fsck") { crash(); exit( 0 ); }
|
if(Cmds[i] == "--fsck")
|
||||||
|
{
|
||||||
|
crash();
|
||||||
|
exit( 0 );
|
||||||
|
}
|
||||||
|
else if(Cmds[i] == "--song")
|
||||||
|
{
|
||||||
|
++i;
|
||||||
|
g_sSongPath = Cmds[i];
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
else if(Cmds[i] == "--client")
|
||||||
|
{
|
||||||
|
++i;
|
||||||
|
g_bBeClient = true;
|
||||||
|
}
|
||||||
|
else if(Cmds[i] == "--server")
|
||||||
|
{
|
||||||
|
++i;
|
||||||
|
g_bBeServer = true;
|
||||||
|
}
|
||||||
|
else if(Cmds[i] == "--ip")
|
||||||
|
{
|
||||||
|
++i;
|
||||||
|
g_sServerIP = Cmds[i];
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
else if(Cmds[i] == "--numclients")
|
||||||
|
{
|
||||||
|
++i;
|
||||||
|
g_iNumClients = atoi(Cmds[i]);
|
||||||
|
++i;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef _DEBUG
|
#ifndef _DEBUG
|
||||||
@@ -742,8 +784,35 @@ HRESULT CreateObjects( HWND hWnd )
|
|||||||
BringWindowToTop( hWnd );
|
BringWindowToTop( hWnd );
|
||||||
SetForegroundWindow( hWnd );
|
SetForegroundWindow( hWnd );
|
||||||
|
|
||||||
|
if( g_bBeClient )
|
||||||
|
{
|
||||||
|
// immediately try to connect to server
|
||||||
|
GAMESTATE->m_pCurSong = SONGMAN->GetSongFromPath( g_sSongPath );
|
||||||
|
if( GAMESTATE->m_pCurSong == NULL )
|
||||||
|
throw RageException( "The song '%s' is required to play this network game.", g_sSongPath );
|
||||||
|
NETWORK->Init( false );
|
||||||
|
if( !NETWORK->Connect( (const char*)g_sServerIP, SM_PORT ) )
|
||||||
|
throw RageException( "Could not connect to server '%s'", g_sServerIP );
|
||||||
|
SCREENMAN->SetNewScreen( "ScreenSandbox" );
|
||||||
|
}
|
||||||
|
else if( g_bBeServer )
|
||||||
|
{
|
||||||
|
// wait for clients to connect
|
||||||
|
GAMESTATE->m_pCurSong = SONGMAN->GetSongFromPath( g_sSongPath );
|
||||||
|
if( GAMESTATE->m_pCurSong == NULL )
|
||||||
|
throw RageException( "The song '%s' is required to play this network game.", g_sSongPath );
|
||||||
|
NETWORK->Init( true );
|
||||||
|
if( !NETWORK->Listen( SM_PORT ) )
|
||||||
|
throw RageException( "Could not connect to server '%s'", g_sServerIP );
|
||||||
|
SCREENMAN->SetNewScreen( "ScreenSandbox" );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// normal game
|
||||||
SCREENMAN->SetNewScreen( "ScreenTitleMenu" );
|
SCREENMAN->SetNewScreen( "ScreenTitleMenu" );
|
||||||
// SCREENMAN->SetNewScreen( "ScreenSandbox" );
|
// SCREENMAN->SetNewScreen( "ScreenSandbox" );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,33 +15,6 @@ Package=<4>
|
|||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
|
||||||
Project: "ZipArchive"=.\smpackage\ZipArchive\ZipArchive.dsp - Package Owner=<4>
|
|
||||||
|
|
||||||
Package=<5>
|
|
||||||
{{{
|
|
||||||
}}}
|
|
||||||
|
|
||||||
Package=<4>
|
|
||||||
{{{
|
|
||||||
}}}
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
Project: "smpackage"=.\smpackage\smpackage.dsp - Package Owner=<4>
|
|
||||||
|
|
||||||
Package=<5>
|
|
||||||
{{{
|
|
||||||
}}}
|
|
||||||
|
|
||||||
Package=<4>
|
|
||||||
{{{
|
|
||||||
Begin Project Dependency
|
|
||||||
Project_Dep_Name ZipArchive
|
|
||||||
End Project Dependency
|
|
||||||
}}}
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
Global:
|
Global:
|
||||||
|
|
||||||
Package=<5>
|
Package=<5>
|
||||||
|
|||||||
Reference in New Issue
Block a user