#include "global.h" #include "PrefsManager.h" #include "IniFile.h" #include "GameState.h" #include "RageDisplay.h" #include "RageUtil.h" #include "arch/arch.h" /* for default driver specs */ #include "RageSoundReader_Resample.h" /* for ResampleQuality */ #include "RageFile.h" #include "ProductInfo.h" #include "Foreach.h" #include "Preference.h" #define DEFAULTS_INI_PATH "Data/Defaults.ini" // these can be overridden #define STEPMANIA_INI_PATH "Data/StepMania.ini" // overlay on Defaults.ini, contains the user's choices #define STATIC_INI_PATH "Data/Static.ini" // overlay on the 2 above, can't be overridden PrefsManager* PREFSMAN = NULL; // global and accessable from anywhere in our program const float DEFAULT_SOUND_VOLUME = 1.00f; const CString DEFAULT_LIGHTS_DRIVER = "Null"; // // For self-registering prefs // #include "SubscriptionManager.h" template<> set* SubscriptionManager::s_pSubscribers = NULL; void PrefsManager::Subscribe( IPreference *p ) { SubscriptionManager::Subscribe( p ); } void PrefsManager::Unsubscribe( IPreference *p ) { SubscriptionManager::Unsubscribe( p ); } IPreference *PrefsManager::GetPreferenceByName( const CString &sName ) { FOREACHS( IPreference*, *SubscriptionManager::s_pSubscribers, p ) { if( !(*p)->GetName().CompareNoCase( sName ) ) return *p; } return NULL; } bool g_bAutoRestart = false; PrefsManager::PrefsManager() : m_bWindowed ( Options, "Windowed", #ifdef DEBUG true #else false #endif ), m_iDisplayWidth ( Options, "DisplayWidth", 640 ), m_iDisplayHeight ( Options, "DisplayHeight", 480 ), m_iDisplayColorDepth ( Options, "DisplayColorDepth", 16 ), m_iTextureColorDepth ( Options, "TextureColorDepth", 16 ), m_iMovieColorDepth ( Options, "MovieColorDepth", 16 ), m_iMaxTextureResolution ( Options, "MaxTextureResolution", 2048 ), m_iRefreshRate ( Options, "RefreshRate", REFRESH_DEFAULT ), m_fDisplayAspectRatio ( Options, "DisplayAspectRatio", 4/3.0f ), m_bShowStats ( Options, "ShowStats", #ifdef DEBUG true #else false #endif ), m_bShowBanners ( Options, "ShowBanners", true ), m_iBackgroundMode ( Options, "BackgroundMode", BGMODE_ANIMATIONS ), m_iNumBackgrounds ( Options, "NumBackgrounds", 8 ), m_fBGBrightness ( Options, "BGBrightness", 0.8f ), m_bHiddenSongs ( Options, "HiddenSongs", false ), /* I'd rather get occasional people asking for support for this even though it's already here than lots of people asking why songs aren't being displayed. */ m_bVsync ( Options, "Vsync", true ), m_bInterlaced ( Options, "Interlaced", false ), /* XXX: Set these defaults for individual consoles using VideoCardDefaults.ini. */ m_bPAL ( Options, "PAL", false ), m_bDelayedTextureDelete ( Options, "DelayedTextureDelete", true ), m_bTexturePreload ( Options, "TexturePreload", false ), m_bDelayedScreenLoad ( Options, "DelayedScreenLoad", false ), m_bDelayedModelDelete ( Options, "DelayedModelDelete", false ), m_iBannerCache ( Options, "BannerCache", BNCACHE_LOW_RES ), m_bPalettedBannerCache ( Options, "PalettedBannerCache", false ), m_bFastLoad ( Options, "FastLoad", true ), m_bOnlyDedicatedMenuButtons ( Options, "OnlyDedicatedMenuButtons", false ), m_bMenuTimer ( Options, "MenuTimer", true ), m_bShowDanger ( Options, "ShowDanger", true ), m_fJudgeWindowScale ( Options, "JudgeWindowScale", 1.0f ), m_fJudgeWindowAdd ( Options, "JudgeWindowAdd", 0 ), m_fJudgeWindowSecondsMarvelous ( Options, "JudgeWindowSecondsMarvelous", 0.0225f ), m_fJudgeWindowSecondsPerfect ( Options, "JudgeWindowSecondsPerfect", 0.045f ), m_fJudgeWindowSecondsGreat ( Options, "JudgeWindowSecondsGreat", 0.090f ), m_fJudgeWindowSecondsGood ( Options, "JudgeWindowSecondsGood", 0.135f ), m_fJudgeWindowSecondsBoo ( Options, "JudgeWindowSecondsBoo", 0.180f ), m_fJudgeWindowSecondsOK ( Options, "JudgeWindowSecondsOK", 0.250f ), // allow enough time to take foot off and put back on m_fJudgeWindowSecondsMine ( Options, "JudgeWindowSecondsMine", 0.090f ), // same as great m_fJudgeWindowSecondsAttack ( Options, "JudgeWindowSecondsAttack", 0.135f ), m_fLifeDifficultyScale ( Options, "LifeDifficultyScale", 1.0f ), m_fLifeDeltaPercentChangeMarvelous ( Options, "LifeDeltaPercentChangeMarvelous", +0.008f ), m_fLifeDeltaPercentChangePerfect ( Options, "LifeDeltaPercentChangePerfect", +0.008f ), m_fLifeDeltaPercentChangeGreat ( Options, "LifeDeltaPercentChangeGreat", +0.004f ), m_fLifeDeltaPercentChangeGood ( Options, "LifeDeltaPercentChangeGood", +0.000f ), m_fLifeDeltaPercentChangeBoo ( Options, "LifeDeltaPercentChangeBoo", -0.040f ), m_fLifeDeltaPercentChangeMiss ( Options, "LifeDeltaPercentChangeMiss", -0.080f ), m_fLifeDeltaPercentChangeHitMine ( Options, "LifeDeltaPercentChangeHitMine", -0.160f ), m_fLifeDeltaPercentChangeOK ( Options, "LifeDeltaPercentChangeOK", +0.008f ), m_fLifeDeltaPercentChangeNG ( Options, "LifeDeltaPercentChangeNG", -0.080f ), m_bShowCaution ( Options, "ShowCaution", true ), m_bEventMode ( Options, "EventMode", false ) { Init(); ReadGlobalPrefsFromDisk(); } void PrefsManager::Init() { m_bCelShadeModels = false; // Work-In-Progress.. disable by default. m_fConstantUpdateDeltaSeconds = 0; m_bShowDanger = true; m_bMenuTimer = true; m_iNumArcadeStages = 3; m_bAutoPlay = false; m_fTugMeterPercentChangeMarvelous = +0.010f; m_fTugMeterPercentChangePerfect = +0.008f; m_fTugMeterPercentChangeGreat = +0.004f; m_fTugMeterPercentChangeGood = +0.000f; m_fTugMeterPercentChangeBoo = -0.010f; m_fTugMeterPercentChangeMiss = -0.020f; m_fTugMeterPercentChangeHitMine = -0.040f; m_fTugMeterPercentChangeOK = +0.008f; m_fTugMeterPercentChangeNG = -0.020f; m_iRegenComboAfterFail = 10; // cumulative m_iRegenComboAfterMiss = 5; // cumulative m_iMaxRegenComboAfterFail = 10; m_iMaxRegenComboAfterMiss = 10; m_bTwoPlayerRecovery = true; m_bMercifulDrain = true; m_bMinimum1FullSongInCourses = false; m_iPercentScoreWeightMarvelous = 3; m_iPercentScoreWeightPerfect = 2; m_iPercentScoreWeightGreat = 1; m_iPercentScoreWeightGood = 0; m_iPercentScoreWeightBoo = 0; m_iPercentScoreWeightMiss = 0; m_iPercentScoreWeightOK = 3; m_iPercentScoreWeightNG = 0; m_iPercentScoreWeightHitMine = -2; m_iGradeWeightMarvelous = 2; m_iGradeWeightPerfect = 2; m_iGradeWeightGreat = 1; m_iGradeWeightGood = 0; m_iGradeWeightBoo = -4; m_iGradeWeightMiss = -8; m_iGradeWeightHitMine = -8; m_iGradeWeightOK = 6; m_iGradeWeightNG = 0; m_iNumGradeTiersUsed = 7; for( int i=0; i::s_pSubscribers, p ) (*p)->LoadDefault(); } PrefsManager::~PrefsManager() { } void PrefsManager::ReadGlobalPrefsFromDisk() { ReadPrefsFromFile( DEFAULTS_INI_PATH ); ReadPrefsFromFile( STEPMANIA_INI_PATH ); ReadPrefsFromFile( STATIC_INI_PATH ); } void PrefsManager::ResetToFactoryDefaults() { // clobber the users prefs by initing then applying defaults Init(); m_bFirstRun = false; ReadPrefsFromFile( DEFAULTS_INI_PATH ); ReadPrefsFromFile( STATIC_INI_PATH ); SaveGlobalPrefsToDisk(); } void PrefsManager::ReadPrefsFromFile( CString sIni ) { IniFile ini; if( !ini.ReadFile(sIni) ) return; ReadGlobalPrefsFromIni( ini ); } void PrefsManager::ReadGlobalPrefsFromIni( const IniFile &ini ) { ini.GetValue( "Options", "CelShadeModels", m_bCelShadeModels ); ini.GetValue( "Options", "ConstantUpdateDeltaSeconds", m_fConstantUpdateDeltaSeconds ); ini.GetValue( "Options", "NumArcadeStages", m_iNumArcadeStages ); ini.GetValue( "Options", "AutoPlay", m_bAutoPlay ); ini.GetValue( "Options", "TugMeterPercentChangeMarvelous", m_fTugMeterPercentChangeMarvelous ); ini.GetValue( "Options", "TugMeterPercentChangePerfect", m_fTugMeterPercentChangePerfect ); ini.GetValue( "Options", "TugMeterPercentChangeGreat", m_fTugMeterPercentChangeGreat ); ini.GetValue( "Options", "TugMeterPercentChangeGood", m_fTugMeterPercentChangeGood ); ini.GetValue( "Options", "TugMeterPercentChangeBoo", m_fTugMeterPercentChangeBoo ); ini.GetValue( "Options", "TugMeterPercentChangeMiss", m_fTugMeterPercentChangeMiss ); ini.GetValue( "Options", "TugMeterPercentChangeHitMine", m_fTugMeterPercentChangeHitMine ); ini.GetValue( "Options", "TugMeterPercentChangeOK", m_fTugMeterPercentChangeOK ); ini.GetValue( "Options", "TugMeterPercentChangeNG", m_fTugMeterPercentChangeNG ); ini.GetValue( "Options", "RegenComboAfterFail", m_iRegenComboAfterFail ); ini.GetValue( "Options", "RegenComboAfterMiss", m_iRegenComboAfterMiss ); ini.GetValue( "Options", "MaxRegenComboAfterFail", m_iMaxRegenComboAfterFail ); ini.GetValue( "Options", "MaxRegenComboAfterMiss", m_iMaxRegenComboAfterMiss ); ini.GetValue( "Options", "TwoPlayerRecovery", m_bTwoPlayerRecovery ); ini.GetValue( "Options", "MercifulDrain", m_bMercifulDrain ); ini.GetValue( "Options", "Minimum1FullSongInCourses", m_bMinimum1FullSongInCourses ); ini.GetValue( "Options", "PercentScoreWeightMarvelous", m_iPercentScoreWeightMarvelous ); ini.GetValue( "Options", "PercentScoreWeightPerfect", m_iPercentScoreWeightPerfect ); ini.GetValue( "Options", "PercentScoreWeightGreat", m_iPercentScoreWeightGreat ); ini.GetValue( "Options", "PercentScoreWeightGood", m_iPercentScoreWeightGood ); ini.GetValue( "Options", "PercentScoreWeightBoo", m_iPercentScoreWeightBoo ); ini.GetValue( "Options", "PercentScoreWeightMiss", m_iPercentScoreWeightMiss ); ini.GetValue( "Options", "PercentScoreWeightOK", m_iPercentScoreWeightOK ); ini.GetValue( "Options", "PercentScoreWeightNG", m_iPercentScoreWeightNG ); ini.GetValue( "Options", "PercentScoreWeightHitMine", m_iPercentScoreWeightHitMine ); ini.GetValue( "Options", "GradeWeightMarvelous", m_iGradeWeightMarvelous ); ini.GetValue( "Options", "GradeWeightPerfect", m_iGradeWeightPerfect ); ini.GetValue( "Options", "GradeWeightGreat", m_iGradeWeightGreat ); ini.GetValue( "Options", "GradeWeightGood", m_iGradeWeightGood ); ini.GetValue( "Options", "GradeWeightBoo", m_iGradeWeightBoo ); ini.GetValue( "Options", "GradeWeightMiss", m_iGradeWeightMiss ); ini.GetValue( "Options", "GradeWeightHitMine", m_iGradeWeightHitMine ); ini.GetValue( "Options", "GradeWeightOK", m_iGradeWeightOK ); ini.GetValue( "Options", "GradeWeightNG", m_iGradeWeightNG ); ini.GetValue( "Options", "NumGradeTiersUsed", m_iNumGradeTiersUsed ); for( int g=0; g::s_pSubscribers, p ) (*p)->ReadFrom( ini ); } void PrefsManager::SaveGlobalPrefsToDisk() const { IniFile ini; SaveGlobalPrefsToIni( ini ); ini.WriteFile( STEPMANIA_INI_PATH ); } void PrefsManager::SaveGlobalPrefsToIni( IniFile &ini ) const { ini.SetValue( "Options", "CelShadeModels", m_bCelShadeModels ); ini.SetValue( "Options", "ConstantUpdateDeltaSeconds", m_fConstantUpdateDeltaSeconds ); ini.SetValue( "Options", "UseDedicatedMenuButtons", m_bOnlyDedicatedMenuButtons ); ini.SetValue( "Options", "BackgroundMode", m_iBackgroundMode); ini.SetValue( "Options", "NumBackgrounds", m_iNumBackgrounds); ini.SetValue( "Options", "ShowDanger", m_bShowDanger ); ini.SetValue( "Options", "BGBrightness", m_fBGBrightness ); ini.SetValue( "Options", "MenuTimer", m_bMenuTimer ); ini.SetValue( "Options", "NumArcadeStages", m_iNumArcadeStages ); ini.SetValue( "Options", "AutoPlay", m_bAutoPlay ); ini.SetValue( "Options", "JudgeWindowScale", m_fJudgeWindowScale ); ini.SetValue( "Options", "JudgeWindowAdd", m_fJudgeWindowAdd ); ini.SetValue( "Options", "JudgeWindowSecondsMarvelous", m_fJudgeWindowSecondsMarvelous ); ini.SetValue( "Options", "JudgeWindowSecondsPerfect", m_fJudgeWindowSecondsPerfect ); ini.SetValue( "Options", "JudgeWindowSecondsGreat", m_fJudgeWindowSecondsGreat ); ini.SetValue( "Options", "JudgeWindowSecondsGood", m_fJudgeWindowSecondsGood ); ini.SetValue( "Options", "JudgeWindowSecondsBoo", m_fJudgeWindowSecondsBoo ); ini.SetValue( "Options", "JudgeWindowSecondsOK", m_fJudgeWindowSecondsOK ); ini.SetValue( "Options", "JudgeWindowSecondsMine", m_fJudgeWindowSecondsMine ); ini.SetValue( "Options", "JudgeWindowSecondsAttack", m_fJudgeWindowSecondsAttack ); ini.SetValue( "Options", "LifeDifficultyScale", m_fLifeDifficultyScale ); ini.SetValue( "Options", "LifeDeltaPercentChangeMarvelous", m_fLifeDeltaPercentChangeMarvelous ); ini.SetValue( "Options", "LifeDeltaPercentChangePerfect", m_fLifeDeltaPercentChangePerfect ); ini.SetValue( "Options", "LifeDeltaPercentChangeGreat", m_fLifeDeltaPercentChangeGreat ); ini.SetValue( "Options", "LifeDeltaPercentChangeGood", m_fLifeDeltaPercentChangeGood ); ini.SetValue( "Options", "LifeDeltaPercentChangeBoo", m_fLifeDeltaPercentChangeBoo ); ini.SetValue( "Options", "LifeDeltaPercentChangeMiss", m_fLifeDeltaPercentChangeMiss ); ini.SetValue( "Options", "LifeDeltaPercentChangeHitMine", m_fLifeDeltaPercentChangeHitMine ); ini.SetValue( "Options", "LifeDeltaPercentChangeOK", m_fLifeDeltaPercentChangeOK ); ini.SetValue( "Options", "LifeDeltaPercentChangeNG", m_fLifeDeltaPercentChangeNG ); ini.SetValue( "Options", "TugMeterPercentChangeMarvelous", m_fTugMeterPercentChangeMarvelous ); ini.SetValue( "Options", "TugMeterPercentChangePerfect", m_fTugMeterPercentChangePerfect ); ini.SetValue( "Options", "TugMeterPercentChangeGreat", m_fTugMeterPercentChangeGreat ); ini.SetValue( "Options", "TugMeterPercentChangeGood", m_fTugMeterPercentChangeGood ); ini.SetValue( "Options", "TugMeterPercentChangeBoo", m_fTugMeterPercentChangeBoo ); ini.SetValue( "Options", "TugMeterPercentChangeMiss", m_fTugMeterPercentChangeMiss ); ini.SetValue( "Options", "TugMeterPercentChangeHitMine", m_fTugMeterPercentChangeHitMine ); ini.SetValue( "Options", "TugMeterPercentChangeOK", m_fTugMeterPercentChangeOK ); ini.SetValue( "Options", "TugMeterPercentChangeNG", m_fTugMeterPercentChangeNG ); ini.SetValue( "Options", "RegenComboAfterFail", m_iRegenComboAfterFail ); ini.SetValue( "Options", "RegenComboAfterMiss", m_iRegenComboAfterMiss ); ini.SetValue( "Options", "MaxRegenComboAfterFail", m_iMaxRegenComboAfterFail ); ini.SetValue( "Options", "MaxRegenComboAfterMiss", m_iMaxRegenComboAfterMiss ); ini.SetValue( "Options", "TwoPlayerRecovery", m_bTwoPlayerRecovery ); ini.SetValue( "Options", "MercifulDrain", m_bMercifulDrain ); ini.SetValue( "Options", "Minimum1FullSongInCourses", m_bMinimum1FullSongInCourses ); ini.SetValue( "Options", "PercentScoreWeightMarvelous", m_iPercentScoreWeightMarvelous ); ini.SetValue( "Options", "PercentScoreWeightPerfect", m_iPercentScoreWeightPerfect ); ini.SetValue( "Options", "PercentScoreWeightGreat", m_iPercentScoreWeightGreat ); ini.SetValue( "Options", "PercentScoreWeightGood", m_iPercentScoreWeightGood ); ini.SetValue( "Options", "PercentScoreWeightBoo", m_iPercentScoreWeightBoo ); ini.SetValue( "Options", "PercentScoreWeightMiss", m_iPercentScoreWeightMiss ); ini.SetValue( "Options", "PercentScoreWeightOK", m_iPercentScoreWeightOK ); ini.SetValue( "Options", "PercentScoreWeightNG", m_iPercentScoreWeightNG ); ini.SetValue( "Options", "PercentScoreWeightHitMine", m_iPercentScoreWeightHitMine ); ini.SetValue( "Options", "GradeWeightMarvelous", m_iGradeWeightMarvelous ); ini.SetValue( "Options", "GradeWeightPerfect", m_iGradeWeightPerfect ); ini.SetValue( "Options", "GradeWeightGreat", m_iGradeWeightGreat ); ini.SetValue( "Options", "GradeWeightGood", m_iGradeWeightGood ); ini.SetValue( "Options", "GradeWeightBoo", m_iGradeWeightBoo ); ini.SetValue( "Options", "GradeWeightMiss", m_iGradeWeightMiss ); ini.SetValue( "Options", "GradeWeightHitMine", m_iGradeWeightHitMine ); ini.SetValue( "Options", "GradeWeightOK", m_iGradeWeightOK ); ini.SetValue( "Options", "GradeWeightNG", m_iGradeWeightNG ); ini.SetValue( "Options", "NumGradeTiersUsed", m_iNumGradeTiersUsed ); for( int g=0; g::s_pSubscribers, p ) (*p)->WriteTo( ini ); } // lua start #include "LuaBinding.h" template class LunaPrefsManager : public Luna { public: LunaPrefsManager() { LUA->Register( Register ); } static int GetEventMode( T* p, lua_State *L ) { lua_pushboolean(L, p->m_bEventMode ); return 1; } static int SetEventMode( T* p, lua_State *L ) { p->m_bEventMode = BArg(1); return 0; } static void Register(lua_State *L) { ADD_METHOD( GetEventMode ) ADD_METHOD( SetEventMode ) Luna::Register( L ); // Add global singleton if constructed already. If it's not constructed yet, // then we'll register it later when we reinit Lua just before // initializing the display. if( PREFSMAN ) { lua_pushstring(L, "PREFSMAN"); PREFSMAN->PushSelf( LUA->L ); lua_settable(L, LUA_GLOBALSINDEX); } } }; LUA_REGISTER_CLASS( PrefsManager ) // lua end CoinMode PrefsManager::GetCoinMode() { if( m_bEventMode && m_CoinMode == COIN_PAY ) return COIN_FREE; else return m_CoinMode; } Premium PrefsManager::GetPremium() { if(m_bEventMode) return PREMIUM_NONE; else return m_Premium; } #include "RageLog.h" #include "LuaFunctions.h" int LuaFunc_GetPreference( lua_State *L ) { REQ_ARGS( "GetPreference", 1 ); REQ_ARG( "GetPreference", 1, string ); CString sName; LUA->PopStack( sName ); IPreference *pPref = PREFSMAN->GetPreferenceByName( sName ); if( pPref == NULL ) { LOG->Warn( "GetPreference: unknown preference \"%s\"", sName.c_str() ); lua_pushnil( L ); } else pPref->PushValue( L ); return 1; } LuaFunction( GetPreference ); /* register it */ LuaFunction_NoArgs( EventMode, PREFSMAN->m_bEventMode ) LuaFunction_NoArgs( ShowCaution, PREFSMAN->m_bShowCaution ) /* * (c) 2001-2004 Chris Danford, Chris Gomez * 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. */