TaggedEngine/states/menustate.lua

140 lines
4.5 KiB
Lua

local logging = require "modules.logging"
local files = require "modules.files"
local json = require "modules.json"
local defaultSettings = { -- The way its in the JSON
Downscroll = false,
Keybinds = {
"a",
"b",
"up",
"right"
},
Offset = 0
}
local currentOption = 1
local settings = {}
local data = love.filesystem.getSaveDirectory()
print(data)
local settings = files.read_file(data .. "/Settings.json")
print(settings)
if not settings then
os.execute("mkdir " .. data)
files.write_file(data .. "/Settings.json", json.stringify(defaultSettings))
print("Written")
else
settings = json.parse(settings)
--Incase the settings are old
for index, setting in next, defaultSettings do
if not settings[index] then
settings[index] = setting
end
end
files.write_file(data .. "/Settings.json", json.stringify(settings))
if settings.user then
print(logging.dump(settings))
gamejolt.authUser(settings.user.name, settings.user.key)
gamejolt.giveTrophy(278494)
end
end
return function()
---@type engine.state
local state = {}
local options = {
"storymode",
"freeplay",
"options",
"credits",
"login"
}
local optionStates = {
storymode = "weekstate",
freeplay = "freeplaystate",
options = "optionsstate",
credits = "creditsstate",
login = "loginstate"
}
local evilCurrentOption = -10
local optionSprites = {}
local moving = false
function state.load()
love.window.setTitle("TaggedEngine: Main Menu")
if not freaky then
freaky = love.audio.newSource("sounds/freakyMenu.ogg", "stream")
freaky:setVolume(0.25)
freaky:setLooping(true)
end
freaky:play()
if love.graphics.getWidth() ~= 1280 then
love.window.setMode(1280, 720)
end
local bg = Image("images/menuBG.png", 0)
bg.ui = false
bg.layer = -10
for index, option in next, options do
optionSprites[option] = { index = index }
optionSprites[option].sprite = Sprite(string.format("sprites/menu/%s.png", option),
string.format("sprites/menu/%s.xml", option))
optionSprites[option].sprite:PlayAnimation(string.format("%s idle", option), 24, true)
optionSprites[option].sprite.layer = 5
optionSprites[option].sprite.anchor = Vector2(0.5, 0.5)
if not optionSprites[option].sprite.quads[optionSprites[option].sprite.animation][0] then
optionSprites[option].sprite.starterFrame = 1
optionSprites[option].sprite.frame = 1
end
end
end
function state.keypressed(key)
if moving then return end
if key == "return" then
state.changeState(optionStates[options[currentOption]])
elseif key == "down" then
currentOption = next(options, currentOption) or 1
elseif key == "up" then
currentOption = options[currentOption - 1] and currentOption - 1 or #options
elseif key == "9" then
state.changeState("secretcodestate") --since we don't have shucks anymore... why not have a little fun, yeah?
end
end
function state.draw()
love.graphics.clear({ 1, 1, 1 })
render.drawSprites()
render.drawUI()
end
function state.update(delta)
render.updateSprites(delta)
evilCurrentOption = Lerp(evilCurrentOption, currentOption, .05)
for option, optionSprite in next, optionSprites do
local sprite = optionSprite.sprite
sprite.position = Vector2(640, love.graphics.getHeight() / 2 + (optionSprite.index - evilCurrentOption) * 150)
if optionSprite.index == currentOption and optionSprite.sprite.animation ~= string.format("%s selected", option) then
optionSprites[option].sprite:PlayAnimation(string.format("%s selected", option), 24, true)
elseif optionSprite.index ~= currentOption and optionSprite.sprite.animation ~= string.format("%s idle", option) then
optionSprites[option].sprite:PlayAnimation(string.format("%s idle", option), 24, true)
end
end
end
return state
end