Files
itgmania212121/stepmania/src/EditCoursesMenu.cpp
T

519 lines
14 KiB
C++
Raw Normal View History

2003-08-10 23:48:10 +00:00
#include "global.h"
/*
-----------------------------------------------------------------------------
Class: EditCoursesMenu
Desc: See header.
Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved.
Chris Danford
-----------------------------------------------------------------------------
*/
#include "EditCoursesMenu.h"
#include "RageLog.h"
#include "SongManager.h"
#include "GameState.h"
#include "ThemeManager.h"
#include "GameManager.h"
#include "Steps.h"
#include "song.h"
#include "Course.h"
2003-08-11 02:18:13 +00:00
#include "ScreenMiniMenu.h"
#include "ScreenManager.h"
2003-08-10 23:48:10 +00:00
//
// Defines specific to EditCoursesMenu
//
#define ARROWS_X( i ) THEME->GetMetricF("EditCoursesMenu",ssprintf("Arrows%dX",i+1))
#define COURSE_BANNER_X THEME->GetMetricF("EditCoursesMenu","CourseBannerX")
#define COURSE_BANNER_Y THEME->GetMetricF("EditCoursesMenu","CourseBannerY")
#define COURSE_BANNER_WIDTH THEME->GetMetricF("EditCoursesMenu","CourseBannerWidth")
#define COURSE_BANNER_HEIGHT THEME->GetMetricF("EditCoursesMenu","CourseBannerHeight")
#define COURSE_TEXT_BANNER_X THEME->GetMetricF("EditCoursesMenu","CourseTextBannerX")
#define COURSE_TEXT_BANNER_Y THEME->GetMetricF("EditCoursesMenu","CourseTextBannerY")
#define ENTRY_BANNER_X THEME->GetMetricF("EditCoursesMenu","EntryBannerX")
#define ENTRY_BANNER_Y THEME->GetMetricF("EditCoursesMenu","EntryBannerY")
#define ENTRY_BANNER_WIDTH THEME->GetMetricF("EditCoursesMenu","EntryBannerWidth")
#define ENTRY_BANNER_HEIGHT THEME->GetMetricF("EditCoursesMenu","EntryBannerHeight")
#define ENTRY_TEXT_BANNER_X THEME->GetMetricF("EditCoursesMenu","EntryTextBannerX")
#define ENTRY_TEXT_BANNER_Y THEME->GetMetricF("EditCoursesMenu","EntryTextBannerY")
#define ROW_LABELS_X THEME->GetMetricF("EditCoursesMenu","RowLabelsX")
#define ROW_VALUE_X( i ) THEME->GetMetricF("EditCoursesMenu",ssprintf("RowValue%dX",i+1))
#define ROW_Y( i ) THEME->GetMetricF("EditCoursesMenu",ssprintf("Row%dY",i+1))
2003-08-11 02:18:13 +00:00
const ScreenMessage SM_BackFromCourseOptionsMenu = (ScreenMessage)(SM_User+1);
2003-11-12 08:13:02 +00:00
const ScreenMessage SM_BackFromPlayerOptions = (ScreenMessage)(SM_User+3);
const ScreenMessage SM_BackFromSongOptions = (ScreenMessage)(SM_User+4);
2003-08-11 02:18:13 +00:00
2003-08-11 06:09:57 +00:00
enum CourseEntryMenuRow
{
repeat,
randomize,
lives,
};
static const MenuRow g_CourseOptionsMenuItems[] =
{
2003-11-08 01:00:27 +00:00
{ "Repeat", true, 0, { "NO","YES" } },
{ "Randomize", true, 0, { "NO","YES" } },
{ "Lives", true, 4, { "Use Bar Life","1","2","3","4","5","6","7","8","9","10" } },
{ NULL, true, 0, { NULL } }
};
static Menu g_CourseOptionsMenu( "Course Options", g_CourseOptionsMenuItems );
2003-08-11 02:18:13 +00:00
2003-08-11 06:09:57 +00:00
enum CourseOptionsMenuRow
2003-08-11 02:18:13 +00:00
{
song,
group,
difficulty,
low_meter,
high_meter,
2003-08-11 06:09:57 +00:00
best_worst_value,
2003-08-12 06:51:03 +00:00
NUM_ENTRY_OPTIONS_MENU_ROWS
2003-08-11 02:18:13 +00:00
};
2003-08-10 23:48:10 +00:00
2003-08-12 06:51:03 +00:00
const bool g_bRowEnabledForType[NUM_COURSE_ENTRY_TYPES][NUM_ENTRY_OPTIONS_MENU_ROWS] =
{ // song, group, difficulty, low_meter, high_meter, best_worst
/* fixed */ { true, false, true, true, true, false },
/* random */ { false, false, true, true, true, false },
/* random_group */{ false, true, true, true, true, false },
/* best */ { false, false, false, false, false, true },
/* worst */ { false, false, false, false, false, true }
};
2003-08-10 23:48:10 +00:00
EditCoursesMenu::EditCoursesMenu()
{
LOG->Trace( "ScreenEditCoursesMenu::ScreenEditCoursesMenu()" );
2003-08-11 02:18:13 +00:00
GAMESTATE->m_bEditing = true;
m_bInSongMenu = false;
2003-08-10 23:48:10 +00:00
int i;
for( i=0; i<2; i++ )
{
m_sprArrows[i].Load( THEME->GetPathToG(ssprintf("EditCoursesMenu %s",(i==0?"left":"right"))) );
m_sprArrows[i].SetX( ARROWS_X(i) );
this->AddChild( &m_sprArrows[i] );
}
m_SelectedRow = (Row)0;
ZERO( m_iSelection );
for( i=0; i<NUM_ROWS; i++ )
{
m_textLabel[i].LoadFromFont( THEME->GetPathToF("Common title") );
m_textLabel[i].SetXY( ROW_LABELS_X, ROW_Y(i) );
m_textLabel[i].SetText( RowToString((Row)i) );
m_textLabel[i].SetZoom( 0.8f );
m_textLabel[i].SetHorizAlign( Actor::align_left );
this->AddChild( &m_textLabel[i] );
m_textValue[i].LoadFromFont( THEME->GetPathToF("Common normal") );
m_textValue[i].SetXY( ROW_VALUE_X(i), ROW_Y(i) );
m_textValue[i].SetText( "blah" );
2003-08-11 02:18:13 +00:00
m_textValue[i].SetZoom( 0.6f );
2003-08-10 23:48:10 +00:00
this->AddChild( &m_textValue[i] );
}
m_CourseBanner.SetXY( COURSE_BANNER_X, COURSE_BANNER_Y );
this->AddChild( &m_CourseBanner );
m_EntryBanner.SetXY( ENTRY_BANNER_X, ENTRY_BANNER_Y );
this->AddChild( &m_EntryBanner );
2004-01-21 09:35:28 +00:00
m_EntryTextBanner.SetName( "TextBanner" );
2003-08-10 23:48:10 +00:00
m_EntryTextBanner.SetXY( ENTRY_TEXT_BANNER_X, ENTRY_TEXT_BANNER_Y );
this->AddChild( &m_EntryTextBanner );
m_soundChangeRow.Load( THEME->GetPathToS("EditCoursesMenu row") );
m_soundChangeValue.Load( THEME->GetPathToS("EditCoursesMenu value") );
2003-08-11 06:09:57 +00:00
m_soundSave.Load( THEME->GetPathToS("EditCoursesMenu save") );
2003-08-10 23:48:10 +00:00
// fill in data structures
SONGMAN->GetAllCourses( m_pCourses, false );
ChangeToRow( (Row)0 );
OnRowValueChanged( (Row)0 );
}
EditCoursesMenu::~EditCoursesMenu()
{
}
void EditCoursesMenu::DrawPrimitives()
{
if( m_bInSongMenu )
m_SongMenu.Draw();
else
ActorFrame::DrawPrimitives();
}
void EditCoursesMenu::Update( float fDeltaTime )
{
if( m_bInSongMenu )
m_SongMenu.Update( fDeltaTime );
else
ActorFrame::Update( fDeltaTime );
2003-08-10 23:48:10 +00:00
}
bool EditCoursesMenu::CanGoUp()
{
return m_SelectedRow != 0;
}
bool EditCoursesMenu::CanGoDown()
{
return m_SelectedRow != NUM_ROWS-1;
}
bool EditCoursesMenu::CanGoLeft()
{
return m_iSelection[m_SelectedRow] != 0;
}
bool EditCoursesMenu::CanGoRight()
{
int num_values[NUM_ROWS] =
{
m_pCourses.size(),
1,
2003-08-11 02:18:13 +00:00
NUM_ACTIONS,
(int)GetSelectedCourse()->m_entries.size(),
2003-08-10 23:48:10 +00:00
NUM_COURSE_ENTRY_TYPES,
1,
2003-08-11 02:18:13 +00:00
1,
2003-08-10 23:48:10 +00:00
1
};
return m_iSelection[m_SelectedRow] != (num_values[m_SelectedRow]-1);
}
void EditCoursesMenu::Up()
{
if( m_bInSongMenu )
{
m_SongMenu.Up();
return;
}
2003-08-10 23:48:10 +00:00
if( CanGoUp() )
{
2003-08-11 00:25:05 +00:00
ChangeToRow( Row(m_SelectedRow-1) );
2003-08-11 02:18:13 +00:00
m_soundChangeRow.Play();
2003-08-10 23:48:10 +00:00
}
}
void EditCoursesMenu::Down()
{
if( m_bInSongMenu )
{
m_SongMenu.Down();
return;
}
2003-08-10 23:48:10 +00:00
if( CanGoDown() )
{
2003-08-11 00:25:05 +00:00
ChangeToRow( Row(m_SelectedRow+1) );
2003-08-11 02:18:13 +00:00
m_soundChangeRow.Play();
2003-08-10 23:48:10 +00:00
}
}
void EditCoursesMenu::Left()
{
if( m_bInSongMenu )
{
m_SongMenu.Left();
return;
}
2003-08-10 23:48:10 +00:00
if( CanGoLeft() )
{
m_iSelection[m_SelectedRow]--;
2003-08-11 02:18:13 +00:00
switch( m_SelectedRow )
{
case ROW_ENTRY_TYPE:
GetSelectedEntry()->type = GetSelectedEntryType();
break;
}
2003-08-10 23:48:10 +00:00
OnRowValueChanged( m_SelectedRow );
2003-08-11 02:18:13 +00:00
m_soundChangeValue.Play();
2003-08-10 23:48:10 +00:00
}
}
void EditCoursesMenu::Right()
{
if( m_bInSongMenu )
{
m_SongMenu.Right();
return;
}
2003-08-10 23:48:10 +00:00
if( CanGoRight() )
{
m_iSelection[m_SelectedRow]++;
2003-08-11 02:18:13 +00:00
switch( m_SelectedRow )
{
case ROW_ENTRY_TYPE:
GetSelectedEntry()->type = GetSelectedEntryType();
break;
}
2003-08-10 23:48:10 +00:00
OnRowValueChanged( m_SelectedRow );
2003-08-11 02:18:13 +00:00
m_soundChangeValue.Play();
}
}
void EditCoursesMenu::Start()
{
if( m_bInSongMenu )
{
m_SongMenu.SaveToCourseEntry( GetSelectedEntry() );
m_bInSongMenu = false;
OnRowValueChanged( ROW_ENTRY );
return;
}
2003-08-12 06:51:03 +00:00
Course* pCourse = GetSelectedCourse();
CourseEntry* pEntry = GetSelectedEntry();
2003-08-11 02:18:13 +00:00
switch( m_SelectedRow )
{
2003-08-11 06:09:57 +00:00
case ROW_COURSE_OPTIONS:
2003-08-12 06:51:03 +00:00
g_CourseOptionsMenu.rows[repeat].defaultChoice = pCourse->m_bRepeat ? 1 : 0;
g_CourseOptionsMenu.rows[randomize].defaultChoice = pCourse->m_bRandomize ? 1 : 0;
g_CourseOptionsMenu.rows[lives].defaultChoice = pCourse->m_iLives;
2003-08-11 06:09:57 +00:00
if( g_CourseOptionsMenu.rows[lives].defaultChoice == -1 )
g_CourseOptionsMenu.rows[lives].defaultChoice = 0;
2003-08-11 02:18:13 +00:00
SCREENMAN->MiniMenu( &g_CourseOptionsMenu, SM_BackFromCourseOptionsMenu );
break;
2003-08-11 06:09:57 +00:00
case ROW_ACTION:
switch( GetSelectedAction() )
{
case save:
m_soundSave.Play();
2003-08-12 06:51:03 +00:00
pCourse->Save();
2003-08-11 06:09:57 +00:00
SCREENMAN->SystemMessage( "Course saved." );
break;
case add_entry:
SCREENMAN->PlayStartSound();
2003-08-12 06:51:03 +00:00
pCourse->m_entries.insert( pCourse->m_entries.begin()+m_iSelection[ROW_ENTRY], pCourse->m_entries[m_iSelection[ROW_ENTRY]] );
2003-08-11 06:09:57 +00:00
OnRowValueChanged( ROW_ENTRY );
break;
case delete_selected_entry:
2003-08-12 06:51:03 +00:00
if( pCourse->m_entries.size() == 1 )
2003-08-11 06:09:57 +00:00
{
SCREENMAN->PlayInvalidSound();
2003-08-11 06:09:57 +00:00
SCREENMAN->SystemMessage( "Cannot delete the last entry from a course" );
break;
}
SCREENMAN->PlayStartSound();
2003-08-12 06:51:03 +00:00
pCourse->m_entries.erase( pCourse->m_entries.begin()+m_iSelection[ROW_ENTRY] );
CLAMP( m_iSelection[ROW_ENTRY], 0, (int) pCourse->m_entries.size()-1 );
2003-08-11 06:09:57 +00:00
OnRowValueChanged( ROW_ENTRY );
break;
default:
ASSERT(0);
}
OnRowValueChanged( ROW_ENTRY );
2003-08-11 02:18:13 +00:00
break;
case ROW_ENTRY_OPTIONS:
m_SongMenu.LoadFromCourseEntry( GetSelectedEntry() );
m_bInSongMenu = true;
2003-08-11 02:18:13 +00:00
break;
case ROW_ENTRY_PLAYER_OPTIONS:
SCREENMAN->PlayStartSound();
2003-08-11 06:09:57 +00:00
GAMESTATE->m_PlayerOptions[PLAYER_1] = PlayerOptions();
2003-08-12 06:51:03 +00:00
GAMESTATE->m_PlayerOptions[PLAYER_1].FromString( pEntry->modifiers );
2003-08-11 06:09:57 +00:00
2003-11-12 08:13:02 +00:00
SCREENMAN->AddNewScreenToTop( "ScreenPlayerOptions", SM_BackFromPlayerOptions );
2003-08-11 02:18:13 +00:00
break;
case ROW_ENTRY_SONG_OPTIONS:
SCREENMAN->PlayStartSound();
2003-08-11 06:09:57 +00:00
GAMESTATE->m_SongOptions = SongOptions();
2003-08-12 06:51:03 +00:00
GAMESTATE->m_SongOptions.FromString( pEntry->modifiers );
2003-08-11 06:09:57 +00:00
2003-11-12 08:13:02 +00:00
SCREENMAN->AddNewScreenToTop( "ScreenSongOptions", SM_BackFromSongOptions );
2003-08-11 02:18:13 +00:00
break;
default:
SCREENMAN->PlayInvalidSound();
2003-08-11 02:18:13 +00:00
return;
2003-08-10 23:48:10 +00:00
}
}
2003-08-11 06:09:57 +00:00
void EditCoursesMenu::HandleScreenMessage( const ScreenMessage SM )
{
2003-08-12 06:51:03 +00:00
Course* pCourse = GetSelectedCourse();
CourseEntry* pEntry = GetSelectedEntry();
2003-08-11 06:09:57 +00:00
switch( SM )
{
case SM_BackFromCourseOptionsMenu:
2003-08-12 06:51:03 +00:00
pCourse->m_bRepeat = !!ScreenMiniMenu::s_iLastAnswers[repeat];
pCourse->m_bRandomize = !!ScreenMiniMenu::s_iLastAnswers[randomize];
pCourse->m_iLives = ScreenMiniMenu::s_iLastAnswers[lives];
if( pCourse->m_iLives == 0 )
pCourse->m_iLives = -1;
2003-08-11 06:09:57 +00:00
OnRowValueChanged( ROW_COURSE_OPTIONS );
break;
2003-11-12 08:13:02 +00:00
case SM_BackFromPlayerOptions:
case SM_BackFromSongOptions:
2003-08-11 06:09:57 +00:00
// coming back from PlayerOptions or SongOptions
2003-08-12 06:51:03 +00:00
pEntry->modifiers = GAMESTATE->m_PlayerOptions[PLAYER_1].GetString() + "," + GAMESTATE->m_SongOptions.GetString();
2003-08-11 06:09:57 +00:00
OnRowValueChanged( ROW_ENTRY_PLAYER_OPTIONS );
break;
}
}
2003-08-10 23:48:10 +00:00
void EditCoursesMenu::ChangeToRow( Row newRow )
{
m_SelectedRow = newRow;
for( int i=0; i<2; i++ )
m_sprArrows[i].SetY( ROW_Y(newRow) );
m_sprArrows[0].SetDiffuse( CanGoLeft()?RageColor(1,1,1,1):RageColor(0.2f,0.2f,0.2f,1) );
m_sprArrows[1].SetDiffuse( CanGoRight()?RageColor(1,1,1,1):RageColor(0.2f,0.2f,0.2f,1) );
m_sprArrows[0].EnableAnimation( CanGoLeft() );
m_sprArrows[1].EnableAnimation( CanGoRight() );
}
void EditCoursesMenu::OnRowValueChanged( Row row )
{
2003-08-14 22:37:57 +00:00
LOG->Trace( "EditCoursesMenu::OnRowValueChanged(%i)", row );
2003-08-10 23:48:10 +00:00
m_sprArrows[0].SetDiffuse( CanGoLeft()?RageColor(1,1,1,1):RageColor(0.2f,0.2f,0.2f,1) );
m_sprArrows[1].SetDiffuse( CanGoRight()?RageColor(1,1,1,1):RageColor(0.2f,0.2f,0.2f,1) );
m_sprArrows[0].EnableAnimation( CanGoLeft() );
m_sprArrows[1].EnableAnimation( CanGoRight() );
Course* pCourse = GetSelectedCourse();
2003-08-11 02:18:13 +00:00
CourseEntry* pEntry = GetSelectedEntry();
2003-08-10 23:48:10 +00:00
switch( row )
{
case ROW_COURSE:
2003-08-14 22:37:57 +00:00
CHECKPOINT;
2003-08-11 00:25:05 +00:00
m_textValue[ROW_COURSE].SetText( pCourse->m_sName );
m_CourseBanner.LoadFromCourse( pCourse );
2003-08-10 23:48:10 +00:00
m_CourseBanner.ScaleToClipped( COURSE_BANNER_WIDTH, COURSE_BANNER_HEIGHT );
m_iSelection[ROW_ENTRY] = 0;
2003-08-29 04:34:40 +00:00
pEntry = GetSelectedEntry();
if( pEntry == NULL )
{
pCourse->m_entries.push_back( CourseEntry() );
pEntry = GetSelectedEntry();
}
2003-08-10 23:48:10 +00:00
// fall through
case ROW_COURSE_OPTIONS:
2003-08-14 22:37:57 +00:00
CHECKPOINT;
2003-08-10 23:48:10 +00:00
m_textValue[ROW_COURSE_OPTIONS].SetText(
ssprintf(
2003-08-11 06:09:57 +00:00
"(START) %s, %s, ",
2003-08-10 23:48:10 +00:00
pCourse->m_bRepeat ? "repeat" : "no repeat",
2003-08-11 06:09:57 +00:00
pCourse->m_bRandomize ? "randomize" : "no randomize" ) +
ssprintf(
(pCourse->m_iLives==-1) ? "use bar life" : "%d lives",
2003-08-10 23:48:10 +00:00
pCourse->m_iLives ) );
// fall through
2003-08-11 02:18:13 +00:00
case ROW_ACTION:
2003-08-14 22:37:57 +00:00
CHECKPOINT;
2003-08-11 02:18:13 +00:00
m_textValue[ROW_ACTION].SetText( "(START) " + ActionToString(GetSelectedAction()) );
// fall through
2003-08-10 23:48:10 +00:00
case ROW_ENTRY:
2003-08-14 22:37:57 +00:00
CHECKPOINT;
2003-08-11 02:18:13 +00:00
m_textValue[ROW_ENTRY].SetText( ssprintf("%d of %d",m_iSelection[ROW_ENTRY]+1, (int)GetSelectedCourse()->m_entries.size()) );
2003-08-11 06:09:57 +00:00
m_iSelection[ROW_ENTRY_TYPE] = pEntry->type;
2003-08-10 23:48:10 +00:00
// fall through
case ROW_ENTRY_TYPE:
2003-08-14 22:37:57 +00:00
CHECKPOINT;
2003-08-11 00:25:05 +00:00
m_textValue[ROW_ENTRY_TYPE].SetText( pEntry ? CourseEntryTypeToString(pEntry->type) : "(none)" );
2003-08-10 23:48:10 +00:00
// fall through
case ROW_ENTRY_OPTIONS:
2003-08-14 22:37:57 +00:00
CHECKPOINT;
2003-08-11 00:25:05 +00:00
{
2003-08-11 06:09:57 +00:00
CStringArray as;
2003-08-12 06:51:03 +00:00
const bool *bShow = g_bRowEnabledForType[GetSelectedEntry()->type];
2003-08-11 00:25:05 +00:00
2003-08-11 06:09:57 +00:00
if( bShow[song] )
2003-08-12 06:51:03 +00:00
as.push_back( pEntry->pSong ? pEntry->pSong->GetFullTranslitTitle() : "(missing song)" );
2003-08-11 06:09:57 +00:00
if( bShow[group] )
2003-08-12 06:51:03 +00:00
as.push_back( pEntry->group_name.empty() ? "(no group)" : pEntry->group_name );
2003-08-11 06:09:57 +00:00
if( bShow[difficulty] )
if( pEntry->difficulty != DIFFICULTY_INVALID )
as.push_back( DifficultyToString(pEntry->difficulty) );
if( bShow[low_meter] )
if( pEntry->low_meter > 0 )
as.push_back( ssprintf("low meter %d", pEntry->low_meter) );
if( bShow[high_meter] )
if( pEntry->high_meter > 0 )
as.push_back( ssprintf("high meter %d", pEntry->high_meter) );
if( bShow[best_worst_value] )
if( pEntry->players_index != -1 )
as.push_back( ssprintf("rank %d", pEntry->players_index+1) );
m_textValue[ROW_ENTRY_OPTIONS].SetText( "(START) " + join(", ",as) );
2003-08-11 00:25:05 +00:00
}
2003-08-10 23:48:10 +00:00
// fall through
2003-08-11 02:18:13 +00:00
case ROW_ENTRY_PLAYER_OPTIONS:
2003-08-14 22:37:57 +00:00
CHECKPOINT;
2003-08-11 00:25:05 +00:00
{
2003-08-11 02:18:13 +00:00
CString s = "(START) ";
2003-08-11 06:09:57 +00:00
PlayerOptions po;
po.FromString( pEntry->modifiers );
if( po.GetString().empty() )
s += "(none)";
2003-08-11 00:25:05 +00:00
else
2003-08-11 06:09:57 +00:00
s += po.GetString();
2003-08-11 00:25:05 +00:00
2003-08-11 02:18:13 +00:00
m_textValue[ROW_ENTRY_PLAYER_OPTIONS].SetText( s );
}
// fall through
case ROW_ENTRY_SONG_OPTIONS:
2003-08-14 22:37:57 +00:00
CHECKPOINT;
2003-08-11 02:18:13 +00:00
{
CString s = "(START) ";
2003-08-11 06:09:57 +00:00
SongOptions so;
so.FromString( pEntry->modifiers );
if( so.GetString().empty() )
s += "(none)";
2003-08-11 02:18:13 +00:00
else
2003-08-11 06:09:57 +00:00
s += so.GetString();
2003-08-11 02:18:13 +00:00
m_textValue[ROW_ENTRY_SONG_OPTIONS].SetText( s );
2003-08-11 00:25:05 +00:00
}
2003-08-10 23:48:10 +00:00
break;
default:
ASSERT(0); // invalid row
}
}
2003-08-11 02:18:13 +00:00
CourseEntry* EditCoursesMenu::GetSelectedEntry()
{
Course* pCourse = GetSelectedCourse();
2003-08-11 05:30:35 +00:00
if( m_iSelection[ROW_ENTRY] < int(pCourse->m_entries.size()) )
2003-08-11 02:18:13 +00:00
return &pCourse->m_entries[m_iSelection[ROW_ENTRY]];
else
return NULL;
}