359 lines
10 KiB
JavaScript
359 lines
10 KiB
JavaScript
/* ============================================
|
|
CONFIGURATION AVANCÉE (OPTIONNEL)
|
|
Personnalisez le jeu selon vos besoins
|
|
============================================ */
|
|
|
|
/**
|
|
* CONFIGURATION GLOBALE
|
|
* Décommentez et modifiez les valeurs selon vos besoins
|
|
*/
|
|
|
|
// ============================================
|
|
// 1. ANALYTICS (Backend)
|
|
// ============================================
|
|
|
|
// Si vous avez un serveur pour collecter les analytics
|
|
// window.ANALYTICS_ENDPOINT = 'https://votre-api.com/analytics';
|
|
|
|
// Activer/désactiver les analytics
|
|
// window.ANALYTICS_ENABLED = true;
|
|
|
|
// ============================================
|
|
// 2. PERSONNALISATION VISUELLE
|
|
// ============================================
|
|
|
|
// Couleur dominante (remplacer --teal par une autre variable)
|
|
// Changez dans memory-game.css : :root { --couleur-dominante: ... }
|
|
|
|
// Dark mode auto (selon les préférences système)
|
|
// Déjà géré avec @media (prefers-color-scheme: dark)
|
|
|
|
// ============================================
|
|
// 3. COMPORTEMENT DU JEU
|
|
// ============================================
|
|
|
|
// Désactiver les sons (si ajoutés plus tard)
|
|
// window.SOUND_ENABLED = false;
|
|
|
|
// Désactiver les animations pour accessibilité
|
|
// window.REDUCE_MOTION = true;
|
|
// (Détecté automatiquement avec prefers-reduced-motion)
|
|
|
|
// ============================================
|
|
// 4. DURÉES DE TRANSITION
|
|
// ============================================
|
|
|
|
// Durée du flip de carte (ms)
|
|
// const FLIP_DURATION = 1200;
|
|
|
|
// Délai avant vérification d'une paire (ms)
|
|
// const MATCH_CHECK_DELAY = 1200;
|
|
|
|
// ============================================
|
|
// 5. LIMITES DE STOCKAGE
|
|
// ============================================
|
|
|
|
// Nombre maximum de scores à conserver
|
|
// const MAX_SCORES = 100;
|
|
|
|
// Taille maximale du localStorage (bytes)
|
|
// const MAX_STORAGE_SIZE = 5242880; // 5MB
|
|
|
|
// ============================================
|
|
// 6. INTÉGRATION CMS
|
|
// ============================================
|
|
|
|
// URL de callback après fin de jeu (optionnel)
|
|
// window.ON_GAME_COMPLETE_CALLBACK = function(gameData) {
|
|
// // Envoyer les données au CMS
|
|
// fetch('/api/game-complete', {
|
|
// method: 'POST',
|
|
// body: JSON.stringify(gameData)
|
|
// });
|
|
// };
|
|
|
|
// URL pour les récompenses (certifications, badges)
|
|
// window.REWARDS_API = 'https://votre-api.com/rewards';
|
|
|
|
// ============================================
|
|
// 7. MODES PERSONNALISÉS
|
|
// ============================================
|
|
|
|
// Ajouter des niveaux supplémentaires
|
|
// DIFFICULTY_MODES.custom = {
|
|
// name: "Mon Niveau",
|
|
// paires: 6,
|
|
// timeLimit: 240,
|
|
// scoreMultiplier: 1.5,
|
|
// description: "Description personnalisée"
|
|
// };
|
|
|
|
// ============================================
|
|
// 8. ACHIEVEMENTS PERSONNALISÉS
|
|
// ============================================
|
|
|
|
// Ajouter des achievements
|
|
// ACHIEVEMENTS.custom = {
|
|
// id: 'custom_achievement',
|
|
// name: '🎖 Mon Achievement',
|
|
// icon: '🎖',
|
|
// description: 'Description',
|
|
// condition: (moves, time, pairs, difficulty) => {
|
|
// // Votre condition
|
|
// return true;
|
|
// }
|
|
// };
|
|
|
|
// ============================================
|
|
// 9. STYLES PERSONNALISÉS
|
|
// ============================================
|
|
|
|
// Exemple : Charger une police personnalisée
|
|
// const link = document.createElement('link');
|
|
// link.href = 'https://fonts.googleapis.com/css2?family=..';
|
|
// link.rel = 'stylesheet';
|
|
// document.head.appendChild(link);
|
|
|
|
// Exemple : Ajouter un CSS personnalisé
|
|
// const style = document.createElement('style');
|
|
// style.textContent = `
|
|
// :root {
|
|
// --custom-color: #FF0000;
|
|
// }
|
|
// `;
|
|
// document.head.appendChild(style);
|
|
|
|
// ============================================
|
|
// 10. WEBHOOKS & ÉVÉNEMENTS
|
|
// ============================================
|
|
|
|
// Fonction callback au démarrage du jeu
|
|
// window.ON_GAME_START = function(difficulty) {
|
|
// console.log('Jeu démarré en mode:', difficulty);
|
|
// };
|
|
|
|
// Fonction callback à la fin du jeu
|
|
// window.ON_GAME_END = function(gameData) {
|
|
// console.log('Jeu terminé:', gameData);
|
|
// // Faire quelque chose (rediriger, afficher popup, etc.)
|
|
// };
|
|
|
|
// Fonction callback pour chaque match réussi
|
|
// window.ON_PAIR_MATCHED = function(pictogrammeId) {
|
|
// console.log('Paire trouvée:', pictogrammeId);
|
|
// };
|
|
|
|
// ============================================
|
|
// 11. TRADUCTION & LOCALISATION
|
|
// ============================================
|
|
|
|
// Dictionnaire de traduction (exemple pour l'espagnol)
|
|
// const TRANSLATIONS = {
|
|
// en: {
|
|
// 'memory-title': 'Memory Game',
|
|
// 'score': 'Score',
|
|
// 'time': 'Time'
|
|
// },
|
|
// es: {
|
|
// 'memory-title': 'Juego de Memoria',
|
|
// 'score': 'Puntuación',
|
|
// 'time': 'Tiempo'
|
|
// }
|
|
// };
|
|
|
|
// ============================================
|
|
// 12. DONNÉES UTILISATEUR & RGPD
|
|
// ============================================
|
|
|
|
// Pseudo anonyme au lieu du nom complet
|
|
// window.ANONYMOUS_MODE = true;
|
|
|
|
// Acceptation RGPD requise
|
|
// window.GDPR_CONSENT_REQUIRED = true;
|
|
|
|
// Politique de confidentialité
|
|
// window.PRIVACY_POLICY_URL = 'https://votre-site.com/privacy';
|
|
|
|
// ============================================
|
|
// 13. INTÉGRATION LMS (Moodle, Canvas, etc.)
|
|
// ============================================
|
|
|
|
// Paramètres SCORM pour intégration LMS
|
|
// window.SCORM_ENABLED = false;
|
|
// window.SCORM_API_URL = 'https://lms.example.com/scorm';
|
|
|
|
// Passer les scores au LMS
|
|
// window.ON_GAME_COMPLETE = function(score) {
|
|
// if (window.SCORM_ENABLED && window.parent && window.parent.postMessage) {
|
|
// window.parent.postMessage({
|
|
// type: 'game_score',
|
|
// score: score
|
|
// }, '*');
|
|
// }
|
|
// };
|
|
|
|
// ============================================
|
|
// 14. DEBUGGING & MONITORING
|
|
// ============================================
|
|
|
|
// Mode debug global
|
|
// localStorage.setItem('nextgn_debug', 'true');
|
|
|
|
// Profiling des performances
|
|
// window.ENABLE_PERFORMANCE_MONITORING = true;
|
|
|
|
// Logs dans la console (au lieu de localStorage)
|
|
// window.DEBUG_TO_CONSOLE = true;
|
|
|
|
// ============================================
|
|
// 15. EXEMPLE DE CONFIGURATION COMPLÈTE
|
|
// ============================================
|
|
|
|
/*
|
|
// Configuration pour établissement scolaire
|
|
window.GAME_CONFIG = {
|
|
mode: 'classroom',
|
|
classroom_id: 'CLASS-001',
|
|
teacher_email: 'prof@ecole.edu',
|
|
|
|
// Colorier selon établissement
|
|
schoolColors: {
|
|
primary: '#1D9E75',
|
|
secondary: '#FF9800'
|
|
},
|
|
|
|
// Analytics vers serveur école
|
|
analyticsEndpoint: 'https://ecole.edu/api/analytics',
|
|
|
|
// Logo de l'école
|
|
schoolLogo: 'https://ecole.edu/logo.png',
|
|
|
|
// Branding
|
|
appName: 'Memory Pictogrammes - École XYZ',
|
|
|
|
// Récompenses (badges)
|
|
rewardsEnabled: true,
|
|
rewardsAPI: 'https://ecole.edu/api/rewards',
|
|
|
|
// Leaderboard public pour la classe
|
|
clashroomLeaderboard: true,
|
|
|
|
// Rapport pour professeur
|
|
reportingEnabled: true,
|
|
reportAPI: 'https://ecole.edu/api/teacher-reports'
|
|
};
|
|
*/
|
|
|
|
// ============================================
|
|
// HELPERS POUR CONFIGURATION
|
|
// ============================================
|
|
|
|
/**
|
|
* Charger une configuration personnalisée depuis un fichier JSON
|
|
* Exemple : config.json
|
|
*/
|
|
function loadCustomConfig(configUrl) {
|
|
fetch(configUrl)
|
|
.then(response => response.json())
|
|
.then(config => {
|
|
Object.assign(window.GAME_CONFIG || {}, config);
|
|
console.log('Configuration chargée:', config);
|
|
})
|
|
.catch(err => console.error('Erreur chargement config:', err));
|
|
}
|
|
|
|
/**
|
|
* Appliquer des styles personnalisés
|
|
*/
|
|
function applyCustomStyles(styleObject) {
|
|
const root = document.documentElement;
|
|
Object.keys(styleObject).forEach(key => {
|
|
root.style.setProperty(`--${key}`, styleObject[key]);
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Enregistrer un hook personnalisé
|
|
*/
|
|
function registerHook(hookName, callback) {
|
|
if (!window._hooks) window._hooks = {};
|
|
window._hooks[hookName] = callback;
|
|
}
|
|
|
|
/**
|
|
* Exécuter un hook
|
|
*/
|
|
function executeHook(hookName, ...args) {
|
|
if (window._hooks && window._hooks[hookName]) {
|
|
return window._hooks[hookName](...args);
|
|
}
|
|
}
|
|
|
|
// ============================================
|
|
// EXEMPLE D'UTILISATION
|
|
// ============================================
|
|
|
|
/*
|
|
// Dans votre HTML ou un script chargé avant memory-game.js :
|
|
|
|
// 1. Charger une config personnalisée
|
|
loadCustomConfig('/config.json');
|
|
|
|
// 2. Appliquer des styles personnalisés
|
|
applyCustomStyles({
|
|
'teal': '#0F6E56',
|
|
'primary-color': '#185FA5'
|
|
});
|
|
|
|
// 3. Enregistrer des hooks
|
|
registerHook('onGameComplete', function(gameData) {
|
|
console.log('Jeu terminé!', gameData);
|
|
// Envoyer au serveur, ouvrir un formulaire, etc.
|
|
});
|
|
|
|
// 4. Exécuter le hook
|
|
executeHook('onGameComplete', { score: 2500, difficulty: 'normal' });
|
|
*/
|
|
|
|
// ============================================
|
|
// AUTO-CONFIGURATION (Détection d'environnement)
|
|
// ============================================
|
|
|
|
(function detectEnvironment() {
|
|
// Détecter si nous sommes dans un iFrame (LMS, CMS)
|
|
if (window.self !== window.top) {
|
|
console.log('Running in iFrame');
|
|
window.IN_IFRAME = true;
|
|
}
|
|
|
|
// Détecter les paramètres URL
|
|
const params = new URLSearchParams(window.location.search);
|
|
if (params.has('debug')) {
|
|
localStorage.setItem('nextgn_debug', 'true');
|
|
}
|
|
|
|
if (params.has('difficulty')) {
|
|
window.DEFAULT_DIFFICULTY = params.get('difficulty');
|
|
}
|
|
|
|
if (params.has('player')) {
|
|
localStorage.setItem('nextgn_playerName', params.get('player'));
|
|
}
|
|
|
|
// Détecter le thème sombre
|
|
if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
|
|
console.log('Système en mode sombre');
|
|
}
|
|
|
|
// Détecter la langue
|
|
const lang = navigator.language || navigator.userLanguage;
|
|
window.BROWSER_LANG = lang.split('-')[0];
|
|
console.log('Langue du navigateur:', lang);
|
|
})();
|
|
|
|
// ============================================
|
|
// FIN DE LA CONFIGURATION
|
|
// ============================================
|
|
|
|
console.log('✓ Configuration avancée chargée');
|