diff --git a/stepmania/Themes/default/Languages/en.ini b/stepmania/Themes/default/Languages/en.ini index ede6342717..62ae5eca0d 100644 --- a/stepmania/Themes/default/Languages/en.ini +++ b/stepmania/Themes/default/Languages/en.ini @@ -1,4 +1,7 @@ -[Arch] +[Common] +WindowTitle=StepMania + +[Arch] Couldn't create a movie driver.=Couldn't create a movie driver. Input Handlers cannot be empty.=Input Handlers can not be empty. Movie Drivers cannot be empty.=Movie Drivers can not be empty. @@ -1387,6 +1390,8 @@ Jukebox=Jukebox Select Game=Select Game Theme=Theme Credits=Credits +Options=Options +%d songs in %d groups, %d courses in %d groups= [ScreenWithMenuElementsBlank] HelpText= @@ -1680,3 +1685,32 @@ Delete beat and shift up=Delete beat and shift up Shift BPM changes and stops up one beat=Shift BPM changes and stops up one beat Lay mine=Lay mine Add to/remove from right half=Add to/remove from right half + +[Grade] +Tier01=AAAA +Tier02=AAA +Tier03=AA +Tier04=A +Tier05=B +Tier06=C +Tier07=D +Failed=E +NoData=NO DATA + +[ScreenPackages] +HelpText= + +[ScreenOptionsTestMenu] +HelpText= + +[ScreenMiniMenuContext] +HelpText= + +[ScreenOptionsEditCoursesSimple] +HelpText= + +[ScreenSMOnlineLogin] +HelpText= + +[ScreenNetSelectMusic] +HelpText=Ctrl + Enter to enter room/select song diff --git a/stepmania/Themes/default/metrics.ini b/stepmania/Themes/default/metrics.ini index 205f8e1212..2a833a97e2 100644 --- a/stepmania/Themes/default/metrics.ini +++ b/stepmania/Themes/default/metrics.ini @@ -6,7 +6,6 @@ ColorP1Command=diffuse,PlayerColor(PLAYER_1) ColorP2Command=diffuse,PlayerColor(PLAYER_2) InitialScreen=ScreenCompany FirstAttractScreen=ScreenCompany -WindowTitle=StepMania DefaultModifiers= DefaultCpuModifiers= DifficultiesToShow=beginner,easy,medium,hard,challenge @@ -113,17 +112,6 @@ IdleTimeoutSeconds=30 IdleTimeoutScreen=@THEME:GetMetric("Common","FirstAttractScreen") PrevScreen=ScreenCompany -Game Start= -Select Game= -Options=Options -Edit/Sync Songs= -Edit Courses= -Jukebox= -Exit= - -%d songs in %d groups, %d courses in %d groups= - - [ScreenExit] Class=ScreenExit Fallback=Screen @@ -691,7 +679,6 @@ Class=ScreenSMOnlineLogin Fallback=ScreenOptionsServiceChild NextScreen=@SMOnlineScreen() PrevScreen=@ScreenTitleBranch() -HelpText= StyleIcon=0 TimerSeconds=-1 @@ -818,7 +805,6 @@ NumSongsShow=4 NumGroupsShow=3 StyleIcon= TimerSeconds= -HelpText=Ctrl + Enter to enter room/select song PrevScreen=@ScreenTitleBranch() NextScreen=ScreenStage NoSongsScreen=@ScreenTitleBranch() @@ -2754,7 +2740,6 @@ DownloadStatusOffCommand=diffusealpha,1.0;linear,0.6;diffusealpha,0.0 CanDL=1 StyleIcon= TimerSeconds= -HelpText= PrevScreen=@ScreenTitleBranch() NextScreen=ScreenStage NoSongsScreen=@ScreenTitleBranch() @@ -3783,7 +3768,6 @@ NextScreen=ScreenOptionsService PrevScreen=ScreenOptionsService LineNames=1 Line1=lua,OptionsRowTest() -HelpText= [TextBanner] TitleX=-90 @@ -4220,16 +4204,6 @@ DeltaSecondsW1Command=shadowlength,4;diffusealpha,1;zoom,1.25;linear,0.3;zoomx,1 DeltaSecondsLetGoCommand=shadowlength,4;diffusealpha,1;zoom,1.25;linear,0.3;zoomx,1;zoomy,1;sleep,0.5;linear,0;diffusealpha,0 DeltaSecondsHeldCommand=shadowlength,4;diffusealpha,1;zoom,1.25;linear,0.3;zoomx,1;zoomy,1;sleep,0.5;linear,0;diffusealpha,0 DeltaSecondsGainLifeCommand= -[Grade] -Tier01=AAAA -Tier02=AAA -Tier03=AA -Tier04=A -Tier05=B -Tier06=C -Tier07=D -Failed=E -NoData=NO DATA [PlayerStageStats] GradePercentTier01=1.000000 @@ -4542,7 +4516,6 @@ TitleGainFocusCommand=diffuseshift;EffectColor1,0.3,0.3,0.3,1;EffectColor2,1.3,1 TitleLoseFocusCommand=stopeffect ItemsStartX=0 LineHighlightX=0 -HelpText= ColorSelected=1,1,1,1 ColorNotSelected=0.7,0.7,0.7,1 @@ -4583,7 +4556,6 @@ InputMode=together TitleOnCommand=zoom,0.5;horizalign,left;ShadowLength,0 TitleGainFocusCommand=diffuseshift;EffectColor1,1.3,1.3,1.3,1;EffectColor2,0.3,0.3,0.3,1 TitleLoseFocusCommand=stopeffect -HelpText= BulletOnCommand=hidden,1 [ScreenOptionsManageCourses] diff --git a/stepmania/src/BPMDisplay.h b/stepmania/src/BPMDisplay.h index 502bd42dac..502240372a 100644 --- a/stepmania/src/BPMDisplay.h +++ b/stepmania/src/BPMDisplay.h @@ -35,8 +35,8 @@ protected: ThemeMetric CHANGE_COLOR; ThemeMetric EXTRA_COLOR; ThemeMetric CYCLE; - LocalizedString SEPARATOR; - LocalizedString NO_BPM_TEXT; + ThemeMetric SEPARATOR; + ThemeMetric NO_BPM_TEXT; BitmapText m_textBPM; AutoActor m_sprLabel; diff --git a/stepmania/src/CommonMetrics.cpp b/stepmania/src/CommonMetrics.cpp index 4713c6d067..9f539beae7 100644 --- a/stepmania/src/CommonMetrics.cpp +++ b/stepmania/src/CommonMetrics.cpp @@ -6,6 +6,7 @@ #include "RageLog.h" #include "GameState.h" #include "ProductInfo.h" +#include "LuaFunctions.h" static RString PLAYER_COLOR_NAME( size_t p ) { return ssprintf("ColorP%dCommand",int(p+1)); } @@ -124,11 +125,12 @@ const vector& ThemeMetricStepsTypesToShow::GetValue() { return m_v; } RString CommonMetrics::LocalizeOptionItem( const RString &s, bool bOptional ) { - if( bOptional && !THEME->HasMetric("OptionNames",s) ) + if( bOptional && !THEME->HasString("OptionNames",s) ) return s; return THEME->GetString( "OptionNames", s ); } +LuaFunction( LocalizeOptionItem, CommonMetrics::LocalizeOptionItem(SArg(1),true) ); /* * (c) 2001-2004 Chris Danford diff --git a/stepmania/src/GameManager.cpp b/stepmania/src/GameManager.cpp index d3e818f55a..7a1217efaf 100644 --- a/stepmania/src/GameManager.cpp +++ b/stepmania/src/GameManager.cpp @@ -2796,7 +2796,7 @@ RString GameManager::StepsTypeToString( StepsType st ) RString GameManager::StepsTypeToLocalizedString( StepsType st ) { RString s = StepsTypeToString( st ); - if( THEME->HasMetric( "StepsType", s ) ) + if( THEME->HasString( "StepsType", s ) ) return THEME->GetString( "StepsType", s ); else return s; @@ -2806,7 +2806,7 @@ RString GameManager::StyleToLocalizedString( const Style* style ) { RString s = style->m_szName; s = Capitalize( s ); - if( THEME->HasMetric( "Style", s ) ) + if( THEME->HasString( "Style", s ) ) return THEME->GetString( "Style", s ); else return s; diff --git a/stepmania/src/Grade.cpp b/stepmania/src/Grade.cpp index a68f3cf0f4..b252f09c53 100644 --- a/stepmania/src/Grade.cpp +++ b/stepmania/src/Grade.cpp @@ -12,7 +12,7 @@ LuaFunction( GradeToString, GradeToString((Grade)IArg(1)) ) RString GradeToLocalizedString( Grade g ) { RString s = GradeToString(g); - if( !THEME->HasMetric("Grade",s) ) + if( !THEME->HasString("Grade",s) ) return "???"; return THEME->GetString( "Grade",s ); } diff --git a/stepmania/src/ThemeManager.cpp b/stepmania/src/ThemeManager.cpp index 8ab93c1683..13e2eab760 100644 --- a/stepmania/src/ThemeManager.cpp +++ b/stepmania/src/ThemeManager.cpp @@ -45,7 +45,18 @@ struct Theme }; // When looking for a metric or an element, search these from head to tail. static deque g_vThemes; -static IniFile *g_pIniMetrics; +class LoadedThemeData +{ +public: + IniFile iniMetrics; + IniFile iniStrings; + void ClearAll() + { + iniMetrics.Clear(); + iniStrings.Clear(); + } +}; +LoadedThemeData *g_pLoadedThemeData = NULL; // @@ -148,7 +159,7 @@ ThemeManager::ThemeManager() ThemeManager::~ThemeManager() { g_vThemes.clear(); - SAFE_DELETE( g_pIniMetrics ); + SAFE_DELETE( g_pLoadedThemeData ); } void ThemeManager::GetThemeNames( vector& AddTo ) @@ -269,8 +280,12 @@ static void MergeIniUnder( XNode *pFrom, XNode *pTo ) void ThemeManager::LoadThemeMetrics( deque &theme, const RString &sThemeName_, const RString &sLanguage_ ) { - delete g_pIniMetrics; - g_pIniMetrics = new IniFile; + if( g_pLoadedThemeData == NULL ) + g_pLoadedThemeData = new LoadedThemeData; + + // Don't delete and recreate LoadedThemeData. There are references iniMetrics and iniStrings + // on the stack, so Clear them instead. + g_pLoadedThemeData->ClearAll(); g_vThemes.clear(); RString sThemeName(sThemeName_); @@ -288,14 +303,15 @@ void ThemeManager::LoadThemeMetrics( deque &theme, const RString &sThemeN Theme &t = g_vThemes.back(); t.sThemeName = sThemeName; - IniFile ini; - ini.ReadFile( GetMetricsIniPath(sThemeName) ); - ini.ReadFile( GetLanguageIniPath(sThemeName,SpecialFiles::BASE_LANGUAGE) ); + IniFile iniMetrics; + IniFile iniStrings; + iniMetrics.ReadFile( GetMetricsIniPath(sThemeName) ); + iniStrings.ReadFile( GetLanguageIniPath(sThemeName,SpecialFiles::BASE_LANGUAGE) ); if( sLanguage.CompareNoCase(SpecialFiles::BASE_LANGUAGE) ) - ini.ReadFile( GetLanguageIniPath(sThemeName,sLanguage) ); + iniStrings.ReadFile( GetLanguageIniPath(sThemeName,sLanguage) ); bool bIsBaseTheme = !sThemeName.CompareNoCase(SpecialFiles::BASE_THEME_NAME); - ini.GetValue( "Global", "IsBaseTheme", bIsBaseTheme ); + iniMetrics.GetValue( "Global", "IsBaseTheme", bIsBaseTheme ); if( bIsBaseTheme ) bLoadedBase = true; @@ -303,7 +319,7 @@ void ThemeManager::LoadThemeMetrics( deque &theme, const RString &sThemeN * already loaded it, fall back on SpecialFiles::BASE_THEME_NAME. That way, default theme * fallbacks can be disabled with "FallbackTheme=". */ RString sFallback; - if( !ini.GetValue("Global","FallbackTheme",sFallback) ) + if( !iniMetrics.GetValue("Global","FallbackTheme",sFallback) ) { if( sThemeName.CompareNoCase( SpecialFiles::BASE_THEME_NAME ) && !bLoadedBase ) sFallback = SpecialFiles::BASE_THEME_NAME; @@ -314,7 +330,8 @@ void ThemeManager::LoadThemeMetrics( deque &theme, const RString &sThemeN * need to load the derived theme first, to find out the name of the fallback * theme. Avoid having to load IniFile twice, merging the fallback theme * into the derived theme that we've already loaded. */ - MergeIniUnder( &ini, g_pIniMetrics ); + MergeIniUnder( &iniMetrics, &g_pLoadedThemeData->iniMetrics ); + MergeIniUnder( &iniStrings, &g_pLoadedThemeData->iniStrings ); if( sFallback.empty() ) break; @@ -333,7 +350,7 @@ void ThemeManager::LoadThemeMetrics( deque &theme, const RString &sThemeN if( !re.Compare( sMetric, sBits ) ) RageException::Throw( "Invalid argument \"--metric=%s\"", sMetric.c_str() ); - g_pIniMetrics->SetValue( sBits[0], sBits[1], sBits[2] ); + g_pLoadedThemeData->iniMetrics.SetValue( sBits[0], sBits[1], sBits[2] ); } LOG->MapLog( "theme", "Theme: %s", m_sCurThemeName.c_str() ); @@ -665,7 +682,7 @@ RString ThemeManager::GetPathToAndFallback( ElementCategory category, const RStr // search fallback name (if any) RString sFallback; - if( !GetMetricRawRecursive(sClassName, "Fallback", sFallback) ) + if( !GetMetricRawRecursive( g_pLoadedThemeData->iniMetrics, sClassName, "Fallback", sFallback) ) return RString(); sClassName = sFallback; } @@ -758,7 +775,13 @@ RString ThemeManager::GetMetricsIniPath( const RString &sThemeName ) bool ThemeManager::HasMetric( const RString &sClassName, const RString &sValueName ) { RString sThrowAway; - return GetMetricRawRecursive( sClassName, sValueName, sThrowAway ); + return GetMetricRawRecursive( g_pLoadedThemeData->iniMetrics, sClassName, sValueName, sThrowAway ); +} + +bool ThemeManager::HasString( const RString &sClassName, const RString &sValueName ) +{ + RString sThrowAway; + return GetMetricRawRecursive( g_pLoadedThemeData->iniStrings, sClassName, sValueName, sThrowAway ); } static LocalizedString RELOADED_METRICS( "ThemeManager", "Reloaded metrics" ); @@ -776,24 +799,25 @@ void ThemeManager::ReloadMetrics() } -bool ThemeManager::GetMetricRawRecursive( const RString &sClassName_, const RString &sValueName, RString &sOut ) +bool ThemeManager::GetMetricRawRecursive( const IniFile &ini, const RString &sClassName_, const RString &sValueName, RString &sOut ) { ASSERT( sValueName != "" ); RString sClassName( sClassName_ ); - ASSERT( g_pIniMetrics ); + ASSERT( g_pLoadedThemeData ); int n = 100; while( n-- ) { - if( g_pIniMetrics->GetValue(sClassName,sValueName,sOut) ) + if( ini.GetValue(sClassName,sValueName,sOut) ) return true; if( !sValueName.compare("Fallback") ) return false; RString sFallback; - if( !GetMetricRawRecursive(sClassName,"Fallback",sFallback) ) + // always look in iniMetrics for "Fallback" + if( !GetMetricRawRecursive(g_pLoadedThemeData->iniMetrics,sClassName,"Fallback",sFallback) ) return false; sClassName = sFallback; @@ -802,7 +826,7 @@ bool ThemeManager::GetMetricRawRecursive( const RString &sClassName_, const RStr RageException::Throw( "Infinite recursion looking up theme metric \"%s::%s\"", sClassName.c_str(), sValueName.c_str() ); } -RString ThemeManager::GetMetricRaw( const RString &sClassName_, const RString &sValueName_ ) +RString ThemeManager::GetMetricRaw( const IniFile &ini, const RString &sClassName_, const RString &sValueName_ ) { /* Ugly: the parameters to this function may be a reference into g_vThemes, or something * else that might suddenly go away when we call ReloadMetrics. */ @@ -812,7 +836,7 @@ RString ThemeManager::GetMetricRaw( const RString &sClassName_, const RString &s while( true ) { RString ret; - if( ThemeManager::GetMetricRawRecursive( sClassName, sValueName, ret ) ) + if( ThemeManager::GetMetricRawRecursive( ini, sClassName, sValueName, ret ) ) return ret; @@ -847,7 +871,7 @@ RString ThemeManager::GetMetricRaw( const RString &sClassName_, const RString &s /* Get a string metric. */ RString ThemeManager::GetMetric( const RString &sClassName, const RString &sValueName ) { - RString sValue = GetMetricRaw(sClassName,sValueName); + RString sValue = GetMetricRaw(g_pLoadedThemeData->iniMetrics,sClassName,sValueName); EvaluateString( sValue ); @@ -921,7 +945,7 @@ Commands ThemeManager::GetMetricM( const RString &sClassName, const RString &sVa #if !defined(SMPACKAGE) apActorCommands ThemeManager::GetMetricA( const RString &sClassName, const RString &sValueName ) { - RString sValue = GetMetricRaw( sClassName, sValueName ); + RString sValue = GetMetricRaw( g_pLoadedThemeData->iniMetrics, sClassName, sValueName ); return apActorCommands( new ActorCommands( sValue ) ); } #endif @@ -963,7 +987,7 @@ RString ThemeManager::GetLanguageIniPath( const RString &sThemeName, const RStri void ThemeManager::GetModifierNames( vector& AddTo ) { - const XNode *cur = g_pIniMetrics->GetChild( "OptionNames" ); + const XNode *cur = g_pLoadedThemeData->iniStrings.GetChild( "OptionNames" ); if( cur ) { FOREACH_CONST_Attr( cur, p ) @@ -980,7 +1004,7 @@ void ThemeManager::GetMetric( const RString &sClassName, const RString &sValueNa void ThemeManager::GetMetric( const RString &sClassName, const RString &sValueName, LuaExpression &valueOut ) { - RString sValue = GetMetricRaw( sClassName, sValueName ); + RString sValue = GetMetricRaw( g_pLoadedThemeData->iniMetrics, sClassName, sValueName ); valueOut.SetFromExpression( "function(self) " + sValue + "end" ); } @@ -1019,9 +1043,13 @@ RString ThemeManager::GetString( const RString &sClassName, const RString &sValu sValueName.Replace( "\r\n", "\\n" ); sValueName.Replace( "\n", "\\n" ); - + RString s = GetMetricRaw(g_pLoadedThemeData->iniStrings,sClassName,sValueName); + FontCharAliases::ReplaceMarkers( s ); + + // Don't EvalulateString. Strings are raw and shouldn't allow Lua. + //EvaluateString( s ); + // Write stubs for missing strings into every language file. - RString s = ThemeManager::GetMetric( sClassName, sValueName ); /* if( !ThemeManager::GetMetricRawRecursive( sClassName, sValueName, s ) ) { @@ -1035,7 +1063,6 @@ RString ThemeManager::GetString( const RString &sClassName, const RString &sValu LoadThemeMetrics( g_vThemes, m_sCurThemeName, m_sCurLanguage ); } */ - EvaluateString( s ); s.Replace( "\\n", "\n" ); @@ -1075,7 +1102,7 @@ void ThemeManager::GetMetricsThatBeginWith( const RString &sClassName_, const RS RString sClassName( sClassName_ ); while( !sClassName.empty() ) { - const XNode *cur = g_pIniMetrics->GetChild( sClassName ); + const XNode *cur = g_pLoadedThemeData->iniMetrics.GetChild( sClassName ); if( cur != NULL ) { // Iterate over all metrics that match. @@ -1091,7 +1118,7 @@ void ThemeManager::GetMetricsThatBeginWith( const RString &sClassName_, const RS // put the fallback (if any) in sClassName RString sFallback; - if( GetMetricRawRecursive( sClassName, "Fallback", sFallback ) ) + if( GetMetricRawRecursive( g_pLoadedThemeData->iniMetrics, sClassName, "Fallback", sFallback ) ) sClassName = sFallback; else sClassName = ""; diff --git a/stepmania/src/ThemeManager.h b/stepmania/src/ThemeManager.h index a119645671..67a7d15135 100644 --- a/stepmania/src/ThemeManager.h +++ b/stepmania/src/ThemeManager.h @@ -71,9 +71,9 @@ public: // TODO: Make these return values const refs. bool HasMetric( const RString &sClassName, const RString &sValueName ); - RString GetMetricRaw( const RString &sClassName, const RString &sValueName ); + RString GetMetricRaw( const IniFile &ini, const RString &sClassName, const RString &sValueName ); RString GetMetric( const RString &sClassName, const RString &sValueName ); - int GetMetricI( const RString &sClassName, const RString &sValueName ); + int GetMetricI( const RString &sClassName, const RString &sValueName ); float GetMetricF( const RString &sClassName, const RString &sValueName ); bool GetMetricB( const RString &sClassName, const RString &sValueName ); RageColor GetMetricC( const RString &sClassName, const RString &sValueName ); @@ -94,6 +94,7 @@ public: #endif // Languages + bool HasString( const RString &sClassName, const RString &sValueName ); RString GetString( const RString &sClassName, const RString &sValueName ); void GetString( const RString &sClassName, const RString &sValueName, RString &valueOut ) { valueOut = GetString( sClassName, sValueName ); } void FilterFileLanguages( vector &asElementPaths ); @@ -114,7 +115,7 @@ public: protected: void RunLuaScripts( const RString &sMask ); void LoadThemeMetrics( deque &theme, const RString &sThemeName, const RString &sLanguage_ ); - bool GetMetricRawRecursive( const RString &sClassName, const RString &sValueName, RString &sRet ); + bool GetMetricRawRecursive( const IniFile &ini, const RString &sClassName, const RString &sValueName, RString &sRet ); RString GetPathToAndFallback( ElementCategory category, const RString &sClassName, const RString &sFile ); RString GetPathToRaw( const RString &sThemeName, ElementCategory category, const RString &sClassName, const RString &sFile ); static RString GetThemeDirFromName( const RString &sThemeName );