Files
itgmania212121/stepmania/src/ScreenOptionsMasterPrefs.cpp
T

738 lines
24 KiB
C++
Raw Normal View History

#include "global.h"
#include "ScreenOptionsMasterPrefs.h"
#include "PrefsManager.h"
2003-09-28 07:14:07 +00:00
#include "ThemeManager.h"
#include "AnnouncerManager.h"
#include "NoteSkinManager.h"
#include "PlayerOptions.h"
#include "SongOptions.h"
2003-09-29 02:24:53 +00:00
#include "RageDisplay.h"
#include "RageUtil.h"
2003-09-29 03:22:51 +00:00
#include "GameManager.h"
#include "GameState.h"
2003-10-02 01:41:09 +00:00
#include "StepMania.h"
2004-07-25 17:07:32 +00:00
#include "Game.h"
#include "Foreach.h"
#include "GameConstantsAndTypes.h"
2005-11-26 07:22:33 +00:00
#include "DisplayResolutions.h"
2006-01-08 18:40:20 +00:00
#include "LocalizedString.h"
static void GetPrefsDefaultModifiers( PlayerOptions &po, SongOptions &so )
2003-09-29 06:28:17 +00:00
{
po.FromString( PREFSMAN->m_sDefaultModifiers );
so.FromString( PREFSMAN->m_sDefaultModifiers );
2003-09-29 06:28:17 +00:00
}
static void SetPrefsDefaultModifiers( const PlayerOptions &po, const SongOptions &so )
2003-09-29 06:28:17 +00:00
{
2006-01-22 01:00:06 +00:00
vector<RString> as;
2003-09-29 06:28:17 +00:00
if( po.GetString() != "" )
as.push_back( po.GetString() );
if( so.GetString() != "" )
as.push_back( so.GetString() );
PREFSMAN->m_sDefaultModifiers.Set( join(", ",as) );
2003-09-29 06:28:17 +00:00
}
/* Ugly: the input values may be a different type than the mapping. For example,
* the mapping may be an enum, and value an int. This is because we don't
* have FromString/ToString for every enum type. Assume that the distance between
* T and U can be represented as a float. */
template<class T,class U>
int FindClosestEntry( T value, const U *mapping, unsigned cnt )
2003-09-30 05:33:33 +00:00
{
2005-02-20 04:20:46 +00:00
int iBestIndex = 0;
float best_dist = 0;
2005-02-20 04:20:46 +00:00
bool have_best = false;
for( unsigned i = 0; i < cnt; ++i )
2003-09-30 05:33:33 +00:00
{
const U val = mapping[i];
float dist = value < val? (float)(val-value):(float)(value-val);
2005-02-20 04:20:46 +00:00
if( have_best && best_dist < dist )
continue;
2003-09-30 05:33:33 +00:00
2005-02-20 04:20:46 +00:00
have_best = true;
best_dist = dist;
2003-09-30 05:33:33 +00:00
2005-02-20 04:20:46 +00:00
iBestIndex = i;
}
2003-09-30 05:33:33 +00:00
2005-02-20 04:20:46 +00:00
if( have_best )
return iBestIndex;
else
return 0;
}
2005-05-06 20:41:05 +00:00
template <class T>
2005-02-20 04:20:46 +00:00
static void MoveMap( int &sel, T &opt, bool ToSel, const T *mapping, unsigned cnt )
{
if( ToSel )
{
sel = FindClosestEntry( opt, mapping, cnt );
2003-09-30 05:33:33 +00:00
} else {
/* sel -> opt */
opt = mapping[sel];
}
}
2005-04-28 08:27:40 +00:00
template <class T>
static void MoveMap( int &sel, IPreference &opt, bool ToSel, const T *mapping, unsigned cnt )
2005-02-20 04:20:46 +00:00
{
if( ToSel )
{
2006-01-22 01:00:06 +00:00
RString sOpt = opt.ToString();
/* This should really be T, but we can't FromString an enum. */
float val;
FromString( sOpt, val );
sel = FindClosestEntry( val, mapping, cnt );
2005-02-20 04:20:46 +00:00
} else {
/* sel -> opt */
2006-01-22 01:00:06 +00:00
RString sOpt = ToString( mapping[sel] );
opt.FromString( sOpt );
2005-04-27 07:50:38 +00:00
}
}
2003-09-30 05:33:33 +00:00
template <class T>
static void MoveMap( int &sel, const ConfOption *pConfOption, bool ToSel, const T *mapping, unsigned cnt )
{
2005-12-31 01:59:52 +00:00
IPreference *pPref = IPreference::GetPreferenceByName( pConfOption->name );
ASSERT_M( pPref != NULL, pConfOption->name );
MoveMap( sel, *pPref, ToSel, mapping, cnt );
}
2005-10-27 16:14:23 +00:00
/* "iSel" is the selection in the menu. */
static void MovePref( int &iSel, bool bToSel, const ConfOption *pConfOption )
{
2005-12-31 01:59:52 +00:00
IPreference *pPref = IPreference::GetPreferenceByName( pConfOption->name );
2005-10-27 16:14:23 +00:00
ASSERT_M( pPref != NULL, pConfOption->name );
if( bToSel )
{
2006-01-22 01:00:06 +00:00
RString sOpt = pPref->ToString();
2005-10-27 16:14:23 +00:00
FromString( sOpt, iSel );
}
else
{
2006-01-22 01:00:06 +00:00
RString sOpt = ToString( iSel );
2005-10-27 16:14:23 +00:00
pPref->FromString( sOpt );
}
}
2006-01-22 01:00:06 +00:00
static void GameChoices( vector<RString> &out )
2003-09-29 03:22:51 +00:00
{
2004-07-25 17:07:32 +00:00
vector<const Game*> aGames;
2003-09-29 03:22:51 +00:00
GAMEMAN->GetEnabledGames( aGames );
2004-07-25 17:07:32 +00:00
FOREACH( const Game*, aGames, g )
2003-09-29 03:22:51 +00:00
{
2006-01-22 01:00:06 +00:00
RString sGameName = (*g)->m_szName;
2003-09-29 03:22:51 +00:00
out.push_back( sGameName );
}
}
static void GameSel( int &sel, bool ToSel, const ConfOption *pConfOption )
2003-09-29 03:22:51 +00:00
{
2006-01-22 01:00:06 +00:00
vector<RString> choices;
pConfOption->MakeOptionsList( choices );
2003-09-29 03:22:51 +00:00
if( ToSel )
{
2006-01-22 01:00:06 +00:00
const RString sCurGameName = GAMESTATE->m_pCurGame->m_szName;
2003-09-29 03:22:51 +00:00
sel = 0;
for(unsigned i = 0; i < choices.size(); ++i)
if( !stricmp(choices[i], sCurGameName) )
sel = i;
} else {
2004-07-25 17:07:32 +00:00
vector<const Game*> aGames;
2003-09-29 03:22:51 +00:00
GAMEMAN->GetEnabledGames( aGames );
2005-12-02 01:16:28 +00:00
StepMania::ChangeCurrentGame( aGames[sel] );
2003-09-29 03:22:51 +00:00
}
}
2006-01-22 01:00:06 +00:00
static void LanguageChoices( vector<RString> &out )
2003-09-28 07:14:07 +00:00
{
2006-01-27 08:13:01 +00:00
vector<RString> vs;
THEME->GetLanguages( vs );
SortRStringArray( vs, true );
FOREACH_CONST( RString, vs, s )
{
const LanguageInfo *pLI = GetLanguageInfo( *s );
if( pLI )
out.push_back( pLI->szNativeName );
else
out.push_back( *s );
}
2003-09-28 07:14:07 +00:00
}
static void Language( int &sel, bool ToSel, const ConfOption *pConfOption )
2003-09-28 07:14:07 +00:00
{
2006-01-27 08:13:01 +00:00
vector<RString> vs;
THEME->GetLanguages( vs );
SortRStringArray( vs, true );
2003-09-28 07:14:07 +00:00
if( ToSel )
{
sel = 0;
2006-01-27 08:13:01 +00:00
for( unsigned i=1; i<vs.size(); i++ )
if( !stricmp(vs[i], THEME->GetCurLanguage()) )
2003-09-28 07:14:07 +00:00
sel = i;
} else {
2006-01-27 08:13:01 +00:00
const RString &sNewLanguage = vs[sel];
2003-09-28 07:14:07 +00:00
2006-03-03 07:32:45 +00:00
PREFSMAN->m_sLanguage.Set( sNewLanguage );
2003-09-28 07:14:07 +00:00
if( THEME->GetCurLanguage() != sNewLanguage )
2006-03-03 07:32:45 +00:00
THEME->SwitchThemeAndLanguage( THEME->GetCurThemeName(), PREFSMAN->m_sLanguage, PREFSMAN->m_bPseudoLocalize );
2003-09-28 07:14:07 +00:00
}
}
2006-01-22 01:00:06 +00:00
static void ThemeChoices( vector<RString> &out )
2003-09-28 07:14:07 +00:00
{
THEME->GetThemeNames( out );
}
2006-01-22 01:00:06 +00:00
static void DisplayResolutionChoices( vector<RString> &out )
2005-11-26 07:22:33 +00:00
{
DisplayResolutions d;
DISPLAY->GetDisplayResolutions( d );
2006-02-07 08:29:36 +00:00
FOREACHS_CONST( DisplayResolution, d, iter )
2005-11-26 07:22:33 +00:00
{
2006-01-22 01:00:06 +00:00
RString s = ssprintf("%dx%d", iter->iWidth, iter->iHeight);
2005-11-26 07:22:33 +00:00
out.push_back( s );
}
}
static void Theme( int &sel, bool ToSel, const ConfOption *pConfOption )
2003-09-28 07:14:07 +00:00
{
2006-01-22 01:00:06 +00:00
vector<RString> choices;
pConfOption->MakeOptionsList( choices );
2003-09-28 07:14:07 +00:00
if( ToSel )
{
sel = 0;
for( unsigned i=1; i<choices.size(); i++ )
if( !stricmp(choices[i], THEME->GetCurThemeName()) )
sel = i;
} else {
2006-01-22 01:00:06 +00:00
const RString sNewTheme = choices[sel];
2003-09-28 07:14:07 +00:00
if( THEME->GetCurThemeName() != sNewTheme )
THEME->SwitchThemeAndLanguage( sNewTheme, THEME->GetCurLanguage(), PREFSMAN->m_bPseudoLocalize );
2003-09-28 07:14:07 +00:00
}
}
2006-01-08 18:40:20 +00:00
static LocalizedString OFF ("ScreenOptionsMasterPrefs","Off");
2006-01-22 01:00:06 +00:00
static void AnnouncerChoices( vector<RString> &out )
2003-09-28 07:14:07 +00:00
{
ANNOUNCER->GetAnnouncerNames( out );
2006-01-08 18:40:20 +00:00
out.insert( out.begin(), OFF );
2003-09-28 07:14:07 +00:00
}
static void Announcer( int &sel, bool ToSel, const ConfOption *pConfOption )
2003-09-28 07:14:07 +00:00
{
2006-01-22 01:00:06 +00:00
vector<RString> choices;
pConfOption->MakeOptionsList( choices );
2003-09-28 07:14:07 +00:00
if( ToSel )
{
sel = 0;
for( unsigned i=1; i<choices.size(); i++ )
if( !stricmp(choices[i], ANNOUNCER->GetCurAnnouncerName()) )
sel = i;
} else {
2006-01-22 01:00:06 +00:00
const RString sNewAnnouncer = sel? choices[sel]:RString("");
2003-09-28 07:14:07 +00:00
ANNOUNCER->SwitchAnnouncer( sNewAnnouncer );
}
}
2006-01-22 01:00:06 +00:00
static void DefaultNoteSkinChoices( vector<RString> &out )
2003-09-28 07:14:07 +00:00
{
NOTESKIN->GetNoteSkinNames( out );
}
static void DefaultNoteSkin( int &sel, bool ToSel, const ConfOption *pConfOption )
2003-09-28 07:14:07 +00:00
{
2006-01-22 01:00:06 +00:00
vector<RString> choices;
pConfOption->MakeOptionsList( choices );
2003-09-28 07:14:07 +00:00
if( ToSel )
{
PlayerOptions po;
po.FromString( PREFSMAN->m_sDefaultModifiers );
2003-09-28 07:14:07 +00:00
sel = 0;
for( unsigned i=0; i < choices.size(); i++ )
if( !stricmp(choices[i], po.m_sNoteSkin) )
sel = i;
} else {
PlayerOptions po;
SongOptions so;
GetPrefsDefaultModifiers( po, so );
2003-09-28 07:14:07 +00:00
po.m_sNoteSkin = choices[sel];
SetPrefsDefaultModifiers( po, so );
2003-09-28 07:14:07 +00:00
}
}
2003-09-29 00:07:36 +00:00
/* Appearance options */
static void WheelSections( int &sel, bool ToSel, const ConfOption *pConfOption )
{
const PrefsManager::MusicWheelUsesSections mapping[] = { PrefsManager::NEVER, PrefsManager::ALWAYS, PrefsManager::ABC_ONLY };
MoveMap( sel, pConfOption, ToSel, mapping, ARRAYSIZE(mapping) );
}
2003-09-29 00:07:36 +00:00
/* Background options */
static void BGBrightness( int &sel, bool ToSel, const ConfOption *pConfOption )
2003-09-29 00:07:36 +00:00
{
2003-09-30 05:33:33 +00:00
const float mapping[] = { 0.0f,0.1f,0.2f,0.3f,0.4f,0.5f,0.6f,0.7f,0.8f,0.9f,1.0f };
MoveMap( sel, pConfOption, ToSel, mapping, ARRAYSIZE(mapping) );
2003-09-29 00:07:36 +00:00
}
2005-10-30 05:37:13 +00:00
static void BGBrightnessNoZero( int &sel, bool ToSel, const ConfOption *pConfOption )
{
const float mapping[] = { 0.1f,0.2f,0.3f,0.4f,0.5f,0.6f,0.7f,0.8f,0.9f,1.0f };
MoveMap( sel, pConfOption, ToSel, mapping, ARRAYSIZE(mapping) );
}
static void BGBrightnessOrStatic( int &sel, bool ToSel, const ConfOption *pConfOption )
{
2006-03-30 02:48:40 +00:00
const float mapping[] = { 0.2f,0.2f,0.4f,0.7f };
MoveMap( sel, PREFSMAN->m_fBGBrightness, ToSel, mapping, ARRAYSIZE(mapping) );
if( ToSel && !PREFSMAN->m_bSongBackgrounds )
sel = 0;
if( !ToSel )
PREFSMAN->m_bSongBackgrounds.Set( sel != 0 );
}
static void NumBackgrounds( int &sel, bool ToSel, const ConfOption *pConfOption )
2003-09-29 00:07:36 +00:00
{
2003-09-30 05:33:33 +00:00
const int mapping[] = { 5,10,15,20 };
MoveMap( sel, pConfOption, ToSel, mapping, ARRAYSIZE(mapping) );
2003-09-29 00:07:36 +00:00
}
2003-09-29 00:46:25 +00:00
/* Input options */
static void MusicWheelSwitchSpeed( int &sel, bool ToSel, const ConfOption *pConfOption )
2003-09-29 00:46:25 +00:00
{
2003-09-30 05:39:47 +00:00
const int mapping[] = { 5, 10, 15, 25 };
MoveMap( sel, pConfOption, ToSel, mapping, ARRAYSIZE(mapping) );
2003-09-29 00:46:25 +00:00
}
/* Gameplay options */
static void AllowW1( int &sel, bool ToSel, const ConfOption *pConfOption )
{
const PrefsManager::AllowW1 mapping[] = { PrefsManager::ALLOW_W1_NEVER, PrefsManager::ALLOW_W1_COURSES_ONLY, PrefsManager::ALLOW_W1_EVERYWHERE };
MoveMap( sel, pConfOption, ToSel, mapping, ARRAYSIZE(mapping) );
}
static void CoinModeM( int &sel, bool ToSel, const ConfOption *pConfOption )
{
2005-05-20 17:45:44 +00:00
const CoinMode mapping[] = { COIN_MODE_HOME, COIN_MODE_PAY, COIN_MODE_FREE };
MoveMap( sel, pConfOption, ToSel, mapping, ARRAYSIZE(mapping) );
}
2003-10-06 05:59:58 +00:00
static void CoinModeNoHome( int &sel, bool ToSel, const ConfOption *pConfOption )
2003-11-26 00:32:21 +00:00
{
2005-05-20 17:45:44 +00:00
const CoinMode mapping[] = { COIN_MODE_PAY, COIN_MODE_FREE };
MoveMap( sel, PREFSMAN->m_CoinMode, ToSel, mapping, ARRAYSIZE(mapping) );
2003-11-26 00:32:21 +00:00
}
static void CoinsPerCredit( int &sel, bool ToSel, const ConfOption *pConfOption )
2003-10-06 05:59:58 +00:00
{
2005-06-21 17:59:21 +00:00
const int mapping[] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 };
MoveMap( sel, pConfOption, ToSel, mapping, ARRAYSIZE(mapping) );
2003-10-06 05:59:58 +00:00
}
static void PremiumM( int &sel, bool ToSel, const ConfOption *pConfOption )
2003-11-09 01:09:35 +00:00
{
2005-05-20 08:03:01 +00:00
const Premium mapping[] = { PREMIUM_NONE, PREMIUM_DOUBLE, PREMIUM_JOINT };
MoveMap( sel, pConfOption, ToSel, mapping, ARRAYSIZE(mapping) );
2003-11-09 01:09:35 +00:00
}
2003-10-06 05:59:58 +00:00
static void SongsPerPlay( int &sel, bool ToSel, const ConfOption *pConfOption )
2003-10-06 05:59:58 +00:00
{
const int mapping[] = { 1,2,3,4,5 };
MoveMap( sel, pConfOption, ToSel, mapping, ARRAYSIZE(mapping) );
2003-10-06 05:59:58 +00:00
}
2005-04-28 08:27:40 +00:00
static void SongsPerPlayOrEventMode( int &sel, bool ToSel, const ConfOption *pConfOption )
{
const int mapping[] = { 1,2,3,4,5,6 };
2005-04-28 08:27:40 +00:00
MoveMap( sel, PREFSMAN->m_iSongsPerPlay, ToSel, mapping, ARRAYSIZE(mapping) );
if( ToSel && PREFSMAN->m_bEventMode )
sel = 5;
if( !ToSel )
PREFSMAN->m_bEventMode.Set( sel == 5 );
}
2003-10-06 05:59:58 +00:00
2003-09-29 03:02:54 +00:00
/* Machine options */
static void TimingWindowScale( int &sel, bool ToSel, const ConfOption *pConfOption )
2003-09-29 03:02:54 +00:00
{
2003-09-29 04:46:37 +00:00
const float mapping[] = { 1.50f,1.33f,1.16f,1.00f,0.84f,0.66f,0.50f,0.33f,0.20f };
MoveMap( sel, pConfOption, ToSel, mapping, ARRAYSIZE(mapping) );
2003-09-29 03:02:54 +00:00
}
static void LifeDifficulty( int &sel, bool ToSel, const ConfOption *pConfOption )
2003-09-29 03:02:54 +00:00
{
2003-09-29 04:46:37 +00:00
const float mapping[] = { 1.60f,1.40f,1.20f,1.00f,0.80f,0.60f,0.40f };
2005-05-06 20:41:05 +00:00
MoveMap( sel, PREFSMAN->m_fLifeDifficultyScale, ToSel, mapping, ARRAYSIZE(mapping) );
2003-09-29 03:02:54 +00:00
}
static int GetLifeDifficulty()
{
2005-06-29 06:36:51 +00:00
int iLifeDifficulty = 0;
LifeDifficulty( iLifeDifficulty, true, NULL );
iLifeDifficulty++; // LifeDifficulty returns an index
return iLifeDifficulty;
}
#include "LuaFunctions.h"
LuaFunction( GetLifeDifficulty, GetLifeDifficulty() );
static void ShowSongOptions( int &sel, bool ToSel, const ConfOption *pConfOption )
2003-09-29 03:02:54 +00:00
{
2003-09-30 05:23:12 +00:00
const PrefsManager::Maybe mapping[] = { PrefsManager::NO,PrefsManager::YES,PrefsManager::ASK };
MoveMap( sel, pConfOption, ToSel, mapping, ARRAYSIZE(mapping) );
2003-09-29 03:02:54 +00:00
}
static void GetRankingName( int &sel, bool ToSel, const ConfOption *pConfOption )
{
const PrefsManager::GetRankingName mapping[] = { PrefsManager::RANKING_OFF, PrefsManager::RANKING_ON, PrefsManager::RANKING_LIST };
MoveMap( sel, pConfOption, ToSel, mapping, ARRAYSIZE(mapping) );
}
static void DefaultFailType( int &sel, bool ToSel, const ConfOption *pConfOption )
2003-09-29 03:02:54 +00:00
{
if( ToSel )
{
SongOptions so;
so.FromString( PREFSMAN->m_sDefaultModifiers );
2003-09-29 03:02:54 +00:00
sel = so.m_FailType;
}
else
{
2003-09-29 03:02:54 +00:00
PlayerOptions po;
SongOptions so;
GetPrefsDefaultModifiers( po, so );
2003-09-29 06:28:17 +00:00
2003-09-29 03:02:54 +00:00
switch( sel )
{
2006-01-25 09:42:26 +00:00
case 0: so.m_FailType = SongOptions::FAIL_IMMEDIATE; break;
case 1: so.m_FailType = SongOptions::FAIL_END_OF_SONG; break;
case 2: so.m_FailType = SongOptions::FAIL_OFF; break;
2003-09-29 03:02:54 +00:00
default:
ASSERT(0);
}
2003-09-29 06:28:17 +00:00
SetPrefsDefaultModifiers( po, so );
2003-09-29 03:02:54 +00:00
}
}
/* Graphic options */
struct res_t
{
int w, h;
res_t(): w(0), h(0) { }
res_t( int w_, int h_ ): w(w_), h(h_) { }
res_t operator-( const res_t &rhs ) const
{
return res_t( w-rhs.w, h-rhs.h );
}
bool operator<( const res_t &rhs ) const
{
if( w != rhs.w )
return w < rhs.w;
return h < rhs.h;
}
/* Ugly: allow convert to a float for FindClosestEntry. */
operator float() const { return w * 5000.0f + h; }
};
2005-11-26 07:22:33 +00:00
static void DisplayResolutionM( int &sel, bool ToSel, const ConfOption *pConfOption )
2003-09-29 02:24:53 +00:00
{
2005-11-26 07:22:33 +00:00
vector<res_t> v;
DisplayResolutions d;
DISPLAY->GetDisplayResolutions( d );
2006-02-07 08:29:36 +00:00
FOREACHS_CONST( DisplayResolution, d, iter )
{
2005-11-26 07:22:33 +00:00
v.push_back( res_t(iter->iWidth, iter->iHeight) );
}
res_t sel_res( PREFSMAN->m_iDisplayWidth, PREFSMAN->m_iDisplayHeight );
2005-11-26 07:22:33 +00:00
MoveMap( sel, sel_res, ToSel, &v[0], v.size() );
2003-09-29 02:24:53 +00:00
if( !ToSel )
{
2005-05-06 20:41:05 +00:00
PREFSMAN->m_iDisplayWidth.Set( sel_res.w );
PREFSMAN->m_iDisplayHeight.Set( sel_res.h );
}
2003-09-29 02:24:53 +00:00
}
static void DisplayColorDepth( int &sel, bool ToSel, const ConfOption *pConfOption )
2003-09-29 02:24:53 +00:00
{
2003-09-29 04:46:37 +00:00
const int mapping[] = { 16,32 };
MoveMap( sel, pConfOption, ToSel, mapping, ARRAYSIZE(mapping) );
2003-09-29 02:24:53 +00:00
}
static void MaxTextureResolution( int &sel, bool ToSel, const ConfOption *pConfOption )
2003-09-29 02:24:53 +00:00
{
2003-09-29 04:46:37 +00:00
const int mapping[] = { 256,512,1024,2048 };
MoveMap( sel, pConfOption, ToSel, mapping, ARRAYSIZE(mapping) );
2003-09-29 02:24:53 +00:00
}
static void TextureColorDepth( int &sel, bool ToSel, const ConfOption *pConfOption )
2003-09-29 02:24:53 +00:00
{
2003-09-29 04:46:37 +00:00
const int mapping[] = { 16,32 };
MoveMap( sel, pConfOption, ToSel, mapping, ARRAYSIZE(mapping) );
2003-09-29 02:24:53 +00:00
}
static void MovieColorDepth( int &sel, bool ToSel, const ConfOption *pConfOption )
2003-09-29 02:24:53 +00:00
{
2003-10-07 08:18:28 +00:00
const int mapping[] = { 16,32 };
MoveMap( sel, pConfOption, ToSel, mapping, ARRAYSIZE(mapping) );
2003-09-29 02:24:53 +00:00
}
static void RefreshRate( int &sel, bool ToSel, const ConfOption *pConfOption )
2003-09-29 02:24:53 +00:00
{
2003-10-07 08:18:28 +00:00
const int mapping[] = { (int) REFRESH_DEFAULT,60,70,72,75,80,85,90,100,120,150 };
MoveMap( sel, pConfOption, ToSel, mapping, ARRAYSIZE(mapping) );
2003-09-29 02:24:53 +00:00
}
2005-10-27 15:25:08 +00:00
static void DisplayAspectRatio( int &sel, bool ToSel, const ConfOption *pConfOption )
2004-12-23 06:50:19 +00:00
{
const float mapping[] = { 3/4.f,1,4/3.0f,16/10.0f,16/9.f, 8/3.f };
MoveMap( sel, pConfOption, ToSel, mapping, ARRAYSIZE(mapping) );
2004-12-23 06:50:19 +00:00
}
/* Simpler DisplayAspectRatio setting, which only offers "on" and "off". "On" can be 16:9
* or 16:10. */
static void WideScreen16_10( int &sel, bool ToSel, const ConfOption *pConfOption )
{
IPreference *pPref = IPreference::GetPreferenceByName( "DisplayAspectRatio" );
ASSERT_M( pPref != NULL, pConfOption->name );
const float mapping[] = { 4/3.0f, 16/10.0f };
MoveMap( sel, *pPref, ToSel, mapping, ARRAYSIZE(mapping) );
}
static void WideScreen16_9( int &sel, bool ToSel, const ConfOption *pConfOption )
{
IPreference *pPref = IPreference::GetPreferenceByName( "DisplayAspectRatio" );
ASSERT_M( pPref != NULL, pConfOption->name );
const float mapping[] = { 4/3.0f, 16/9.0f };
MoveMap( sel, *pPref, ToSel, mapping, ARRAYSIZE(mapping) );
}
2003-09-29 00:07:36 +00:00
/* Sound options */
2003-09-28 07:14:07 +00:00
static void SoundVolume( int &sel, bool ToSel, const ConfOption *pConfOption )
2003-10-12 20:34:46 +00:00
{
const float mapping[] = { 0.0f,0.1f,0.2f,0.3f,0.4f,0.5f,0.6f,0.7f,0.8f,0.9f,1.0f };
MoveMap( sel, pConfOption, ToSel, mapping, ARRAYSIZE(mapping) );
2003-10-12 20:34:46 +00:00
}
2005-10-15 04:13:11 +00:00
static void GlobalOffsetSeconds( int &sel, bool ToSel, const ConfOption *pConfOption )
{
float mapping[41];
for( int i = 0; i < 41; ++i )
mapping[i] = SCALE( i, 0.0f, 40.0f, -0.1f, +0.1f );
MoveMap( sel, pConfOption, ToSel, mapping, ARRAYSIZE(mapping) );
2005-10-15 04:13:11 +00:00
}
2004-12-07 09:49:03 +00:00
static vector<ConfOption> g_ConfOptions;
static void InitializeConfOptions()
{
2004-12-07 09:49:03 +00:00
if( !g_ConfOptions.empty() )
return;
#define ADD(x) g_ConfOptions.push_back( x )
2003-09-29 03:22:51 +00:00
/* Select game */
2006-01-25 09:42:26 +00:00
ADD( ConfOption( "Game", GameSel, GameChoices ) );
2004-12-07 09:49:03 +00:00
g_ConfOptions.back().m_iEffects = OPT_RESET_GAME;
2003-09-29 03:22:51 +00:00
2003-09-28 07:14:07 +00:00
/* Appearance options */
2006-01-25 09:42:26 +00:00
ADD( ConfOption( "Language", Language, LanguageChoices ) );
ADD( ConfOption( "Theme", Theme, ThemeChoices ) );
2004-12-07 09:49:03 +00:00
g_ConfOptions.back().m_iEffects = OPT_APPLY_THEME;
2006-01-25 09:42:26 +00:00
ADD( ConfOption( "Announcer", Announcer, AnnouncerChoices ) );
ADD( ConfOption( "DefaultNoteSkin", DefaultNoteSkin, DefaultNoteSkinChoices ) );
ADD( ConfOption( "ShowInstructions", MovePref, "Skip","Show") );
ADD( ConfOption( "ShowCaution", MovePref, "Skip","Show") );
ADD( ConfOption( "DancePointsForOni", MovePref, "Percent","Dance Points") );
ADD( ConfOption( "ShowSelectGroup", MovePref, "All Music","Choose") );
ADD( ConfOption( "MusicWheelUsesSections", WheelSections, "Never","Always","Title Only") );
ADD( ConfOption( "CourseSortOrder", MovePref, "Num Songs","Average Feet","Total Feet","Ranking") );
ADD( ConfOption( "MoveRandomToEnd", MovePref, "No","Yes") );
ADD( ConfOption( "ShowNativeLanguage", MovePref, "Romanization","Native Language") );
ADD( ConfOption( "ShowLyrics", MovePref, "Hide","Show") );
2003-09-28 07:14:07 +00:00
2003-12-30 09:34:05 +00:00
/* Misc options */
2006-01-25 09:42:26 +00:00
ADD( ConfOption( "AutogenSteps", MovePref, "Off","On" ) );
2004-12-07 09:49:03 +00:00
g_ConfOptions.back().m_iEffects = OPT_APPLY_SONG;
2006-01-25 09:42:26 +00:00
ADD( ConfOption( "AutogenGroupCourses", MovePref, "Off","On" ) );
ADD( ConfOption( "FastLoad", MovePref, "Off","On" ) );
2003-09-29 00:07:36 +00:00
/* Background options */
2006-01-25 09:42:26 +00:00
ADD( ConfOption( "RandomBackgroundMode", MovePref, "Off","Animations","Random Movies" ) );
ADD( ConfOption( "BGBrightness", BGBrightness, "|0%","|10%","|20%","|30%","|40%","|50%","|60%","|70%","|80%","|90%","|100%" ) );
ADD( ConfOption( "BGBrightnessNoZero", BGBrightnessNoZero, "|10%","|20%","|30%","|40%","|50%","|60%","|70%","|80%","|90%","|100%" ) );
2006-03-30 02:48:40 +00:00
ADD( ConfOption( "BGBrightnessOrStatic", BGBrightnessOrStatic, "Disabled","Dark","Dim","Bright" ) );
2006-01-25 09:42:26 +00:00
ADD( ConfOption( "ShowDanger", MovePref, "Hide","Show" ) );
ADD( ConfOption( "ShowDancingCharacters", MovePref, "Default to Off","Default to Random","Select" ) );
ADD( ConfOption( "ShowBeginnerHelper", MovePref, "Off","On" ) );
ADD( ConfOption( "NumBackgrounds", NumBackgrounds, "|5","|10","|15","|20" ) );
2003-09-29 00:07:36 +00:00
2003-09-29 00:46:25 +00:00
/* Input options */
2006-01-25 09:42:26 +00:00
ADD( ConfOption( "AutoMapOnJoyChange", MovePref, "Off","On (recommended)" ) );
ADD( ConfOption( "OnlyDedicatedMenuButtons", MovePref, "Use Gameplay Buttons","Only Dedicated Buttons" ) );
ADD( ConfOption( "AutoPlay", MovePref, "Off","On","CPU-Controlled" ) );
ADD( ConfOption( "DelayedBack", MovePref, "Instant","Hold" ) );
ADD( ConfOption( "ArcadeOptionsNavigation", MovePref, "StepMania Style","Arcade Style" ) );
ADD( ConfOption( "MusicWheelSwitchSpeed", MusicWheelSwitchSpeed, "Slow","Normal","Fast","Really Fast" ) );
2003-09-29 00:46:25 +00:00
/* Gameplay options */
2006-01-27 07:09:43 +00:00
ADD( ConfOption( "Center1Player", MovePref, "Off","On" ) );
2006-01-25 09:42:26 +00:00
ADD( ConfOption( "HiddenSongs", MovePref, "Off","On" ) );
ADD( ConfOption( "EasterEggs", MovePref, "Off","On" ) );
ADD( ConfOption( "AllowW1", AllowW1, "Never","Courses Only","Always" ) );
ADD( ConfOption( "AllowExtraStage", MovePref, "Off","On" ) );
ADD( ConfOption( "PickExtraStage", MovePref, "Off","On" ) );
ADD( ConfOption( "UseUnlockSystem", MovePref, "Off","On" ) );
2003-09-29 00:46:25 +00:00
2003-09-29 03:02:54 +00:00
/* Machine options */
2006-01-25 09:42:26 +00:00
ADD( ConfOption( "MenuTimer", MovePref, "Off","On" ) );
ADD( ConfOption( "CoinMode", CoinModeM, "Home","Pay","Free Play" ) );
ADD( ConfOption( "CoinModeNoHome", CoinModeNoHome, "Pay","Free Play" ) );
ADD( ConfOption( "SongsPerPlay", SongsPerPlay, "|1","|2","|3","|4","|5" ) );
ADD( ConfOption( "SongsPerPlayOrEvent", SongsPerPlayOrEventMode,"|1","|2","|3","|4","|5","Event" ) );
ADD( ConfOption( "EventMode", MovePref, "Off","On" ) );
ADD( ConfOption( "ScoringType", MovePref, "New","Old" ) );
ADD( ConfOption( "TimingWindowScale", TimingWindowScale, "|1","|2","|3","|4","|5","|6","|7","|8","Justice" ) );
ADD( ConfOption( "LifeDifficulty", LifeDifficulty, "|1","|2","|3","|4","|5","|6","|7" ) );
ADD( ConfOption( "ProgressiveLifebar", MovePref, "Off","|1","|2","|3","|4","|5","|6","|7","|8") );
ADD( ConfOption( "ProgressiveStageLifebar", MovePref, "Off","|1","|2","|3","|4","|5","|6","|7","|8","Insanity") );
ADD( ConfOption( "ProgressiveNonstopLifebar", MovePref, "Off","|1","|2","|3","|4","|5","|6","|7","|8","Insanity") );
ADD( ConfOption( "DefaultFailType", DefaultFailType, "Immediate","End of Song","Off" ) );
ADD( ConfOption( "DefaultFailTypeNoOff", DefaultFailType, "Immediate","End of Song" ) );
ADD( ConfOption( "CoinsPerCredit", CoinsPerCredit, "|1","|2","|3","|4","|5","|6","|7","|8","|9","|10","|11","|12","|13","|14","|15","|16" ) );
ADD( ConfOption( "Premium", PremiumM, "Off","Double for 1 Credit","Joint Premium" ) );
ADD( ConfOption( "ShowSongOptions", ShowSongOptions, "Hide","Show","Ask" ) );
ADD( ConfOption( "GetRankingName", GetRankingName, "Off", "On", "Ranking Songs" ) );
2003-09-29 03:02:54 +00:00
2003-09-29 02:24:53 +00:00
/* Graphic options */
2006-01-25 09:42:26 +00:00
ADD( ConfOption( "Windowed", MovePref, "Full Screen", "Windowed" ) );
2004-12-07 09:49:03 +00:00
g_ConfOptions.back().m_iEffects = OPT_APPLY_GRAPHICS;
2006-01-25 09:42:26 +00:00
ADD( ConfOption( "DisplayResolution", DisplayResolutionM, DisplayResolutionChoices ) );
2005-11-26 07:22:33 +00:00
g_ConfOptions.back().m_iEffects = OPT_APPLY_GRAPHICS | OPT_APPLY_ASPECT_RATIO;
ADD( ConfOption( "DisplayAspectRatio", DisplayAspectRatio, "|3:4","|1:1","|4:3","|16:10","|16:9","|8:3" ) );
2005-11-26 07:22:33 +00:00
g_ConfOptions.back().m_iEffects = OPT_APPLY_ASPECT_RATIO;
ADD( ConfOption( "WideScreen16_10", WideScreen16_10, "Off", "On" ) );
g_ConfOptions.back().m_iEffects = OPT_APPLY_ASPECT_RATIO;
ADD( ConfOption( "WideScreen16_9", WideScreen16_9, "Off", "On" ) );
g_ConfOptions.back().m_iEffects = OPT_APPLY_ASPECT_RATIO;
2006-01-25 09:42:26 +00:00
ADD( ConfOption( "DisplayColorDepth", DisplayColorDepth, "16bit","32bit" ) );
2004-12-07 09:49:03 +00:00
g_ConfOptions.back().m_iEffects = OPT_APPLY_GRAPHICS;
2006-01-25 09:42:26 +00:00
ADD( ConfOption( "MaxTextureResolution", MaxTextureResolution, "|256","|512","|1024","|2048" ) );
2004-12-07 09:49:03 +00:00
g_ConfOptions.back().m_iEffects = OPT_APPLY_GRAPHICS;
2006-01-25 09:42:26 +00:00
ADD( ConfOption( "TextureColorDepth", TextureColorDepth, "16bit","32bit" ) );
2004-12-07 09:49:03 +00:00
g_ConfOptions.back().m_iEffects = OPT_APPLY_GRAPHICS;
2006-01-25 09:42:26 +00:00
ADD( ConfOption( "MovieColorDepth", MovieColorDepth, "16bit","32bit" ) );
ADD( ConfOption( "DelayedTextureDelete", MovePref, "Off","On" ) );
2004-12-07 09:49:03 +00:00
g_ConfOptions.back().m_iEffects = OPT_APPLY_GRAPHICS;
2006-01-25 09:42:26 +00:00
ADD( ConfOption( "CelShadeModels", MovePref, "Off","On" ) );
ADD( ConfOption( "SmoothLines", MovePref, "Off","On" ) );
2004-12-07 09:49:03 +00:00
g_ConfOptions.back().m_iEffects = OPT_APPLY_GRAPHICS;
2006-01-25 09:42:26 +00:00
ADD( ConfOption( "RefreshRate", RefreshRate, "Default","|60","|70","|72","|75","|80","|85","|90","|100","|120","|150" ) );
2004-12-07 09:49:03 +00:00
g_ConfOptions.back().m_iEffects = OPT_APPLY_GRAPHICS;
2006-01-25 09:42:26 +00:00
ADD( ConfOption( "Vsync", MovePref, "No", "Yes" ) );
2004-12-07 09:49:03 +00:00
g_ConfOptions.back().m_iEffects = OPT_APPLY_GRAPHICS;
2006-01-25 09:42:26 +00:00
ADD( ConfOption( "ShowStats", MovePref, "Off","On" ) );
ADD( ConfOption( "ShowBanners", MovePref, "Off","On" ) );
2003-09-29 02:24:53 +00:00
2003-09-28 07:14:07 +00:00
/* Sound options */
2006-01-25 09:42:26 +00:00
ADD( ConfOption( "SoundResampleQuality", MovePref, "Fast","Normal","High Quality" ) );
ADD( ConfOption( "AttractSoundFrequency", MovePref, "Never","Always","2 Times","3 Times","4 Times","5 Times" ) );
ADD( ConfOption( "SoundVolume", SoundVolume, "Silent","|10%","|20%","|30%","|40%","|50%","|60%","|70%","|80%","|90%","|100%" ) );
2004-12-07 09:49:03 +00:00
g_ConfOptions.back().m_iEffects = OPT_APPLY_SOUND;
2005-10-15 04:13:11 +00:00
{
ConfOption c( "GlobalOffsetSeconds", GlobalOffsetSeconds );
for( int i = -100; i <= +100; i += 5 )
c.AddOption( ssprintf("%+i ms", i) );
ADD( c );
}
2005-07-20 00:17:14 +00:00
/* Editor options */
2006-01-25 09:42:26 +00:00
ADD( ConfOption( "EditorShowBGChangesPlay", MovePref, "Hide","Show") );
2004-12-07 09:49:03 +00:00
}
2003-09-29 02:24:53 +00:00
/* Get a mask of effects to apply if the given option changes. */
int ConfOption::GetEffects() const
{
2004-12-07 09:49:03 +00:00
return m_iEffects | OPT_SAVE_PREFERENCES;
2003-09-29 02:24:53 +00:00
}
2006-01-22 01:00:06 +00:00
ConfOption *ConfOption::Find( RString name )
{
2004-12-07 09:49:03 +00:00
InitializeConfOptions();
for( unsigned i = 0; i < g_ConfOptions.size(); ++i )
{
ConfOption *opt = &g_ConfOptions[i];
2006-01-22 01:00:06 +00:00
RString match(opt->name);
2003-09-28 07:14:07 +00:00
if( match.CompareNoCase(name) )
continue;
return opt;
}
return NULL;
}
void ConfOption::UpdateAvailableOptions()
2003-09-28 05:15:27 +00:00
{
if( MakeOptionsListCB != NULL )
2003-09-28 05:15:27 +00:00
{
names.clear();
MakeOptionsListCB( names );
2003-09-28 05:15:27 +00:00
}
}
2003-09-28 05:15:27 +00:00
2006-01-22 01:00:06 +00:00
void ConfOption::MakeOptionsList( vector<RString> &out ) const
{
out = names;
2003-09-28 05:15:27 +00:00
}
2004-06-08 05:22:33 +00:00
/*
* (c) 2003-2004 Glenn Maynard
* All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, and/or sell copies of the Software, and to permit persons to
* whom the Software is furnished to do so, provided that the above
* copyright notice(s) and this permission notice appear in all copies of
* the Software and that both the above copyright notice(s) and this
* permission notice appear in supporting documentation.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
* THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS
* INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT
* OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
* OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/