ExperimentalGear/scripts/songselect/songwheel new.lua

150 lines
3.0 KiB
Lua

local window = {
isPortrait = false,
resX = 0,
resY = 0,
scale = 1,
w = 0,
h = 0,
set = function(this, doScale)
local resX, resY = game.GetResolution();
if ((this.resX ~= resX) or (this.resY ~= this.resY)) then
this.isPortrait = resY > resX;
this.w = (this.isPortrait and 1080) or 1920;
this.h = this.w * (resY / resX);
this.scale = resX / this.w;
this.resX = resX;
this.resY = resY;
end
if (doScale) then gfx.Scale(this.scale, this.scale); end
end,
};
local wheel = {
cache = { w = 0, h = 0 },
visibleSongs = 11,
margin = 13,
x = 0,
y = 0,
w = 0,
h = {
song = 0,
total = 0,
},
setSizes = function(this)
if ((this.cache.w ~= window.w) or (this.cache.h ~= window.h)) then
local marginTotal = this.margin * (this.visibleSongs - 1);
this.x = window.w / 2;
this.y = 0;
this.w = window.w / 2;
this.h.total = window.h - marginTotal;
this.h.song = this.h.total / this.visibleSongs;
this.cache.w = window.w;
this.cache.h = window.h;
end
end,
};
local displaying = {};
local jacketCache = {};
local currDiff = 1;
local currSong = 1;
local jacketFallback = gfx.CreateSkinImage('song_select/loading.png', 0);
local getJacket = function(diff)
if ((not jacketCache[diff.jacketPath])
or (jacketCache[diff.jacketPath] == jacketFallback)) then
jacketCache[diff.jacketPath] = gfx.LoadImageJob(
diff.jacketPath,
jacketFallback,
500,
500
);
end
return jacketCache[diff.jacketPath];
end
local setDisplaying = function()
local songs = songwheel.songs;
local enoughSongs = #songs >= wheel.visibleSongs;
displaying[5] = songs[currSong] or {};
for i = 1, 4 do
if (enoughSongs) then
displaying[5 - i] = songs[currSong - i] or songs[currSong + #songs - i];
else
displaying[5 - i] = songs[currSong - i] or {};
end
end
for i = 1, 3 do
if (enoughSongs) then
displaying[5 + i] = songs[currSong + i] or songs[currSong - #songs + i];
else
displaying[5 + i] = songs[currSong + i] or {};
end
end
end
local renderWheel = function()
local margin = wheel.margin;
local x = wheel.x;
local y = wheel.y;
local w = wheel.w;
local h = wheel.h.song;
for i, song in ipairs(displaying) do
local isSelected = i == 5;
gfx.BeginPath();
gfx.FillColor(0, 0, 0, (isSelected and 200) or 100);
gfx.Rect(x, y, w, h);
gfx.Fill();
if (song and song.difficulties) then
local jacket = getJacket(song.difficulties[currDiff] or song.difficulties[1]);
if (jacket) then
gfx.BeginPath();
gfx.ImageRect(x, y, h, h, jacket, (isSelected and 1) or 0.5, 0);
end
end
y = y + h + margin;
end
end
render = function(dt)
window:set(true);
wheel:setSizes();
setDisplaying();
renderWheel();
gfx.ForceRender();
end
set_index = function(newSong)
currSong = newSong;
end
set_diff = function(newDiff)
currDiff = newDiff;
end
songs_changed = function(withAll)
if (not withAll) then return; end
end