multiplayer stubbed to default until working impl

This commit is contained in:
Hersi 2023-11-09 12:09:44 +01:00
parent 9dc6f598ae
commit b766b99324
2 changed files with 1409 additions and 408 deletions

View File

@ -1,38 +1,6 @@
local json = require("common.json") local json = require("common.json")
local common = require('common.util'); local sound = require('common.sound');
local Sound = require("common.sound")
local difbar = require("components.diff_rectangle");
local spinnybg = require('components.background');
local msg = game.GetSkinSetting("MSG");
local normname = game.GetSkinSetting("username")
local crew = game.GetSkinSetting("single_idol")
local m_jacket = gfx.CreateSkinImage("multi/lobby/multi_jacket.png", 1);
local m_base_panel = gfx.CreateSkinImage("multi/lobby/multi_base_panel.png", 1);
local m_anim = gfx.CreateSkinImage("multi/lobby/panel_laser.png", 1);
local m_panel = gfx.CreateSkinImage("multi/lobby/matching_panel.png", 1);
local m_s_panel = gfx.CreateSkinImage("multi/lobby/song_panel.png", 1);
local m_host_panel = gfx.CreateSkinImage("multi/lobby/user_panel.png", 1);
local m_bpm_panel = gfx.CreateSkinImage("multi/lobby/lane_speed_panel.png", 1);
local m_info_panel = gfx.CreateSkinImage("multi/lobby/button_panel.png", 1);
local headerMatchingImage = gfx.CreateSkinImage("titlescreen/entry.png", 1);
local m_4pb_panels = gfx.CreateSkinImage("multi/lobby/user_panel_2.png", 1);
local ready_bt = gfx.CreateSkinImage("multi/lobby/READY.png", 1);
local bg = gfx.CreateSkinImage("multi/lobby/bg.png", 1);
local bg_graid1 = gfx.CreateSkinImage("multi/lobby/gradient_bottom.png", 1);
local bg_graid2 = gfx.CreateSkinImage("multi/lobby/gradient_top.png", 1);
local idolAnimation = gfx.LoadSkinAnimation('crew/anim/'..crew, 1 / 30, 0, true);
local idolAnimTransitionScale = 0;
if not idolAnimation then
game.Log("Crew folder crew/anim/"..crew.." does not exist.", game.LOGGER_WARNING)
end
local resX,resY = game.GetResolution() local resX,resY = game.GetResolution()
@ -43,15 +11,6 @@ local buttonWidth = resX*(3/4);
local buttonHeight = 75; local buttonHeight = 75;
local buttonBorder = 2; local buttonBorder = 2;
local portrait local portrait
local jacket_size;
local BAR_ALPHA = 191;
local HEADER_HEIGHT = 100
local resx, resy = game.GetResolution()
local desw = 1080
local desh = 1920
local scale;
game.LoadSkinSample("click-02") game.LoadSkinSample("click-02")
game.LoadSkinSample("click-01") game.LoadSkinSample("click-01")
@ -65,7 +24,6 @@ local user_id = nil;
local jacket = 0; local jacket = 0;
local all_ready; local all_ready;
local user_ready; local user_ready;
local go;
local hard_mode = false; local hard_mode = false;
local rotate_host = false; local rotate_host = false;
local start_game_soon = false; local start_game_soon = false;
@ -75,20 +33,19 @@ local missing_song = false;
local placeholderJacket = gfx.CreateSkinImage("song_select/loading.png", 0) local placeholderJacket = gfx.CreateSkinImage("song_select/loading.png", 0)
local did_exit = false; local did_exit = false;
local irHeartbeatRequested = false; local diffColors = {{0,0,255}, {0,255,0}, {255,0,0}, {255, 0, 255}}
local irText = ''
local grades = { local grades = {
{["max"] = 6900000, ["image"] = gfx.CreateSkinImage("common/grades/D.png", 0)}, {["max"] = 6999999, ["image"] = gfx.CreateSkinImage("common/grades/D.png", 0)},
{["max"] = 7900000, ["image"] = gfx.CreateSkinImage("common/grades/C.png", 0)}, {["max"] = 7999999, ["image"] = gfx.CreateSkinImage("common/grades/C.png", 0)},
{["max"] = 8600000, ["image"] = gfx.CreateSkinImage("common/grades/B.png", 0)}, {["max"] = 8699999, ["image"] = gfx.CreateSkinImage("common/grades/B.png", 0)},
{["max"] = 8900000, ["image"] = gfx.CreateSkinImage("common/grades/A.png", 0)}, {["max"] = 8999999, ["image"] = gfx.CreateSkinImage("common/grades/A.png", 0)},
{["max"] = 9200000, ["image"] = gfx.CreateSkinImage("common/grades/A+.png", 0)}, {["max"] = 9299999, ["image"] = gfx.CreateSkinImage("common/grades/A+.png", 0)},
{["max"] = 9400000, ["image"] = gfx.CreateSkinImage("common/grades/AA.png", 0)}, {["max"] = 9499999, ["image"] = gfx.CreateSkinImage("common/grades/AA.png", 0)},
{["max"] = 9600000, ["image"] = gfx.CreateSkinImage("common/grades/AA+.png", 0)}, {["max"] = 9699999, ["image"] = gfx.CreateSkinImage("common/grades/AA+.png", 0)},
{["max"] = 9700000, ["image"] = gfx.CreateSkinImage("common/grades/AAA.png", 0)}, {["max"] = 9799999, ["image"] = gfx.CreateSkinImage("common/grades/AAA.png", 0)},
{["max"] = 9800000, ["image"] = gfx.CreateSkinImage("common/grades/AAA+.png", 0)}, {["max"] = 9899999, ["image"] = gfx.CreateSkinImage("common/grades/AAA+.png", 0)},
{["max"] = 9900000, ["image"] = gfx.CreateSkinImage("common/grades/S.png", 0)} {["max"] = 99999999, ["image"] = gfx.CreateSkinImage("common/grades/S.png", 0)}
} }
local badges = { local badges = {
@ -119,262 +76,9 @@ end
local SERVER = game.GetSkinSetting("multi.server") local SERVER = game.GetSkinSetting("multi.server")
local drawIdol = function(deltaTime)
if idolAnimation then
local idolAnimTickRes = gfx.TickAnimation(idolAnimation, deltaTime);
if idolAnimTickRes == 1 then
gfx.GlobalAlpha(idolAnimTransitionScale);
idolAnimTransitionScale = idolAnimTransitionScale + 1 / 60;
if (idolAnimTransitionScale > 1) then
idolAnimTransitionScale = 1;
end
gfx.ImageRect(0, 0, resX,resY, idolAnimation, 1, 0);
gfx.GlobalAlpha(1);
end
end
end
songjacket = function() -- self explanatory
if portrait then
split = resX
jacket_size = math.min(resX/4, resY/4);
song_x_off = 0;
else
split = resX/2
jacket_size = math.min(resX/2, resY/2);
song_x_off = 1/2*resX;
end
local jw , jh = gfx.ImageSize(m_jacket);
gfx.BeginPath();
gfx.ImageRect(333, 1284, jw/1.18, jh/1.18, m_jacket,1,0);
end
m_own_info = function()
local x = 0
local y = 1310
gfx.BeginPath();
gfx.FontSize(40)
gfx.ImageRect(x, y, 343/1.18, 361/1.18,m_host_panel,1,0)
gfx.Text(normname, x+20, y+78)
gfx.FontSize(22)
gfx.Text(irText, x+5, y+288);
end
m_base_part = function() -- just the images which slide up
local jw , jh = gfx.ImageSize(m_base_panel);
gfx.BeginPath();
gfx.ImageRect(1, 1250, jw/1.17, jh/1.18, m_base_panel,1,0);
gfx.BeginPath();
gfx.ImageRect(1, 1250, jw/1.17, jh/1.18, m_anim,1,0);
gfx.LoadSkinFont('Digital-Serial-Bold.ttf')
gfx.FillColor(255,255,255)
gfx.TextAlign(gfx.TEXT_ALIGN_LEFT, gfx.TEXT_ALIGN_LEFT)
gfx.FontSize(24)
end
m_part = function() -- room name part
local jw , jh = gfx.ImageSize(m_panel);
gfx.BeginPath();
gfx.ImageRect(429, 1142, jw/1.175, jh/1.18, m_panel,1,0);
gfx.FontSize(32);
gfx.LoadSkinFont('Digital-Serial-Bold.ttf')
gfx.TextAlign(gfx.TEXT_ALIGN_LEFT, gfx.TEXT_ALIGN_MIDDLE)
gfx.Text(selected_room.name, 575, 1179)
end
m_s_part = function () -- song info panel
local jw , jh = gfx.ImageSize(m_s_panel);
gfx.BeginPath();
gfx.ImageRect(283, 1187, jw/1.175, jh/1.18, m_s_panel,1,0);
gfx.TextAlign(gfx.TEXT_ALIGN_CENTER + gfx.TEXT_ALIGN_LEFT);
gfx.FillColor(255,255,255)
gfx.FontSize(32)
if selected_song == nil then
if host == user_id then
gfx.Text("NO SONG", 535, 1236)
gfx.Text("NO ARIST", 535, 1275)
gfx.FontSize(24)
gfx.Text("NO EFFECTOR", 746, 1378)
gfx.Text("NO ILLUSTRATOR", 746, 1406)
gfx.TextAlign(gfx.TEXT_ALIGN_LEFT + gfx.TEXT_ALIGN_TOP)
gfx.FontSize(22)
gfx.Text("BPM ?",780, 1307)
else
if missing_song then
gfx.Text("MISSING SONG!!!!", 535, 1235)
gfx.Text("MISSING ARIST!!!!", 535, 1275)
gfx.FontSize(24)
gfx.Text("MISSING EFFECTOR!!!!", 744, 1378)
gfx.Text("MISSING ILLUSTRATOR!!!!", 744, 1406)
else
gfx.Text("HOST IS SELECTING SONG", 535, 1235)
gfx.Text(" ", 535, 1275)
gfx.FontSize(24)
gfx.Text(" ", 746, 1378)
gfx.Text(" ", 746, 1406)
gfx.TextAlign(gfx.TEXT_ALIGN_LEFT + gfx.TEXT_ALIGN_TOP)
gfx.FontSize(22)
gfx.Text("BPM ?",780, 1307)
end
end
else
if selected_song.min_bpm ~= selected_song.max_bpm then
gfx.TextAlign(gfx.TEXT_ALIGN_LEFT + gfx.TEXT_ALIGN_TOP)
gfx.FontSize(22);
gfx.Text("BPM",777, 1307)
gfx.FontSize(26);
gfx.Text(string.format("%.0f - %.0f",
selected_song.min_bpm, selected_song.max_bpm),
780 + 77, 1307)
else
gfx.TextAlign(gfx.TEXT_ALIGN_LEFT + gfx.TEXT_ALIGN_TOP)
gfx.FontSize(22);
gfx.Text("BPM",777, 1307)
gfx.Text(string.format("%.0f",
selected_song.min_bpm),
780 + 77, 1307)
end
gfx.TextAlign(gfx.TEXT_ALIGN_CENTER + gfx.TEXT_ALIGN_LEFT);
gfx.FontSize(32);
gfx.Text(selected_song.title, 535, 1236)
gfx.Text(selected_song.artist, 535, 1275)
gfx.FontSize(24)
gfx.Text(selected_song.effector, 746, 1377)
gfx.Text(selected_song.illustrator, 746, 1406)
end
end
m_bpm_part = function () -- bpm and lane speed
local jw , jh = gfx.ImageSize(m_bpm_panel);
gfx.BeginPath();
gfx.ImageRect(0, 1692, jw/1.18, jh/1.18, m_bpm_panel,1,0);
gfx.FontSize(32)
if selected_song == nil then
if host == user_id then
gfx.TextAlign(gfx.TEXT_ALIGN_LEFT + gfx.TEXT_ALIGN_TOP)
gfx.FontSize(32)
gfx.Text("BPM ?",76, 1788)
gfx.Text("LANE-SPEED ?",76, 1832)
else
if missing_song then
gfx.TextAlign(gfx.TEXT_ALIGN_LEFT + gfx.TEXT_ALIGN_TOP)
gfx.FontSize(32)
gfx.Text("BPM ?",76, 1788)
gfx.Text("LANE-SPEED ?",76, 1832)
else
gfx.TextAlign(gfx.TEXT_ALIGN_LEFT + gfx.TEXT_ALIGN_TOP)
gfx.FontSize(32)
gfx.Text("BPM ?",76, 1788)
gfx.Text("LANE-SPEED ?",76, 1832)
end
end
end
if selected_song ~= nil then
gfx.FillColor(255,255,255)
gfx.FontSize(32);
gfx.TextAlign(gfx.TEXT_ALIGN_LEFT + gfx.TEXT_ALIGN_TOP)
if selected_song.min_bpm ~= selected_song.max_bpm then
gfx.Text("BPM",76, 1788)
gfx.Text(string.format("%.0f - %.0f",
selected_song.min_bpm, selected_song.max_bpm),
76 + 75, 1788)
gfx.Text("LANE-SPEED",76, 1832)
gfx.Text(string.format("%.2f = %.0f",
selected_song.hispeed, selected_song.speed_bpm * selected_song.hispeed),
76 + 175, 1832)
else
gfx.FontSize(32);
gfx.Text("BPM",76, 1788)
gfx.Text(string.format("%.0f",
selected_song.min_bpm),
76 + 75, 1788)
gfx.Text("LANE-SPEED",76, 1832)
gfx.Text(string.format("%.2f = %.0f",
selected_song.hispeed, selected_song.speed_bpm * selected_song.hispeed),
76 + 175, 1832)
end
end
end
m_info_part = function () -- the info panel
local jw , jh = gfx.ImageSize(m_info_panel);
gfx.BeginPath();
gfx.ImageRect(475, 1590, jw/1.18, jh/1.18, m_info_panel,1,0);
local check = 770
draw_checkbox("Excessive", check - 200, 1625, toggle_hard, hard_mode, not start_game_soon)
draw_checkbox("Mirror Mode",check - 15, 1625, toggle_mirror, mirror_mode, not start_game_soon)
draw_checkbox("Rotate Host",check + 175, 1625, toggle_rotate, do_rotate,
(owner == user_id or host == user_id) and not start_game_soon)
for i, user in ipairs(lobby_users) do
buttonY = 1775
local side_button_off = 0
if owner == user_id and user.id ~= user_id then
draw_button("K",525+side_button_off, buttonY, 50, function()
kick_user(user);
end)
side_button_off = 60;
end
if (owner == user_id or host == user_id) and user.id ~= host then
draw_button("H",525+side_button_off, buttonY+85, 50, function()
change_host(user);
end)
end
end
end
user_setup = function () -- (semi new) user layering
local distance = 350
for i, user in ipairs(lobby_users) do
if i == 1 then
draw_user(user, -distance, 1142-360/1.2, 420/1.2, 330/1.2, i,215,245.5)
elseif i == 2 then
draw_user(user, 16, 1142-360/1.2, 420/1.2, 330/1.2, i,215,245.5)
elseif i == 3 then
draw_user(user, 16+distance, 1142-360/1.2, 420/1.2, 330/1.2, i,215,245.5)
elseif i == 4 then
draw_user(user, 16+distance+distance, 1142-360/1.2, 420/1.2, 330/1.2, i,215,245.5)
elseif i > 4 then
draw_user(user, 16+distance+distance+distance+distance, 1142-360/1.2, 420/1.2, 330/1.2, i,215,245.5)
end
end
end
function drawHeader()
gfx.BeginPath();
gfx.FillColor(0, 0, 0, BAR_ALPHA);
gfx.Rect(0, 0, desw, HEADER_HEIGHT);
gfx.Fill();
gfx.ClosePath()
gfx.ImageRect(desw/2 - 200, HEADER_HEIGHT/2 - 20, 400, 40, headerMatchingImage, 1, 0)
end
mouse_clipped = function(x,y,w,h) mouse_clipped = function(x,y,w,h)
return mposx > x and mposy > y and mposx < x+w and mposy < y+h; return mposx > x and mposy > y and mposx < x+w and mposy < y+h;
@ -441,6 +145,8 @@ draw_button_color = function(name, x, y, buttonWidth, hoverindex,r,g,b, olr,olg,
end; end;
draw_checkbox = function(text, x, y, hoverindex, current, can_click) draw_checkbox = function(text, x, y, hoverindex, current, can_click)
local rx = x - (buttonWidth / 2);
local ty = y - (buttonHeight / 2);
gfx.BeginPath(); gfx.BeginPath();
if can_click then if can_click then
@ -450,7 +156,6 @@ draw_checkbox = function(text, x, y, hoverindex, current, can_click)
end end
gfx.TextAlign(gfx.TEXT_ALIGN_CENTER + gfx.TEXT_ALIGN_MIDDLE); gfx.TextAlign(gfx.TEXT_ALIGN_CENTER + gfx.TEXT_ALIGN_MIDDLE);
gfx.FontSize(35); gfx.FontSize(35);
gfx.FillColor(201,0,0);
gfx.Text(text, x, y) gfx.Text(text, x, y)
local xmin,ymin,xmax,ymax = gfx.TextBounds(x, y, text); local xmin,ymin,xmax,ymax = gfx.TextBounds(x, y, text);
@ -458,55 +163,121 @@ draw_checkbox = function(text, x, y, hoverindex, current, can_click)
local sx = xmin - 40; local sx = xmin - 40;
local sy = y - 15; local sy = y - 15;
if can_click and mouse_clipped(xmin-10, ymin, xmax-xmin, ymax-ymin) then gfx.StrokeColor(0,128,255);
if can_click and (mouse_clipped(sx, sy, 31, 30) or mouse_clipped(xmin-10, ymin, xmax-xmin, ymax-ymin)) then
hovered = hoverindex; hovered = hoverindex;
gfx.StrokeColor(255,128,0);
end end
gfx.Rect(sx, y - 15, 30, 30)
gfx.StrokeWidth(2)
gfx.Stroke()
if current then if current then
-- Draw checkmark -- Draw checkmark
gfx.BeginPath(); gfx.BeginPath();
gfx.FillColor(0, 236, 0); gfx.MoveTo(sx+5, sy+10);
gfx.Text(text, x, y) gfx.LineTo(sx+15, y+5);
gfx.Fill(); gfx.LineTo(sx+35, y-15);
gfx.StrokeWidth(5)
gfx.StrokeColor(0,255,0);
gfx.Stroke()
end end
end; end;
--look into user changing -- IMPORTANT !!! local userHeight = 100
draw_user = function(user, x, y , w, h, rank, breadx,bready)
local name = user.name draw_user = function(user, x, y, buttonWidth, rank)
local showthing = false local buttonHeight = userHeight;
local rx = x - (buttonWidth / 2);
local ty = y - (buttonHeight / 2);
gfx.BeginPath();
gfx.FillColor(256,128,255);
gfx.Rect(rx - buttonBorder,
ty - buttonBorder,
buttonWidth + (buttonBorder * 2),
buttonHeight + (buttonBorder * 2));
gfx.Fill();
gfx.BeginPath();
if host == user.id then
gfx.FillColor(80,0,0);
else
gfx.FillColor(0,0,40);
end
gfx.Rect(rx, ty, buttonWidth, buttonHeight);
gfx.Fill();
gfx.BeginPath();
gfx.FillColor(255,255,255);
gfx.TextAlign(gfx.TEXT_ALIGN_LEFT + gfx.TEXT_ALIGN_MIDDLE);
gfx.FontSize(40);
local name = user.name;
if user.id == user_id then if user.id == user_id then
name = name name = name
end end
if user.id == host then if user.id == host then
name = name name = name..' (host)'
elseif user.missing_map then
name = name..' (NO CHART)'
elseif user.ready then elseif user.ready then
showthing = true name = name..' (ready)'
elseif not user.ready then
showthing = false
end
gfx.TextAlign(gfx.TEXT_ALIGN_LEFT + gfx.TEXT_ALIGN_MIDDLE);
gfx.FillColor(255,255,255)
gfx.FontSize(42)
gfx.FontSize(30)
gfx.BeginPath();
gfx.ImageRect(x, y ,w, h,m_4pb_panels,1,0)
gfx.Text(name, x+135, y+51)
if showthing == true then
local jw , jh = gfx.ImageSize(ready_bt);
gfx.BeginPath();
gfx.ImageRect(x+breadx, y+bready, jw/1.18, jh/1.18, ready_bt,1,0);
elseif showthing == false then
local jw , jh = gfx.ImageSize(ready_bt);
gfx.BeginPath();
gfx.ImageRect(x+breadx, y+bready, jw/1.18, jh/1.18, ready_bt,0,0);
end end
if user.score ~= nil then
name = '#'..rank..' '..name
end
first_y = y - 28
second_y = y + 28
gfx.Text(name, x - buttonWidth/2 + 5, first_y);
if user.score ~= nil then
gfx.FillColor(255,255,0)
gfx.TextAlign(gfx.TEXT_ALIGN_RIGHT + gfx.TEXT_ALIGN_MIDDLE);
local combo_text = ' '..user.combo..'x'
gfx.Text(combo_text, x+buttonWidth/2 - 5, second_y-5);
local xmin,ymin,xmax,ymax = gfx.TextBounds(x+buttonWidth/2 - 5, second_y-5, combo_text);
local score_text = ' '..string.format("%08d",user.score);
gfx.FillColor(255,255,255)
gfx.Text(score_text, xmin, second_y-5);
xmin,ymin,xmax,ymax = gfx.TextBounds(xmin, second_y-5, score_text);
if user.grade == nil then
for i,v in ipairs(grades) do
if v.max > user.score then
user.grade = v.image
break
end
end
end
if user.badge == nil and user.clear > 1 then
user.badge = badges[user.clear];
end
gfx.BeginPath()
local iw, ih = gfx.ImageSize(user.grade)
local iar = iw/ih
local grade_height = buttonHeight/2 - 10
gfx.ImageRect(xmin - iar * grade_height, second_y - buttonHeight/4 , iar * grade_height, grade_height, user.grade, 1, 0)
end
if user.level ~= 0 then
gfx.FillColor(255,255,0)
gfx.TextAlign(gfx.TEXT_ALIGN_LEFT + gfx.TEXT_ALIGN_MIDDLE);
local level_text = 'Lvl '..user.level..' '
gfx.Text(level_text, x-buttonWidth/2 + 5, second_y-5)
local xmin,ymin,xmax,ymax = gfx.TextBounds(x-buttonWidth/2 + 5, second_y-5, level_text);
if user.badge then
gfx.BeginPath()
local iw, ih = gfx.ImageSize(user.badge)
local iar = iw/ih;
local badge_height = buttonHeight/2 - 10
gfx.ImageRect(xmax+5, second_y - buttonHeight/4 , iar * badge_height, badge_height, user.badge, 1, 0)
end
end
end; end;
function render_loading() function render_loading()
@ -529,8 +300,30 @@ function render_loading()
end end
function render_info() function render_info()
gfx.Save()
gfx.ResetTransform()
gfx.BeginPath()
gfx.MoveTo(0, resY)
gfx.LineTo(550, resY)
gfx.LineTo(500, resY - 65)
gfx.LineTo(0, resY - 65)
gfx.ClosePath()
gfx.FillColor(33,33,33)
gfx.Fill()
gfx.FillColor(255,255,255)
gfx.TextAlign(gfx.TEXT_ALIGN_LEFT, gfx.TEXT_ALIGN_BOTTOM)
gfx.FontSize(70)
gfx.Text("Multiplayer", 3, resY - 15)
local xmin,ymin,xmax,ymax = gfx.TextBounds(3, resY - 3, "Multiplayer")
gfx.FontSize(20)
gfx.Text(MULTIPLAYER_VERSION, xmax + 13, resY - 15)
--gfx.Text('Server: '..'', xmax + 13, resY - 15)
draw_button_color("Settings", 500-60, resY-25, 120, function()
mpScreen.OpenSettings();
end, 33,33,33, 33,33,33)
gfx.Restore()
if searchStatus then if searchStatus then
gfx.BeginPath() gfx.BeginPath()
gfx.FillColor(255,255,255) gfx.FillColor(255,255,255)
gfx.FontSize(20); gfx.FontSize(20);
@ -538,29 +331,58 @@ function render_info()
gfx.Text(searchStatus, 3, 3) gfx.Text(searchStatus, 3, 3)
end end
end end
draw_diff_icon = function(diff, x, y, w, h, selected)
draw_diff_icon = function(diff, x, y, w, h) local shrinkX = w/4
difbar.render(deltaTime, x, y, 1, diff.difficulty, diff.level); local shrinkY = h/4
if selected then
gfx.FontSize(h/2)
shrinkX = w/6
shrinkY = h/6
else
gfx.FontSize(math.floor(h / 3))
end
gfx.BeginPath()
gfx.RoundedRectVarying(x+shrinkX,y+shrinkY,w-shrinkX*2,h-shrinkY*2,0,0,0,0)
gfx.FillColor(15,15,15)
gfx.StrokeColor(table.unpack(diffColors[diff.difficulty + 1]))
gfx.StrokeWidth(2)
gfx.Fill()
gfx.Stroke()
gfx.FillColor(255,255,255)
gfx.TextAlign(gfx.TEXT_ALIGN_MIDDLE + gfx.TEXT_ALIGN_CENTER)
gfx.FastText(tostring(diff.level), x+(w/2),y+(h/2))
end end
local doffset = 0; local doffset = 0;
local timer = 0; local timer = 0;
local possy = 1095; draw_cursor = function(x,y,rotation,width)
local possx = 150; gfx.Save()
gfx.BeginPath();
gfx.Translate(x,y)
gfx.Rotate(rotation)
gfx.StrokeColor(255,128,0)
gfx.StrokeWidth(4)
gfx.Rect(-width/2, -width/2, width, width)
gfx.Stroke()
gfx.Restore()
end
draw_diffs = function(diffs, x, y, w, h, selectedDiff) draw_diffs = function(diffs, x, y, w, h, selectedDiff)
local diffWidth = w/2 local diffWidth = w/2.5
local diffHeight = w/2 local diffHeight = w/2.5
local diffCount = #diffs local diffCount = #diffs
gfx.Scissor(x+84 + possx,y + possy,w/2.451,h) gfx.Scissor(x,y,w,h)
for i = math.max(selectedDiff - 2, 1), math.max(selectedDiff - 1,1) do for i = math.max(selectedDiff - 2, 1), math.max(selectedDiff - 1,1) do
local diff = diffs[i] local diff = diffs[i]
local xpos = x + ((w/2 - diffWidth/2) + (selectedDiff - i + doffset)*(-0.8*diffWidth)) local xpos = x + ((w/2 - diffWidth/2) + (selectedDiff - i + doffset)*(-0.8*diffWidth))
if i ~= selectedDiff then if i ~= selectedDiff then
draw_diff_icon(diff, xpos + possx, y + possy, diffWidth, diffHeight, false) draw_diff_icon(diff, xpos, y, diffWidth, diffHeight, false)
end end
end end
@ -569,14 +391,21 @@ draw_diffs = function(diffs, x, y, w, h, selectedDiff)
local diff = diffs[i] local diff = diffs[i]
local xpos = x + ((w/2 - diffWidth/2) + (selectedDiff - i + doffset)*(-0.8*diffWidth)) local xpos = x + ((w/2 - diffWidth/2) + (selectedDiff - i + doffset)*(-0.8*diffWidth))
if i ~= selectedDiff then if i ~= selectedDiff then
draw_diff_icon(diff, xpos + possx, y + possy, diffWidth, diffHeight, false) draw_diff_icon(diff, xpos, y, diffWidth, diffHeight, false)
end end
end end
local diff = diffs[selectedDiff] local diff = diffs[selectedDiff]
local xpos = x + ((w/2 - diffWidth/2) + (doffset)*(-0.8*diffWidth)) local xpos = x + ((w/2 - diffWidth/2) + (doffset)*(-0.8*diffWidth))
draw_diff_icon(diff, xpos + possx, y + possy, diffWidth, diffHeight, true) draw_diff_icon(diff, xpos, y, diffWidth, diffHeight, true)
gfx.BeginPath()
gfx.FillColor(0,128,255)
gfx.Rect(x,y+10,2,diffHeight-h/6)
gfx.Fill()
gfx.BeginPath()
gfx.Rect(x+w-2,y+10,2,diffHeight-h/6)
gfx.Fill()
gfx.ResetScissor() gfx.ResetScissor()
draw_cursor(x + w/2, y +diffHeight/2, timer * math.pi, diffHeight / 1.5)
end end
set_diff = function(oldDiff, newDiff) set_diff = function(oldDiff, newDiff)
@ -621,7 +450,7 @@ function draw_rooms(y, h)
local ypos = y + (h/2) - offsetY; local ypos = y + (h/2) - offsetY;
local status = room.current..'/'..room.max local status = room.current..'/'..room.max
if room.ingame then if room.ingame then
status = status..' (IN MATCH)' status = status..' (In Game)'
end end
if room.password then if room.password then
status = status..' <P>' status = status..' <P>'
@ -658,49 +487,73 @@ change_selected_room = function(off)
selected_room_index = new_index; selected_room_index = new_index;
end end
local IR_HeartbeatResponse = function(res)
if res.statusCode == IRData.States.Success then
irText = res.body.serverName .. ' ' .. res.body.irVersion;
else
game.Log("Can't connect to IR!", game.LOGGER_WARNING)
end
end
local IR_Handle = function()
if not irHeartbeatRequested then
IR.Heartbeat(IR_HeartbeatResponse)
irHeartbeatRequested = true;
end
end
function render_lobby(deltaTime) function render_lobby(deltaTime)
local jw , jh = gfx.ImageSize(bg); local jacket_size;
gfx.BeginPath();
gfx.ImageRect(0, 0, resX, resY, bg,1,0);
drawIdol(deltaTime)
gfx.BeginPath();
gfx.ImageRect(0, 0, resX, resY, bg_graid1,1,0);
gfx.ImageRect(0, 0, resX, resY, bg_graid2,1,0);
drawHeader()
gfx.BeginPath();
m_base_part()
m_own_info() -- split is how the screen is split or not
user_setup() if portrait then
split = resX
jacket_size = math.min(resX/3, resY/3);
user_y_off = 375+jacket_size + 70
song_x_off = 0;
else
split = resX/2
jacket_size = math.min(resX/2, resY/2);
user_y_off = 0
song_x_off = 1/2*resX;
end
m_info_part() gfx.FillColor(255,255,255)
m_part() gfx.TextAlign(gfx.TEXT_ALIGN_CENTER, gfx.TEXT_ALIGN_BOTTOM)
m_s_part() gfx.FontSize(70)
m_bpm_part() gfx.Text(selected_room.name, resX/2, 50)
songjacket()
-- === Users ===
gfx.Text("Users", split/2, user_y_off+100)
buttonY = user_y_off + 125 + userHeight/2
for i, user in ipairs(lobby_users) do
draw_user(user, split/2, buttonY, split*3/4, i)
local side_button_off = 0
if owner == user_id and user.id ~= user_id then
draw_button("K",split/2 + split*3/8+10+25, buttonY, 50, function()
kick_user(user);
end)
side_button_off = 60;
end
if (owner == user_id or host == user_id) and user.id ~= host then
draw_button("H",split/2 + split*3/8+10+25+side_button_off, buttonY, 50, function()
change_host(user);
end)
end
buttonY = buttonY + userHeight
end
gfx.TextAlign(gfx.TEXT_ALIGN_CENTER + gfx.TEXT_ALIGN_MIDDLE);
gfx.FillColor(255,255,255)
-- === song select ===
gfx.FontSize(60)
gfx.Text("Selected Song:", split/2 + song_x_off, 100)
gfx.FontSize(40)
if selected_song == nil then if selected_song == nil then
if host == user_id then
gfx.Text("Select song:", split/2 + song_x_off, 175)
else
if missing_song then
gfx.Text("Missing song!!!!", split/2 + song_x_off, 175)
else
gfx.Text("Host is selecting song", split/2 + song_x_off, 175)
end
end
if jacket == 0 then if jacket == 0 then
jacket = placeholderJacket jacket = placeholderJacket
end end
else else
gfx.Text(selected_song.title, split/2 + song_x_off, 175)
draw_diffs(selected_song.all_difficulties, split/2 + song_x_off - 150, 200, 300, 100, selected_song.diff_index+1) draw_diffs(selected_song.all_difficulties, split/2 + song_x_off - 150, 200, 300, 100, selected_song.diff_index+1)
if selected_song.jacket == nil or selected_song.jacket == placeholderJacket then if selected_song.jacket == nil or selected_song.jacket == placeholderJacket then
@ -710,22 +563,75 @@ function render_lobby(deltaTime)
end end
gfx.Save() gfx.Save()
gfx.BeginPath() gfx.BeginPath()
gfx.Translate(481, 1303+jacket_size/2) gfx.Translate(split/2 + song_x_off, 325+jacket_size/2)
gfx.ImageRect(-jacket_size/2,-jacket_size/2,jacket_size,jacket_size,jacket,1,0) gfx.ImageRect(-jacket_size/2,-jacket_size/2,jacket_size,jacket_size,jacket,1,0)
if mouse_clipped(481-jacket_size/2,1423+-jacket_size/2,jacket_size,jacket_size) and host == user_id then if mouse_clipped(split/2 + song_x_off-jacket_size/2, 325, jacket_size,jacket_size) and host == user_id then
hovered = function() hovered = function()
missing_song = false missing_song = false
mpScreen.SelectSong() mpScreen.SelectSong()
end end
end end
gfx.Restore() gfx.Restore()
if start_game_soon then
draw_button("Game starting...", split/2 + song_x_off, 375+jacket_size, 600, function() end);
else
if host == user_id then
if selected_song == nil or not selected_song.self_picked then
draw_button_color("Select song", split/2 + song_x_off, 375+jacket_size, 600, function()
missing_song = false
mpScreen.SelectSong()
end, 0, math.min(255, 128 + math.floor(32 * math.cos(timer * math.pi))), 0, 0,128,255);
elseif user_ready and all_ready then
draw_button("Start game", split/2 + song_x_off, 375+jacket_size, 600, start_game)
elseif user_ready and not all_ready then
draw_button("Waiting for others", split/2 + song_x_off, 375+jacket_size, 600, function()
missing_song = false
mpScreen.SelectSong()
end)
else
draw_button("Ready", split/2 + song_x_off, 375+jacket_size, 600, ready_up);
end
elseif host == nil then
draw_button("Waiting for game to end", split/2 + song_x_off, 375+jacket_size, 600, function() end);
elseif missing_song then
draw_button("Missing Song!", split/2 + song_x_off, 375+jacket_size, 600, function() end);
elseif selected_song ~= nil then
if user_ready then
draw_button("Cancel", split/2 + song_x_off, 375+jacket_size, 600, ready_up);
else
draw_button("Ready", split/2 + song_x_off, 375+jacket_size, 600, ready_up);
end
else
draw_button("Waiting for host", split/2 + song_x_off, 375+jacket_size, 600, function() end);
end
end
draw_checkbox("Excessive", split/2 + song_x_off - 150, 375+jacket_size + 70, toggle_hard, hard_mode, not start_game_soon)
draw_checkbox("Mirror", split/2 + song_x_off, 375+jacket_size + 70, toggle_mirror, mirror_mode, not start_game_soon)
draw_checkbox("Rotate Host", split/2 + song_x_off + 150 + 20, 375+jacket_size + 70, toggle_rotate, do_rotate,
(owner == user_id or host == user_id) and not start_game_soon)
if selected_song ~= nil then
gfx.FillColor(255,255,255)
gfx.FontSize(20);
gfx.TextAlign(gfx.TEXT_ALIGN_CENTER + gfx.TEXT_ALIGN_TOP)
if selected_song.min_bpm ~= selected_song.max_bpm then
gfx.Text(string.format("BPM: %.0f-%.0f, Start BPM: %.0f, Hispeed: %.0f x %.1f = %.0f",
selected_song.min_bpm, selected_song.max_bpm, selected_song.start_bpm,
selected_song.speed_bpm, selected_song.hispeed, selected_song.speed_bpm * selected_song.hispeed),
split/2 + song_x_off, 375+jacket_size + 70 + 30)
else
gfx.Text(string.format("BPM: %.0f, Hispeed: %.0f x %.1f = %.0f",
selected_song.min_bpm,
selected_song.speed_bpm, selected_song.hispeed, selected_song.speed_bpm * selected_song.hispeed),
split/2 + song_x_off, 375+jacket_size + 70 + 30)
end
end
end end
function render_room_list(deltaTime) function render_room_list(deltaTime)
spinnybg.draw(deltaTime);
draw_rooms(175, resY - 290); draw_rooms(175, resY - 290);
-- Draw cover for rooms out of view -- Draw cover for rooms out of view
@ -793,18 +699,19 @@ function render_new_room_password(delta_time)
gfx.Text(string.rep("*",#textInput.text), resX/2, resY/2+40) gfx.Text(string.rep("*",#textInput.text), resX/2, resY/2+40)
draw_button("Create Room", resX/2, resY*3/4, resX/2, mpScreen.NewRoomStep); draw_button("Create Room", resX/2, resY*3/4, resX/2, mpScreen.NewRoomStep);
end end
--here
function render_new_room_name(deltaTime) function render_new_room_name(deltaTime)
gfx.BeginPath();
gfx.LoadSkinFont("segoeui.ttf")
gfx.FillColor(255,255,255) gfx.FillColor(255,255,255)
gfx.TextAlign(gfx.TEXT_ALIGN_CENTER, gfx.TEXT_ALIGN_BOTTOM) gfx.TextAlign(gfx.TEXT_ALIGN_CENTER, gfx.TEXT_ALIGN_BOTTOM)
gfx.FontSize(70) gfx.FontSize(70)
gfx.Text("Create New Room", resX/2, resY/4) gfx.Text("Create New Room", resX/2, resY/4)
gfx.FillColor(50,50,50)
gfx.BeginPath()
gfx.Rect(0, resY/2-10, resX, 60) gfx.Rect(0, resY/2-10, resX, 60)
gfx.Fill();
gfx.FillColor(255,255,255)
gfx.Text("Please enter room name:", resX/2, resY/2-40) gfx.Text("Please enter room name:", resX/2, resY/2-40)
gfx.Text(textInput.text, resX/2, resY/2+40) gfx.Text(textInput.text, resX/2, resY/2+40)
draw_button("Next", resX/2, resY*3/4, resX/2, mpScreen.NewRoomStep); draw_button("Next", resX/2, resY*3/4, resX/2, mpScreen.NewRoomStep);
@ -837,8 +744,7 @@ render = function(deltaTime)
mposx,mposy = game.GetMousePos(); mposx,mposy = game.GetMousePos();
portrait = resY > resX portrait = resY > resX
IR_Handle() sound.stopMusic();
Sound.stopMusic();
doffset = doffset * 0.9 doffset = doffset * 0.9
ioffset = ioffset * 0.9 ioffset = ioffset * 0.9
@ -931,11 +837,10 @@ function join_room(room)
mpScreen.JoinWithoutPassword(room.id) mpScreen.JoinWithoutPassword(room.id)
end end
end end
local que1 = 0
-- Handle button presses to advance the UI -- Handle button presses to advance the UI
button_pressed = function(button) button_pressed = function(button)
if button == game.BUTTON_STA then
if button == game.BUTTON_FXL and game.BUTTON_FXR then
if start_game_soon then if start_game_soon then
return return
end end
@ -965,10 +870,10 @@ button_pressed = function(button)
end end
end end
if button == game.BUTTON_BTA then if button == game.BUTTON_FXL then
toggle_hard(); toggle_hard();
end end
if button == game.BUTTON_BTB then if button == game.BUTTON_FXR then
toggle_mirror(); toggle_mirror();
end end
end end

File diff suppressed because it is too large Load Diff