114 lines
3 KiB
JavaScript
114 lines
3 KiB
JavaScript
"use strict";
|
|
|
|
const GAME_NOT_STARTED = 0;
|
|
const GAME_STARTED = 1;
|
|
const GAME_WON = 2;
|
|
const GAME_LOST = 3;
|
|
const CHEAT = false;
|
|
|
|
let gameState = GAME_NOT_STARTED;
|
|
|
|
let zones = undefined;
|
|
let timer = undefined;
|
|
|
|
let endTimeout = undefined;
|
|
let roundTimeout = undefined;
|
|
let timerInterval = undefined;
|
|
|
|
let timeBetween = 2000;
|
|
const MIN_TIME_BETWEEN = 1000;
|
|
const ACCELERATION = 100;
|
|
const DURATION = 60_500;
|
|
|
|
let score = 0;
|
|
let zonesCount = 0;
|
|
let zonesTotal = 0;
|
|
let startTime = undefined;
|
|
|
|
function start() {
|
|
document.getElementsByTagName("button")[0].disabled = true;
|
|
gameState = GAME_STARTED;
|
|
startTime = new Date();
|
|
timer = document.getElementById("timer");
|
|
|
|
zones = document.getElementsByClassName("zone");
|
|
for (const zone of zones) {
|
|
zone.addEventListener("click", event => {
|
|
if (gameState !== GAME_STARTED) {
|
|
return;
|
|
}
|
|
if (!event.target.classList.contains("inactive")) {
|
|
event.target.style.transition = "";
|
|
event.target.classList.remove("fade-out");
|
|
event.target.classList.add("inactive");
|
|
incrementScore();
|
|
}
|
|
})
|
|
}
|
|
|
|
endTimeout = setTimeout(end, DURATION);
|
|
timerInterval = setInterval(updateTimer, 500);
|
|
roundTimeout = setTimeout(round, 1);
|
|
}
|
|
|
|
function updateTimer() {
|
|
const now = new Date();
|
|
timer.innerText = Math.floor(Math.abs(startTime - now) / 1000).toString();
|
|
}
|
|
|
|
function round() {
|
|
if (gameState !== GAME_STARTED) {
|
|
end();
|
|
return;
|
|
}
|
|
|
|
let zone = zones[Math.floor(Math.random() * zones.length)];
|
|
|
|
incrementTotal();
|
|
|
|
zone.classList.remove("inactive", "fade-out");
|
|
zone.style.transition = "";
|
|
|
|
if (CHEAT) {
|
|
setTimeout(() => {
|
|
zone.click();
|
|
}, 200);
|
|
}
|
|
|
|
setTimeout(function() {
|
|
zone.style.transition = `opacity ${timeBetween-(MIN_TIME_BETWEEN / 2)}ms linear`;
|
|
}, 100);
|
|
|
|
setTimeout(function () {
|
|
zone.classList.add("fade-out");
|
|
}, MIN_TIME_BETWEEN / 2);
|
|
|
|
// Recursive call, sorta
|
|
timeBetween -= ACCELERATION;
|
|
if (timeBetween <= MIN_TIME_BETWEEN) {timeBetween = MIN_TIME_BETWEEN;}
|
|
roundTimeout = setTimeout(round, timeBetween);
|
|
}
|
|
|
|
function end() {
|
|
clearTimeout(roundTimeout);
|
|
clearTimeout(endTimeout);
|
|
clearInterval(timerInterval);
|
|
if (gameState === GAME_STARTED) {
|
|
gameState = GAME_WON;
|
|
document.getElementsByClassName("success stamp")[0].classList.remove("hidden");
|
|
} else if (gameState === GAME_LOST) {
|
|
document.getElementsByClassName("failure stamp")[0].classList.remove("hidden");
|
|
}
|
|
}
|
|
|
|
function incrementScore() {
|
|
score += Math.floor(Math.random() * zones.length) + 1;
|
|
zonesCount++;
|
|
document.getElementById("score").innerText = score.toString();
|
|
document.getElementById("zonesCount").innerText = zonesCount.toString();
|
|
}
|
|
|
|
function incrementTotal() {
|
|
zonesTotal++;
|
|
document.getElementById("zonesTotal").innerText = zonesTotal.toString();
|
|
}
|