initial "paused record" mode: record a song measure-by-measure, allowing

replaying and rerecording each section in sequence; when paused, remain
in the record view, so we don't jump around between record and edit views
constantly
This commit is contained in:
Glenn Maynard
2005-07-21 21:23:18 +00:00
parent d5587f37d0
commit c9c59e0882
2 changed files with 124 additions and 4 deletions
+112 -2
View File
@@ -31,6 +31,8 @@
#include <utility>
#include <float.h>
static Preference<float> g_iDefaultRecordLength( "DefaultRecordLength", 4 );
//
// Defines specific to ScreenEdit
//
@@ -210,6 +212,14 @@ void ScreenEdit::InitEditMappings()
m_RecordMappings.button[EDIT_BUTTON_LAY_MINE_OR_ROLL][0] = DeviceInput(DEVICE_KEYBOARD, KEY_LSHIFT);
m_RecordMappings.button[EDIT_BUTTON_LAY_MINE_OR_ROLL][1] = DeviceInput(DEVICE_KEYBOARD, KEY_RSHIFT);
m_RecordMappings.button[EDIT_BUTTON_RETURN_TO_EDIT][0] = DeviceInput(DEVICE_KEYBOARD, KEY_ESC);
m_RecordPausedMappings.button[EDIT_BUTTON_PLAY_SELECTION][0] = DeviceInput(DEVICE_KEYBOARD, KEY_Cp);
m_RecordPausedMappings.button[EDIT_BUTTON_RECORD_SELECTION][0] = DeviceInput(DEVICE_KEYBOARD, KEY_Cr);
m_RecordPausedMappings.hold[EDIT_BUTTON_RECORD_SELECTION][0] = DeviceInput(DEVICE_KEYBOARD, KEY_LCTRL);
m_RecordPausedMappings.hold[EDIT_BUTTON_RECORD_SELECTION][1] = DeviceInput(DEVICE_KEYBOARD, KEY_RCTRL);
m_RecordPausedMappings.button[EDIT_BUTTON_RECORD_FROM_CURSOR][0] = DeviceInput(DEVICE_KEYBOARD, KEY_Cr);
m_RecordPausedMappings.button[EDIT_BUTTON_RETURN_TO_EDIT][0] = DeviceInput(DEVICE_KEYBOARD, KEY_ESC);
m_RecordPausedMappings.button[EDIT_BUTTON_UNDO][0] = DeviceInput(DEVICE_KEYBOARD, KEY_Cu);
}
#endif
@@ -325,6 +335,7 @@ const MapEditToDI *ScreenEdit::GetCurrentMap() const
case STATE_EDITING: return &m_EditMappings;
case STATE_PLAYING: return &m_PlayMappings;
case STATE_RECORDING: return &m_RecordMappings;
case STATE_RECORDING_PAUSED: return &m_RecordPausedMappings;
default: FAIL_M( ssprintf("%i",m_EditState) );
}
}
@@ -564,6 +575,7 @@ void ScreenEdit::Init()
m_pSong = GAMESTATE->m_pCurSong;
m_pSteps = GAMESTATE->m_pCurSteps[PLAYER_1];
m_pAttacksFromCourse = NULL;
m_bReturnToRecordMenuAfterPlay = false;
m_fBeatToReturnTo = 0;
@@ -969,6 +981,9 @@ void ScreenEdit::Input( const DeviceInput& DeviceI, const InputEventType type, c
case STATE_RECORDING:
InputRecord( di, type, GameI, MenuI, StyleI, EditB );
break;
case STATE_RECORDING_PAUSED:
InputRecordPaused( di, type, GameI, MenuI, StyleI, EditB );
break;
case STATE_PLAYING:
InputPlay( di, type, GameI, MenuI, StyleI, EditB );
break;
@@ -1617,7 +1632,27 @@ void ScreenEdit::InputEdit( const DeviceInput& DeviceI, const InputEventType typ
case EDIT_BUTTON_RECORD_SELECTION:
if( m_NoteFieldEdit.m_iBeginMarker!=-1 && m_NoteFieldEdit.m_iEndMarker!=-1 )
HandleAreaMenuChoice( record );
else
{
m_iStartPlayingAt = BeatToNoteRow(GAMESTATE->m_fSongBeat);
if( g_iDefaultRecordLength.Get() == -1 )
m_iStopPlayingAt = m_NoteDataEdit.GetLastRow() + 1;
else
m_iStopPlayingAt = m_iStartPlayingAt + BeatToNoteRow( g_iDefaultRecordLength.Get() );
if( GAMESTATE->m_pCurSteps[0]->IsAnEdit() )
m_iStopPlayingAt = min( m_iStopPlayingAt, BeatToNoteRow(GetMaximumBeatForNewNote()) );
TransitionEditState( STATE_RECORDING );
}
break;
case EDIT_BUTTON_RECORD_FROM_CURSOR:
m_iStartPlayingAt = BeatToNoteRow(GAMESTATE->m_fSongBeat);
m_iStopPlayingAt = m_NoteDataEdit.GetLastRow();
m_iStopPlayingAt += BeatToNoteRow(4); // give a one measure lead out
TransitionEditState( STATE_RECORDING );
break;
case EDIT_BUTTON_INSERT:
HandleAreaMenuChoice( insert_and_shift );
SCREENMAN->PlayInvalidSound();
@@ -1694,6 +1729,59 @@ void ScreenEdit::InputRecord( const DeviceInput& DeviceI, const InputEventType t
}
}
void ScreenEdit::InputRecordPaused( const DeviceInput& DeviceI, const InputEventType type, const GameInput &GameI, const MenuInput &MenuI, const StyleInput &StyleI, EditButton EditB )
{
if( type != IET_FIRST_PRESS )
return; // don't care
switch( EditB )
{
case EDIT_BUTTON_UNDO:
/* We've already actually committed changes to m_NoteDataEdit, so all we have
* to do to undo is Undo() as usual, and copy the note data back in. */
Undo();
m_NoteDataRecord.CopyAll( m_NoteDataEdit );
break;
case EDIT_BUTTON_PLAY_SELECTION:
TransitionEditState( STATE_PLAYING );
break;
case EDIT_BUTTON_RECORD_SELECTION:
TransitionEditState( STATE_RECORDING );
break;
case EDIT_BUTTON_RECORD_FROM_CURSOR:
if( GAMESTATE->m_pCurSteps[0]->IsAnEdit() )
{
float fMaximumBeat = GetMaximumBeatForNewNote();
if( NoteRowToBeat(m_iStopPlayingAt) >= fMaximumBeat )
{
// We're already at the end.
SCREENMAN->PlayInvalidSound();
return;
}
}
/* Pick up where we left off. */
{
int iSize = m_iStopPlayingAt - m_iStartPlayingAt;
m_iStartPlayingAt = m_iStopPlayingAt;
m_iStopPlayingAt += iSize;
if( GAMESTATE->m_pCurSteps[0]->IsAnEdit() )
m_iStopPlayingAt = min( m_iStopPlayingAt, BeatToNoteRow(GetMaximumBeatForNewNote()) );
}
TransitionEditState( STATE_RECORDING );
break;
case EDIT_BUTTON_RETURN_TO_EDIT:
TransitionEditState( STATE_EDITING );
break;
}
}
void ScreenEdit::InputPlay( const DeviceInput& DeviceI, const InputEventType type, const GameInput &GameI, const MenuInput &MenuI, const StyleInput &StyleI, EditButton EditB )
{
if( type != IET_FIRST_PRESS )
@@ -1754,6 +1842,25 @@ void ScreenEdit::TransitionEditState( EditState em )
{
EditState old = m_EditState;
// If we're going from recording to paused, come back when we're done.
if( old == STATE_RECORDING_PAUSED && em == STATE_PLAYING )
m_bReturnToRecordMenuAfterPlay = true;
//
// If switching out of record, open the menu.
//
{
bool bGoToRecordMenu = (old == STATE_RECORDING);
if( m_bReturnToRecordMenuAfterPlay && old == STATE_PLAYING )
{
bGoToRecordMenu = true;
m_bReturnToRecordMenuAfterPlay = false;
}
if( bGoToRecordMenu )
em = STATE_RECORDING_PAUSED;
}
/* If we're playing music, sample music or assist ticks when changing modes, stop. */
SOUND->PlayMusic("");
m_soundMusic.StopPlaying();
@@ -1828,6 +1935,8 @@ void ScreenEdit::TransitionEditState( EditState em )
break;
}
case STATE_RECORDING_PAUSED:
break;
default:
ASSERT(0);
}
@@ -1864,8 +1973,9 @@ void ScreenEdit::TransitionEditState( EditState em )
}
case STATE_RECORDING:
case STATE_RECORDING_PAUSED:
{
m_sprOverlay->PlayCommand( "Record" );
m_sprOverlay->PlayCommand( em == STATE_RECORDING? "Record":"RecordPaused" );
// initialize m_NoteFieldRecord
m_NoteDataRecord.CopyAll( m_NoteDataEdit );
@@ -1896,7 +2006,7 @@ void ScreenEdit::TransitionEditState( EditState em )
m_textPlayRecordHelp.SetHidden( em == STATE_EDITING );
m_SnapDisplay.SetHidden( em != STATE_EDITING );
m_NoteFieldEdit.SetHidden( em != STATE_EDITING );
m_NoteFieldRecord.SetHidden( em != STATE_RECORDING );
m_NoteFieldRecord.SetHidden( em != STATE_RECORDING && em != STATE_RECORDING_PAUSED );
m_Player.SetHidden( em != STATE_PLAYING );
m_Foreground.SetHidden( !PREFSMAN->m_bEditorShowBGChangesPlay || em == STATE_EDITING );
+12 -2
View File
@@ -71,6 +71,7 @@ enum EditButton
EDIT_BUTTON_PLAY_FROM_START,
EDIT_BUTTON_PLAY_FROM_CURSOR,
EDIT_BUTTON_PLAY_SELECTION,
EDIT_BUTTON_RECORD_FROM_CURSOR,
EDIT_BUTTON_RECORD_SELECTION,
EDIT_BUTTON_RETURN_TO_EDIT,
@@ -140,13 +141,21 @@ public:
virtual void Input( const DeviceInput& DeviceI, const InputEventType type, const GameInput &GameI, const MenuInput &MenuI, const StyleInput &StyleI );
void InputEdit( const DeviceInput& DeviceI, const InputEventType type, const GameInput &GameI, const MenuInput &MenuI, const StyleInput &StyleI, EditButton EditB );
void InputRecord( const DeviceInput& DeviceI, const InputEventType type, const GameInput &GameI, const MenuInput &MenuI, const StyleInput &StyleI, EditButton EditB );
void InputRecordPaused( const DeviceInput& DeviceI, const InputEventType type, const GameInput &GameI, const MenuInput &MenuI, const StyleInput &StyleI, EditButton EditB );
void InputPlay( const DeviceInput& DeviceI, const InputEventType type, const GameInput &GameI, const MenuInput &MenuI, const StyleInput &StyleI, EditButton EditB );
virtual void HandleScreenMessage( const ScreenMessage SM );
protected:
virtual ScreenType GetScreenType() const { return m_EditState==STATE_PLAYING ? gameplay : system_menu; }
enum EditState { STATE_EDITING, STATE_RECORDING, STATE_PLAYING, NUM_EDIT_STATES, STATE_INVALID };
enum EditState {
STATE_EDITING,
STATE_RECORDING,
STATE_RECORDING_PAUSED,
STATE_PLAYING,
NUM_EDIT_STATES,
STATE_INVALID
};
void TransitionEditState( EditState em );
void PlayTicks();
void PlayPreviewMusic();
@@ -223,6 +232,7 @@ protected:
Background m_Background;
Foreground m_Foreground;
Course *m_pAttacksFromCourse;
bool m_bReturnToRecordMenuAfterPlay;
// for MODE_RECORD and MODE_PLAY
int m_iStartPlayingAt, m_iStopPlayingAt;
@@ -403,7 +413,7 @@ public:
bool EditPressed( EditButton button, const DeviceInput &DeviceI );
bool EditIsBeingPressed( EditButton button ) const;
const MapEditToDI *GetCurrentMap() const;
MapEditToDI m_EditMappings, m_PlayMappings, m_RecordMappings;
MapEditToDI m_EditMappings, m_PlayMappings, m_RecordMappings, m_RecordPausedMappings;
void MakeFilteredMenuDef( const MenuDef* pDef, MenuDef &menu );
ScreenMiniMenu *LoadEditMiniMenu( const MenuDef* pDef );