BeginnerHelper::BeginnerHelper() { m_bShowBackground = true; m_bInitialized = false; m_iLastRowChecked = m_iLastRowFlashed = 0; FOREACH_PlayerNumber( pn ) m_bPlayerEnabled[pn] = false; FOREACH_PlayerNumber( pn ) m_pDancer[pn] = new Model; m_pDancePad = new Model; }
void ScreenNetworkOptions::Init() { ScreenOptions::Init(); g_NetworkOptionsLines[PO_CONNECTION].choices.clear(); if ( NSMAN->useSMserver ) g_NetworkOptionsLines[PO_CONNECTION].choices.push_back("Disconnect from "+NSMAN->GetServerName()); else g_NetworkOptionsLines[PO_CONNECTION].choices.push_back("Connect..."); g_NetworkOptionsLines[PO_SERVER].choices.clear(); g_NetworkOptionsLines[PO_SERVER].choices.push_back("Stop"); g_NetworkOptionsLines[PO_SERVER].choices.push_back("Start..."); //Enable all lines for all players for ( unsigned int i = 0; i < NUM_NETWORK_OPTIONS_LINES; i++ ) FOREACH_PlayerNumber( pn ) g_NetworkOptionsLines[i].m_vEnabledForPlayers.insert( pn ); vector<OptionRowDefinition> vDefs( &g_NetworkOptionsLines[0], &g_NetworkOptionsLines[ARRAYSIZE(g_NetworkOptionsLines)] ); vector<OptionRowHandler*> vHands( vDefs.size(), NULL ); InitMenu( INPUTMODE_SHARE_CURSOR, vDefs, vHands ); SOUND->PlayMusic( THEME->GetPathS("ScreenMachineOptions","music") ); }
void OptionRow::LoadNormal( const OptionRowDefinition &def, OptionRowHandler *pHand, bool bFirstItemGoesDown ) { m_RowDef = def; m_RowType = OptionRow::ROW_NORMAL; m_pHand = pHand; m_bFirstItemGoesDown = bFirstItemGoesDown; if( m_pHand ) { FOREACH_CONST( CString, m_pHand->m_vsReloadRowMessages, m ) MESSAGEMAN->Subscribe( this, *m ); } FOREACH_PlayerNumber( p ) { vector<bool> &vbSelected = m_vbSelected[p]; vbSelected.resize( 0 ); vbSelected.resize( m_RowDef.choices.size(), false ); // set select the first item if a SELECT_ONE row if( vbSelected.size() && m_RowDef.selectType == SELECT_ONE ) vbSelected[0] = true; } // TRICKY: Insert a down arrow as the first choice in the row. if( m_bFirstItemGoesDown ) { m_RowDef.choices.insert( m_RowDef.choices.begin(), NEXT_ROW_NAME ); FOREACH_PlayerNumber( p ) m_vbSelected[p].insert( m_vbSelected[p].begin(), false ); } }
void ScreenJukeboxMenu::MenuStart( PlayerNumber pn ) { if( IsTransitioning() ) return; const Style *style = m_Selector.GetSelectedStyle(); CString sGroup = m_Selector.GetSelectedGroup(); Difficulty dc = m_Selector.GetSelectedDifficulty(); bool bModifiers = m_Selector.GetSelectedModifiers(); GAMESTATE->m_pCurStyle = style; GAMESTATE->m_sPreferredGroup = (sGroup=="ALL MUSIC") ? GROUP_ALL_MUSIC : sGroup; FOREACH_PlayerNumber( p ) GAMESTATE->m_PreferredDifficulty[p] = dc; GAMESTATE->m_bJukeboxUsesModifiers = bModifiers; if( !ScreenJukebox::SetSong(false) ) { /* No songs are available for the selected style, group, and difficulty. */ SCREENMAN->PlayInvalidSound(); SCREENMAN->SystemMessage( "No songs available with these settings" ); return; } SOUND->StopMusic(); SCREENMAN->PlayStartSound(); StartTransitioning( SM_GoToNextScreen ); }
void Steps::CalculateRadarValues( float fMusicLengthSeconds ) { // If we're autogen, don't calculate values. GetRadarValues will take from our parent. if( parent != NULL ) return; // Do write radar values, and leave it up to the reading app whether they want to trust // the cached values without recalculating them. /* // If we're an edit, leave the RadarValues invalid. if( IsAnEdit() ) return; */ NoteData tempNoteData; this->GetNoteData( tempNoteData ); FOREACH_PlayerNumber( pn ) m_CachedRadarValues[pn].Zero(); if( tempNoteData.IsComposite() ) { vector<NoteData> vParts; NoteDataUtil::SplitCompositeNoteData( tempNoteData, vParts ); for( size_t pn = 0; pn < min(vParts.size(), size_t(NUM_PLAYERS)); ++pn ) NoteDataUtil::CalculateRadarValues( vParts[pn], fMusicLengthSeconds, m_CachedRadarValues[pn] ); } else { NoteDataUtil::CalculateRadarValues( tempNoteData, fMusicLengthSeconds, m_CachedRadarValues[0] ); fill_n( m_CachedRadarValues + 1, NUM_PLAYERS-1, m_CachedRadarValues[0] ); } }
void ScreenSMOnlineLogin::Init() { ScreenOptions::Init(); m_iPlayer = 0; vector<OptionRowHandler*> vHands; OptionRowHandler *pHand = OptionRowHandlerUtil::MakeNull(); pHand->m_Def.m_sName = "Profile"; pHand->m_Def.m_bOneChoiceForAllPlayers = false; pHand->m_Def.m_bAllowThemeItems = false; pHand->m_Def.m_vEnabledForPlayers.clear(); FOREACH_PlayerNumber( pn ) pHand->m_Def.m_vEnabledForPlayers.insert( pn ); PROFILEMAN->GetLocalProfileDisplayNames( pHand->m_Def.m_vsChoices ); if( pHand->m_Def.m_vsChoices.empty() ) { // Give myself a message so that I can bail out later PostScreenMessage(SM_NoProfilesDefined, 0); SAFE_DELETE(pHand); } else vHands.push_back( pHand ); InitMenu( vHands ); SOUND->PlayMusic( THEME->GetPathS("ScreenOptionsServiceChild", "music")); OptionRow &row = *m_pRows.back(); row.SetExitText("Login"); }
ScreenSetTime::ScreenSetTime( CString sClassName ) : ScreenWithMenuElements( sClassName ) { LOG->Trace( "ScreenSetTime::ScreenSetTime()" ); m_Selection = hour; FOREACH_PlayerNumber( pn ) GAMESTATE->m_bSideIsJoined[pn] = true; FOREACH_SetTimeSelection( s ) { BitmapText &title = m_textTitle[s]; BitmapText &value = m_textValue[s]; title.LoadFromFont( THEME->GetPathToF("Common title") ); title.SetDiffuse( RageColor(1,1,1,1) ); title.SetText( SetTimeSelectionToString(s) ); title.SetXY( GetTitleX(s), GetTitleY(s) ); this->AddChild( &title ); value.LoadFromFont( THEME->GetPathToF("Common normal") ); value.SetDiffuse( RageColor(1,1,1,1) ); value.SetXY( GetValueX(s), GetValueY(s) ); this->AddChild( &value ); } m_TimeOffset = 0; m_Selection = (SetTimeSelection)0; ChangeSelection( 0 ); SOUND->PlayMusic( THEME->GetPathS(m_sName,"music") ); this->SortByDrawOrder(); }
void NetworkSyncManager::ReportPlayerOptions() { m_packet.ClearPacket(); m_packet.Write1( NSCUPOpts ); FOREACH_PlayerNumber (pn) m_packet.WriteNT( GAMESTATE->m_PlayerOptions[pn].GetString() ); NetPlayerClient->SendPack((char*)&m_packet.Data, m_packet.Position); }
void Steps::CalculateRadarValues( float fMusicLengthSeconds ) { // If we're autogen, don't calculate values. GetRadarValues will take from our parent. if( parent != NULL ) return; if( m_bAreCachedRadarValuesJustLoaded ) { m_bAreCachedRadarValuesJustLoaded = false; return; } // Do write radar values, and leave it up to the reading app whether they want to trust // the cached values without recalculating them. /* // If we're an edit, leave the RadarValues invalid. if( IsAnEdit() ) return; */ NoteData tempNoteData; this->GetNoteData( tempNoteData ); FOREACH_PlayerNumber( pn ) m_CachedRadarValues[pn].Zero(); GAMESTATE->SetProcessedTimingData(this->GetTimingData()); if( tempNoteData.IsComposite() ) { vector<NoteData> vParts; NoteDataUtil::SplitCompositeNoteData( tempNoteData, vParts ); for( size_t pn = 0; pn < min(vParts.size(), size_t(NUM_PLAYERS)); ++pn ) NoteDataUtil::CalculateRadarValues( vParts[pn], fMusicLengthSeconds, m_CachedRadarValues[pn] ); } else if (GAMEMAN->GetStepsTypeInfo(this->m_StepsType).m_StepsTypeCategory == StepsTypeCategory_Couple) { NoteData p1 = tempNoteData; // XXX: Assumption that couple will always have an even number of notes. const int tracks = tempNoteData.GetNumTracks() / 2; p1.SetNumTracks(tracks); NoteDataUtil::CalculateRadarValues(p1, fMusicLengthSeconds, m_CachedRadarValues[PLAYER_1]); // at this point, p2 is tempNoteData. NoteDataUtil::ShiftTracks(tempNoteData, tracks); tempNoteData.SetNumTracks(tracks); NoteDataUtil::CalculateRadarValues(tempNoteData, fMusicLengthSeconds, m_CachedRadarValues[PLAYER_2]); } else { NoteDataUtil::CalculateRadarValues( tempNoteData, fMusicLengthSeconds, m_CachedRadarValues[0] ); fill_n( m_CachedRadarValues + 1, NUM_PLAYERS-1, m_CachedRadarValues[0] ); } GAMESTATE->SetProcessedTimingData(NULL); }
ProfileManager::~ProfileManager() { // Unregister with Lua. LUA->UnsetGlobal( "PROFILEMAN" ); SAFE_DELETE( m_pMachineProfile ); FOREACH_PlayerNumber(pn) SAFE_DELETE( m_pMemoryCardProfile[pn] ); }
OptionRow::OptionRow() { m_pHand = NULL; Clear(); FOREACH_PlayerNumber( p ) m_Frame.AddChild( &m_OptionIcons[p] ); m_Frame.AddChild( &m_sprBullet ); m_Frame.AddChild( &m_textTitle ); this->AddChild( &m_Frame ); }
void ScreenSystemLayer::HandleMessage( const CString &sMessage ) { if( sMessage == "RefreshCreditText" ) { // update joined FOREACH_PlayerNumber( pn ) m_textCredits[pn].SetText( GetCreditsMessage(pn) ); } else if( sMessage == "SystemMessage" ) { m_sprMessageFrame->SetHidden( false ); m_sprMessageFrame->PlayCommand( "On" ); m_sprMessageFrame->PlayCommand( "Off" ); m_textMessage.SetHidden( false ); m_textMessage.SetText( SCREENMAN->GetCurrentSystemMessage() ); m_textMessage.PlayCommand( "On" ); m_textMessage.PlayCommand( "Off" ); } else if( sMessage == "SystemMessageNoAnimate" ) { m_sprMessageFrame->SetHidden( false ); m_sprMessageFrame->PlayCommand( "On" ); m_sprMessageFrame->FinishTweening(); m_sprMessageFrame->PlayCommand( "Off" ); m_textMessage.SetHidden( false ); m_textMessage.SetText( SCREENMAN->GetCurrentSystemMessage() ); m_textMessage.PlayCommand( "On" ); m_textMessage.FinishTweening(); m_textMessage.PlayCommand( "Off" ); } else if( sMessage == "HideSystemMessage" ) { m_sprMessageFrame->SetHidden( true ); m_textMessage.SetHidden( true ); } else if( sMessage == "OverlayMessage" ) { m_OverlayQuad.SetHidden( false ); m_OverlayText.SetText( SCREENMAN->GetCurrentOverlayMessage() ); m_OverlayText.SetHidden( false ); } else if( sMessage == "HideOverlayMessage" ) { m_OverlayQuad.SetHidden( true ); m_OverlayText.SetHidden( true ); } Screen::HandleMessage( sMessage ); }
ScreenUserPacks::~ScreenUserPacks() { LOG->Trace( "ScreenUserPacks::~ScreenUserPacks()" ); m_bStopThread = true; if (m_PlayerSongLoadThread.IsCreated()) m_PlayerSongLoadThread.Wait(); FOREACH_PlayerNumber( pn ) MEMCARDMAN->UnmountCard( pn ); // we sync on the end of each update. if ( m_bRestart ) HOOKS->SystemReboot( false ); }
ScreenEz2SelectPlayer::ScreenEz2SelectPlayer( CString sName ) : ScreenWithMenuElements( sName ) { // Unjoin the players, then let them join back in on this screen // GAMESTATE->m_bPlayersCanJoin = true; FOREACH_PlayerNumber( p ) GAMESTATE->m_bSideIsJoined[p] = false; LOG->Trace( "ScreenEz2SelectPlayer::ScreenEz2SelectPlayer()" ); m_Background.LoadFromAniDir( THEME->GetPathToB("ScreenEz2SelectPlayer background") ); this->AddChild( &m_Background ); // animated background =) FOREACH_PlayerNumber( p ) { m_sprJoinFrame[p].Load( THEME->GetPathToG("ScreenEz2SelectPlayer join frame 1x2") ); m_sprJoinFrame[p].StopAnimating(); m_sprJoinFrame[p].SetState( p ); m_sprJoinFrame[p].SetXY( JOIN_FRAME_X(p), JOIN_FRAME_Y(p) ); this->AddChild( &m_sprJoinFrame[p] ); if( GAMESTATE->m_bSideIsJoined[p] ) m_sprJoinFrame[p].SetZoomY( 0 ); m_sprJoinMessage[p].Load( THEME->GetPathToG("ScreenEz2SelectPlayer join message 2x2") ); m_sprJoinMessage[p].StopAnimating(); m_sprJoinMessage[p].SetState( p ); m_sprJoinMessage[p].SetXY( JOIN_MESSAGE_X(p), JOIN_MESSAGE_Y(p) ); if( BOUNCE_JOIN_MESSAGE ) m_sprJoinMessage[p].SetEffectBounce( 0.5f, RageVector3(0,10,0) ); this->AddChild( &m_sprJoinMessage[p] ); if( GAMESTATE->m_bSideIsJoined[p] ) { m_sprJoinMessage[p].SetState( p+NUM_PLAYERS ); if( FOLD_ON_JOIN ) { m_sprJoinMessage[p].SetZoomY( 0 ); m_sprJoinFrame[p].SetZoomY( 0 ); } } } SOUND->PlayOnceFromDir( ANNOUNCER->GetPathTo("select player intro") ); SOUND->PlayMusic( THEME->GetPathToS("ScreenSelectPlayer music") ); TweenOnScreen(); }
ProfileManager::ProfileManager() { m_pMachineProfile = new Profile; FOREACH_PlayerNumber(pn) m_pMemoryCardProfile[pn] = new Profile; // Register with Lua. { Lua *L = LUA->Get(); lua_pushstring( L, "PROFILEMAN" ); this->PushSelf( L ); lua_settable( L, LUA_GLOBALSINDEX ); LUA->Release( L ); } }
void ScreenArcadePatch::HandleScreenMessage( const ScreenMessage SM ) { if( SM == SM_GoToNextScreen ) { SCREENMAN->SetNewScreen( NEXT_SCREEN ); } else if( SM == SM_Reboot ) { // force an unmount, just in case. FOREACH_PlayerNumber( pn ) MEMCARDMAN->UnmountCard( pn ); // we explicitly synced. don't bother now. HOOKS->SystemReboot( false ); } }
void ScreenEditMenu::Init() { // HACK: Disable any style set by the editor. GAMESTATE->SetCurrentStyle( NULL, PLAYER_INVALID ); // Enable all players. FOREACH_PlayerNumber( pn ) GAMESTATE->JoinPlayer( pn ); // Edit mode DOES NOT WORK if the master player is not player 1. The same // is true of various parts of this poorly designed screen. -Kyz if(GAMESTATE->GetMasterPlayerNumber() != PLAYER_1) { LOG->Warn("Master player number was not player 1, forcing it to player 1 so that edit mode will work. If playing in edit mode doesn't work, this might be related."); GAMESTATE->SetMasterPlayerNumber(PLAYER_1); } ScreenWithMenuElements::Init(); m_Selector.SetName( "EditMenu" ); m_Selector.Load( EDIT_MENU_TYPE ); m_Selector.SetXY( 0, 0 ); this->AddChild( &m_Selector ); m_textExplanation.SetName( "Explanation" ); m_textExplanation.LoadFromFont( THEME->GetPathF(m_sName,"explanation") ); LOAD_ALL_COMMANDS_AND_SET_XY( m_textExplanation ); RefreshExplanationText(); this->AddChild( &m_textExplanation ); m_textNumStepsLoadedFromProfile.SetName( "NumStepsLoadedFromProfile" ); m_textNumStepsLoadedFromProfile.LoadFromFont( THEME->GetPathF(m_sName,"NumStepsLoadedFromProfile") ); LOAD_ALL_COMMANDS_AND_SET_XY_AND_ON_COMMAND( m_textNumStepsLoadedFromProfile ); RefreshNumStepsLoadedFromProfile(); this->AddChild( &m_textNumStepsLoadedFromProfile ); if(!m_Selector.SafeToUse()) { m_NoSongsMessage.SetName("NoSongsMessage"); m_NoSongsMessage.LoadFromFont(THEME->GetPathF(m_sName, "NoSongsMessage")); LOAD_ALL_COMMANDS_AND_SET_XY_AND_ON_COMMAND(m_NoSongsMessage); AddChild(&m_NoSongsMessage); m_Selector.SetVisible(false); m_textExplanation.SetVisible(false); m_textNumStepsLoadedFromProfile.SetVisible(false); } }
void ScreenOptionsMaster::Init() { vector<RString> asLineNames; split( LINE_NAMES, ",", asLineNames ); if( asLineNames.empty() ) { LuaHelpers::ReportScriptErrorFmt("\"%s:LineNames\" is empty.", m_sName.c_str()); } if( FORCE_ALL_PLAYERS ) { FOREACH_PlayerNumber( pn ) GAMESTATE->JoinPlayer( pn ); } if( NAVIGATION_MODE == "toggle" ) SetNavigation( PREFSMAN->m_iArcadeOptionsNavigation? NAV_TOGGLE_THREE_KEY:NAV_TOGGLE_FIVE_KEY ); else if( NAVIGATION_MODE == "menu" ) SetNavigation( NAV_THREE_KEY_MENU ); SetInputMode( StringToInputMode(INPUT_MODE) ); // Call this after enabling players, if any. ScreenOptions::Init(); vector<OptionRowHandler*> OptionRowHandlers; for( unsigned i = 0; i < asLineNames.size(); ++i ) { RString sLineName = asLineNames[i]; RString sRowCommands = LINE(sLineName); Commands cmds; ParseCommands( sRowCommands, cmds, false ); OptionRowHandler *pHand = OptionRowHandlerUtil::Make( cmds ); if( pHand == NULL ) { LuaHelpers::ReportScriptErrorFmt("Invalid OptionRowHandler \"%s\" in \"%s:Line:%s\".", cmds.GetOriginalCommandString().c_str(), m_sName.c_str(), sLineName.c_str()); } else { OptionRowHandlers.push_back( pHand ); } } InitMenu( OptionRowHandlers ); }
void ScreenEditMenu::Init() { // HACK: Disable any style set by the editor. GAMESTATE->SetCurrentStyle( NULL, PLAYER_INVALID ); // Enable all players. FOREACH_PlayerNumber( pn ) GAMESTATE->JoinPlayer( pn ); ScreenWithMenuElements::Init(); m_Selector.SetName( "EditMenu" ); m_Selector.Load( EDIT_MENU_TYPE ); m_Selector.SetXY( 0, 0 ); this->AddChild( &m_Selector ); m_textExplanation.SetName( "Explanation" ); m_textExplanation.LoadFromFont( THEME->GetPathF(m_sName,"explanation") ); LOAD_ALL_COMMANDS_AND_SET_XY( m_textExplanation ); RefreshExplanationText(); this->AddChild( &m_textExplanation ); m_textNumStepsLoadedFromProfile.SetName( "NumStepsLoadedFromProfile" ); m_textNumStepsLoadedFromProfile.LoadFromFont( THEME->GetPathF(m_sName,"NumStepsLoadedFromProfile") ); LOAD_ALL_COMMANDS_AND_SET_XY_AND_ON_COMMAND( m_textNumStepsLoadedFromProfile ); RefreshNumStepsLoadedFromProfile(); this->AddChild( &m_textNumStepsLoadedFromProfile ); if(!m_Selector.SafeToUse()) { m_NoSongsMessage.SetName("NoSongsMessage"); m_NoSongsMessage.LoadFromFont(THEME->GetPathF(m_sName, "NoSongsMessage")); LOAD_ALL_COMMANDS_AND_SET_XY_AND_ON_COMMAND(m_NoSongsMessage); AddChild(&m_NoSongsMessage); m_Selector.SetVisible(false); m_textExplanation.SetVisible(false); m_textNumStepsLoadedFromProfile.SetVisible(false); } }
ScreenEditCoursesMenu::ScreenEditCoursesMenu( const CString &sName ) : ScreenWithMenuElements( sName ) { LOG->Trace( "ScreenEditCoursesMenu::ScreenEditCoursesMenu()" ); /* Enable all players. */ FOREACH_PlayerNumber( pn ) GAMESTATE->m_bSideIsJoined[pn] = true; m_Selector.SetXY( 0, 0 ); // m_Selector.AllowNewNotes(); this->AddChild( &m_Selector ); m_textExplanation.SetName( "Explanation" ); m_textExplanation.LoadFromFont( THEME->GetPathToF("Common normal") ); SET_XY_AND_ON_COMMAND( m_textExplanation ); m_textExplanation.SetText( EXPLANATION_TEXT ); this->AddChild( &m_textExplanation ); this->SortByDrawOrder(); SOUND->PlayMusic( THEME->GetPathToS("ScreenEditCoursesMenu music") ); }
void OptionRow::LoadExit() { m_RowType = OptionRow::ROW_EXIT; m_RowDef.name = EXIT_NAME; m_RowDef.choices.push_back( "" ); BitmapText *bt = new BitmapText; m_textItems.push_back( bt ); bt->LoadFromFont( THEME->GetPathF(m_sType,"item") ); CString sText = "Exit"; PrepareItemText( sText ); bt->SetText( sText ); bt->RunCommands( ITEMS_ON_COMMAND ); bt->SetShadowLength( 0 ); bt->SetX( ITEMS_LONG_ROW_SHARED_X ); m_Frame.AddChild( bt ); FOREACH_PlayerNumber( p ) m_OptionIcons[p].SetHidden( true ); m_sprBullet.SetHidden( true ); m_textTitle.SetHidden( true ); }
void OptionRow::Clear() { ActorFrame::RemoveAllChildren(); FOREACH_PlayerNumber( p ) m_vbSelected[p].clear(); for( unsigned i = 0; i < m_textItems.size(); ++i ) SAFE_DELETE( m_textItems[i] ); m_textItems.clear(); FOREACH_PlayerNumber( p ) { for( unsigned i = 0; i < m_Underline[p].size(); ++i ) SAFE_DELETE( m_Underline[p][i] ); m_Underline[p].clear(); } ASSERT( m_pHand == NULL ); m_bFirstItemGoesDown = false; ZERO( m_bRowHasFocus ); ZERO( m_iChoiceInRowWithFocus ); }
void ScreenMiniMenu::AfterChangeValueOrRow( PlayerNumber pn ) { ScreenOptions::AfterChangeValueOrRow( pn ); vector<PlayerNumber> vpns; FOREACH_PlayerNumber( p ) vpns.push_back( p ); for( unsigned i=0; i<m_pRows.size(); i++ ) ExportOptions( i, vpns ); // Changing one option can affect whether other options are available. for( unsigned i=0; i<m_pRows.size(); i++ ) { const MenuRowDef &mr = m_vMenuRows[i]; if( mr.pfnEnabled ) { OptionRow &optrow = *m_pRows[i]; optrow.GetRowDef().m_vEnabledForPlayers.clear(); if( mr.pfnEnabled() ) optrow.GetRowDef().m_vEnabledForPlayers.insert( GAMESTATE->m_MasterPlayerNumber ); } m_pRows[i]->UpdateEnabledDisabled(); } }
void OptionRow::SetOneSharedSelection( int iChoice ) { FOREACH_PlayerNumber( pn ) SetOneSelection( pn, iChoice ); }
void OptionRow::Reload() { switch( GetRowType() ) { case OptionRow::ROW_NORMAL: { if( m_pHand == NULL ) return; vector<PlayerNumber> vpns; FOREACH_HumanPlayer( p ) vpns.push_back( p ); // TODO: Nothing uses this yet and it causes skips when changing options. //if( m_RowDef.m_bExportOnChange ) //{ // bool bRowHasFocus[NUM_PLAYERS]; // ZERO( bRowHasFocus ); // ExportOptions( vpns, bRowHasFocus ); //} m_pHand->Reload( m_RowDef ); ASSERT( !m_RowDef.choices.empty() ); FOREACH_PlayerNumber( p ) m_vbSelected[p].resize( m_RowDef.choices.size(), false ); // TODO: Nothing uses this yet and it causes skips when changing options. //ImportOptions( vpns ); switch( m_RowDef.selectType ) { case SELECT_ONE: FOREACH_HumanPlayer( p ) m_iChoiceInRowWithFocus[p] = GetOneSelection(p); break; case SELECT_MULTIPLE: FOREACH_HumanPlayer( p ) CLAMP( m_iChoiceInRowWithFocus[p], 0, m_RowDef.choices.size()-1 ); break; default: ASSERT(0); } // TODO: Nothing uses this yet and it causes skips when changing options. //if( m_RowDef.m_bExportOnChange ) //{ // bool bRowHasFocus[NUM_PLAYERS]; // ZERO( bRowHasFocus ); // ExportOptions( vpns, bRowHasFocus ); //} UpdateEnabledDisabled(); UpdateText(); FOREACH_HumanPlayer( p ) PositionUnderlines( p ); } break; case OptionRow::ROW_EXIT: // nothing to do break; default: ASSERT(0); } }
void ScreenOptionsMaster::Init() { ScreenOptions::Init(); // make sure volume is set to full in options, and menu lights are on ScreenAttract::SetAttractVolume( false ); LIGHTSMAN->SetLightsMode( LIGHTSMODE_MENU ); CStringArray asLineNames; split( LINE_NAMES, ",", asLineNames ); if( asLineNames.empty() ) RageException::Throw( "%s::LineNames is empty.", m_sName.c_str() ); CStringArray Flags; split( OPTION_MENU_FLAGS, ";", Flags, true ); InputMode im = INPUTMODE_INDIVIDUAL; for( unsigned i = 0; i < Flags.size(); ++i ) { CString sFlag = Flags[i]; sFlag.MakeLower(); if( sFlag == "together" ) im = INPUTMODE_SHARE_CURSOR; else if( sFlag == "explanations" ) ; else if( sFlag == "forceallplayers" ) { FOREACH_PlayerNumber( pn ) GAMESTATE->m_bSideIsJoined[pn] = true; GAMESTATE->m_MasterPlayerNumber = PlayerNumber(0); } else if( sFlag == "smnavigation" ) SetNavigation( NAV_THREE_KEY_MENU ); else if( sFlag == "toggle" || sFlag == "firstchoicegoesdown" ) SetNavigation( PREFSMAN->m_bArcadeOptionsNavigation? NAV_TOGGLE_THREE_KEY:NAV_TOGGLE_FIVE_KEY ); else RageException::Throw( "Unknown flag \"%s\"", sFlag.c_str() ); } vector<OptionRowDefinition> OptionRowDefs; OptionRowDefs.resize( asLineNames.size() ); OptionRowHandlers.resize( asLineNames.size() ); for( unsigned i = 0; i < asLineNames.size(); ++i ) { CString sLineName = asLineNames[i]; OptionRowDefinition &def = OptionRowDefs[i]; CString sRowCommands = LINE(sLineName); OptionRowHandler* &pHand = OptionRowHandlers[i]; pHand = NULL; Commands vCommands; ParseCommands( sRowCommands, vCommands ); if( vCommands.v.size() != 1 ) RageException::Throw( "Parse error in %s::Line%s", m_sName.c_str(), sLineName.c_str() ); Command& command = vCommands.v[0]; pHand = OptionRowHandlerUtil::Make( command, def ); if( pHand == NULL ) RageException::Throw( "Invalid OptionRowHandler '%s' in %s::%s", command.GetOriginalCommandString().c_str(), m_sName.c_str(), sLineName.c_str() ); } ASSERT( OptionRowHandlers.size() == asLineNames.size() ); InitMenu( im, OptionRowDefs, OptionRowHandlers ); }
void ScreenJukebox::SetSong() { ThemeMetric<bool> ALLOW_ADVANCED_MODIFIERS(m_sName,"AllowAdvancedModifiers"); vector<Song*> vSongs; /* Check to see if there is a theme course. If there is a course that has * the exact same name as the theme, then we pick a song from this course. */ Course *pCourse = SONGMAN->GetCourseFromName( THEME->GetCurThemeName() ); if( pCourse != NULL ) for ( unsigned i = 0; i < pCourse->m_vEntries.size(); i++ ) if( pCourse->m_vEntries[i].IsFixedSong() ) vSongs.push_back( pCourse->m_vEntries[i].songID.ToSong() ); if ( vSongs.size() == 0 ) vSongs = SONGMAN->GetSongs( GAMESTATE->m_sPreferredSongGroup ); // Still nothing? if( vSongs.size() == 0 ) return; // Calculate what difficulties to show vector<Difficulty> vDifficultiesToShow; if( m_bDemonstration ) { // HACK: This belongs in ScreenDemonstration. ThemeMetricDifficultiesToShow DIFFICULTIES_TO_SHOW_HERE(m_sName,"DifficultiesToShow"); vDifficultiesToShow = DIFFICULTIES_TO_SHOW_HERE.GetValue(); } else { if( GAMESTATE->m_PreferredDifficulty[PLAYER_1] != Difficulty_Invalid ) { vDifficultiesToShow.push_back( GAMESTATE->m_PreferredDifficulty[PLAYER_1] ); } else { FOREACH_ENUM( Difficulty, dc ) vDifficultiesToShow.push_back( dc ); } } ASSERT( !vDifficultiesToShow.empty() ); // Search for a Song and Steps to play during the demo. for( int i=0; i<1000; i++ ) { Song* pSong = vSongs[RandomInt(vSongs.size())]; ASSERT( pSong != NULL ); if( !pSong->HasMusic() ) continue; // skip if( !pSong->NormallyDisplayed() ) continue; if( !pSong->ShowInDemonstrationAndRanking() ) continue; // skip Difficulty dc = vDifficultiesToShow[ RandomInt(vDifficultiesToShow.size()) ]; Steps* pSteps = SongUtil::GetStepsByDifficulty( pSong, GAMESTATE->GetCurrentStyle()->m_StepsType, dc ); if( pSteps == NULL ) continue; // skip if( !PREFSMAN->m_bAutogenSteps && pSteps->IsAutogen()) continue; // skip // Found something we can use! GAMESTATE->m_pCurSong.Set( pSong ); // We just changed the song. Reset the original sync data. AdjustSync::ResetOriginalSyncData(); FOREACH_PlayerNumber( p ) GAMESTATE->m_pCurSteps[p].Set( pSteps ); bool bShowModifiers = randomf(0,1) <= SHOW_COURSE_MODIFIERS_PROBABILITY; if( bShowModifiers ) { /* If we have a modifier course containing this song, apply its * modifiers. Only check fixed course entries. */ vector<Course*> apCourses; SONGMAN->GetAllCourses( apCourses, false ); vector<const CourseEntry *> apOptions; vector<Course*> apPossibleCourses; for( unsigned j = 0; j < apCourses.size(); ++j ) { Course *lCourse = apCourses[j]; const CourseEntry *pEntry = lCourse->FindFixedSong( pSong ); if( pEntry == NULL || pEntry->attacks.size() == 0 ) continue; if( !ALLOW_ADVANCED_MODIFIERS ) { // There are some confusing mods that we don't want to show in demonstration. bool bModsAreOkToShow = true; AttackArray aAttacks = pEntry->attacks; if( !pEntry->sModifiers.empty() ) aAttacks.push_back( Attack::FromGlobalCourseModifier( pEntry->sModifiers ) ); FOREACH_CONST( Attack, aAttacks, a ) { RString s = a->sModifiers; s.MakeLower(); // todo: allow themers to modify this list? -aj if( s.find("dark") != string::npos || s.find("stealth") != string::npos ) { bModsAreOkToShow = false; break; } } if( !bModsAreOkToShow ) continue; // skip } apOptions.push_back( pEntry ); apPossibleCourses.push_back( pCourse ); } if( !apOptions.empty() ) { int iIndex = RandomInt( apOptions.size() ); m_pCourseEntry = apOptions[iIndex]; Course *lCourse = apPossibleCourses[iIndex]; PlayMode pm = CourseTypeToPlayMode( lCourse->GetCourseType() ); GAMESTATE->m_PlayMode.Set( pm ); GAMESTATE->m_pCurCourse.Set( lCourse ); FOREACH_PlayerNumber( p ) { GAMESTATE->m_pCurTrail[p].Set( lCourse->GetTrail( GAMESTATE->GetCurrentStyle()->m_StepsType ) ); ASSERT( GAMESTATE->m_pCurTrail[p] != NULL ); } }
void ScreenOptions::Init() { NUM_ROWS_SHOWN.Load( m_sName, "NumRowsShown" ); ROW_INIT_COMMAND.Load( m_sName, "RowInitCommand" ); ROW_ON_COMMAND.Load( m_sName, "RowOnCommand" ); ROW_OFF_COMMAND.Load( m_sName, "RowOffCommand" ); SHOW_SCROLL_BAR.Load( m_sName, "ShowScrollBar" ); SCROLL_BAR_HEIGHT.Load( m_sName, "ScrollBarHeight" ); SCROLL_BAR_TIME.Load( m_sName, "ScrollBarTime" ); LINE_HIGHLIGHT_X.Load( m_sName, "LineHighlightX" ); SHOW_EXIT_ROW.Load( m_sName, "ShowExitRow" ); SEPARATE_EXIT_ROW.Load( m_sName, "SeparateExitRow" ); SEPARATE_EXIT_ROW_Y.Load( m_sName, "SeparateExitRowY" ); SHOW_EXPLANATIONS.Load( m_sName, "ShowExplanations" ); ALLOW_REPEATING_CHANGE_VALUE_INPUT.Load( m_sName, "AllowRepeatingChangeValueInput" ); CURSOR_TWEEN_SECONDS.Load( m_sName, "CursorTweenSeconds" ); WRAP_VALUE_IN_ROW.Load( m_sName, "WrapValueInRow" ); OPTION_ROW_NORMAL_METRICS_GROUP.Load( m_sName, "OptionRowNormalMetricsGroup" ); OPTION_ROW_EXIT_METRICS_GROUP.Load( m_sName, "OptionRowExitMetricsGroup" ); m_exprRowPositionTransformFunction.SetFromReference( THEME->GetMetricR(m_sName,"RowPositionTransformFunction") ); ScreenWithMenuElements::Init(); m_SoundChangeCol.Load( THEME->GetPathS(m_sName,"change"), true ); m_SoundNextRow.Load( THEME->GetPathS(m_sName,"next"), true ); m_SoundPrevRow.Load( THEME->GetPathS(m_sName,"prev"), true ); m_SoundToggleOn.Load( THEME->GetPathS(m_sName,"toggle on"), true ); m_SoundToggleOff.Load( THEME->GetPathS(m_sName,"toggle off"), true ); m_SoundStart.Load( THEME->GetPathS(m_sName,"start"), true ); // add everything to m_frameContainer so we can animate everything at once m_frameContainer.SetName( "Container" ); LOAD_ALL_COMMANDS( m_frameContainer ); this->AddChild( &m_frameContainer ); m_sprPage.Load( THEME->GetPathG(m_sName,"page") ); m_sprPage->SetName( "Page" ); LOAD_ALL_COMMANDS_AND_SET_XY( m_sprPage ); m_frameContainer.AddChild( m_sprPage ); // init line highlights FOREACH_PlayerNumber( p ) { m_sprLineHighlight[p].Load( THEME->GetPathG(m_sName, ssprintf("LineHighlight P%d",p+1)) ); m_sprLineHighlight[p]->SetName( ssprintf("LineHighlightP%d",p+1) ); m_sprLineHighlight[p]->SetX( LINE_HIGHLIGHT_X ); LOAD_ALL_COMMANDS( m_sprLineHighlight[p] ); m_frameContainer.AddChild( m_sprLineHighlight[p] ); } // init cursors FOREACH_PlayerNumber( p ) { m_Cursor[p].Load( "OptionsCursor" + PlayerNumberToString(p), true ); m_Cursor[p].SetName( "Cursor" ); LOAD_ALL_COMMANDS( m_Cursor[p] ); m_frameContainer.AddChild( &m_Cursor[p] ); } switch( m_InputMode ) { case INPUTMODE_INDIVIDUAL: FOREACH_PlayerNumber( p ) { m_textExplanation[p].LoadFromFont( THEME->GetPathF(m_sName,"explanation") ); m_textExplanation[p].SetDrawOrder( 2 ); m_textExplanation[p].SetName( "Explanation" + PlayerNumberToString(p) ); LOAD_ALL_COMMANDS_AND_SET_XY( m_textExplanation[p] ); m_frameContainer.AddChild( &m_textExplanation[p] ); } break; case INPUTMODE_SHARE_CURSOR: m_textExplanationTogether.LoadFromFont( THEME->GetPathF(m_sName,"explanation") ); m_textExplanationTogether.SetDrawOrder( 2 ); m_textExplanationTogether.SetName( "ExplanationTogether" ); LOAD_ALL_COMMANDS_AND_SET_XY( m_textExplanationTogether ); m_frameContainer.AddChild( &m_textExplanationTogether ); break; default: FAIL_M(ssprintf("Invalid InputMode: %i", m_InputMode)); } if( SHOW_SCROLL_BAR ) { m_ScrollBar.SetName( "ScrollBar" ); m_ScrollBar.SetBarHeight( SCROLL_BAR_HEIGHT ); m_ScrollBar.SetBarTime( SCROLL_BAR_TIME ); m_ScrollBar.Load( "DualScrollBar" ); FOREACH_PlayerNumber( p ) m_ScrollBar.EnablePlayer( p, GAMESTATE->IsHumanPlayer(p) ); LOAD_ALL_COMMANDS_AND_SET_XY( m_ScrollBar ); m_ScrollBar.SetDrawOrder( 2 ); m_frameContainer.AddChild( &m_ScrollBar ); } m_sprMore.Load( THEME->GetPathG( m_sName,"more") ); m_sprMore->SetName( "More" ); LOAD_ALL_COMMANDS_AND_SET_XY( m_sprMore ); m_sprMore->SetDrawOrder( 2 ); m_sprMore->PlayCommand( "LoseFocus" ); m_frameContainer.AddChild( m_sprMore ); m_OptionRowTypeNormal.Load( OPTION_ROW_NORMAL_METRICS_GROUP, this ); m_OptionRowTypeExit.Load( OPTION_ROW_EXIT_METRICS_GROUP, this ); }
BeginnerHelper::~BeginnerHelper() { FOREACH_PlayerNumber( pn ) delete m_pDancer[pn]; delete m_pDancePad; }
ScreenNameEntry::ScreenNameEntry( CString sClassName ) : Screen( sClassName ) { LOG->Trace( "ScreenNameEntry::ScreenNameEntry()" ); // update cache g_fCharsZoomSmall = CHARS_ZOOM_SMALL; g_fCharsZoomLarge = CHARS_ZOOM_LARGE; g_fCharsSpacingY = CHARS_SPACING_Y; g_ScrollingCharsColor = SCROLLING_CHARS_COLOR; g_SelectedCharsColor = SELECTED_CHARS_COLOR; g_fReceptorArrowsY = GRAY_ARROWS_Y; g_iNumCharsToDrawBehind = NUM_CHARS_TO_DRAW_BEHIND; g_iNumCharsToDrawTotal = NUM_CHARS_TO_DRAW_TOTAL; g_fFakeBeatsPerSec = FAKE_BEATS_PER_SEC; // DEBUGGING STUFF // GAMESTATE->m_CurGame = GAME_DANCE; // GAMESTATE->m_CurStyle = STYLE_DANCE_SINGLE; // GAMESTATE->m_PlayMode = PLAY_MODE_REGULAR; // GAMESTATE->m_bSideIsJoined[PLAYER_1] = true; // GAMESTATE->m_MasterPlayerNumber = PLAYER_1; // GAMESTATE->m_RankingCategory[PLAYER_1] = RANKING_A; // GAMESTATE->m_iRankingIndex[PLAYER_1] = 0; /* Save options. We'll reset them to display letters, and we must put them * back when we're done. */ GAMESTATE->StoreSelectedOptions(); // reset Player and Song Options { FOREACH_PlayerNumber( p ) GAMESTATE->m_pPlayerState[p]->m_PlayerOptions = PlayerOptions(); GAMESTATE->m_SongOptions = SongOptions(); } vector<GameState::RankingFeat> aFeats[NUM_PLAYERS]; // Find out if players deserve to enter their name FOREACH_PlayerNumber( p ) { GAMESTATE->GetRankingFeats( p, aFeats[p] ); m_bStillEnteringName[p] = aFeats[p].size()>0; } if( !AnyStillEntering() ) { /* Nobody made a high score. */ HandleScreenMessage( SM_GoToNextScreen ); return; } bool IsOnRanking = ( (GAMESTATE->m_PlayMode == PLAY_MODE_NONSTOP || GAMESTATE->m_PlayMode == PLAY_MODE_ONI) && !(GAMESTATE->m_pCurCourse->IsRanking()) ); if( PREFSMAN->m_GetRankingName == PrefsManager::RANKING_OFF || (PREFSMAN->m_GetRankingName == PrefsManager::RANKING_LIST && !IsOnRanking) ) { // don't collect score due to ranking setting HandleScreenMessage( SM_GoToNextScreen ); return; } GAMESTATE->m_bPastHereWeGo = true; // enable the gray arrows FOREACH_PlayerNumber( p ) { // load last used ranking name if any Profile* pProfile = PROFILEMAN->GetProfile(p); if( pProfile && !pProfile->m_sLastUsedHighScoreName.empty() ) m_sSelectedName[p] = pProfile->m_sLastUsedHighScoreName; // resize string to MAX_RANKING_NAME_LENGTH m_sSelectedName[p] = ssprintf( "%*.*s", MAX_RANKING_NAME_LENGTH, MAX_RANKING_NAME_LENGTH, m_sSelectedName[p].c_str() ); ASSERT( (int) m_sSelectedName[p].length() == MAX_RANKING_NAME_LENGTH ); // don't load player if they aren't going to enter their name if( !m_bStillEnteringName[p] ) continue; // skip // remove modifiers that may have been on the last song GAMESTATE->m_pPlayerState[p]->m_PlayerOptions = PlayerOptions(); ASSERT( GAMESTATE->IsHumanPlayer(p) ); // they better be enabled if they made a high score! float fPlayerX = PLAYER_X(p,GAMESTATE->GetCurrentStyle()->m_StyleType); { LockNoteSkin l( GAMESTATE->m_pPlayerState[p]->m_PlayerOptions.m_sNoteSkin ); m_ReceptorArrowRow[p].Load( GAMESTATE->m_pPlayerState[p], 0 ); m_ReceptorArrowRow[p].SetX( fPlayerX ); m_ReceptorArrowRow[p].SetY( SCREEN_TOP + 100 ); this->AddChild( &m_ReceptorArrowRow[p] ); } const Style* pStyle = GAMESTATE->GetCurrentStyle(); m_ColToStringIndex[p].insert(m_ColToStringIndex[p].begin(), pStyle->m_iColsPerPlayer, -1); int CurrentStringIndex = 0; for( int t=0; t<pStyle->m_iColsPerPlayer; t++ ) { if(CurrentStringIndex == MAX_RANKING_NAME_LENGTH) continue; /* We have enough columns. */ /* Find out if this column is associated with the START menu button. */ StyleInput si(p, t); GameInput gi=GAMESTATE->GetCurrentStyle()->StyleInputToGameInput(si); MenuInput m=GAMESTATE->GetCurrentGame()->GameInputToMenuInput(gi); if(m.button == MENU_BUTTON_START) continue; m_ColToStringIndex[p][t] = CurrentStringIndex++; float ColX = fPlayerX + pStyle->m_ColumnInfo[p][t].fXOffset; m_textSelectedChars[p][t].LoadFromFont( THEME->GetPathF("ScreenNameEntry","letters") ); m_textSelectedChars[p][t].SetX( ColX ); m_textSelectedChars[p][t].SetY( GRAY_ARROWS_Y ); m_textSelectedChars[p][t].SetDiffuse( g_SelectedCharsColor ); m_textSelectedChars[p][t].SetZoom( CHARS_ZOOM_LARGE ); if( t < (int)m_sSelectedName[p].length() ) m_textSelectedChars[p][t].SetText( m_sSelectedName[p].substr(t,1) ); this->AddChild( &m_textSelectedChars[p][t] ); // draw these manually m_textScrollingChars[p][t].LoadFromFont( THEME->GetPathF("ScreenNameEntry","letters") ); m_textScrollingChars[p][t].SetX( ColX ); m_textScrollingChars[p][t].SetY( GRAY_ARROWS_Y ); m_textScrollingChars[p][t].SetDiffuse( g_ScrollingCharsColor ); //this->AddChild( &m_textScrollingChars[p][t] ); // draw these manually } m_textCategory[p].LoadFromFont( THEME->GetPathF("ScreenNameEntry","category") ); m_textCategory[p].SetX( fPlayerX ); m_textCategory[p].SetY( CATEGORY_Y ); m_textCategory[p].SetZoom( CATEGORY_ZOOM ); CString joined; for( unsigned j = 0; j < aFeats[p].size(); ++j ) { if( j ) joined += "\n"; joined += aFeats[p][j].Feat; } m_textCategory[p].SetText( joined ); this->AddChild( &m_textCategory[p] ); } if( !PREFSMAN->m_bMenuTimer ) m_Timer.Disable(); else m_Timer.SetSeconds(TIMER_SECONDS); m_Timer.SetXY( TIMER_X, TIMER_Y ); this->AddChild( &m_Timer ); m_In.Load( THEME->GetPathB("ScreenNameEntry","in") ); m_In.StartTransitioning(); // this->AddChild( &m_In ); // draw and update this manually too m_Out.Load( THEME->GetPathB("ScreenNameEntry","out") ); // this->AddChild( &m_Out ); // draw and update this manually too m_soundStep.Load( THEME->GetPathS("ScreenNameEntry","step") ); SOUND->PlayMusic( THEME->GetPathS("ScreenNameEntry","music") ); m_fFakeBeat = 0; }