local curIndex = 1 return function() ---@type engine.state local state = {} local dataFolder = love.filesystem.getSaveDirectory() local files = require("modules.files") local json = require("modules.json") local logging = require("modules.logging") local charValues = require("playableCharValues.playables") local playables = charValues.playables local curCharIndex if not curChar then curChar = playables[1] --this needs to be global curCharIndex = 1 else for index, playable in next, playables do if playable == curChar then curCharIndex = index end end end local songs = require(string.format("charts.songs-%s", curChar)) local unparsedData = files.read_file(dataFolder .. "/Data.json") local data = unparsedData and json.parse(unparsedData) or { songs = { bf = {} } } print(unparsedData, data) local chardata = json.parse(files.read_file(string.format("resultScreens/%s.json", curChar))) local animationAliases = {} local animationPositions = {} for index, anim in next, chardata.freeplayDJ.animations do animationAliases[anim.name] = anim.prefix animationPositions[anim.prefix] = Vector2(anim.offsets[1], anim.offsets[2]) end local icons = {} local capsules = {} local songButtons = {} local curSong = songs[1] local evilCurIndex = 1 local curDiffList = songs[1].difficulties local curDiff = songs[1].difficulties[1] local curDiffInd = 1 local startedPlaying = 0 local start = false local bfAtlas local confirm = love.audio.newSource("sounds/ui/confirmMenu.ogg", "static") local function run() Erect = curDiff == "erect" or curDiff == "nightmare" gameMode = "freeplaymode" render.destroyAllSprites() freaky:stop() state.changeState("playstate", curSong.name, curDiff, true) end local function setupIcons() for index, icon in next, icons do icon:Destroy() end for index, capsule in next, capsules do capsule:Destroy() end for index, button in next, songButtons do button:Destroy() end for index, song in next, songs do local icon = song.icon songButtons[song.name] = Button(Vector2(), Vector2(600, 130), function() if curIndex ~= index then curIndex = index else start = true startedPlaying = 0 icons[curSong.name]:PlayAnimation("confirm", 24, false) confirm:stop() confirm:play() bfAtlas:PlayAnimation(animationAliases.confirm) end end) local capsule = Sprite(string.format("images/freeplay/freeplayCapsule/capsule/freeplayCapsule_%s.png", curChar), string.format("images/freeplay/freeplayCapsule/capsule/freeplayCapsule_%s.json", curChar)) capsule.position = Vector2() capsule.layer = 70 capsule:PlayAnimation("mp3 capsule w backing NOT SELECTED", 24, true) -- for index, anim in next, capsule.quads do -- for index, quad in next, anim do -- quad.resize = Vector2(0.8,0.8) -- quad.offset = Vector2(quad.offset.x * 0.8, quad.offset.y * 0.8) -- end -- end capsules[song.name] = capsule if not icon then goto evilgoto end local spriteicon = Sprite(string.format("sprites/freeplay/icons/%s.png", icon), string.format("sprites/freeplay/icons/%s.json", icon)) spriteicon:PlayAnimation("idle", .005, false) spriteicon.frame = 1 spriteicon.layer = 10 for index, anim in next, spriteicon.quads do for index, quad in next, anim do quad.resize = Vector2(1.5,1.5) end end icons[song.name] = spriteicon ::evilgoto:: end end local flip = false local lastChange = 0 bfAtlas = Atlas(string.format("sprites/freeplay/freeplay-%s", curChar)) bfAtlas.layer = 20 local diffIMG local iconNum = math.random(1, 3) local curState = nil local stateLoaded = false local pressed = { false, false, false } local bg local logo local gf local charSwapSND = love.audio.newSource("sounds/CS_select.ogg", "stream") charSwapSND:setVolume(0.25) local left local arrow local arrow2 local scroll = love.audio.newSource("sounds/ui/scrollMenu.ogg", "static") local function setup() love.window.setTitle("TaggedEngine: Freeplay") if not freaky:isPlaying() then freaky:play() end start = false bg = Image("images/freeplay/freeplayBGweek1-bf.png", 0) bg.ui = false bg.layer = -10 bg.resize = Vector2(2,2) -- NO MORE GF left = Image("images/freeplay/yellow bg piece.png") left.layer = -5 arrow = Sprite( string.format("sprites/freeplay/freeplaySelector-%s.png", curChar), string.format("sprites/freeplay/freeplaySelector-%s.json", curChar) ) arrow.position.y = 0 arrow.position.x = 0 arrow.layer = 50 arrow.flipX = false arrow:PlayAnimation("arrow pointer loop", 24, true) SpriteButton(arrow, function() if curDiffList[curDiffInd - 1] then curDiff = curDiffList[curDiffInd - 1] curDiffInd = curDiffInd - 1 else curDiff = curDiffList[#curDiffList] curDiffInd = #curDiffList end diffIMG:PlayAnimation(curDiff, 24, true) scroll:stop() scroll:play() end, true) arrow2 = Sprite( string.format("sprites/freeplay/freeplaySelector-%s.png", curChar), string.format("sprites/freeplay/freeplaySelector-%s.json", curChar) ) arrow2.position.y = 0 arrow2.position.x = 310 arrow2.layer = 50 arrow2.flipX = true arrow2:PlayAnimation("arrow pointer loop", 24, true) SpriteButton(arrow2, function() if curDiffList[curDiffInd + 1] then curDiff = curDiffList[curDiffInd + 1] curDiffInd = curDiffInd + 1 else curDiff = curDiffList[1] curDiffInd = 1 end diffIMG:PlayAnimation(curDiff, 24, true) scroll:stop() scroll:play() end, true) -- render.preLoad( -- "sprites/freeplay/freeplaySelector_pico.png", -- "sprites/freeplay/freeplaySelector.json" -- ) diffIMG = Sprite("images/diff/diffList.png", "images/diff/diffList.json") --look there was a different plan going in diffIMG:PlayAnimation(curDiff, 24, false) diffIMG.position = Vector2(50, 10) diffIMG.layer = 2 bfAtlas:PlayAnimation(animationAliases.intro) setupIcons() end local font = love.graphics.newFont("fonts/FridayNightFunkin-Regular.ttf", 40) local smallerFont = love.graphics.newFont("fonts/FridayNightFunkin-Regular.ttf", 20) function state.update(dt) if start then startedPlaying = startedPlaying + dt if startedPlaying > .5 then run() end end if bfAtlas.atlas.libraries and bfAtlas.atlas.frame >= bfAtlas.atlas:getTimelineLength(bfAtlas.atlas:getSymbolTimeline(bfAtlas.atlas.symbol)) then bfAtlas:PlayAnimation(animationAliases.idle) end bfAtlas.position = Vector2(animationPositions[bfAtlas.atlas.symbol].x, animationPositions[bfAtlas.atlas.symbol].y) for index, song in next, songs do local icon = icons[song.name] if icon then icon.position = Vector2(430 - (50 * math.abs(index - evilCurIndex)), love.graphics:getHeight() / 2 + (200 * (index - evilCurIndex - .5))) end local capsule = capsules[song.name] capsule.position = Vector2(380 - (50 * math.abs(index - evilCurIndex)), love.graphics:getHeight() / 2 + (200 * (index - evilCurIndex - .5) - 25)) local button = songButtons[song.name] if button then button:SetPosition(Vector2(380 - (50 * math.abs(index - evilCurIndex)), love.graphics:getHeight() / 2 + (200 * (index - evilCurIndex - .5) - 25)) ) end end render.cameraPosition = Vector2(0, 0) render.updateSprites(dt) end function state.draw() love.graphics.setDefaultFilter("nearest", "nearest") render.drawSprites() evilCurIndex = Lerp(evilCurIndex, curIndex, .3) for index, song in next, songs do local color = index == curIndex and {chardata.colors[1] >= 0.1 and chardata.colors[1] - 0.1 or 0, chardata.colors[2] >= 0.1 and chardata.colors[2] - 0.1 or 0, chardata.colors[3] >= 0.1 and chardata.colors[3] - 0.1 or 0} or chardata.colors love.graphics.print({ color, song.name }, font, 700 - (50 * math.abs(index - evilCurIndex)), love.graphics:getHeight() / 2 + (200 * (index - evilCurIndex - .5)), 0, 1, 1, 200) end -- if bfAtlas.atlas.symbol == curChar .. " slide in" then -- bfAtlas:draw(curChar == "bf" and 695 or 690, curChar == "bf" and 315 or 320, 0, flip and -1 or 1, 1) -- else -- bfAtlas:draw(curChar == "bf" and 700 or 1150, curChar == "bf" and 300 or 190, 0, flip and -1 or 1, 1) -- end if data.songs[curChar] and data.songs[curChar][curSong.name] and data.songs[curChar][curSong.name][curDiff] then local text = string.format("Accuracy: %s, Score: %s, Rank: %s", tostring(data.songs[curChar][curSong.name][curDiff].accuracy):sub(1, 5), data.songs[curChar][curSong.name][curDiff].score, data.songs[curChar][curSong.name][curDiff].rank) love.graphics.print({ { 1, 1, 1 }, text }, smallerFont, 1280 - text:len() * 10, 0) end end function state.keypressed(key, un, is) if key == "return" then start = true startedPlaying = 0 icons[curSong.name]:PlayAnimation("confirm", 24, false) confirm:stop() confirm:play() bfAtlas:PlayAnimation(animationAliases.confirm) elseif key == "down" then curIndex, curSong = next(songs, curIndex) if not curSong then curIndex, curSong = next(songs) curDiffList = curSong.difficulties else curDiffList = curSong.difficulties end curDiffInd = 1 curDiff = curDiffList[1] diffIMG:PlayAnimation(curDiff, 24, true) scroll:stop() scroll:play() elseif key == "up" then --the solution was so stupid easy if songs[curIndex - 1] then curSong = songs[curIndex - 1] curDiffList = songs[curIndex - 1].difficulties curDiffInd = 1 curDiff = curDiffList[curDiffInd] curIndex = curIndex - 1 else curSong = songs[#songs] curIndex = #songs curDiffList = songs[curIndex].difficulties curDiffInd = 1 curDiff = curDiffList[curDiffInd] end curDiffInd = 1 curDiff = curDiffList[1] diffIMG:PlayAnimation(curDiff, 24, true) scroll:stop() scroll:play() elseif key == "right" then if curDiffList[curDiffInd + 1] then curDiff = curDiffList[curDiffInd + 1] curDiffInd = curDiffInd + 1 else curDiff = curDiffList[1] curDiffInd = 1 end diffIMG:PlayAnimation(curDiff, 24, true) scroll:stop() scroll:play() elseif key == "left" then if curDiffList[curDiffInd - 1] then curDiff = curDiffList[curDiffInd - 1] curDiffInd = curDiffInd - 1 else curDiff = curDiffList[#curDiffList] curDiffInd = #curDiffList end diffIMG:PlayAnimation(curDiff, 24, true) scroll:stop() scroll:play() elseif key == "p" then --changes character to/from pico hopefully arrow:Destroy() -- flip = true curCharIndex, curChar = next(playables, curCharIndex) if not curCharIndex then curCharIndex = 1 curChar = playables[1] end songs = require(string.format("charts.songs-%s", curChar)) --change which catalogue is available json.parse(files.read_file(string.format("resultScreens/%s.json", curChar))) chardata = json.parse(files.read_file(string.format("resultScreens/%s.json", curChar))) animationAliases = {} animationPositions = {} for index, anim in next, chardata.freeplayDJ.animations do animationAliases[anim.name] = anim.prefix animationPositions[anim.prefix] = Vector2(anim.offsets[1], anim.offsets[2]) end bfAtlas:Destroy() bfAtlas = Atlas(string.format("sprites/freeplay/freeplay-%s", curChar)) bfAtlas:PlayAnimation(animationAliases.intro) bfAtlas.layer = 20 arrow = Sprite( string.format("sprites/freeplay/freeplaySelector-%s.png", curChar), string.format("sprites/freeplay/freeplaySelector-%s.json", curChar) ) arrow.position.y = 0 arrow.position.x = 0 arrow.layer = 50 arrow.flipX = false arrow:PlayAnimation("arrow pointer loop", 24, true) arrow2 = Sprite( string.format("sprites/freeplay/freeplaySelector-%s.png", curChar), string.format("sprites/freeplay/freeplaySelector-%s.json", curChar) ) arrow2.position.y = 0 arrow2.position.x = 310 arrow2.layer = 50 arrow2.flipX = true arrow2:PlayAnimation("arrow pointer loop", 24, true) flip = false --reset the index's nd shit curSong = songs[1] curIndex = 1 evilCurIndex = 1 curDiffInd = 1 curDiffList = songs[curIndex].difficulties curDiff = curDiffList[1] diffIMG:PlayAnimation(curDiff, 24, true) charSwapSND:stop() charSwapSND:play() lastChange = 0 setupIcons() elseif key == "escape" then state.changeState("menustate") end end function state.load() setup() love.window.setMode(1280, 720, { fullscreen = false, resizable = false, centered = true, borderless = false }) end function state.wheelmoved(x, y) print("Mousewheel move") if y > 0 then if songs[curIndex - 1] then curSong = songs[curIndex - 1] curDiffList = songs[curIndex - 1].difficulties curDiffInd = 1 curDiff = curDiffList[curDiffInd] curIndex = curIndex - 1 else curSong = songs[#songs] curIndex = #songs curDiffList = songs[curIndex].difficulties curDiffInd = 1 curDiff = curDiffList[curDiffInd] end curDiffInd = 1 curDiff = curDiffList[1] diffIMG:PlayAnimation(curDiff, 24, true) scroll:stop() scroll:play() else curIndex, curSong = next(songs, curIndex) if not curSong then curIndex, curSong = next(songs) curDiffList = curSong.difficulties else curDiffList = curSong.difficulties end curDiffInd = 1 curDiff = curDiffList[1] diffIMG:PlayAnimation(curDiff, 24, true) scroll:stop() scroll:play() end end function state.mousepressed(x, y) buttons.processMouse(x, y) end return state end