498 lines
18 KiB
JavaScript
Executable File
498 lines
18 KiB
JavaScript
Executable File
function randomizeCubes() {
|
|
var cubes = document.querySelectorAll('.cube');
|
|
|
|
cubes.forEach(function(cube) {
|
|
// Definindo uma faixa de valores ao redor do centro da tela
|
|
var centerX = 45; // centro horizontal aproximado da tela (45vw)
|
|
var centerY = 40; // centro vertical aproximado da tela (40vh)
|
|
|
|
// Randomizando valores para left e top dentro da faixa definida
|
|
var randomLeft = centerX + Math.floor(Math.random() * 90) - 50; // Variação de -5 a +5
|
|
var randomTop = centerY + Math.floor(Math.random() * 90) - 50; // Variação de -5 a +5
|
|
|
|
var randomDelay = Math.floor(Math.random() * 10); // Randomiza delay de 0 a 10
|
|
|
|
cube.style.left = randomLeft + 'vh';
|
|
cube.style.top = randomTop + 'vw';
|
|
cube.style.animationDelay = randomDelay + 's';
|
|
});
|
|
}
|
|
// Chamando a função para randomizar os elementos ao carregar a página, por exemplo
|
|
window.onload = function() {
|
|
randomizeCubes();
|
|
};
|
|
|
|
|
|
|
|
angular.module('app.controllers', [])
|
|
|
|
.controller('pageCtrl', ['$scope', '$stateParams', '$timeout', '$http',
|
|
function ($scope, $stateParams, $timeout, $http) {
|
|
S = $scope
|
|
|
|
S.toggleCursor = function(state) {
|
|
if (typeof state !== 'undefined') {
|
|
if (state) document.body.classList.add('show-cursor');
|
|
else document.body.classList.remove('show-cursor');
|
|
} else {
|
|
document.body.classList.toggle('show-cursor');
|
|
}
|
|
};
|
|
|
|
// Carregar os dados de parametrização global e aplicar ao tema
|
|
$http.get('dados/config.json').then(function (response) {
|
|
S.themeConfig = response.data;
|
|
S.transitionDuration = S.themeConfig.tema.transitionDuration || 3500;
|
|
S.feedbackDelay = S.themeConfig.tema.feedbackDelay || 3000;
|
|
S.initDelay = S.themeConfig.tema.initDelay || 500;
|
|
console.log(S.themeConfig)
|
|
|
|
if (S.themeConfig.debug) {
|
|
S.debugMode = true; // Para uso no HTML
|
|
//document.documentElement.classList.add('debug-mode');
|
|
document.documentElement.classList.remove('play');
|
|
S.toggleCursor(true);
|
|
console.log("debug-mode on")
|
|
|
|
// Adicionar valor aleatorio nos links de arquivos carregados (evita cache de CSS)
|
|
var randomVal = new Date().getTime();
|
|
document.querySelectorAll('link[rel="stylesheet"]').forEach(function(link) {
|
|
var href = link.getAttribute('href');
|
|
if (href) {
|
|
link.href = href + (href.indexOf('?') === -1 ? '?' : '&') + 'v=' + randomVal;
|
|
}
|
|
});
|
|
|
|
// Lógica de Live-Reload nativo para Apache (checa a cada 2 segundos)
|
|
if (!window.liveReloadAtivo) {
|
|
window.liveReloadAtivo = true;
|
|
let lastModified = null;
|
|
setInterval(() => {
|
|
fetch(window.location.href, { method: 'HEAD', cache: 'no-store' })
|
|
.then(res => {
|
|
const currentModified = res.headers.get('Last-Modified');
|
|
if (lastModified && lastModified !== currentModified) {
|
|
console.log('Alteração detectada! Recarregando...');
|
|
window.location.reload();
|
|
}
|
|
lastModified = currentModified;
|
|
}).catch(() => {});
|
|
}, 2000);
|
|
}
|
|
} else {
|
|
S.debugMode = false;
|
|
document.documentElement.classList.remove('debug-mode');
|
|
document.documentElement.classList.add('play');
|
|
S.toggleCursor(false);
|
|
}
|
|
|
|
// Aplicar as variáveis de cor dinamicamente na raiz do documento
|
|
const rootNode = document.documentElement;
|
|
rootNode.style.setProperty('--cor-fundo-principal', S.themeConfig.cores.fundoPrincipal);
|
|
rootNode.style.setProperty('--cor-fundo-escuro', S.themeConfig.cores.fundoEscuro);
|
|
rootNode.style.setProperty('--cor-texto-principal', S.themeConfig.cores.textoPrincipal);
|
|
rootNode.style.setProperty('--cor-texto-secundario', S.themeConfig.cores.textoSecundario);
|
|
rootNode.style.setProperty('--cor-titulos', S.themeConfig.cores.tituloCor);
|
|
rootNode.style.setProperty('--cor-iniciar-bg', S.themeConfig.cores.btnIniciarFundo);
|
|
rootNode.style.setProperty('--cor-iniciar-texto', S.themeConfig.cores.btnIniciarTexto);
|
|
rootNode.style.setProperty('--cor-acerto', S.themeConfig.cores.corAcerto);
|
|
rootNode.style.setProperty('--cor-erro', S.themeConfig.cores.corErro);
|
|
rootNode.style.setProperty('--cor-fundo-resultado', S.themeConfig.cores.corFundoResultado);
|
|
rootNode.style.setProperty('--cor-transition-bg', S.themeConfig.tema.transitionBackgroundColor || '#000000');
|
|
|
|
Object.keys(S.themeConfig.cores.alternativas).forEach(key => {
|
|
rootNode.style.setProperty(`--cor-alt-${key.toLowerCase()}`, S.themeConfig.cores.alternativas[key]);
|
|
});
|
|
|
|
}).catch(function(err) {
|
|
console.error("Erro ao carregar configurações de tema:", err);
|
|
});
|
|
|
|
S.jogos = 0;
|
|
S.acertos = 0;
|
|
S.erros = 0;
|
|
S.vitorias = 0;
|
|
S.derrotas = 0;
|
|
|
|
|
|
|
|
S.lastCorrect = ""
|
|
S.lastWrong = ""
|
|
S.botoesAtivos = true
|
|
S.qtdItensBackdrop = 18
|
|
|
|
S.victory = false
|
|
S.v5by5 = false
|
|
|
|
S.showStart = true
|
|
// Função para embaralhar array
|
|
function shuffleArray(array) {
|
|
for (var i = array.length - 1; i > 0; i--) {
|
|
var j = Math.floor(Math.random() * (i + 1));
|
|
var temp = array[i];
|
|
array[i] = array[j];
|
|
array[j] = temp;
|
|
console.log(array[i], array[j])
|
|
|
|
}
|
|
for (var i = 0; i < array.length; i++) {
|
|
array[i].letra = String.fromCharCode(65 + i);
|
|
console.log(array[i])
|
|
}
|
|
}
|
|
$http.get('dados/perguntas.json').then(function (response) {
|
|
// Atribuir os dados ao escopo
|
|
$scope.quizDataOriginal = response.data;
|
|
|
|
// Revelar a tela inicial após o carregamento completo
|
|
$timeout(() => {
|
|
S.setupTransitionOut();
|
|
}, S.initDelay);
|
|
|
|
});
|
|
|
|
// Função para garantir que os números aleatórios não se repitam
|
|
S.generateNonRepeatingRandomNumbers = (max, quantity) => {
|
|
if (quantity > max) {
|
|
console.error("Quantidade desejada maior que o intervalo possível.");
|
|
return [];
|
|
}
|
|
|
|
var result = [];
|
|
while (result.length < quantity) {
|
|
var randomNumber = Math.floor(Math.random() * max) + 1;
|
|
if (!result.includes(randomNumber)) {
|
|
result.push(randomNumber);
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
S.startGame = () => {
|
|
console.log("Iniciando jogo")
|
|
S.showStart = false;
|
|
shuffleArray($scope.quizData);
|
|
// Embaralhar as respostas de cada pergunta
|
|
$scope.quizData.forEach(function (pergunta) {
|
|
shuffleArray(pergunta.respostas);
|
|
});
|
|
S.correctList = S.generateNonRepeatingRandomNumbers(5, 5)
|
|
S.wrongList = S.generateNonRepeatingRandomNumbers(5, 5)
|
|
S.play('startgame', 0)
|
|
|
|
S.setupTransitionIn();
|
|
$timeout(() => {
|
|
S.showStart = false;
|
|
S.showGame = true;
|
|
S.setupTransitionOut();
|
|
}, S.transitionDuration);
|
|
}
|
|
|
|
// Função para configurar a transição de entrada
|
|
S.setupTransitionIn = function (el = S.transition) {
|
|
var inList = [
|
|
"in:circle:center", "in:circle:top-left", "in:circle:top-right", "in:circle:bottom-left", "in:circle:bottom-right", "in:circle:hesitate",
|
|
"in:square:center", "in:square:top-left", "in:square:top-right", "in:square:bottom-left", "in:square:bottom-right", "in:square:hesitate",
|
|
"in:wipe:down", "in:wipe:up", "in:wipe:right", "in:wipe:left", "in:wipe:cinematic",
|
|
"in:diamond:center", "in:diamond:hesitate", "in:polygon:opposing-corners"
|
|
];
|
|
var i = Math.floor(Math.random() * inList.length);
|
|
el.attr('transition-style', inList[i]);
|
|
el.css('--transition__duration', (S.transitionDuration / 1000) + 's');
|
|
}
|
|
|
|
// Função para configurar a transição de saída
|
|
S.setupTransitionOut = function (el = S.transition) {
|
|
var outList = [
|
|
"out:circle:center", "out:circle:top-left", "out:circle:top-right", "out:circle:bottom-left", "out:circle:bottom-right", "out:circle:hesitate",
|
|
"out:square:center", "out:square:top-left", "out:square:top-right", "out:square:bottom-left", "out:square:bottom-right", "out:square:hesitate",
|
|
"out:wipe:down", "out:wipe:up", "out:wipe:right", "out:wipe:left", "out:wipe:cinematic",
|
|
"out:diamond:center", "out:diamond:hesitate", "out:polygon:opposing-corners"
|
|
];
|
|
var i = Math.floor(Math.random() * outList.length);
|
|
el.attr('transition-style', outList[i]);
|
|
el.css('--transition__duration', (S.transitionDuration / 1000) + 's');
|
|
S.botoesAtivos = true;
|
|
}
|
|
|
|
S.transition = angular.element(document.getElementById("transition"))
|
|
|
|
S.initTransition = angular.element(document.getElementById("initTransition"))
|
|
S.start = angular.element(document.getElementById("start"))
|
|
|
|
console.log(S.initTransition)
|
|
S.voltarInicio = function () {
|
|
S.iniciarNovoJogo()
|
|
|
|
$timeout(_ => {
|
|
S.setupTransitionIn(S.start)
|
|
}, 2000)
|
|
}
|
|
// Função para iniciar um novo jogo
|
|
$scope.iniciarNovoJogo = function () {
|
|
randomizeCubes()
|
|
S.jogos++
|
|
S.criarListaDinamica(S.qtdItensBackdrop)
|
|
$timeout(_ => {
|
|
S.setupTransitionIn(S.initTransition)
|
|
}, 200)
|
|
$timeout(_ => {
|
|
S.showStart = true
|
|
S.setupTransitionOut(S.initTransition)
|
|
}, 2500)
|
|
$timeout(_ => {
|
|
S.victory = false
|
|
S.lose = false
|
|
S.showGame = false
|
|
$timeout(() => {
|
|
S.$apply()
|
|
}, 10)
|
|
S.v5by5 = false
|
|
|
|
// Atribuir os dados ao escopo
|
|
$scope.quizData = $scope.quizDataOriginal
|
|
|
|
shuffleArray($scope.quizData);
|
|
// Embaralhar as respostas de cada pergunta
|
|
$scope.quizData.forEach(function (pergunta) {
|
|
shuffleArray(pergunta.respostas);
|
|
});
|
|
|
|
// Inicializa o objeto de quiz
|
|
$scope.quiz = {
|
|
perguntas: S.quizData,
|
|
perguntaAtual: 0, // Índice da pergunta atual
|
|
perguntasRespondidas: 1,
|
|
pontuacao: 0
|
|
};
|
|
|
|
}, 2000)
|
|
}
|
|
|
|
S.chamaResultado = function () {
|
|
if ($scope.quiz.pontuacao >= 3) {
|
|
$timeout(() => {
|
|
S.setupTransitionIn();
|
|
$timeout(() => {
|
|
S.vitorias++
|
|
S.salvarDadosJogos();
|
|
S.victory = true
|
|
S.showGame = false
|
|
if (S.quiz.pontuacao === 5) {
|
|
S.v5by5 = true
|
|
S.play("success2", 1)
|
|
} else {
|
|
S.play("success1", 1)
|
|
S.v5by5 = false
|
|
}
|
|
S.setupTransitionOut();
|
|
}, S.transitionDuration);
|
|
}, 3000)
|
|
} else {
|
|
$timeout(_ => {
|
|
S.setupTransitionIn();
|
|
$timeout(() => {
|
|
S.derrotas++
|
|
S.salvarDadosJogos();
|
|
S.victory = false
|
|
S.showGame = false
|
|
S.lose = true
|
|
S.play('wawawa', 0.5)
|
|
S.setupTransitionOut();
|
|
}, S.transitionDuration);
|
|
}, 3000)
|
|
}
|
|
};
|
|
|
|
S.checarAlturaResposta = ()=> {
|
|
// Usando jQuery para encontrar o elemento
|
|
var respostaTextoElement = document.querySelectorAll('.right-side .resposta-texto');
|
|
|
|
respostaTextoElement.forEach(el=> {
|
|
// Verificando se o elemento tem mais de uma linha
|
|
if (el.scrollHeight > el.clientHeight + 10) {
|
|
// O texto tem mais de uma linha
|
|
console.log("O texto tem mais de uma linha.");
|
|
el.style.marginTop = "-0.90em"
|
|
} else {
|
|
// O texto tem apenas uma linha
|
|
console.log("O texto tem uma linha ou menos.");
|
|
}
|
|
})
|
|
}
|
|
|
|
S.destacarRespostaCorreta = function () {
|
|
// Obtém o índice da pergunta atual
|
|
var indicePergunta = S.quiz.perguntaAtual;
|
|
|
|
// Obtém o índice da resposta correta
|
|
var indiceRespostaCorreta = S.quizData[indicePergunta].respostas.findIndex(function (resposta) {
|
|
return resposta.correta;
|
|
});
|
|
|
|
// Adiciona a classe 'resposta-correta' à opção correta
|
|
var respostaCorretaElement = document.querySelector('#button-' + indiceRespostaCorreta);
|
|
if (respostaCorretaElement) {
|
|
respostaCorretaElement.classList.add('resposta-correta');
|
|
}
|
|
};
|
|
|
|
// Adicione a função para responder a uma pergunta
|
|
$scope.responder = function ($evento, indiceResposta) {
|
|
if (!S.botoesAtivos) return;
|
|
var pontuacaoDaResposta = 1
|
|
S.showStart = false
|
|
S.botoesAtivos = false
|
|
S.respostaAtual = $scope.quiz.perguntas[$scope.quiz.perguntaAtual].respostas[indiceResposta];
|
|
S.botaoClicado = angular.element($evento.currentTarget);
|
|
// Verifica se a resposta está correta
|
|
if (S.respostaAtual.correta) {
|
|
// Se a resposta estiver correta, altera a classe para verde
|
|
S.acertos++
|
|
var pontuacaoDaResposta = 1
|
|
S.play('correct')
|
|
S.botaoClicado.addClass('resposta-correta');
|
|
|
|
|
|
} else {
|
|
// Se a resposta estiver incorreta, altera a classe para vermelha
|
|
S.play('wrong')
|
|
S.botaoClicado.addClass('resposta-incorreta');
|
|
S.destacarRespostaCorreta()
|
|
S.erros++
|
|
var pontuacaoDaResposta = 0
|
|
}
|
|
|
|
$scope.quiz.pontuacao += pontuacaoDaResposta;
|
|
if ($scope.quiz.perguntasRespondidas === 5) {
|
|
S.chamaResultado()
|
|
|
|
}
|
|
// Aguarda o tempo de feedback antes de passar para a próxima pergunta
|
|
$timeout(function () {
|
|
// Iniciar transição entre perguntas
|
|
S.setupTransitionIn();
|
|
|
|
$timeout(function () {
|
|
// No meio da transição (quando a tela estiver coberta), trocamos a pergunta
|
|
// Remove a classe para garantir que ela seja aplicada corretamente na próxima vez
|
|
S.botaoClicado.removeClass('resposta-correta').removeClass('resposta-incorreta');
|
|
|
|
// Passa para a próxima pergunta
|
|
$scope.quiz.perguntaAtual++;
|
|
$scope.quiz.perguntasRespondidas++;
|
|
|
|
// Reseta posições e alturas se necessário
|
|
S.checarAlturaResposta();
|
|
|
|
// Retira a transição
|
|
S.setupTransitionOut();
|
|
}, S.transitionDuration); // Tempo dinâmico baseado no config.json
|
|
|
|
}, S.feedbackDelay);
|
|
};
|
|
|
|
|
|
|
|
// Função para reproduzir o áudio
|
|
$scope.play = function (track, dl = 0) {
|
|
if (track == "correct") {
|
|
track = "correct" + (Math.floor(Math.random() * 3) + 1)
|
|
S.imagemURL = "correct" + S.correctList[S.quiz.perguntasRespondidas - 1]
|
|
|
|
}
|
|
if (track == "success") {
|
|
track = "success" + (Math.floor(Math.random() * 2) + 1)
|
|
// S.imagemURL = "correct" + (Math.floor(Math.random() * 5) + 1) + ".gif"
|
|
}
|
|
if (track == "wrong") {
|
|
// track = "wrong" + (Math.floor(Math.random() * 2) + 1)
|
|
S.imagemURL = "wrong" + S.wrongList[S.quiz.perguntasRespondidas - 1]
|
|
}
|
|
console.log(track, S.imagemURL)
|
|
var audioElement = document.getElementById(track);
|
|
$timeout(e => {
|
|
audioElement.play();
|
|
}, dl * 1000)
|
|
};
|
|
|
|
// S.criarListaDinamica = (quantidade, el = '.circles') => {
|
|
// // Seleciona o elemento ul com a classe 'circles'
|
|
// var ulElement = document.querySelector(el);
|
|
|
|
// // Garante que a quantidade seja um número positivo
|
|
// quantidade = Math.max(0, parseInt(quantidade) || 0);
|
|
|
|
// // Remove os elementos existentes dentro da lista
|
|
// ulElement.innerHTML = '';
|
|
|
|
// // Cria dinamicamente os elementos li e os adiciona à lista
|
|
// for (var i = 0; i < quantidade; i++) {
|
|
// var liElement = document.createElement('li');
|
|
// liElement.textContent = String.fromCharCode(65 + (i % 4)); // A, B, C, D
|
|
// ulElement.appendChild(liElement);
|
|
// }
|
|
// S.randomizeFloating()
|
|
// }
|
|
|
|
S.criarListaDinamica = (quantidade, el = '.circles') => {
|
|
// Obsoleto - removido devido ao novo layout whitelabel
|
|
}
|
|
|
|
S.randomizeFloating = function () {
|
|
// Obsoleto - removido devido ao novo layout whitelabel
|
|
}
|
|
S.randomizeFloating()
|
|
|
|
console.log(S.initTransition)
|
|
S.iniciarNovoJogo()
|
|
|
|
S.dadosJogos = function () {
|
|
// Tenta recuperar os dados do localStorage
|
|
var dadosSalvos = localStorage.getItem('quiz_dadosjogos');
|
|
if (dadosSalvos) {
|
|
try {
|
|
var dadosJogos = JSON.parse(dadosSalvos);
|
|
S.jogos = dadosJogos.jogos || 0;
|
|
S.acertos = dadosJogos.acertos || 0;
|
|
S.erros = dadosJogos.erros || 0;
|
|
S.vitorias = dadosJogos.vitorias || 0;
|
|
S.derrotas = dadosJogos.derrotas || 0;
|
|
} catch (e) {
|
|
console.error('Erro ao fazer parse dos dados do localStorage', e);
|
|
}
|
|
} else {
|
|
// Se não houver dados, inicializa variáveis locais como 0
|
|
S.jogos = 0;
|
|
S.acertos = 0;
|
|
S.erros = 0;
|
|
S.vitorias = 0;
|
|
S.derrotas = 0;
|
|
}
|
|
};
|
|
S.dadosJogos()
|
|
|
|
S.salvarDadosJogos = function () {
|
|
const dadosJogosObj = {
|
|
jogos: S.jogos,
|
|
acertos: S.acertos,
|
|
erros: S.erros,
|
|
vitorias: S.vitorias,
|
|
derrotas: S.derrotas
|
|
};
|
|
|
|
try {
|
|
localStorage.setItem('quiz_dadosjogos', JSON.stringify(dadosJogosObj));
|
|
console.log('Dados do jogo salvos com sucesso no LocalStorage!');
|
|
} catch (err) {
|
|
console.error('Erro ao salvar os dados no LocalStorage:', err);
|
|
}
|
|
};
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
]) |