void ScreenSMOnlineLogin::ExportOptions( int iRow, const vector<PlayerNumber> &vpns ) { switch( iRow ) { case 0: { vector<RString> vsProfiles; PROFILEMAN->GetLocalProfileIDs( vsProfiles ); FOREACH_EnabledPlayer( pn ) ProfileManager::m_sDefaultLocalProfileID[pn].Set( vsProfiles[m_pRows[0]->GetOneSelection(pn)] ); } break; } }
void NoteField::CacheAllUsedNoteSkins() { // If we're in Routine mode, apply our per-player noteskins. if( GAMESTATE->GetCurrentStyle(m_pPlayerState->m_PlayerNumber)->m_StyleType == StyleType_TwoPlayersSharedSides ) { FOREACH_EnabledPlayer( pn ) GAMESTATE->ApplyStageModifiers( pn, ROUTINE_NOTESKIN.GetValue(pn) ); } /* Cache all note skins that we might need for the whole song, course or battle * play, so we don't have to load them later (such as between course songs). */ vector<RString> asSkinsLower; GAMESTATE->GetAllUsedNoteSkins( asSkinsLower ); asSkinsLower.push_back( m_pPlayerState->m_PlayerOptions.GetStage().m_sNoteSkin ); FOREACH( RString, asSkinsLower, s ) { NOTESKIN->ValidateNoteSkinName(*s); s->MakeLower(); }
void StageStats::AddStats( const StageStats& other ) { ASSERT( !other.m_vpPlayedSongs.empty() ); FOREACH_CONST( Song*, other.m_vpPlayedSongs, s ) m_vpPlayedSongs.push_back( *s ); FOREACH_CONST( Song*, other.m_vpPossibleSongs, s ) m_vpPossibleSongs.push_back( *s ); m_Stage = Stage_Invalid; // meaningless m_iStageIndex = -1; // meaningless m_bGaveUp |= other.m_bGaveUp; m_bUsedAutoplay |= other.m_bUsedAutoplay; m_fGameplaySeconds += other.m_fGameplaySeconds; m_fStepsSeconds += other.m_fStepsSeconds; FOREACH_EnabledPlayer( p ) m_player[p].AddStats( other.m_player[p] ); }
void ScreenNetSelectMusic::MusicChanged() { if( GAMESTATE->m_pCurSong == NULL ) { FOREACH_EnabledPlayer (pn) UpdateDifficulties( pn ); SOUND->StopMusic(); // todo: handle playing section music correctly. -aj // SOUND->PlayMusic( m_sSectionMusicPath, NULL, true, 0, -1 ); return; } FOREACH_EnabledPlayer (pn) { m_DC[pn] = GAMESTATE->m_PreferredDifficulty[pn]; StepsType st = GAMESTATE->GetCurrentStyle()->m_StepsType; vector <Steps *> MultiSteps; MultiSteps = GAMESTATE->m_pCurSong->GetStepsByStepsType( st ); if(MultiSteps.size() == 0) m_DC[pn] = NUM_Difficulty; else { int i; Difficulty Target = Difficulty_Easy; bool dcs[NUM_Difficulty]; for( i=0; i<NUM_Difficulty; ++i ) dcs[i] = false; for( i=0; i<(int)MultiSteps.size(); ++i ) dcs[MultiSteps[i]->GetDifficulty()] = true; for( i=0; i<NUM_Difficulty; ++i ) if( dcs[i] ) { Target = (Difficulty)i; if( i >= m_DC[pn] ) { m_DC[pn] = (Difficulty)i; break; } } if( i == NUM_Difficulty ) m_DC[pn] = Target; } UpdateDifficulties( pn ); } // Copied from ScreenSelectMusic // TODO: Update me! -aj SOUND->StopMusic(); if( GAMESTATE->m_pCurSong->HasMusic() ) { // don't play the same sound over and over if(SOUND->GetMusicPath().CompareNoCase(GAMESTATE->m_pCurSong->GetMusicPath())) { SOUND->StopMusic(); SOUND->PlayMusic( GAMESTATE->m_pCurSong->GetMusicPath(), NULL, true, GAMESTATE->m_pCurSong->m_fMusicSampleStartSeconds, GAMESTATE->m_pCurSong->m_fMusicSampleLengthSeconds ); } } }
void ScreenNetSelectMusic::HandleScreenMessage( const ScreenMessage SM ) { if( SM == SM_GoToPrevScreen ) { SCREENMAN->SetNewScreen( THEME->GetMetric (m_sName, "PrevScreen") ); } else if( SM == SM_GoToNextScreen ) { SOUND->StopMusic(); SCREENMAN->SetNewScreen( THEME->GetMetric (m_sName, "NextScreen") ); } else if( SM == SM_UsersUpdate ) { m_MusicWheel.Move( 0 ); } else if( SM == SM_NoSongs ) { SCREENMAN->SetNewScreen( THEME->GetMetric (m_sName, "NoSongsScreen") ); } else if( SM == SM_ChangeSong ) { // First check to see if this song is already selected. This is so that if // you have multiple copies of the "same" song you can chose which copy to play. Song* CurSong = m_MusicWheel.GetSelectedSong(); if(CurSong != NULL ) if( ( !CurSong->GetTranslitArtist().CompareNoCase( NSMAN->m_sArtist ) ) && ( !CurSong->GetTranslitMainTitle().CompareNoCase( NSMAN->m_sMainTitle ) ) && ( !CurSong->GetTranslitSubTitle().CompareNoCase( NSMAN->m_sSubTitle ) ) ) { switch ( NSMAN->m_iSelectMode ) { case 0: case 1: NSMAN->m_iSelectMode = 0; NSMAN->SelectUserSong(); break; case 2: // Proper starting of song case 3: // Blind starting of song StartSelectedSong(); goto done; } } vector <Song *> AllSongs = SONGMAN->GetAllSongs(); unsigned i; for( i=0; i < AllSongs.size(); i++ ) { m_cSong = AllSongs[i]; if( ( !m_cSong->GetTranslitArtist().CompareNoCase( NSMAN->m_sArtist ) ) && ( !m_cSong->GetTranslitMainTitle().CompareNoCase( NSMAN->m_sMainTitle ) ) && ( !m_cSong->GetTranslitSubTitle().CompareNoCase( NSMAN->m_sSubTitle ) ) ) break; } bool haveSong = i != AllSongs.size(); switch (NSMAN->m_iSelectMode) { case 3: StartSelectedSong(); break; case 2: // We need to do cmd 1 as well here if(haveSong) { if(!m_MusicWheel.SelectSong( m_cSong ) ) { m_MusicWheel.ChangeSort( SORT_GROUP ); m_MusicWheel.FinishTweening(); SCREENMAN->PostMessageToTopScreen( SM_SetWheelSong, 0.710f ); } m_MusicWheel.Select(); m_MusicWheel.Move(-1); m_MusicWheel.Move(1); StartSelectedSong(); m_MusicWheel.Select(); } break; case 1: // Scroll to song as well if(haveSong) { if(!m_MusicWheel.SelectSong( m_cSong ) ) { //m_MusicWheel.ChangeSort( SORT_GROUP ); //m_MusicWheel.FinishTweening(); //SCREENMAN->PostMessageToTopScreen( SM_SetWheelSong, 0.710f ); m_MusicWheel.ChangeSort( SORT_GROUP ); m_MusicWheel.SetOpenSection( "" ); } m_MusicWheel.SelectSong( m_cSong ); m_MusicWheel.Select(); m_MusicWheel.Move(-1); m_MusicWheel.Move(1); m_MusicWheel.Select(); } // don't break here case 0: // See if client has song if(haveSong) NSMAN->m_iSelectMode = 0; else NSMAN->m_iSelectMode = 1; NSMAN->SelectUserSong(); } } else if( SM == SM_SetWheelSong ) // After we've done the sort on wheel, select song. { m_MusicWheel.SelectSong( m_cSong ); } else if( SM == SM_RefreshWheelLocation ) { m_MusicWheel.Select(); m_MusicWheel.Move(-1); m_MusicWheel.Move(1); m_MusicWheel.Select(); m_bAllowInput = true; } else if( SM == SM_BackFromPlayerOptions ) { // XXX HACK: This will cause ScreenSelectOptions to go back here. NSMAN->ReportNSSOnOff(1); GAMESTATE->m_EditMode = EditMode_Invalid; NSMAN->ReportPlayerOptions(); // Update changes FOREACH_EnabledPlayer(p) m_ModIconRow[p].SetFromGameState(); } else if( SM == SM_SongChanged ) { GAMESTATE->m_pCurSong.Set( m_MusicWheel.GetSelectedSong() ); MusicChanged(); } else if( SM == SM_SMOnlinePack ) { if( NSMAN->m_SMOnlinePacket.Read1() == 1 ) { switch ( NSMAN->m_SMOnlinePacket.Read1() ) { case 0: // Room title Change { RString titleSub; titleSub = NSMAN->m_SMOnlinePacket.ReadNT() + "\n"; titleSub += NSMAN->m_SMOnlinePacket.ReadNT(); if( NSMAN->m_SMOnlinePacket.Read1() != 1 ) { RString SMOnlineSelectScreen = THEME->GetMetric( m_sName, "RoomSelectScreen" ); SCREENMAN->SetNewScreen( SMOnlineSelectScreen ); } } } } } done: // Must be at end, as so it is last resort for SMOnline packets. // If it doesn't know what to do, then it'll just remove them. ScreenNetSelectBase::HandleScreenMessage( SM ); }
void AutoKeysounds::LoadAutoplaySoundsInto( RageSoundReader_Chain *pChain ) { // // Load sounds. // Song* pSong = GAMESTATE->m_pCurSong; RString sSongDir = pSong->GetSongDir(); /* * Add all current autoplay sounds in both players to the chain. */ int iNumTracks = m_ndAutoKeysoundsOnly[GAMESTATE->GetMasterPlayerNumber()].GetNumTracks(); for( int t = 0; t < iNumTracks; t++ ) { int iRow = -1; while(1) { /* Find the next row that either player has a note on. */ int iNextRow = INT_MAX; FOREACH_EnabledPlayer(pn) { // XXX Hack. Enabled players need not have their own note data. if( t >= m_ndAutoKeysoundsOnly[pn].GetNumTracks() ) continue; int iNextRowForPlayer = iRow; /* XXX: If a BMS file only has one tap note per track, * this will prevent any keysounds from loading. * This leads to failure later on. * We need a better way to prevent this. */ if( m_ndAutoKeysoundsOnly[pn].GetNextTapNoteRowForTrack( t, iNextRowForPlayer ) ) iNextRow = min( iNextRow, iNextRowForPlayer ); } if( iNextRow == INT_MAX ) break; iRow = iNextRow; TapNote tn[NUM_PLAYERS]; FOREACH_EnabledPlayer(pn) tn[pn] = m_ndAutoKeysoundsOnly[pn].GetTapNote( t, iRow ); FOREACH_EnabledPlayer(pn) { if( tn[pn] == TAP_EMPTY ) continue; ASSERT( tn[pn].type == TapNoteType_AutoKeysound ); if( tn[pn].iKeysoundIndex >= 0 ) { RString sKeysoundFilePath = sSongDir + pSong->m_vsKeysoundFile[tn[pn].iKeysoundIndex]; float fSeconds = GAMESTATE->m_pCurSteps[pn]->GetTimingData()->GetElapsedTimeFromBeatNoOffset( NoteRowToBeat(iRow) ) + SOUNDMAN->GetPlayLatency(); float fPan = 0; // If two players are playing, pan the keysounds to each player's respective side if( GAMESTATE->GetNumPlayersEnabled() == 2 ) fPan = (pn == PLAYER_1)? -1.0f:+1.0f; int iIndex = pChain->LoadSound( sKeysoundFilePath ); pChain->AddSound( iIndex, fSeconds, fPan ); } } } } }