aboutsummaryrefslogtreecommitdiff
path: root/src/menu/lobby.moon
diff options
context:
space:
mode:
authorAlex Pickering <alex@cogarr.net>2026-02-01 13:14:32 -0600
committerAlexander M Pickering <alex@cogarr.net>2026-02-01 13:14:32 -0600
commit3a975db66a3711f34e8b64bb27a8eaca79fdeca9 (patch)
treefcc12f8f9d638ff575c1963796de76b7628854b4 /src/menu/lobby.moon
downloadggj26-3a975db66a3711f34e8b64bb27a8eaca79fdeca9.tar.gz
ggj26-3a975db66a3711f34e8b64bb27a8eaca79fdeca9.tar.bz2
ggj26-3a975db66a3711f34e8b64bb27a8eaca79fdeca9.zip
Initial commitHEADmaster
Diffstat (limited to 'src/menu/lobby.moon')
-rw-r--r--src/menu/lobby.moon103
1 files changed, 103 insertions, 0 deletions
diff --git a/src/menu/lobby.moon b/src/menu/lobby.moon
new file mode 100644
index 0000000..c20face
--- /dev/null
+++ b/src/menu/lobby.moon
@@ -0,0 +1,103 @@
+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