170 lines
4.8 KiB
Lua
170 lines
4.8 KiB
Lua
local love = assert( love )
|
|
local strings = require( "i18n" )
|
|
local settings = require( "settings" )
|
|
local t = {}
|
|
|
|
local currentSetting = false
|
|
local mouseOverSetting = false
|
|
local cachedSettingVal = nil
|
|
local menu = {}
|
|
local time = 0
|
|
for i, setting in ipairs( settings ) do
|
|
menu[i] = { x = 410, y = 10 + i * 25, w = love.graphics.getWidth() - 410 , h = 25 }
|
|
end
|
|
|
|
local terrain = love.graphics.newMesh( {
|
|
{ 0, 0, 0, 0, 1, 0.8, 0.8, 0.5, },
|
|
{ 0, 1, 0, 0.1, 1, 0.8, 0.8, 0.5, },
|
|
{ 1, 1, 0.1, 0.1, 0, 0, 0, 0.01, },
|
|
{ 1, 0, 0.1, 0, 0, 0, 0, 0.01, },
|
|
})
|
|
|
|
local function restoreCachedSetting()
|
|
if (not currentSetting) or (cachedSettingVal == nil) then return end
|
|
if settings[currentSetting].set then
|
|
settings[currentSetting]:set(cachedSettingVal)
|
|
else
|
|
settings[currentSetting].val = cachedSettingVal
|
|
end
|
|
cachedSettingVal = nil
|
|
end
|
|
|
|
function t.keypressed( key, code, isRepeat )
|
|
if currentSetting then
|
|
if code == "escape" or code == "return" then
|
|
if code == "escape" then restoreCachedSetting() end
|
|
currentSetting = false
|
|
return
|
|
elseif settings[currentSetting].type == "keybind" then
|
|
settings[currentSetting].val = code
|
|
currentSetting = false
|
|
end
|
|
return
|
|
end
|
|
|
|
if code == "return" then
|
|
local slideshow = require( "scenes.slideshow" )
|
|
local main = require( "scenes.main" )
|
|
return slideshow.play( strings.intro, main.play )
|
|
end
|
|
end
|
|
|
|
function t.wheelmoved(x, y)
|
|
if not currentSetting then return end
|
|
local setting = settings[currentSetting]
|
|
if setting.type == "number" then
|
|
if y > 0 then setting.val = setting.val + 1
|
|
elseif y < 0 then setting.val = setting.val - 1
|
|
end
|
|
end
|
|
if setting.type == "list" then
|
|
local list = setting.list
|
|
local inc
|
|
local next
|
|
if y > 0 then
|
|
inc = 1
|
|
next = 1
|
|
elseif y < 0 then
|
|
inc = -1
|
|
next = #list
|
|
end
|
|
local idx = setting.idx + inc
|
|
if not list[idx] then idx = next end
|
|
setting.idx = idx
|
|
setting:set( idx )
|
|
end
|
|
end
|
|
|
|
function t.mousemoved( x, y )
|
|
for i, button in ipairs( menu ) do
|
|
if
|
|
x > button.x and
|
|
y > button.y and
|
|
y <= button.y + button.h then
|
|
mouseOverSetting = i
|
|
return
|
|
end
|
|
end
|
|
mouseOverSetting = false
|
|
end
|
|
|
|
function t.mousepressed( x, y )
|
|
for i, button in ipairs( menu ) do
|
|
if
|
|
x > button.x and
|
|
y > button.y and
|
|
y <= button.y + button.h then
|
|
restoreCachedSetting()
|
|
currentSetting = i
|
|
if settings[i].get then cachedSettingVal = settings[i]:get()
|
|
else cachedSettingVal = settings[i].val end
|
|
mouseOverSetting = false
|
|
end
|
|
end
|
|
end
|
|
|
|
function t.update( dt )
|
|
time = time + dt
|
|
for i = 1, terrain:getVertexCount() do
|
|
--2: UV coordinate
|
|
local x, y = terrain:getVertexAttribute( i, 1 )
|
|
x = ( x > 0 ) and 0.5 or 0
|
|
y = ( y > 0 ) and 0.5 or 0
|
|
terrain:setVertexAttribute( i, 2, x - 0.04 * time, y - 0.05 * time )
|
|
end
|
|
end
|
|
|
|
do
|
|
local tex = love.graphics.newImage( "tex/terrain.png" )
|
|
tex:setFilter( "nearest", "nearest" )
|
|
tex:setWrap( "repeat", "repeat" )
|
|
terrain:setTexture( tex )
|
|
end
|
|
|
|
function t.draw()
|
|
|
|
love.graphics.setScissor( 0, 0, 400, love.graphics.getHeight() )
|
|
|
|
love.graphics.draw( terrain, 0, 0, 0, 400, love.graphics.getHeight() )
|
|
|
|
love.graphics.setScissor( 400, 0, love.graphics.getWidth() - 400, love.graphics.getHeight() )
|
|
|
|
love.graphics.setColor( 1, 0.1, 0.1, 0.2 )
|
|
if mouseOverSetting then
|
|
love.graphics.rectangle( "fill",
|
|
menu[mouseOverSetting].x,
|
|
menu[mouseOverSetting].y,
|
|
menu[mouseOverSetting].w,
|
|
menu[mouseOverSetting].h )
|
|
end
|
|
love.graphics.setColor( 1, 0.1, 0.1, 0.8 )
|
|
if currentSetting then
|
|
love.graphics.rectangle( "fill",
|
|
menu[currentSetting].x,
|
|
menu[currentSetting].y,
|
|
menu[currentSetting].w,
|
|
menu[currentSetting].h )
|
|
end
|
|
|
|
love.graphics.setColor( 1, 1, 1, 1 )
|
|
love.graphics.print( strings.settingsMenuTitle, 400 , 0 )
|
|
|
|
for i, setting in ipairs( settings ) do
|
|
local x, y = menu[i].x, menu[i].y
|
|
--love.graphics.rectangle( "line", x, y, love.graphics.getWidth() / 2, 25 )
|
|
love.graphics.print( strings[setting.setting], x + 10, y )
|
|
love.graphics.print( setting.val, x + 250, y )
|
|
end
|
|
|
|
if currentSetting then
|
|
love.graphics.print( strings.settingsMenuBackspace, 400, love.graphics.getHeight() - 2 * love.graphics.getFont():getHeight())
|
|
if settings[currentSetting].type == "number" then
|
|
love.graphics.print( strings.settingsMenuScroll, 400, love.graphics.getHeight() - 3 * love.graphics.getFont():getHeight())
|
|
end
|
|
else
|
|
love.graphics.print( strings.toContinue, 400, love.graphics.getHeight() - love.graphics.getFont():getHeight() )
|
|
end
|
|
|
|
end
|
|
|
|
return t |