local love = love local draw = love.draw local update = love.update local mousepressed = love.mousepressed local keypressed = love.keypressed local mousemoved = love.mousemoved local ExitMenu options = options or {} local options = options local optionList = {} local option if not options.initialized then options.initialized = true local keyBindCallback = function(self, code) self.value = code or self.value end options.optionValues = { { name = "options", value = "", callback = function(self) end }, { name = "fullscreen", value = false, callback = function(self) self.value = not(self.value) love.window.setFullscreen( self.value ) love.event.push( "resize", love.graphics.getWidth(), love.graphics.getHeight() ) end }, { name = "high contrast", value = false, callback = function(self, code) if code == "backspace" then return end self.value = not( self.value ) return false end }, { name = "volume", value = 1.0, callback = function(self, code) local isIncreasing if (code == "left" or code == "a") then isIncreasing = -1 elseif (code == "right" or code == "d") then isIncreasing = 1 else return false end self.value = math.max( 0, math.min( 2, self.value + (isIncreasing * 0.05 ))) love.audio.setVolume( self.value ) return true end }, { name = "left", value = "a", callback = keyBindCallback }, { name = "right", value = "d", callback = keyBindCallback }, { name = "up", value = "w", callback = keyBindCallback }, { name = "down", value = "s", callback = keyBindCallback } } do for i, ov in ipairs( options.optionValues ) do options[ ov.name ] = ov end end end local optionIdx = 1 local isAwaitingKey = false local font = love.graphics.newFont( 32 ) local function Draw() love.graphics.setColor( 1,1,1,1 ) if options["high contrast"].value then love.graphics.setColor( 0, 0, 0, 1 ) end for i, option in ipairs( options.optionValues ) do love.graphics.printf( option.name, font, 100, i * 50, 1000, "left") love.graphics.printf( tostring( option.value ), font, -100, i * 50, love.graphics.getWidth(), "right") end local w = love.graphics.getWidth() love.graphics.setColor( 1,1,1,0.5 ) if isAwaitingKey then love.graphics.rectangle( "fill", w - 200, optionIdx * 50, 100, 48, 10, 10 ) else love.graphics.rectangle( "fill", 100, optionIdx * 50, 250, 48, 10, 10 ) end end local function SelectNextOption() optionIdx = math.min( #options.optionValues, optionIdx + 1 ) option = options.optionValues[ optionIdx] end local function SelectPreviousOption() optionIdx = math.max( 1, optionIdx - 1 ) option = options.optionValues[ optionIdx] end local function MouseMoved( x, y ) optionIdx = math.min( #options.optionValues, math.max( 1, math.floor( y / 50 ) )) option = options.optionValues[ optionIdx] if ( x > love.graphics.getWidth() - 200 ) then isAwaitingKey = true else isAwaitingKey = false end end local function KeyPress(key, code, isRepeat) if not( isAwaitingKey ) then if code == "backspace" then return ExitMenu() end if optionIdx and code == "return" or code == "right" then isAwaitingKey = true return end if code == "down" then return SelectNextOption() end if code == "up" then return SelectPreviousOption() end else if code == "backspace" then isAwaitingKey = false end if code == "escape" then return end isAwaitingKey = (options.optionValues[optionIdx]):callback( code ) end end local function MousePressed( ) return KeyPress( ) end local function EnterMenu() draw = love.draw update = love.update mousepressed = love.mousepressed keypressed = love.keypressed mousemoved = love.mousemoved love.mouse.setRelativeMode( false ) love.draw = Draw love.keypressed = KeyPress love.update = function() end love.mousemoved = MouseMoved love.mousepressed = MousePressed end function ExitMenu() love.mouse.setRelativeMode( true ) love.mousemoved = mousemoved love.keypressed = keypressed love.mousepressed = mousepressed love.update = update love.draw = draw end options.EnterMenu = EnterMenu options.ExitMenu = ExitMenu return options