diff --git a/Docs/Changelog_sm5.txt b/Docs/Changelog_sm5.txt index d6c32aac74..6dc057dfb3 100644 --- a/Docs/Changelog_sm5.txt +++ b/Docs/Changelog_sm5.txt @@ -5,19 +5,26 @@ from StepMania 4 alpha 5 to sm-ssc v1.2.5, see Changelog_sm-ssc.txt. ________________________________________________________________________________ ================================================================================ -StepMania 5.0 Preview 1a | 20110603 +StepMania 5.0 Preview 2 | 20110??? -------------------------------------------------------------------------------- -Date Forgotten --------------- -* [ScreenEdit] Fix Song Timing behaviors. [Wolfman2000] -* [NotesLoaderSM] Fix an Offset load bug. [Wolfman2000] +2011/06/04 +---------- +* Changed default MusicWheelSwitchSpeed to 15 (was 10). [AJ] +* [AnnouncerManager] Fixed a bug where no announcers would be loaded. [AJ] +* Restored the UserPrefAutoSetStyle behavior. [Wolfman2000] +* [NotesLoaderSMA] Better way of identifying beats and seconds. [Wolfman2000] + +================================================================================ +StepMania 5.0 Preview 1a | 20110603 +-------------------------------------------------------------------------------- 2011/06/03 ---------- * [LifeMeterBattery] Added LivesLeft param to LifeChanged message. [AJ] * [Windows] Set up directories for pictures and app data in their proper location. [Henke] +* [NotesLoaderSM] Fix an Offset load bug. [Wolfman2000] 2011/06/02 ---------- @@ -30,6 +37,7 @@ Date Forgotten 2011/06/01 ---------- * [TimingData] Added the HasScrollChanges lua binding. [Wolfman2000] +* [ScreenEdit] Fix Song Timing behaviors. [Wolfman2000] 2011/05/31 ---------- diff --git a/Docs/credits.txt b/Docs/credits.txt index b7cb9c0177..87dabf8ef1 100644 --- a/Docs/credits.txt +++ b/Docs/credits.txt @@ -49,7 +49,7 @@ Thai Pangsakulyanont (theDtTvB) Jason Felds (Wolfman2000) * [Player] PercentUntilColorCombo metric * Mac OS X maintainer - * Various fixes/changes. (see Changelog_sm-ssc.txt for more details) + * Various fixes/changes. (see Changelogs for more details) ==other contributors== (in no particular order, aside from having SM team at the top) diff --git a/Themes/_fallback/Scripts/03 Gameplay.lua b/Themes/_fallback/Scripts/03 Gameplay.lua index c9369de85a..f26977c630 100644 --- a/Themes/_fallback/Scripts/03 Gameplay.lua +++ b/Themes/_fallback/Scripts/03 Gameplay.lua @@ -27,7 +27,7 @@ function GameCompatibleModes() sGame = GAMESTATE:GetCurrentGame():GetName() local Modes = { dance = "Single,Double,Solo,Versus,Couple", - pump = "Single,Double,HalfDouble,Versus,Couple", + pump = "Single,Double,HalfDouble,Versus,Couple,Routine", beat = "5Keys,7Keys,10Keys,14Keys", kb7 = "KB7", para = "Single", diff --git a/Themes/_fallback/Scripts/03 ThemeAndGamePrefs.lua b/Themes/_fallback/Scripts/03 ThemeAndGamePrefs.lua index c44c82147d..87e6972667 100644 --- a/Themes/_fallback/Scripts/03 ThemeAndGamePrefs.lua +++ b/Themes/_fallback/Scripts/03 ThemeAndGamePrefs.lua @@ -7,10 +7,8 @@ function InitGamePrefs() local BPrefs = { - { "AutoSetStyle", false }, - { "NotePosition", true }, { "ComboOnRolls", false }, - { "ComboUnderField", true }, + }; for idx,pref in ipairs(Prefs) do @@ -41,6 +39,9 @@ function InitUserPrefs() local BPrefs = { + { "UserPrefComboUnderField", true }, + { "UserPrefAutoSetStyle", false }, + { "UserPrefNotePosition", true }, { "UserPrefShowLotsaOptions", true}, { "UserPrefLongFail", false}, { "UserPrefProtimingP1", false}, @@ -398,23 +399,23 @@ function GamePrefComboOnRolls() setmetatable( t, t ); return t; end -function GamePrefComboUnderField() +function UserPrefComboUnderField() local t = { - Name = "GamePrefComboUnderField"; + Name = "UserPrefComboUnderField"; LayoutType = "ShowAllInRow"; SelectType = "SelectOne"; OneChoiceForAllPlayers = true; ExportOnChange = false; Choices = { 'Off','On' }; LoadSelections = function(self, list, pn) - if ReadGamePrefFromFile("ComboUnderField") ~= nil then - if GetGamePrefB("ComboUnderField") then + if ReadPrefFromFile("UserPrefComboUnderField") ~= nil then + if GetUserPrefB("UserPrefComboUnderField") then list[2] = true; else list[1] = true; end; else - WriteGamePrefToFile("ComboUnderField",true); + WritePrefToFile("UserPrefComboUnderField",true); list[2] = true; end; end; @@ -425,7 +426,7 @@ function GamePrefComboUnderField() else val = false; end; - WriteGamePrefToFile("ComboUnderField",val); + WritePrefToFile("UserPrefComboUnderField",val); MESSAGEMAN:Broadcast("PreferenceSet", { Message == "Set Preference" } ); THEME:ReloadMetrics(); end; @@ -434,23 +435,23 @@ function GamePrefComboUnderField() return t; end -function GamePrefAutoSetStyle() +function UserPrefAutoSetStyle() local t = { - Name = "GamePrefAutoSetStyle"; + Name = "UserPrefAutoSetStyle"; LayoutType = "ShowAllInRow"; SelectType = "SelectOne"; OneChoiceForAllPlayers = true; ExportOnChange = false; Choices = { 'Off','On' }; LoadSelections = function(self, list, pn) - if ReadGamePrefFromFile("AutoSetStyle") ~= nil then - if GetGamePrefB("AutoSetStyle") then + if ReadPrefFromFile("UserPrefAutoSetStyle") ~= nil then + if GetUserPrefB("UserPrefAutoSetStyle") then list[2] = true; else list[1] = true; end; else - WriteGamePrefToFile("AutoSetStyle",false); + WritePrefToFile("UserPrefAutoSetStyle",false); list[1] = true; end; end; @@ -461,7 +462,7 @@ function GamePrefAutoSetStyle() else val = false; end; - WriteGamePrefToFile("AutoSetStyle",val); + WritePrefToFile("UserPrefAutoSetStyle",val); MESSAGEMAN:Broadcast("PreferenceSet", { Message == "Set Preference" } ); THEME:ReloadMetrics(); end; @@ -469,23 +470,23 @@ function GamePrefAutoSetStyle() setmetatable( t, t ); return t; end -function GamePrefNotePosition() +function UserPrefNotePosition() local t = { - Name = "GamePrefNotePosition"; + Name = "UserPrefNotePosition"; LayoutType = "ShowAllInRow"; SelectType = "SelectOne"; OneChoiceForAllPlayers = true; ExportOnChange = false; Choices = { 'Normal','Lower' }; LoadSelections = function(self, list, pn) - if ReadGamePrefFromFile("NotePosition") ~= nil then - if GetGamePrefB("NotePosition") then + if ReadPrefFromFile("UserPrefNotePosition") ~= nil then + if GetUserPrefB("UserPrefNotePosition") then list[1] = true; else list[2] = true; end; else - WriteGamePrefToFile("NotePosition",false); + WritePrefToFile("UserPrefNotePosition",false); list[1] = true; end; end; @@ -496,7 +497,7 @@ function GamePrefNotePosition() else val = false; end; - WriteGamePrefToFile("NotePosition",val); + WritePrefToFile("UserPrefNotePosition",val); MESSAGEMAN:Broadcast("PreferenceSet", { Message == "Set Preference" } ); THEME:ReloadMetrics(); end; diff --git a/Themes/_fallback/metrics.ini b/Themes/_fallback/metrics.ini index 46246439b0..195bd35e1f 100644 --- a/Themes/_fallback/metrics.ini +++ b/Themes/_fallback/metrics.ini @@ -25,7 +25,7 @@ ScreenHeight=480 # Allows you to pick all available game modes for your gametype: for example, # inserting enough coins for 1p would let you choose between solo, single # and double before each game -AutoSetStyle=GetGamePrefB("AutoSetStyle") +AutoSetStyle=GetUserPrefB("UserPrefAutoSetStyle") # Default modifiers and noteskin. DefaultModifiers="default,1.5x" diff --git a/Themes/default/BGAnimations/ScreenCredits overlay.lua b/Themes/default/BGAnimations/ScreenCredits overlay.lua index 48f4c252cd..6221e2c695 100644 --- a/Themes/default/BGAnimations/ScreenCredits overlay.lua +++ b/Themes/default/BGAnimations/ScreenCredits overlay.lua @@ -49,7 +49,7 @@ local contrib = { "Kaox", -- pump/default noteskin "NitroX72", -- pump/frame noteskin "sy567", -- beginner helper fix - "Thai Pangsakulyanont (theDtTvB)", + "Thai Pangsakulyanont (theDtTvB)", -- BMS, Split Timing, optimization "v1toko", -- x-mode from StepNXA } @@ -143,4 +143,4 @@ return Def.ActorFrame{ LoadActor(THEME:GetPathB("ScreenWithMenuElements","background/_bg top"))..{ InitCommand=cmd(Center), }, -}; \ No newline at end of file +}; diff --git a/Themes/default/metrics.ini b/Themes/default/metrics.ini index 30c94c4d1f..d3e01fbd43 100644 --- a/Themes/default/metrics.ini +++ b/Themes/default/metrics.ini @@ -409,8 +409,7 @@ MeterSetCommand=%function(self,param) \ end; # ShowDescription=true -DescriptionX=GetGamePrefB("AutoSetStyle") and (-64-8+20) or (-64-8) -# DescriptionX=GetUserPrefB("UserPrefAutoSetStyle") and (-64-8+20) or (-64-8) +DescriptionX=GetUserPrefB("UserPrefAutoSetStyle") and (-64-8+20) or (-64-8) DescriptionOnCommand=shadowlength,1;horizalign,left;zoom,0.65;maxwidth,128+8-20;uppercase,true; DescriptionSetCommand=%function(self,param) \ if self:GetText() == "" then \ @@ -428,7 +427,7 @@ AutogenY=0 #AutogenOnCommand=diffuseshift;effectcolor1,Colors.Alpha( Color("Green") , 0.5 );effectcolor2,ColorLightTone( Color("Green") ); AutogenOnCommand=blend,Blend.Add;diffuseshift;effectcolor1,color("#FFCC00FF");effectcolor2,color("#FFCC0088"); # -ShowStepsType=GetGamePrefB("AutoSetStyle") +ShowStepsType=GetUserPrefB("UserPrefAutoSetStyle") StepsTypeX=-64-8 StepsTypeY=0 StepsTypeOnCommand= @@ -883,8 +882,7 @@ StageDisplayY=SCREEN_TOP+24+3 StageDisplayOnCommand=skewx,-0.125;draworder,105;fov,90;zoom,0.675;zoomy,0;sleep,0.35;smooth,0.35;zoomy,0.675 StageDisplayOffCommand=linear,0.25;zoomy,0; # -ShowDifficultyDisplay=not GetGamePrefB("AutoSetStyle") and not GAMESTATE:IsCourseMode() -# ShowDifficultyDisplay=not GetUserPrefB("UserPrefAutoSetStyle") and not GAMESTATE:IsCourseMode() +ShowDifficultyDisplay=not GetUserPrefB("UserPrefAutoSetStyle") and not GAMESTATE:IsCourseMode() DifficultyDisplayX=SCREEN_CENTER_X-160 DifficultyDisplayY=SCREEN_TOP+160-96+2 DifficultyDisplayOnCommand=draworder,105;fov,90;zoom,1;zoomy,0;sleep,0.35;smooth,0.35;zoomy,1 @@ -1069,8 +1067,7 @@ end; # ShowDescription=true DescriptionX=-20-32 -DescriptionY=GetGamePrefB("AutoSetStyle") and -5 or 0 -# DescriptionY=GetUserPrefB("UserPrefAutoSetStyle") and -5 or 0 +DescriptionY=GetUserPrefB("UserPrefAutoSetStyle") and -5 or 0 DescriptionOnCommand=shadowlength,1;uppercase,true;zoom,0.75;maxwidth,128+8 DescriptionSetCommand=%function(self,param) \ if self:GetText() == "" then \ @@ -1088,8 +1085,7 @@ AutogenY=0 AutogenOnCommand= AutogenSetCommand=%function(self,param) if param.Difficulty then self:diffuse(CustomDifficultyToLightColor(param.Difficulty)); self:strokecolor(CustomDifficultyToDarkColor(param.Difficulty)); end end # -ShowStepsType=GetGamePrefB("AutoSetStyle") -# ShowStepsType=GetUserPrefB("UserPrefAutoSetStyle") +ShowStepsType=GetUserPrefB("UserPrefAutoSetStyle") StepsTypeX=-20-32 StepsTypeY=7 StepsTypeOnCommand=zoom,0.45 @@ -1119,8 +1115,7 @@ end; # ShowDescription=true DescriptionX=-20 -DescriptionY=GetGamePrefB("AutoSetStyle") and -5 or 0 -# DescriptionY=GetUserPrefB("UserPrefAutoSetStyle") and -5 or 0 +DescriptionY=GetUserPrefB("UserPrefAutoSetStyle") and -5 or 0 DescriptionOnCommand=shadowlength,1;uppercase,true;zoom,0.75;maxwidth,128+8 DescriptionSetCommand=%function(self,param) \ if self:GetText() == "" then \ @@ -1139,8 +1134,7 @@ AutogenY=0 AutogenOnCommand= AutogenSetCommand=%function(self,param) if param.Difficulty then self:diffuse(CustomDifficultyToLightColor(param.Difficulty)); self:strokecolor(CustomDifficultyToDarkColor(param.Difficulty)); end end # -ShowStepsType=GetGamePrefB("AutoSetStyle") -# ShowStepsType=GetUserPrefB("UserPrefAutoSetStyle") +ShowStepsType=GetUserPrefB("UserPrefAutoSetStyle") StepsTypeX=-20 StepsTypeY=7 StepsTypeOnCommand=zoom,0.45 diff --git a/Xcode/stepmania.xcodeproj/project.pbxproj b/Xcode/stepmania.xcodeproj/project.pbxproj index 95044c3766..83b2d2a8b7 100644 --- a/Xcode/stepmania.xcodeproj/project.pbxproj +++ b/Xcode/stepmania.xcodeproj/project.pbxproj @@ -45,7 +45,7 @@ 2B17AB8A13980FF6001AE57D /* pngwrite.c in Sources */ = {isa = PBXBuildFile; fileRef = 2BC6132113773C8E00CC8BBD /* pngwrite.c */; }; 2B17AB8B13980FF6001AE57D /* pngwtran.c in Sources */ = {isa = PBXBuildFile; fileRef = 2BC6132213773C8E00CC8BBD /* pngwtran.c */; }; 2B17AB8C13980FF6001AE57D /* pngwutil.c in Sources */ = {isa = PBXBuildFile; fileRef = 2BC6132313773C8E00CC8BBD /* pngwutil.c */; }; - 2B17AB9F13981271001AE57D /* libpng.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2B17AB7213980FDF001AE57D /* libpng.a */; }; + 2B17AB9F13981271001AE57D /* libpng-1.5.1sm0.1.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2B17AB7213980FDF001AE57D /* libpng-1.5.1sm0.1.a */; }; 2B17ABC51398153F001AE57D /* glew.c in Sources */ = {isa = PBXBuildFile; fileRef = EE879BAA132E06C50078FDDC /* glew.c */; }; 2B17ABCF139815E0001AE57D /* libglew.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2B17ABC013981521001AE57D /* libglew.a */; }; 2B17ABE51398179E001AE57D /* chartables.c in Sources */ = {isa = PBXBuildFile; fileRef = AA8B6C7904AFD87300D02EE9 /* chartables.c */; }; @@ -1824,7 +1824,7 @@ 1215D7A108C6559A00B87D8B /* ScreenGameplayNormal.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.h; name = ScreenGameplayNormal.h; path = ../src/ScreenGameplayNormal.h; sourceTree = ""; }; 29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; - 2B17AB7213980FDF001AE57D /* libpng.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libpng.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 2B17AB7213980FDF001AE57D /* libpng-1.5.1sm0.1.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libpng-1.5.1sm0.1.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 2B17ABC013981521001AE57D /* libglew.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libglew.a; sourceTree = BUILT_PRODUCTS_DIR; }; 2B17ABE013981756001AE57D /* libpcre.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libpcre.a; sourceTree = BUILT_PRODUCTS_DIR; }; 2B30D6801315EA7E00044B68 /* MouseDevice.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MouseDevice.cpp; sourceTree = ""; }; @@ -3123,7 +3123,7 @@ AA059E2C0B8F0C67006F8139 /* libz_link.a in Frameworks */, AAA0704E0CE5082E005A3060 /* libffmpeg_link.a in Frameworks */, AAA071B40CE7C9C9005A3060 /* libmad.a in Frameworks */, - 2B17AB9F13981271001AE57D /* libpng.a in Frameworks */, + 2B17AB9F13981271001AE57D /* libpng-1.5.1sm0.1.a in Frameworks */, 2B17ABCF139815E0001AE57D /* libglew.a in Frameworks */, 2B17ABFC139817D5001AE57D /* libpcre.a in Frameworks */, ); @@ -3241,7 +3241,7 @@ AA7C895F0B67444700FD9940 /* libtommath.a */, AA7C8B8B0B67460600FD9940 /* libtomcrypt.a */, AAA070A90CE7B0DF005A3060 /* libmad.a */, - 2B17AB7213980FDF001AE57D /* libpng.a */, + 2B17AB7213980FDF001AE57D /* libpng-1.5.1sm0.1.a */, 2B17ABC013981521001AE57D /* libglew.a */, 2B17ABE013981756001AE57D /* libpcre.a */, ); @@ -5673,7 +5673,7 @@ ); name = png; productName = png; - productReference = 2B17AB7213980FDF001AE57D /* libpng.a */; + productReference = 2B17AB7213980FDF001AE57D /* libpng-1.5.1sm0.1.a */; productType = "com.apple.product-type.library.static"; }; 2B17ABBF13981521001AE57D /* glew */ = { @@ -7505,7 +7505,7 @@ INSTALL_PATH = /usr/local/lib; OTHER_LDFLAGS = ""; PREBINDING = NO; - PRODUCT_NAME = png; + PRODUCT_NAME = "png-1.5.1sm0.1"; USER_HEADER_SEARCH_PATHS = ""; }; name = Debug; diff --git a/src/AnnouncerManager.cpp b/src/AnnouncerManager.cpp index dd87860a59..ee20dc427e 100644 --- a/src/AnnouncerManager.cpp +++ b/src/AnnouncerManager.cpp @@ -37,7 +37,7 @@ void AnnouncerManager::GetAnnouncerNames( vector& AddTo ) // strip out the empty announcer folder for( int i=AddTo.size()-1; i>=0; i-- ) - if( !AddTo[i].EqualsNoCase( EMPTY_ANNOUNCER_NAME ) ) + if( !stricmp( AddTo[i], EMPTY_ANNOUNCER_NAME ) ) AddTo.erase(AddTo.begin()+i, AddTo.begin()+i+1 ); } @@ -49,7 +49,7 @@ bool AnnouncerManager::DoesAnnouncerExist( RString sAnnouncerName ) vector asAnnouncerNames; GetAnnouncerNames( asAnnouncerNames ); for( unsigned i=0; i &Bl SSCLoader::TidyUpData( out, false ); return true; } - SMLoader::GetApplicableFiles( sPath, list ); - if (!list.empty() ) - return SMLoader::LoadFromDir( sPath, out ); SMALoader::GetApplicableFiles( sPath, list ); if (!list.empty() ) return SMALoader::LoadFromDir( sPath, out ); + SMLoader::GetApplicableFiles( sPath, list ); + if (!list.empty() ) + return SMLoader::LoadFromDir( sPath, out ); DWILoader::GetApplicableFiles( sPath, list ); if( !list.empty() ) return DWILoader::LoadFromDir( sPath, out, BlacklistedImages ); diff --git a/src/NotesLoaderSMA.cpp b/src/NotesLoaderSMA.cpp index 449f5d7b29..c902b1f103 100644 --- a/src/NotesLoaderSMA.cpp +++ b/src/NotesLoaderSMA.cpp @@ -337,11 +337,14 @@ void SMALoader::ProcessSpeeds( TimingData &out, const int iRowsPerBeat, const RS const float fBeat = RowToBeat( vs2[0], iRowsPerBeat ); - unsigned short tmp = ( (vs2[2].find("s") || vs2[2].find("S") ) - ? 1 : 0); + RString backup = vs2[2]; + Trim(vs2[2], "s"); + Trim(vs2[2], "S"); - SpeedSegment seg(fBeat, StringToFloat( vs2[1] ), StringToFloat(vs2[2])); - seg.SetUnit(tmp); + unsigned short tmp = ((backup != vs2[2]) ? 1 : 0); + + SpeedSegment seg(fBeat, StringToFloat( vs2[1] ), StringToFloat(vs2[2]), tmp); + //seg.SetUnit(tmp); if( fBeat < 0 ) { diff --git a/src/PrefsManager.cpp b/src/PrefsManager.cpp index 87ec4d8b7f..2330c23869 100644 --- a/src/PrefsManager.cpp +++ b/src/PrefsManager.cpp @@ -205,7 +205,7 @@ PrefsManager::PrefsManager() : m_bShowNativeLanguage ( "ShowNativeLanguage", true ), m_iArcadeOptionsNavigation ( "ArcadeOptionsNavigation", 0 ), m_MusicWheelUsesSections ( "MusicWheelUsesSections", MusicWheelUsesSections_ALWAYS ), - m_iMusicWheelSwitchSpeed ( "MusicWheelSwitchSpeed", 10 ), + m_iMusicWheelSwitchSpeed ( "MusicWheelSwitchSpeed", 15 ), m_AllowW1 ( "AllowW1", ALLOW_W1_EVERYWHERE ), m_bEventMode ( "EventMode", true ), m_iCoinsPerCredit ( "CoinsPerCredit", 1 ), diff --git a/src/Song.cpp b/src/Song.cpp index 1e737ef182..3aaeee24ac 100644 --- a/src/Song.cpp +++ b/src/Song.cpp @@ -1499,7 +1499,14 @@ public: static int GetSongDir( T* p, lua_State *L ) { lua_pushstring(L, p->GetSongDir() ); return 1; } static int GetMusicPath( T* p, lua_State *L ) { RString s = p->GetMusicPath(); if( s.empty() ) return 0; lua_pushstring(L, s); return 1; } static int GetBannerPath( T* p, lua_State *L ) { RString s = p->GetBannerPath(); if( s.empty() ) return 0; LuaHelpers::Push(L, s); return 1; } - static int GetBackgroundPath( T* p, lua_State *L ) { RString s = p->GetBackgroundPath(); if( s.empty() ) return 0; lua_pushstring(L, s); return 1; } + static int GetBackgroundPath( T* p, lua_State *L ) + { + RString s = p->GetBackgroundPath(); + if( s.empty() ) + s = ""; + lua_pushstring(L, s); + return 1; + } static int GetCDTitlePath( T* p, lua_State *L ) { RString s = p->GetCDTitlePath(); if( s.empty() ) return 0; LuaHelpers::Push(L, s); return 1; } static int GetLyricsPath( T* p, lua_State *L ) { RString s = p->GetLyricsPath(); if( s.empty() ) return 0; lua_pushstring(L, s); return 1; } static int GetSongFilePath( T* p, lua_State *L ) { lua_pushstring(L, p->GetSongFilePath() ); return 1; }