TaggedEngine/states/freeplaystate.lua

379 lines
14 KiB
Lua

local curIndex = 1
return function()
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 playableOffsets = charValues.offsets
local playableFlips = charValues.flips
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 function setupIcons()
for index, icon in next, icons do
icon:Destroy()
end
for index, capsule in next, capsules do
capsule:Destroy()
end
for index, song in next, songs do
local icon = song.icon
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
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
icons[song.name] = spriteicon
::evilgoto::
end
end
local flip = false
local lastChange = 0
local startedPlaying = 0
local start = false
local curSong = songs[1]
local evilCurIndex = 1
local curDiffList = songs[1].difficulties
local bfAtlas = love.animate.newTextureAtlas()
local picoAtlas
local curDiff = songs[1].difficulties[1]
local curDiffInd = 1
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 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)
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)
-- 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 = Atlas(string.format("sprites/freeplay/freeplay-%s", curChar))
bfAtlas.layer = 20
bfAtlas:PlayAnimation(animationAliases.intro)
setupIcons()
end
local function run()
Erect = curDiff == "erect"
gameMode = "freeplaymode"
render.destroyAllSprites()
freaky:stop()
state.changeState("playstate", curSong.name, curDiff, true)
end
local font = love.graphics.newFont("fonts/FridayNightFunkin-Regular.ttf", 40)
local smallerFont = love.graphics.newFont("fonts/FridayNightFunkin-Regular.ttf", 20)
local scroll = love.audio.newSource("sounds/ui/scrollMenu.ogg", "static")
local confirm = love.audio.newSource("sounds/ui/confirmMenu.ogg", "static")
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)
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)
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))
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({ { 0, 0, 0 }, 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
return state
end