From 3903354786439c9c740baf1c62dcdeb1976c998d Mon Sep 17 00:00:00 2001 From: Charles Lohr Date: Sat, 28 Aug 2004 03:37:52 +0000 Subject: [PATCH] Added server-automated song selection. --- stepmania/src/NetworkSyncManager.cpp | 22 +++++++ stepmania/src/NetworkSyncManager.h | 8 +++ stepmania/src/ScreenNetSelectMusic.cpp | 80 +++++++++++++++++++++----- stepmania/src/ScreenNetSelectMusic.h | 2 + 4 files changed, 99 insertions(+), 13 deletions(-) diff --git a/stepmania/src/NetworkSyncManager.cpp b/stepmania/src/NetworkSyncManager.cpp index f25b4e5c39..878cc668f8 100644 --- a/stepmania/src/NetworkSyncManager.cpp +++ b/stepmania/src/NetworkSyncManager.cpp @@ -18,6 +18,7 @@ void NetworkSyncManager::DisplayStartupStatus() { } void NetworkSyncManager::Update( float fDeltaTime ) { } bool NetworkSyncManager::ChangedScoreboard(int Column) { return false; } void NetworkSyncManager::SendChat( CString message ) { } +void NetworkSyncManager::SelectUserSong() { } #else #include "ezsockets.h" #include "ProfileManager.h" @@ -483,6 +484,14 @@ void NetworkSyncManager::ProcessInput() m_WaitingChat = m_packet.ReadNT(); SCREENMAN->SendMessageToTopScreen( SM_AddToChat ); } + case 8: //Select Song/Play song + { + m_iSelectMode = m_packet.Read1(); + m_sMainTitle = m_packet.ReadNT(); + m_sArtist = m_packet.ReadNT(); + m_sSubTitle = m_packet.ReadNT(); + SCREENMAN->SendMessageToTopScreen( SM_ChangeSong ); + } } m_packet.ClearPacket(); } @@ -504,6 +513,19 @@ void NetworkSyncManager::SendChat( CString message ) NetPlayerClient->SendPack((char*)&m_packet.Data, m_packet.Position); } +void NetworkSyncManager::SelectUserSong() +{ + m_packet.ClearPacket(); + m_packet.Write1( 8 ); + m_packet.Write1( m_iSelectMode ); + m_packet.WriteNT( m_sMainTitle ); + m_packet.WriteNT( m_sArtist ); + m_packet.WriteNT( m_sSubTitle ); + NetPlayerClient->SendPack((char*)&m_packet.Data, m_packet.Position); +} + + +//Packet functions uint8_t PacketFunctions::Read1() { diff --git a/stepmania/src/NetworkSyncManager.h b/stepmania/src/NetworkSyncManager.h index f73d466fe6..6696a7cad2 100644 --- a/stepmania/src/NetworkSyncManager.h +++ b/stepmania/src/NetworkSyncManager.h @@ -74,6 +74,14 @@ public: //Used for chatting void SendChat( CString message ); CString m_WaitingChat; + + //Used for song checking/changing + CString m_sMainTitle; + CString m_sArtist; + CString m_sSubTitle; + int m_iSelectMode; + void SelectUserSong(); + private: #if !defined(WITHOUT_NETWORKING) diff --git a/stepmania/src/ScreenNetSelectMusic.cpp b/stepmania/src/ScreenNetSelectMusic.cpp index b39a28740a..c6a915d0e2 100644 --- a/stepmania/src/ScreenNetSelectMusic.cpp +++ b/stepmania/src/ScreenNetSelectMusic.cpp @@ -188,7 +188,6 @@ ScreenNetSelectMusic::ScreenNetSelectMusic( CString sName ) : ScreenWithMenuElem } //Make the last group the full list group. - //XXX: what if someone has a group named [All Songs]? //Must be last m_vGroups.push_back( AllGroups ); m_iShowGroups = NUM_GROUPS_SHOW; @@ -339,7 +338,48 @@ void ScreenNetSelectMusic::HandleScreenMessage( const ScreenMessage SM ) break; } case SM_ChangeSong: - + { + //We always need to find the song + m_iGroupNum=m_vGroups.size()-1; //Alphabetical + + UpdateGroupsListPos(); + UpdateSongsList(); + + int i; + + for ( i = 0; m_vSongs.size(); i++) + if ( ( m_vSongs[i]->GetTranslitArtist() == NSMAN->m_sArtist ) && + ( m_vSongs[i]->GetTranslitMainTitle() == NSMAN->m_sMainTitle ) && + ( m_vSongs[i]->GetTranslitSubTitle() == NSMAN->m_sSubTitle ) ) + break; + + bool haveSong = false; + + if ( i != m_vSongs.size() ) + haveSong = true; + + switch (NSMAN->m_iSelectMode) + { + case 2: //We need to do cmd 1 as well here + case 1: //Scroll to song as well + if (haveSong) + { + m_iSongNum = i + m_vSongs.size(); + UpdateSongsListPos(); + } + //don't break here + case 0: //See if client has song + if (haveSong) + NSMAN->m_iSelectMode = 0; + else + NSMAN->m_iSelectMode = 1; + NSMAN->SelectUserSong(); + } + //Play the song. + if ( ( NSMAN->m_iSelectMode == 2 ) && ( haveSong ) ) + StartSelectedSong(); + + } break; } @@ -439,18 +479,16 @@ void ScreenNetSelectMusic::MenuDown( PlayerNumber pn, const InputEventType type void ScreenNetSelectMusic::MenuStart( PlayerNumber pn ) { - Song * pSong = m_vSongs[m_iSongNum%m_vSongs.size()]; - StepsType st = GAMESTATE->GetCurrentStyle()->m_StepsType; //STEPS_TYPE_DANCE_SINGLE; - FOREACH_EnabledPlayer (pn) + if ( NSMAN->useSMserver ) { - GAMESTATE->m_PreferredDifficulty[pn] = m_DC[pn]; - Steps * pSteps = pSong->GetStepsByDifficulty(st,m_DC[pn]); - GAMESTATE->m_pCurSteps[pn] = pSteps; - } - GAMESTATE->m_pCurSong = pSong; - - TweenOffScreen(); - StartTransitioning( SM_GoToNextScreen ); + int j = m_iSongNum % m_vSongs.size(); + NSMAN->m_sArtist = m_vSongs[j]->GetTranslitArtist(); + NSMAN->m_sMainTitle = m_vSongs[j]->GetTranslitMainTitle(); + NSMAN->m_sSubTitle = m_vSongs[j]->GetTranslitSubTitle(); + NSMAN->m_iSelectMode = 2; //Command for user selecting song + NSMAN->SelectUserSong (); + } else + StartSelectedSong(); } void ScreenNetSelectMusic::MenuBack( PlayerNumber pn ) @@ -502,6 +540,22 @@ void ScreenNetSelectMusic::UpdateTextInput() m_textChatInput.SetText( m_sTextInput ); } +void ScreenNetSelectMusic::StartSelectedSong() +{ + Song * pSong = m_vSongs[m_iSongNum%m_vSongs.size()]; + StepsType st = GAMESTATE->GetCurrentStyle()->m_StepsType; //STEPS_TYPE_DANCE_SINGLE; + FOREACH_EnabledPlayer (pn) + { + GAMESTATE->m_PreferredDifficulty[pn] = m_DC[pn]; + Steps * pSteps = pSong->GetStepsByDifficulty(st,m_DC[pn]); + GAMESTATE->m_pCurSteps[pn] = pSteps; + } + GAMESTATE->m_pCurSong = pSong; + + TweenOffScreen(); + StartTransitioning( SM_GoToNextScreen ); +} + void ScreenNetSelectMusic::UpdateSongsListPos() { int i,j; diff --git a/stepmania/src/ScreenNetSelectMusic.h b/stepmania/src/ScreenNetSelectMusic.h index c1583a655b..ea60ac274c 100644 --- a/stepmania/src/ScreenNetSelectMusic.h +++ b/stepmania/src/ScreenNetSelectMusic.h @@ -28,6 +28,8 @@ public: void UpdateSongsList(); void UpdateTextInput(); + void StartSelectedSong(); + int m_iSongNum; int m_iShowSongs; //The number of songs to display to each side int m_iGroupNum;