add ScreenEdit::EditModifiers

add AutoKeysounds support to ScreenEdit
TODO: The gameplay portion of the editor should push a ScreenGameplay onto the Screen stack.  There's a lot of unnecessary duplication in ScreenEdit.
This commit is contained in:
Chris Danford
2007-04-24 05:42:44 +00:00
parent 79fd5b35fd
commit 366bc7cd13
2 changed files with 112 additions and 40 deletions
+109 -39
View File
@@ -33,6 +33,8 @@
#include "Style.h"
#include "ThemeManager.h"
#include "ThemeMetric.h"
#include "Game.h"
#include "RageSoundReader.h"
static Preference<float> g_iDefaultRecordLength( "DefaultRecordLength", 4 );
static Preference<bool> g_bEditorShowBGChangesPlay( "EditorShowBGChangesPlay", false );
@@ -638,10 +640,16 @@ static void SetDefaultEditorNoteSkin( size_t num, RString &sNameOut, RString &de
static Preference1D<RString> EDITOR_NOTE_SKINS( SetDefaultEditorNoteSkin, NUM_PLAYERS );
static ThemeMetric<RString> EDIT_MODIFIERS ("ScreenEdit","EditModifiers");
REGISTER_SCREEN_CLASS( ScreenEdit );
void ScreenEdit::Init()
{
m_pSoundMusic = NULL;
SubscribeToMessage( "Judgment" );
ASSERT( GAMESTATE->m_pCurSong );
ASSERT( GAMESTATE->m_pCurSteps[PLAYER_1] );
@@ -707,9 +715,9 @@ void ScreenEdit::Init()
}
else
{
PO_GROUP_ASSIGN( m_PlayerStateEdit.m_PlayerOptions, ModsLevel_Stage, m_sNoteSkin,
GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerOptions.GetStage().m_sNoteSkin );
PO_GROUP_ASSIGN( m_PlayerStateEdit.m_PlayerOptions, ModsLevel_Stage, m_sNoteSkin, GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerOptions.GetStage().m_sNoteSkin );
}
m_PlayerStateEdit.m_PlayerOptions.FromString( ModsLevel_Stage, EDIT_MODIFIERS );
m_pSteps->GetNoteData( m_NoteDataEdit );
m_NoteFieldEdit.SetXY( EDIT_X, EDIT_Y );
@@ -773,9 +781,11 @@ void ScreenEdit::Init()
m_soundSave.Load( THEME->GetPathS("ScreenEdit","save") );
m_GameplayAssist.Init();
RageSoundLoadParams params;
params.m_bSupportRateChanging = true;
m_soundMusic.Load( m_pSong->GetMusicPath(), false, &params );
m_AutoKeysounds.FinishLoading();
m_pSoundMusic = m_AutoKeysounds.GetSound();
this->HandleScreenMessage( SM_UpdateTextInfo );
m_bTextInfoNeedsUpdate = true;
@@ -789,7 +799,7 @@ ScreenEdit::~ScreenEdit()
m_SongLastSave.DetachSteps();
LOG->Trace( "ScreenEdit::~ScreenEdit()" );
m_soundMusic.StopPlaying();
m_pSoundMusic->StopPlaying();
}
void ScreenEdit::BeginScreen()
@@ -855,10 +865,10 @@ void ScreenEdit::Update( float fDeltaTime )
{
m_PlayerStateEdit.Update( fDeltaTime );
if( m_soundMusic.IsPlaying() )
if( m_pSoundMusic->IsPlaying() )
{
RageTimer tm;
const float fSeconds = m_soundMusic.GetPositionSeconds( NULL, &tm );
const float fSeconds = m_pSoundMusic->GetPositionSeconds( NULL, &tm );
GAMESTATE->UpdateSongPosition( fSeconds, GAMESTATE->m_pCurSong->m_Timing, tm );
}
@@ -876,7 +886,7 @@ void ScreenEdit::Update( float fDeltaTime )
if( GAMESTATE->m_fSongBeat <= fStartPlayingAtBeat )
continue;
float fStartedHoldingSeconds = m_soundMusic.GetPositionSeconds() - fSecsHeld;
float fStartedHoldingSeconds = m_pSoundMusic->GetPositionSeconds() - fSecsHeld;
float fStartBeat = max( fStartPlayingAtBeat, m_pSong->GetBeatFromElapsedTime(fStartedHoldingSeconds) );
float fEndBeat = max( fStartBeat, GAMESTATE->m_fSongBeat );
fEndBeat = min( fEndBeat, NoteRowToBeat(m_iStopPlayingAt) );
@@ -1055,7 +1065,7 @@ void ScreenEdit::DrawPrimitives()
float fSongBeatNoOffset = GAMESTATE->m_fSongBeatNoOffset;
float fSongBeatVisible = GAMESTATE->m_fSongBeatVisible;
if( !m_soundMusic.IsPlaying() )
if( !m_pSoundMusic->IsPlaying() )
{
GAMESTATE->m_fSongBeat = m_fTrailingBeat; // put trailing beat in effect
GAMESTATE->m_fSongBeatNoOffset = m_fTrailingBeat; // put trailing beat in effect
@@ -1064,7 +1074,7 @@ void ScreenEdit::DrawPrimitives()
ScreenWithMenuElements::DrawPrimitives();
if( !m_soundMusic.IsPlaying() )
if( !m_pSoundMusic->IsPlaying() )
{
GAMESTATE->m_fSongBeat = fSongBeat; // restore real song beat
GAMESTATE->m_fSongBeatNoOffset = fSongBeatNoOffset;
@@ -1237,7 +1247,7 @@ void ScreenEdit::InputEdit( const InputEventPlus &input, EditButton EditB )
case EDIT_BUTTON_SCROLL_SPEED_DOWN:
{
PlayerState *pPlayerState = const_cast<PlayerState *> (m_NoteFieldEdit.GetPlayerState());
float fScrollSpeed = pPlayerState->m_PlayerOptions.GetStage().m_fScrollSpeed;
float fScrollSpeed = pPlayerState->m_PlayerOptions.GetSong().m_fScrollSpeed;
const float fSpeeds[] = { 1.0f, 1.5f, 2.0f, 3.0f, 4.0f, 6.0f, 8.0f };
int iSpeed = 0;
@@ -1250,10 +1260,16 @@ void ScreenEdit::InputEdit( const InputEventPlus &input, EditButton EditB )
}
}
if( EditB == EDIT_BUTTON_SCROLL_SPEED_DOWN )
switch( EditB )
{
DEFAULT_FAIL(EditB);
case EDIT_BUTTON_SCROLL_SPEED_DOWN:
--iSpeed;
else if( EditB == EDIT_BUTTON_SCROLL_SPEED_UP )
break;
case EDIT_BUTTON_SCROLL_SPEED_UP:
++iSpeed;
break;
}
iSpeed = clamp( iSpeed, 0, (int) ARRAYLEN(fSpeeds)-1 );
if( fSpeeds[iSpeed] != fScrollSpeed )
@@ -1262,7 +1278,7 @@ void ScreenEdit::InputEdit( const InputEventPlus &input, EditButton EditB )
fScrollSpeed = fSpeeds[iSpeed];
}
PO_GROUP_ASSIGN( pPlayerState->m_PlayerOptions, ModsLevel_Stage, m_fScrollSpeed, fScrollSpeed );
PO_GROUP_ASSIGN( pPlayerState->m_PlayerOptions, ModsLevel_Song, m_fScrollSpeed, fScrollSpeed );
break;
}
@@ -1296,6 +1312,9 @@ void ScreenEdit::InputEdit( const InputEventPlus &input, EditButton EditB )
break;
}
if( m_PlayerStateEdit.m_PlayerOptions.GetSong().m_fScrolls[PlayerOptions::SCROLL_REVERSE] > 0.5 )
fBeatsToMove *= -1;
float fDestinationBeat = GAMESTATE->m_fSongBeat + fBeatsToMove;
fDestinationBeat = Quantize( fDestinationBeat, NoteTypeToBeat(m_SnapDisplay.GetNoteType()) );
@@ -2023,7 +2042,50 @@ void ScreenEdit::InputRecordPaused( const InputEventPlus &input, EditButton Edit
void ScreenEdit::InputPlay( const InputEventPlus &input, EditButton EditB )
{
if( input.type == IET_FIRST_PRESS )
switch( input.type )
{
case IET_RELEASE:
case IET_FIRST_PRESS:
break;
default:
return;
}
GameButtonType gbt = GAMESTATE->m_pCurGame->GetPerButtonInfo(input.GameI.button)->m_gbt;
if( GamePreferences::m_AutoPlay == PC_HUMAN )
{
const int iCol = GAMESTATE->GetCurrentStyle()->GameInputToColumn( input.GameI );
bool bRelease = input.type == IET_RELEASE;
switch( input.pn )
{
case PLAYER_1:
{
switch( gbt )
{
case GameButtonType_INVALID:
break;
case GameButtonType_Step:
if( iCol != -1 )
m_Player->Step( iCol, -1, input.DeviceI.ts, false, bRelease );
break;
case GameButtonType_Fret:
if( iCol != -1 )
m_Player->Fret( iCol, -1, input.DeviceI.ts, false, bRelease );
break;
case GameButtonType_Strum:
m_Player->Strum( iCol, -1, input.DeviceI.ts, false, bRelease );
break;
}
}
break;
case PLAYER_2:
if( GAMESTATE->GetCurrentStyle()->m_StyleType == StyleType_TwoPlayersSharedSides )
m_Player->Step( iCol, -1, input.DeviceI.ts, false, input.type == IET_RELEASE );
}
}
if( gbt == GameButtonType_INVALID && input.type == IET_FIRST_PRESS )
{
switch( EditB )
{
@@ -2060,25 +2122,6 @@ void ScreenEdit::InputPlay( const InputEventPlus &input, EditButton EditB )
break;
}
}
else if( input.type != IET_RELEASE )
{
return;
}
const int iCol = GAMESTATE->GetCurrentStyle()->GameInputToColumn( input.GameI );
if( GamePreferences::m_AutoPlay != PC_HUMAN || iCol == -1 )
return;
switch( input.pn )
{
case PLAYER_1:
m_Player->Step( iCol, -1, input.DeviceI.ts, false, input.type == IET_RELEASE );
break;
case PLAYER_2:
if( GAMESTATE->GetCurrentStyle()->m_StyleType == StyleType_TwoPlayersSharedSides )
m_Player->Step( iCol, -1, input.DeviceI.ts, false, input.type == IET_RELEASE );
}
}
void ScreenEdit::TransitionEditState( EditState em )
@@ -2110,7 +2153,8 @@ void ScreenEdit::TransitionEditState( EditState em )
/* If we're playing music, sample music or assist ticks when changing modes, stop. */
SOUND->StopMusic();
m_soundMusic.StopPlaying();
if( m_pSoundMusic )
m_pSoundMusic->StopPlaying();
m_GameplayAssist.StopPlaying();
GAMESTATE->m_bGameplayLeadIn.Set( true );
@@ -2281,8 +2325,8 @@ void ScreenEdit::TransitionEditState( EditState em )
p.m_fSpeed = GAMESTATE->m_SongOptions.GetCurrent().m_fMusicRate;
p.m_StartSecond = fStartSeconds;
p.StopMode = RageSoundParams::M_CONTINUE;
m_soundMusic.SetProperty( "AccurateSync", true );
m_soundMusic.Play( &p );
m_pSoundMusic->SetProperty( "AccurateSync", true );
m_pSoundMusic->Play( &p );
break;
}
@@ -2358,6 +2402,32 @@ void ScreenEdit::ScrollTo( float fDestinationBeat )
void ScreenEdit::HandleMessage( const Message &msg )
{
if( msg == "Judgment" )
{
PlayerNumber pn;
msg.GetParam( "Player", pn );
if( GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerOptions.GetCurrent().m_bMuteOnError )
{
RageSoundReader *pSoundReader = m_AutoKeysounds.GetPlayerSound( pn );
if( pSoundReader == NULL )
pSoundReader = m_AutoKeysounds.GetSharedSound();
HoldNoteScore hns;
msg.GetParam( "HoldNoteScore", hns );
TapNoteScore tns;
msg.GetParam( "TapNoteScore", tns );
bool bOn = false;
if( hns != HoldNoteScore_Invalid )
bOn = hns != HNS_LetGo;
else
bOn = tns != TNS_Miss;
if( pSoundReader )
pSoundReader->SetProperty( "Volume", bOn? 1.0f:0.0f );
}
}
if( msg == Message_SongModified )
{
SetDirty( true );
@@ -2780,7 +2850,7 @@ void ScreenEdit::HandleMainMenuChoice( MainMenuChoice c, const vector<int> &iAns
/* XXX: If the difficulty is changed from EDIT, and pSteps->WasLoadedFromProfile()
* is true, we should warn that the steps will no longer be saved to the profile. */
Steps* pSteps = GAMESTATE->m_pCurSteps[PLAYER_1];
float fMusicSeconds = m_soundMusic.GetLengthSeconds();
float fMusicSeconds = m_pSoundMusic->GetLengthSeconds();
g_StepsInformation.rows[difficulty].choices.clear();
FOREACH_ENUM( Difficulty, dc )
+3 -1
View File
@@ -17,6 +17,7 @@
#include "PlayerState.h"
#include "GameInput.h"
#include "GameplayAssist.h"
#include "AutoKeysounds.h"
#include <map>
@@ -276,7 +277,8 @@ protected:
int m_iStartPlayingAt, m_iStopPlayingAt;
float m_fBeatToReturnTo;
RageSound m_soundMusic;
AutoKeysounds m_AutoKeysounds;
RageSound *m_pSoundMusic;
GameplayAssist m_GameplayAssist;
ThemeMetric<EditMode> EDIT_MODE;