From 3a975db66a3711f34e8b64bb27a8eaca79fdeca9 Mon Sep 17 00:00:00 2001 From: Alex Pickering Date: Sun, 1 Feb 2026 13:14:32 -0600 Subject: Initial commit --- src/levels/entmaker.moon | 21 +++++++++ src/levels/game.moon | 7 +++ src/levels/lobby.moon | 111 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 139 insertions(+) create mode 100644 src/levels/entmaker.moon create mode 100644 src/levels/game.moon create mode 100644 src/levels/lobby.moon (limited to 'src/levels') diff --git a/src/levels/entmaker.moon b/src/levels/entmaker.moon new file mode 100644 index 0000000..da92651 --- /dev/null +++ b/src/levels/entmaker.moon @@ -0,0 +1,21 @@ +-- Creates entities from commited messages +world = require("world") +log = require("log") + +maker = {} + +maker.start_peer = () -> + -- All modes now use client interface (including host) + if world.network + -- Receive suggestions from hub + world.network\register_router("suggest", (from_id, data) -> + -- Handle suggestion + ) + +maker.start_elected = () -> + if world.network_mode == "host" + -- Hub can handle incoming suggestions from clients + -- (Handled inline when clients send messages) + log.info("Entity maker started in host mode", {"net"}) + +maker diff --git a/src/levels/game.moon b/src/levels/game.moon new file mode 100644 index 0000000..1e4899c --- /dev/null +++ b/src/levels/game.moon @@ -0,0 +1,7 @@ + +x = {} + +x.create = () -> + error("Creating level game") + +x diff --git a/src/levels/lobby.moon b/src/levels/lobby.moon new file mode 100644 index 0000000..7f2a27b --- /dev/null +++ b/src/levels/lobby.moon @@ -0,0 +1,111 @@ +ecs = require("ecs") +world = require("world") +shader = require("shaders.world") +sprites = require("sprites") +task = require("task") +LobbyGraphic = require("prefab.lobby") +GraphicsComponent = require("ecs.graphics") +ClientNetworkedComponent = require("ecs.client_networked") +NetworkedComponent = require("ecs.networked") +log = require("log") + +level = {} + +lobby = nil + +level.create = (code) -> + log.info("Creating level:" .. code,{"level"}) + -- We can set this even on the client, it just won't get used. + world.level_sync.ref = { + id: "Level from lobby.moon" + get_spawn_location: () -> + {0,0,0} + } + log.info("world.domain was" .. tostring(world.domain),{"level"}) + if world.domain == "client" + lobby = ecs.Entity! + lobby_graphic = LobbyGraphic("graphic",{}) + lobby\add(lobby_graphic,"grapic") + lobby\add(ClientNetworkedComponent("net",{ + type: "level", + level_name: "levels.lobby" + level_data: {code} + }),"net") + + code = world.level_sync.data[1] + path = am.eval_js("window.CLIPBOARD.get_path()") + url = string.format("%s?i=%s",path,code) + --todo: set qr code + am.eval_js([[ +var s = document.createElement('div'); +s.setAttribute("id","qrcode"); +s.setAttribute("style","z-index: 1; position:absolute; visibility:hidden;"); +var p = document.getElementById("container"); +p.prepend(s); +console.log("[JS] Added qrcode", s); +new QRCode(s, "]] .. url .. [["); +]]) + co = coroutine.create(() -> + print("Start of coroutine.") + imgsrc = "" + while imgsrc == "" + imgsrc = am.eval_js([[document.getElementById("qrcode").children[1].src;]]) + print("Waiting on imgsrc...") + coroutine.yield! + print("Got imgsrc.") + b64 = imgsrc\match("^data:image/png;base64,(.+)") + print("Found base64 png of qrcode.") + qrbuffer = am.base64_decode(b64) + print("Got qrbuffer") + qrimg = am.decode_png(qrbuffer) + print("Created img") + qrtex = am.texture2d(qrimg) + print("Created texture2d") + sprite = { + texture: qrtex + s1: 0 + t1: 0 + s2: 1 + t2: 1 + x1: 0 + y1: 0 + x2: qrimg.width + y2: qrimg.height + wdith: qrimg.width + height: qrimg.height + } + qrcode = ecs.Entity! + qrcode_texture = { + vec4(0,1,1,1), + vec4(1,1,1,1), + vec4(1,0,1,1), + vec4(1,0,1,1), + vec4(0,0,1,1), + vec4(0,1,1,1) + } + code_graphic = GraphicsComponent("graphic",{ + graphic: sprite + }) + qrcode\add(code_graphic) + code_graphic\moveto(vec3(-0.5,-0.25,0)) + ) + log.info("Creating qrcode coroutine for lobby",{"ui"}) + require("task").add(co) + elseif world.domain == "server" + lobby = ecs.Entity! + lobby\add(NetworkedComponent("net",{ + type: "level", + level_name: "levels.lobby" + level_data: {world.hub.peer.id} + }), "net") + + qrcode = ecs.Entity! + else + error("Unknown domain:" .. world.domain) + +level.destroy = () -> + if not lobby + error("Tried to destory lobby before it was built") + lobby\destroy! + +level -- cgit v1.2.3-70-g09d2