From 77dc160001f1a325d40f75933b48e5104788f984 Mon Sep 17 00:00:00 2001 From: Glenn Maynard Date: Tue, 20 Aug 2002 20:38:40 +0000 Subject: [PATCH] Add SongManager::ChooseRandomSong (from TitleMenu). Use it when starting a demonstration. Instead of queuing a bunch of SM_PlayAttract's, queue one and have it requeue itself. This means 1: if the demonstration fails to start, we don't stop playing the attract. (Well, if we don't have any songs, maybe we don't want ot attract attention, but ...) and more importantly, 2: setting the SECONDS_BETWEEN_ATTRACT value to some obscenely high value won't cause millions of messages to be queued. Flatten the option selection loop a bit (this should probably be moved somewhere, too.) --- stepmania/src/ScreenTitleMenu.cpp | 73 ++++++++++--------------------- stepmania/src/SongManager.cpp | 30 +++++++++++++ stepmania/src/SongManager.h | 4 ++ 3 files changed, 57 insertions(+), 50 deletions(-) diff --git a/stepmania/src/ScreenTitleMenu.cpp b/stepmania/src/ScreenTitleMenu.cpp index 8d1f2d0350..e92654899d 100644 --- a/stepmania/src/ScreenTitleMenu.cpp +++ b/stepmania/src/ScreenTitleMenu.cpp @@ -176,8 +176,7 @@ ScreenTitleMenu::ScreenTitleMenu() MUSIC->Stop(); - for( float f=SECONDS_BETWEEN_ATTRACT; fSendScreenMessage( SM_PlayAttract, f ); + this->SendScreenMessage( SM_PlayAttract, SECONDS_BETWEEN_ATTRACT ); this->SendScreenMessage( SM_FadeToDemonstration, SECONDS_BEFORE_DEMONSTRATION ); } @@ -204,6 +203,7 @@ void ScreenTitleMenu::HandleScreenMessage( const ScreenMessage SM ) { case SM_PlayAttract: m_soundAttract.PlayRandom(); + this->SendScreenMessage( SM_PlayAttract, SECONDS_BETWEEN_ATTRACT ); break; case SM_GoToNextScreen: switch( m_TitleMenuChoice ) @@ -251,60 +251,33 @@ void ScreenTitleMenu::HandleScreenMessage( const ScreenMessage SM ) GAMESTATE->m_PlayMode = PLAY_MODE_ARCADE; - if( SONGMAN->m_pSongs.GetSize() == 0 ) - goto abort_demonstration; - - // choose a Song and Notes - Song* pSongToPlay; - Notes* pNotesToPlay; - int i; - for( i=0; i<600; i++ ) // try 600 times + if(!SONGMAN->ChooseRandomSong()) { - Song* pSong = SONGMAN->m_pSongs[ rand()%SONGMAN->m_pSongs.GetSize() ]; - for( int j=0; j<3; j++ ) // try 3 times - { - if( pSong->m_apNotes.GetSize() == 0 ) - continue; - - Notes* pNotes = pSong->m_apNotes[ rand()%pSong->m_apNotes.GetSize() ]; - if( pNotes->m_NotesType == GAMESTATE->GetCurrentStyleDef()->m_NotesType ) - { - // found something we can use! - pSongToPlay = pSong; - pNotesToPlay = pNotes; - goto found_song_and_notes; - } - } + // Couldn't find Song/Notes to play. Abort demonstration! + GAMESTATE->Reset(); + return; } -abort_demonstration: - // Couldn't find Song/Notes to play. Abort demonstration! - GAMESTATE->Reset(); - return; -found_song_and_notes: - ASSERT( pSongToPlay ); - - GAMESTATE->m_pCurSong = pSongToPlay; - for( int p=0; pm_pCurNotes[p] = pNotesToPlay; + ASSERT( GAMESTATE->m_pCurSong ); // choose some cool options - for( p=0; pIsPlayerEnabled(p) ) - { - if( RandomFloat(0,1)>0.8f ) - GAMESTATE->m_PlayerOptions[p].m_fArrowScrollSpeed = 1.5f; - GAMESTATE->m_PlayerOptions[p].m_EffectType = PlayerOptions::EffectType(rand()%PlayerOptions::NUM_EFFECT_TYPES); - if( RandomFloat(0,1)>0.9f ) - GAMESTATE->m_PlayerOptions[p].m_AppearanceType = PlayerOptions::APPEARANCE_HIDDEN; - if( RandomFloat(0,1)>0.9f ) - GAMESTATE->m_PlayerOptions[p].m_AppearanceType = PlayerOptions::APPEARANCE_SUDDEN; - if( RandomFloat(0,1)>0.7f ) - GAMESTATE->m_PlayerOptions[p].m_bReverseScroll = true; - if( RandomFloat(0,1)>0.9f ) - GAMESTATE->m_PlayerOptions[p].m_bDark = true; - } + if( !GAMESTATE->IsPlayerEnabled(p) ) + continue; + + if( RandomFloat(0,1)>0.8f ) + GAMESTATE->m_PlayerOptions[p].m_fArrowScrollSpeed = 1.5f; + GAMESTATE->m_PlayerOptions[p].m_EffectType = + PlayerOptions::EffectType(rand()%PlayerOptions::NUM_EFFECT_TYPES); + if( RandomFloat(0,1)>0.9f ) + GAMESTATE->m_PlayerOptions[p].m_AppearanceType = PlayerOptions::APPEARANCE_HIDDEN; + if( RandomFloat(0,1)>0.9f ) + GAMESTATE->m_PlayerOptions[p].m_AppearanceType = PlayerOptions::APPEARANCE_SUDDEN; + if( RandomFloat(0,1)>0.7f ) + GAMESTATE->m_PlayerOptions[p].m_bReverseScroll = true; + if( RandomFloat(0,1)>0.9f ) + GAMESTATE->m_PlayerOptions[p].m_bDark = true; } GAMESTATE->m_SongOptions.m_LifeType = SongOptions::LifeType(rand()%SongOptions::NUM_LIFE_TYPES); GAMESTATE->m_SongOptions.m_FailType = SongOptions::FAIL_OFF; diff --git a/stepmania/src/SongManager.cpp b/stepmania/src/SongManager.cpp index 7c879c03b6..db88e48417 100644 --- a/stepmania/src/SongManager.cpp +++ b/stepmania/src/SongManager.cpp @@ -538,3 +538,33 @@ load_from_course_failed: default: ASSERT(0); } } + +/* Pick a random song (for the demonstration). */ +bool SongManager::ChooseRandomSong() +{ + if( SONGMAN->m_pSongs.GetSize() == 0 ) + return false; + + int i; + for( i=0; i<600; i++ ) // try 600 times + { + Song* pSong = m_pSongs[ rand()%m_pSongs.GetSize() ]; + for( int j=0; j<3; j++ ) // try 3 times + { + if( pSong->m_apNotes.GetSize() == 0 ) + continue; + + Notes* pNotes = pSong->m_apNotes[ rand()%pSong->m_apNotes.GetSize() ]; + if( pNotes->m_NotesType != GAMESTATE->GetCurrentStyleDef()->m_NotesType ) + continue; + + // found something we can use! + GAMESTATE->m_pCurSong = pSong; + for( int p=0; pm_pCurNotes[p] = pNotes; + return true; + } + } + + return false; +} diff --git a/stepmania/src/SongManager.h b/stepmania/src/SongManager.h index 4bcb80682b..0e2c5ac753 100644 --- a/stepmania/src/SongManager.h +++ b/stepmania/src/SongManager.h @@ -58,6 +58,10 @@ public: void GetExtraStageInfo( bool bExtra2, CString sPreferredGroup, NotesType nt, Song*& pSongOut, Notes*& pNotesOut, PlayerOptions& po_out, SongOptions& so_out ); + /* Choose a random song from the current style. Return true + * if successful, false if no song could be found. */ + bool ChooseRandomSong(); + protected: void LoadStepManiaSongDir( CString sDir, void(*callback)() ); void LoadDWISongDir( CString sDir );