Initial commit
This commit is contained in:
commit
a6f48c3e1a
10 changed files with 760 additions and 0 deletions
124
img/16x9.css
Normal file
124
img/16x9.css
Normal file
|
@ -0,0 +1,124 @@
|
||||||
|
#backdrop_4x3 {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#backdrop_16x9 {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ratname {
|
||||||
|
display: none
|
||||||
|
}
|
||||||
|
|
||||||
|
.ratpronouns {
|
||||||
|
display: none
|
||||||
|
}
|
||||||
|
|
||||||
|
.ratspeaker {
|
||||||
|
width: 32px;
|
||||||
|
height: 32px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#game {
|
||||||
|
font-size: 24px;
|
||||||
|
left: 70px;
|
||||||
|
width: 450px;
|
||||||
|
bottom: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#scientist {
|
||||||
|
font-size: 24px;
|
||||||
|
right: 70px;
|
||||||
|
width: 450px;
|
||||||
|
bottom: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#timer {
|
||||||
|
font-size: 38px;
|
||||||
|
left: 472px;
|
||||||
|
width: 336px;
|
||||||
|
top: 666px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#rat0name {
|
||||||
|
left: 458px;
|
||||||
|
bottom: 665px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#rat0pronouns {
|
||||||
|
left: 458px;
|
||||||
|
top: 56px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#rat0speaker {
|
||||||
|
left: 25px;
|
||||||
|
top: 5px;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
#rat1name {
|
||||||
|
left: 620px;
|
||||||
|
bottom: 581px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#rat1pronouns {
|
||||||
|
left: 620px;
|
||||||
|
top: 140px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#rat1speaker {
|
||||||
|
transform: scaleX(-1);
|
||||||
|
right: 25px;
|
||||||
|
top: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#rat2name {
|
||||||
|
left: 458px;
|
||||||
|
bottom: 145px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#rat2pronouns {
|
||||||
|
left: 458px;
|
||||||
|
top: 576px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#rat2speaker {
|
||||||
|
left: 25px;
|
||||||
|
bottom: 50px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#rat3name {
|
||||||
|
left: 620px;
|
||||||
|
bottom: 59px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#rat3pronouns {
|
||||||
|
left: 620px;
|
||||||
|
top: 662px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#rat3speaker {
|
||||||
|
transform: scaleX(-1);
|
||||||
|
right: 25px;
|
||||||
|
bottom: 50px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#embed0 {
|
||||||
|
left: 70px;
|
||||||
|
top: 7px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#embed1 {
|
||||||
|
left: 651px;
|
||||||
|
top: 7px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#embed2 {
|
||||||
|
left: 70px;
|
||||||
|
top: 345px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#embed3 {
|
||||||
|
left: 651px;
|
||||||
|
top: 345px;
|
||||||
|
}
|
BIN
img/16x9.png
Normal file
BIN
img/16x9.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 253 KiB |
128
img/4x3.css
Normal file
128
img/4x3.css
Normal file
|
@ -0,0 +1,128 @@
|
||||||
|
#backdrop_4x3 {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
#backdrop_16x9 {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ratname {
|
||||||
|
width: 200px;
|
||||||
|
font-size: 22px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ratpronouns {
|
||||||
|
width: 200px;
|
||||||
|
font-size: 18px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ratspeaker {
|
||||||
|
width: 32px;
|
||||||
|
height: 32px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#game {
|
||||||
|
font-size: 24px;
|
||||||
|
left: 460px;
|
||||||
|
width: 360px;
|
||||||
|
bottom: 480px;
|
||||||
|
vertical-align: bottom;
|
||||||
|
line-height: 0.96em;
|
||||||
|
}
|
||||||
|
|
||||||
|
#scientist {
|
||||||
|
font-size: 16px;
|
||||||
|
left: 490px;
|
||||||
|
width: 300px;
|
||||||
|
top: 315px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#timer {
|
||||||
|
font-size: 68px;
|
||||||
|
left: 472px;
|
||||||
|
width: 336px;
|
||||||
|
top: 232px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#rat0name {
|
||||||
|
left: 458px;
|
||||||
|
bottom: 665px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#rat0pronouns {
|
||||||
|
left: 458px;
|
||||||
|
top: 56px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#rat0speaker {
|
||||||
|
left: 459px;
|
||||||
|
top: 329px;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
#rat1name {
|
||||||
|
left: 620px;
|
||||||
|
bottom: 581px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#rat1pronouns {
|
||||||
|
left: 620px;
|
||||||
|
top: 140px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#rat1speaker {
|
||||||
|
transform: scaleX(-1);
|
||||||
|
left: 790px;
|
||||||
|
top: 329px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#rat2name {
|
||||||
|
left: 458px;
|
||||||
|
bottom: 145px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#rat2pronouns {
|
||||||
|
left: 458px;
|
||||||
|
top: 576px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#rat2speaker {
|
||||||
|
left: 459px;
|
||||||
|
top: 359px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#rat3name {
|
||||||
|
left: 620px;
|
||||||
|
bottom: 59px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#rat3pronouns {
|
||||||
|
left: 620px;
|
||||||
|
top: 662px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#rat3speaker {
|
||||||
|
transform: scaleX(-1);
|
||||||
|
left: 790px;
|
||||||
|
top: 359px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#embed0 {
|
||||||
|
left: 22px;
|
||||||
|
top: 22px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#embed1 {
|
||||||
|
left: 835px;
|
||||||
|
top: 22px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#embed2 {
|
||||||
|
left: 22px;
|
||||||
|
top: 382px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#embed3 {
|
||||||
|
left: 835px;
|
||||||
|
top: 382px;
|
||||||
|
}
|
BIN
img/4x3.png
Normal file
BIN
img/4x3.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 267 KiB |
BIN
img/RobotoMono-Regular.ttf
Normal file
BIN
img/RobotoMono-Regular.ttf
Normal file
Binary file not shown.
118
img/main.css
Normal file
118
img/main.css
Normal file
|
@ -0,0 +1,118 @@
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roboto Mono Regular';
|
||||||
|
src: url('RobotoMono-Regular.ttf') format('truetype');
|
||||||
|
}
|
||||||
|
|
||||||
|
html, body {
|
||||||
|
background: #222;
|
||||||
|
margin: 0px;
|
||||||
|
padding: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ratname {
|
||||||
|
z-index: 1;
|
||||||
|
color: #fff;
|
||||||
|
font-family: 'Roboto Mono Regular';
|
||||||
|
text-align: center;
|
||||||
|
display: block;
|
||||||
|
position: absolute;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.ratpronouns {
|
||||||
|
z-index: 1;
|
||||||
|
color: #fff;
|
||||||
|
font-family: 'Roboto Mono Regular';
|
||||||
|
text-align: center;
|
||||||
|
display: block;
|
||||||
|
position: absolute;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ratspeaker {
|
||||||
|
z-index: 1;
|
||||||
|
position: absolute;
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.embed {
|
||||||
|
z-index: 0;
|
||||||
|
display: none;
|
||||||
|
position: absolute;
|
||||||
|
}
|
||||||
|
|
||||||
|
#game {
|
||||||
|
z-index: 1;
|
||||||
|
color: #fff;
|
||||||
|
font-family: 'Roboto Mono Regular';
|
||||||
|
display: block;
|
||||||
|
position: absolute;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
#scientist {
|
||||||
|
z-index: 1;
|
||||||
|
color: #fff;
|
||||||
|
font-family: 'Roboto Mono Regular';
|
||||||
|
display: block;
|
||||||
|
position: absolute;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
#timer {
|
||||||
|
z-index: 1;
|
||||||
|
color: #fff;
|
||||||
|
font-family: 'Roboto Mono Regular';
|
||||||
|
font-weight: bold;
|
||||||
|
text-align: center;
|
||||||
|
display: block;
|
||||||
|
position: absolute;
|
||||||
|
}
|
||||||
|
|
||||||
|
.backdrop {
|
||||||
|
z-index: 1;
|
||||||
|
position: relative;
|
||||||
|
pointer-events: none;
|
||||||
|
display: block;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#livedisplay {
|
||||||
|
overflow: hidden;
|
||||||
|
position: relative;
|
||||||
|
width: fit-content;
|
||||||
|
top: 0px;
|
||||||
|
left: 0px;
|
||||||
|
margin: 0px;
|
||||||
|
padding: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.controls {
|
||||||
|
margin-top: 20px;
|
||||||
|
color: #ccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
.controls td {
|
||||||
|
border: 1px solid;
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
|
||||||
|
.controls h3 {
|
||||||
|
margin: 0px;
|
||||||
|
padding: 0px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.controls p {
|
||||||
|
display: table-row;
|
||||||
|
}
|
||||||
|
|
||||||
|
.controls label {
|
||||||
|
display: table-cell;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.controls input, button {
|
||||||
|
display: table-cell;
|
||||||
|
margin-left: 5px;
|
||||||
|
}
|
BIN
img/speaker.png
Normal file
BIN
img/speaker.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 718 B |
160
js/live.js
Normal file
160
js/live.js
Normal file
|
@ -0,0 +1,160 @@
|
||||||
|
// Dimensions of each embed, used when initializing the embeds
|
||||||
|
embed_height = 315;
|
||||||
|
embed_width = 560;
|
||||||
|
|
||||||
|
// Twitch player embed objects go here so we can address the four embeds
|
||||||
|
// with embeds[0] .. embeds[3]
|
||||||
|
embeds = [];
|
||||||
|
|
||||||
|
// Toggles between 4x3 and 16x9 overlays by shuffling CSS stylesheets
|
||||||
|
// The boolean argument is pretty much "is this widescreen?"
|
||||||
|
function set_state(widescreen) {
|
||||||
|
css_normal = document.getElementById('css_4x3');
|
||||||
|
css_wide = document.getElementById('css_16x9');
|
||||||
|
if (widescreen) {
|
||||||
|
css_normal.disabled = true;
|
||||||
|
css_wide.disabled = false;
|
||||||
|
} else {
|
||||||
|
css_normal.disabled = false;
|
||||||
|
css_wide.disabled = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update everything
|
||||||
|
function update_all() {
|
||||||
|
update_globals();
|
||||||
|
update_embed(0);
|
||||||
|
update_embed(1);
|
||||||
|
update_embed(2);
|
||||||
|
update_embed(3);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update all global textual elements
|
||||||
|
function update_globals() {
|
||||||
|
change_game_name();
|
||||||
|
change_scientist();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update individual textual elements in the overlay
|
||||||
|
function change_game_name() {
|
||||||
|
game_name = document.getElementById('gamename_text').value;
|
||||||
|
e = document.getElementById('game');
|
||||||
|
e.innerHTML = game_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
function change_scientist() {
|
||||||
|
scientist = document.getElementById('scientist_text').value;
|
||||||
|
e = document.getElementById('scientist');
|
||||||
|
e.innerHTML = "Lead Scientist: " + scientist;
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_embed(embed_num) {
|
||||||
|
change_embed_channel(embed_num);
|
||||||
|
n = document.getElementById('rat' + embed_num + 'name');
|
||||||
|
p = document.getElementById('rat' + embed_num + 'pronouns');
|
||||||
|
|
||||||
|
n.innerHTML = document.getElementById('embed' + embed_num + '_name').value;
|
||||||
|
p.innerHTML = document.getElementById('embed' + embed_num + '_pronouns').value;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Instruct a given embed to change what channel it's streaming
|
||||||
|
function change_embed_channel(embed_num) {
|
||||||
|
channel_name = document.getElementById('embed' + embed_num + '_stream').value;
|
||||||
|
|
||||||
|
if (channel_name == '' || channel_name == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
e = document.getElementById('embed' + embed_num);
|
||||||
|
e.style.display = 'block';
|
||||||
|
|
||||||
|
embeds[embed_num].setChannel(channel_name);
|
||||||
|
embeds[embed_num].play();
|
||||||
|
}
|
||||||
|
|
||||||
|
// This is a fast call to immediately halt a stream. It's used as an
|
||||||
|
// emergency "something bad is happening" button, and can just be used to
|
||||||
|
// hide one of the embeds if a player isn't available.
|
||||||
|
// This is overkill: it hides the DOM element, then forces an error to make
|
||||||
|
// the player crash. This is restorable by using change_embed_channel()
|
||||||
|
function dump_stream(embed_num) {
|
||||||
|
// Hide the element entirely
|
||||||
|
document.getElementById('embed' + embed_num).style.display = 'none';
|
||||||
|
|
||||||
|
// Pass an invalid channel to the player so it errors out
|
||||||
|
// This is gross but it stops all activity for certain
|
||||||
|
embeds[embed_num].setChannel();
|
||||||
|
}
|
||||||
|
|
||||||
|
// A pretty brute force way to make sure one, and only one, embed is playing
|
||||||
|
// audio. We mute all four embeds then immediately unmute the provided one.
|
||||||
|
// We also juggle display styling for speaker elements so only the audio source
|
||||||
|
// has a speaker displayed next to it
|
||||||
|
function focus_audio(embed_num) {
|
||||||
|
embeds.forEach(e => e.setMuted(true));
|
||||||
|
embeds[embed_num].setMuted(false);
|
||||||
|
|
||||||
|
speakers = document.querySelectorAll('.ratspeaker');
|
||||||
|
speakers.forEach(e => e.style.display = 'none');
|
||||||
|
|
||||||
|
e = document.getElementById('rat' + embed_num + 'speaker')
|
||||||
|
e.style.display = 'block';
|
||||||
|
}
|
||||||
|
|
||||||
|
// This is the primary setup function that runs when the DOM is loaded
|
||||||
|
// At the moment all it does is set up embeds
|
||||||
|
function setup() {
|
||||||
|
// Setup Embeds
|
||||||
|
// These start with JST as the channel because some channel needs to be
|
||||||
|
// provided. We simply disable autoplay so we don't get four JSTs.
|
||||||
|
// When we switch embed channels, part of that function forces playing
|
||||||
|
// to start
|
||||||
|
embeds.push(new Twitch.Embed('embed0', {
|
||||||
|
height: embed_height,
|
||||||
|
width: embed_width,
|
||||||
|
autoplay: false,
|
||||||
|
muted: false,
|
||||||
|
layout: 'video',
|
||||||
|
controls: false,
|
||||||
|
channel: 'jank_science_theater',
|
||||||
|
parent: ['voidfox.com']
|
||||||
|
}));
|
||||||
|
|
||||||
|
embeds.push(new Twitch.Embed('embed1', {
|
||||||
|
height: embed_height,
|
||||||
|
width: embed_width,
|
||||||
|
autoplay: false,
|
||||||
|
muted: true,
|
||||||
|
layout: 'video',
|
||||||
|
controls: false,
|
||||||
|
channel: 'jank_science_theater',
|
||||||
|
parent: ['voidfox.com']
|
||||||
|
}));
|
||||||
|
|
||||||
|
embeds.push(new Twitch.Embed('embed2', {
|
||||||
|
height: embed_height,
|
||||||
|
width: embed_width,
|
||||||
|
autoplay: false,
|
||||||
|
muted: true,
|
||||||
|
layout: 'video',
|
||||||
|
controls: false,
|
||||||
|
channel: 'jank_science_theater',
|
||||||
|
parent: ['voidfox.com']
|
||||||
|
}));
|
||||||
|
|
||||||
|
embeds.push(new Twitch.Embed('embed3', {
|
||||||
|
height: embed_height,
|
||||||
|
width: embed_width,
|
||||||
|
autoplay: false,
|
||||||
|
muted: true,
|
||||||
|
layout: 'video',
|
||||||
|
controls: false,
|
||||||
|
channel: 'jank_science_theater',
|
||||||
|
parent: ['voidfox.com']
|
||||||
|
}));
|
||||||
|
|
||||||
|
// Try to start volume at a known level
|
||||||
|
embeds.forEach(e => e.setVolume(1.0));
|
||||||
|
}
|
||||||
|
|
||||||
|
document.addEventListener('DOMContentLoaded', setup);
|
62
js/timer.js
Normal file
62
js/timer.js
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
// Timekeeping info for the timer
|
||||||
|
timer_start = 0;
|
||||||
|
timer_sec = 0;
|
||||||
|
|
||||||
|
// Runs once a second to maintain the timer
|
||||||
|
// Tablutes how long it's been, subtracts that from timer length, then
|
||||||
|
// updates the HTML element representing the timer
|
||||||
|
function timer_tick() {
|
||||||
|
// Don't do anything if a timer isn't running
|
||||||
|
if (!timer_start) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// Take how long it's been since we started the timer and subtract that
|
||||||
|
// from the timer duration to get how long is remaining
|
||||||
|
remain = timer_sec - ((Date.now() - timer_start) / 1000);
|
||||||
|
|
||||||
|
// Stop at 0
|
||||||
|
if (remain < 0) {remain = 0;}
|
||||||
|
|
||||||
|
// Update the element
|
||||||
|
document.getElementById('timer').innerHTML = seconds_to_string(remain);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Utility function to convert seconds to H:MM:SS
|
||||||
|
function seconds_to_string(seconds) {
|
||||||
|
hours = Math.floor(seconds / 3600);
|
||||||
|
minutes = Math.floor((seconds % 3600) / 60);
|
||||||
|
seconds = Math.floor(seconds % 60);
|
||||||
|
|
||||||
|
return String(hours) + ":" +
|
||||||
|
String(minutes).padStart(2, '0') + ":" +
|
||||||
|
String(seconds).padStart(2, '0')
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tabluates how many seconds we want on the timer, stores that info, and
|
||||||
|
// stops a currently running timer
|
||||||
|
function reset_timer() {
|
||||||
|
hours = parseInt(document.getElementById('timer_h').value);
|
||||||
|
minutes = parseInt(document.getElementById('timer_m').value);
|
||||||
|
seconds = parseInt(document.getElementById('timer_s').value);
|
||||||
|
|
||||||
|
total = (minutes * 60) + (hours * 3600) + seconds;
|
||||||
|
|
||||||
|
document.getElementById('timer').innerHTML = seconds_to_string(total);
|
||||||
|
|
||||||
|
timer_start = 0;
|
||||||
|
timer_sec = total;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Starts the timer by setting 'now' as the timer start time
|
||||||
|
function start_timer() {
|
||||||
|
timer_start = Date.now()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Destroys the timer start time to halt the timer
|
||||||
|
function stop_timer() {
|
||||||
|
timer_start = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start timer interval
|
||||||
|
setInterval(timer_tick, 1000)
|
168
live.html
Normal file
168
live.html
Normal file
|
@ -0,0 +1,168 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<script src='https://player.twitch.tv/js/embed/v1.js'></script>
|
||||||
|
<script src='js/live.js'></script>
|
||||||
|
<script src='js/timer.js'></script>
|
||||||
|
<link rel='stylesheet' type='text/css' href='img/main.css' />
|
||||||
|
<link id='css_4x3' rel='stylesheet' type='text/css' href='img/4x3.css' />
|
||||||
|
<link id='css_16x9' rel='stylesheet' type='text/css' href='img/16x9.css' disabled />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id='livedisplay'>
|
||||||
|
<img class='backdrop' id='backdrop_4x3' src='img/4x3.png' />
|
||||||
|
<img class='backdrop' id='backdrop_16x9' src='img/16x9.png' />
|
||||||
|
<div id='game'>Game Name</div>
|
||||||
|
<div class='ratname' id='rat0name'>Labrat 1</div>
|
||||||
|
<div class='ratname' id='rat1name'>Labrat 2</div>
|
||||||
|
<div class='ratname' id='rat2name'>Labrat 3</div>
|
||||||
|
<div class='ratname' id='rat3name'>Labrat 4</div>
|
||||||
|
<div class='ratpronouns' id='rat0pronouns'>they/them</div>
|
||||||
|
<div class='ratpronouns' id='rat1pronouns'>they/them</div>
|
||||||
|
<div class='ratpronouns' id='rat2pronouns'>they/them</div>
|
||||||
|
<div class='ratpronouns' id='rat3pronouns'>they/them</div>
|
||||||
|
<img class='ratspeaker' id='rat0speaker' src='img/speaker.png' />
|
||||||
|
<img class='ratspeaker' id='rat1speaker' src='img/speaker.png' />
|
||||||
|
<img class='ratspeaker' id='rat2speaker' src='img/speaker.png' />
|
||||||
|
<img class='ratspeaker' id='rat3speaker' src='img/speaker.png' />
|
||||||
|
<div id='scientist'>Lead Scientist:</div>
|
||||||
|
<div id='timer'>0:00:00</div>
|
||||||
|
<div class='embed' id='embed0'></div>
|
||||||
|
<div class='embed' id='embed1'></div>
|
||||||
|
<div class='embed' id='embed2'></div>
|
||||||
|
<div class='embed' id='embed3'></div>
|
||||||
|
</div>
|
||||||
|
<div class='controls'>
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<!-- Global Controls -->
|
||||||
|
Overlay:
|
||||||
|
<button type='button' name='go_4x3' onclick='set_state(false);'>4x3</button>
|
||||||
|
<button type='button' name='go_16x0' onclick='set_state(true);'>16x9</button>
|
||||||
|
<td>
|
||||||
|
<h3>Global Settings</h3>
|
||||||
|
<p>
|
||||||
|
<label for='gamename_text'>Game Name</label>
|
||||||
|
<input id='gamename_text' type='text' />
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<label for='scientist_text'>Scientist</label>
|
||||||
|
<input id='scientist_text' type='text' />
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<label></label>
|
||||||
|
<button type='button' name='update_global' onclick='update_globals();'>Update</button>
|
||||||
|
<button type='button' name='update_all' onclick='update_all();'>Update All</button>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<!-- Timer Controls -->
|
||||||
|
<td>
|
||||||
|
<h3>Timer Controls</h3>
|
||||||
|
<p>
|
||||||
|
<input type='number' id='timer_h' min=0 max=99 size=2 value=1 /> H
|
||||||
|
<input type='number' id='timer_m' min=0 max=59 size=2 value=0 /> M
|
||||||
|
<input type='number' id='timer_s' min=0 max=59 size=2 value=0 /> S
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<button type='button' name='timer_reset' onclick='reset_timer();'>Reset</button>
|
||||||
|
<button type='button' name='timer_start' onclick='start_timer();'>Start</button>
|
||||||
|
<button type='button' name='timer_reset' onclick='stop_timer();'>Stop</button>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<!-- Top Left Control -->
|
||||||
|
<td>
|
||||||
|
<h3>Top-Left Stream</h3>
|
||||||
|
<p>
|
||||||
|
<label for='embed0_stream'>Twitch Stream</label>
|
||||||
|
<input id='embed0_stream' type='text' />
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<label for='embed0_name'>Labrat Name</label>
|
||||||
|
<input id='embed0_name' type='text' />
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<label for='embed0_pronouns'>Labrat Pronouns</label>
|
||||||
|
<input id='embed0_pronouns' type='text' />
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<label></label>
|
||||||
|
<button type='button' name='update' onclick='update_embed(0);'>Update</button>
|
||||||
|
<button type='button' name='dump' onclick='dump_stream(0);'>Dump</button>
|
||||||
|
<button type='button' name='focus' onclick='focus_audio(0);'>Audio</button>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<!-- Top Right Control -->
|
||||||
|
<td>
|
||||||
|
<h3>Top-Right Stream</h3>
|
||||||
|
<p>
|
||||||
|
<label for='embed1_stream'>Twitch Stream</label>
|
||||||
|
<input id='embed1_stream' type='text' />
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<label for='embed1_name'>Labrat Name</label>
|
||||||
|
<input id='embed1_name' type='text' />
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<label for='embed1_pronouns'>Labrat Pronouns</label>
|
||||||
|
<input id='embed1_pronouns' type='text' />
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<label></label>
|
||||||
|
<button type='button' name='update' onclick='update_embed(1);'>Update</button>
|
||||||
|
<button type='button' name='dump' onclick='dump_stream(1);'>Dump</button>
|
||||||
|
<button type='button' name='focus' onclick='focus_audio(1);'>Audio</button>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<!-- Bottom Left Control -->
|
||||||
|
<td>
|
||||||
|
<h3>Bottom-Left Stream</h3>
|
||||||
|
<p>
|
||||||
|
<label for='embed2_stream'>Twitch Stream</label>
|
||||||
|
<input id='embed2_stream' type='text' />
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<label for='embed2_name'>Labrat Name</label>
|
||||||
|
<input id='embed2_name' type='text' />
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<label for='embed2_pronouns'>Labrat Pronouns</label>
|
||||||
|
<input id='embed2_pronouns' type='text' />
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<label></label>
|
||||||
|
<button type='button' name='update' onclick='update_embed(2);'>Update</button>
|
||||||
|
<button type='button' name='dump' onclick='dump_stream(2);'>Dump</button>
|
||||||
|
<button type='button' name='focus' onclick='focus_audio(2);'>Audio</button>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<!-- Bottom Right Control -->
|
||||||
|
<td>
|
||||||
|
<h3>Bottom-Right Stream</h3>
|
||||||
|
<p>
|
||||||
|
<label for='embed3_stream'>Twitch Stream</label>
|
||||||
|
<input id='embed3_stream' type='text' />
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<label for='embed3_name'>Labrat Name</label>
|
||||||
|
<input id='embed3_name' type='text' />
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<label for='embed3_pronouns'>Labrat Pronouns</label>
|
||||||
|
<input id='embed3_pronouns' type='text' />
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<label></label>
|
||||||
|
<button type='button' name='update' onclick='update_embed(3);'>Update</button>
|
||||||
|
<button type='button' name='dump' onclick='dump_stream(3);'>Dump</button>
|
||||||
|
<button type='button' name='focus' onclick='focus_audio(3);'>Audio</button>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
Loading…
Add table
Reference in a new issue