/**
* js/map.js
*/
/**
* Typos
*
* Après l'ajout de l'Afrique, on remplace "communes" par "zones"
* Zones = Communes ou Pays
*/
/**
* Récupérer le nom du fichier actuel (ex: 971.php) et en extraire le code du département (ex: 971).
*/
const currentFileName = window.location.pathname.split('/').pop()
const codeCarte = currentFileName.split('.')[0]
const startButton = document.getElementById('start')
const restartButton = document.getElementById('restart')
restartButton.setAttribute('disabled', true)
/**
* Définir le centre , le niveau de zoom et le style de la carte en fonction du code du département.
*/
let centerCoordinates
let zoomLevel
let styleFileName
switch (codeCarte) {
case 'KAMA':
centerCoordinates = [21.21, 1.36] // Afrique
zoomLevel = 2.7
styleFileName = 'ortho-jwe-KAMA.json'
break
case '971':
centerCoordinates = [-61.4167, 16.25] // Guadeloupe
zoomLevel = 9
styleFileName = 'ortho.json'
break
case '972':
centerCoordinates = [-61.01635, 14.60285] // Martinique
zoomLevel = 9.5
styleFileName = 'ortho.json'
break
case '973':
centerCoordinates = [-53.1258, 3.9339] // Guyane française
zoomLevel = 7
styleFileName = 'ortho-jwe.json'
break
case '974':
centerCoordinates = [55.52905, -21.13014] // La Réunion
styleFileName = 'ortho.json'
zoomLevel = 9.5
break
default:
centerCoordinates = [-61.4167, 16.25] // Par défaut (Guadeloupe)
styleFileName = 'ortho.json'
zoomLevel = 9.5
}
/**
* Définit les décalages des popups en fonction de leur position.
*/
const popupOffsets = {
'top': [0, 0],
'top-left': [0, 0],
'top-right': [0, 0],
'bottom': [0, -30],
'bottom-left': [0, -50],
'bottom-right': [0, -50],
'left': [25, -25],
'right': [-25, -25]
}
/**
* Référence aux éléments HTML pour afficher le score.
*/
let ok
let ko
let penaltyElement
/**
* Gestion du temps écoulé
*/
let gameTime = 0
let gameMinute = 0
let gameSecond = 0
let gamePenalty = 0
let intervalId
/**
* État actuel de la commune survolée.
*/
let hoveredStateId = null
/**
* Référence à la commune actuellement sélectionnée pour trouver.
*/
let currentZone = null
/**
* Ensemble des codes des communes déjà trouvées correctement.
*/
const correctAnswers = new Set()
/**
* Permet de remettre le jeu à 0
*/
function resetGame() {
ok.innerText = 0
ko.innerText = 0
correctAnswers.clear()
clearInterval(intervalId)
gameTime = 0
gamePenalty = 0
}
/**
* Active le bouton "Commencer la partie" au chargement de la page
*/
window.onload = function() {
const startElement = document.getElementById('start')
startElement.removeAttribute('disabled')
}
function startGame() {
loadMap()
const question = document.getElementById('question')
const score = document.getElementById('score')
const chrono = document.getElementById('chrono')
question.innerHTML = `
Trouve ${codeCarte === 'KAMA' ? 'le pays' : 'la commune'}
...
`
score.innerHTML = "
Correct ✅ : 0
Faux ❌ : 0
"
chrono.innerHTML = "
Temps écoulé :
"
communeObserver()
ok = document.getElementById('OK')
ko = document.getElementById('KO')
penaltyElement = document.getElementById('penalty')
startButton.setAttribute('disabled', true)
restartButton.removeAttribute('disabled')
resetGame()
}
/**
* Recommencer la partie
*/
function restartGame() {
startGame()
}
/**
* Observe le contenu de l'élément ayant pour id "commune"
*/
function communeObserver(){
const communeElement = document.getElementById('commune')
const timeElement = document.getElementById('time')
// Options de l'observateur (quelles sont les mutations à observer)
const config = { childList: true, subtree: true, characterData: true }
// Fonction callback à éxécuter quand une mutation est observée
const callback = function (mutationsList) {
for (var mutation of mutationsList) {
if (mutation.type == "childList" || mutation.type == "characterData") {
// Vérifie si le contenu de la balise span n'est pas égal à "..."
if (communeElement.textContent.trim() !== "...") {
// Vérifie si setInterval n'est pas déjà en cours
if (!intervalId) {
intervalId = setInterval(() => {
gameTime++
if (gameTime >= 60) {
gameMinute = String(gameTime / 60).split('.')[0]
gameSecond = gameTime % 60
timeElement.innerText = `${gameMinute} minute${gameMinute > 1 ? 's' : ''} ${gameSecond} seconde${gameSecond > 1 ? 's' : ''}`
} else {
timeElement.innerText = `${gameTime} seconde${gameTime > 1 ? 's' : ''}`
}
}, 1000)
}
}
}
}
}
// Créé une instance de l'observateur lié à la fonction de callback
const observer = new MutationObserver(callback)
// Commence à observer le noeud cible pour les mutations précédemment configurées
observer.observe(communeElement, config)
}
/**
* Récupère les propriétés des communes depuis un fichier GeoJSON en fonction du code du département.
*
* @async
* @param {string} codeCarte - Code de la carte.
* @returns {Promise