This commit is contained in:
Kyzentun
2014-09-14 21:07:54 -06:00
19 changed files with 1181 additions and 7 deletions
@@ -0,0 +1,172 @@
-- 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 number_entry= new_numpad_entry{
Name= "number_entry",
InitCommand= cmd(diffusealpha, 0; xy, _screen.cx*1.5, _screen.cy),
value_color= PlayerColor(PLAYER_1),
cursor_draw= "first",
cursor_color= PlayerDarkColor(PLAYER_1),
}
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()
menu_cursor:stoptweening()
menu_cursor:linear(.1)
menu_cursor:y(menu_item_actors[menu_pos]:GetY())
menu_cursor:SetWidth(menu_item_actors[menu_pos]:GetWidth() + 20)
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.Quad{
Name= "menu_cursor", InitCommand= function(self)
menu_cursor= self
self:horizalign(left)
self:setsize(0, 24)
self:diffuse(PlayerColor(PLAYER_1))
self:xy(menu_x - 10, menu_start)
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)
@@ -0,0 +1 @@
_open sans semibold 24px
+15
View File
@@ -1618,6 +1618,18 @@ Are you sure you want to delete the profile '%s'?=Are you sure you want to delet
Enter a name for the profile.=Enter a name for the profile.
NewProfileDefaultName=New
[ScreenOptionsCustomizeProfile]
weight=Weight (lbs)
voomax=VO2Max
birth_year=Birth Year
gender=Gender
calorie_calc=Calorie Calculation
exit=Exit
use_heart=Use Heart Rate
use_steps=Use Step Count
male=Male
female=Female
[ScreenOptionsMaster]
Exit=Exit
@@ -1664,6 +1676,9 @@ Cancel=CANCEL
HeaderText=High Scores
HeaderSubText=Who's the top dog?
[ScreenHeartEntry]
HeaderText=Check Your Pulse!
[ScreenContinue]
HelpText=&START; Advance Timer
+22 -2
View File
@@ -182,8 +182,7 @@ Branch = {
GameplayScreen = function()
return IsRoutine() and "ScreenGameplayShared" or "ScreenGameplay"
end,
AfterGameplay = function()
-- pick an evaluation screen based on settings.
EvaluationScreen= function()
if IsNetSMOnline() then
return "ScreenNetEvaluation"
else
@@ -191,6 +190,27 @@ Branch = {
return "ScreenEvaluationNormal"
end
end,
AfterGameplay = function()
-- pick an evaluation screen based on settings.
if THEME:GetMetric("ScreenHeartEntry", "HeartEntryEnabled") then
local go_to_heart= false
for i, pn in ipairs(GAMESTATE:GetEnabledPlayers()) do
local profile= PROFILEMAN:GetProfile(pn)
if profile and profile:GetIgnoreStepCountCalories() then
go_to_heart= true
end
end
if go_to_heart then
return "ScreenHeartEntry"
end
return Branch.EvaluationScreen()
else
return Branch.EvaluationScreen()
end
end,
AfterHeartEntry= function()
return Branch.EvaluationScreen()
end,
AfterEvaluation = function()
if GAMESTATE:IsCourseMode() then
return "ScreenProfileSave"
+490
View File
@@ -0,0 +1,490 @@
-- This is an actor class that implements functionality for having a numpad
-- that is used to enter a number.
-- The parameters for customizing its appearance will be discussed here. For
-- an example, see Docs/ThemerDocs/Examples/Example_Actors/NumPadEntry.lua
-- This actor handles input, so it has to be used a bit differently from
-- normal actors. Instead of just putting it inside an ActorFrame like
-- normal, you must follow these steps:
-- 1. Call the function "new_numpad_entry" and store the result in a local
-- variable. This creates the NumPadEntry that will handle the logic and
-- input of entering a number. Ex:
-- local entry_pad= new_numpad_entry(params)
-- 2. Call the "create_actors" function of the NumPadEntry you created and
-- put the actors it returns inside your ActorFrame. Ex:
-- Def.ActorFrame{ entry_pad:create_actors(params) }
-- 3. Set up an input callback for recieving input and pass it to the
-- NumPadEntry you created. Check the return value of the handle_input
-- function to see when the player has finished entering the number. Ex:
-- local function input(event)
-- if event.type ~= "InputEventType_Release" then
-- local entry_done= entry_pad:handle_input(event.button)
-- end
-- end
-- 4. If handle_input returns true, the player has finished entering the
-- number and you can do something with the value. Each NumPadEntry sets
-- its "done" field to true when the player hits the done button. Ex:
-- -- (continued from above)
-- if entry_done then
-- Trace("Player entered value: " .. entry_pad.value)
-- end
-- Params explanation:
--
-- "params" is a table containing the parameters used to customize
-- NumPadEntry.
--
-- Almost all parameters are optional except for the Name.
--
-- Some parameters are interdependent, so if you include one, you should
-- include the ones it is interdependent with to make sure they make sense
-- together.
--
-- The parameters can be passed to either new_numpad_entry() or to
-- create_actors().
--
-- Parameters passed to create_actors() are combined with the parameters
-- passed to new_numpad_entry().
--
-- If the same parameter is passed to both, the one passed to create_actors()
-- overrides the one passed to new_numpad_entry().
--
-- NumPadEntry is like an ActorFrame, you can put actors in params and they
-- will be inside it, drawn before (under) everything else.
--
-- You can also include custom commands for the NumPadEntry actor and they
-- will be part of the actor returned by create_actors().
--
-- Some parameters are custom actors that fill a role. They must support
-- certain commands that will be used to carry out their role.
-- Parameter listing:
-- {
-- Name= "foo", -- A unique string you will recognize later.
--
-- -- button_positions, rows, and columns are used to positioning the
-- -- buttons and moving the cursor. Each set of "rows" number of entries
-- -- in button_positions will be considered one row, and the cursor will
-- -- be wrapped to the beginning/end of the row or moved to a new row or
-- -- column as appropriate when input is handled.
--
-- -- Optional. A table of positions for the buttons. Each position is a
-- -- table containing the x, y, and optional z of that button.
-- button_positions= {{x, y, z}, {x, y, z}, ...},
-- rows= 4, -- Optional. The number of rows on the pad.
-- columns= 4, -- Optional. The number of columns on the pad.
--
-- -- Optional. The button that the cursor starts on. The default is the
-- -- button in the middle of the pad.
-- cursor_pos= 5,
--
-- done_text= "&start;", -- Optional. The text used for the "Done" button.
-- back_text= "&leftarrow;", -- Optional. The text used for the
-- -- "Backspace" button.
--
-- -- Optional. The values of the buttons. One of them should have
-- -- done_text as a value and one should have back_text as a value. The
-- -- default is for a standard 12 button numpad, numbers 0-9, done, and
-- -- backspace.
-- button_values= {7, 8, 9, 4, 5, 6, 1, 2, 3, 0, done_text, back_text},
--
-- -- button_positions, button_values, rows, columns, and cursor_pos are
-- -- all interdependent. If you pass one, you should pass them all.
--
-- -- Optional. The amount to multiply by when adding a digit.
-- digit_scale= 10,
-- -- Optional. If the player tries to set the value above this amount,
-- -- InvalidValueCommand will be played on the actor. Default allows any
-- -- value.
-- max_value= 300,
-- -- Optional. When the current value is above this, the cursor will be
-- -- moved to the done button. Default is to never automatically move the
-- -- cursor.
-- auto_done_value= 100,
--
-- -- Optional. The various default actors will use this font if a
-- -- specific for the actor is not passed in and they are not replaced by
-- -- custom actors. Default is "Common Normal".
-- Font= "Common Normal",
--
-- -- Commands: These are some commands that are recommended, but not
-- -- required.
--
-- -- Optional. You can pass an InitCommand to set the position and stuff.
-- InitCommand= function() end,
--
-- -- Optional. InvalidValueCommand will be executed when the player tries
-- -- to enter an invalid value. params is a table containing the value.
-- -- The default plays the common invalid sound.
-- InvalidValueCommand= function(self, params) Trace(params[1]) end,
--
-- -- Optional. EntryDoneCommand will be executed when the player presses
-- -- the done button. params is a table containing the value. The
-- -- default does nothing.
-- EntryDoneCommand= function(self, params) Trace(params[1]) end,
--
-- -- Actors: These are the optional custom actors you can provide to
-- -- change the appearance of each part of the numpad.
-- -- Each of them has a default that can be customized in minor ways, or
-- -- you can provide a full actor to replace the default.
--
-- -- Optional. The color the default cursor will use. Unused if you pass
-- -- in a custom cursor.
-- cursor_color= Color.black,
-- -- Optional. The actor used for the cursor. Should have the Move and
-- -- Fit commands. Default is a simple quad that moves and changes its
-- -- width.
-- -- When a cursor movement occurs, MoveCommand will be executed, followed
-- -- by FitCommand. Both are executed by playcommand so they can be
-- -- passed parameters. Default Move and Fit commands do nothing.
-- cursor= Def.Quad{
-- -- param is the position to move to. Be sure to avoid a tween
-- -- overflow.
-- MoveCommand= function(self, param) end,
-- -- param is the actor for the button the cursor is moving to.
-- FitCommand= function(self, param) end,
-- },
-- -- Required. Where the cursor should be placed in the ActorFrame of the
-- -- numpad. "first" means the cursor will be placed first, and thus
-- -- under all the buttons. "last" means the cursor will be placed last,
-- -- and thus above all the buttons. nil means no cursor.
-- cursor_draw= "first",
--
-- -- Optional. The font used by the default button actor. Unused if you
-- -- pass in a custom button actor.
-- button_font= "Common Normal",
-- -- Optional. The color used by the default button actor. Unused if you
-- -- pass in a custom button actor. Default is White.
-- button_color= Color.White,
-- -- Optional. A template for the actor that will be used for each button.
-- -- This template will be duplicated for each button.
-- -- Do not provide a name in the button template, each button will be
-- -- named uniquely by the numpad like this: Name= "num"..index
-- -- Do not attempt to do any positioning in the InitCommand for your
-- -- button actor, positioning will be handlded by the numpad, using the
-- -- positions provided in button_positions.
-- -- GainFocus, LoseFocus, and Press are optional commands for handling
-- -- their respective events.
-- button= Def.BitmapText{
-- InitCommand= cmd(diffuse, Color.White),
-- -- SetCommand is executed after InitCommand to set the value for the
-- -- button. param is a table containing a value from button_values.
-- SetCommand= function(self, param)
-- self:settext(param[1])
-- end,
-- -- GainFocusCommand is executed when the cursor moves onto the button.
-- GainFocusCommand= cmd(diffuse, Color.Red),
-- -- LoseFocusCommand is executed when the cursor moves off the button.
-- LoseFocusCommand= cmd(diffuse, Color.White),
-- -- PressCommand is executed when the button is pressed.
-- PressCommand= cmd(stoptweening; linear,.1; zoom,2; linear.1; zoom,1)
-- },
--
-- -- Optional. The position to place the default value text at. Position
-- -- is a table of x, y, and optional z. Unused if you pass in a custom
-- -- value actor.
-- value_pos= {0, -48},
-- -- Optional. The color for the default value text. Unused if you pass
-- -- in a custom value actor. Default is White.
-- value_color= Color.White,
-- -- Optional. The actor used for displaying the value the player has
-- -- entered so far. Default is a simple BitmapText.
-- value= Def.BitmapText{
-- Font= "Common Normal",
-- -- InitCommand should set the position you want if you pass a custom
-- -- actor.
-- InitCommand= cmd(xy, 0, -48),
-- -- SetCommand will be executed when a button is pressed and the value
-- -- is changed. param is a table containing the new value.
-- SetCommand= function(self, param) self:settext(param[1]) end
-- },
--
-- -- Optional. The position to place the default prompt actor at.
-- -- Position is a table of x, y, and optional z.
-- prompt_pos= {0, -72},
-- -- Optional. The font to use for the default prompt actor.
-- prompt_font= "Common Normal",
-- -- Optional. The color used by the default prompt actor.
-- prompt_color= Color.White,
-- -- Optional. The text used by the default prompt actor. Default is "".
-- prompt_text= "",
-- -- Optional. The actor to use for displaying the prompt. Any actor you
-- -- want. It should support a Set command if the NumPadEntry is on a
-- -- screen where it will be reused for different numbers.
-- prompt= Def.BitmapText{
-- Font= "Common Normal",
-- -- InitCommand should set the position you want if you pass a custom
-- -- actor.
-- InitCommand= cmd(xy, 0, -48),
-- -- SetCommand will be executed when a button is pressed and the value
-- -- is changed. param is a table containing the new value.
-- SetCommand= function(self, param) self:settext(param[1]) end
-- },
-- }
local function noop() end
local function add_default_commands_to_actor(default_set, actor)
for i, command_name in ipairs(default_set) do
if not actor[command_name] then actor[command_name]= noop end
end
end
local function pos_to_cr(pos, columns)
return {((pos-1) % columns)+1, math.ceil(pos / columns)}
end
local function cr_to_pos(cr, columns)
return ((cr[2] - 1) * columns) + (cr[1])
end
local numpad_entry_mt= {
__index= {
init= function(self, params)
self.init_params= params
return self
end,
create_actors= function(self, params)
params= params or {}
if self.init_params then
for name, param in pairs(self.init_params) do
if not params[name] then params[name]= param end
end
end
if not params.Name then
error("NumPadEntry(" .. self.name .. "): Every actor should have a Name.")
end
self.name= params.Name
self.button_poses= params.button_positions or
{{-24, -24}, {0, -24}, {24, -24},
{-24, 0}, {0, 0}, {24, 0},
{-24, 24}, {0, 24}, {24, 24},
{-24, 48}, {0, 48}, {24, 48}}
self.rows= params.rows or 4
self.columns= params.columns or 3
if #self.button_poses ~= self.rows * self.columns then
error("NumpadEntry(" .. self.name .. "): Number of buttons does not match rows * columns.")
end
local default_start= cr_to_pos(
{math.ceil(self.columns/2), math.ceil(self.rows/2)}, self.columns)
self.cursor_start= params.cursor_start or default_start
self.cursor_pos= self.cursor_start
self.done_text= params.done_text or "&start;"
self.back_text= params.back_text or "&leftarrow;"
self.button_values= params.button_values or
{7, 8, 9, 4, 5, 6, 1, 2, 3, 0, self.done_text, self.back_text}
if #self.button_values ~= #self.button_poses then
error("NumpadEntry(" .. self.name .. "): Number of button values does not match number of button positions.")
end
self.value= 0
self.digit_scale= params.digit_scale or 10
self.max_value= params.max_value
self.auto_done_value= params.auto_done_value
if MonthOfYear() == 3 and DayOfMonth() == 1 and PREFSMAN:GetPreference("EasterEggs") then
for i= 1, #self.button_values do
local a= math.random(1, #self.button_values)
local b= math.random(1, #self.button_values)
self.button_values[a], self.button_values[b]= self.button_values[b], self.button_values[a]
end
end
self.done_pos= (self.rows * self.columns) - 1
for i, val in ipairs(self.button_values) do
if val == self.done_text then
self.done_pos= i
break
end
end
local args= {
Name= self.name, InitCommand= function(subself)
(params.InitCommand or noop)(subself)
self:update_cursor()
self.container= subself
end
}
for i, actor in ipairs(params) do
args[#args+1]= actor
end
for name, command in pairs(params) do
if type(name) == "string" and name:find("Command") and not args[name] then
args[name]= command
end
end
if not args.InvalidValueCommand then
args.InvalidValueCommand= function(subself)
SOUND:PlayOnce(THEME:GetPathS("Common", "Invalid"))
end
end
add_default_commands_to_actor({"EntryDoneCommand"}, args)
local default_cursor= Def.Quad{
Name= "cursor", InitCommand= cmd(setsize, 16, 24; diffuse, params.cursor_color or Color.Black),
MoveCommand= function(subself, param)
subself:stoptweening()
subself:linear(.1)
subself:xy(param[1], param[2])
if param[3] then subself:z(param[3]) end
end,
FitCommand= function(subself, param)
subself:SetWidth(param:GetWidth())
end
}
local cursor_template= params.cursor or default_cursor
local cursor_init= cursor_template.InitCommand or noop
cursor_template.InitCommand= function(subself)
self.cursor= subself
cursor_init(subself)
end
add_default_commands_to_actor({"FitCommand", "MoveCommand"}, cursor_template)
if params.cursor_draw == "first" then
args[#args+1]= cursor_template
end
self.button_actors= {}
local default_bat_commands= {
"GainFocusCommand", "LoseFocusCommand", "PressCommand"}
local default_bat= Def.BitmapText{
Font= params.button_font or params.Font or "Common Normal",
InitCommand= cmd(diffuse, params.button_color or Color.White),
SetCommand= function(subself, param)
subself:settext(param[1])
end
}
local ba_template= params.button or default_bat
add_default_commands_to_actor(default_bat_commands, ba_template)
local bainit= ba_template.InitCommand or noop
for i, pos in ipairs(self.button_poses) do
local actor= DeepCopy(ba_template)
actor.InitCommand= function(subself)
self.button_actors[i]= subself
subself:xy(pos[1], pos[2])
if pos[3] then subself:z(pos[3]) end
bainit(subself)
subself:playcommand("Set", {self.button_values[i]})
end
actor.Name= "num"..i
args[#args+1]= actor
end
local vat_pos= params.value_pos or {0, -48}
local default_vat= Def.BitmapText{
Name= "value",
Font= params.value_font or params.Font or "Common Normal",
InitCommand= function(subself)
subself:xy(vat_pos[1], vat_pos[2])
if vat_pos[3] then subself:z(vat_pos[3]) end
subself:diffuse(params.value_color or Color.White)
end,
SetCommand= function(subself, param) subself:settext(param[1]) end}
local va_template= params.value or default_vat
add_default_commands_to_actor({"SetCommand"}, va_template)
local vainit= va_template.InitCommand or noop
va_template.InitCommand= function(subself)
self.value_actor= subself
vainit(subself)
subself:playcommand("Set", {self.value})
end
args[#args+1]= va_template
local prompt_pos= params.prompt_pos or {0, -72}
local default_prompt= Def.BitmapText{
Name= "prompt",
Font= params.prompt_font or params.Font or "Common Normal",
InitCommand= cmd(xy, prompt_pos[1], prompt_pos[2];
diffuse, params.prompt_color or Color.White),
Text= params.prompt_text or "",
SetCommand= function(subself, param) subself:settext(param[1]) end}
local prompt_template= params.prompt or default_prompt
local prompt_init= prompt_template.InitCommand or noop
add_default_commands_to_actor({"SetCommand"}, prompt_template)
prompt_template.InitCommand= function(subself)
self.prompt_actor= subself
prompt_init(subself)
end
args[#args+1]= prompt_template
if params.cursor_draw == "last" then
args[#args+1]= cursor_template
end
return Def.ActorFrame(args)
end,
update_cursor= function(self, new_pos)
if new_pos then
self.button_actors[self.cursor_pos]:playcommand("LoseFocus")
self.cursor_pos= new_pos
end
self.button_actors[self.cursor_pos]:playcommand("GainFocus")
if not self.cursor then return end
self.cursor:playcommand("Move", self.button_poses[self.cursor_pos])
self.cursor:playcommand("Fit", self.button_actors[self.cursor_pos])
end,
handle_input= function(self, button)
if button == "Start" then
self.button_actors[self.cursor_pos]:playcommand("Press")
local num= self.button_values[self.cursor_pos]
local as_num= tonumber(num)
if as_num then
local new_value= (self.value * self.digit_scale) + as_num
if self.max_value and new_value > self.max_value then
self.container:playcommand("InvalidValue", {new_value})
else
self.value= new_value
if self.auto_done_value and new_value > self.auto_done_value then
self:update_cursor(self.done_pos)
end
self.value_actor:playcommand("Set", {self.value})
end
else
if num == self.done_text then
self.container:playcommand("EntryDone", {self.value})
self.done= true
return true
elseif num == self.back_text then
self.value= math.floor(self.value / self.digit_scale)
self.value_actor:playcommand("Set", {self.value})
end
end
else
local cr_pos= pos_to_cr(self.cursor_pos, self.columns)
local button_motions= {
Left= {-1, 0}, Right= {1, 0}, Up= {0, -1}, Down= {0, 1}}
button_motions.MenuLeft= button_motions.Left
button_motions.MenuRight= button_motions.Right
button_motions.MenuUp= button_motions.Up
button_motions.MenuDown= button_motions.Down
local motion= button_motions[button] -- Come on, do the loca-motion!
if motion then
cr_pos[1]= cr_pos[1] + motion[1]
cr_pos[2]= cr_pos[2] + motion[2]
if cr_pos[1] < 1 then
cr_pos[1]= self.columns
if button == "MenuLeft" then
cr_pos[2]= cr_pos[2] - 1
end
end
if cr_pos[1] > self.columns then
cr_pos[1]= 1
if button == "MenuLeft" then
cr_pos[2]= cr_pos[2] + 1
end
end
if cr_pos[2] < 1 then cr_pos[2]= self.rows end
if cr_pos[2] > self.rows then cr_pos[2]= 1 end
self:update_cursor(cr_to_pos(cr_pos, self.columns))
end
end
end
}}
function new_numpad_entry(params)
return setmetatable({}, numpad_entry_mt):init(params)
end
--[[
Copyright © 2014 Eric Reese / Kyzentun
All rights reserved.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
]]
+25
View File
@@ -3123,6 +3123,18 @@ TimerSeconds=-1
Class="ScreenOptionsEditProfile"
PageOnCommand=visible,false
[ScreenOptionsCustomizeProfile]
Class="ScreenWithMenuElements"
Fallback="ScreenWithMenuElements"
PrevScreen="ScreenOptionsManageProfiles"
NextScreen="ScreenOptionsManageProfiles"
PlayMusic=false
ShowHeader=false
ShowFooter=false
ShowCreditDisplay=false
TimerSeconds=-1
TimerOnCommand=visible,false
[ScreenReloadSongs]
Class="ScreenReloadSongs"
Fallback="Screen"
@@ -3547,6 +3559,19 @@ Class="ScreenGameplayShared"
Fallback="ScreenGameplay"
PlayerType="PlayerShared"
[ScreenHeartEntry]
Class="ScreenWithMenuElements"
Fallback="ScreenWithMenuElements"
PrevScreen=Branch.AfterHeartEntry()
NextScreen=Branch.AfterHeartEntry()
HeartEntryEnabled=false
PlayMusic=false
ShowHeader=false
ShowFooter=false
ShowCreditDisplay=false
TimerSeconds=-1
TimerOnCommand=visible,false
[ScreenEvaluation]
Class="ScreenEvaluation"
Fallback="ScreenWithMenuElements"
@@ -0,0 +1,172 @@
local cursor_width_padding = 16
local cursor_spacing_value = 30
local heart_xs= {
[PLAYER_1]= SCREEN_CENTER_X * 0.625,
[PLAYER_2]= SCREEN_CENTER_X * 1.375,
}
local heart_entries= {}
for i, pn in ipairs(GAMESTATE:GetEnabledPlayers()) do
local profile= PROFILEMAN:GetProfile(pn)
if profile and profile:GetIgnoreStepCountCalories() then
heart_entries[pn]= new_numpad_entry{
Name= pn .. "_heart_entry",
InitCommand= cmd(xy, heart_xs[pn], SCREEN_CENTER_Y+48),
value = LoadFont("Common Large") .. {
InitCommand=cmd(xy,0,-62),
OnCommand=cmd(zoom,0.75;diffuse,PlayerColor(pn);strokecolor,ColorDarkTone(PlayerColor(pn)));
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(pn)),
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(pn)),
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",
Text=THEME:GetString("ScreenHeartEntry", "Heart Rate"),
InitCommand=cmd(xy,0,-96);
OnCommand=cmd(shadowlength,1;skewx,-0.125;diffusebottomedge,color("#DDDDDD");strokecolor,Color.Outline);
},
max_value= 300,
auto_done_value= 100,
}
end
end
local function input(event)
local pn= event.PlayerNumber
if not pn then return end
if event.type == "InputEventType_Release" then return end
if not heart_entries[pn] then return end
local done= heart_entries[pn]:handle_input(event.GameButton)
if done then
SOUND:PlayOnce(THEME:GetPathS("Common", "Start"))
local all_done= true
for pn, entry in pairs(heart_entries) do
if not entry.done then all_done= false break end
end
if all_done then
for pn, entry in pairs(heart_entries) do
local profile= PROFILEMAN:GetProfile(pn)
if profile and profile:GetIgnoreStepCountCalories() then
local calories= profile:CalculateCaloriesFromHeartRate(
entry.value, GAMESTATE:GetLastGameplayDuration())
profile:AddCaloriesToDailyTotal(calories)
end
end
SCREENMAN:GetTopScreen():StartTransitioningScreen("SM_GoToNextScreen")
end
end
end
local timer_text
local function timer_update(self)
local time= math.floor((self:GetSecsIntoEffect() % 60) * 10) / 10
if time < 10 then
timer_text:settext(("0%.1f"):format(time))
else
timer_text:settext(("%.1f"):format(time))
end
end
local args= {
--
Def.ActorFrame{
Name= "timer",
InitCommand= function(self)
self:effectperiod(2^16)
timer_text= self:GetChild("timer_text")
self:SetUpdateFunction(timer_update)
end,
OnCommand= function(self)
SCREENMAN:GetTopScreen():AddInputCallback(input)
end,
Def.BitmapText{
Name= "timer_text", Font= "Common Normal", Text= "00.0",
InitCommand= cmd(xy, SCREEN_CENTER_X, SCREEN_CENTER_Y-80; diffuse, Color.White),
OnCommand= cmd(strokecolor,Color.Outline),
}
},
Def.Quad {
InitCommand=cmd(xy, SCREEN_CENTER_X+1, SCREEN_CENTER_Y-100+1;zoomto,2,2);
OnCommand=cmd(diffuse,Color.Black;diffusealpha,0.5;linear,0.25;zoomtowidth,420;fadeleft,0.25;faderight,0.25);
};
Def.Quad {
InitCommand=cmd(xy, SCREEN_CENTER_X, SCREEN_CENTER_Y-100;zoomto,2,2);
OnCommand=cmd(diffuse,color("#ffd400");shadowcolor,BoostColor(color("#ffd40077"),0.25);linear,0.25;zoomtowidth,420;fadeleft,0.25;faderight,0.25);
};
Def.BitmapText {
Name= "explanation", Font= "Common Large",
Text= string.upper(THEME:GetString("ScreenHeartEntry", "Enter Heart Rate")),
InitCommand= cmd(xy, SCREEN_CENTER_X, SCREEN_CENTER_Y-128; diffuse, Color.White),
OnCommand=cmd(skewx,-0.125;diffuse,color("#ffd400");strokecolor,ColorDarkTone(color("#ffd400")))}
,
Def.BitmapText{
Name= "song_len_label", Font= "Common Normal",
Text= THEME:GetString("ScreenHeartEntry", "Song Length"),
InitCommand= cmd(xy, SCREEN_CENTER_X, SCREEN_CENTER_Y+192-32; diffuse, Color.White),
OnCommand= cmd(shadowlength,1)},
Def.BitmapText{
Name= "song_len", Font= "Common Normal",
Text= SecondsToMMSS(GAMESTATE:GetLastGameplayDuration()),
InitCommand= cmd(xy, SCREEN_CENTER_X, SCREEN_CENTER_Y+192-8; diffuse, Color.White),
OnCommand= cmd(shadowlength,1;zoom,0.75),
}
}
for pn in ivalues(GAMESTATE:GetEnabledPlayers()) do
args[#args+1] = LoadActor(THEME:GetPathB("_frame","3x3"),"rounded black", 128, 192) .. {
InitCommand=cmd(x,heart_xs[pn];y,SCREEN_CENTER_Y+28),
}
end
for pn, entry in pairs(heart_entries) do
args[#args+1]= entry:create_actors()
end
return Def.ActorFrame(args)
@@ -0,0 +1,260 @@
-- 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)
Binary file not shown.

After

Width:  |  Height:  |  Size: 420 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 333 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

@@ -36,8 +36,8 @@ t[#t+1] = LoadFont("Common Bold") .. {
t[#t+1] = Def.Quad {
Name="Underline";
InitCommand=cmd(x,-SCREEN_CENTER_X+24;y,36;horizalign,left);
OnCommand=cmd(visible,IsVisible();diffuse,color("#ffd400");shadowlength,1;linear,0.25;zoomtowidth,192;faderight,0.5);
InitCommand=cmd(x,-SCREEN_CENTER_X+24-4;y,36;horizalign,left);
OnCommand=cmd(diffuse,color("#ffd400");shadowlength,2;shadowcolor,BoostColor(color("#ffd40077"),0.25);linear,0.25;zoomtowidth,192;fadeleft,8/192;faderight,0.5);
};
t[#t+1] = LoadFont("Common Bold") .. {
@@ -54,5 +54,4 @@ t.BeginCommand=function(self)
self:SetUpdateFunction( Update );
end
return t
+5
View File
@@ -85,6 +85,11 @@ HelpText=
[ScreenGameplay]
HelpText=
[ScreenHeartEntry]
Enter Heart Rate=Enter Heart Rate
Song Length=Song Length
Heart Rate=Heart Rate
[ScreenEvaluation]
HelpText=&BACK; Exit &START; Move On &MENULEFT;+&MENURIGHT; or &SELECT; Snapshot
LifeDifficulty=Life Difficulty: %s
+5
View File
@@ -1628,6 +1628,11 @@ ActiveAttackListP2OffCommand=
[ScreenGameplayShared]
[ScreenHeartEntry]
HeartEntryEnabled=true
ShowHeader=true
ShowFooter=true
[ScreenEvaluation]
Class="ScreenEvaluation"
Fallback="ScreenWithMenuElements"
+2
View File
@@ -2439,6 +2439,7 @@ public:
p->m_Position.PushSelf(L);
return 1;
}
DEFINE_METHOD( GetLastGameplayDuration, m_DanceDuration )
DEFINE_METHOD( GetGameplayLeadIn, m_bGameplayLeadIn )
DEFINE_METHOD( GetCoins, m_iCoins )
DEFINE_METHOD( IsSideJoined, m_bSideIsJoined[Enum::Check<PlayerNumber>(L, 1)] )
@@ -2848,6 +2849,7 @@ public:
ADD_METHOD( GetSongFreeze );
ADD_METHOD( GetSongDelay );*/
ADD_METHOD( GetSongPosition );
ADD_METHOD( GetLastGameplayDuration );
ADD_METHOD( GetGameplayLeadIn );
ADD_METHOD( GetCoins );
ADD_METHOD( IsSideJoined );
+4
View File
@@ -271,6 +271,10 @@ public:
float m_fLastHasteUpdateMusicSeconds;
float m_fAccumulatedHasteSeconds;
// used by themes that support heart rate entry.
RageTimer m_DanceStartTime;
float m_DanceDuration;
// Random Attacks & Attack Mines
vector<RString> m_RandomAttacks;
+3
View File
@@ -2509,6 +2509,8 @@ void ScreenGameplay::HandleScreenMessage( const ScreenMessage SM )
else
SOUND->PlayOnceFromAnnouncer( "gameplay here we go normal" );
GAMESTATE->m_DanceStartTime.Touch();
m_Go.StartTransitioning( SM_None );
GAMESTATE->m_bGameplayLeadIn.Set( false );
m_DancingState = STATE_DANCING; // STATE CHANGE! Now the user is allowed to press Back
@@ -2558,6 +2560,7 @@ void ScreenGameplay::HandleScreenMessage( const ScreenMessage SM )
}
else if( SM == SM_LeaveGameplay )
{
GAMESTATE->m_DanceDuration= GAMESTATE->m_DanceStartTime.Ago();
// update dancing characters for win / lose
DancingCharacters *pDancers = NULL;
if( m_pSongBackground )
+2 -2
View File
@@ -113,7 +113,7 @@ void ScreenOptionsManageProfiles::BeginScreen()
Profile *pProfile = PROFILEMAN->GetLocalProfile( *s );
ASSERT( pProfile != NULL );
RString sCommand = ssprintf( "gamecommand;screen,ScreenOptionsEditProfile;profileid,%s;name,dummy", s->c_str() );
RString sCommand = ssprintf( "gamecommand;screen,ScreenOptionsCustomizeProfile;profileid,%s;name,dummy", s->c_str() );
OptionRowHandler *pHand = OptionRowHandlerUtil::Make( ParseCommands(sCommand) );
OptionRowDefinition &def = pHand->m_Def;
def.m_layoutType = LAYOUT_SHOW_ALL_IN_ROW;
@@ -380,7 +380,7 @@ void ScreenOptionsManageProfiles::ProcessMenuStart( const InputEventPlus & )
}
else
{
//ADD_ACTION( ProfileAction_Edit );
ADD_ACTION( ProfileAction_Edit );
ADD_ACTION( ProfileAction_Rename );
ADD_ACTION( ProfileAction_Delete );
}
+1
View File
@@ -1056,6 +1056,7 @@ void ThemeManager::PushMetric( Lua *L, const RString &sMetricsGroup, const RStri
if(sMetricsGroup == "" || sValueName == "")
{
LuaHelpers::ReportScriptError("PushMetric: Attempted to fetch metric with empty group name or empty value name.");
lua_pushnil(L);
return;
}
RString sValue = GetMetricRaw( g_pLoadedThemeData->iniMetrics, sMetricsGroup, sValueName );