Apparently VC doesn't like using (group).GroupType as a type (and frankly, I couldn't get g++ to accept it outside of StepMania, either) so use the macros with PO and SO prefixes for PlayerOptions and SongOptions, respectively. Also, pointers to data members can't point to elements of an array (no idea why gcc was allowing it before) so use Assign_n and pass the index separately. (Very annoying, typeof() should really be in the standard.)

This commit is contained in:
Steve Checkoway
2006-08-05 08:02:49 +00:00
parent 62c5e096f6
commit 0cb22fb806
14 changed files with 53 additions and 39 deletions
+1 -2
View File
@@ -785,8 +785,7 @@ void GameCommand::ApplySelf( const vector<PlayerNumber> &vpns ) const
GAMESTATE->m_PlayMode != OldPlayMode &&
GAMESTATE->m_SongOptions.GetStage().m_LifeType == SongOptions::LIFE_BAR )
{
//MODS_GROUP_ASSIGN( GAMESTATE->m_SongOptions, ModsLevel_Stage, .m_LifeType = SongOptions::LIFE_BATTERY );
MODS_GROUP_ASSIGN( GAMESTATE->m_SongOptions, ModsLevel_Stage, m_LifeType, SongOptions::LIFE_BATTERY );
SO_GROUP_ASSIGN( GAMESTATE->m_SongOptions, ModsLevel_Stage, m_LifeType, SongOptions::LIFE_BATTERY );
}
}
+1 -1
View File
@@ -369,7 +369,7 @@ void GameState::PlayersFinalized()
* sets a default of "reverse", and the player turns it off, we should
* set it off. However, don't reset modifiers that aren't saved by the
* profile, so we don't ignore unsaved modifiers when a profile is in use. */
MODS_GROUP_CALL( GAMESTATE->m_pPlayerState[pn]->m_PlayerOptions, ModsLevel_Preferred, ResetSavedPrefs );
PO_GROUP_CALL( GAMESTATE->m_pPlayerState[pn]->m_PlayerOptions, ModsLevel_Preferred, ResetSavedPrefs );
GAMESTATE->ApplyPreferredModifiers( pn, sModifiers );
}
// Only set the sort order if it wasn't already set by a GameCommand (or by an earlier profile)
+20 -5
View File
@@ -13,9 +13,16 @@ enum ModsLevel
NUM_ModsLevel,
};
#define MODS_GROUP_ASSIGN( group, level, 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_ASSIGN( group, level, member, val ) (group).Assign( (level), member, (val) )
#define MODS_GROUP_ASSIGN_N( group, level, member, n, val ) (group).Assign_n( (level), member, (n), (val) )
#define MODS_GROUP_CALL( group, level, fun ) (group).Call( (level), fun )
#define PO_GROUP_ASSIGN( group, level, member, val ) MODS_GROUP_ASSIGN( (group), (level), &PlayerOptions::member, (val) )
#define PO_GROUP_ASSIGN_N( group, level, member, n, val ) MODS_GROUP_ASSIGN_N( (group), (level), &PlayerOptions::member, (n), (val) )
#define PO_GROUP_CALL( group, level, fun ) MODS_GROUP_CALL( (group), (level), &PlayerOptions::fun )
#define SO_GROUP_ASSIGN( group, level, member, val ) MODS_GROUP_ASSIGN( (group), (level), &SongOptions::member, (val) )
#define SO_GROUP_ASSIGN_N( group, level, member, n, val ) MODS_GROUP_ASSIGN_N( (group), (level), &SongOptions::member, (n), (val) )
#define SO_GROUP_CALL( group, level, fun ) MODS_GROUP_CALL( (group), (level), &SongOptions::fun )
template<class T>
class ModsGroup
@@ -25,8 +32,6 @@ class ModsGroup
T m_Current; // approaches ModsLevel_Song
public:
typedef T GroupType;
void Init()
{
Call( ModsLevel_Preferred, &T::Init );
@@ -49,6 +54,16 @@ public:
m_[level].*member = val;
}
// XXX U T::*member doesn't work, U T::*member[] doesn't work, U (T::*member)[] doesn't work. What is V?
template<typename U, typename V>
void Assign_n( ModsLevel level, V member, size_t index, const U &val )
{
if( level != ModsLevel_Song )
(m_Current.*member)[index] = val;
for( ; level < NUM_ModsLevel; enum_add(level, 1) )
(m_[level].*member)[index] = val;
}
void Assign( ModsLevel level, const T &val )
{
if( level != ModsLevel_Song )
+2 -2
View File
@@ -481,7 +481,7 @@ class DebugLineAssistTick : public IDebugLine
virtual void Do( RString &sMessageOut )
{
bool bAssistTick = !GAMESTATE->m_SongOptions.GetSong().m_bAssistTick;
MODS_GROUP_ASSIGN( GAMESTATE->m_SongOptions, ModsLevel_Song, m_bAssistTick, bAssistTick );
SO_GROUP_ASSIGN( GAMESTATE->m_SongOptions, ModsLevel_Song, m_bAssistTick, bAssistTick );
MESSAGEMAN->Broadcast( Message_AssistTickChanged );
IDebugLine::Do( sMessageOut );
}
@@ -506,7 +506,7 @@ class DebugLineAutosync : public IDebugLine
{
SongOptions::AutosyncType as = enum_add2( GAMESTATE->m_SongOptions.GetSong().m_AutosyncType, 1 );
wrap( (int&)as, SongOptions::NUM_AUTOSYNC_TYPES );
MODS_GROUP_ASSIGN( GAMESTATE->m_SongOptions, ModsLevel_Song, m_AutosyncType, as );
SO_GROUP_ASSIGN( GAMESTATE->m_SongOptions, ModsLevel_Song, m_AutosyncType, as );
MESSAGEMAN->Broadcast( Message_AutosyncChanged );
IDebugLine::Do( sMessageOut );
}
+7 -7
View File
@@ -697,11 +697,11 @@ void ScreenEdit::Init()
const RString &sNoteSkin = EDITOR_NOTE_SKINS[pn];
if( NOTESKIN->DoesNoteSkinExist(sNoteSkin) )
MODS_GROUP_ASSIGN( GAMESTATE->m_pPlayerState[pn]->m_PlayerOptions, ModsLevel_Stage, m_sNoteSkin, sNoteSkin );
PO_GROUP_ASSIGN( GAMESTATE->m_pPlayerState[pn]->m_PlayerOptions, ModsLevel_Stage, m_sNoteSkin, sNoteSkin );
}
m_PlayerStateEdit.m_PlayerNumber = PLAYER_1;
MODS_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_pSteps->GetNoteData( m_NoteDataEdit );
m_NoteFieldEdit.SetXY( EDIT_X, EDIT_Y );
@@ -775,7 +775,7 @@ void ScreenEdit::Init()
ScreenEdit::~ScreenEdit()
{
FOREACH_PlayerNumber( pn )
MODS_GROUP_ASSIGN( GAMESTATE->m_pPlayerState[pn]->m_PlayerOptions, ModsLevel_Stage, m_sNoteSkin, m_sOldNoteSkins[pn] );
PO_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();
@@ -1257,7 +1257,7 @@ void ScreenEdit::InputEdit( const InputEventPlus &input, EditButton EditB )
fScrollSpeed = fSpeeds[iSpeed];
}
MODS_GROUP_ASSIGN( pPlayerState->m_PlayerOptions, ModsLevel_Stage, m_fScrollSpeed, fScrollSpeed );
PO_GROUP_ASSIGN( pPlayerState->m_PlayerOptions, ModsLevel_Stage, m_fScrollSpeed, fScrollSpeed );
break;
}
@@ -1389,7 +1389,7 @@ void ScreenEdit::InputEdit( const InputEventPlus &input, EditButton EditB )
DoHelp();
break;
case EDIT_BUTTON_TOGGLE_ASSIST_TICK:
MODS_GROUP_ASSIGN( GAMESTATE->m_SongOptions, ModsLevel_Stage, m_bAssistTick, !GAMESTATE->m_SongOptions.GetStage().m_bAssistTick );
SO_GROUP_ASSIGN( GAMESTATE->m_SongOptions, ModsLevel_Stage, m_bAssistTick, !GAMESTATE->m_SongOptions.GetStage().m_bAssistTick );
break;
case EDIT_BUTTON_OPEN_NEXT_STEPS:
case EDIT_BUTTON_OPEN_PREV_STEPS:
@@ -2028,7 +2028,7 @@ void ScreenEdit::InputPlay( const InputEventPlus &input, EditButton EditB )
TransitionEditState( STATE_EDITING );
break;
case EDIT_BUTTON_TOGGLE_ASSIST_TICK:
MODS_GROUP_ASSIGN( GAMESTATE->m_SongOptions, ModsLevel_Stage, m_bAssistTick, !GAMESTATE->m_SongOptions.GetStage().m_bAssistTick );
SO_GROUP_ASSIGN( GAMESTATE->m_SongOptions, ModsLevel_Stage, m_bAssistTick, !GAMESTATE->m_SongOptions.GetStage().m_bAssistTick );
break;
case EDIT_BUTTON_TOGGLE_AUTOPLAY:
{
@@ -2151,7 +2151,7 @@ void ScreenEdit::TransitionEditState( EditState em )
{
case STATE_RECORDING:
case STATE_RECORDING_PAUSED:
MODS_GROUP_ASSIGN( GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerOptions, ModsLevel_Stage, m_fScrolls[PlayerOptions::SCROLL_CENTERED], 1.0f );
PO_GROUP_ASSIGN_N( GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerOptions, ModsLevel_Stage, m_fScrolls, PlayerOptions::SCROLL_CENTERED, 1.0f );
break;
}
+4 -4
View File
@@ -40,11 +40,11 @@ ScreenEnding::ScreenEnding() : ScreenAttract( false/*dont reset GAMESTATE*/ )
GAMESTATE->m_pCurSteps[PLAYER_2].Set( GAMESTATE->m_pCurSong->GetAllSteps()[0] );
STATSMAN->m_CurStageStats.m_player[PLAYER_1].vpPlayedSteps.push_back( GAMESTATE->m_pCurSteps[PLAYER_1] );
STATSMAN->m_CurStageStats.m_player[PLAYER_2].vpPlayedSteps.push_back( GAMESTATE->m_pCurSteps[PLAYER_2] );
MODS_GROUP_ASSIGN( GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerOptions, ModsLevel_Stage, m_fScrollSpeed, 2.0f );
MODS_GROUP_ASSIGN( GAMESTATE->m_pPlayerState[PLAYER_2]->m_PlayerOptions, ModsLevel_Stage, m_fScrollSpeed, 2.0f );
PO_GROUP_ASSIGN( GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerOptions, ModsLevel_Stage, m_fScrollSpeed, 2.0f );
PO_GROUP_ASSIGN( GAMESTATE->m_pPlayerState[PLAYER_2]->m_PlayerOptions, ModsLevel_Stage, m_fScrollSpeed, 2.0f );
GAMESTATE->m_iCurrentStageIndex = 0;
MODS_GROUP_CALL( GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerOptions, ModsLevel_Stage, ChooseRandomModifiers );
MODS_GROUP_CALL( GAMESTATE->m_pPlayerState[PLAYER_2]->m_PlayerOptions, ModsLevel_Stage, ChooseRandomModifiers );
PO_GROUP_CALL( GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerOptions, ModsLevel_Stage, ChooseRandomModifiers );
PO_GROUP_CALL( GAMESTATE->m_pPlayerState[PLAYER_2]->m_PlayerOptions, ModsLevel_Stage, ChooseRandomModifiers );
for( float f = 0; f < 100.0f; f += 1.0f )
{
+3 -3
View File
@@ -107,7 +107,7 @@ ScreenEvaluation::ScreenEvaluation()
FOREACH_PlayerNumber( p )
{
if( RandomInt(2) )
MODS_GROUP_ASSIGN( GAMESTATE->m_pPlayerState[p]->m_PlayerOptions, ModsLevel_Stage, m_bTransforms[PlayerOptions::TRANSFORM_ECHO], true ); // show "disqualified"
PO_GROUP_ASSIGN_N( GAMESTATE->m_pPlayerState[p]->m_PlayerOptions, ModsLevel_Stage, m_bTransforms, PlayerOptions::TRANSFORM_ECHO, true ); // show "disqualified"
GAMESTATE->m_bSideIsJoined[p] = true;
GAMESTATE->m_pCurSteps[p].Set( GAMESTATE->m_pCurSong->GetAllSteps()[0] );
@@ -119,8 +119,8 @@ ScreenEvaluation::ScreenEvaluation()
STATSMAN->m_CurStageStats.m_player[p].vpPossibleSteps.push_back( GAMESTATE->m_pCurSteps[PLAYER_1] );
MODS_GROUP_ASSIGN( GAMESTATE->m_pPlayerState[p]->m_PlayerOptions, ModsLevel_Stage, m_fScrollSpeed, 2.0f );
MODS_GROUP_CALL( GAMESTATE->m_pPlayerState[p]->m_PlayerOptions, ModsLevel_Stage, ChooseRandomModifiers );
PO_GROUP_ASSIGN( GAMESTATE->m_pPlayerState[p]->m_PlayerOptions, ModsLevel_Stage, m_fScrollSpeed, 2.0f );
PO_GROUP_CALL( GAMESTATE->m_pPlayerState[p]->m_PlayerOptions, ModsLevel_Stage, ChooseRandomModifiers );
}
for( float f = 0; f < 100.0f; f += 1.0f )
+1 -1
View File
@@ -1027,7 +1027,7 @@ void ScreenGameplay::LoadNextSong()
/* If we're in battery mode, force FailImmediate. We assume in PlayerMinus::Step that
* failed players can't step. */
if( GAMESTATE->m_SongOptions.GetCurrent().m_LifeType == SongOptions::LIFE_BATTERY )
MODS_GROUP_ASSIGN( GAMESTATE->m_SongOptions, ModsLevel_Song, m_FailType, SongOptions::FAIL_IMMEDIATE );
SO_GROUP_ASSIGN( GAMESTATE->m_SongOptions, ModsLevel_Song, m_FailType, SongOptions::FAIL_IMMEDIATE );
m_textSongOptions.SetText( GAMESTATE->m_SongOptions.GetCurrent().GetString() );
+1 -1
View File
@@ -28,7 +28,7 @@ void ScreenGameplaySyncMachine::Init()
ASSERT( pSteps );
GAMESTATE->m_pCurSteps[0].Set( pSteps );
MODS_GROUP_ASSIGN( GAMESTATE->m_SongOptions, ModsLevel_Stage, m_AutosyncType, SongOptions::AUTOSYNC_MACHINE );
SO_GROUP_ASSIGN( GAMESTATE->m_SongOptions, ModsLevel_Stage, m_AutosyncType, SongOptions::AUTOSYNC_MACHINE );
PREFSMAN->m_AutoPlay.Set( PC_HUMAN );
ScreenGameplayNormal::Init( false );
+1 -1
View File
@@ -170,7 +170,7 @@ void ScreenHowToPlay::Init()
SET_XY_AND_ON_COMMAND( m_Player );
// Don't show judgement
MODS_GROUP_ASSIGN( GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerOptions, ModsLevel_Stage, m_fBlind, 1.0f );
PO_GROUP_ASSIGN( GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerOptions, ModsLevel_Stage, m_fBlind, 1.0f );
GAMESTATE->m_MasterPlayerNumber = PLAYER_1;
GAMESTATE->m_bDemonstrationOrJukebox = true;
}
+7 -7
View File
@@ -200,13 +200,13 @@ void ScreenJukebox::Init()
{
/* Lots and lots of arrows. This might even bias to arrows a little
* too much. */
MODS_GROUP_CALL( GAMESTATE->m_pPlayerState[p]->m_PlayerOptions, ModsLevel_Stage, Init );
MODS_GROUP_ASSIGN( GAMESTATE->m_pPlayerState[p]->m_PlayerOptions, ModsLevel_Stage, m_fScrollSpeed, .25f );
MODS_GROUP_ASSIGN( GAMESTATE->m_pPlayerState[p]->m_PlayerOptions, ModsLevel_Stage, m_fPerspectiveTilt, -1.0f );
MODS_GROUP_ASSIGN( GAMESTATE->m_pPlayerState[p]->m_PlayerOptions, ModsLevel_Stage, m_fEffects[ PlayerOptions::EFFECT_MINI ], 1.0f );
PO_GROUP_CALL( GAMESTATE->m_pPlayerState[p]->m_PlayerOptions, ModsLevel_Stage, Init );
PO_GROUP_ASSIGN( GAMESTATE->m_pPlayerState[p]->m_PlayerOptions, ModsLevel_Stage, m_fScrollSpeed, .25f );
PO_GROUP_ASSIGN( GAMESTATE->m_pPlayerState[p]->m_PlayerOptions, ModsLevel_Stage, m_fPerspectiveTilt, -1.0f );
PO_GROUP_ASSIGN_N( GAMESTATE->m_pPlayerState[p]->m_PlayerOptions, ModsLevel_Stage, m_fEffects, PlayerOptions::EFFECT_MINI, 1.0f );
}
MODS_GROUP_ASSIGN( GAMESTATE->m_SongOptions, ModsLevel_Stage, m_LifeType, SongOptions::LIFE_BATTERY );
MODS_GROUP_ASSIGN( GAMESTATE->m_SongOptions, ModsLevel_Stage, m_FailType, SongOptions::FAIL_OFF );
SO_GROUP_ASSIGN( GAMESTATE->m_SongOptions, ModsLevel_Stage, m_LifeType, SongOptions::LIFE_BATTERY );
SO_GROUP_ASSIGN( GAMESTATE->m_SongOptions, ModsLevel_Stage, m_FailType, SongOptions::FAIL_OFF );
}
FOREACH_EnabledPlayer( p )
@@ -227,7 +227,7 @@ void ScreenJukebox::Init()
GAMESTATE->GetDefaultSongOptions( so );
GAMESTATE->m_SongOptions.Assign( ModsLevel_Stage, so );
MODS_GROUP_ASSIGN( GAMESTATE->m_SongOptions, ModsLevel_Stage, m_FailType, SongOptions::FAIL_OFF );
SO_GROUP_ASSIGN( GAMESTATE->m_SongOptions, ModsLevel_Stage, m_FailType, SongOptions::FAIL_OFF );
GAMESTATE->m_bDemonstrationOrJukebox = true;
+2 -2
View File
@@ -114,8 +114,8 @@ void ScreenNameEntry::Init()
// reset Player and Song Options
{
FOREACH_PlayerNumber( p )
MODS_GROUP_CALL( GAMESTATE->m_pPlayerState[p]->m_PlayerOptions, ModsLevel_Stage, Init );
MODS_GROUP_CALL( GAMESTATE->m_SongOptions, ModsLevel_Stage, Init );
PO_GROUP_CALL( GAMESTATE->m_pPlayerState[p]->m_PlayerOptions, ModsLevel_Stage, Init );
SO_GROUP_CALL( GAMESTATE->m_SongOptions, ModsLevel_Stage, Init );
}
vector<GameState::RankingFeat> aFeats[NUM_PLAYERS];
+1 -1
View File
@@ -158,7 +158,7 @@ void ScreenPlayerOptions::UpdateDisqualified( int row, PlayerNumber pn )
// Find out if the current row when exprorted causes disqualification.
// Exporting the row will fill GAMESTATE->m_PlayerOptions.
MODS_GROUP_CALL( GAMESTATE->m_pPlayerState[pn]->m_PlayerOptions, ModsLevel_Preferred, Init );
PO_GROUP_CALL( GAMESTATE->m_pPlayerState[pn]->m_PlayerOptions, ModsLevel_Preferred, Init );
vector<PlayerNumber> v;
v.push_back( pn );
ExportOptions( row, v );
+2 -2
View File
@@ -1170,8 +1170,8 @@ void ScreenSelectMusic::MenuStart( PlayerNumber pn )
// apply #LIVES
if( pCourse->m_iLives != -1 )
{
MODS_GROUP_ASSIGN( GAMESTATE->m_SongOptions, ModsLevel_Stage, m_LifeType, SongOptions::LIFE_BATTERY );
MODS_GROUP_ASSIGN( GAMESTATE->m_SongOptions, ModsLevel_Stage, m_iBatteryLives, pCourse->m_iLives );
SO_GROUP_ASSIGN( GAMESTATE->m_SongOptions, ModsLevel_Stage, m_LifeType, SongOptions::LIFE_BATTERY );
SO_GROUP_ASSIGN( GAMESTATE->m_SongOptions, ModsLevel_Stage, m_iBatteryLives, pCourse->m_iLives );
}
m_bMadeChoice = true;