From ba576dfc7791cd78c54681fa9aa26ba922959f9f Mon Sep 17 00:00:00 2001 From: Ishaan Bhardwaj Date: Tue, 22 Dec 2020 14:43:59 -0500 Subject: [PATCH] Allow sliders to be controlled with keyboard Credits to Phoenix Flare --- scene/game_config.lua | 71 ++++++++++++++++++++++++++++--------------- scene/tuning.lua | 28 +++++++++++++++++ 2 files changed, 75 insertions(+), 24 deletions(-) diff --git a/scene/game_config.lua b/scene/game_config.lua index aaf9eb7..f743e87 100644 --- a/scene/game_config.lua +++ b/scene/game_config.lua @@ -7,14 +7,17 @@ require 'libs.simple-slider' ConfigScene.options = { -- this serves as reference to what the options' values mean i guess? - {"manlock", "Manual Locking",{"Per ruleset","Per gamemode","Harddrop", "Softdrop"}}, - {"piece_colour", "Piece Colours", {"Per ruleset","Arika" ,"TTC"}}, - {"world_reverse","A Button Rotation", {"Left" ,"Auto" ,"Right"}}, - {"display_gamemode", "Display Gamemode", {"On", "Off"}}, - {"das_last_key", "DAS Switch", {"Default", "Instant"}}, - {"smooth_movement", "Smooth Piece Drop", {"On", "Off"}}, - {"synchroes_allowed", "Synchroes", {"Per ruleset", "On", "Off"}}, - {"diagonal_input", "Diagonal Input", {"On", "Off"}} + -- Format: {name in config, displayed name, uses slider?, options OR slider name} + {"manlock", "Manual Locking", false, {"Per ruleset", "Per gamemode", "Harddrop", "Softdrop"}}, + {"piece_colour", "Piece Colours", false, {"Per ruleset", "Arika", "TTC"}}, + {"world_reverse", "A Button Rotation", false, {"Left", "Auto", "Right"}}, + {"display_gamemode", "Display Gamemode", false, {"On", "Off"}}, + {"das_last_key", "DAS Switch", false, {"Default", "Instant"}}, + {"smooth_movement", "Smooth Piece Drop", false, {"On", "Off"}}, + {"synchroes_allowed", "Synchroes", false, {"Per ruleset", "On", "Off"}}, + {"diagonal_input", "Diagonal Input", false, {"On", "Off"}}, + {"sfx_volume", "SFX", true, "sfxSlider"}, + {"bgm_volume", "BGM", true, "bgmSlider"}, } local optioncount = #ConfigScene.options @@ -45,27 +48,35 @@ function ConfigScene:render() 0, 0, 0, 0.5, 0.5 ) - - love.graphics.setFont(font_3x5_3) - love.graphics.print("SFX Volume: " .. math.floor(self.sfxSlider:getValue()) .. "%", 75, 325) - love.graphics.print("BGM Volume: " .. math.floor(self.bgmSlider:getValue()) .. "%", 375, 325) love.graphics.setFont(font_3x5_4) love.graphics.print("GAME SETTINGS", 80, 40) + --Lazy check to see if we're on the SFX or BGM slider. Probably will need to be rewritten if more options get added. love.graphics.setColor(1, 1, 1, 0.5) - love.graphics.rectangle("fill", 20, 98 + self.highlight * 20, 170, 22) + if not ConfigScene.options[self.highlight][3] then + love.graphics.rectangle("fill", 20, 98 + self.highlight * 20, 170, 22) + else + love.graphics.rectangle("fill", 65 + (1+self.highlight-#self.options) * 300, 322, 215, 33) + end love.graphics.setFont(font_3x5_2) for i, option in ipairs(ConfigScene.options) do - love.graphics.setColor(1, 1, 1, 1) - love.graphics.printf(option[2], 40, 100 + i * 20, 150, "left") - for j, setting in ipairs(option[3]) do - love.graphics.setColor(1, 1, 1, config.gamesettings[option[1]] == j and 1 or 0.5) - love.graphics.printf(setting, 100 + 110 * j, 100 + i * 20, 100, "center") + if not option[3] then + love.graphics.setColor(1, 1, 1, 1) + love.graphics.printf(option[2], 40, 100 + i * 20, 150, "left") + for j, setting in ipairs(option[4]) do + love.graphics.setColor(1, 1, 1, config.gamesettings[option[1]] == j and 1 or 0.5) + love.graphics.printf(setting, 100 + 110 * j, 100 + i * 20, 100, "center") + end end end + love.graphics.setColor(1, 1, 1, 1) + love.graphics.setFont(font_3x5_3) + love.graphics.print("SFX Volume: " .. math.floor(self.sfxSlider:getValue()) .. "%", 75, 325) + love.graphics.print("BGM Volume: " .. math.floor(self.bgmSlider:getValue()) .. "%", 375, 325) + love.graphics.setColor(1, 1, 1, 0.75) self.sfxSlider:draw() self.bgmSlider:draw() @@ -83,13 +94,25 @@ function ConfigScene:onInputPress(e) playSE("cursor") self.highlight = Mod1(self.highlight+1, optioncount) elseif e.input == "left" or e.scancode == "left" then - playSE("cursor_lr") - local option = ConfigScene.options[self.highlight] - config.gamesettings[option[1]] = Mod1(config.gamesettings[option[1]]-1, #option[3]) + if not self.options[self.highlight][3] then + playSE("cursor_lr") + local option = ConfigScene.options[self.highlight] + config.gamesettings[option[1]] = Mod1(config.gamesettings[option[1]]-1, #option[4]) + else + playSE("cursor") + sld = self[self.options[self.highlight][4]] + sld.value = math.max(sld.min, math.min(sld.max, (sld:getValue() - 3) / (sld.max - sld.min))) + end elseif e.input == "right" or e.scancode == "right" then - playSE("cursor_lr") - local option = ConfigScene.options[self.highlight] - config.gamesettings[option[1]] = Mod1(config.gamesettings[option[1]]+1, #option[3]) + if not self.options[self.highlight][3] then + playSE("cursor_lr") + local option = ConfigScene.options[self.highlight] + config.gamesettings[option[1]] = Mod1(config.gamesettings[option[1]]+1, #option[4]) + else + playSE("cursor") + sld = self[self.options[self.highlight][4]] + sld.value = math.max(sld.min, math.min(sld.max, (sld:getValue() + 3) / (sld.max - sld.min)))--math.max(0, (math.floor(sld:getValue())+2)/(sld.max-sld.min)) + end elseif e.input == "menu_back" or e.scancode == "delete" or e.scancode == "backspace" then loadSave() scene = SettingsScene() diff --git a/scene/tuning.lua b/scene/tuning.lua index 05453e3..c6a74ba 100644 --- a/scene/tuning.lua +++ b/scene/tuning.lua @@ -5,11 +5,20 @@ TuningScene.title = "Tuning Settings" require 'load.save' require 'libs.simple-slider' +TuningScene.options = { + -- Serves as a reference for the options available in the menu. Format: {name in config, name as displayed if applicable, slider name} + {"das", "DAS", "dasSlider"}, + {"arr", "ARR", "arrSlider"}, +} + +local optioncount = #TuningScene.options + function TuningScene:new() DiscordRPC:update({ details = "In menus", state = "Changing tuning settings", }) + self.highlight = 1 self.dasSlider = newSlider(290, 225, 400, config.das, 0, 20, function(v) config.das = math.floor(v) end, {width=20}) self.arrSlider = newSlider(290, 325, 400, config.arr, 0, 6, function(v) config.arr = math.floor(v) end, {width=20}) @@ -27,6 +36,11 @@ function TuningScene:render() 0, 0, 0, 0.5, 0.5 ) + + love.graphics.setColor(1, 1, 1, 0.5) + love.graphics.rectangle("fill", 75, 73 + self.highlight * 100, 400, 33) + + love.graphics.setColor(1, 1, 1, 1) love.graphics.setFont(font_3x5_4) love.graphics.print("TUNING SETTINGS", 80, 40) @@ -48,6 +62,20 @@ function TuningScene:onInputPress(e) playSE("mode_decide") saveConfig() scene = SettingsScene() + elseif e.input == "up" or e.scancode == "up" then + playSE("cursor") + self.highlight = Mod1(self.highlight-1, optioncount) + elseif e.input == "down" or e.scancode == "down" then + playSE("cursor") + self.highlight = Mod1(self.highlight+1, optioncount) + elseif e.input == "left" or e.scancode == "left" then + playSE("cursor") + sld = self[self.options[self.highlight][3]] + sld.value = math.max(sld.min, math.min(sld.max, (sld:getValue() - 1) / (sld.max - sld.min))) + elseif e.input == "right" or e.scancode == "right" then + playSE("cursor") + sld = self[self.options[self.highlight][3]] + sld.value = math.max(sld.min, math.min(sld.max, (sld:getValue() + 1) / (sld.max - sld.min))) elseif e.input == "menu_back" or e.scancode == "delete" or e.scancode == "backspace" then loadSave() scene = SettingsScene()