local Dim = require("common.dimensions") local Wallpaper = require("components.wallpaper") local triggerSplashScreen = false local updateUrl, updateVersion = game.UpdateAvailable() local updateTimer = 0 local updateFlickerTime = 0.5 --seconds ---Draw special slider field --- --- Tip: You can specify a background using the gfx.FillColor or gfx.FillPaint --- functions before calling this function ---@param x number ---@param y number ---@param w number ---@param h number ---@param val number ---@param max? number optional maximum value (default 1.0) ---@param min? number optional minimum value (default 0.0) local function drawSlider(x, y, w, h, val, max, min) max = max or 1.0 min = min or 0.0 -- draw background gfx.BeginPath() gfx.Rect(x, y, w, h) gfx.Fill() -- draw frame gfx.BeginPath() gfx.Rect(x, y, w, h) gfx.StrokeColor(255, 255, 255) gfx.StrokeWidth(2) gfx.Stroke() if max == min then return -- would be an error case end -- draw indicator local pos = x + (val - min) * ((x + w - x) / (max - min)) --lerp gfx.BeginPath() gfx.Rect(pos, y, 4, h) gfx.FillColor(0, 255, 0) gfx.Fill() end ---Draw special text field ---@param x number ---@param y number ---@param text string ---@param color? table optional {R, G, B} integer array ---@param fontSize? integer optional font size local function drawText(x, y, text, color, fontSize) gfx.BeginPath() if color then gfx.FillColor(color[1], color[2], color[3]) end if fontSize then gfx.FontSize(fontSize) end gfx.Text(text, x, y) end local rootMenu = { { label = "INPUT CHECK", children = { {label = "START BUTTON", value = "OFF"}, {label = "A BUTTON", value = "OFF"}, {label = "B BUTTON", value = "OFF"}, {label = "C BUTTON", value = "OFF"}, {label = "D BUTTON", value = "OFF"}, {label = "FX L BUTTON", value = "OFF"}, {label = "FX R BUTTON", value = "OFF"}, { label = "VOL L", value = 0, render = function (deltaTime) drawSlider(64, 0, 128, 24, game.GetKnob(0)) end }, { label = "VOL R", value = 0, render = function (deltaTime) drawSlider(64, 0, 128, 24, game.GetKnob(1)) end } } }, { label = "SCREEN CHECK", children = { render = function (deltaTime) end } }, { label = "COLOR CHECK", children = { { label = "RED", render = function (deltaTime) end }, { label = "YELLOW", render = function (deltaTime) end }, { label = "GREEN", render = function (deltaTime) end }, { label = "CYAN", render = function (deltaTime) end }, { label = "BLUE", render = function (deltaTime) end }, { label = "MAGENTA", render = function (deltaTime) end }, { label = "WHITE", render = function (deltaTime) end }, }, }, { label = "VERSION INFORMATION", children = { {label = "USC BRANCH"}, {label = "USC VERSION"}, { label = "UPDATE", render = function (deltaTime) if updateVersion then local color = {255, 0, 0} updateTimer = updateTimer + deltaTime if (updateTimer % updateFlickerTime) < (updateFlickerTime / 2) then color = {255, 255, 0} end drawText(0, 0, "*UPDATE AVAILABLE (" .. updateVersion .. ")*", color) end end, handler = function () if updateUrl then Menu.Update() end end }, } }, {label = "IDOLS", children = {{label = "GRACEv6"}, {label = "NEARNOAHv6"}, {label = "IDKv6"}}}, { label = "LASER COLORS", children = { { label = "LEFT LASER", children = { {label = "BLUE", color = {0, 128, 255}}, {label = "PINK", color = {255, 0, 255}}, {label = "GREEN", color = {0, 255, 0}}, {label = "YELLOW", color = {255, 255, 0}}, }, }, { label = "RIGHT LASER", children = {{label = "BLUE"}, {label = "PINK"}, {label = "GREEN"}, {label = "YELLOW"}}, }, }, }, {label = "BACK TO TITLE SCREEN", type = "back", handler = function() triggerSplashScreen = true end}, } local menu = rootMenu local index = 1 local function render(deltaTime) Dim.updateResolution() Wallpaper.render() Dim.transformToScreenSpace() gfx.BeginPath() gfx.FillColor(0, 0, 0, 255) gfx.Rect(0, 0, 1080, 1920) gfx.Fill() gfx.LoadSkinFont("dfmarugoth.ttf") gfx.FillColor(255, 255, 255, 255) gfx.TextAlign(gfx.TEXT_ALIGN_CENTER + gfx.TEXT_ALIGN_MIDDLE) gfx.FontSize(24) gfx.BeginPath() gfx.Text("SERIVCE MENU", 1080 / 2, 128) gfx.Text("BT-A/BT-B = UP/DOWN", 1080 / 2, 1920 - 256 - 28) gfx.Text("START = SELECT", 1080 / 2, 1920 - 256) gfx.TextAlign(gfx.TEXT_ALIGN_LEFT + gfx.TEXT_ALIGN_MIDDLE) local yOffset = 256 for i, menuItem in ipairs(menu) do if menuItem.type == "back" then yOffset = yOffset + 28 * 2 else yOffset = yOffset + 28 end if (i == index) then if menuItem.color then gfx.FillColor(menuItem.color[1], menuItem.color[2], menuItem.color[3]) else gfx.FillColor(0, 255, 0, 255) end -- gfx.FillColor(0,128,255,255) else gfx.FillColor(255, 255, 255, 255) end gfx.BeginPath() gfx.Text(menuItem.label, 100, yOffset) end if (triggerSplashScreen) then triggerSplashScreen = false return {eventType = "switch", toScreen = "splash"} end end local onButtonPressed = function(button) local direction = 0 if button == game.BUTTON_STA then if (menu[index].handler) then menu[index].handler() elseif menu[index].children ~= nil then menu = menu[index].children index = 1 -- If the back button does not exist, add it. if (menu[#menu].type ~= "back") then menu[#menu + 1] = { type = "back", label = "BACK TO MAIN MENU", handler = function() index = 1 menu = rootMenu end, } end end elseif button == game.BUTTON_BTA then direction = -1 elseif button == game.BUTTON_BTB then direction = 1 end index = (index - 1 + direction) % #menu + 1 end return {render = render, onButtonPressed = onButtonPressed}