|
|
|
@ -1,89 +1,68 @@ |
|
|
|
|
//===== Constructor
|
|
|
|
|
const Controls = function() { |
|
|
|
|
this.names = {}; |
|
|
|
|
this.playerId = null; |
|
|
|
|
this.countdownTimer = null; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// this.starts = [];
|
|
|
|
|
// this.timers = {};
|
|
|
|
|
|
|
|
|
|
// // "Local" and "Global" messages
|
|
|
|
|
// "Local" and "Global" messages
|
|
|
|
|
document.addEventListener('L-conn-error', this.msgConnectionError.bind(this)); |
|
|
|
|
document.addEventListener('L-complete', this.msgComplete.bind(this)); |
|
|
|
|
document.addEventListener('L-join', this.msgJoin.bind(this)); |
|
|
|
|
document.addEventListener('L-skip', this.msgSkip.bind(this)); |
|
|
|
|
document.addEventListener('L-stack', this.msgStack.bind(this)); |
|
|
|
|
// document.addEventListener('L-reset', this.msgReset.bind(this));
|
|
|
|
|
// document.addEventListener('L-undo', this.msgUndo.bind(this));
|
|
|
|
|
|
|
|
|
|
// document.addEventListener('G-guess', this.msgGuess.bind(this));
|
|
|
|
|
document.addEventListener('G-connected', this.msgCountdown.bind(this));
|
|
|
|
|
document.addEventListener('G-countdown', this.msgConnected.bind(this));
|
|
|
|
|
document.addEventListener('G-connected', this.msgConnected.bind(this));
|
|
|
|
|
document.addEventListener('G-countdown', this.msgCountdown.bind(this));
|
|
|
|
|
document.addEventListener('G-players', this.msgPlayers.bind(this));
|
|
|
|
|
// document.addEventListener('G-skip', this.msgSkip.bind(this));
|
|
|
|
|
// document.addEventListener('G-start', this.msgStart.bind(this));
|
|
|
|
|
document.addEventListener('G-state', this.msgState.bind(this)); |
|
|
|
|
// document.addEventListener('G-stop', this.msgStop.bind(this));
|
|
|
|
|
|
|
|
|
|
// Click handlers
|
|
|
|
|
// document.getElementById('controls-reset').addEventListener('click', this.onClickReset.bind(this));
|
|
|
|
|
// document.getElementById('controls-robots').addEventListener('click', this.onClickRobots.bind(this));
|
|
|
|
|
// document.getElementById('controls-skip').addEventListener('click', this.onClickSkip.bind(this));
|
|
|
|
|
// document.getElementById('controls-start').addEventListener('click', this.onClickStart.bind(this));
|
|
|
|
|
// document.getElementById('controls-stop').addEventListener('click', this.onClickStop.bind(this));
|
|
|
|
|
// document.getElementById('controls-submit').addEventListener('click', this.onClickSubmit.bind(this));
|
|
|
|
|
// document.getElementById('controls-undo').addEventListener('click', this.onClickUndo.bind(this));
|
|
|
|
|
// document.getElementById('controls-walls').addEventListener('click', this.onClickWalls.bind(this));
|
|
|
|
|
document.getElementById('controls-moves-reset').addEventListener('click', this.onClickMovesReset.bind(this)); |
|
|
|
|
document.getElementById('controls-moves-undo').addEventListener('click', this.onClickMovesUndo.bind(this)); |
|
|
|
|
document.getElementById('controls-moves-solve').addEventListener('click', this.onClickMovesSolve.bind(this)); |
|
|
|
|
|
|
|
|
|
document.getElementById('controls-options-objective').addEventListener('click', this.onClickOptionsObjective.bind(this)); |
|
|
|
|
document.getElementById('controls-options-robots').addEventListener('click', this.onClickOptionsRobots.bind(this)); |
|
|
|
|
document.getElementById('controls-options-walls').addEventListener('click', this.onClickOptionsWalls.bind(this)); |
|
|
|
|
|
|
|
|
|
document.getElementById('controls-countdown-skip').addEventListener('click', this.onClickSkip.bind(this)); |
|
|
|
|
|
|
|
|
|
this.setState('CONNECTING'); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//===== Countdown
|
|
|
|
|
|
|
|
|
|
// Controls.prototype.countdownStart = function(seconds) {
|
|
|
|
|
// clearTimeout(this.timers.countdown);
|
|
|
|
|
// this.timers.countdown = this.countdownTick.bind(this);
|
|
|
|
|
Controls.prototype.countdownStart = function(seconds) { |
|
|
|
|
clearTimeout(this.countdownTimer); |
|
|
|
|
this.countdownTimer = this.countdownTick.bind(this); |
|
|
|
|
|
|
|
|
|
// const countdown = document.getElementById('controls-countdown');
|
|
|
|
|
// countdown.dataset.tick = seconds;
|
|
|
|
|
const countdown = document.getElementById('controls-countdown-value'); |
|
|
|
|
countdown.dataset.tick = seconds * 1; |
|
|
|
|
|
|
|
|
|
// this.countdownTick();
|
|
|
|
|
// };
|
|
|
|
|
this.countdownTick(); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
// Controls.prototype.countdownTick = function() {
|
|
|
|
|
// const countdown = document.getElementById('controls-countdown');
|
|
|
|
|
// const tick = countdown.dataset.tick * 1;
|
|
|
|
|
// countdown.dataset.tick = tick - 1;
|
|
|
|
|
Controls.prototype.countdownTick = function() { |
|
|
|
|
const countdown = document.getElementById('controls-countdown-value'); |
|
|
|
|
const tick = countdown.dataset.tick * 1; |
|
|
|
|
countdown.dataset.tick = tick - 1;
|
|
|
|
|
|
|
|
|
|
// const s = (tick !== 1) ? 's' : '';
|
|
|
|
|
// countdown.innerHTML = `${tick} second${s}!`;
|
|
|
|
|
countdown.innerHTML = tick; |
|
|
|
|
|
|
|
|
|
// if (tick === 0) {
|
|
|
|
|
// this.countdownComplete();
|
|
|
|
|
// return;
|
|
|
|
|
// }
|
|
|
|
|
if (tick === 0) { |
|
|
|
|
this.countdownComplete(); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// this.timers.countdown = setTimeout(this.countdownTick.bind(this), 1000);
|
|
|
|
|
// };
|
|
|
|
|
this.countdownTimer = setTimeout(this.countdownTick.bind(this), 1000); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
// Controls.prototype.countdownComplete = function() {
|
|
|
|
|
// document.getElementById('controls-countdown').dataset.tick = 0;
|
|
|
|
|
// };
|
|
|
|
|
Controls.prototype.countdownComplete = function() { |
|
|
|
|
clearTimeout(this.countdownTimer); |
|
|
|
|
document.getElementById('controls-countdown-value').innerHTML = 0;
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
//===== UI
|
|
|
|
|
// Controls.prototype.showWaiting = function() {
|
|
|
|
|
// document.getElementById('controls-start').parentNode.style.display = '';
|
|
|
|
|
// document.getElementById('controls-walls').parentNode.style.display = '';
|
|
|
|
|
// document.getElementById('controls-robots').parentNode.style.display = '';
|
|
|
|
|
|
|
|
|
|
// document.getElementById('controls-stop').parentNode.style.display = 'none';
|
|
|
|
|
// // document.getElementById('controls-moves-reset').parentNode.style.display = 'none';
|
|
|
|
|
// document.getElementById('controls-guesses').style.display = 'none';
|
|
|
|
|
// document.getElementById('controls-panic').style.display = 'none';
|
|
|
|
|
// };
|
|
|
|
|
|
|
|
|
|
// Controls.prototype.showPanic = function() {
|
|
|
|
|
// this.showGuessing();
|
|
|
|
|
// document.getElementById('controls-panic').style.display = '';
|
|
|
|
|
// };
|
|
|
|
|
|
|
|
|
|
Controls.prototype.setState = function(state) { |
|
|
|
|
const blocks = [ |
|
|
|
|
'controls-connection', |
|
|
|
@ -109,24 +88,49 @@ Controls.prototype.setState = function(state) { |
|
|
|
|
|
|
|
|
|
//===== Message handlers
|
|
|
|
|
|
|
|
|
|
Controls.prototype.msgConnected = function() { |
|
|
|
|
|
|
|
|
|
Controls.prototype.msgJoin = function() { |
|
|
|
|
this.setState('CONNECTING'); |
|
|
|
|
|
|
|
|
|
document.querySelector('#controls-connection .controls-message').innerHTML = 'Connecting...'; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
Controls.prototype.msgComplete = function(evt) { |
|
|
|
|
document.getElementById('controls-moves-solve').style.display = (evt.detail.complete ? 'block' : 'none'); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Controls.prototype.msgConnected = function(evt) { |
|
|
|
|
this.playerId = evt.detail.body;
|
|
|
|
|
console.log("Setting player id to " + this.playerId) |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
Controls.prototype.msgConnectionError = function() { |
|
|
|
|
this.setState('CONNECTING'); |
|
|
|
|
document.querySelector('#controls-connection .controls-message').innerHTML = "Can't reach the server."; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
Controls.prototype.msgCountdown = function(evt) { |
|
|
|
|
|
|
|
|
|
this.setState('COUNTDOWN'); |
|
|
|
|
|
|
|
|
|
document.getElementById('controls-countdown-moves').innerHTML = evt.detail.body.moveCount; |
|
|
|
|
document.getElementById('controls-countdown-player').innerHTML = this.names[evt.detail.body.id]; |
|
|
|
|
|
|
|
|
|
this.countdownStart(evt.detail.body.duration); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
Controls.prototype.msgSkip = function() { |
|
|
|
|
this.countdownComplete(); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
Controls.prototype.msgStack = function(evt) { |
|
|
|
|
const robots = evt.detail.reduce((acc, { id }) => acc.has(id) ? acc : acc.add(id), new Set()); |
|
|
|
|
const moveCount = evt.detail.length - robots.size; |
|
|
|
|
|
|
|
|
|
// document.getElementById('controls-moves').innerHTML = moveCount;
|
|
|
|
|
// document.getElementById('controls-undo').style.display = moveCount > 0 ? 'block' : 'none';
|
|
|
|
|
document.getElementById('controls-moves-solve').style.display = 'none'; |
|
|
|
|
|
|
|
|
|
document.getElementById('controls-moves-count').innerHTML = moveCount; |
|
|
|
|
|
|
|
|
|
document.getElementById('controls-moves-reset').style.display = moveCount > 0 ? 'block' : 'none'; |
|
|
|
|
document.getElementById('controls-moves-undo').style.display = moveCount > 0 ? 'block' : 'none'; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
Controls.prototype.msgPlayers = function(evt) { |
|
|
|
@ -141,7 +145,7 @@ Controls.prototype.msgPlayers = function(evt) { |
|
|
|
|
if (keys.length > 1) { |
|
|
|
|
keys.forEach(connectionId => { |
|
|
|
|
const n = document.createElement('div'); |
|
|
|
|
n.innerHTML = this.names[connectionId]; |
|
|
|
|
n.innerHTML = this.playerId === connectionId ? `${this.names[connectionId]} (you)` : this.names[connectionId]; |
|
|
|
|
n.className = 'controls-player'; |
|
|
|
|
container.appendChild(n) |
|
|
|
|
}); |
|
|
|
@ -152,19 +156,10 @@ Controls.prototype.msgPlayers = function(evt) { |
|
|
|
|
msg.style.display = (keys.length > 1 ? 'none' : 'block'); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
Controls.prototype.msgSkip = function() { |
|
|
|
|
// this.coundownComplete();
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
Controls.prototype.msgState = function(evt) { |
|
|
|
|
// this.setState(evt.detail.body);
|
|
|
|
|
this.setState('SOLUTION') |
|
|
|
|
this.setState(evt.detail.body); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
Controls.prototype.msgStop = function() { |
|
|
|
|
//
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//===== Click handlers
|
|
|
|
|
|
|
|
|
|
Controls.prototype.dispatch = function(evt, data) { |
|
|
|
@ -172,36 +167,38 @@ Controls.prototype.dispatch = function(evt, data) { |
|
|
|
|
document.dispatchEvent(e); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
Controls.prototype.onClickReset = function() { |
|
|
|
|
this.dispatch('L-reset'); |
|
|
|
|
// Options block
|
|
|
|
|
|
|
|
|
|
Controls.prototype.onClickOptionsObjective = function() { |
|
|
|
|
this.dispatch('L-objective'); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
Controls.prototype.onClickRobots = function() { |
|
|
|
|
Controls.prototype.onClickOptionsRobots = function() { |
|
|
|
|
this.dispatch('L-robots'); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
Controls.prototype.onClickSkip = function() { |
|
|
|
|
this.dispatch('L-skip'); |
|
|
|
|
Controls.prototype.onClickOptionsWalls = function() { |
|
|
|
|
this.dispatch('L-walls'); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
Controls.prototype.onClickStart = function() { |
|
|
|
|
this.dispatch('L-start'); |
|
|
|
|
}; |
|
|
|
|
// Moves block
|
|
|
|
|
|
|
|
|
|
Controls.prototype.onClickStop = function() { |
|
|
|
|
this.dispatch('L-stop'); |
|
|
|
|
Controls.prototype.onClickMovesReset = function() { |
|
|
|
|
this.dispatch('L-reset'); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
Controls.prototype.onClickSubmit = function() { |
|
|
|
|
Controls.prototype.onClickMovesSolve = function() { |
|
|
|
|
this.dispatch('L-submit'); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
Controls.prototype.onClickUndo = function() { |
|
|
|
|
Controls.prototype.onClickMovesUndo = function() { |
|
|
|
|
this.dispatch('L-undo'); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
Controls.prototype.onClickWalls = function() { |
|
|
|
|
this.dispatch('L-walls'); |
|
|
|
|
// Countdown block
|
|
|
|
|
|
|
|
|
|
Controls.prototype.onClickSkip = function() { |
|
|
|
|
this.dispatch('L-skip'); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
//===== THE TRASH BIN OF HISTORY
|
|
|
|
@ -256,4 +253,40 @@ Controls.prototype.onClickWalls = function() { |
|
|
|
|
|
|
|
|
|
// Controls.prototype.msgAttempt = function() {
|
|
|
|
|
// alert("Ready for winning attempt!");
|
|
|
|
|
// };
|
|
|
|
|
// };
|
|
|
|
|
|
|
|
|
|
// Controls.prototype.showWaiting = function() {
|
|
|
|
|
// document.getElementById('controls-start').parentNode.style.display = '';
|
|
|
|
|
// document.getElementById('controls-walls').parentNode.style.display = '';
|
|
|
|
|
// document.getElementById('controls-robots').parentNode.style.display = '';
|
|
|
|
|
|
|
|
|
|
// document.getElementById('controls-stop').parentNode.style.display = 'none';
|
|
|
|
|
// // document.getElementById('controls-moves-reset').parentNode.style.display = 'none';
|
|
|
|
|
// document.getElementById('controls-guesses').style.display = 'none';
|
|
|
|
|
// document.getElementById('controls-panic').style.display = 'none';
|
|
|
|
|
// };
|
|
|
|
|
|
|
|
|
|
// Controls.prototype.showPanic = function() {
|
|
|
|
|
// this.showGuessing();
|
|
|
|
|
// document.getElementById('controls-panic').style.display = '';
|
|
|
|
|
// };
|
|
|
|
|
|
|
|
|
|
// Controls.prototype.onClickStart = function() {
|
|
|
|
|
// this.dispatch('L-start');
|
|
|
|
|
// };
|
|
|
|
|
|
|
|
|
|
// Controls.prototype.onClickStop = function() {
|
|
|
|
|
// this.dispatch('L-stop');
|
|
|
|
|
// };
|
|
|
|
|
|
|
|
|
|
// Controls.prototype.msgStop = function() {
|
|
|
|
|
//
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// document.addEventListener('L-reset', this.msgReset.bind(this));
|
|
|
|
|
// document.addEventListener('L-undo', this.msgUndo.bind(this));
|
|
|
|
|
// document.addEventListener('G-stop', this.msgStop.bind(this));
|
|
|
|
|
// document.addEventListener('G-start', this.msgStart.bind(this));
|
|
|
|
|
// document.addEventListener('G-guess', this.msgGuess.bind(this));
|
|
|
|
|
// document.getElementById('controls-start').addEventListener('click', this.onClickStart.bind(this));
|
|
|
|
|
// document.getElementById('controls-stop').addEventListener('click', this.onClickStop.bind(this));
|