ui = require("ui") world = require("world") log = require("log") util = require("util") task = require("task") net = require("net") game = require("menu.game") menu = {} net.register_message("RespondLevel",{ name: "string" -- name of the level e.g. "levels.lobby" data: "table" -- sequence to initalize the level }) net.register_message("StartGame",{}) start_game = nil lobby_url = nil menu.initialize = () -> log.info("Initializing lobby", {"ui"}) game_data = am.load_state("gameplay") now = am.eval_js("Date.now()") --if game_data and (not world.hub) and (now - game_data.start > game_data.time * 1000) --error("Looks like we have a game in progress:" .. tostring(game_data)) --menu.destroy! --game.create! --return log.info("Got game data", {"ui","net"}) ready = false if world.network_mode == "host" start_game = ui.button(-150,400-128,300,128,"Start!") start_game.on = (e) => log.info("Starting game!",{"net","server"}) world.level_sync.name = "levels.game" for _, ent in pairs(world.level.entities) ent\destroy! -- Actually send the message to start the game log.info("Connected peers were:" .. tostring(world.hub.clients), {"net","server"}) world.hub\broadcast("StartGame",{}) log.info("Finished creating game, level_sync.name is" .. world.level_sync.name,{"net","server"}) else start_game = ui.text(0, 400-64,300,128,"Waiting...") code = nil if world.network_mode == "host" -- For host, use the hub's peer ID (not the local client's peer ID) code = util.peer_to_code(world.hub.peer.id) elseif world.network_mode == "client" params = am.eval_js("window.CLIPBOARD.get_params()") code = params.i else error("world.network must be initialized before creating lobby menu") world.network\listen("StartGame","Lobby start game",() -> log.info("Starting game!",{"net","client"}) for _, ent in pairs(world.level.entities) ent\destroy! menu.destroy! game.create! log.info("Finished creating game", {"net","client"}) ) world.level_sync.data[1] = code path = am.eval_js("window.CLIPBOARD.get_path()") url = string.format("%s?i=%s", path, code) --url_display = string.format("%s\n?i=%s",path,code) url_display = "Copy URL" lobby_url = ui.button(-180,-400+64,360,84,url_display) lobby_url.on = () => log.info("Clicked button, copying text",{"ui"}) transform = am.translate(0,-400+128) copied_text = am.text("Coppied!", vec4(1,1,1,1)) transform\append(copied_text) copied_text\action(coroutine.create(() -> i = 1 while i > 0 i = i - (2/255) copied_text.color = vec4(1,1,1,i) transform.y += i * 3 coroutine.yield! lobby_url.node\remove(transform) )) lobby_url.node\append(transform) -- This HAS to be the last action in this function, or else -- javascript thinks this is happening outside of a user interaction. am.eval_js("navigator.clipboard.writeText('" .. url .. "');") log.info("Created lobby buttons", {"ui"}) level_loader = coroutine.create(() -> while not world.network.connected log.info("Waiting for network to load level...",{"net","client"}) coroutine.yield! --level = world.network\sync("RequestLevel",{},"RespondLevel") --log.info("Got information back from sync" .. tostring(level), {"net","client"}) --world.level_sync.name = level.name --world.level_sync.data = level.data --log.info("Loading " .. level.name .. " with data " .. tostring(level.data), {"net","client","level"}) --level_mod = assert(require(level.name)) --assert(level_mod.create, "Level " .. level.name .. " had no .create()") --level_mod.create(unpack(level.data)) ) task.add(level_loader) menu.destroy = () -> ui.delete(lobby_url) if start_game ui.delete(start_game) menu