From 3b0e39665d0c1e6ee823d2cb4b98371cc80a3845 Mon Sep 17 00:00:00 2001 From: Charles Lohr Date: Sun, 21 Nov 2004 07:05:18 +0000 Subject: [PATCH] Add: Most of the Net Room for SMOnline. There's only a little more to add. --- stepmania/src/NetworkSyncManager.cpp | 59 +++--------- stepmania/src/NetworkSyncManager.h | 10 +- stepmania/src/ScreenNetRoom.cpp | 126 ++++++++++++++++++++++++- stepmania/src/ScreenNetRoom.h | 14 +++ stepmania/src/ScreenNetSelectMusic.cpp | 6 +- 5 files changed, 158 insertions(+), 57 deletions(-) diff --git a/stepmania/src/NetworkSyncManager.cpp b/stepmania/src/NetworkSyncManager.cpp index 2e0ce93536..46efe8c8d2 100644 --- a/stepmania/src/NetworkSyncManager.cpp +++ b/stepmania/src/NetworkSyncManager.cpp @@ -53,6 +53,7 @@ const ScreenMessage SM_SMOnlinePack = ScreenMessage(SM_User+8); NetworkSyncManager::NetworkSyncManager( LoadingWindow *ld ) { LANserver = NULL; //So we know if it has been created yet + if( GetCommandlineArgument( "runserver" )) { ld->SetText("Initilizing server..."); @@ -70,6 +71,8 @@ NetworkSyncManager::NetworkSyncManager( LoadingWindow *ld ) useSMserver = false; + isSMOnline = false; + m_startupStatus = 0; //By default, connection not tried. m_ActivePlayers = 0; @@ -174,7 +177,11 @@ void NetworkSyncManager::PostStartUp(const CString& ServerIP) } NetPlayerClient->blocking = false; + m_ServerVersion = m_packet.Read1(); + if ( m_ServerVersion >= 128 ) + isSMOnline = true; + m_ServerName = m_packet.ReadNT(); LOG->Info("Server Version: %d %s", m_ServerVersion, m_ServerName.c_str()); @@ -668,12 +675,10 @@ void NetworkSyncManager::ProcessInput() break; case NSCSMOnline: { - PacketFunctions smoPack; - smoPack.size = packetSize - 1; - smoPack.Position = 0; - memcpy( smoPack.Data, m_packet.Data, packetSize-1 ); + m_SMOnlinePacket.size = packetSize - 1; + m_SMOnlinePacket.Position = 0; + memcpy( m_SMOnlinePacket.Data, (m_packet.Data + 1), packetSize-1 ); LOG->Trace( "Received SMOnline Command: %d, size:%d", command, packetSize - 1 ); - m_SMOnlineStack.push_front( smoPack ); SCREENMAN->SendMessageToTopScreen( SM_SMOnlinePack ); } } @@ -717,50 +722,11 @@ void NetworkSyncManager::SelectUserSong() NetPlayerClient->SendPack( (char*)&m_packet.Data, m_packet.Position ); } -void NetworkSyncManager::SendSMOnline( PacketFunctions &PackData ) +void NetworkSyncManager::SendSMOnline( ) { - NetPlayerClient->SendPack( (char*)&PackData.Data , PackData.size ); + NetPlayerClient->SendPack( (char*)&m_SMOnlinePacket.Data , m_SMOnlinePacket.size ); } -PacketFunctions NetworkSyncManager::GetSMOnline( ) -{ - PacketFunctions Pack; - - if ( m_SMOnlineStack.empty() ) - { - Pack.Position = 0; - Pack.size = 0; - return Pack; - } - - Pack = m_SMOnlineStack.back(); - - memcpy( Pack.Data, m_SMOnlineStack.back().Data, Pack.size ); - - m_SMOnlineStack.pop_back(); - return Pack; -} - -PacketFunctions NetworkSyncManager::PeekSMOnline( ) -{ - PacketFunctions Pack; - - if ( m_SMOnlineStack.empty() ) - { - Pack.Position = 0; - Pack.size = 0; - return Pack; - } - - Pack = m_SMOnlineStack.back(); - - memcpy( Pack.Data, m_SMOnlineStack.back().Data, Pack.size ); - - return Pack; -} - - - //Packet functions uint8_t PacketFunctions::Read1() @@ -848,6 +814,7 @@ void PacketFunctions::ClearPacket() #endif LuaFunction_NoArgs( IsNetConnected, NSMAN->useSMserver ) +LuaFunction_NoArgs( IsNetSMOnline, NSMAN->isSMOnline ) /* * (c) 2003-2004 Charles Lohr, Joshua Allen diff --git a/stepmania/src/NetworkSyncManager.h b/stepmania/src/NetworkSyncManager.h index b1e8978184..988379b153 100644 --- a/stepmania/src/NetworkSyncManager.h +++ b/stepmania/src/NetworkSyncManager.h @@ -94,9 +94,7 @@ public: CString GetServerName(); //SMOnline stuff - void SendSMOnline( PacketFunctions &PackData ); - PacketFunctions GetSMOnline( ); - PacketFunctions PeekSMOnline( ); + void SendSMOnline( ); bool Connect(const CString& addy, unsigned short port); // Connect to SM Server @@ -111,6 +109,7 @@ public: void Update(float fDeltaTime); bool useSMserver; + bool isSMOnline; vector m_PlayerStatus; int m_ActivePlayers; @@ -140,8 +139,11 @@ public: CString m_sChatText; + PacketFunctions m_SMOnlinePacket; + bool isLanServer; //Must be public for ScreenNetworkOptions StepManiaLanServer *LANserver; + private: #if !defined(WITHOUT_NETWORKING) @@ -170,8 +172,6 @@ private: bool Listen(unsigned short port); PacketFunctions m_packet; - - deque m_SMOnlineStack; #endif }; diff --git a/stepmania/src/ScreenNetRoom.cpp b/stepmania/src/ScreenNetRoom.cpp index 885eab4431..295aad9be8 100644 --- a/stepmania/src/ScreenNetRoom.cpp +++ b/stepmania/src/ScreenNetRoom.cpp @@ -1,8 +1,5 @@ #include "global.h" -//XXX: THIS IS JUST A STUB! -//XXX: THIS CLASS IS NOT FUNCTIONAL - #if !defined(WITHOUT_NETWORKING) #include "ScreenNetRoom.h" #include "ScreenManager.h" @@ -10,6 +7,21 @@ #include "GameState.h" #include "ThemeManager.h" +#define TITLEBG_WIDTH THEME->GetMetricF(m_sName,"TitleBGWidth") +#define TITLEBG_HEIGHT THEME->GetMetricF(m_sName,"TitleBGHeight") +#define TITLEBG_COLOR THEME->GetMetricC(m_sName,"TitleBGColor") + +#define ROOMSBG_WIDTH THEME->GetMetricF(m_sName,"RoomsBGWidth") +#define ROOMSBG_HEIGHT THEME->GetMetricF(m_sName,"RoomsBGHeight") +#define ROOMSBG_COLOR THEME->GetMetricC(m_sName,"RoomsBGColor") + +#define NUM_ROOMS_SHOW THEME->GetMetricI(m_sName,"NumRoomsShow"); + +#define SEL_WIDTH THEME->GetMetricF(m_sName,"SelWidth") +#define SEL_HEIGHT THEME->GetMetricF(m_sName,"SelHeight") +#define SEL_COLOR THEME->GetMetricC(m_sName,"SelColor") + + const ScreenMessage SM_SMOnlinePack = ScreenMessage(SM_User+8); //Unused, but should be known @@ -18,6 +30,43 @@ ScreenNetRoom::ScreenNetRoom( const CString& sName ) : ScreenNetSelectBase( sNam GAMESTATE->FinishStage(); m_soundChangeSel.Load( THEME->GetPathToS("ScreenNetRoom change sel")); + m_iRoomPlace = 0; + + m_rectTitleBG.SetDiffuse( TITLEBG_COLOR ); + m_rectTitleBG.SetName( "TitleBG" ); + m_rectTitleBG.SetWidth( TITLEBG_WIDTH ); + m_rectTitleBG.SetHeight( TITLEBG_HEIGHT ); + SET_XY_AND_ON_COMMAND( m_rectTitleBG ); + this->AddChild( &m_rectTitleBG); + + m_textTitle.LoadFromFont( THEME->GetPathF(m_sName,"wheel") ); + m_textTitle.SetShadowLength( 0 ); + m_textTitle.SetName( "Title" ); + m_textTitle.SetMaxWidth( TITLEBG_WIDTH ); + SET_XY_AND_ON_COMMAND( m_textTitle ); + this->AddChild( &m_textTitle); + + m_rectRoomsBG.SetDiffuse( ROOMSBG_COLOR ); + m_rectRoomsBG.SetName( "RoomsBG" ); + m_rectRoomsBG.SetWidth( ROOMSBG_WIDTH ); + m_rectRoomsBG.SetHeight( ROOMSBG_HEIGHT ); + SET_XY_AND_ON_COMMAND( m_rectRoomsBG ); + this->AddChild( &m_rectRoomsBG); + + m_textRooms.LoadFromFont( THEME->GetPathF(m_sName,"wheel") ); + m_textRooms.SetShadowLength( 0 ); + m_textRooms.SetName( "Rooms" ); + m_textRooms.SetMaxWidth( ROOMSBG_WIDTH ); + SET_XY_AND_ON_COMMAND( m_textRooms ); + this->AddChild( &m_textRooms ); + + m_rectRoomsSel.SetDiffuse( SEL_COLOR ); + m_rectRoomsSel.SetName( "Sel" ); + m_rectRoomsSel.SetWidth( SEL_WIDTH ); + m_rectRoomsSel.SetHeight( SEL_HEIGHT ); + SET_XY_AND_ON_COMMAND( m_rectRoomsSel ); + this->AddChild( &m_rectRoomsSel ); + NSMAN->ReportNSSOnOff(7); return; } @@ -31,11 +80,49 @@ void ScreenNetRoom::Input( const DeviceInput& DeviceI, const InputEventType type void ScreenNetRoom::HandleScreenMessage( const ScreenMessage SM ) { + switch( SM ) + { + case SM_GoToPrevScreen: + SCREENMAN->SetNewScreen( THEME->GetMetric (m_sName, "PrevScreen") ); + break; + case SM_GoToNextScreen: + SCREENMAN->SetNewScreen( THEME->GetMetric (m_sName, "NextScreen") ); + break; + case SM_SMOnlinePack: + if ( NSMAN->m_SMOnlinePacket.Read1() == 1 ) + switch ( NSMAN->m_SMOnlinePacket.Read1() ) + { + case 0: //Room title Change + m_textTitle.SetText( NSMAN->m_SMOnlinePacket.ReadNT() + '\n' + NSMAN->m_SMOnlinePacket.ReadNT() ); + case 1: //Rooms list change + { + int numRooms = NSMAN->m_SMOnlinePacket.Read1(); + m_Rooms.clear(); + for (int i=0;im_SMOnlinePacket.ReadNT() ); + NSMAN->m_SMOnlinePacket.ReadNT(); + } + if (m_iRoomPlace<0) + m_iRoomPlace=0; + if (m_iRoomPlace>=m_Rooms.size()) + m_iRoomPlace=m_Rooms.size()-1; + UpdateRoomsList(); + } + } + break; + } ScreenNetSelectBase::HandleScreenMessage( SM ); } void ScreenNetRoom::TweenOffScreen() { + OFF_COMMAND( m_textTitle ); + OFF_COMMAND( m_rectTitleBG ); + OFF_COMMAND( m_rectRoomsBG ); + OFF_COMMAND( m_textRooms ); + OFF_COMMAND( m_rectRoomsSel ); + NSMAN->ReportNSSOnOff(6); } @@ -46,24 +133,57 @@ void ScreenNetRoom::Update( float fDeltaTime ) void ScreenNetRoom::MenuStart( PlayerNumber pn ) { + NSMAN->m_SMOnlinePacket.ClearPacket(); + NSMAN->m_SMOnlinePacket.Write1( 1 ); + NSMAN->m_SMOnlinePacket.WriteNT( m_Rooms[m_iRoomPlace] ); + NSMAN->SendSMOnline( ); ScreenNetSelectBase::MenuStart( pn ); } void ScreenNetRoom::MenuBack( PlayerNumber pn ) { + TweenOffScreen(); + + Back( SM_GoToPrevScreen ); + ScreenNetSelectBase::MenuBack( pn ); } void ScreenNetRoom::MenuUp( PlayerNumber pn, const InputEventType type ) { + m_iRoomPlace--; + if (m_iRoomPlace<0) + m_iRoomPlace=0; + if (m_iRoomPlace>=m_Rooms.size()) + m_iRoomPlace=m_Rooms.size()-1; + UpdateRoomsList(); ScreenNetSelectBase::MenuUp( pn ); } void ScreenNetRoom::MenuDown( PlayerNumber pn, const InputEventType type ) { + m_iRoomPlace++; + if (m_iRoomPlace<0) + m_iRoomPlace=0; + if (m_iRoomPlace>=m_Rooms.size()) + m_iRoomPlace=m_Rooms.size()-1; + UpdateRoomsList(); ScreenNetSelectBase::MenuDown( pn ); } +void ScreenNetRoom::UpdateRoomsList() +{ + CString TempText=""; + //It doesn't like this stuff inline + int min = m_iRoomPlace-NUM_ROOMS_SHOW; + int max = m_iRoomPlace+NUM_ROOMS_SHOW; + for (int i=min; i= 0 ) && ( i < m_Rooms.size() ) ) + TempText += m_Rooms[i] + '\n'; + } +} + #endif /* diff --git a/stepmania/src/ScreenNetRoom.h b/stepmania/src/ScreenNetRoom.h index c588fb5674..a18779b33a 100644 --- a/stepmania/src/ScreenNetRoom.h +++ b/stepmania/src/ScreenNetRoom.h @@ -5,6 +5,7 @@ #include "ScreenWithMenuElements.h" #include "ScreenNetSelectBase.h" +#include class ScreenNetRoom : public ScreenNetSelectBase { @@ -24,7 +25,20 @@ protected: virtual void TweenOffScreen( ); virtual void Update( float fDeltaTime ); +private: + void UpdateRoomsList(); + RageSound m_soundChangeSel; + + BitmapText m_textTitle; + Quad m_rectTitleBG; + + Quad m_rectRoomsBG; + BitmapText m_textRooms; + Quad m_rectRoomsSel; + + vector < CString > m_Rooms; + int m_iRoomPlace; }; #endif diff --git a/stepmania/src/ScreenNetSelectMusic.cpp b/stepmania/src/ScreenNetSelectMusic.cpp index 1a6ed61d83..437ce275d8 100644 --- a/stepmania/src/ScreenNetSelectMusic.cpp +++ b/stepmania/src/ScreenNetSelectMusic.cpp @@ -235,8 +235,6 @@ void ScreenNetSelectMusic::Input( const DeviceInput& DeviceI, const InputEventTy void ScreenNetSelectMusic::HandleScreenMessage( const ScreenMessage SM ) { - ScreenNetSelectBase::HandleScreenMessage( SM ); - switch( SM ) { case SM_GoToPrevScreen: @@ -324,7 +322,9 @@ void ScreenNetSelectMusic::HandleScreenMessage( const ScreenMessage SM ) NSMAN->ReportPlayerOptions(); break; } - + //Must be at end, as so it is last resort for SMOnline packets. + //If it doens't know what to do, then it'll just remove them. + ScreenNetSelectBase::HandleScreenMessage( SM ); } void ScreenNetSelectMusic::MenuLeft( PlayerNumber pn, const InputEventType type )