function GetLocalProfiles() local t = {}; function GetSongsPlayedString(numSongs) return numSongs == 1 and Screen.String("SingularSongPlayed") or Screen.String("SeveralSongsPlayed") end for p = 0,PROFILEMAN:GetNumLocalProfiles()-1 do local profile=PROFILEMAN:GetLocalProfileFromIndex(p); local ProfileCard = Def.ActorFrame { --[[ Def.Quad { InitCommand=cmd(zoomto,200,1;y,40/2); OnCommand=cmd(diffuse,Color('Outline')); }; --]] LoadFont("Common Fallback") .. { Text=profile:GetDisplayName(); InitCommand=cmd(shadowlength,1;y,-12;zoom,1;strokecolor,color("#000000");ztest,true); }; LoadFont("Common Condensed") .. { InitCommand=cmd(shadowlength,1;y,10;zoom,0.7;vertspacing,-8;ztest,true); BeginCommand=function(self) local numSongsPlayed = profile:GetNumTotalSongsPlayed(); self:settext( string.format( GetSongsPlayedString( numSongsPlayed ), numSongsPlayed ) ) end; }; }; t[#t+1]=ProfileCard; end; return t; end; function LoadCard(cColor) local t = Def.ActorFrame { LoadActor( THEME:GetPathG("ScreenSelectProfile","CardBackground") ) .. { InitCommand=cmd(diffuse,ColorMidTone(cColor)); }; }; return t end function LoadPlayerStuff(Player) local t = {}; local pn = (Player == PLAYER_1) and 1 or 2; --[[ local t = LoadActor(THEME:GetPathB('', '_frame 3x3'), 'metal', 200, 230) .. { Name = 'BigFrame'; }; --]] t[#t+1] = Def.ActorFrame { Name = 'JoinFrame'; LoadCard(color('#882D47')); --[[ Def.Quad { InitCommand=cmd(zoomto,200+4,230+4); OnCommand=cmd(shadowlength,1;diffuse,color("0,0,0,0.5")); }; Def.Quad { InitCommand=cmd(zoomto,200,230); OnCommand=cmd(diffuse,Color('Orange');diffusealpha,0.5); }; --]] LoadFont("Common Italic Condensed") .. { Text="Press &START; to join"; InitCommand=cmd(shadowlength,1;zoom,1.25); OnCommand=cmd(diffuseshift;effectcolor1,Color('White');effectcolor2,color("0.5,0.5,0.5");strokecolor,color("#4A1110")); }; }; t[#t+1] = Def.ActorFrame { Name = 'BigFrame'; LoadCard(PlayerColor(Player)); }; t[#t+1] = Def.ActorFrame { Name = 'SmallFrame'; InitCommand=cmd(y,-2); Def.Quad { InitCommand=cmd(zoomto,270,48); OnCommand=cmd(diffuse,PlayerDarkColor(Player);fadeleft,0.1;faderight,0.1); }; }; t[#t+1] = Def.ActorScroller{ Name = 'Scroller'; NumItemsToDraw=6; --InitCommand=cmd(zoom,2); OnCommand=cmd(y,1;SetFastCatchup,true;SetMask,200,58;SetSecondsPerItem,0.15); OffCommand=cmd(decelerate,0.5;diffusealpha,0); TransformFunction=function(self, offset, itemIndex, numItems) local focus = scale(math.abs(offset),0,2,1,0); self:visible(false); self:y(math.floor( offset*48 )); -- self:zoomy( focus ); -- self:z(-math.abs(offset)); -- self:zoom(focus); end; children = GetLocalProfiles(); }; t[#t+1] = Def.ActorFrame { Name = "EffectFrame"; }; t[#t+1] = LoadFont("Common Fallback") .. { Name = 'SelectedProfileText'; InitCommand=cmd(y,160;shadowlength,1;diffuse,color("#FFFFFF");strokecolor,ColorDarkTone(PlayerColor(Player));diffusebottomedge,color("#FFFFFF");zoom,1.25); }; return t; end; function UpdateInternal3(self, Player) local pn = (Player == PLAYER_1) and 1 or 2; local frame = self:GetChild(string.format('P%uFrame', pn)); local scroller = frame:GetChild('Scroller'); local seltext = frame:GetChild('SelectedProfileText'); local joinframe = frame:GetChild('JoinFrame'); local smallframe = frame:GetChild('SmallFrame'); local bigframe = frame:GetChild('BigFrame'); if GAMESTATE:IsHumanPlayer(Player) then frame:visible(true); if MEMCARDMAN:GetCardState(Player) == 'MemoryCardState_none' then --using profile if any joinframe:visible(false); smallframe:visible(true); bigframe:visible(true); seltext:visible(true); scroller:visible(true); local ind = SCREENMAN:GetTopScreen():GetProfileIndex(Player); if ind > 0 then scroller:SetDestinationItem(ind-1); seltext:settext(PROFILEMAN:GetLocalProfileFromIndex(ind-1):GetDisplayName()); else if SCREENMAN:GetTopScreen():SetProfileIndex(Player, 1) then scroller:SetDestinationItem(0); self:queuecommand('UpdateInternal2'); else joinframe:visible(true); smallframe:visible(false); bigframe:visible(false); scroller:visible(false); seltext:settext('No profile'); end; end; else --using card smallframe:visible(false); scroller:visible(false); seltext:settext('CARD'); SCREENMAN:GetTopScreen():SetProfileIndex(Player, 0); end; else joinframe:visible(true); scroller:visible(false); seltext:visible(false); smallframe:visible(false); bigframe:visible(false); end; end; -- here's a (messy) fix for one player's selection ending the screen, -- at least until this whole thing is rewritten to be... Not this local ready = {} local function AllPlayersReady() for i, pn in ipairs(GAMESTATE:GetHumanPlayers()) do if not ready[pn] then return false end end -- if it hasn't returned false by now, surely it must be true, right? RIGHT??? return true end local t = Def.ActorFrame { StorageDevicesChangedMessageCommand=function(self, params) self:queuecommand('UpdateInternal2'); end; CodeMessageCommand = function(self, params) if params.Name == 'Start' or params.Name == 'Center' then MESSAGEMAN:Broadcast("StartButton"); if not GAMESTATE:IsHumanPlayer(params.PlayerNumber) then SCREENMAN:GetTopScreen():SetProfileIndex(params.PlayerNumber, -1); else ready[params.PlayerNumber] = true if AllPlayersReady() then SCREENMAN:GetTopScreen():Finish(); end end; end; if params.Name == 'Up' or params.Name == 'Up2' or params.Name == 'DownLeft' then -- Added a line to make sure the player can't fiddle around in the menu -- after they've already made a selection. if GAMESTATE:IsHumanPlayer(params.PlayerNumber) and not ready[params.PlayerNumber] then local ind = SCREENMAN:GetTopScreen():GetProfileIndex(params.PlayerNumber); if ind > 1 then if SCREENMAN:GetTopScreen():SetProfileIndex(params.PlayerNumber, ind - 1 ) then MESSAGEMAN:Broadcast("DirectionButton"); self:queuecommand('UpdateInternal2'); end; end; end; end; if params.Name == 'Down' or params.Name == 'Down2' or params.Name == 'DownRight' then if GAMESTATE:IsHumanPlayer(params.PlayerNumber) and not ready[params.PlayerNumber] then local ind = SCREENMAN:GetTopScreen():GetProfileIndex(params.PlayerNumber); if ind > 0 then if SCREENMAN:GetTopScreen():SetProfileIndex(params.PlayerNumber, ind + 1 ) then MESSAGEMAN:Broadcast("DirectionButton"); self:queuecommand('UpdateInternal2'); end; end; end; end; if params.Name == 'Back' then if GAMESTATE:GetNumPlayersEnabled()==0 then SCREENMAN:GetTopScreen():Cancel(); else MESSAGEMAN:Broadcast("BackButton") -- Allow... erm... un-readying a player. if ready[params.PlayerNumber] then ready[params.PlayerNumber] = false else SCREENMAN:GetTopScreen():SetProfileIndex(params.PlayerNumber, -2); end end; end; end; PlayerJoinedMessageCommand=function(self, params) self:queuecommand('UpdateInternal2'); end; PlayerUnjoinedMessageCommand=function(self, params) self:queuecommand('UpdateInternal2'); end; OnCommand=function(self, params) self:queuecommand('UpdateInternal2'); end; UpdateInternal2Command=function(self) UpdateInternal3(self, PLAYER_1); UpdateInternal3(self, PLAYER_2); end; children = { Def.ActorFrame { Name = 'P1Frame'; InitCommand=cmd(x,SCREEN_CENTER_X-160;y,SCREEN_CENTER_Y); --OnCommand=cmd(zoom,0;bounceend,0.35;zoom,1); OffCommand=cmd(decelerate,0.3;diffusealpha,0); -- PlayerJoinedMessageCommand=function(self,param) -- if param.Player == PLAYER_1 then -- (cmd(;zoom,1.15;bounceend,0.175;zoom,1.0))(self); -- end; -- end; children = LoadPlayerStuff(PLAYER_1); }; Def.ActorFrame { Name = 'P2Frame'; InitCommand=cmd(x,SCREEN_CENTER_X+160;y,SCREEN_CENTER_Y); --OnCommand=cmd(zoom,0;bounceend,0.35;zoom,1); OffCommand=cmd(decelerate,0.3;diffusealpha,0); -- PlayerJoinedMessageCommand=function(self,param) -- if param.Player == PLAYER_2 then -- (cmd(zoom,1.15;bounceend,0.175;zoom,1.0))(self); -- end; -- end; children = LoadPlayerStuff(PLAYER_2); }; -- sounds LoadActor( THEME:GetPathS("Common","start") )..{ StartButtonMessageCommand=cmd(play); }; LoadActor( THEME:GetPathS("Common","cancel") )..{ BackButtonMessageCommand=cmd(play); }; LoadActor( THEME:GetPathS("Common","value") )..{ DirectionButtonMessageCommand=cmd(play); }; }; }; return t;