diff --git a/BackgroundEffects/Checkerboard2x2.lua b/BackgroundEffects/Checkerboard2x2.lua index f2463110cf..9d49706f44 100644 --- a/BackgroundEffects/Checkerboard2x2.lua +++ b/BackgroundEffects/Checkerboard2x2.lua @@ -1,9 +1,12 @@ +local Color1 = color(Var "Color1"); +local Color2 = color(Var "Color2"); + -- Alternating files being played back at once local t = Def.ActorFrame { - LoadActor(Var "File1") .. { OnCommand=cmd(x,scale(1,0,4,SCREEN_LEFT,SCREEN_RIGHT);y,scale(1,0,4,SCREEN_TOP,SCREEN_BOTTOM);cropto,SCREEN_WIDTH/2,SCREEN_HEIGHT/2;rate,0.25) }; - LoadActor(Var "File2") .. { OnCommand=cmd(x,scale(3,0,4,SCREEN_LEFT,SCREEN_RIGHT);y,scale(1,0,4,SCREEN_TOP,SCREEN_BOTTOM);cropto,SCREEN_WIDTH/2,SCREEN_HEIGHT/2;rate,0.25) }; - LoadActor(Var "File2") .. { OnCommand=cmd(x,scale(1,0,4,SCREEN_LEFT,SCREEN_RIGHT);y,scale(3,0,4,SCREEN_TOP,SCREEN_BOTTOM);cropto,SCREEN_WIDTH/2,SCREEN_HEIGHT/2;rate,0.25) }; - LoadActor(Var "File1") .. { OnCommand=cmd(x,scale(3,0,4,SCREEN_LEFT,SCREEN_RIGHT);y,scale(3,0,4,SCREEN_TOP,SCREEN_BOTTOM);cropto,SCREEN_WIDTH/2,SCREEN_HEIGHT/2;rate,0.25) }; + LoadActor(Var "File1") .. { OnCommand=cmd(x,scale(1,0,4,SCREEN_LEFT,SCREEN_RIGHT);y,scale(1,0,4,SCREEN_TOP,SCREEN_BOTTOM);cropto,SCREEN_WIDTH/2,SCREEN_HEIGHT/2;diffuse,Color1;rate,0.25) }; + LoadActor(Var "File2") .. { OnCommand=cmd(x,scale(3,0,4,SCREEN_LEFT,SCREEN_RIGHT);y,scale(1,0,4,SCREEN_TOP,SCREEN_BOTTOM);cropto,SCREEN_WIDTH/2,SCREEN_HEIGHT/2;diffuse,Color2;rate,0.25) }; + LoadActor(Var "File2") .. { OnCommand=cmd(x,scale(1,0,4,SCREEN_LEFT,SCREEN_RIGHT);y,scale(3,0,4,SCREEN_TOP,SCREEN_BOTTOM);cropto,SCREEN_WIDTH/2,SCREEN_HEIGHT/2;diffuse,Color1;rate,0.25) }; + LoadActor(Var "File1") .. { OnCommand=cmd(x,scale(3,0,4,SCREEN_LEFT,SCREEN_RIGHT);y,scale(3,0,4,SCREEN_TOP,SCREEN_BOTTOM);cropto,SCREEN_WIDTH/2,SCREEN_HEIGHT/2;diffuse,Color2;rate,0.25) }; }; -return t \ No newline at end of file +return t diff --git a/BackgroundEffects/File2Normal.lua b/BackgroundEffects/File2Normal.lua index 69278eadaf..85fd768f48 100644 --- a/BackgroundEffects/File2Normal.lua +++ b/BackgroundEffects/File2Normal.lua @@ -11,9 +11,9 @@ t[#t+1] = LoadActor(Var "File1") .. { if Var("File2") ~= nil then t[#t+1] = LoadActor(Var("File2")) .. { - OnCommand=cmd(x,SCREEN_CENTER_X;y,SCREEN_CENTER_Y;scale_or_crop_background;diffuse,Color1;effectclock,"music"); - GainFocusCommand=cmd(play); - LoseFocusCommand=cmd(pause); + OnCommand=cmd(x,SCREEN_CENTER_X;y,SCREEN_CENTER_Y;scale_or_crop_background;diffuse,Color1;effectclock,"music"); + GainFocusCommand=cmd(play); + LoseFocusCommand=cmd(pause); }; end; diff --git a/BackgroundEffects/StretchRewind.lua b/BackgroundEffects/StretchRewind.lua index 05778de7ce..2e48a26010 100644 --- a/BackgroundEffects/StretchRewind.lua +++ b/BackgroundEffects/StretchRewind.lua @@ -1,4 +1,4 @@ -local Color = color(Var "Color1"); +local Color1 = color(Var "Color1"); local t = Def.ActorFrame { LoadActor(Var "File1") .. { diff --git a/Docs/Luadoc/Lua.xml b/Docs/Luadoc/Lua.xml index db074c8a9e..3e9d5c4669 100644 --- a/Docs/Luadoc/Lua.xml +++ b/Docs/Luadoc/Lua.xml @@ -725,8 +725,8 @@ - - + + @@ -1770,6 +1770,7 @@ + diff --git a/Docs/Luadoc/LuaDocumentation.xml b/Docs/Luadoc/LuaDocumentation.xml index fef788ae36..b0ad156762 100644 --- a/Docs/Luadoc/LuaDocumentation.xml +++ b/Docs/Luadoc/LuaDocumentation.xml @@ -2188,10 +2188,10 @@ save yourself some time, copy this for undocumented things: Returns a table of all selectable games. - + Returns a table of all the styles for the that exist for game. - + Sets the current game to Game. The second argument is optional, and if provided will determine which theme is loaded when the game changes. If the second argument is not provided, the default theme from the preferences for the new game type will be loaded.
If only the game changes, the screen specified by the Common::AfterGameChangeScreen metric will be loaded.
@@ -4995,6 +4995,10 @@ save yourself some time, copy this for undocumented things: Returns the type of this wheel item. + + Returns whether the wheel item has been loaded yet. If this function returns false, calling any other WheelItemBase function will result in an error.
+ A specific case where this is known to happen is commands that trigger on CurrentSongChanged because the music wheel clears the current song before it finishes loading if the current song is longer than the number of stages remaining. +
diff --git a/Themes/_fallback/BGAnimations/ScreenInit background/default.lua b/Themes/_fallback/BGAnimations/ScreenInit background/default.lua index b823b61565..cbd6ae6abb 100644 --- a/Themes/_fallback/BGAnimations/ScreenInit background/default.lua +++ b/Themes/_fallback/BGAnimations/ScreenInit background/default.lua @@ -24,18 +24,18 @@ t[#t+1] = Def.ActorFrame { LoadFont("Common Normal") .. { Text=ProductID(); InitCommand=cmd(y,-20;zoom,0.75); - OnCommand=cmd(diffuse,color("0,0,0,1");strokecolor,color("#f7941d")); + OnCommand=cmd(diffuse,color("0,0,0,1")); }; LoadFont("Common Normal") .. { Text=THEME:GetThemeDisplayName(); - OnCommand=cmd(diffuse,color("0,0,0,1");strokecolor,color("#f7941d")); + OnCommand=cmd(diffuse,color("0,0,0,1")); }; LoadFont("Common Normal") .. { Text="Created by " .. THEME:GetThemeAuthor(); InitCommand=cmd(y,24;zoom,0.75); - OnCommand=cmd(diffuse,color("0,0,0,1");strokecolor,color("#f7941d")); + OnCommand=cmd(diffuse,color("0,0,0,1")); }; }; }; -return t \ No newline at end of file +return t diff --git a/Themes/_fallback/Languages/en.ini b/Themes/_fallback/Languages/en.ini index f1e4e8f607..c00825ed22 100644 --- a/Themes/_fallback/Languages/en.ini +++ b/Themes/_fallback/Languages/en.ini @@ -392,6 +392,7 @@ Exit= Fail=Fail FastLoad=If enabled, don't check songs for changes on load. FastLoadAdditionalSongs=If enabled, don't check songs for changes to Additional Songs on load. +FastNoteRendering=If enabled, the z buffer is not cleared after every note. This causes 3d noteskins to collide, but substantially improves performance in gameplay. Fill Machine Stats= Game=Change the current game type with this option. GetRankingName=Determines if name entry should never be shown, always be shown, or shown when the course is listed on the high scores screen. @@ -597,6 +598,7 @@ AllGroups=All Groups Alternate=Alternate Always=Always Animations=Animations +Arbitrary Remap Columns=Arbitrarily Remap Arcade Style=Arcade Style Ask=Ask AttackMines=AttackMines @@ -668,6 +670,7 @@ Expand 2->3=Expand 2->3 Expand 2x=Expand 2x Expand 3->4=Expand 3->4 Fast=Fast +FastNoteRendering=Fast Note Rendering FitInside=Fit Inside FitInsideAvoidLetter=Avoid Letter FitInsideAvoidPillar=Avoid Pillar @@ -791,6 +794,7 @@ SuddenOffset=Sudden Offset SuperShuffle=Cement Mixer SoftShuffle=Soft Shuffle Swap Sides=Swap Sides +Swap Up/Down=Swap Up/Down Sync Machine=Sync Machine Sync Song=Sync Song Sync Tempo=Sync Tempo @@ -917,6 +921,7 @@ DisplayResolution=Display Resolution Duration seconds=Duration seconds EasterEggs=Easter Eggs Edit Songs/Steps=Edit Songs/Steps +FastNoteRendering=Fast Note Rendering Genre=Genre Practice Songs/Steps=Practice Songs/Steps Edit Courses=Edit Courses @@ -1358,6 +1363,7 @@ or=or Zoom In Camera=Zoom In Camera [ScreenEdit] +'%s' is not a track id.='%s' is not a track id. Adding New Attack=Enter the new modifier for this attack.\nThe length can be adjusted later.\nLeave it blank to cancel. Adding New Mod=Please enter the new modifier for this attack.\n\nLeave it blank to cancel. Edit Existing Mod=Please adjust the present modifier below.\n\nLeave it blank to erase the mod. @@ -1401,6 +1407,8 @@ Enter a new preview start.=Enter when the music sample starts. Enter a new preview length.=Enter how long the music sample lasts. Enter a new min BPM.=Enter the minimum displayed BPM. Enter a new max BPM.=Enter the maximum displayed BPM. +Enter the new track mapping.=Enter the new track mapping. +Entry %d, '%d', is out of range 1 to %d.=Entry %d, '%d', is out of range 1 to %d. More than %d notes per measure is not allowed. This change has been reverted.=More than %d notes per measure is not allowed. This change has been reverted. No backgrounds available=No backgrounds available EditHelpText=Up/Down:\n change beat\nLeft/Right:\n change snap\nNumber keys:\n add/remove\n tap note\nN and M keys:\n swap tap notes\nCtrl + N/M:\n swap cycled segment\nCtrl + ,/.:\n cycle segments\nCreate hold note:\n Hold a number\n while moving\n Up or Down\nCreate roll note:\n Hold Shift,\n then create a\n hold note.\nSpace bar: Set area\n marker\nT key: Switch Timing\nEnter: Area Menu\nA Key: Alter Menu\nEscape: Main Menu\nF4: Timing Menu\nF1: Show help\n @@ -1413,6 +1421,7 @@ The change has been reverted.=The change has been reverted. This change creates more than %d notes in a measure.=This change creates more than %d notes in a measure. This change creates notes past the end of the music and is not allowed.=This change creates notes past the end of the music and is not allowed. This will destroy all unsaved changes.=This will destroy all unsaved changes. +Too many tracks specified.=Too many tracks specified. Undo=Undo You must be in Song Timing Mode to edit BG Changes.=You must be in Song Timing Mode to edit BG Changes. You must have an area selected to enter the Alter Menu.=You must have an area selected to enter the Alter Menu. diff --git a/Themes/_fallback/Scripts/02 Actor.lua b/Themes/_fallback/Scripts/02 Actor.lua index c886ae369d..ff1e0e3bbf 100644 --- a/Themes/_fallback/Scripts/02 Actor.lua +++ b/Themes/_fallback/Scripts/02 Actor.lua @@ -178,7 +178,7 @@ bg_fit_functions= { end } -function Actor:scale_or_crop_background() +function Actor:scale_or_crop_background_no_move() local fit_mode= PREFSMAN:GetPreference("BackgroundFitMode") if bg_fit_functions[fit_mode] then bg_fit_functions[fit_mode](self, SCREEN_WIDTH, SCREEN_HEIGHT) @@ -187,6 +187,11 @@ function Actor:scale_or_crop_background() end end +function Actor:scale_or_crop_background() + self:scale_or_crop_background_no_move() + self:xy(SCREEN_CENTER_X, SCREEN_CENTER_Y) +end + function Actor:CenterX() self:x(SCREEN_CENTER_X) end function Actor:CenterY() self:y(SCREEN_CENTER_Y) end function Actor:Center() self:xy(SCREEN_CENTER_X,SCREEN_CENTER_Y) end diff --git a/Themes/_fallback/Scripts/02 Branches.lua b/Themes/_fallback/Scripts/02 Branches.lua index 49e967b52b..6430b459cd 100644 --- a/Themes/_fallback/Scripts/02 Branches.lua +++ b/Themes/_fallback/Scripts/02 Branches.lua @@ -59,6 +59,13 @@ Branch = { return "ScreenTitleJoin" end end, + AfterTitleMenu = function() + if PREFSMAN:GetPreference("ShowCaution") then + return "ScreenCaution" + else + return Branch.StartGame() + end + end, StartGame = function() -- Check to see if there are 0 songs installed. Also make sure to check -- that the additional song count is also 0, because there is @@ -119,12 +126,12 @@ Branch = { if GAMESTATE:IsEventMode() then return SelectMusicOrCourse() elseif STATSMAN:GetCurStageStats():AllFailed() then - return "ScreenGameOver" + return "ScreenContinue" elseif GAMESTATE:GetSmallestNumStagesLeftForAnyHumanPlayer() == 0 then - if IsCourse() then + if not GAMESTATE:IsCourseMode() then return "ScreenEvaluationSummary" else - return "ScreenGameOver" + return "ScreenContinue" end else return SelectMusicOrCourse() @@ -215,8 +222,19 @@ Branch = { return IsNetConnected() and "ScreenTitleMenu" or "ScreenTitleMenu" end, AfterSaveSummary = function() - return "ScreenGameOver" + return "ScreenContinue" -- [[ Enable when Finished ]] -- return GAMESTATE:AnyPlayerHasRankingFeats() and "ScreenNameEntryTraditional" or "ScreenGameOver" end, + AfterContinue = function() + if GAMESTATE:GetNumPlayersEnabled() == 0 then + return "ScreenGameOver" + end + + if STATSMAN:GetStagesPlayed() == 0 then + return "ScreenSelectPlayMode" + end + + return "ScreenProfileLoad" + end } diff --git a/Themes/_fallback/Scripts/02 Colors.lua b/Themes/_fallback/Scripts/02 Colors.lua index 09df67523b..fd36d2591d 100644 --- a/Themes/_fallback/Scripts/02 Colors.lua +++ b/Themes/_fallback/Scripts/02 Colors.lua @@ -12,7 +12,7 @@ Color = { Yellow = color("#fff200"), Orange = color("#f7941d"), Purple = color("#92278f"), - Outline = color("0,0,0,0.5"), + Outline = color("0,0,0,0.675"), Invisible = color("1,1,1,0"), Stealth = color("0,0,0,0"), -- Android Design Stencil Colors @@ -402,4 +402,4 @@ function Alpha(color,percent) end; c.Alpha = percent; return HSVToColor(c); -end; \ No newline at end of file +end; diff --git a/Themes/_fallback/Scripts/04 LogDisplay.lua b/Themes/_fallback/Scripts/04 LogDisplay.lua index 457807c165..f9207d79be 100644 --- a/Themes/_fallback/Scripts/04 LogDisplay.lua +++ b/Themes/_fallback/Scripts/04 LogDisplay.lua @@ -149,7 +149,7 @@ local log_display_mt= { -- Long ago, someone decided that "::" should be an alias for "\n" -- and hardcoded it into BitmapText. local message= tostring(mess.message):gsub("::", ":") - if params.IgnoreIdentical then + if params.IgnoreIdentical and not self.hidden then for i, prevmess in ipairs(self.message_log) do if message == prevmess then return end end diff --git a/Themes/_fallback/metrics.ini b/Themes/_fallback/metrics.ini index 3a95741aab..2888cf0122 100644 --- a/Themes/_fallback/metrics.ini +++ b/Themes/_fallback/metrics.ini @@ -1837,12 +1837,13 @@ UpdateOnMessage="" NumChoicesOnPage1=100 DefaultChoice="GameStart" ChoiceNames="GameStart,Options,Edit,Jukebox,GameSelect,Exit" -ChoiceGameStart="applydefaultoptions;text,Game Start;screen,"..Branch.StartGame() +ChoiceGameStart="applydefaultoptions;text,Game Start;screen,"..Branch.AfterTitleMenu() #ChoiceQuickPlay="applydefaultoptions;text,Quick Play;" ChoiceOptions="screen,ScreenOptionsService;text,Options" ChoiceEdit="text,Edit/Share;screen,"..Branch.OptionsEdit() ChoiceExit="screen,ScreenExit;text,Exit" # Aliases for the future. +ChoiceContinue="screen,ScreenContinue;text,Continue?" ChoiceOnline="screen,ScreenNetworkOptions;text,Play Online" ChoiceGameSelect="screen,ScreenSelectGame;text,Select Game" ChoiceJukebox="screen,ScreenJukeboxMenu;text,Jukebox" @@ -1891,6 +1892,14 @@ LogoY=SCREEN_CENTER_Y-80 LogoOnCommand=bob;effectperiod,4;effectmagnitude,0,8,0;zoom,0;bounceend,0.35;zoom,1 LogoOffCommand= +[ScreenCaution] +Fallback="ScreenSplash" +PrepareScreen="" +NextScreen=Branch.StartGame() +PrevScreen=Branch.TitleMenu() +TimerSeconds=3 +AllowStartToSkip=true + [ScreenProfileLoad] Class="ScreenProfileLoad" Fallback="ScreenWithMenuElementsBlank" @@ -2894,12 +2903,13 @@ PrevScreen="ScreenOptionsService" Fallback="ScreenOptionsServiceChild" PrevScreen="ScreenOptionsService" NextScreen="ScreenOptionsService" -LineNames="1,2,3,4,5,6,7,8,9,FA,10,11,12,13,14,15,16,17,18,19,20,21,22" +LineNames="1,2,3,4,5,FNR,6,7,8,9,FA,10,11,12,13,14,15,16,17,18,19,20,21,22" Line1="conf,Windowed" Line2="conf,DisplayResolution" Line3="conf,DisplayAspectRatio" Line4="conf,HighResolutionTextures" Line5="conf,Vsync" +LineFNR="conf,FastNoteRendering" Line6="conf,SoundVolume" Line7="conf,TimingWindowScale" Line8="conf,LifeDifficulty" @@ -2923,7 +2933,7 @@ Line22="conf,EventMode" Fallback="ScreenOptionsServiceChild" NextScreen="ScreenOptionsService" PrevScreen="ScreenOptionsService" -LineNames="1,2,3,4,5,6,7,8,9,10,11,12,13,14,17,18,19,20" +LineNames="1,2,3,4,5,6,7,8,9,10,11,12,13,FNR,14,17,18,19,20" Line1="conf,Windowed" Line2="conf,DisplayResolution" Line3="conf,DisplayAspectRatio" @@ -2937,6 +2947,7 @@ Line10="conf,CelShadeModels" Line11="conf,DelayedTextureDelete" Line12="conf,RefreshRate" Line13="conf,Vsync" +LineFNR="conf,FastNoteRendering" Line14="conf,ShowStats" Line15="conf,ShowBanners" Line16="conf,AttractSoundFrequency" @@ -2998,7 +3009,7 @@ Line19="conf,NumBackgrounds" Fallback="ScreenOptionsServiceChild" NextScreen="ScreenOptionsService" PrevScreen="ScreenOptionsService" -LineNames="1,3,4,6,7,9,10,11,12,14" +LineNames="1,3,4,6,7,8,9,10,11,12,14" Line1="conf,Center1Player" Line3="conf,DancePointsForOni" Line4="conf,MenuTimer" @@ -3654,6 +3665,17 @@ CodeBackspace="@Select-MenuLeft" CodeJumpToEnter="@Select-Start" CodeEnter="Start" +[ScreenContinue] +Class="ScreenContinue" +Fallback="ScreenWithMenuElements" +NextScreen=Branch.AfterContinue() +PrevScreen=Branch.AfterContinue() +PrepareScreens="" +HelpText="100" +TimerSeconds=15 +ForceTimer=true +ForceTimerWait=true + [ScreenProfileSave] Class="ScreenProfileSave" Fallback="ScreenWithMenuElementsBlank" diff --git a/Themes/default/BGAnimations/ScreenCaution overlay/_exclamation.png b/Themes/default/BGAnimations/ScreenCaution overlay/_exclamation.png new file mode 100644 index 0000000000..65bd681563 Binary files /dev/null and b/Themes/default/BGAnimations/ScreenCaution overlay/_exclamation.png differ diff --git a/Themes/default/BGAnimations/ScreenCaution overlay/_warning bg.png b/Themes/default/BGAnimations/ScreenCaution overlay/_warning bg.png new file mode 100644 index 0000000000..ff85f7840c Binary files /dev/null and b/Themes/default/BGAnimations/ScreenCaution overlay/_warning bg.png differ diff --git a/Themes/default/BGAnimations/ScreenCaution overlay/default.lua b/Themes/default/BGAnimations/ScreenCaution overlay/default.lua new file mode 100644 index 0000000000..2b4b3eaff6 --- /dev/null +++ b/Themes/default/BGAnimations/ScreenCaution overlay/default.lua @@ -0,0 +1,46 @@ +local t = Def.ActorFrame {}; + +-- Fade +t[#t+1] = Def.ActorFrame { + InitCommand=cmd(Center); + Def.Quad { + InitCommand=cmd(scaletoclipped,SCREEN_WIDTH,SCREEN_HEIGHT); + OnCommand=cmd(diffuse,Color.Black;diffusealpha,0;linear,0.5;diffusealpha,0.75); + OffCommand=cmd(linear,0.25;diffusealpha,0); + }; +}; +-- Emblem +t[#t+1] = Def.ActorFrame { + InitCommand=cmd(Center); + OnCommand=cmd(diffusealpha,0.5); + LoadActor("_warning bg") .. { + OnCommand=cmd(diffuse,Color.Yellow); + }; + Def.ActorFrame { + LoadActor("_exclamation") .. { + OnCommand=cmd(diffuse,Color.Yellow); + }; + }; +}; + +-- Text +t[#t+1] = Def.ActorFrame { + InitCommand=cmd(Center;y,SCREEN_CENTER_Y); + OnCommand=cmd(addy,-96); + -- Underline + Def.Quad { + InitCommand=cmd(y,16;zoomto,256,1); + OnCommand=cmd(diffuse,color("#ffd400");shadowlength,1;shadowcolor,BoostColor(color("#ffd40077"),0.25);linear,0.25;zoomtowidth,256;fadeleft,0.25;faderight,0.25); + }; + LoadFont("Common Bold") .. { + Text=Screen.String("Caution"); + OnCommand=cmd(skewx,-0.125;diffuse,color("#ffd400");shadowlength,2;shadowcolor,BoostColor(color("#ffd40077"),0.25)); + }; + LoadFont("Common Normal") .. { + Text=Screen.String("CautionText"); + InitCommand=cmd(y,128); + OnCommand=cmd(strokecolor,color("0,0,0,0.5");shadowlength,1;wrapwidthpixels,SCREEN_WIDTH-80); + }; +}; +-- +return t diff --git a/Themes/default/BGAnimations/ScreenContinue underlay.lua b/Themes/default/BGAnimations/ScreenContinue underlay.lua new file mode 100644 index 0000000000..27ffe34cdb --- /dev/null +++ b/Themes/default/BGAnimations/ScreenContinue underlay.lua @@ -0,0 +1,34 @@ +local timer_seconds = THEME:GetMetric(Var "LoadingScreen","TimerSeconds"); +local t = Def.ActorFrame {}; + +-- Fade +t[#t+1] = Def.ActorFrame { + InitCommand=cmd(Center); + Def.Quad { + InitCommand=cmd(scaletoclipped,SCREEN_WIDTH,SCREEN_HEIGHT); + OnCommand=cmd(diffuse,Color.Black;diffusealpha,0;linear,0.5;diffusealpha,0.25; + sleep,timer_seconds/2; + linear,timer_seconds/2-0.5;diffusealpha,1); + }; + -- Warning Fade + Def.Quad { + InitCommand=cmd(y,16;scaletoclipped,SCREEN_WIDTH,148); + OnCommand=cmd(diffuse,Color.Black;diffusealpha,0.5; + linear,timer_seconds;zoomtoheight,148*0.75); + } +}; +-- +t[#t+1] = Def.ActorFrame { + InitCommand=cmd(Center;y,SCREEN_CENTER_Y-24); + -- Underline + Def.Quad { + InitCommand=cmd(y,16;zoomto,256,1); + OnCommand=cmd(diffuse,color("#ffd400");shadowlength,1;shadowcolor,BoostColor(color("#ffd40077"),0.25);linear,0.25;zoomtowidth,256;fadeleft,0.25;faderight,0.25); + }; + LoadFont("Common Bold") .. { + Text="Continue?"; + OnCommand=cmd(skewx,-0.125;diffuse,color("#ffd400");shadowlength,2;shadowcolor,BoostColor(color("#ffd40077"),0.25)); + }; +}; +-- +return t diff --git a/Themes/default/BGAnimations/ScreenEvaluation decorations/default.lua b/Themes/default/BGAnimations/ScreenEvaluation decorations/default.lua index 8695387dfe..0a5b77322a 100644 --- a/Themes/default/BGAnimations/ScreenEvaluation decorations/default.lua +++ b/Themes/default/BGAnimations/ScreenEvaluation decorations/default.lua @@ -1,5 +1,8 @@ local function GraphDisplay( pn ) local t = Def.ActorFrame { + LoadActor( THEME:GetPathG("_GraphDisplay","overlay")) .. { + InitCommand=cmd(y,6); + }; Def.GraphDisplay { InitCommand=cmd(Load,"GraphDisplay";); BeginCommand=function(self) @@ -253,4 +256,4 @@ t[#t+1] = Def.ActorFrame { OnCommand=cmd(diffusealpha,0;zoom,0.85;bounceend,1;zoom,1;diffusealpha,1;sleep,0;glow,Color("White");decelerate,1;glow,Color("Invisible");smooth,0.35;zoom,0.25;y,SCREEN_BOTTOM-72); }; }; -return t \ No newline at end of file +return t diff --git a/Themes/default/BGAnimations/ScreenEvaluation overlay/default.lua b/Themes/default/BGAnimations/ScreenEvaluation overlay/default.lua index a4a00ca7e6..813de9833f 100644 --- a/Themes/default/BGAnimations/ScreenEvaluation overlay/default.lua +++ b/Themes/default/BGAnimations/ScreenEvaluation overlay/default.lua @@ -58,11 +58,11 @@ end; local t = Def.ActorFrame {}; GAMESTATE:IsPlayerEnabled(PLAYER_1) t[#t+1] = Def.ActorFrame { - InitCommand=cmd(hide_if,not GAMESTATE:IsPlayerEnabled(PLAYER_1);x,WideScale(math.floor(SCREEN_CENTER_X*0.3)-8,math.floor(SCREEN_CENTER_X*0.5)-8);y,SCREEN_CENTER_Y-34); + InitCommand=cmd(hide_if,not GAMESTATE:IsPlayerEnabled(PLAYER_1);x,WideScale(math.floor(SCREEN_CENTER_X*0.3)-8,math.floor(SCREEN_CENTER_X*0.5)-8);y,SCREEN_CENTER_Y-20); CreateStats( PLAYER_1 ); }; t[#t+1] = Def.ActorFrame { - InitCommand=cmd(hide_if,not GAMESTATE:IsPlayerEnabled(PLAYER_2);x,WideScale(math.floor(SCREEN_CENTER_X*1.7)+8,math.floor(SCREEN_CENTER_X*1.5)+8);y,SCREEN_CENTER_Y-34); + InitCommand=cmd(hide_if,not GAMESTATE:IsPlayerEnabled(PLAYER_2);x,WideScale(math.floor(SCREEN_CENTER_X*1.7)+8,math.floor(SCREEN_CENTER_X*1.5)+8);y,SCREEN_CENTER_Y-20); CreateStats( PLAYER_2 ); }; -return t \ No newline at end of file +return t diff --git a/Themes/default/BGAnimations/ScreenGameOver underlay/default.lua b/Themes/default/BGAnimations/ScreenGameOver underlay/default.lua index 689915f69a..d53e40b5ca 100644 --- a/Themes/default/BGAnimations/ScreenGameOver underlay/default.lua +++ b/Themes/default/BGAnimations/ScreenGameOver underlay/default.lua @@ -1,10 +1,29 @@ +local timer_seconds = THEME:GetMetric(Var "LoadingScreen","TimerSeconds"); + return Def.ActorFrame { InitCommand=cmd(Center), + -- Fade + Def.ActorFrame { + InitCommand=cmd(); + Def.Quad { + InitCommand=cmd(scaletoclipped,SCREEN_WIDTH,SCREEN_HEIGHT), + OnCommand=cmd(diffuse,Color.Black;diffusealpha,0;linear,0.5;diffusealpha,0.25; + sleep,timer_seconds/2; + linear,timer_seconds/2-0.5;diffusealpha,0.8), + }, + -- Warning Fade + Def.Quad { + InitCommand=cmd(y,-4;scaletoclipped,SCREEN_WIDTH,164), + OnCommand=cmd(diffuse,Color.Black;diffusealpha,0.5; + linear,timer_seconds;zoomtoheight,164*0.75), + } + }, + -- LoadActor(THEME:GetPathG("ScreenGameOver","gameover"))..{ InitCommand=cmd(y,-16;shadowlength,2) }, LoadFont("Common Normal")..{ Text=ScreenString("Play again soon!"), - InitCommand=cmd(y,36;shadowlength,1) + InitCommand=cmd(y,36;shadowlength,2) } } diff --git a/Themes/default/BGAnimations/ScreenHighScores decorations/default.lua b/Themes/default/BGAnimations/ScreenHighScores decorations/default.lua index 6cfb0d5c13..1582ee9d74 100644 --- a/Themes/default/BGAnimations/ScreenHighScores decorations/default.lua +++ b/Themes/default/BGAnimations/ScreenHighScores decorations/default.lua @@ -28,7 +28,7 @@ for i=1,NumColumns do OnCommand=cmd(diffuse,CustomDifficultyToDarkColor(s);diffusealpha,0.5); }; LoadActor(THEME:GetPathB("_frame","3x1"),"rounded gloss", 18) .. { - OnCommand=cmd(diffuse,CustomDifficultyToColor(s);diffusealpha,0.35); + OnCommand=cmd(diffuse,CustomDifficultyToColor(s);diffusealpha,0.125); }; LoadFont("Common Normal") .. { InitCommand=cmd(uppercase,true;settext,CustomDifficultyToLocalizedString(s)); @@ -39,9 +39,9 @@ end t[#t+1] = LoadFont("Common Bold") .. { InitCommand=cmd(settext,stString;x,SCREEN_CENTER_X-220;y,SCREEN_CENTER_Y-168); - OnCommand=cmd(zoom,0.675;skewx,-0.125;shadowlength,1); + OnCommand=cmd(skewx,-0.125;diffusebottomedge,color("0.75,0.75,0.75");shadowlength,2); }; t.OnCommand=cmd(draworder,105); -return t; \ No newline at end of file +return t; diff --git a/Themes/default/BGAnimations/ScreenSelectMusic decorations/default.lua b/Themes/default/BGAnimations/ScreenSelectMusic decorations/default.lua index b70b31c1e2..290d997789 100644 --- a/Themes/default/BGAnimations/ScreenSelectMusic decorations/default.lua +++ b/Themes/default/BGAnimations/ScreenSelectMusic decorations/default.lua @@ -170,7 +170,6 @@ if not GAMESTATE:IsCourseMode() then local song = GAMESTATE:GetCurrentSong(); local cdtitle = self:GetChild("CDTitle"); local height = cdtitle:GetHeight(); - local width = cdtitle:GetWidth(); if song then if song:HasCDTitle() then @@ -183,27 +182,15 @@ if not GAMESTATE:IsCourseMode() then cdtitle:visible(false); end; - if height >= 60 and width >= 80 then - if height*(80/60) >= width then - cdtitle:zoom(60/height); - else - cdtitle:zoom(80/width); - end; - elseif height >= 60 then - cdtitle:zoom(60/height); - elseif width >= 80 then - cdtitle:zoom(80/width); - else - cdtitle:zoom(1); - end; + self:zoom(scale(height,32,480,1,32/480)) end; t[#t+1] = Def.ActorFrame { - OnCommand=cmd(draworder,105;x,SCREEN_CENTER_X-76;y,SCREEN_CENTER_Y-72;zoomy,0;sleep,0.5;decelerate,0.25;zoomy,1;SetUpdateFunction,CDTitleUpdate); + OnCommand=cmd(draworder,105;x,SCREEN_CENTER_X-256;y,SCREEN_CENTER_Y-84;zoom,0;sleep,0.5;decelerate,0.25;zoom,1;SetUpdateFunction,CDTitleUpdate); OffCommand=cmd(bouncebegin,0.15;zoomx,0); Def.Sprite { Name="CDTitle"; - InitCommand=cmd(y,19); - --OnCommand=cmd(draworder,106;shadowlength,1;zoom,0.75;diffusealpha,1;zoom,0;bounceend,0.35;zoom,0.75;spin;effectmagnitude,0,180,0); + OnCommand=cmd(draworder,106;shadowlength,1;zoom,0.75;diffusealpha,1;zoom,0;bounceend,0.35;zoom,0.75;spin;effectperiod,2;effectmagnitude,0,180,0); + BackCullCommand=cmd(diffuse,color("0.5,0.5,0.5,1")); }; }; t[#t+1] = StandardDecorationFromFileOptional("NewSong","NewSong") .. { @@ -276,11 +263,16 @@ t[#t+1] = StandardDecorationFromFileOptional("DifficultyDisplay","DifficultyDisp t[#t+1] = StandardDecorationFromFileOptional("SortOrder","SortOrderText") .. { BeginCommand=cmd(playcommand,"Set"); - SortOrderChangedMessageCommand=cmd(playcommand,"Set";); + SortOrderChangedMessageCommand=cmd(playcommand,"Set"); SetCommand=function(self) - local s = SortOrderToLocalizedString( GAMESTATE:GetSortOrder() ); - self:settext( s ); - self:playcommand("Sort"); + local s = GAMESTATE:GetSortOrder() + if s ~= nil then + local s = SortOrderToLocalizedString( s ) + self:settext( s ) + self:playcommand("Sort") + else + return + end end; }; diff --git a/Themes/default/Fonts/MenuTimerContinue numbers.redir b/Themes/default/Fonts/MenuTimerContinue numbers.redir new file mode 100644 index 0000000000..7dee04edd0 --- /dev/null +++ b/Themes/default/Fonts/MenuTimerContinue numbers.redir @@ -0,0 +1 @@ +_roboto Bold 80px \ No newline at end of file diff --git a/Themes/default/Fonts/_roboto Bold 80px [numbers-stroke] 4x4.png b/Themes/default/Fonts/_roboto Bold 80px [numbers-stroke] 4x4.png new file mode 100644 index 0000000000..0110fd7bc9 Binary files /dev/null and b/Themes/default/Fonts/_roboto Bold 80px [numbers-stroke] 4x4.png differ diff --git a/Themes/default/Fonts/_roboto Bold 80px [numbers] 4x4.png b/Themes/default/Fonts/_roboto Bold 80px [numbers] 4x4.png new file mode 100644 index 0000000000..3d13b7962c Binary files /dev/null and b/Themes/default/Fonts/_roboto Bold 80px [numbers] 4x4.png differ diff --git a/Themes/default/Fonts/_roboto Bold 80px.ini b/Themes/default/Fonts/_roboto Bold 80px.ini new file mode 100644 index 0000000000..ccffcac272 --- /dev/null +++ b/Themes/default/Fonts/_roboto Bold 80px.ini @@ -0,0 +1,30 @@ +[common] +Baseline=66 +Top=28 +LineSpacing=106 +DrawExtraPixelsLeft=0 +DrawExtraPixelsRight=0 +AdvanceExtraPixels=0 + +[numbers] +Line 0=0123 +Line 1=4567 +Line 2=89%. +Line 3= :x, + +0=46 +1=46 +2=46 +3=46 +4=46 +5=46 +6=46 +7=46 +8=46 +9=46 +10=59 +11=23 +12=20 +13=23 +14=41 +15=21 diff --git a/Themes/default/Graphics/ComboGraph ComboNumber.lua b/Themes/default/Graphics/ComboGraph ComboNumber.lua index 33b3dbeb86..c655b1aabf 100644 --- a/Themes/default/Graphics/ComboGraph ComboNumber.lua +++ b/Themes/default/Graphics/ComboGraph ComboNumber.lua @@ -1,3 +1,3 @@ -return LoadFont("Combo Numbers") .. { - InitCommand=cmd(zoom,12/54;y,-1;shadowlengthx,0;shadowlengthy,1;strokecolor,color("#00000077");); -}; \ No newline at end of file +return LoadFont("Common Bold") .. { + InitCommand=cmd(zoom,12/54;y,-1;shadowlength,1;strokecolor,Color.Outline); +}; diff --git a/Themes/default/Graphics/ScreenTitleMenu logo/default.lua b/Themes/default/Graphics/ScreenTitleMenu logo/default.lua index 4c80c37b0d..a92edf95a7 100644 --- a/Themes/default/Graphics/ScreenTitleMenu logo/default.lua +++ b/Themes/default/Graphics/ScreenTitleMenu logo/default.lua @@ -2,7 +2,6 @@ local t = Def.ActorFrame{ InitCommand=cmd(fov,70); LoadActor("_arrow")..{ InitCommand=cmd(x,225;); - OnCommand=cmd(wag;effectmagnitude,0,0,16;effectperiod,2.5;); }; LoadActor("_text"); LoadActor("_text")..{ diff --git a/Themes/default/Graphics/ScreenWithMenuElements header/default.lua b/Themes/default/Graphics/ScreenWithMenuElements header/default.lua index cdbedb0b68..89f17c4a1c 100644 --- a/Themes/default/Graphics/ScreenWithMenuElements header/default.lua +++ b/Themes/default/Graphics/ScreenWithMenuElements header/default.lua @@ -1,11 +1,23 @@ local t = Def.ActorFrame {}; +local function Update(self) + local c = self:GetChildren(); + local bps = GAMESTATE:GetSongBPS() or 1 + c.TextureStripe:texcoordvelocity(bps/3,0); +end + +local function IsVisible() + local r = Screen.String("HeaderText"); + return string.len(r) > 0 and true or false +end + t[#t+1] = Def.Quad { InitCommand=cmd(vertalign,top;zoomto,SCREEN_WIDTH+1,50;diffuse,color("#161616")); } t[#t+1] = LoadActor("_texture stripe") .. { - InitCommand=cmd(x,-SCREEN_CENTER_X;y,-2;horizalign,left;vertalign,top;zoomto,320,50;customtexturerect,0,0,(320/1.5)/8,50/32); - OnCommand=cmd(faderight,0.5;texcoordvelocity,1.5,0;skewx,-0.0375;diffuse,Color("White");diffusealpha,0.125); + Name="TextureStripe"; + InitCommand=cmd(x,-SCREEN_CENTER_X-8;y,-2;horizalign,left;vertalign,top;zoomto,320,50;customtexturerect,0,0,(320/2)/8,50/32); + OnCommand=cmd(texcoordvelocity,2,0;skewx,-0.0575;diffuse,color("#594300");diffuserightedge,color("#59430000")); }; t[#t+1] = LoadActor("Header") .. { InitCommand=cmd(y,1;vertalign,top;zoomtowidth,SCREEN_WIDTH+1;diffuse,color("#ffd400")); @@ -16,7 +28,7 @@ t[#t+1] = LoadFont("Common Bold") .. { Name="HeaderText"; Text=Screen.String("HeaderText"); InitCommand=cmd(x,-SCREEN_CENTER_X+24;y,26;zoom,1;horizalign,left;shadowlength,0;maxwidth,200); - OnCommand=cmd(skewx,-0.125;diffuse,color("#ffd400");shadowlength,2;shadowcolor,BoostColor(color("#ffd40077"),0.25)); + OnCommand=cmd(visible,IsVisible();skewx,-0.125;diffuse,color("#ffd400");shadowlength,2;shadowcolor,BoostColor(color("#ffd40077"),0.25)); UpdateScreenHeaderMessageCommand=function(self,param) self:settext(param.Header); end; @@ -28,5 +40,8 @@ t[#t+1] = Def.Quad { OnCommand=cmd(diffuse,color("#ffd400");shadowlength,2;shadowcolor,BoostColor(color("#ffd40077"),0.25);linear,0.25;zoomtowidth,192;faderight,0.5); }; +t.BeginCommand=function(self) + self:SetUpdateFunction( Update ); +end return t diff --git a/Themes/default/Graphics/_GraphDisplay overlay.png b/Themes/default/Graphics/_GraphDisplay overlay.png new file mode 100644 index 0000000000..fa4832dcb6 Binary files /dev/null and b/Themes/default/Graphics/_GraphDisplay overlay.png differ diff --git a/Themes/default/Sounds/ScreenTitleJoin music.redir b/Themes/default/Sounds/ScreenTitleJoin music.redir index c29cb1da10..1f8565ca21 100644 --- a/Themes/default/Sounds/ScreenTitleJoin music.redir +++ b/Themes/default/Sounds/ScreenTitleJoin music.redir @@ -1 +1 @@ -_Music title \ No newline at end of file +_silent \ No newline at end of file diff --git a/Themes/default/Sounds/ScreenTitleMenu music.redir b/Themes/default/Sounds/ScreenTitleMenu music.redir index c29cb1da10..1f8565ca21 100644 --- a/Themes/default/Sounds/ScreenTitleMenu music.redir +++ b/Themes/default/Sounds/ScreenTitleMenu music.redir @@ -1 +1 @@ -_Music title \ No newline at end of file +_silent \ No newline at end of file diff --git a/Themes/default/metrics.ini b/Themes/default/metrics.ini index 0dc574734d..19f103c685 100644 --- a/Themes/default/metrics.ini +++ b/Themes/default/metrics.ini @@ -212,16 +212,25 @@ MiddleOnCommand=;diffuse,PlayerColor(PLAYER_2) RightOnCommand=horizalign,left;diffuse,PlayerColor(PLAYER_2) [MenuTimer] -Text1OnCommand=stopeffect;stoptweening;halign,1;shadowlength,0;strokecolor,Color("Outline") +Text1OnCommand=horizalign,right;stopeffect;finishtweening;shadowlength,2;strokecolor,Color("Outline"); Text1FormatFunction=function(fSeconds) fSeconds=math.floor(fSeconds); return string.format("%02.0f",fSeconds) end -Text2OnCommand=x,2;y,-3;stopeffect;stoptweening;halign,0;shadowlength,0;strokecolor,Color("Outline");zoom,0.65 +Text2OnCommand=x,2;y,3;stopeffect;stoptweening;halign,0;shadowlength,0;strokecolor,Color("Outline");zoom,0.65 Text2FormatFunction=function(fSeconds) local remainder=fSeconds-math.floor(fSeconds); local digit=math.floor(remainder*100); return string.format("%02.0f",digit) end -Warning10Command=diffuseshift;effectperiod,1;effectcolor2,Color("Red");effectcolor1,color("0.5,0,0,1"); +Warning10Command=diffuseshift;effectperiod,1;effectcolor1,Color.White;effectcolor2,Color.Red; [MenuTimerNoSound] +[MenuTimerContinue] +Fallback="MenuTimer" +Text1OnCommand=strokecolor,Color.Outline;shadowlength,2 +Text1FormatFunction=function(fSeconds) return string.format("%02.2f",fSeconds) end; + +Text2OnCommand=visible,false +Text2FormatFunction=function(fSeconds) return "" end; + + [MusicWheel] SwitchSeconds=0.04 LockedInitialVelocity=7 @@ -597,7 +606,7 @@ AlternateHelpDisplayOnCommand=SetSecsBetweenSwitches,4;zoom,0.675;maxwidth,480/0 AlternateHelpDisplayOffCommand=linear,0.175;zoomy,0 TimerX=SCREEN_RIGHT-36-4 -TimerY=SCREEN_TOP+24 +TimerY=SCREEN_TOP+23 TimerOnCommand=draworder,2;visible,PREFSMAN:GetPreference("MenuTimer"); # TimerOnCommand=fov,90;vanishpoint,SCREEN_RIGHT-36-4,SCREEN_TOP+20;draworder,5;visible,PREFSMAN:GetPreference("MenuTimer");rotationy,90;decelerate,0.4;rotationy,0; TimerOffCommand= @@ -699,6 +708,7 @@ NetworkStatusOffCommand=linear,0.5;cropright,1 # [ScreenQuickSetupOverview] + IconStartX=SCREEN_CENTER_X-160 IconStartY=SCREEN_BOTTOM-60 IconSetX=SCREEN_CENTER_X-160 @@ -894,7 +904,7 @@ MusicWheelOnCommand=draworder,-5;fov,90;vanishpoint,SCREEN_CENTER_X+160,SCREEN_C MusicWheelOffCommand=bouncebegin,0.15;zoomx,0; # ShowNewSong=not GAMESTATE:IsCourseMode() -NewSongX=SCREEN_CENTER_X-160+128-30 +NewSongX=SCREEN_CENTER_X-160+128-24 NewSongY=SCREEN_TOP+160-2 NewSongOnCommand=finishtweening;diffuse,Color("Orange");diffusetopedge,Color("Yellow");strokecolor,Color("Black");zoom,0.675;draworder,106;playcommand,"Set" NewSongOffCommand=bouncebegin,0.1;zoom,0;diffusealpha,0 @@ -905,6 +915,7 @@ ShowSongTime=true SongTimeX=SCREEN_CENTER_X-160 SongTimeY=SCREEN_TOP+160+(36/2)+8 SongTimeOnCommand=zoom,0.75;strokecolor,Color("Outline");shadowlength,1 + SongTimeOffCommand=bouncebegin,0.15;zoom,0;diffusealpha,0; SongTimeResetCommand=diffuse,Color("White"); SongTimeAutogenCommand=diffuse,Color("Green"); @@ -1091,6 +1102,9 @@ ShowNumCourseSongs=true UsePlayerSelectMenu=false SelectMenuAvailable=false # +ShowSortOrder=true +SortOrderOnCommand=visible,false +# ShowPaneDisplayFrameP1=false ShowPaneDisplayTextP1=false ShowPaneDisplayFrameP2=false @@ -2011,6 +2025,19 @@ SmallBanner6OffCommand= [ScreenNameEntry] +[ScreenNameEntryTraditional] + +[ScreenContinue] +ShowHeader=false +ShowFooter=false +# +TimerSeconds=20 +TimerMetricsGroup="MenuTimerContinue" +TimerX=SCREEN_CENTER_X +TimerY=SCREEN_CENTER_Y+24 +TimerOnCommand=visible,true +TimerOffCommand= + [ScreenProfileSave] [ScreenProfileSaveSummary] diff --git a/Themes/home/metrics.ini b/Themes/home/metrics.ini index 56c7eecfa5..14ec4ef58f 100644 --- a/Themes/home/metrics.ini +++ b/Themes/home/metrics.ini @@ -3,7 +3,3 @@ FallbackTheme=default # Now you can edit or add things. ############################################## -[ScreenEdit] -EditModifiers="midi-note" - -[MusicWheel] \ No newline at end of file diff --git a/Xcode/scripts/README.md b/Xcode/scripts/README.md index 282dad2ca1..56b53116eb 100644 --- a/Xcode/scripts/README.md +++ b/Xcode/scripts/README.md @@ -1,15 +1,35 @@ StepMania Scripts For OS X ========= -This script can be used to bundle a .dmg installer of StepMania. +These scripts can be used to bundle a .dmg installer of StepMania. It assumes you have already built a StepMania.app using Xcode and -that your stepmania directory structure is intact as you cloned it. +that your *stepmania* directory structure is intact as you cloned it. -To use this script, open a terminal and cd to your stepmania directory, -then run the following commands: +Bundling a Release: +------------------- +To bundle a release version of StepMania open a terminal and cd to +your *stepmania* directory, then run the following commands: + +``` cd Xcode/scripts ruby mkrelease.rb +``` -You'll see output as each stepmania sub-directory is copied into a tmp directory. -If all goes well, you'll be notified that the dmg was created in your stepmania directory. \ No newline at end of file +This will create a disk image like *StepMania-v5.0-beta-4-mac.dmg* +in the root of your *stepmania* directory. + + + +Bundling a Nightly: +------------------- +To bundle an intermediate or "nightly" .dmg installer, cd to your +*stepmania* directory, and run the following commands: + +``` +cd Xcode/scripts +ruby mkrelease.rb nightly +``` + +This will create a disk image like *StepMania-v5.0-31-8-2014-mac.dmg* +in the root of your *stepmania* directory. \ No newline at end of file diff --git a/Xcode/scripts/mkrelease.rb b/Xcode/scripts/mkrelease.rb index 20b3156ee9..a6b57e3c3f 100644 --- a/Xcode/scripts/mkrelease.rb +++ b/Xcode/scripts/mkrelease.rb @@ -6,8 +6,19 @@ require 'tmpdir' # cd to the StepMania 5 src directory Dir.chdir "../../src" +# check the command line for the presence of the "nightly" option, used +# if we are bundling a nightly build as opposed to an official release +nightly = (true and ARGV[0] == "nightly") or false + # initialize empty strings -family, version = "" +family, version, date = "" + +# if this is to be a nightly build, store the system date; +# we'll use it below to name the bundle +if nightly + time = time = Time.new + date = "#{time.day}-#{time.month}-#{time.year}" +end # open ProductInfo.h in read-only mode File.open("#{Dir.pwd}/ProductInfo.h", "r") do |f| @@ -15,43 +26,48 @@ File.open("#{Dir.pwd}/ProductInfo.h", "r") do |f| f.each do |line| if line.match( /^#define\s+PRODUCT_FAMILY_BARE\s+(.*?)\s*$/ ) family = $1; - + elsif line.match( /^#define\s+PRODUCT_VER_BARE\s+(.*?)\s*$/ ) version = $1; end end end -# replace whitespace with hyphens in version string +# replace whitespace with hyphens in the version string version.gsub!(/\s+/,"-") -# the name of the .dmg file -name = "#{family}-#{version}-mac.dmg" +# the name of what we are bundling +if nightly + version = version.partition("-")[0] + name = "#{family}-#{version}-#{date}" +else + name = "#{family}-#{version}" +end # a list of directories we want to include in our .dmg directories = [ "Announcers", "BackgroundEffects", "BackgroundTransitions", - "BGAnimations", "Characters", "Courses", "Data", "Docs", "Manual", - "NoteSkins", "Scripts", "Songs", "StepMania.app", "Themes" ] + "BGAnimations", "Characters", "Courses", "Data", "Docs", "Manual", + "NoteSkins", "Scripts", "Songs", "StepMania.app", "Themes" ] # cd back to the root of the StepMania 5 directory Dir.chdir ".." # create a temp directory; this will be automatically deleted when the block completes Dir.mktmpdir {|temp| - + # nest two directories named by family and version within the temp directory # the outer will become the root of the dmg # the inner will neatly tidy all the contents together so users can easily drag/drop everything at once - FileUtils.mkdir_p("#{temp}/#{family}-#{version}/#{family}-#{version}/") + FileUtils.mkdir_p("#{temp}/#{name}/#{name}/") # loop through the directories array directories.each do |directory| # recursively copy each directory into our temp directory - FileUtils.cp_r directory, "#{temp}/#{family}-#{version}/#{family}-#{version}/", :verbose => true + FileUtils.cp_r directory, "#{temp}/#{name}/#{name}/", :verbose => true end #construct the shell command that will create the dmg - cmd = "hdiutil create #{Dir.pwd}/#{name} -srcfolder #{temp}/#{family}-#{version} -ov" + cmd = "hdiutil create #{Dir.pwd}/#{name}-mac.dmg -srcfolder #{temp}/#{name} -ov" #execute the command in a subshell system( cmd ) diff --git a/src/Makefile.am b/src/Makefile.am index b1c3be4934..e74dc76ce1 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -299,7 +299,8 @@ if LINUX arch/InputHandler/InputHandler_Linux_PIUIO.cpp arch/InputHandler/InputHandler_Linux_PIUIO.h Lights += arch/Lights/LightsDriver_LinuxWeedTech.cpp arch/Lights/LightsDriver_LinuxWeedTech.h \ - arch/Lights/LightsDriver_Linux_PIUIO.cpp arch/Lights/LightsDriver_Linux_PIUIO.h + arch/Lights/LightsDriver_Linux_PIUIO.cpp arch/Lights/LightsDriver_Linux_PIUIO.h \ + arch/Lights/LightsDriver_Linux_PIUIO_Leds.cpp arch/Lights/LightsDriver_Linux_PIUIO_Leds.h MemoryCard += arch/MemoryCard/MemoryCardDriverThreaded_Linux.cpp arch/MemoryCard/MemoryCardDriverThreaded_Linux.h diff --git a/src/NoteDataUtil.cpp b/src/NoteDataUtil.cpp index 888d38b85b..5d0e08cfbe 100644 --- a/src/NoteDataUtil.cpp +++ b/src/NoteDataUtil.cpp @@ -1453,6 +1453,49 @@ static void GetTrackMapping( StepsType st, NoteDataUtil::TrackMapping tt, int Nu break; } break; + case NoteDataUtil::swap_up_down: + switch(st) + { + case StepsType_dance_single: + case StepsType_dance_double: + case StepsType_dance_couple: + case StepsType_dance_routine: + iTakeFromTrack[0]= 0; + iTakeFromTrack[1]= 2; + iTakeFromTrack[2]= 1; + iTakeFromTrack[3]= 3; + iTakeFromTrack[4]= 4; + iTakeFromTrack[5]= 6; + iTakeFromTrack[6]= 5; + iTakeFromTrack[7]= 7; + break; + case StepsType_pump_single: + case StepsType_pump_double: + case StepsType_pump_couple: + case StepsType_pump_routine: + iTakeFromTrack[0]= 1; + iTakeFromTrack[1]= 0; + iTakeFromTrack[2]= 2; + iTakeFromTrack[3]= 4; + iTakeFromTrack[4]= 3; + iTakeFromTrack[5]= 6; + iTakeFromTrack[6]= 5; + iTakeFromTrack[7]= 7; + iTakeFromTrack[8]= 9; + iTakeFromTrack[9]= 8; + break; + case StepsType_pump_halfdouble: + iTakeFromTrack[0]= 0; + iTakeFromTrack[1]= 2; + iTakeFromTrack[2]= 1; + iTakeFromTrack[3]= 4; + iTakeFromTrack[4]= 3; + iTakeFromTrack[5]= 5; + break; + default: + break; + } + break; default: ASSERT(0); } @@ -2221,6 +2264,24 @@ void NoteDataUtil::ShiftRight( NoteData &inout ) ShiftTracks( inout, +1 ); } +void NoteDataUtil::SwapUpDown(NoteData& inout, StepsType st) +{ + int TakeFrom[MAX_NOTE_TRACKS]; + GetTrackMapping(st, NoteDataUtil::swap_up_down, inout.GetNumTracks(), TakeFrom); + NoteData tempND; + tempND.LoadTransformed(inout, inout.GetNumTracks(), TakeFrom); + inout.CopyAll(tempND); + inout.RevalidateATIs(vector(), false); +} + +void NoteDataUtil::ArbitraryRemap(NoteData& inout, int* mapping) +{ + NoteData tempND; + tempND.LoadTransformed(inout, inout.GetNumTracks(), mapping); + inout.CopyAll(tempND); + inout.RevalidateATIs(vector(), false); +} + struct ValidRow { diff --git a/src/NoteDataUtil.h b/src/NoteDataUtil.h index 80cd677797..9b25e718b8 100644 --- a/src/NoteDataUtil.h +++ b/src/NoteDataUtil.h @@ -124,6 +124,7 @@ namespace NoteDataUtil soft_shuffle, super_shuffle, stomp, + swap_up_down, NUM_TRACK_MAPPINGS }; void Turn( NoteData &inout, StepsType st, TrackMapping tt, int iStartIndex = 0, int iEndIndex = MAX_NOTE_ROW ); @@ -165,6 +166,8 @@ namespace NoteDataUtil void ShiftTracks( NoteData &inout, int iShiftBy ); void ShiftLeft( NoteData &inout ); void ShiftRight( NoteData &inout ); + void SwapUpDown( NoteData &inout, StepsType st ); + void ArbitraryRemap( NoteData &inout, int* mapping ); void SnapToNearestNoteType( NoteData &inout, NoteType nt1, NoteType nt2, int iStartIndex, int iEndIndex ); diff --git a/src/NoteField.cpp b/src/NoteField.cpp index 6bde0e551a..a3e438c19f 100644 --- a/src/NoteField.cpp +++ b/src/NoteField.cpp @@ -36,8 +36,11 @@ static ThemeMetric FADE_FAIL_TIME( "NoteField", "FadeFailTime" ); static RString RoutineNoteSkinName( size_t i ) { return ssprintf("RoutineNoteSkinP%i",int(i+1)); } static ThemeMetric1D ROUTINE_NOTESKIN( "NoteField", RoutineNoteSkinName, NUM_PLAYERS ); +static bool FAST_NOTE_RENDERING_PREF_CACHED= false; + NoteField::NoteField() { + FAST_NOTE_RENDERING_PREF_CACHED= PREFSMAN->m_FastNoteRendering; m_pNoteData = NULL; m_pCurDisplay = NULL; @@ -1355,7 +1358,10 @@ void NoteField::DrawPrimitives() bool bNoteIsUpcoming = NoteRowToBeat(q) > m_pPlayerState->GetDisplayedPosition().m_fSongBeat; bAnyUpcomingInThisCol |= bNoteIsUpcoming; - DISPLAY->ClearZBuffer(); + if(!FAST_NOTE_RENDERING_PREF_CACHED) + { + DISPLAY->ClearZBuffer(); + } } cur->m_ReceptorArrowRow.SetNoteUpcoming( c, bAnyUpcomingInThisCol ); diff --git a/src/PrefsManager.cpp b/src/PrefsManager.cpp index 64d742babc..79ef13dace 100644 --- a/src/PrefsManager.cpp +++ b/src/PrefsManager.cpp @@ -169,9 +169,9 @@ PrefsManager::PrefsManager() : m_iDisplayWidth ( "DisplayWidth", 854 ), m_iDisplayHeight ( "DisplayHeight", 480 ), m_fDisplayAspectRatio ( "DisplayAspectRatio", 16/9.f, ValidateDisplayAspectRatio ), - m_iDisplayColorDepth ( "DisplayColorDepth", 16 ), - m_iTextureColorDepth ( "TextureColorDepth", 16 ), - m_iMovieColorDepth ( "MovieColorDepth", 16 ), + m_iDisplayColorDepth ( "DisplayColorDepth", 32 ), + m_iTextureColorDepth ( "TextureColorDepth", 32 ), + m_iMovieColorDepth ( "MovieColorDepth", 32 ), m_bStretchBackgrounds ( "StretchBackgrounds", false ), m_BGFitMode("BackgroundFitMode", BFM_CoverPreserve), m_HighResolutionTextures ( "HighResolutionTextures", HighResolutionTextures_Auto ), @@ -184,6 +184,7 @@ PrefsManager::PrefsManager() : m_bHiddenSongs ( "HiddenSongs", false ), m_bVsync ( "Vsync", true ), + m_FastNoteRendering("FastNoteRendering", false), m_bInterlaced ( "Interlaced", false ), m_bPAL ( "PAL", false ), m_bDelayedTextureDelete ( "DelayedTextureDelete", false ), diff --git a/src/PrefsManager.h b/src/PrefsManager.h index 4c34be5429..e27daf627e 100644 --- a/src/PrefsManager.h +++ b/src/PrefsManager.h @@ -175,6 +175,7 @@ public: Preference m_bHiddenSongs; Preference m_bVsync; + Preference m_FastNoteRendering; Preference m_bInterlaced; Preference m_bPAL; Preference m_bDelayedTextureDelete; diff --git a/src/RageUtil.cpp b/src/RageUtil.cpp index 049b07c8a3..872734c1f4 100644 --- a/src/RageUtil.cpp +++ b/src/RageUtil.cpp @@ -1751,6 +1751,16 @@ void MakeLower( wchar_t *p, size_t iLen ) UnicodeUpperLower( p, iLen, g_LowerCase ); } +bool operator>>(const RString& lhs, int& rhs) +{ + return istringstream(lhs) >> rhs; +} + +bool operator>>(const RString& lhs, float& rhs) +{ + return istringstream(lhs) >> rhs; +} + int StringToInt( const RString &sString ) { int ret; diff --git a/src/RageUtil.h b/src/RageUtil.h index e3a83e576f..058727b85f 100644 --- a/src/RageUtil.h +++ b/src/RageUtil.h @@ -418,6 +418,9 @@ RString IntToString( const int &iNum ); float StringToFloat( const RString &sString ); RString FloatToString( const float &num ); bool StringToFloat( const RString &sString, float &fOut ); +// Better than IntToString because you can check for success. +bool operator>>(const RString& lhs, int& rhs); +bool operator>>(const RString& lhs, float& rhs); RString WStringToRString( const wstring &sString ); RString WcharToUTF8( wchar_t c ); diff --git a/src/ScreenEdit.cpp b/src/ScreenEdit.cpp index 62657c2270..127daa46f8 100644 --- a/src/ScreenEdit.cpp +++ b/src/ScreenEdit.cpp @@ -62,6 +62,7 @@ AutoScreenMessage( SM_UpdateTextInfo ); AutoScreenMessage( SM_BackFromMainMenu ); AutoScreenMessage( SM_BackFromAreaMenu ); AutoScreenMessage( SM_BackFromAlterMenu ); +AutoScreenMessage( SM_BackFromArbitraryRemap ); AutoScreenMessage( SM_BackFromStepsInformation ); AutoScreenMessage( SM_BackFromStepsData ); AutoScreenMessage( SM_BackFromOptions ); @@ -616,7 +617,7 @@ static MenuDef g_AlterMenu( MenuRowDef(ScreenEdit::alter, "Alter", true, EditMode_Practice, true, true, 0, "Autogen To Fill Width","Backwards","Swap Sides", "Copy Left To Right","Copy Right To Left","Clear Left","Clear Right", - "Collapse To One","Collapse Left","Shift Left","Shift Right" ), + "Collapse To One","Collapse Left","Shift Left","Shift Right", "Swap Up/Down", "Arbitrary Remap Columns" ), MenuRowDef(ScreenEdit::tempo, "Tempo", true, EditMode_Full, true, true, 0, "Compress 2x","Compress 3->2", "Compress 4->3","Expand 3->4","Expand 2->3","Expand 2x" ), @@ -3285,6 +3286,10 @@ void ScreenEdit::HandleScreenMessage( const ScreenMessage SM ) { HandleAlterMenuChoice( (AlterMenuChoice)ScreenMiniMenu::s_iLastRowCode, ScreenMiniMenu::s_viLastAnswers ); } + else if( SM == SM_BackFromArbitraryRemap ) + { + HandleArbitraryRemapping(ScreenTextEntry::s_sLastAnswer); + } else if( SM == SM_BackFromStepsInformation ) { HandleStepsInformationChoice( (StepsInformationChoice)ScreenMiniMenu::s_iLastRowCode, ScreenMiniMenu::s_viLastAnswers ); @@ -4532,6 +4537,73 @@ void ScreenEdit::HandleMainMenuChoice( MainMenuChoice c, const vector &iAns GAMESTATE->SetProcessedTimingData(NULL); } +static LocalizedString ENTER_ARBITRARY_MAPPING( "ScreenEdit", "Enter the new track mapping." ); +static LocalizedString TOO_MANY_TRACKS("ScreenEdit", "Too many tracks specified."); +static LocalizedString NOT_A_TRACK("ScreenEdit", "'%s' is not a track id."); +static LocalizedString OUT_OF_RANGE_ID("ScreenEdit", "Entry %d, '%d', is out of range 1 to %d."); + +static bool ConvertMappingInputToMapping(RString const& mapstr, int* mapping, RString& error) +{ + vector mapping_input; + split(mapstr, ",", mapping_input); + int tracks_for_type= GAMEMAN->GetStepsTypeInfo(GAMESTATE->m_pCurSteps[0]->m_StepsType).iNumTracks; + if(mapping_input.size() > tracks_for_type) + { + error= TOO_MANY_TRACKS; + return false; + } + // mapping_input.size() < tracks_for_type is not checked because + // unspecified tracks are mapped directly. -Kyz + size_t track= 0; + // track will be used for filling in the unspecified part of the mapping. + for(; track < mapping_input.size(); ++track) + { + if(mapping_input[track].empty() || mapping_input[track] == " ") + { + // This allows blank entries to mean "pass through". + mapping[track]= track+1; + } + else if(!(mapping_input[track] >> mapping[track])) + { + error= ssprintf(NOT_A_TRACK.GetValue(), mapping_input[track].c_str()); + return false; + } + if(mapping[track] < 1 || mapping[track] > tracks_for_type) + { + error= ssprintf(OUT_OF_RANGE_ID.GetValue(), track+1, mapping[track], tracks_for_type); + return false; + } + // Simpler for the user if they input track ids starting at 1. + --mapping[track]; + } + for(; track < tracks_for_type; ++track) + { + mapping[track]= track; + } + return true; +} + +static bool ArbitraryRemapValidate(const RString& answer, RString& error_out) +{ + int mapping[MAX_NOTE_TRACKS]; + return ConvertMappingInputToMapping(answer, mapping, error_out); +} + +void ScreenEdit::HandleArbitraryRemapping(RString const& mapstr) +{ + const NoteData OldClipboard( m_Clipboard ); + HandleAlterMenuChoice( cut, false ); + int mapping[MAX_NOTE_TRACKS]; + RString error; + // error is actually reported by the validate function, and unused here. + if(ConvertMappingInputToMapping(mapstr, mapping, error)) + { + NoteDataUtil::ArbitraryRemap(m_Clipboard, mapping); + } + HandleAreaMenuChoice( paste_at_begin_marker, false ); + m_Clipboard = OldClipboard; +} + void ScreenEdit::HandleAlterMenuChoice(AlterMenuChoice c, const vector &iAnswers, bool bAllowUndo) { ASSERT_M(m_NoteFieldEdit.m_iBeginMarker!=-1 && m_NoteFieldEdit.m_iEndMarker!=-1, @@ -4676,6 +4748,15 @@ void ScreenEdit::HandleAlterMenuChoice(AlterMenuChoice c, const vector &iAn case collapse_left: NoteDataUtil::CollapseLeft( m_Clipboard ); break; case shift_left: NoteDataUtil::ShiftLeft( m_Clipboard ); break; case shift_right: NoteDataUtil::ShiftRight( m_Clipboard ); break; + case swap_up_down: NoteDataUtil::SwapUpDown(m_Clipboard, GAMESTATE->m_pCurSteps[0]->m_StepsType); break; + case arbitrary_remap: + ScreenTextEntry::TextEntry( + SM_BackFromArbitraryRemap, ENTER_ARBITRARY_MAPPING, + "1, 2, 3, 4", MAX_NOTE_TRACKS * 4, + // 2 chars for digit, one for comma, one for space. + ArbitraryRemapValidate + ); + break; } HandleAreaMenuChoice( paste_at_begin_marker, false ); diff --git a/src/ScreenEdit.h b/src/ScreenEdit.h index 93b880796f..79836f08de 100644 --- a/src/ScreenEdit.h +++ b/src/ScreenEdit.h @@ -442,6 +442,7 @@ public: modify_keysounds_at_row, /**< Modify the keysounds at this row. */ NUM_AREA_MENU_CHOICES }; + void HandleArbitraryRemapping(RString const& mapstr); void HandleAlterMenuChoice(AlterMenuChoice c, const vector &iAnswers, bool bAllowUndo = true); @@ -491,16 +492,18 @@ public: enum AlterType { autogen_to_fill_width, - backwards, - swap_sides, - copy_left_to_right, - copy_right_to_left, - clear_left, - clear_right, - collapse_to_one, - collapse_left, - shift_left, - shift_right, + backwards, + swap_sides, + copy_left_to_right, + copy_right_to_left, + clear_left, + clear_right, + collapse_to_one, + collapse_left, + shift_left, + shift_right, + swap_up_down, + arbitrary_remap, NUM_ALTER_TYPES }; enum TempoType diff --git a/src/ScreenOptionsMasterPrefs.cpp b/src/ScreenOptionsMasterPrefs.cpp index 0a64a4727f..92d319160a 100644 --- a/src/ScreenOptionsMasterPrefs.cpp +++ b/src/ScreenOptionsMasterPrefs.cpp @@ -441,6 +441,7 @@ static void TimingWindowScale( int &sel, bool ToSel, const ConfOption *pConfOpti { // StepMania 5 values (implemented 2008/03/12) //const float mapping[] = { 2.0f,1.66f,1.33f,1.00f,0.75f,0.50f,0.25f }; + // StepMania 3.9 and 4.0 values: 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, ARRAYLEN(mapping) ); @@ -449,12 +450,13 @@ static void TimingWindowScale( int &sel, bool ToSel, const ConfOption *pConfOpti /** @brief Life Difficulty scale */ static void LifeDifficulty( int &sel, bool ToSel, const ConfOption *pConfOption ) { - // StepMania 5 values (implemented 2008/03/12) + // original StepMania 5 values (implemented 2008/03/12) //const float mapping[] = { 2.0f,1.50f,1.00f,0.66f,0.33f }; + // 3.9 modified so that L6 is L4 (in SM5 some time after) + //const float mapping[] = { 1.20f,1.00f,0.80f,0.60f,0.40f,0.33f,0.25f }; + // StepMania 3.9 and 4.0 values: - //const float mapping[] = { 1.60f,1.40f,1.20f,1.00f,0.80f,0.60f,0.40f }; - // 3.9 modified so that L6 is L4 - const float mapping[] = { 1.20f,1.00f,0.80f,0.60f,0.40f,0.33f,0.25f }; + const float mapping[] = { 1.60f,1.40f,1.20f,1.00f,0.80f,0.60f,0.40f }; MoveMap( sel, pConfOption, ToSel, mapping, ARRAYLEN(mapping) ); } @@ -732,7 +734,7 @@ static void InitializeConfOptions() ADD( ConfOption( "EventMode", MovePref, "Off","On (recommended)" ) ); ADD( ConfOption( "TimingWindowScale", TimingWindowScale, "|1","|2","|3","|4","|5","|6","|7","|8","Justice" ) ); - ADD( ConfOption( "LifeDifficulty", LifeDifficulty, "|1.2","|1.0","|0.8","|0.6","|0.4","|0.33","|0.25" ) ); + ADD( ConfOption( "LifeDifficulty", LifeDifficulty, "|1","|2","|3","|4","|5","|6","|7" ) ); g_ConfOptions.back().m_sPrefName = "LifeDifficultyScale"; 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") ); @@ -777,6 +779,7 @@ static void InitializeConfOptions() g_ConfOptions.back().m_iEffects = OPT_APPLY_GRAPHICS; ADD( ConfOption( "Vsync", MovePref, "No", "Yes" ) ); g_ConfOptions.back().m_iEffects = OPT_APPLY_GRAPHICS; + ADD( ConfOption( "FastNoteRendering", MovePref, "Off", "On")); ADD( ConfOption( "ShowStats", MovePref, "Off","On" ) ); ADD( ConfOption( "ShowBanners", MovePref, "Off","On" ) ); diff --git a/src/WheelItemBase.cpp b/src/WheelItemBase.cpp index af80aac741..08bb71d362 100644 --- a/src/WheelItemBase.cpp +++ b/src/WheelItemBase.cpp @@ -87,11 +87,36 @@ void WheelItemBase::DrawPrimitives() class LunaWheelItemBase: public Luna { public: - DEFINE_METHOD( GetColor, GetColor() ) - DEFINE_METHOD( GetText, GetText() ) +#define IS_LOADED_CHECK \ + if(!p->IsLoaded()) \ + { \ + luaL_error(L, "Wheel item is not loaded yet. Use WheelItem:IsLoaded() to check."); \ + } + + static int GetColor(T* p, lua_State *L) + { + IS_LOADED_CHECK; + LuaHelpers::Push(L, p->GetColor()); + return 1; + } + + static int GetText(T* p, lua_State *L) + { + IS_LOADED_CHECK; + LuaHelpers::Push(L, p->GetText()); + return 1; + } - static int GetType( T* p, lua_State *L ) { - lua_pushnumber( L, p->GetType() ); + static int GetType(T* p, lua_State *L) + { + IS_LOADED_CHECK; + lua_pushnumber(L, p->GetType()); + return 1; + } + + static int IsLoaded(T* p, lua_State *L) + { + lua_pushboolean(L, p->IsLoaded()); return 1; } @@ -100,6 +125,7 @@ public: ADD_METHOD( GetColor ); ADD_METHOD( GetText ); ADD_METHOD( GetType ); + ADD_METHOD( IsLoaded ); } }; LUA_REGISTER_DERIVED_CLASS( WheelItemBase, ActorFrame ) diff --git a/src/WheelItemBase.h b/src/WheelItemBase.h index 0dc1146636..2eea82e4db 100644 --- a/src/WheelItemBase.h +++ b/src/WheelItemBase.h @@ -51,9 +51,10 @@ public: RageColor m_colorLocked; - const RString GetText(){ return m_pData->m_sText; } - const RageColor GetColor(){ return m_pData->m_color; } - WheelItemDataType GetType(){ return m_pData->m_Type; } + const RString GetText(){ ASSERT(m_pData != NULL); return m_pData->m_sText; } + const RageColor GetColor(){ ASSERT(m_pData != NULL); return m_pData->m_color; } + WheelItemDataType GetType(){ ASSERT(m_pData != NULL); return m_pData->m_Type; } + bool IsLoaded(){ return m_pData != NULL; } // Lua void PushSelf( lua_State *L ); diff --git a/src/arch/Lights/LightsDriver_Linux_PIUIO_Leds.cpp b/src/arch/Lights/LightsDriver_Linux_PIUIO_Leds.cpp new file mode 100644 index 0000000000..78f7285d54 --- /dev/null +++ b/src/arch/Lights/LightsDriver_Linux_PIUIO_Leds.cpp @@ -0,0 +1,157 @@ +#include "global.h" +#include +#include +#include +#include +#include +#include +#include "LightsDriver_Linux_PIUIO_Leds.h" +#include "GameState.h" +#include "Game.h" +#include "RageLog.h" + +REGISTER_SOUND_DRIVER_CLASS2(PIUIO_Leds, Linux_PIUIO_Leds); + +namespace { + const char *cabinet_leds[NUM_CabinetLight] = { + "/sys/class/leds/piuio::output23/brightness", + "/sys/class/leds/piuio::output26/brightness", + "/sys/class/leds/piuio::output25/brightness", + "/sys/class/leds/piuio::output24/brightness", + "/sys/class/leds/piuio::output10/brightness", + "/sys/class/leds/piuio::output10/brightness", + }; + + const char *dance_leds[NUM_GameController][NUM_GameButton] = { + { + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + "/sys/class/leds/piuio::output20/brightness", + "/sys/class/leds/piuio::output21/brightness", + "/sys/class/leds/piuio::output18/brightness", + "/sys/class/leds/piuio::output19/brightness", + }, + { + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + "/sys/class/leds/piuio::output4/brightness", + "/sys/class/leds/piuio::output5/brightness", + "/sys/class/leds/piuio::output2/brightness", + "/sys/class/leds/piuio::output3/brightness", + }, + }; + + const char *pump_leds[NUM_GameController][NUM_GameButton] = { + { + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + "/sys/class/leds/piuio::output2/brightness", + "/sys/class/leds/piuio::output3/brightness", + "/sys/class/leds/piuio::output4/brightness", + "/sys/class/leds/piuio::output5/brightness", + "/sys/class/leds/piuio::output6/brightness", + }, + { + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + "/sys/class/leds/piuio::output18/brightness", + "/sys/class/leds/piuio::output19/brightness", + "/sys/class/leds/piuio::output20/brightness", + "/sys/class/leds/piuio::output21/brightness", + "/sys/class/leds/piuio::output22/brightness", + }, + }; + + bool SetLight(const char *filename, bool on) + { + if (filename == NULL) + return true; + FILE *f = fopen(filename, "w"); + if (f == NULL) + { + return false; + } + fprintf(f, "%d", on ? 255 : 0); + fclose(f); + return true; + } +} + +LightsDriver_Linux_PIUIO_Leds::LightsDriver_Linux_PIUIO_Leds() +{ +} + +LightsDriver_Linux_PIUIO_Leds::~LightsDriver_Linux_PIUIO_Leds() +{ +} + +void LightsDriver_Linux_PIUIO_Leds::Set( const LightsState *ls ) +{ + FOREACH_CabinetLight(light) + { + if (!SetLight(cabinet_leds[light], ls->m_bCabinetLights[light])) + { + LOG->Warn("Error setting cabinet light %s", + CabinetLightToString(light).c_str()); + return; + } + } + + const InputScheme *pInput = &GAMESTATE->GetCurrentGame()->m_InputScheme; + RString sInputName = pInput->m_szName; + if (sInputName.EqualsNoCase("dance")) + { + FOREACH_ENUM(GameController, c) + { + FOREACH_GameButton_Custom(gb) + { + if (!SetLight(dance_leds[c][gb], ls->m_bGameButtonLights[c][gb])) + { + LOG->Warn("Error setting button light %s", + GameButtonToString(pInput, gb).c_str()); + return; + } + } + } + } + else if (sInputName.EqualsNoCase("pump")) + { + FOREACH_ENUM(GameController, c) + { + FOREACH_GameButton_Custom(gb) + { + if (!SetLight(pump_leds[c][gb], ls->m_bGameButtonLights[c][gb])) + { + LOG->Warn("Error setting button light %s", + GameButtonToString(pInput, gb).c_str()); + return; + } + } + } + } + else + { + return; + } +} + +/* + * (c) 2014 StepMania team + * 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. + */ diff --git a/src/arch/Lights/LightsDriver_Linux_PIUIO_Leds.h b/src/arch/Lights/LightsDriver_Linux_PIUIO_Leds.h new file mode 100644 index 0000000000..f5f0cfab0f --- /dev/null +++ b/src/arch/Lights/LightsDriver_Linux_PIUIO_Leds.h @@ -0,0 +1,42 @@ +/* LightsDriver_Linux_PIUIO_Leds: Control PIUIO lights via /sys/class/leds */ + +#ifndef LightsDriver_Linux_PIUIO_Leds_H +#define LightsDriver_Linux_PIUIO_Leds_H + +#include "arch/Lights/LightsDriver.h" + +class LightsDriver_Linux_PIUIO_Leds : public LightsDriver +{ +public: + LightsDriver_Linux_PIUIO_Leds(); + virtual ~LightsDriver_Linux_PIUIO_Leds(); + + virtual void Set( const LightsState *ls ); +}; + +#endif + +/* + * (c) 2014 StepMania team + * 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. + */ diff --git a/stepmania.desktop b/stepmania.desktop index 13302f8628..4e3fb8ee74 100644 --- a/stepmania.desktop +++ b/stepmania.desktop @@ -1,7 +1,7 @@ [Desktop Entry] Encoding=UTF-8 -Name=Stepmania-ssc +Name=StepMania GenericName=Rhythm and dance game TryExec=stepmania Exec=stepmania