TaggedEngine/states/menustate.lua
entar c5320c46de ACTUAL proper XML support (pushing the missing modules)
All the remaining stuff from silly billy is now removed
Changed the camera tween time
2025-08-11 08:14:10 +07:00

145 lines
4.4 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
MountedMod = 1 -- main
local modFolders = {
"characters",
"charts",
"fonts",
"images",
"modules",
"playableCharValues",
"resultScreens",
"songs",
"sounds",
"sprites",
"stages",
"states",
"videos",
"weeks"
}
return function()
---@type engine.state
local state = {}
local options = {
"storymode",
"freeplay",
"options",
"credits",
}
local optionStates = {
storymode = "weekstate",
freeplay = "freeplaystate",
options = "optionsstate",
credits = "creditsstate"
}
local evilCurrentOption = 1
local optionSprites = {}
local moving = false
function state.load()
love.window.setTitle("TaggedEngine: Main Menu")
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))
end
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
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("playstate", "shucks", "hard")
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(0, love.graphics.getHeight() / 5 + (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