aboutsummaryrefslogtreecommitdiff
path: root/src/menu/game.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/game.moon
downloadggj26-3a975db66a3711f34e8b64bb27a8eaca79fdeca9.tar.gz
ggj26-3a975db66a3711f34e8b64bb27a8eaca79fdeca9.tar.bz2
ggj26-3a975db66a3711f34e8b64bb27a8eaca79fdeca9.zip
Initial commitHEADmaster
Diffstat (limited to 'src/menu/game.moon')
-rw-r--r--src/menu/game.moon208
1 files changed, 208 insertions, 0 deletions
diff --git a/src/menu/game.moon b/src/menu/game.moon
new file mode 100644
index 0000000..9b871a4
--- /dev/null
+++ b/src/menu/game.moon
@@ -0,0 +1,208 @@
+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