settings = require("settings") poems = require("poems") net = require("net") world = require("world") log = require("log") ui = require("ui") win = require("window") task = require("task") abilities = require("abilities") x = {} x.node = am.group! net.register_message("RequestRole", {}) net.register_message("RespondRole", { required: { youare: "string" start: "number" time: "number" } optional: { hint: "string" poem: "string" } }) x.slide_and_fade = (node, delay) -> delay = delay or 0 tween = am.ease.sine ease_color = (node) -> end_color = node.color node.color = end_color({a:0}) node\action(am.series({ am.delay(delay), am.tween( 0.5, { color: end_color }, tween ) })) for _, text in pairs(node\all("text",true)) ease_color(text) for _, sprite in pairs(node\all("sprites",true)) ease_color(sprite) translate = node\all("translate", true) for _, translate_node in pairs(translate) print("Examining translate node:", translate_node) end_y = translate_node.y translate_node.y += 50 translate_node\action(am.series({ am.delay(delay), am.tween( 0.5, { y: end_y }, tween ) })) -- data contains -- > data.youare --("pawn" or "unmasked") -- and then either -- > data.hint -- (string) -- or -- > data.poem -- (text) x.create_graphic = (data) -> print("Creating mask on screen for data:" .. tostring(data)) timer = ui.text(0,400,win.width-40, 100, "00:00") timer.node\tag("timer") alert_minute = false alert_oot = false timer.node\action(() -> now = am.eval_js("Date.now()") end_time = data.start + (data.time * 1000) countdown = math.floor((end_time - now) / 1000) minutes = math.floor(countdown/60) seconds = countdown % 60 time_txt = string.format("%02d : %02d",minutes, seconds) timer.node("text").text = time_txt -- assume only 1 line? if countdown < 60 and not alert_minute-- 1 minute log.info("1 minute alert", {"client"}) alert_minute = true timer.node\action(am.play(17962709,false,1,1)) if countdown < 0 and not alert_oot -- Alert sound log.info("out of time alert", {"client"}) alert_oot = true timer.node\action(am.play(96446209,false,1,1)) return ) click = (n) -> return () -> log.info("Click " .. tostring(n), {"client"}) return true timer.node\action(am.series({ am.parallel({ am.play(68962308,false,1,1) am.delay(1) }), am.parallel({ am.play(68962308,false,1,0.75) am.delay(1) }), am.parallel({ am.play(68962308,false,1,0.25) am.delay(1) }) })) if data.youare == "unmasked" -- Do unmasked stuff youare = ui.text(0,300,win.width-40, 100, "You wear no mask") x.slide_and_fade(youare.node) fools = ui.text(0,200,win.width-40, 100, "These fools, they created an order based on ") x.slide_and_fade(fools.node,0.5) hint = ui.text(0,0,win.width-40, 100, data.hint) x.slide_and_fade(hint.node, 1) keep_looking = ui.text(0,-200,win.width-40,100,"Keep looking 5") keep_looking.node\tag("keep_looking") keep_looking.node\action(() -> now = am.eval_js("Date.now()") end_time = data.start + (5 * 1000) if now < end_time keep_looking.node("text").text = "Keep looking " .. math.ceil((end_time - now) / 1000) else ui.delete(keep_looking) ) else assert(abilities[data.youare], "No ability hint for role: " .. tostring(data.youare)) print("Going into else branch for create_graphic") print("ui.text was", ui.text) print(debug.getinfo(ui.text)) youare = ui.text(0,332,win.width-40,100,"You are " .. data.youare) x.slide_and_fade(youare.node) --ability = ui.text(0,264,win.width-40,100,abilities[data.youare]) --x.slide_and_fade(ability.node) assert(youare, "Failed to get a node from ui.text") text = ui.text(0,200,win.width-40,100,"You remember the words we spoke at the founding, they were:") x.slide_and_fade(text.node, 0.5) poem = ui.text(0,0,win.width-40,100,data.poem) x.slide_and_fade(poem.node, 1) log.info("Finished creating graphic",{"client"}) x.create = () -> if world.hub all_peers = world.hub.clients peers = {} -- masked players for clientid,connection in pairs(all_peers) table.insert(peers, clientid) unmasked = {} -- unmasked players for i = 1, settings.n_unmasked rng = math.random(#peers) table.insert(unmasked, table.remove(peers, rng)) poem = poems[math.random(#poems)] hint = poem.hints[math.random(#poem.hints)] start_time = am.eval_js("Date.now()") client_data = {} for _, clientid in ipairs(peers) client_data[clientid] = { youare: "a pawn" poem: poem.text start: start_time time: settings.game_time } --world.hub\send(clientid, "Begin", { --youare: "a pawn" --poem: poem.text --start: start_time --time: settings.game_time --}) for _, clientid in ipairs(unmasked) client_data[clientid] = { youare: "unmasked" hint: hint start: start_time time: settings.game_time } --world.hub\send(clientid, "Begin", { --youare: "unmasked" --hint: hint --start: start_time --time: settings.game_time --}) world.level_sync.client_data = client_data --world.hub\listen("RequestRole","Request role", (clientid, _) -> --log.info("Responding with role:" .. tostring(client_data[clientid]), {"net","server"}) --world.hub\send(clientid, "RespondRole", client_data[clientid]) --) world.network\listen("RespondRole", "Respond role", (_, data) -> log.info("Got role from server:" .. tostring(data), {"net","client"}) x.create_graphic(data) am.save_state("gameplay", data) ) world.network\send("RequestRole",{}) --world.network\listen("Begin","Begin game", (hubid, data) -> --log.info("Staring game, data: " .. tostring(data), {"net","client"}) --role = data.youare --time_pos = am.translate(vec2(100,20)) --x.create_graphic(data) --am.save_state("gameplay", data) --log.info("Finished saving data:" .. tostring(am.load_state("gameplay")), {"net","client"}) --) x