save Preferred, Stage, Song, and Current modifiers separately. This eliminates the fragile mods store/restore.

This commit is contained in:
Chris Danford
2006-08-05 02:38:05 +00:00
parent 5440a7b613
commit 7ac45c24e4
47 changed files with 389 additions and 363 deletions
+18 -24
View File
@@ -680,8 +680,6 @@ void ScreenEdit::Init()
GAMESTATE->m_fSongBeat = 0;
m_fTrailingBeat = GAMESTATE->m_fSongBeat;
GAMESTATE->StoreSelectedOptions();
m_iShiftAnchor = -1;
m_iStartPlayingAt = -1;
m_iStopPlayingAt = -1;
@@ -695,15 +693,15 @@ void ScreenEdit::Init()
FOREACH_PlayerNumber( pn )
{
m_sOldNoteSkins[pn] = GAMESTATE->m_pPlayerState[pn]->m_PlayerOptions.m_sNoteSkin;
m_sOldNoteSkins[pn] = GAMESTATE->m_pPlayerState[pn]->m_PlayerOptions.GetStage().m_sNoteSkin;
const RString &sNoteSkin = EDITOR_NOTE_SKINS[pn];
if( NOTESKIN->DoesNoteSkinExist(sNoteSkin) )
GAMESTATE->m_pPlayerState[pn]->m_PlayerOptions.m_sNoteSkin = sNoteSkin;
MODS_GROUP_ASSIGN( GAMESTATE->m_pPlayerState[pn]->m_PlayerOptions, ModsLevel_Stage, .m_sNoteSkin = sNoteSkin );
}
m_PlayerStateEdit.m_PlayerNumber = PLAYER_1;
m_PlayerStateEdit.m_PlayerOptions.m_sNoteSkin = GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerOptions.m_sNoteSkin;
MODS_GROUP_ASSIGN( m_PlayerStateEdit.m_PlayerOptions, ModsLevel_Stage, .m_sNoteSkin = GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerOptions.GetStage().m_sNoteSkin );
m_pSteps->GetNoteData( m_NoteDataEdit );
m_NoteFieldEdit.SetXY( EDIT_X, EDIT_Y );
@@ -776,7 +774,7 @@ void ScreenEdit::Init()
ScreenEdit::~ScreenEdit()
{
FOREACH_PlayerNumber( pn )
GAMESTATE->m_pPlayerState[pn]->m_PlayerOptions.m_sNoteSkin = m_sOldNoteSkins[pn];
MODS_GROUP_ASSIGN( GAMESTATE->m_pPlayerState[pn]->m_PlayerOptions, ModsLevel_Stage, .m_sNoteSkin = m_sOldNoteSkins[pn] );
// UGLY: Don't delete the Song's steps.
m_songLastSave.DetachSteps();
@@ -798,7 +796,7 @@ void ScreenEdit::EndScreen()
// play assist ticks
void ScreenEdit::PlayTicks()
{
if( !GAMESTATE->m_SongOptions.m_bAssistTick || m_EditState != STATE_PLAYING )
if( !GAMESTATE->m_SongOptions.GetStage().m_bAssistTick || m_EditState != STATE_PLAYING )
return;
/* Sound cards have a latency between when a sample is Play()ed and when the sound
@@ -962,7 +960,7 @@ void ScreenEdit::Update( float fDeltaTime )
float fDelta = GAMESTATE->m_fSongBeat - m_fTrailingBeat;
if( fabsf(fDelta) < 10 )
fapproach( m_fTrailingBeat, GAMESTATE->m_fSongBeat,
fDeltaTime*40 / m_NoteFieldEdit.GetPlayerState()->m_CurrentPlayerOptions.m_fScrollSpeed );
fDeltaTime*40 / m_NoteFieldEdit.GetPlayerState()->m_PlayerOptions.GetCurrent().m_fScrollSpeed );
else
fapproach( m_fTrailingBeat, GAMESTATE->m_fSongBeat,
fabsf(fDelta) * fDeltaTime*5 );
@@ -1233,7 +1231,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.m_fScrollSpeed;
float fScrollSpeed = pPlayerState->m_PlayerOptions.GetStage().m_fScrollSpeed;
const float fSpeeds[] = { 1.0f, 1.5f, 2.0f, 3.0f, 4.0f, 6.0f, 8.0f };
int iSpeed = 0;
@@ -1258,6 +1256,7 @@ void ScreenEdit::InputEdit( const InputEventPlus &input, EditButton EditB )
fScrollSpeed = fSpeeds[iSpeed];
}
MODS_GROUP_ASSIGN( pPlayerState->m_PlayerOptions, ModsLevel_Stage, .m_fScrollSpeed = fScrollSpeed );
break;
}
@@ -1389,7 +1388,7 @@ void ScreenEdit::InputEdit( const InputEventPlus &input, EditButton EditB )
DoHelp();
break;
case EDIT_BUTTON_TOGGLE_ASSIST_TICK:
GAMESTATE->m_SongOptions.m_bAssistTick ^= 1;
MODS_GROUP_ASSIGN( GAMESTATE->m_SongOptions, ModsLevel_Stage, .m_bAssistTick ^= 1 );
break;
case EDIT_BUTTON_OPEN_NEXT_STEPS:
case EDIT_BUTTON_OPEN_PREV_STEPS:
@@ -1784,7 +1783,7 @@ void ScreenEdit::InputEdit( const InputEventPlus &input, EditButton EditB )
}
g_fLastInsertAttackPositionSeconds = fStart;
g_fLastInsertAttackDurationSeconds = fEnd - fStart;
GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerOptions = po;
MODS_GROUP_ASSIGN( GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerOptions, ModsLevel_Stage, = po );
SCREENMAN->AddNewScreenToTop( "ScreenPlayerOptions", SM_BackFromInsertCourseAttackPlayerOptions );
}
@@ -2028,7 +2027,7 @@ void ScreenEdit::InputPlay( const InputEventPlus &input, EditButton EditB )
TransitionEditState( STATE_EDITING );
break;
case EDIT_BUTTON_TOGGLE_ASSIST_TICK:
GAMESTATE->m_SongOptions.m_bAssistTick ^= 1;
MODS_GROUP_ASSIGN( GAMESTATE->m_SongOptions, ModsLevel_Stage, .m_bAssistTick ^= 1 );
break;
case EDIT_BUTTON_TOGGLE_AUTOPLAY:
{
@@ -2151,12 +2150,13 @@ void ScreenEdit::TransitionEditState( EditState em )
{
case STATE_RECORDING:
case STATE_RECORDING_PAUSED:
GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerOptions.m_fScrolls[PlayerOptions::SCROLL_CENTERED] = 1.0f;
MODS_GROUP_ASSIGN( GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerOptions, ModsLevel_Stage, .m_fScrolls[PlayerOptions::SCROLL_CENTERED] = 1.0f );
break;
}
/* Snap to current options. */
GAMESTATE->m_pPlayerState[PLAYER_1]->m_CurrentPlayerOptions = GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerOptions;
GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerOptions.m_current = GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerOptions.GetStage();
}
switch( em )
@@ -2205,9 +2205,6 @@ void ScreenEdit::TransitionEditState( EditState em )
switch( em )
{
case STATE_PLAYING:
GAMESTATE->RestoreSelectedOptions();
GAMESTATE->StoreStageOptions();
/* If we're in course display mode, set that up. */
SetupCourseAttacks();
@@ -2275,7 +2272,7 @@ void ScreenEdit::TransitionEditState( EditState em )
LOG->Trace( "Starting playback at %f", fStartSeconds );
RageSoundParams p;
p.SetPlaybackRate( GAMESTATE->m_SongOptions.m_fMusicRate );
p.SetPlaybackRate( GAMESTATE->m_SongOptions.GetCurrent().m_fMusicRate );
p.m_StartSecond = fStartSeconds;
p.m_bAccurateSync = true;
p.StopMode = RageSoundParams::M_CONTINUE;
@@ -2415,9 +2412,6 @@ void ScreenEdit::HandleScreenMessage( const ScreenMessage SM )
}
else if( SM == SM_BackFromOptions )
{
// Store the new options, so they stick when we RebuildPlayerOptionsFromActiveAttacks.
GAMESTATE->StoreSelectedOptions();
// The options may have changed the note skin.
m_NoteFieldRecord.CacheAllUsedNoteSkins();
m_Player->CacheAllUsedNoteSkins();
@@ -2434,7 +2428,7 @@ void ScreenEdit::HandleScreenMessage( const ScreenMessage SM )
}
else if( SM == SM_BackFromInsertTapAttackPlayerOptions )
{
PlayerOptions poChosen = GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerOptions;
PlayerOptions poChosen = GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerOptions.GetPreferred();
RString sMods = poChosen.GetString();
const int row = BeatToNoteRow( GAMESTATE->m_fSongBeat );
@@ -2474,13 +2468,13 @@ void ScreenEdit::HandleScreenMessage( const ScreenMessage SM )
if( iAttack >= 0 )
po.FromString( ce.attacks[iAttack].sModifiers );
GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerOptions = po;
MODS_GROUP_ASSIGN( GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerOptions, ModsLevel_Preferred, = po );
SCREENMAN->AddNewScreenToTop( "ScreenPlayerOptions", SM_BackFromInsertCourseAttackPlayerOptions );
}
}
else if( SM == SM_BackFromInsertCourseAttackPlayerOptions )
{
PlayerOptions poChosen = GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerOptions;
PlayerOptions poChosen = GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerOptions.GetPreferred();
RString sMods = poChosen.GetString();
Course *pCourse = GAMESTATE->m_pCurCourse;