diff --git a/scripts/songselect/sortwheel.lua b/scripts/songselect/sortwheel.lua index 1d6503b..034fe9a 100644 --- a/scripts/songselect/sortwheel.lua +++ b/scripts/songselect/sortwheel.lua @@ -1,8 +1,12 @@ +require('common') +local Easing = require('common.easings'); + -- IMAGES local panelBgImage = gfx.CreateSkinImage('song_select/sort_wheel/bg.png', 0) local activeItemBgImage = gfx.CreateSkinImage( - 'song_select/sort_wheel/active_bg.png', 0) -local titleTextImage = gfx.CreateSkinImage('song_select/sort_wheel/title.png', 0) + 'song_select/sort_wheel/active_bg.png', 0) +local titleTextImage = + gfx.CreateSkinImage('song_select/sort_wheel/title.png', 0) resx, resy = game.GetResolution() local desw, desh = 1080, 1920; @@ -21,54 +25,39 @@ local SORT_ORDER_LABEL_TEXTS = { label = 'Title', asc = '# to A to Z to かな to 漢字', dsc = '漢字 to かな to Z to A to #' - }, - { - label = 'Score', - asc = 'Worst to best', - dsc = 'Best to worst' - }, - { - label = 'Date', - asc = 'Oldest to newest', - dsc = 'Newest to oldest' - }, - { - label = 'Badge', - asc = 'None to D to S', - dsc = 'S to D to None' - }, - { + }, {label = 'Score', asc = 'Worst to best', dsc = 'Best to worst'}, + {label = 'Date', asc = 'Oldest to newest', dsc = 'Newest to oldest'}, + {label = 'Badge', asc = 'None to D to S', dsc = 'S to D to None'}, { label = 'Artist', asc = '# to A to Z to かな to 漢字', dsc = '漢字 to かな to Z to A to #' - }, - { + }, { label = 'Effector', asc = '# to A to Z to かな to 漢字', dsc = '漢字 to かな to Z to A to #' - }, + } } +local transitionEnterReverse = false; +local transitionEnterScale = 0; +local transitionEnterOffsetX = 0; + function resetLayoutInformation() resx, resy = game.GetResolution() scale = resx / desw end function tableContains(table, value) - for i,v in ipairs(table) do - if v==value then return true end - end + for i, v in ipairs(table) do if v == value then return true end end return false; end -function drawButton(i,f,x,y) +function drawButton(i, f, x, y) local spaceAfter = (FONT_SIZE + MARGIN) local sortOrder = 'asc'; - if (string.find(f, 'v')) then - sortOrder = 'dsc' - end + if (string.find(f, 'v')) then sortOrder = 'dsc' end local label = f:gsub(' ^', '') label = label:gsub(' v', '') @@ -78,9 +67,7 @@ function drawButton(i,f,x,y) return 0; else -- If there is no active button with this label, if one with a label was already rendered, don't render this one - if (tableContains(renderedButtonLabels, label)) then - return 0; - end + if (tableContains(renderedButtonLabels, label)) then return 0; end table.insert(renderedButtonLabels, label); end @@ -88,7 +75,7 @@ function drawButton(i,f,x,y) local ascLabelText = 'Ascending' local dscLabelText = 'Descending' - for i,obj in ipairs(SORT_ORDER_LABEL_TEXTS) do + for i, obj in ipairs(SORT_ORDER_LABEL_TEXTS) do if (obj.label == label) then ascLabelText = obj.asc; dscLabelText = obj.dsc; @@ -96,23 +83,26 @@ function drawButton(i,f,x,y) end gfx.BeginPath() - gfx.ImageRect(x-182, y-38, 365, 82, activeItemBgImage, 1, 0) - + gfx.ImageRect(x - 182, y - 38, 365, 82, activeItemBgImage, 1, 0) + gfx.BeginPath() if sortOrder == 'asc' then - gfx.ImageRect(x-150, y+FONT_SIZE+SUB_MARGIN*2-31, 300, 67, activeItemBgImage, 1, 0) + gfx.ImageRect(x - 150, y + FONT_SIZE + SUB_MARGIN * 2 - 31, 300, 67, + activeItemBgImage, 1, 0) elseif sortOrder == 'dsc' then - gfx.ImageRect(x-150, y+FONT_SIZE+SUB_MARGIN*2+SUB_FONT_SIZE+SUB_MARGIN-31, 300, 67, activeItemBgImage, 1, 0) + gfx.ImageRect(x - 150, y + FONT_SIZE + SUB_MARGIN * 2 + + SUB_FONT_SIZE + SUB_MARGIN - 31, 300, 67, + activeItemBgImage, 1, 0) end gfx.Save() gfx.FontSize(SUB_FONT_SIZE) - gfx.Text(ascLabelText, x, y+FONT_SIZE+SUB_MARGIN*2); - gfx.Text(dscLabelText, x, y+FONT_SIZE+SUB_MARGIN*2+SUB_FONT_SIZE+SUB_MARGIN); + gfx.Text(ascLabelText, x, y + FONT_SIZE + SUB_MARGIN * 2); + gfx.Text(dscLabelText, x, + y + FONT_SIZE + SUB_MARGIN * 2 + SUB_FONT_SIZE + SUB_MARGIN); gfx.Restore() - - spaceAfter = spaceAfter + SUB_FONT_SIZE*2 + SUB_MARGIN*4; + spaceAfter = spaceAfter + SUB_FONT_SIZE * 2 + SUB_MARGIN * 4; end gfx.BeginPath(); @@ -121,46 +111,78 @@ function drawButton(i,f,x,y) return spaceAfter; end -function render(deltaTime, shown) - if not shown then return end - gfx.Save() - gfx.ResetTransform() +function tickTransitions(deltaTime) + -- ENTRY TRANSITION + if transitionEnterReverse then + if transitionEnterScale > 0 then + transitionEnterScale = transitionEnterScale - deltaTime / 0.25 -- transition should last for that time in seconds + else + transitionEnterScale = 0 + end + else + if transitionEnterScale < 1 then + transitionEnterScale = transitionEnterScale + deltaTime / 0.25 -- transition should last for that time in seconds + else + transitionEnterScale = 1 + end + end - renderedButtonLabels = {}; - resetLayoutInformation() - gfx.Scale(scale, scale) + transitionEnterOffsetX = Easing.inOutQuad(1 - transitionEnterScale) * 416 +end +function drawSortWheel(deltaTime) -- Draw the dark overlay above song wheel gfx.BeginPath(); - gfx.FillColor(0, 0, 0, 192); + gfx.FillColor(0, 0, 0, math.floor(transitionEnterScale * 192)); gfx.Rect(0, 0, desw, desh); gfx.Fill(); -- Draw the panel background gfx.BeginPath() - gfx.ImageRect(desw - 416, 0, 416, desh, panelBgImage, 1, 0) + gfx.ImageRect(desw - 416 + transitionEnterOffsetX, 0, 416, desh, + panelBgImage, 1, 0) gfx.LoadSkinFont("Digital-Serial-Bold.ttf"); gfx.FontSize(FONT_SIZE); gfx.FillColor(255, 255, 255, 255); gfx.TextAlign(gfx.TEXT_ALIGN_CENTER + gfx.TEXT_ALIGN_MIDDLE); + gfx.GlobalAlpha(transitionEnterScale) + -- Starting position of the first sort option - local x = 889; + local x = 889 + transitionEnterOffsetX; local y = desh / 2 - -- Center point - (#sorts / 2 / 2) * (FONT_SIZE + MARGIN) - -- Space taken up by half the sort options (we remove the duplicate one) - ((SUB_FONT_SIZE*2 + SUB_MARGIN*4) / 2); -- Space for taken by order options + (#sorts / 2 / 2) * (FONT_SIZE + MARGIN) - -- Space taken up by half the sort options (we remove the duplicate one) + ((SUB_FONT_SIZE * 2 + SUB_MARGIN * 4) / 2); -- Space for taken by order options -- Draw the title image gfx.BeginPath() - gfx.ImageRect(x-72, y-27, 144, 54, titleTextImage, 1, 0) + gfx.ImageRect(x - 72, y - 27, 144, 54, titleTextImage, 1, 0) y = y + (54 + MARGIN) - + -- Draw all the sorting options for i, f in ipairs(sorts) do - local spaceAfter = drawButton(i,f,x,y); + local spaceAfter = drawButton(i, f, x, y); y = y + spaceAfter; end +end + +function render(deltaTime, shown) + gfx.Save() + gfx.ResetTransform() + if not shown then + transitionEnterReverse = true + if (transitionEnterScale > 0) then drawSortWheel(deltaTime) end + else + transitionEnterReverse = false + drawSortWheel(deltaTime) + end + tickTransitions(deltaTime) + + renderedButtonLabels = {}; + resetLayoutInformation() + gfx.Scale(scale, scale) + gfx.Restore() end