-- Pester Kyzentun for an explanation if you need to customize this screen. -- Also, this might be rewritten to us a proper customizable lua menu system -- in the future. local profile= GAMESTATE:GetEditLocalProfile() local cursor_width_padding = 16 local cursor_spacing_value = 30 local number_entry= new_numpad_entry{ Name= "number_entry", InitCommand= cmd(diffusealpha, 0; xy, _screen.cx*1.5, _screen.cy), value = LoadFont("Common Large") .. { InitCommand=cmd(xy,0,-62), OnCommand=cmd(zoom,0.75;diffuse,PlayerColor(PLAYER_1);strokecolor,ColorDarkTone(PlayerColor(PLAYER_1))); SetCommand=function(self, param) self:settext(param[1]) end, }, button = LoadFont("Common Normal") ..{ InitCommand=cmd(shadowlength,1), SetCommand=function(self, param) self:settext(param[1]) end, OnCommand=cmd(diffuse,color("0.8,0.8,0.8,1");zoom,0.875), GainFocusCommand=cmd(finishtweening;decelerate,0.125;zoom,1;diffuse,Color.White), LoseFocusCommand=cmd(finishtweening;smooth,0.1;zoom,0.875;diffuse,color("0.8,0.8,0.8,1")) }, button_positions = {{-cursor_spacing_value, -cursor_spacing_value}, {0, -cursor_spacing_value}, {cursor_spacing_value, -cursor_spacing_value}, {-cursor_spacing_value, 0}, {0, 0}, {cursor_spacing_value, 0}, {-cursor_spacing_value, cursor_spacing_value}, {0, cursor_spacing_value}, {cursor_spacing_value, cursor_spacing_value}, {-cursor_spacing_value, cursor_spacing_value*2}, {0, cursor_spacing_value*2}, {cursor_spacing_value, cursor_spacing_value*2}}, cursor = Def.ActorFrame { -- Move whole container MoveCommand=function(self, param) self:stoptweening() self:decelerate(0.15) self:xy(param[1], param[2]) if param[3] then self:z(param[3]) end end, -- LoadActor( THEME:GetPathG("_frame", "1D"), { 2/18, 14/18, 2/18 }, LoadActor(THEME:GetPathB("_frame", "cursors/rounded fill")) ) .. { OnCommand=cmd(diffuse,PlayerDarkColor(PLAYER_1)), FitCommand=function(self, param) self:playcommand("SetSize",{ Width=param:GetWidth()+cursor_width_padding, tween=cmd(decelerate,0.125)}) end, }, LoadActor( THEME:GetPathG("_frame", "1D"), { 2/18, 14/18, 2/18 }, LoadActor(THEME:GetPathB("_frame", "cursors/rounded gloss")) ) .. { OnCommand=cmd(diffuse,PlayerColor(PLAYER_1)), FitCommand=function(self, param) self:playcommand("SetSize",{ Width=param:GetWidth()+cursor_width_padding, tween=cmd(decelerate,0.125)}) end, } }, cursor_draw= "first", prompt = LoadFont("Common Bold") .. { Name="prompt", InitCommand=cmd(xy,0,-96); OnCommand=cmd(shadowlength,1;skewx,-0.125;diffusebottomedge,color("#DDDDDD");strokecolor,Color.Outline); SetCommand= function(self, params) self:settext(params[1]) end }, LoadActor(THEME:GetPathB("_frame","3x3"),"rounded black", 128, 192) .. { InitCommand=cmd(xy, 0, -20) } } local function item_value_to_text(item, value) if item.item_type == "bool" then if value then value= THEME:GetString("ScreenOptionsCustomizeProfile", item.true_text) else value= THEME:GetString("ScreenOptionsCustomizeProfile", item.false_text) end end return value end local menu_items= { {name= "weight", get= "GetWeightPounds", set= "SetWeightPounds", item_type= "number", auto_done= 100}, {name= "voomax", get= "GetVoomax", set= "SetVoomax", item_type= "number", auto_done= 10}, {name= "birth_year", get= "GetBirthYear", set= "SetBirthYear", item_type= "number", auto_done= 1000}, {name= "calorie_calc", get= "GetIgnoreStepCountCalories", set= "SetIgnoreStepCountCalories", item_type= "bool", true_text= "use_heart", false_text= "use_steps"}, {name= "gender", get= "GetIsMale", set= "SetIsMale", item_type= "bool", true_text= "male", false_text= "female"}, {name= "exit", item_type= "exit"} } local menu_cursor local menu_pos= 1 local menu_start= 72 local menu_x= 32 local value_x= 300 local fader local cursor_on_menu= true local menu_item_actors= {} local menu_values= {} local function fade_actor_to(actor, alf) actor:stoptweening() actor:linear(.2) actor:diffusealpha(alf) end local function update_menu_cursor() local item= menu_item_actors[menu_pos] menu_cursor:playcommand("Move", {item:GetX(), item:GetY()}) menu_cursor:playcommand("Fit", item) end local function input(event) local pn= event.PlayerNumber if not pn then return false end if event.type == "InputEventType_Release" then return false end local button= event.GameButton if cursor_on_menu then if button == "Start" then local item= menu_items[menu_pos] if item.item_type == "bool" then local value= not Profile[item.get](profile) menu_values[menu_pos]:settext(item_value_to_text(item, value)) Profile[item.set](profile, value) elseif item.item_type == "number" then fade_actor_to(fader, .8) fade_actor_to(number_entry.container, 1) number_entry.value= Profile[item.get](profile) number_entry.value_actor:playcommand("Set", {number_entry.value}) number_entry.auto_done_value= item.auto_done number_entry.max_value= item.max number_entry:update_cursor(number_entry.cursor_start) number_entry.prompt_actor:playcommand( "Set", {THEME:GetString("ScreenOptionsCustomizeProfile", item.name)}) cursor_on_menu= false elseif item.item_type == "exit" then SCREENMAN:GetTopScreen():StartTransitioningScreen("SM_GoToNextScreen") SOUND:PlayOnce(THEME:GetPathS("Common", "Start")) end else if button == "MenuLeft" or button == "MenuUp" then if menu_pos > 1 then menu_pos= menu_pos - 1 end update_menu_cursor() elseif button == "MenuRight" or button == "MenuDown" then if menu_pos < #menu_items then menu_pos= menu_pos + 1 end update_menu_cursor() end end else local done= number_entry:handle_input(button) if done then local item= menu_items[menu_pos] Profile[item.set](profile, number_entry.value) menu_values[menu_pos]:settext(item_value_to_text(item, number_entry.value)) fade_actor_to(fader, 0) fade_actor_to(number_entry.container, 0) cursor_on_menu= true end end end local args= { Def.Actor{ OnCommand= function(self) update_menu_cursor() SCREENMAN:GetTopScreen():AddInputCallback(input) end }, Def.ActorFrame { Name= "menu_cursor", InitCommand= function(self) menu_cursor= self end, -- Move whole container MoveCommand=function(self, param) self:stoptweening() self:decelerate(0.15) self:xy(param[1], param[2]) if param[3] then self:z(param[3]) end end, FitCommand= function(self, param) self:addx(param:GetWidth()/2) end, -- LoadActor( THEME:GetPathG("_frame", "1D"), { 2/18, 14/18, 2/18 }, LoadActor(THEME:GetPathB("_frame", "cursors/rounded fill")) ) .. { OnCommand=cmd(diffuse,PlayerDarkColor(PLAYER_1)), FitCommand=function(self, param) self:playcommand("SetSize",{ Width=param:GetWidth()+cursor_width_padding, tween=cmd(decelerate,0.125)}) end, }, LoadActor( THEME:GetPathG("_frame", "1D"), { 2/18, 14/18, 2/18 }, LoadActor(THEME:GetPathB("_frame", "cursors/rounded gloss")) ) .. { OnCommand=cmd(diffuse,PlayerColor(PLAYER_1)), FitCommand=function(self, param) self:playcommand("SetSize",{ Width=param:GetWidth()+cursor_width_padding, tween=cmd(decelerate,0.125)}) end, } }, } for i, item in ipairs(menu_items) do local item_y= menu_start + ((i-1) * 24) args[#args+1]= Def.BitmapText{ Name= "menu_" .. item.name, Font= "Common Normal", Text= THEME:GetString("ScreenOptionsCustomizeProfile", item.name), InitCommand= function(self) menu_item_actors[i]= self self:xy(menu_x, item_y) self:diffuse(Color.White) self:horizalign(left) end } if item.get then local value_text= item_value_to_text(item, Profile[item.get](profile)) args[#args+1]= Def.BitmapText{ Name= "value_" .. item.name, Font= "Common Normal", Text= value_text, InitCommand= function(self) menu_values[i]= self self:xy(value_x, menu_start + ((i-1) * 24)) self:diffuse(Color.White) self:horizalign(left) end } end end args[#args+1]= Def.Quad{ Name= "fader", InitCommand= function(self) fader= self self:setsize(270, #menu_items * 24) self:horizalign(left) self:vertalign(top) self:xy(menu_x-10, menu_start-12) self:diffuse(Color.Black) self:diffusealpha(0) end } args[#args+1]= number_entry:create_actors() return Def.ActorFrame(args)