Remove Toggle and make the members private. Now, when setting a lower level, it must be applied to the higher levels.

This commit is contained in:
Steve Checkoway
2006-08-05 05:50:11 +00:00
parent 24abc3ec89
commit 62c5e096f6
3 changed files with 19 additions and 23 deletions
+15 -18
View File
@@ -16,15 +16,16 @@ enum ModsLevel
#define MODS_GROUP_ASSIGN( group, level, member, val ) \ #define MODS_GROUP_ASSIGN( group, level, member, val ) \
(group).Assign( (level), &(group).GroupType::member, (val) ) (group).Assign( (level), &(group).GroupType::member, (val) )
#define MODS_GROUP_CALL( group, level, fun ) (group).Call( (level), &(group).GroupType::fun ) #define MODS_GROUP_CALL( group, level, fun ) (group).Call( (level), &(group).GroupType::fun )
#define MODS_GROUP_TOGGLE( group, level, member ) (group).Call( (level), &(group).GroupType::member )
template<class T> template<class T>
struct ModsGroup class ModsGroup
{ {
typedef T GroupType;
T m_[NUM_ModsLevel]; T m_[NUM_ModsLevel];
RageTimer m_timer; RageTimer m_Timer;
T m_current; // approaches ModsLevel_Song T m_Current; // approaches ModsLevel_Song
public:
typedef T GroupType;
void Init() void Init()
{ {
@@ -35,15 +36,15 @@ struct ModsGroup
{ {
// Don't let the mod approach speed be affected by Tab. // Don't let the mod approach speed be affected by Tab.
// TODO: Find a more elegant way of handling this. // TODO: Find a more elegant way of handling this.
fDelta = m_timer.GetDeltaTime(); fDelta = m_Timer.GetDeltaTime();
m_current.Approach( m_[ModsLevel_Song], fDelta ); m_Current.Approach( m_[ModsLevel_Song], fDelta );
} }
template<typename U> template<typename U>
void Assign( ModsLevel level, U T::*member, const U &val ) void Assign( ModsLevel level, U T::*member, const U &val )
{ {
if( level != ModsLevel_Song ) if( level != ModsLevel_Song )
m_current.*member = val; m_Current.*member = val;
for( ; level < NUM_ModsLevel; enum_add(level, 1) ) for( ; level < NUM_ModsLevel; enum_add(level, 1) )
m_[level].*member = val; m_[level].*member = val;
} }
@@ -51,7 +52,7 @@ struct ModsGroup
void Assign( ModsLevel level, const T &val ) void Assign( ModsLevel level, const T &val )
{ {
if( level != ModsLevel_Song ) if( level != ModsLevel_Song )
m_current = val; m_Current = val;
for( ; level < NUM_ModsLevel; enum_add(level, 1) ) for( ; level < NUM_ModsLevel; enum_add(level, 1) )
m_[level] = val; m_[level] = val;
} }
@@ -59,7 +60,7 @@ struct ModsGroup
void Call( ModsLevel level, void (T::*fun)() ) void Call( ModsLevel level, void (T::*fun)() )
{ {
if( level != ModsLevel_Song ) if( level != ModsLevel_Song )
(m_current.*fun)(); (m_Current.*fun)();
for( ; level < NUM_ModsLevel; enum_add(level, 1) ) for( ; level < NUM_ModsLevel; enum_add(level, 1) )
(m_[level].*fun)(); (m_[level].*fun)();
} }
@@ -67,24 +68,20 @@ struct ModsGroup
void FromString( ModsLevel level, const RString &str ) void FromString( ModsLevel level, const RString &str )
{ {
if( level != ModsLevel_Song ) if( level != ModsLevel_Song )
m_current.FromString( str ); m_Current.FromString( str );
for( ; level < NUM_ModsLevel; enum_add(level, 1) ) for( ; level < NUM_ModsLevel; enum_add(level, 1) )
m_[level].FromString( str ); m_[level].FromString( str );
} }
// This seems like a very strange thing to do. void SetCurrentToLevel( ModsLevel level )
void Toggle( ModsLevel level, bool T::*member )
{ {
if( level != ModsLevel_Song ) m_Current = m_[level];
m_current.*member ^= 1;
for( ; level < NUM_ModsLevel; enum_add(level, 1) )
m_[level].*member ^= 1;
} }
const T &GetPreferred() const { return m_[ModsLevel_Preferred]; } const T &GetPreferred() const { return m_[ModsLevel_Preferred]; }
const T &GetStage() const { return m_[ModsLevel_Stage]; } const T &GetStage() const { return m_[ModsLevel_Stage]; }
const T &GetSong() const { return m_[ModsLevel_Song]; } const T &GetSong() const { return m_[ModsLevel_Song]; }
const T &GetCurrent() const { return m_current; } const T &GetCurrent() const { return m_Current; }
}; };
#endif #endif
+3 -4
View File
@@ -1389,7 +1389,7 @@ void ScreenEdit::InputEdit( const InputEventPlus &input, EditButton EditB )
DoHelp(); DoHelp();
break; break;
case EDIT_BUTTON_TOGGLE_ASSIST_TICK: case EDIT_BUTTON_TOGGLE_ASSIST_TICK:
MODS_GROUP_TOGGLE( GAMESTATE->m_SongOptions, ModsLevel_Stage, m_bAssistTick ); MODS_GROUP_ASSIGN( GAMESTATE->m_SongOptions, ModsLevel_Stage, m_bAssistTick, !GAMESTATE->m_SongOptions.GetStage().m_bAssistTick );
break; break;
case EDIT_BUTTON_OPEN_NEXT_STEPS: case EDIT_BUTTON_OPEN_NEXT_STEPS:
case EDIT_BUTTON_OPEN_PREV_STEPS: case EDIT_BUTTON_OPEN_PREV_STEPS:
@@ -2028,7 +2028,7 @@ void ScreenEdit::InputPlay( const InputEventPlus &input, EditButton EditB )
TransitionEditState( STATE_EDITING ); TransitionEditState( STATE_EDITING );
break; break;
case EDIT_BUTTON_TOGGLE_ASSIST_TICK: case EDIT_BUTTON_TOGGLE_ASSIST_TICK:
MODS_GROUP_TOGGLE( GAMESTATE->m_SongOptions, ModsLevel_Stage, m_bAssistTick ); MODS_GROUP_ASSIGN( GAMESTATE->m_SongOptions, ModsLevel_Stage, m_bAssistTick, !GAMESTATE->m_SongOptions.GetStage().m_bAssistTick );
break; break;
case EDIT_BUTTON_TOGGLE_AUTOPLAY: case EDIT_BUTTON_TOGGLE_AUTOPLAY:
{ {
@@ -2156,8 +2156,7 @@ void ScreenEdit::TransitionEditState( EditState em )
} }
/* Snap to current options. */ /* Snap to current options. */
GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerOptions.SetCurrentToLevel( ModsLevel_Stage );
GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerOptions.m_current = GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerOptions.GetStage();
} }
switch( em ) switch( em )
+1 -1
View File
@@ -975,7 +975,7 @@ void ScreenGameplay::SetupSong( int iSongIndex )
pi->GetPlayerState()->Update( 0 ); pi->GetPlayerState()->Update( 0 );
/* Hack: Course modifiers that are set to start immediately shouldn't tween on. */ /* Hack: Course modifiers that are set to start immediately shouldn't tween on. */
pi->GetPlayerState()->m_PlayerOptions.m_current = pi->GetPlayerState()->m_PlayerOptions.GetStage(); pi->GetPlayerState()->m_PlayerOptions.SetCurrentToLevel( ModsLevel_Stage );
} }
} }