2003-02-16 04:01:45 +00:00
# include "global.h"
2002-05-20 08:59:37 +00:00
# include "ScreenEditMenu.h"
# include "SongManager.h"
# include "ScreenManager.h"
# include "GameConstantsAndTypes.h"
# include "RageUtil.h"
2002-07-23 01:41:40 +00:00
# include "PrefsManager.h"
2002-05-20 08:59:37 +00:00
# include "GameManager.h"
# include "RageLog.h"
2002-07-23 01:41:40 +00:00
# include "GameState.h"
2004-07-08 00:10:34 +00:00
# include "GameSoundManager.h"
2002-11-11 04:53:31 +00:00
# include "ThemeManager.h"
2003-08-03 00:13:55 +00:00
# include "Steps.h"
2003-11-07 20:24:44 +00:00
# include "song.h"
2005-03-08 01:46:57 +00:00
# include "CommonMetrics.h"
2005-03-22 23:59:17 +00:00
# include "ScreenTextEntry.h"
2002-05-20 08:59:37 +00:00
2005-03-08 00:32:49 +00:00
# define PREV_SCREEN THEME->GetMetric(m_sName,"PrevScreen")
# define EXPLANATION_TEXT( row ) THEME->GetMetric(m_sName,"Explanation"+EditMenuRowToString(row))
2002-05-20 08:59:37 +00:00
2003-01-30 07:18:33 +00:00
const ScreenMessage SM_RefreshSelector = ( ScreenMessage ) ( SM_User + 1 ) ;
2005-03-22 23:59:17 +00:00
const ScreenMessage SM_BackFromEditDescription = ( ScreenMessage ) ( SM_User + 2 ) ;
2002-05-20 08:59:37 +00:00
2004-11-26 17:28:47 +00:00
REGISTER_SCREEN_CLASS ( ScreenEditMenu ) ;
2004-05-01 23:19:33 +00:00
ScreenEditMenu : : ScreenEditMenu ( CString sName ) : ScreenWithMenuElements ( sName )
2002-05-20 08:59:37 +00:00
{
2002-07-31 19:40:40 +00:00
LOG - > Trace ( " ScreenEditMenu::ScreenEditMenu() " ) ;
2002-05-20 08:59:37 +00:00
2004-05-22 00:12:57 +00:00
/* Enable all players. */
FOREACH_PlayerNumber ( pn )
GAMESTATE - > m_bSideIsJoined [ pn ] = true ;
2005-02-23 18:56:50 +00:00
}
void ScreenEditMenu : : Init ( )
{
ScreenWithMenuElements : : Init ( ) ;
2002-08-29 04:56:03 +00:00
2003-01-30 07:18:33 +00:00
m_Selector . SetXY ( 0 , 0 ) ;
this - > AddChild ( & m_Selector ) ;
2002-05-20 08:59:37 +00:00
2002-08-27 16:53:25 +00:00
2004-05-22 00:12:57 +00:00
m_textExplanation . SetName ( " Explanation " ) ;
2005-03-05 09:11:56 +00:00
m_textExplanation . LoadFromFont ( THEME - > GetPathF ( m_sName , " explanation " ) ) ;
2005-03-08 00:32:49 +00:00
SET_XY ( m_textExplanation ) ;
RefreshExplanationText ( ) ;
2002-09-02 21:59:58 +00:00
this - > AddChild ( & m_textExplanation ) ;
2002-05-20 08:59:37 +00:00
2005-03-08 01:46:57 +00:00
m_textNumStepsLoadedFromProfile . SetName ( " NumStepsLoadedFromProfile " ) ;
m_textNumStepsLoadedFromProfile . LoadFromFont ( THEME - > GetPathF ( m_sName , " NumStepsLoadedFromProfile " ) ) ;
SET_XY_AND_ON_COMMAND ( m_textNumStepsLoadedFromProfile ) ;
RefreshNumStepsLoadedFromProfile ( ) ;
this - > AddChild ( & m_textNumStepsLoadedFromProfile ) ;
2004-05-03 00:08:56 +00:00
this - > SortByDrawOrder ( ) ;
2005-03-05 09:11:56 +00:00
SOUND - > PlayMusic ( THEME - > GetPathS ( m_sName , " music " ) ) ;
2002-05-20 08:59:37 +00:00
}
2005-03-14 02:48:48 +00:00
// helpers for MenuStart() below
void DeleteCurSteps ( void * pThrowAway )
{
Song * pSong = GAMESTATE - > m_pCurSong ;
Steps * pStepsToDelete = GAMESTATE - > m_pCurSteps [ PLAYER_1 ] ;
pSong - > RemoveSteps ( pStepsToDelete ) ;
2005-03-14 20:26:50 +00:00
if ( ! HOME_EDIT_MODE )
2005-03-14 02:48:48 +00:00
{
pSong - > Save ( ) ;
SCREENMAN - > ZeroNextUpdate ( ) ;
}
2005-03-21 03:47:30 +00:00
SCREENMAN - > SendMessageToTopScreen ( SM_RefreshSelector ) ;
2005-03-14 02:48:48 +00:00
}
2002-05-20 08:59:37 +00:00
void ScreenEditMenu : : HandleScreenMessage ( const ScreenMessage SM )
{
switch ( SM )
{
2003-01-30 07:18:33 +00:00
case SM_RefreshSelector :
2005-03-06 00:08:48 +00:00
m_Selector . RefreshAll ( ) ;
2005-03-21 03:47:30 +00:00
RefreshNumStepsLoadedFromProfile ( ) ;
2003-01-30 07:18:33 +00:00
break ;
2002-08-27 23:31:41 +00:00
case SM_GoToPrevScreen :
2005-01-29 23:45:27 +00:00
SCREENMAN - > SetNewScreen ( PREV_SCREEN ) ;
2002-05-20 08:59:37 +00:00
break ;
2002-08-27 23:31:41 +00:00
case SM_GoToNextScreen :
2002-08-27 03:59:22 +00:00
SCREENMAN - > SetNewScreen ( " ScreenEdit " ) ;
2002-05-20 08:59:37 +00:00
break ;
2005-03-14 02:56:01 +00:00
case SM_Success :
LOG - > Trace ( " Delete successful; deleting steps from memory " ) ;
DeleteCurSteps ( NULL ) ;
break ;
case SM_Failure :
LOG - > Trace ( " Delete failed; not deleting steps " ) ;
break ;
2005-03-22 23:59:17 +00:00
case SM_BackFromEditDescription :
if ( ! ScreenTextEntry : : s_bCancelledLast )
{
SOUND - > StopMusic ( ) ;
StartTransitioning ( SM_GoToNextScreen ) ;
}
break ;
2002-05-20 08:59:37 +00:00
}
}
2002-09-04 03:49:08 +00:00
void ScreenEditMenu : : MenuUp ( PlayerNumber pn )
2002-05-20 08:59:37 +00:00
{
2005-03-08 00:32:49 +00:00
if ( m_Selector . CanGoUp ( ) )
{
m_Selector . Up ( ) ;
RefreshExplanationText ( ) ;
}
2002-05-20 08:59:37 +00:00
}
2002-09-04 03:49:08 +00:00
void ScreenEditMenu : : MenuDown ( PlayerNumber pn )
2002-05-20 08:59:37 +00:00
{
2005-03-08 00:32:49 +00:00
if ( m_Selector . CanGoDown ( ) )
{
m_Selector . Down ( ) ;
RefreshExplanationText ( ) ;
}
2002-05-20 08:59:37 +00:00
}
2002-09-04 03:49:08 +00:00
void ScreenEditMenu : : MenuLeft ( PlayerNumber pn , const InputEventType type )
2002-05-20 08:59:37 +00:00
{
2005-03-08 00:32:49 +00:00
if ( m_Selector . CanGoLeft ( ) )
{
m_Selector . Left ( ) ;
}
2002-05-20 08:59:37 +00:00
}
2002-09-04 03:49:08 +00:00
void ScreenEditMenu : : MenuRight ( PlayerNumber pn , const InputEventType type )
2002-05-20 08:59:37 +00:00
{
2005-03-08 00:32:49 +00:00
if ( m_Selector . CanGoRight ( ) )
{
m_Selector . Right ( ) ;
}
2003-01-30 07:18:33 +00:00
}
2005-03-05 23:07:42 +00:00
static CString GetCopyDescription ( const Steps * pSourceSteps )
{
CString s ;
if ( pSourceSteps - > GetDifficulty ( ) = = DIFFICULTY_EDIT )
s = pSourceSteps - > GetDescription ( ) ;
else
s = DifficultyToThemedString ( pSourceSteps - > GetDifficulty ( ) ) ;
2005-03-06 00:08:48 +00:00
return s ;
2005-03-05 23:07:42 +00:00
}
2005-03-22 23:59:17 +00:00
static void SetCurrentStepsDescription ( CString s )
{
GAMESTATE - > m_pCurSteps [ 0 ] - > SetDescription ( s ) ;
}
static void DeleteCurrentSteps ( )
{
GAMESTATE - > m_pCurSong - > RemoveSteps ( GAMESTATE - > m_pCurSteps [ 0 ] ) ;
GAMESTATE - > m_pCurSteps [ 0 ] . Set ( NULL ) ;
}
2002-09-04 03:49:08 +00:00
void ScreenEditMenu : : MenuStart ( PlayerNumber pn )
2002-05-20 08:59:37 +00:00
{
2004-05-01 23:19:33 +00:00
if ( IsTransitioning ( ) )
2002-10-18 02:42:52 +00:00
return ;
2005-03-08 00:48:59 +00:00
if ( m_Selector . CanGoDown ( ) )
{
m_Selector . Down ( ) ;
RefreshExplanationText ( ) ;
return ;
}
2005-03-07 23:55:18 +00:00
Song * pSong = m_Selector . GetSelectedSong ( ) ;
StepsType st = m_Selector . GetSelectedStepsType ( ) ;
Difficulty dc = m_Selector . GetSelectedDifficulty ( ) ;
Steps * pSteps = m_Selector . GetSelectedSteps ( ) ;
// StepsType soureNT = m_Selector.GetSelectedSourceStepsType();
// Difficulty sourceDiff = m_Selector.GetSelectedSourceDifficulty();
Steps * pSourceSteps = m_Selector . GetSelectedSourceSteps ( ) ;
EditMenuAction action = m_Selector . GetSelectedAction ( ) ;
2003-01-30 07:18:33 +00:00
2005-02-24 12:27:30 +00:00
GAMESTATE - > m_pCurSong . Set ( pSong ) ;
2004-07-12 02:19:24 +00:00
GAMESTATE - > m_pCurStyle = GAMEMAN - > GetEditorStyleForStepsType ( st ) ;
2005-02-25 18:17:26 +00:00
GAMESTATE - > m_pCurSteps [ PLAYER_1 ] . Set ( pSteps ) ;
2003-01-30 07:18:33 +00:00
//
// handle error cases
//
2002-09-16 00:56:30 +00:00
2003-01-30 07:18:33 +00:00
if ( ! pSong - > HasMusic ( ) )
2002-09-16 00:56:30 +00:00
{
2005-03-08 07:57:14 +00:00
SCREENMAN - > Prompt ( SM_None , " This song is missing a music file and cannot be edited " ) ;
2002-09-16 00:56:30 +00:00
return ;
}
2005-03-21 03:45:14 +00:00
//
// Do work
//
2003-01-30 07:18:33 +00:00
switch ( action )
{
2005-03-07 23:55:18 +00:00
case EDIT_MENU_ACTION_EDIT :
2003-01-30 07:18:33 +00:00
break ;
2005-03-07 23:55:18 +00:00
case EDIT_MENU_ACTION_DELETE :
2004-05-24 03:41:39 +00:00
ASSERT ( pSteps ) ;
2005-03-14 02:56:01 +00:00
if ( HOME_EDIT_MODE )
{
SCREENMAN - > AddNewScreenToTop ( " ScreenEditMenuDeleteSteps " , SM_None ) ;
}
else
{
SCREENMAN - > Prompt ( SM_RefreshSelector , " These steps will be lost permanently. \n \n Continue with delete? " , PROMPT_YES_NO , ANSWER_NO , DeleteCurSteps ) ;
}
2005-03-08 07:57:14 +00:00
break ;
2005-03-07 23:55:18 +00:00
case EDIT_MENU_ACTION_COPY :
case EDIT_MENU_ACTION_AUTOGEN :
2005-03-22 20:15:24 +00:00
case EDIT_MENU_ACTION_BLANK :
2004-05-24 03:41:39 +00:00
ASSERT ( ! pSteps ) ;
2003-01-30 07:18:33 +00:00
{
// Yuck. Doing the memory allocation doesn't seem right since
2003-08-03 00:13:55 +00:00
// Song allocates all of the other Steps.
2005-03-21 13:18:31 +00:00
pSteps = new Steps ;
2005-03-22 20:15:24 +00:00
CString sEditName ;
2005-03-07 05:23:18 +00:00
switch ( action )
{
2005-03-07 23:55:18 +00:00
case EDIT_MENU_ACTION_COPY :
2005-03-22 20:15:24 +00:00
ASSERT ( pSourceSteps ) ;
2005-03-21 13:18:31 +00:00
pSteps - > CopyFrom ( pSourceSteps , st ) ;
2005-03-22 20:15:24 +00:00
sEditName = GetCopyDescription ( pSourceSteps ) ;
2005-03-07 05:23:18 +00:00
break ;
2005-03-07 23:55:18 +00:00
case EDIT_MENU_ACTION_AUTOGEN :
2005-03-22 20:15:24 +00:00
ASSERT ( pSourceSteps ) ;
2005-03-21 13:18:31 +00:00
pSteps - > AutogenFrom ( pSourceSteps , st ) ;
pSteps - > DeAutogen ( ) ;
2005-03-22 20:15:24 +00:00
sEditName = GetCopyDescription ( pSourceSteps ) ;
break ;
case EDIT_MENU_ACTION_BLANK :
pSteps - > CreateBlank ( st ) ;
pSteps - > SetMeter ( 1 ) ;
sEditName = " Blank " ;
2005-03-07 05:23:18 +00:00
break ;
default :
ASSERT ( 0 ) ;
}
2005-03-21 13:18:31 +00:00
pSteps - > SetDifficulty ( dc ) ; // override difficulty with the user's choice
2005-03-07 06:32:55 +00:00
pSong - > MakeUniqueEditDescription ( st , sEditName ) ;
2005-03-21 13:18:31 +00:00
pSteps - > SetDescription ( sEditName ) ;
pSong - > AddSteps ( pSteps ) ;
2005-03-05 23:07:42 +00:00
2005-03-21 13:18:31 +00:00
SCREENMAN - > PlayStartSound ( ) ;
2005-03-06 00:08:48 +00:00
GAMESTATE - > m_pCurSong . Set ( pSong ) ;
2005-03-21 13:18:31 +00:00
GAMESTATE - > m_pCurSteps [ 0 ] . Set ( pSteps ) ;
2003-01-30 07:18:33 +00:00
}
2005-03-08 07:57:14 +00:00
break ;
default :
ASSERT ( 0 ) ;
}
2005-03-21 03:45:14 +00:00
//
// Go to the next screen.
//
2005-03-08 07:57:14 +00:00
switch ( action )
{
case EDIT_MENU_ACTION_EDIT :
case EDIT_MENU_ACTION_COPY :
case EDIT_MENU_ACTION_AUTOGEN :
case EDIT_MENU_ACTION_BLANK :
2005-03-22 23:59:17 +00:00
{
// Prepare prepare for ScreenEdit
ASSERT ( pSteps ) ;
bool bPromptToNameSteps = ( action ! = EDIT_MENU_ACTION_EDIT & & dc = = DIFFICULTY_EDIT ) ;
if ( bPromptToNameSteps )
{
SCREENMAN - > TextEntry ( SM_BackFromEditDescription , " Name this new edit. " , GAMESTATE - > m_pCurSteps [ 0 ] - > GetDescription ( ) , SetCurrentStepsDescription , DeleteCurrentSteps ) ;
}
else
{
SOUND - > StopMusic ( ) ;
SCREENMAN - > PlayStartSound ( ) ;
StartTransitioning ( SM_GoToNextScreen ) ;
}
}
2005-03-08 07:57:14 +00:00
break ;
case EDIT_MENU_ACTION_DELETE :
break ;
2003-01-30 07:18:33 +00:00
default :
ASSERT ( 0 ) ;
}
2002-05-20 08:59:37 +00:00
}
2002-09-04 03:49:08 +00:00
void ScreenEditMenu : : MenuBack ( PlayerNumber pn )
2002-05-20 08:59:37 +00:00
{
2005-03-20 06:14:41 +00:00
Cancel ( SM_GoToPrevScreen ) ;
2002-05-20 08:59:37 +00:00
2003-07-26 22:53:22 +00:00
SOUND - > StopMusic ( ) ;
2002-05-20 08:59:37 +00:00
}
2004-01-01 01:21:59 +00:00
2005-03-08 00:32:49 +00:00
void ScreenEditMenu : : RefreshExplanationText ( )
{
m_textExplanation . SetText ( EXPLANATION_TEXT ( m_Selector . GetSelectedRow ( ) ) ) ;
m_textExplanation . StopTweening ( ) ;
ON_COMMAND ( m_textExplanation ) ;
}
2005-03-08 01:46:57 +00:00
void ScreenEditMenu : : RefreshNumStepsLoadedFromProfile ( )
{
2005-03-08 07:57:14 +00:00
CString s = ssprintf ( " edits used: %d " , SONGMAN - > GetNumStepsLoadedFromProfile ( ) ) ;
2005-03-08 01:46:57 +00:00
m_textNumStepsLoadedFromProfile . SetText ( s ) ;
}
2005-03-08 00:32:49 +00:00
2004-05-22 00:12:57 +00:00
/*
* (c) 2002-2004 Chris Danford
* All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, and/or sell copies of the Software, and to permit persons to
* whom the Software is furnished to do so, provided that the above
* copyright notice(s) and this permission notice appear in all copies of
* the Software and that both the above copyright notice(s) and this
* permission notice appear in supporting documentation.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
* THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS
* INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT
* OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
* OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/