2021-07-25 20:10:06 +02:00
|
|
|
|
|
|
|
game.LoadSkinSample('song_transition_screen/transition_enter.wav');
|
|
|
|
|
2021-07-26 22:20:37 +02:00
|
|
|
local bgImage = gfx.CreateSkinImage("songtransition/bg.png", 0)
|
|
|
|
|
2021-07-29 19:00:31 +02:00
|
|
|
|
|
|
|
local difficultyNumbers;
|
|
|
|
|
2021-07-26 22:20:37 +02:00
|
|
|
local difficultyLabelImages = {
|
|
|
|
gfx.CreateSkinImage("songtransition/difficulty_labels/nov.png", 0),
|
|
|
|
gfx.CreateSkinImage("songtransition/difficulty_labels/adv.png", 0),
|
|
|
|
gfx.CreateSkinImage("songtransition/difficulty_labels/exh.png", 0),
|
|
|
|
gfx.CreateSkinImage("songtransition/difficulty_labels/mxm.png", 0),
|
2021-07-31 22:53:05 +02:00
|
|
|
gfx.CreateSkinImage("songtransition/difficulty_labels/inf.png", 0),
|
|
|
|
gfx.CreateSkinImage("songtransition/difficulty_labels/grv.png", 0),
|
|
|
|
gfx.CreateSkinImage("songtransition/difficulty_labels/hvn.png", 0),
|
|
|
|
gfx.CreateSkinImage("songtransition/difficulty_labels/vvd.png", 0),
|
2021-07-26 22:20:37 +02:00
|
|
|
}
|
|
|
|
|
2021-07-27 19:41:26 +02:00
|
|
|
local transitionTimer = 0;
|
|
|
|
local outTimer = 0
|
|
|
|
|
2021-07-25 20:10:06 +02:00
|
|
|
local resx, resy = game.GetResolution()
|
2021-07-27 19:41:26 +02:00
|
|
|
local desw, desh -- The resolution of the deisign
|
|
|
|
local scale;
|
|
|
|
|
2021-07-25 20:10:06 +02:00
|
|
|
local noJacket = gfx.CreateSkinImage("song_select/loading.png", 0)
|
|
|
|
|
|
|
|
local wasEnterSfxPlayed = false;
|
|
|
|
|
2021-07-27 19:41:26 +02:00
|
|
|
function resetLayoutInformation()
|
|
|
|
resx, resy = game.GetResolution()
|
|
|
|
-- portrait = resy > resx
|
|
|
|
-- desw = portrait and 1080 or 1920
|
|
|
|
-- desh = desw * (resy / resx)
|
|
|
|
desw = 1080
|
|
|
|
desh = 1920
|
|
|
|
scale = resx / desw
|
|
|
|
end
|
|
|
|
|
2021-07-29 19:00:31 +02:00
|
|
|
function load_number_image(path)
|
|
|
|
local images = {}
|
|
|
|
for i = 0, 9 do
|
|
|
|
images[i + 1] = gfx.CreateSkinImage(string.format("%s/%d.png", path, i), 0)
|
|
|
|
end
|
|
|
|
return images
|
|
|
|
end
|
|
|
|
|
|
|
|
function draw_number(x, y, alpha, num, digits, images, is_dim, scale, kern)
|
|
|
|
scale = scale or 1;
|
|
|
|
kern = kern or 1;
|
|
|
|
local tw, th = gfx.ImageSize(images[1])
|
|
|
|
tw = tw * scale;
|
|
|
|
th = th * scale;
|
|
|
|
x = x + (tw * (digits - 1)) / 2
|
|
|
|
y = y - th / 2
|
|
|
|
for i = 1, digits do
|
|
|
|
local mul = 10 ^ (i - 1)
|
|
|
|
local digit = math.floor(num / mul) % 10
|
|
|
|
local a = alpha
|
|
|
|
if is_dim and num < mul then
|
|
|
|
a = 0.4
|
|
|
|
end
|
|
|
|
gfx.BeginPath()
|
|
|
|
gfx.ImageRect(x, y, tw, th, images[digit + 1], a, 0)
|
|
|
|
x = x - (tw * kern)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2021-07-25 20:10:06 +02:00
|
|
|
function render(deltaTime)
|
|
|
|
if not wasEnterSfxPlayed then
|
|
|
|
game.PlaySample('song_transition_screen/transition_enter.wav');
|
|
|
|
wasEnterSfxPlayed = true;
|
|
|
|
end
|
2021-07-29 19:00:31 +02:00
|
|
|
if not difficultyNumbers then
|
|
|
|
difficultyNumbers = load_number_image('diff_num')
|
|
|
|
end
|
2021-07-25 20:10:06 +02:00
|
|
|
|
2021-07-27 19:41:26 +02:00
|
|
|
resetLayoutInformation()
|
|
|
|
gfx.ResetTransform();
|
|
|
|
gfx.Scale(scale, scale);
|
|
|
|
|
|
|
|
render_screen(transitionTimer);
|
|
|
|
|
|
|
|
transitionTimer = transitionTimer + deltaTime * 0.2
|
2021-07-25 20:10:06 +02:00
|
|
|
transitionTimer = math.min(transitionTimer,1)
|
2021-07-27 19:41:26 +02:00
|
|
|
|
|
|
|
if transitionTimer < 0.25 then
|
|
|
|
local whiteAlpha = math.max(0, (1-transitionTimer/0.25))
|
|
|
|
|
|
|
|
gfx.BeginPath();
|
|
|
|
gfx.FillColor(255,255,255,math.floor(255*whiteAlpha));
|
|
|
|
gfx.Rect(0,0,desw,desh);
|
|
|
|
gfx.Fill();
|
|
|
|
gfx.ClosePath();
|
|
|
|
end
|
|
|
|
|
|
|
|
if transitionTimer > 0.85 then
|
|
|
|
local blackAlpha = math.min(1, ((transitionTimer-0.85)/0.15))
|
|
|
|
|
|
|
|
gfx.BeginPath();
|
|
|
|
gfx.FillColor(0,0,0,math.floor(255*blackAlpha));
|
|
|
|
gfx.Rect(0,0,desw,desh);
|
|
|
|
gfx.Fill();
|
|
|
|
gfx.ClosePath();
|
|
|
|
end
|
|
|
|
|
2021-07-26 22:24:54 +02:00
|
|
|
return transitionTimer >= 1
|
2021-07-25 20:10:06 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
function render_out(deltaTime)
|
2021-07-27 19:41:26 +02:00
|
|
|
outTimer = outTimer + deltaTime * 0.2
|
|
|
|
outTimer = math.min(outTimer, 1)
|
|
|
|
|
2021-07-26 22:24:54 +02:00
|
|
|
return outTimer >= 1;
|
2021-07-25 20:10:06 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
function sign(x)
|
|
|
|
return x>0 and 1 or x<0 and -1 or 0
|
|
|
|
end
|
|
|
|
|
|
|
|
function render_screen(progress)
|
2021-07-27 19:41:26 +02:00
|
|
|
gfx.ImageRect(0, 0, 1080, 1920, bgImage,1,0);
|
2021-07-26 22:20:37 +02:00
|
|
|
|
|
|
|
|
2021-07-25 20:10:06 +02:00
|
|
|
local jacket = song.jacket == 0 and noJacket or song.jacket
|
2021-07-26 22:20:37 +02:00
|
|
|
gfx.BeginPath();
|
|
|
|
gfx.ImageRect(235, 385, 608, 608, jacket, 1, 0)
|
|
|
|
gfx.ClosePath();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
gfx.TextAlign(gfx.TEXT_ALIGN_CENTER + gfx.TEXT_ALIGN_MIDDLE)
|
|
|
|
|
2021-07-25 20:10:06 +02:00
|
|
|
gfx.FontSize(55)
|
2021-07-27 19:41:26 +02:00
|
|
|
gfx.Text(song.title,desw/2, 1114)
|
2021-07-26 22:20:37 +02:00
|
|
|
|
|
|
|
gfx.FontSize(30)
|
2021-07-27 19:41:26 +02:00
|
|
|
gfx.Text(song.artist, desw/2 , 1182)
|
2021-07-26 22:20:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
local EFFECTOR_LABEL_Y = 1288
|
|
|
|
local ILLUSTRATOR_LABEL_Y = 1347
|
|
|
|
|
|
|
|
gfx.FontSize(22)
|
|
|
|
|
2021-07-27 19:41:26 +02:00
|
|
|
gfx.Text(song.effector, desw/2+70 , EFFECTOR_LABEL_Y-1)
|
|
|
|
gfx.Text(song.illustrator, desw/2+70 , ILLUSTRATOR_LABEL_Y-3)
|
2021-07-26 22:20:37 +02:00
|
|
|
|
2021-07-29 19:00:31 +02:00
|
|
|
-- Draw song diff level
|
|
|
|
gfx.BeginPath();
|
|
|
|
draw_number(933, 1140, 1.0, song.level, 2, difficultyNumbers, false, 1, 1)
|
|
|
|
|
|
|
|
-- Draw song diff label (NOV/ADV/EXH/MXM/etc.)
|
2021-07-26 22:20:37 +02:00
|
|
|
gfx.BeginPath();
|
|
|
|
local diffLabelImage = difficultyLabelImages[song.difficulty+1];
|
|
|
|
local diffLabelW, diffLabelH = gfx.ImageSize(diffLabelImage);
|
|
|
|
gfx.ImageRect(952-diffLabelW/2, 1154-diffLabelH/2, diffLabelW, diffLabelH, diffLabelImage,1,0);
|
|
|
|
gfx.ClosePath();
|
|
|
|
|
|
|
|
gfx.Save();
|
|
|
|
gfx.FontSize(24)
|
|
|
|
gfx.LoadSkinFont('Digital-Serial-Bold.ttf')
|
|
|
|
gfx.TextAlign(gfx.TEXT_ALIGN_CENTER + gfx.TEXT_ALIGN_MIDDLE)
|
|
|
|
gfx.BeginPath();
|
|
|
|
|
|
|
|
gfx.Text('BPM', 127, 1140)
|
|
|
|
gfx.Text(song.bpm, 127, 1167)
|
|
|
|
|
|
|
|
gfx.ClosePath();
|
|
|
|
gfx.Restore();
|
|
|
|
|
|
|
|
-- for i=0,resx/50 do
|
|
|
|
-- local dir = sign((i % 2) - 0.5)
|
|
|
|
-- local yoff = dir * resy * (1 - progress)
|
|
|
|
-- gfx.Save()
|
|
|
|
-- gfx.Translate(0,yoff)
|
|
|
|
-- gfx.BeginPath()
|
|
|
|
-- gfx.Rect(60 * i, yoff, 60, resy)
|
|
|
|
-- gfx.FillColor(0,64, 150 + 25 * dir)
|
|
|
|
-- gfx.Fill()
|
|
|
|
-- gfx.Restore()
|
|
|
|
-- end
|
|
|
|
-- local y = (resy/2 + 100) * (math.sin(0.5 * progress * math.pi)^7) - 200
|
|
|
|
-- gfx.Save()
|
|
|
|
-- gfx.BeginPath()
|
|
|
|
-- gfx.Translate(resx/2, y)
|
|
|
|
-- gfx.Restore()
|
|
|
|
-- gfx.Translate(resx/2, resy - y - 50)
|
|
|
|
-- gfx.FillColor(255,255,255)
|
|
|
|
-- gfx.TextAlign(gfx.TEXT_ALIGN_CENTER + gfx.TEXT_ALIGN_TOP)
|
|
|
|
-- gfx.FontSize(80)
|
|
|
|
-- gfx.Text(song.title,0,0)
|
|
|
|
-- gfx.FontSize(55)
|
|
|
|
-- gfx.Text(song.artist,0,80)
|
2021-07-25 20:10:06 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
function reset()
|
|
|
|
transitionTimer = 0
|
|
|
|
resx, resy = game.GetResolution()
|
2021-07-27 19:41:26 +02:00
|
|
|
outTimer = 0
|
2021-07-25 20:10:06 +02:00
|
|
|
wasEnterSfxPlayed = false;
|
|
|
|
end
|