]> git.cworth.org Git - zombocom-ai/blobdiff - bus.html
Add initial structure of a Magic School Bus puzzle
[zombocom-ai] / bus.html
diff --git a/bus.html b/bus.html
new file mode 100644 (file)
index 0000000..845b048
--- /dev/null
+++ b/bus.html
@@ -0,0 +1,217 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+  <title>ZOMBO</title>
+  <link href="/zombo.css" rel="stylesheet" type="text/css">
+  <meta name="viewport" content="width=device-width,initial-scale=1">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+  <meta name="HandheldFriendly" content="true">
+
+  <style>
+    @keyframes zoom {
+       from {
+           opacity: 100%;
+           transform: scale(1);
+       }
+        to {
+           opacity: 0%;
+           transform: scale(30);
+        }
+    }
+    .zoom-into {
+        animation-name: zoom;
+        animation-duration: 2s;
+        animation-timing-function: ease-in;
+       animation-fill-mode: forwards;
+    }
+    @keyframes fade {
+       from {
+           opacity: 100%;
+       }
+        to {
+           opacity: 0%;
+        }
+    }
+    .fade-out {
+       animation-name: fade;
+       animation-duration: 0.8s;
+       animation-timing-function: ease-in;
+       animation-fill-mode: forwards;
+    }
+    #welcome {
+       position: fixed;
+       width: 100%;
+       top: 50%;
+       left: 50%;
+       transform: translate(-50%, -50%);
+    }
+    #game {
+       position: relative;
+    }
+    #word {
+       text-align: center;
+       font-size: 400%;
+       font-weight: bold;
+    }
+    #interface {
+       width: 100%;
+    }
+    #input {
+       display: block;
+       margin-left: auto;
+       margin-right: auto;
+       width: 60%;
+       font-size: 200%;
+       border-width: 5px;
+    }
+    #jumpstart {
+       position: fixed;
+       right: 5px;
+       bottom: 5px;
+    }
+    #welcome-message {
+       font-size: 120%;
+       font-weight: bold;
+       text-align: center;
+    }
+    #result {
+       position: fixed;
+       width: 100%;
+       top: 50%;
+       left: 50%;
+       transform: translate(-50%, -50%);
+       font-size: 500%;
+       text-align: center;
+    }
+    #form {
+       width: 100%;
+    }
+    #code {
+       width: 95%;
+    }
+    #output {
+       width: 100%;
+    }
+  </style>
+</head>
+
+<body>
+  <div id="content">
+
+    <div id="welcome" style="visibility: hidden">
+      <div id="header" align="center">
+       <p>
+          <img src="images/1403010940_The_Magic_School_Bus_in_the_apocalypse.png">
+       </p>
+      </div>
+
+      <div id="welcome-message">
+       <div id="timer_div" style="visibility: hidden">
+         Entering Magic School Bus in <span id="timer"></span> seconds.
+       </div>
+       <br>
+       Students present: <span id="students">1</span>/4
+      </div>
+    </div>
+
+    <div id="program" style="visibility: hidden">
+      <h1>
+       Magic School Bus Central Processor
+      </h1>
+      <form id="form">
+       <textarea id="code" rows="10" width="100%">t.forward(100);
+t.right(90);
+t.forward(100);
+       </textarea>
+       <button type="submit">Run code</button>
+      </form>
+      <img id="output"></img>
+    </div>
+
+    <button id="jumpstart">
+      Jumpstart Magic School Bus
+    </button>
+
+  </div>
+
+  <script src="/socket.io/socket.io.js"></script>
+  <script>
+    const socket = io("/bus");
+
+    const welcome = document.getElementById("welcome");
+    const program = document.getElementById("program");
+    const header = document.getElementById("header");
+    const companions = document.getElementById("students");
+    const timer_div = document.getElementById("timer_div");
+    const timer = document.getElementById("timer");
+    const form = document.getElementById("form");
+    const code = document.getElementById("code");
+    const welcome_message = document.getElementById("welcome-message");
+    const jumpstart = document.getElementById("jumpstart");
+    const output = document.getElementById("output");
+
+    function fade_element(elt) {
+       elt.style.opacity = "100%";
+       elt.className = "fade-out";
+       // Arrange to clear the class name when the animation is over
+       // This will allow for it to be restarted on the next word.
+       setTimeout(() => {
+           elt.style.opacity = "0%";
+           elt.className = "";
+       }, 900);
+    }
+
+    jumpstart.addEventListener('click', event => {
+       socket.emit('jumpstart');
+    });
+
+    form.addEventListener('submit', event => {
+       event.preventDefault();
+       console.log("Submitted form with code: " + code.value);
+       socket.emit('run', code.value);
+    });
+
+    socket.on('students', (count) => {
+       students.textContent = count.toString();
+    });
+
+    socket.on('timer', (value) => {
+       timer_div.style.visibility = "visible";
+       timer.textContent = value.toString();
+
+       if (value === 0) {
+           welcome_message.style.visibility = "hidden";
+           timer_div.style.visibility = "hidden";
+           header.className = "zoom-into";
+           // Clear that className after the animation is complete
+           setTimeout(() => {
+               header.style.visibility = "hidden"
+               header.className = "";
+           }, 2200);
+       }
+    });
+
+    socket.on('state', (state) => {
+       if (state === "program") {
+           welcome.style.visibility = "hidden";
+           program.style.visibility = "visible";
+       } else if (state === "welcome") {
+           welcome.style.visibility = "visible";
+           welcome_message.style.visibility = "visible";
+           header.style.opacity = "100%";
+           header.style.transform = "scale(1)";
+           header.style.visibility = "visible";
+           program.style.visibility = "hidden";
+           output.src = "";
+       }
+    });
+
+    socket.on('output', (filename) => {
+       output.src = filename;
+    });
+
+  </script>
+</body>
+</html>