Files
itgmania212121/stepmania/src/ScreenSelectGroup.cpp
T

308 lines
8.8 KiB
C++
Raw Normal View History

2003-02-16 04:01:45 +00:00
#include "global.h"
2002-05-20 08:59:37 +00:00
/*
-----------------------------------------------------------------------------
2002-08-01 13:42:56 +00:00
Class: ScreenSelectGroup
2002-05-20 08:59:37 +00:00
Desc: See header.
Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved.
Chris Danford
-----------------------------------------------------------------------------
*/
#include "ScreenSelectGroup.h"
#include "ScreenManager.h"
#include "PrefsManager.h"
#include "GameManager.h"
#include "RageLog.h"
#include "GameConstantsAndTypes.h"
#include "SongManager.h"
#include "AnnouncerManager.h"
2002-07-23 01:41:40 +00:00
#include "GameState.h"
2003-01-02 07:54:28 +00:00
#include "RageSoundManager.h"
#include "ThemeManager.h"
#include <map>
#define FRAME_ON_COMMAND THEME->GetMetric ("ScreenSelectGroup","FrameOnCommand")
#define FRAME_OFF_COMMAND THEME->GetMetric ("ScreenSelectGroup","FrameOffCommand")
#define BANNER_ON_COMMAND THEME->GetMetric ("ScreenSelectGroup","BannerOnCommand")
#define BANNER_OFF_COMMAND THEME->GetMetric ("ScreenSelectGroup","BannerOffCommand")
#define BANNER_WIDTH THEME->GetMetricF("ScreenSelectGroup","BannerWidth")
#define BANNER_HEIGHT THEME->GetMetricF("ScreenSelectGroup","BannerHeight")
#define NUMBER_ON_COMMAND THEME->GetMetric ("ScreenSelectGroup","NumberOnCommand")
#define NUMBER_OFF_COMMAND THEME->GetMetric ("ScreenSelectGroup","NumberOffCommand")
#define EXPLANATION_ON_COMMAND THEME->GetMetric ("ScreenSelectGroup","ExplanationOnCommand")
#define EXPLANATION_OFF_COMMAND THEME->GetMetric ("ScreenSelectGroup","ExplanationOffCommand")
#define CONTENTS_ON_COMMAND THEME->GetMetric ("ScreenSelectGroup","ContentsOnCommand")
#define CONTENTS_OFF_COMMAND THEME->GetMetric ("ScreenSelectGroup","ContentsOffCommand")
#define MUSIC_LIST_ON_COMMAND THEME->GetMetric ("ScreenSelectGroup","MusicListOnCommand")
#define MUSIC_LIST_OFF_COMMAND THEME->GetMetric ("ScreenSelectGroup","MusicListOffCommand")
#define GROUP_LIST_ON_COMMAND THEME->GetMetric ("ScreenSelectGroup","GroupListOnCommand")
#define GROUP_LIST_OFF_COMMAND THEME->GetMetric ("ScreenSelectGroup","GroupListOnCommand")
#define HELP_TEXT THEME->GetMetric ("ScreenSelectGroup","HelpText")
#define TIMER_SECONDS THEME->GetMetricI("ScreenSelectGroup","TimerSeconds")
#define NEXT_SCREEN THEME->GetMetric ("ScreenSelectGroup","NextScreen")
2002-05-20 08:59:37 +00:00
ScreenSelectGroup::ScreenSelectGroup()
2003-03-09 00:55:49 +00:00
{
LOG->Trace( "ScreenSelectGroup::ScreenSelectGroup()" );
2003-03-09 00:55:49 +00:00
if( !PREFSMAN->m_bShowSelectGroup )
{
2003-02-25 00:33:42 +00:00
GAMESTATE->m_sPreferredGroup = GROUP_ALL_MUSIC;
2003-03-09 00:55:49 +00:00
HandleScreenMessage( SM_GoToNextScreen );
return;
}
2003-03-09 00:55:49 +00:00
m_Menu.Load( "ScreenSelectGroup" );
this->AddChild( &m_Menu );
unsigned i;
int j;
// The new process by which the group and song lists are formed
// is bizarre and complex but yields the end result that songs
// and groups that do not contain any steps for the current
// style (such as solo) are omitted. Bear with me!
// -- dro kulix
2002-08-18 23:20:18 +00:00
vector<Song*> aAllSongs;
SONGMAN->GetSongs( aAllSongs );
2002-08-18 23:20:18 +00:00
// Filter out Songs that can't be played by the current Style
for( j=aAllSongs.size()-1; j>=0; j-- ) // foreach Song, back to front
2002-08-18 23:20:18 +00:00
{
if( aAllSongs[j]->SongCompleteForStyle(GAMESTATE->GetCurrentStyleDef()) &&
aAllSongs[j]->NormallyDisplayed() )
continue;
2002-10-31 04:11:08 +00:00
aAllSongs.erase( aAllSongs.begin()+j, aAllSongs.begin()+j+1 );
2002-08-18 23:20:18 +00:00
}
// Add all group names to a map.
std::map<CString, CString> mapGroupNames;
for( i=0; i<aAllSongs.size(); i++ )
{
const CString& sGroupName = aAllSongs[i]->m_sGroupName;
mapGroupNames[ sGroupName ] = ""; // group name maps to nothing
2002-09-07 06:46:18 +00:00
}
// copy group names into a vector
std::vector<CString> asGroupNames;
2003-02-25 00:33:42 +00:00
asGroupNames.push_back( "ALL MUSIC" ); // special group
for( std::map<CString, CString>::const_iterator iter = mapGroupNames.begin(); iter != mapGroupNames.end(); ++iter )
asGroupNames.push_back( iter->first );
// Add songs to the MusicList.
2002-10-31 04:36:35 +00:00
for( unsigned g=0; g < asGroupNames.size(); g++ ) /* for each group */
2002-08-18 23:20:18 +00:00
{
2003-01-03 05:56:28 +00:00
vector<Song*> aSongsInGroup;
/* find all songs */
for( i=0; i<aAllSongs.size(); i++ ) // foreach Song
{
2002-08-24 20:36:29 +00:00
/* group 0 gets all songs */
2002-10-31 04:36:35 +00:00
if( g != 0 && aAllSongs[i]->m_sGroupName != asGroupNames[g] )
continue;
2002-10-31 04:23:39 +00:00
aSongsInGroup.push_back( aAllSongs[i] );
2002-08-18 23:20:18 +00:00
}
SortSongPointerArrayByTitle( aSongsInGroup );
m_MusicList.AddGroup();
m_MusicList.AddSongsToGroup(aSongsInGroup);
}
2002-05-20 08:59:37 +00:00
m_bChosen = false;
2003-03-09 00:55:49 +00:00
m_sprExplanation.Load( THEME->GetPathTo("Graphics","ScreenSelectGroup explanation") );
m_sprExplanation.Command( EXPLANATION_ON_COMMAND );
this->AddChild( &m_sprExplanation );
2002-05-20 08:59:37 +00:00
// these guys get loaded SetSong and TweenToSong
m_Banner.SetXY( 640, 240 );
m_Banner.SetCroppedSize( BANNER_WIDTH, BANNER_HEIGHT );
this->AddChild( &m_Banner );
2002-05-20 08:59:37 +00:00
2003-03-09 00:55:49 +00:00
m_sprFrame.Load( THEME->GetPathTo("Graphics","ScreenSelectGroup frame") );
m_sprFrame.Command( FRAME_ON_COMMAND );
this->AddChild( &m_sprFrame );
2003-03-09 00:55:49 +00:00
m_textNumber.LoadFromNumbers( THEME->GetPathTo("Numbers","ScreenSelectGroup numbers") );
m_textNumber.Command( NUMBER_ON_COMMAND );
this->AddChild( &m_textNumber );
2003-03-09 00:55:49 +00:00
m_sprContents.Load( THEME->GetPathTo("Graphics","ScreenSelectGroup contents") );
m_sprContents.Command( CONTENTS_ON_COMMAND );
this->AddChild( &m_sprContents );
2002-05-20 08:59:37 +00:00
m_MusicList.Command( MUSIC_LIST_ON_COMMAND );
this->AddChild( &m_MusicList );
2002-08-24 20:36:29 +00:00
m_GroupList.Load( asGroupNames );
m_GroupList.Command( GROUP_LIST_ON_COMMAND );
this->AddChild( &m_GroupList );
2002-05-20 08:59:37 +00:00
2003-03-09 00:55:49 +00:00
m_soundChange.Load( THEME->GetPathTo("Sounds","ScreenSelectGroup change") );
m_soundSelect.Load( THEME->GetPathTo("Sounds","Common start") );
2002-05-20 08:59:37 +00:00
2003-01-02 08:13:34 +00:00
SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("select group intro") );
2002-05-20 08:59:37 +00:00
2003-03-09 00:55:49 +00:00
SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds","ScreenSelectGroup music") );
2002-05-20 08:59:37 +00:00
TweenOnScreen();
AfterChange();
2002-08-24 20:36:29 +00:00
m_GroupList.SetSelection(0);
2002-05-20 08:59:37 +00:00
}
ScreenSelectGroup::~ScreenSelectGroup()
{
LOG->Trace( "ScreenSelectGroup::~ScreenSelectGroup()" );
2002-05-20 08:59:37 +00:00
}
void ScreenSelectGroup::Input( const DeviceInput& DeviceI, const InputEventType type, const GameInput &GameI, const MenuInput &MenuI, const StyleInput &StyleI )
{
LOG->Trace( "ScreenSelectGroup::Input()" );
2002-05-20 08:59:37 +00:00
2003-03-09 00:55:49 +00:00
if( m_Menu.IsTransitioning() )
2002-05-20 08:59:37 +00:00
return;
Screen::Input( DeviceI, type, GameI, MenuI, StyleI ); // default input handler
}
void ScreenSelectGroup::DrawPrimitives()
{
m_Menu.DrawBottomLayer();
Screen::DrawPrimitives();
m_Menu.DrawTopLayer();
}
void ScreenSelectGroup::HandleScreenMessage( const ScreenMessage SM )
{
switch( SM )
{
2002-05-27 08:23:27 +00:00
case SM_MenuTimer:
MenuStart(PLAYER_1);
break;
case SM_GoToPrevScreen:
SCREENMAN->SetNewScreen( "ScreenTitleMenu" );
2002-05-20 08:59:37 +00:00
break;
case SM_GoToNextScreen:
2002-08-28 22:42:40 +00:00
SCREENMAN->SetNewScreen( NEXT_SCREEN );
2002-05-20 08:59:37 +00:00
break;
}
}
void ScreenSelectGroup::AfterChange()
{
2002-08-24 20:36:29 +00:00
int sel = m_GroupList.GetSelection();
m_MusicList.SetGroupNo(sel);
2002-05-20 08:59:37 +00:00
2002-08-24 20:36:29 +00:00
CString sSelectedGroupName = m_GroupList.GetSelectionName();
2002-05-20 08:59:37 +00:00
CString sGroupBannerPath;
2003-02-25 00:33:42 +00:00
if( sSelectedGroupName == GROUP_ALL_MUSIC )
2003-03-09 00:55:49 +00:00
m_Banner.LoadAllMusic();
else
m_Banner.LoadFromGroup( sSelectedGroupName );
2002-05-20 08:59:37 +00:00
const int iNumSongs = m_MusicList.GetNumSongs();
m_textNumber.SetText( ssprintf("%d", iNumSongs) );
2002-05-20 08:59:37 +00:00
}
void ScreenSelectGroup::MenuLeft( PlayerNumber pn )
2002-05-20 08:59:37 +00:00
{
MenuUp( pn );
2002-05-20 08:59:37 +00:00
}
void ScreenSelectGroup::MenuRight( PlayerNumber pn )
2002-05-20 08:59:37 +00:00
{
MenuDown( pn );
2002-05-20 08:59:37 +00:00
}
void ScreenSelectGroup::MenuUp( PlayerNumber pn )
2002-05-20 08:59:37 +00:00
{
if( m_bChosen )
return;
2002-08-24 20:36:29 +00:00
m_GroupList.Up();
2002-05-20 08:59:37 +00:00
AfterChange();
m_soundChange.PlayRandom();
}
void ScreenSelectGroup::MenuDown( PlayerNumber pn )
2002-05-20 08:59:37 +00:00
{
if( m_bChosen )
return;
2002-08-24 20:36:29 +00:00
m_GroupList.Down();
2002-05-20 08:59:37 +00:00
AfterChange();
m_soundChange.PlayRandom();
}
void ScreenSelectGroup::MenuStart( PlayerNumber pn )
2002-05-20 08:59:37 +00:00
{
m_soundSelect.PlayRandom();
m_bChosen = true;
2002-07-23 01:41:40 +00:00
GAMESTATE->m_pCurSong = NULL;
2003-02-25 00:33:42 +00:00
GAMESTATE->m_sPreferredGroup = (m_GroupList.GetSelectionName()=="ALL MUSIC" ? GROUP_ALL_MUSIC : m_GroupList.GetSelectionName() );
2002-05-20 08:59:37 +00:00
2003-02-25 00:33:42 +00:00
if( GAMESTATE->m_sPreferredGroup == GROUP_ALL_MUSIC )
2003-01-02 08:13:34 +00:00
SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("select group comment all music") );
2002-05-20 08:59:37 +00:00
else
2003-01-02 08:13:34 +00:00
SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("select group comment general") );
2002-05-20 08:59:37 +00:00
TweenOffScreen();
2003-03-09 00:55:49 +00:00
m_Menu.StartTransitioning( SM_GoToNextScreen );
2002-05-20 08:59:37 +00:00
}
void ScreenSelectGroup::MenuBack( PlayerNumber pn )
2002-05-20 08:59:37 +00:00
{
2003-03-09 00:55:49 +00:00
m_Menu.Back( SM_GoToPrevScreen );
2002-05-20 08:59:37 +00:00
}
void ScreenSelectGroup::TweenOffScreen()
{
m_sprExplanation.Command( EXPLANATION_OFF_COMMAND );
m_sprFrame.Command( FRAME_OFF_COMMAND );
m_Banner.Command( BANNER_OFF_COMMAND );
m_textNumber.Command( NUMBER_OFF_COMMAND );
m_sprContents.Command( CONTENTS_OFF_COMMAND );
m_MusicList.Command( MUSIC_LIST_OFF_COMMAND );
m_GroupList.Command( GROUP_LIST_OFF_COMMAND );
m_MusicList.TweenOffScreen();
2002-08-24 20:36:29 +00:00
m_GroupList.TweenOffScreen();
2002-05-20 08:59:37 +00:00
}
void ScreenSelectGroup::TweenOnScreen()
{
m_sprExplanation.Command( EXPLANATION_ON_COMMAND );
m_sprFrame.Command( FRAME_ON_COMMAND );
m_Banner.Command( BANNER_ON_COMMAND );
m_textNumber.Command( NUMBER_ON_COMMAND );
m_sprContents.Command( CONTENTS_ON_COMMAND );
m_MusicList.Command( MUSIC_LIST_ON_COMMAND );
m_GroupList.Command( GROUP_LIST_ON_COMMAND );
m_MusicList.TweenOnScreen();
2002-08-24 20:36:29 +00:00
m_GroupList.TweenOnScreen();
2002-05-20 08:59:37 +00:00
}