aboutsummaryrefslogtreecommitdiff
path: root/src/levels
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/levels
downloadggj26-3a975db66a3711f34e8b64bb27a8eaca79fdeca9.tar.gz
ggj26-3a975db66a3711f34e8b64bb27a8eaca79fdeca9.tar.bz2
ggj26-3a975db66a3711f34e8b64bb27a8eaca79fdeca9.zip
Initial commitHEADmaster
Diffstat (limited to 'src/levels')
-rw-r--r--src/levels/entmaker.moon21
-rw-r--r--src/levels/game.moon7
-rw-r--r--src/levels/lobby.moon111
3 files changed, 139 insertions, 0 deletions
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