var urlSite = "https://chingplay.fr"; var local = false //============ Langue function accueil_changeLangue(ev) { if (ui_langue == 'fr') { ui_langue = 'en'; } else { ui_langue = 'fr' } cookie_save("langue", ui_langue); ev.currentTarget.className = (ui_langue == 'fr' ? 's60 s_a' : 's60 s_b'); accueil_updateLangue() } function accueil_updateLangue() { var liste = document.querySelectorAll(".langFR") for (var i = 0; i < liste.length; i++) { liste[i].style.display = (ui_langue == 'fr' ? "block" : "none") } var liste = document.querySelectorAll(".langEN") for (var i = 0; i < liste.length; i++) { liste[i].style.display = (ui_langue == 'en' ? "block" : "none") } //==== Vidéo var video = document.querySelector('#index_video'); if (ui_langue == "fr") { video.innerHTML = ''; } else { video.innerHTML = ''; } } function gameErreur(erreur) { console.log(erreur.toString()) document.querySelector("#divError > div").innerHTML = errorNumLine(erreur.toString()) document.querySelector("#divError > div").style.display = "block" } function errorPython(str) { console.log("errorPython: " + str); document.querySelector("#divError > div").innerHTML = errorNumLine(str) document.querySelector("#divError > div").style.display = "block" throw new Sk.builtin.MyError(errorNumLine(str), "", "") } function errorPythonEvent(err, method) { console.log(err.args.v[0].v) document.querySelector("#divError > div").innerHTML = err.tp$name + " : " + errorNumLine(err.args.v[0].v) + " (function " + method + ")" document.querySelector("#divError > div").style.display = "block" } function errorNumLine(str) { var reg = /line ([0-9]+)/ var result; if (result = str.match(reg)) { num = parseInt(result[1]) const linesA = (myCodeInit.getValue().match(/\n/g) || '').length + 1 const linesB = (myCodeLoop.getValue().match(/\n/g) || '').length + 1 const linesC = (myCodeListener.getValue().match(/\n/g) || '').length + 1 console.log(num + "-" + linesA + " " + linesB + " " + linesC) var section; if (num < linesA) { section = "(code init)" } else if (num < linesA + linesB) { section = "(code loop)" num = num - linesA } else { section = "(code listener)" num = num - linesA - linesB } return str.replace(reg, "line " + num + " " + section) } else { return str } } /*=================== Gestion des erreurs ===================*/ string_error_entier = {'fr': "le XXX0XXXe argument doit être un entier", "en": "the XXX0XXXth argument must be an integer"}; string_error_string = {"fr": "le XXX0XXXe argument doit être une chaîne de caractères", "en":"the XXX0XXXth argument must be a string"}; string_error_couleurString = {"fr": "le XXX0XXXe argument doit être une chaîne de caractères", "en": "the XXX0XXXth argument must be a string"}; string_error_couleurFormat = { "fr": "le XXX0XXXe argument représenté une couleur au format hexadécimal", "en": "the XXX0XXXth argument represent a color in hexadécimal format"}; string_error_boolean = { "fr": "le XXX0XXXe argument doit être une booléan", "en": "the XXX0XXXth argument must to be a boolean"}; function errorEntier(num, pos, nomVariable, nameVariable) { if (!Number.isInteger(num)) { console.log('La valeur doit être entière : ',num) if (pos == 0) { var error; if (data['langue'] == 'fr') { //??????????? ne marche poas ??? ENLEVER nomVariable et nameVariable à part error = "la variable " + nomVariable + " doit être un entier"; } else { error = "The variable " + nameVariable + " must be an integer"; } throw new Sk.builtin.ValueError(error); } else { message_erreur(string_error_entier,pos); } } } function errorString(val, pos) { if (typeof val != "string") { var error; if (pos == 0) { if (data['langue'] == 'fr') { error = "la variable " + nomVariable + " doit être une chaîne de caractères"; } else { error = "The variable " + nameVariable + " must be a string"; } throw new Sk.builtin.ValueError(error); } else { message_erreur(string_error_string,pos); } } } function errorCouleur(val, pos) { var str; if (typeof val == "string") { var regexp = /^#[0-9A-Fa-f]{6}$/ if (!regexp.test(val)) { message_erreur(string_error_couleurFormat,pos); } } else { message_erreur(string_error_couleurString,pos); } } function errorTableau(val, pos) { //==== Vérifie le type Array if ((typeof val != "object") || (val.length == null)) { if (data['langue'] == 'fr') { str = "le " + pos + "e argument doit être un tableau"; } else { str = "the " + pos + "th argument must be an array"; } throw new Sk.builtin.ValueError(str); return; } //==== Vérifie que les éléments existent en conjonction avec l'argument length for (var i = 0; i < val.length; i++) { if (val[i] == null) { if (data['langue'] == 'fr') { str = "le " + pos + "e argument est un tableau mais ne possède pas d'élément à la position " + i; } else { str = "the " + pos + "th argument is an array but has no element at position " + i; } throw new Sk.builtin.ValueError(str); } } } function errorTableauLongueur(val, pos, length) { if (val.length != length) { if (data['langue'] == 'fr') { str = "le " + pos + "e argument doit être un tableau de dimension " + length + " (trouvé " + val.length + ")"; } else { str = "the " + pos + "th argument must be an array of dimension " + length + " (trouvé " + val.length + ")"; } throw new Sk.builtin.ValueError(str); } } function errorTableauEntier(val, pos) { for (var i = 0; i < val.length; i++) { if (!Number.isInteger(val[i].v)) { if (data['langue'] == 'fr') { str = "le " + pos + "e argument doit être un tableau d'entiers (erreur à l'index " + i + ")"; } else { the = "the " + pos + "th argument must be an integer array (error at index " + i + ")"; } throw new Sk.builtin.ValueError(str); return; } } } function errorBoolean(val,pos){ //console.log(val.tp$name) if((val.tp$name==null) || (val.tp$name!="bool")){ message_erreur(string_error_boolean,pos); } } function message_erreur(...args) { console.log() //=== récupère la chaine var ch = (data['langue']=='fr'?args[0]["fr"]:args[0]['en']); //=== prend en compte les autres valeurs for(var i=1;i #presentation'); elt.innerHTML = decodeBase64(data['presentation']); //==== Onglet ABC du code var elt = document.querySelector('#divOnglet3 > #presentation'); elt.innerHTML = decodeBase64(data['abcCode']); //==== Gestion de l'AI if ((data['modeleNum'] == '6') && (!game_loadData_aiScript)){ game_loadData_aiScript = true; var elt = document.createElement('script'); elt.src = urlSite + '/javascript-mod-ai-967687.js'; elt.async = false elt.setAttribute('defer','') elt.addEventListener('load',() => {ai_ui_onLoad();}); document.head.appendChild(elt); } //===== Cache les onglets inutiles for(var i=0;i<6;i++){ if(data['ongletHidden'].indexOf(i)==-1){ document.querySelector('#nav'+i).style.display="inline-block" } else{ document.querySelector('#nav'+i).style.display="none" } } //===== Affiche de l'onglet par défaut ui_ongletAff(data['ongletDefault']) } //===================== Model game function loadModelGameeeeeeeeeeeeeeeeeee(ev) { //Charge var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function () { if (xhr.readyState == XMLHttpRequest.DONE) { if (xhr.status == 200) { //document.location = "" } } } xhr.open("POST", "loadGame.php"); xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); xhr.send("m=1"); } function delCookieGame(ev) { var code = ev.currentTarget.getAttribute("code64") console.log("delCookieGame " + code) var str; if (data['langue'] == 'fr') { str = 'Souhaitez-vous effacer le jeu "' + code + '"?'; } else { str = 'Wish to delete the game "' + code + '"?'; } if (!confirm(str)) { return; } //==== Efface le cookie var str = "game-" + data['langue'] + "-" + data['gameNum'] + "=ee; path=/; expires=Thu, 01 Jan 1970 00:00:01 GMT;" console.log(str) document.cookie = str //==== Efface la session var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function () { if (xhr.readyState == XMLHttpRequest.DONE) { if (xhr.status == 200) { document.location = "" } } } xhr.open("POST", "deconnexion.php"); xhr.send(); }var timeoutActiveLoop = null; var listListener = [] function py_run() { console.log("py_run") //==== Efface la console d'erreur document.querySelector("#divError > div").style.display = "none" //==== Efface la console et rétabli le défilé var elt = document.querySelector("#ui_output"); elt.innerHTML = "" elt.style.display = "flex" //==== Arrete le loop gameStopLoop(); //==== Efface les listeners console.log("listener", listListener.length, listListener) for (var i = 0; i < listListener.length; i++) { a = listListener[i] console.log("listener", a) a[0].removeEventListener(a[1], a[2]) } //==== Recherche le code var prog = myCodeInit.getValue() + "\n" + myCodeLoop.getValue() + "\n" + myCodeListener.getValue(); //Chache l'erreur //document.querySelector('#' + prefix + "Erreur").style.display = "none" //document.getElementById(prefix + "Output").innerHTML = "" //var mypre = document.getElementById(idResultat); //mypre.innerHTML = ''; Sk.externalLibraries = { "numpy": { path: urlSite + '/fichier/python/module-numpy/__init__.js', dependencies: [urlSite + '/fichier/python/module-deps/math.js'] }, "matplotlib": { path: '/fichier/python/module-matplotlib/__init__.js' }, "turtle": { path: '/fichier/python/module-turtle/turtle.js' }, "game": { path: urlSite + '/module/skulpt/module-game/__init__.js' }, "game.ai": { path: urlSite + '/module/skulpt/module-game/ai/__init__' + timestampJS + '.js' }, "game.dinosaure": { path: urlSite + '/module/skulpt/module-game/dinosaure/__init__' + timestampJS + '.js' }, "game.pacman": { path: urlSite + '/module/skulpt/module-game/pacman/__init__' + timestampJS + '.js' }, "game.pixelart": { path: urlSite + '/module/skulpt/module-game/pixelart/__init__' + timestampJS + '.js' }, "game.arkanoid": { path: urlSite + '/module/skulpt/module-game/arkanoid/__init__' + timestampJS + '.js' }, "game.pong": { path: urlSite + '/module/skulpt/module-game/pong/__init__' + timestampJS + '.js' }, "game.snake": { path: urlSite + '/module/skulpt/module-game/snake/__init__' + timestampJS + '.js' }, "game.tictactoe": { path: urlSite + '/module/skulpt/module-game/tictactoe/__init__' + timestampJS + '.js' }, "matplotlib.pyplot": { path: urlSite + '/module-matplotlib/pyplot/__init__.js', dependencies: [urlSite + '/fichier/python/module-deps/d3.min.js', urlSite + '/fichier/python/module-deps//jquery.js'] } }; Sk.onAfterImport = function (library) { console.log("Nom library : " + library + " / Ideal pour ré-initialiser les variables") switch (library) { case 'pygal': // make charts render instantly Highcharts.setOptions({ plotOptions: { series: { animation: false } } }); break; case 'turtle': console.log("onAfterImport Turtle") // make turtle draw instantly Sk.tg.defaults.animate = false; Sk.tg.Turtle.prototype.speed = function () { } Sk.tg.Turtle.prototype.delay = function () { } break; case 'game.pixelart': mode = null; col = null; row = null; } } function builtinRead(x) { if (Sk.builtinFiles === undefined || Sk.builtinFiles["files"][x] === undefined) throw "File not found: '" + x + "'"; return Sk.builtinFiles["files"][x]; } Sk.pre = "output"; Sk.ExternalError = true Sk.configure({ output: (text) => { document.getElementById("ui_output").innerHTML += text; }, read: builtinRead, __future__: Sk.python3, }); Sk.python3 = true Sk.canvas = "canvas"; Sk.svg = document.querySelector('svg'); //(Sk.TurtleGraphics || (Sk.TurtleGraphics = {})).target = Sk.canvas; Sk.GameSvg = "outputSVG"; var myPromise = Sk.misceval.asyncToPromise(function () { //console.log("myPromise myJava-charge", prog) //==== Charge le code console.log("aaaaaaaaaa100") window.mod = Sk.importMainWithBody("", false, prog); //console.log("aaaaaaaaaa", prog) //==== Lance quelques vérifications gameBeforeInit(); console.log("aaaaaaaaaa1") //==== Lance le loop gameActiveLoop(); console.log("aaaaaaaaaa2") gameAfterInit() console.log("aaaaaaaaaa3") return window.mod; }); myPromise.then(function (mod) { //py_activeCanvas(prefix) console.log('success ' + this); }, function (err) { console.log("ERREUR myPromise") errorPython(err.toString()) /* var eltA = document.querySelector('#' + prefix + "Erreur") setTimeout(() => { eltA.style.display = "flex" }, 500) var eltB = document.querySelector('#' + prefix + "Erreur > :nth-child(1)") eltB.innerText = err.toString(); */ }); } function gameActiveLoop() { console.log("A REDEFINIR DANS CHAQUE PACKAGE"); } function gameStopLoop() { console.log("gameStopLoop") //=== Looop if (timeoutActiveLoop != null) { clearTimeout(timeoutActiveLoop); } } function gameBeforeInit() { console.log("gameBeforeInit"); } function gameAfterInit() { console.log("gameAfterInit"); } function downloadGame() { //Charge var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function () { if (xhr.readyState == XMLHttpRequest.DONE) { if (xhr.status == 200) { if (xhr.responseText.substring(0, 7) == "Erreur:") { console.log("Erreur"); } else { // Crée le blob //var data = Uint8Array.from(atob(xhr.responseText), c => c.charCodeAt(0)); var data = xhr.responseText; var blob = new Blob([data], { type: "octet/stream" }); //Lance le telechargement var element = document.createElement('a'); mime = "text/html"; element.setAttribute('href', window.URL.createObjectURL(blob)); element.setAttribute('download', 'ChingPlay-blabla.html'); element.style.display = 'none'; document.body.appendChild(element); element.click(); document.body.removeChild(element); } } } } xhr.open("POST", "downloadGame.php"); xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); xhr.send("n=" + data['gameNum'] + "&p=" + gamePassword + "&l=" + (local ? 0 : 0)); } var navFontSize = 15 function load_codeMirror(dest, code, read_only) { //===== Efface l'ancien code var elt = document.querySelector('#divOnglet' + dest + ' > :nth-child(2)'); elt.innerHTML = ''; //===== génère le nouveau return CodeMirror(elt, { value: code, mode: "python", lineNumbers: true, cursorBlinkRate: 1000, indentUnit: 4, matchBrackets: true, readOnly: false, dragDrop: false, styleSelectedText: false, showCursorWhenSelecting: false, extraKeys: { Tab: function (cm) { cm.replaceSelection(" ", "end"); } }, readOnly: read_only }) } //=========== Gestion du zoom function changeZoom() { var val = document.querySelector("#zoom > input").value actuZoom(val) } function actuZoom(val) { console.log("actuZoom " + val) //=== Change la position du curseur document.querySelector("#zoom > input").value = parseInt(val) //=== Récupère les valeurs switch (parseInt(val)) { case 0: valScale = 0.25; cadreWidth = 150 strZoom = "25%" break; case 1: valScale = 0.5; cadreWidth = 300 strZoom = "50%" break; case 2: valScale = 0.75; cadreWidth = 450 strZoom = "75%" break; case 3: valScale = 1; cadreWidth = 600 strZoom = "100%" break; } //console.log("aaaaaaa "+val+" "+valScale) //=== modifie l'affichage du zoom document.querySelector("#zoom > span").innerHTML = strZoom //=== modifie le div document.querySelector("#ui_output").style.width = cadreWidth + "px" var elt = document.querySelector("#cadreSvg > :nth-child(2)"); elt.style.width = cadreWidth + "px"; elt.style.height = cadreWidth + "px"; //=== modifie le svg var elt = document.querySelector("svg") if (elt != null) { elt.setAttribute("width", cadreWidth); elt.setAttribute("height", cadreWidth); var elt = document.querySelector("#cadreSvg"); elt.style.flexBasis = cadreWidth + "px"; elt.style.width = cadreWidth + "px"; elt.style.flex = cadreWidth + "px"; } //=== modifie le canvas var elt = document.querySelector("canvas") if (elt != null) { console.log("ggggg", elt, valScale) elt.setAttribute("width", cadreWidth) elt.setAttribute("height", cadreWidth) var ctx = elt.getContext("2d"); ctx.setTransform(1, 0, 0, 1, 0, 0); ctx.scale(valScale, valScale) } //=== Enregistre dans le cookie document.cookie = "zoom=" + val + "; expire=Tue, 12-December-2030 12:10:00 GMT;" } function actuZoom_init() { document.querySelector("#zoom > input").addEventListener("change", changeZoom); var elt = document.cookie.split("; ").find(row => row.startsWith("zoom=")); if (elt == undefined) { zoom = 2; } else { zoom = elt.split("=")[1]; } actuZoom(zoom) } function deconnexion() { var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function () { if (xhr.readyState == XMLHttpRequest.DONE) { if (xhr.status == 200) { document.location = "" } } } xhr.open("POST", "deconnexion.php"); xhr.send(); } //==================== Onglet function ui_ongletClick(ev) { var val = ev.currentTarget.getAttribute("num"); ui_ongletAff(val); } function ui_ongletAff(num) { for (var i = 0; i < 6; i++) { var eltOnglet = document.querySelector('#nav' + i); var eltDiv = document.querySelector('#divOnglet' + i); if (num == i) { // L'onglet sélectionné eltOnglet.style.backgroundColor = 'darkorange'; eltOnglet.style.color = 'beige'; // Div sélectionné eltDiv.style.display = 'block'; if (myCodeListe[num] != undefined) { myCodeListe[num].refresh() } } else { // L'onglet sélectionné eltOnglet.style.backgroundColor = 'papayawhip'; eltOnglet.style.color = 'black'; // Div sélectionné eltDiv.style.display = 'none'; } } } //==================== Bouton action function ui_codePlay() { console.log("ui_codePlay") //== Gestion des boutons ui_boutonAction_gray("play"); //==Création des onblets if (data['gameNum'] != 0) { var formData = new FormData(); formData.append("codeInit", myCodeInit.getValue()); formData.append("codeLoop", myCodeLoop.getValue()); formData.append("codeListener", myCodeListener.getValue()); formData.append("gameNum", data['gameNum']); formData.append("gamePassword", gamePassword); //==== Enregistrement du code var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function () { if (xhr.readyState == XMLHttpRequest.DONE) { if (xhr.status == 200) { console.log(xhr.responseText.substr(0, 6)) if (xhr.responseText.substring(0, 7) == "Erreur:") { mess = "Erreur enregistrement"; } else { mess = "Enregistré!"; } var elt = document.querySelector('#messageSave'); elt.style.display = "block"; elt.innerHTML = mess; setTimeout(() => { document.querySelector('#messageSave').style.display = "none"; }, 2000); } } } xhr.open("POST", "gameSave.php"); xhr.send(formData); } //=== Lancement du jeu py_run(); } function ui_codeStop() { //== Gestion des boutons ui_boutonAction_gray("stop"); //== Arret de la boucle gameStopLoop(); } function ui_boutonAction_gray(action) { console.log("ui_boutonAction_gray: " + action) var liste = document.querySelectorAll('.ui_boutonAction'); for (var i = 0; i < liste.length; i++) { var val = liste[i].getAttribute('action'); console.log("ui_boutonAction val:" + val) if (action == val) { liste[i].style.filter = "grayscale(0)"; } else { liste[i].style.filter = "grayscale(1)"; } } } //===== Touche Control var isCtrl = false; function controlS(ev) { if (ev.keyCode == 17) { ev.preventDefault(); isCtrl = true; } if (ev.keyCode == 83 && isCtrl) { ev.preventDefault(); ui_codePlay(); } } function unControlS(ev) { isCtrl = false; } //====== Bouton +/- fontSize function updateNavFontSize() { var elt = document.querySelector('#nav'); elt && (elt.style.fontSize = navFontSize + "px"); for (var i = 0; i < 6; i++) { elt = document.querySelector('#divOnglet' + i); elt && (elt.style.fontSize = navFontSize + "px"); } cookie_save('fontSize', navFontSize); //myCodeInit.refresh() } //======== Actualise la langue function gameUI_actualiseLangue() { console.log("ui_actualiseLangue") var elt = document.querySelector('#imgLang'); if (data['langue'] == 'fr') { elt.className = "s30 s_a" } else if (data['langue'] == 'en') { elt.className = "s30 s_b" } } //========== Gestion de la console / output function outputClick(ev) { console.log("outputClear") if (ev.button == 2) { ev.stopPropagation(); ev.preventDefault(); var elt = document.getElementById("ui_output"); elt.innerHTML = "" elt.style.flexDirection = "column-reversed" } if (ev.button == 0) { ev.stopPropagation(); ev.preventDefault(); var elt = document.getElementById("ui_output"); if (elt.style.display == "block") { elt.style.display = "flex"; } else { elt.style.display = "block"; } } } //========== Fonction sur le SVG function svgDelete() { console.log("svgDelete") //==== Efface le svg var target = document.querySelector('#game_svg'); console.log(target.firstChild) while (target.firstChild) { target.removeChild(target.firstChild); } var elt = document.createElementNS('http://www.w3.org/2000/svg', "g") elt.setAttributeNS(null, "id", "svgOne"); document.querySelector('#game_svg').appendChild(elt) elt = document.createElementNS('http://www.w3.org/2000/svg', "g") elt.setAttributeNS(null, "id", "svgTwo"); document.querySelector('#game_svg').appendChild(elt) elt = document.createElementNS('http://www.w3.org/2000/svg', "g") elt.setAttributeNS(null, "id", "svgThree"); document.querySelector('#game_svg').appendChild(elt) } ui_langue = "fr"; function global_init() { console.log("global_init") //======= Acceuil Init //==Background des jeux sauvegardés var i = 0; var elt = document.querySelector('#gridSauvGame') if ((elt != null) && (elt.firstChild != null)) { elt = elt.firstChild do { elt.setAttribute('class', 'bg' + i); i = (i + 1) % 2; } while (elt = elt.nextSibling) } var liste = document.querySelectorAll("#gridSauvGame > span"); console.log(liste) for (var i = 0; i < liste.length; i++) { //liste[i].addEventListener("click", clickSauvGame); } //== Image et lien des modéles var liste = document.querySelectorAll(".gridGame_click") for (var i = 0; i < liste.length; i++) { liste[i].style.cursor = "pointer" liste[i].addEventListener("click", gameLoad) } //== Image et lien pour les sauvegarde /* var liste = document.querySelectorAll(".imgDir2") for (var i = 0; i < liste.length; i++) { liste[i].src = img_direction liste[i].addEventListener("click", accessCookieGame) } */ //== Recherche de la langue var tmp = document.cookie.split("; ").find(row => row.startsWith("langue=")); if (tmp != undefined) { ui_langue = tmp.split('=')[1] } else { ui_langue = 'fr'; document.cookie = "langue=fr; expire=Tue, 12-December-2030 12:10:00 GMT;" } //== Flag langue var elt = document.querySelector('#accueil_flag'); elt.className = (ui_langue == 'fr' ? 's60 s_a' : 's60 s_b'); elt.addEventListener('click', accueil_changeLangue) //== Actualise lange dans la page d'acceuil accueil_updateLangue(); //=============== Game init var liste = document.querySelectorAll("#nav > span") for (var i = 0; i < liste.length; i++) { liste[i].addEventListener("click", ui_ongletClick); } //=== Touche Ctrl, notamment pour save window.addEventListener('keydown', controlS); window.addEventListener('keyup', unControlS); //====== Taille de la police : lecture du cookie navFontSize = cookie_load('fontSize',15); //====== Taille de la police : Listener var elt = document.querySelector('#nav > :nth-child(1)') elt.addEventListener('click', () => { navFontSize--; updateNavFontSize() }) var elt = document.querySelector('#nav > :nth-child(2)') elt.addEventListener('click', () => { navFontSize++; updateNavFontSize() }) //===== Actualise les boutons de la navigation des jeux document.querySelector('#imgModele').addEventListener('click', modeleLoad); document.querySelector('#imgBackGame').addEventListener('click', (ev) => { document.location = ""; }); document.querySelector('#imgBackAcceuil').addEventListener('click', global_affHome); document.querySelector('#imgDelete').addEventListener('click', delCookieGame); var elt = document.querySelector('#imgDownload'); if (elt != null) { elt.style.cursor = "pointer"; elt.addEventListener('click', downloadGame); } //===== Click sur le output var elt = document.getElementById('ui_output'); elt.addEventListener('mouseup', outputClick); elt.addEventListener('mousedown', outputClick); elt.addEventListener('contextmenu', outputClick); //===== Chargement via lien externe if(data != null){ console.log("kkkkkkkkkkkkkkk") game_loadData(); } } window.addEventListener('load', global_init); function global_affHome(){ //=== Arrete le loop gameStopLoop(); //=== Affiche le div de Home document.querySelector('#divAccueil').style.display="block"; document.querySelector('#divGame').style.display="none"; } //============= Cookie function cookie_save(id,val){ document.cookie=id+"="+val+"; expire=Tue, 12-December-2030 12:10:00 GMT;"; } function cookie_load(id,val_default){ var elt = document.cookie.split("; ").find(row => row.startsWith(id+"=")); if(elt == undefined){ return val_default; } else{ return elt.split("=")[1]; } } function convert_btoa(ch){ var tmp = new TextEncoder().encode(ch); return btoa(String.fromCodePoint(...tmp)); } function convert_atob(bArray){ var tmp = Uint8Array.from(atob(bArray), (m) => m.codePointAt(0)); return new TextDecoder().decode(tmp) } function formatDate(s) { var d = new Date(s); var liste = [] //==== Jour de la semaine var jourS = [['Dimanche', 'Sunday'], ['Lundi', 'Monday'], ['Mardi', 'Tuesday'], ['Mercredi', 'Wednesday'], ['Jeudi', 'Thursday'], ['Vendredi', 'Friday'], ['Samedi', 'Saturday']]; var mois = [['Janvier', 'January'], ['Février', 'February'], ['Mars', 'March'], ['Avril', 'April'], ['Mai', 'May'], ['Juin', 'June'], ['Juillet', 'July'], ['Août', 'August'], ['Septembre', 'September'], ['Octobre', 'Octobre'], ['Novembre', 'November'], ['Décembre', 'Decembre']]; console.log("formatDate",s,d.getDay(),d.getMonth(),mois[d.getMonth()]) var posLangue = (data['langue']=="fr"?0:1); return jourS[d.getDay()][posLangue] + " " + d.getDate() + " " + mois[d.getMonth()][posLangue] + " " + d.getFullYear() + " " + (posLangue == 0 ? "à" : "at") + " " + d.getHours() + ":" + d.getMinutes(); }function issetGlobal(id_fr,id_en){ if (data['langue'] == 'fr') { return (Sk.globals[id_fr] != null) } else if (data['langue'] == 'en') { return (Sk.globals[id_en] != null) } } function setGlobal(id_fr, id_en, val) { //console.log("setGlobal "+id_fr+" "+id_en+" "+val) if (data['langue'] == 'fr') { //console.log(val) Sk.globals[id_fr] = val } else if (data['langue'] == 'en') { Sk.globals[id_en] = val } } function setDefaultGlobal(id_fr, id_en, val) { if (data['langue'] == 'fr') { if (Sk.globals[id_fr] == null) { Sk.globals[id_fr] = val } } else if (data['langue'] == 'en') { if (Sk.globals[id_en] == null) { Sk.globals[id_en] = val } } } function getGlobalVal(idFr, idEn) { if (data['langue'] == 'fr') { if (Sk.globals[idFr] != null) { return Sk.globals[idFr].v } else { throw new Sk.builtin.NameError('la variable ' + idFr + ' n\'est pas définie'); return ""; } } else if (data['langue'] == 'en') { if (Sk.globals[idEn] != null) { return Sk.globals[idEn].v } else { throw new Sk.builtin.NameError('Error: the variable ' + idEn + ' doesn\'t exist'); return ""; } } } function existMethod(name_fr, name_en, nbr) { var runM, str; if (typeof (runM = window.mod.tp$getattr(name_fr)) == "undefined") { if (data['langue'] == 'fr') { str = "Erreur: votre programme doit contenir une fonction " + name_fr + ""; } else { str = "Error: you must have a function named " + name_en + ""; } throw new Sk.builtin.MyError(str); return; } if (runM.func_code.length != nbr) { if (data['langue'] == 'en') { str = "Erreur : la fonction " + name_fr + "() doit avoir " + nbr + " argument" + (nbr > 1 ? "s" : ""); } else { str = "Error : the function " + name_en + "() may have exactly " + nbr + " argument" + (nbr > 1 ? "s" : ""); } throw new Sk.builtin.MyError(str); return; } } function verifNumArg(nomA, nomB, arg, nbr) { if (arg.length != nbr) { var str; if (data['langue'] == 'fr') { str = "la fonction " + nomA + "() doit avoir " + nbr + " argument" + (nbr < 2 ? "" : "s"); } else { str = "the function " + nomB + "() must have " + nbr + " argument" + (nbr < 2 ? "" : "s") } throw new Sk.builtin.ValueError(str); return } } function callMethod(name_fr, name_en) { var runM; if (data['langue'] == 'fr') { if (typeof (runM = window.mod.tp$getattr(name_fr)) == "undefined") { throw new Sk.builtin.MyError("Erreur: votre programme doit contenir une fonction " + name_fr + ""); return; } else { try { Sk.misceval.callsim(runM) } catch (e) { console.log("ERREUR"); errorPythonEvent(e, name_fr); } } } else if (data['langue'] == 'en') { if (typeof (runM = window.mod.tp$getattr(name_en)) == "undefined") { throw new Sk.builtin.MyError("Error: you must have a function named " + name_en + ""); return; } else { try { Sk.misceval.callsim(runM) } catch (e) { console.log("ERREUR"); console.log(e) errorPythonEvent(e, name_en); } } } }