aboutsummaryrefslogtreecommitdiff
path: root/src/levels/lobby.moon
blob: 7f2a27b45f01d1eea785730d8537c0d80812aa1a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
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