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:
+15
-18
@@ -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
|
||||||
|
|||||||
@@ -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 )
|
||||||
|
|||||||
@@ -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 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user