function dump(x, idt) local p = {} local idt = idt or 0 for k, v in pairs(x) do local s if type(v) == "table" then s = dump(v, idt+1) elseif type(v) == "string" then s = ("\"%s\""):format(v) else s = tostring(v) end table.insert(p, ("%s%s = %s"):format((" "):rep(4*(idt+1)), k, s)) end return ("{\n%s\n%s}"):format(table.concat(p, ", \n"), (" "):rep(4*idt)) end local client = require("client") local server = require("server") local main_menu = require("main_menu") local ui = require("ui") local color = ui.color local mm local clt local active_ui local loading_text, loading_ui local error_text, error_ui local connected = false local last_status local function show_error(msg) error_text.text:set(msg) active_ui = error_ui end local function join_game(invite) local c, err = client.join(invite) if err then show_error("Invalid invite") else clt = c active_ui = loading_ui end end local function disconnect(msg) client.close(clt) clt = nil connected = false if msg then show_error(msg) else active_ui = mm end end local function loading_status(status) loading_text.text:set(status) end local function update_client() client.update(clt) local status = client.status(clt) if status == "timeout_match" then disconnect("Failed to connect to match server (match server down?)") elseif status == "fail_match" then disconnect("Game not found (invalid invite?)") elseif status == "timeout_server" then disconnect("Failed to connect to server (NAT punch failure?)") elseif status == "fail_server" then disconnect("Incorrect secret (invalid invite?)") elseif status == "disco" then disconnect("Lost connection to server (Server shut down?)") elseif status ~= last_status then if status == "active" then loading_status("Connected to server!") connected = true elseif status == "wait_match" then loading_status("Waiting for match server...") elseif status == "wait_server" then loading_status("Waiting for server...") end end last_status = status end function love.load() love.graphics.setBackgroundColor(color(0xffffff)) love.window.setTitle("RAINBOW SIX: PANOPTICON") mm = main_menu.create({ join_game = join_game, }) local loading_box = main_menu.box( "Loading...", ui.button("Cancel", function() disconnect() end) ) loading_text = loading_box.box_title loading_ui = ui.new(ui.center_x(ui.center_y(loading_box))) local error_box = main_menu.box( "Error", ui.button("Back", function() active_ui = mm end) ) error_text = error_box.box_title error_ui = ui.new(ui.center_x(ui.center_y(error_box))) active_ui = mm end function love.mousepressed(x, y, button) if active_ui then ui.mousepressed(active_ui, x, y, button) end end function love.mousereleased(x, y, button) if active_ui then ui.mousereleased(active_ui, x, y, button) end end function love.textinput(text) if active_ui then ui.textinput(active_ui, text) end end function love.keypressed(key) if active_ui then ui.keypressed(active_ui, key) end end function love.update() if clt then update_client() end end function love.draw() if active_ui then ui.update(active_ui) ui.render(active_ui) end end