Créé dans le cadre du projet de fin d'année de la promo 2018 de CIR2 de l'ISEN Brest/Rennes, le Burger Quizz est une adaptation numérique du jeu télévisé éponyme, plus précisément d'une épreuve spécifique de ce jeu : le "Sel ou Poivre".

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  1. /**************************************************
  2. ** GAME VARIABLES
  3. **************************************************/
  4. var socket; // Socket
  5. var gameInfos;
  6. /**************************************************
  7. ** GAME INITIALISATION
  8. **************************************************/
  9. var disconnect = true;
  10. var scoreAdversaire = 0;
  11. var pseudo ='';
  12. var reponseUser = -1, bonneReponse;
  13. var againstLoser = false;
  14. function init() {
  15. var hostname = $('script')[$('script').length-3]['src'].match(/http:\/\/(.+)\:/)[1];
  16. // Connexion à socket.io
  17. socket = io.connect('http://'+hostname+':8000');
  18. // Gestion des evenements
  19. setEventHandlers();
  20. window.clearTimeout(refresh);
  21. // On demande le pseudo a l'utilisateur, on l'envoie au serveur et on l'affiche dans le titre
  22. $("#game").html("<h2>Jeu multijoueur</h2>"
  23. +"<p>Merci de rentrer un nom ou pseudonyme :</p>"
  24. +"<input type=\"text\" id=\"pseudo\" placeholder=\"Nom ou pseudonyme\" /><input type=\"submit\" id=\"start\" value=\"Valider\" />");
  25. $("#start").on("click", function() {
  26. pseudo = $("#pseudo").val();
  27. socket.emit('nouveau', pseudo);
  28. document.title = $("#pseudo").val() + ' - ' + document.title;
  29. $("#game").html("Recherche d'un adversaire...");
  30. });
  31. $("#pseudo").on('keypress', function(event) {
  32. if(event.which == 13) {
  33. pseudo = $("#pseudo").val();
  34. socket.emit('nouveau', pseudo);
  35. document.title = $("#pseudo").val() + ' - ' + document.title;
  36. $("#game").html("Recherche d'un adversaire...");
  37. }
  38. });
  39. };
  40. /**************************************************
  41. ** GAME EVENT HANDLERS
  42. **************************************************/
  43. var setEventHandlers = function() {
  44. socket.on("message", onMessage);
  45. socket.on("autres", onAutres);
  46. socket.on("game", onGame);
  47. socket.on("questions", play);
  48. socket.on("lolheded", endGame);
  49. socket.on("end", onEnd);
  50. socket.on("qpass", function(gotAPoint) {
  51. reponseUser = -1;
  52. againstLoser = gotAPoint;
  53. checkAnswer();
  54. })
  55. };
  56. function onEnd(score) {
  57. disconnect = false;
  58. scoreAdversaire = score;
  59. endGame();
  60. }
  61. function onGame(game) {
  62. gameInfos = game;
  63. $("#game").html("Adversaire trouvé : "+game[0]+"<br />Début de la partie dans 5s.");
  64. window.setTimeout(function() {
  65. socket.emit('start', gameInfos[1])
  66. }, 5000);
  67. }
  68. function onMessage(message) {
  69. alert(message);
  70. };
  71. function onAutres(pseudo) {
  72. alert("Voici un nouveau joueur : " + pseudo);
  73. };
  74. /**************************************************
  75. ** GAME ENGINE (SORT OF)
  76. **************************************************/
  77. // IDs
  78. var id_cat = 0, id_theme = 0, id_quest = 0;
  79. // Shortcuts
  80. var json, category, theme;
  81. // Timer
  82. var timing = 5, secRestantes = 0, timer;
  83. var nbQuestions = 0, currentQuestion = 1;
  84. var baseWidth;
  85. var score = 0;
  86. var canClick = true;
  87. function loadCat(id) {
  88. if(id === 0) category = json.cat1;
  89. if(id === 1) category = json.cat2;
  90. $("#game").html("<div id=\"timer\"></div>");
  91. $("#game").append("<div id=\"category\">Catégorie : "+category.nom_cat+"</div>");
  92. $("#game").append("<div id=\"theme\"></div>");
  93. loadTheme(id_theme);
  94. }
  95. function loadTheme(id) {
  96. theme = category.themes[id];
  97. $("#theme").html("<p id=\"question\"></p>");
  98. $("#theme").append("<ul id=\"answers\"><li id=\"rep1\">"+theme.reponse1+"</li>"
  99. +"<li id=\"rep2\">"+theme.reponse2+"</li><li id=\"both\">Les deux</li></ul>"
  100. +"<p id=\"question-count\">Question 0/0</p>");
  101. quest(id_quest);
  102. }
  103. function quest(id) {
  104. $("#question").html(theme.questions[id].intitule);
  105. startTimer();
  106. bonneReponse = parseInt(theme.questions[id].bonneReponse);
  107. console.info('Question ' + currentQuestion + '/' + theme.questions.length + ' : '
  108. +theme.questions[id].intitule);
  109. $("#question-count").html("Question "+currentQuestion+"/"+nbQuestions);
  110. if(canClick) {
  111. $("#rep1").off('click');
  112. $("#rep1").one("click", function() { reponseUser = 1; checkAnswer(); socket.emit('nextQuestion', reponseUser == bonneReponse); });
  113. $("#rep2").off('click');
  114. $("#rep2").one("click", function() { reponseUser = 2; checkAnswer(); socket.emit('nextQuestion', reponseUser == bonneReponse); });
  115. $("#both").off('click');
  116. $("#both").one("click", function() { reponseUser = 0; checkAnswer(); socket.emit('nextQuestion', reponseUser == bonneReponse); });
  117. }
  118. }
  119. function checkAnswer() {
  120. canClick = false;
  121. $("#rep1").off('click');
  122. $("#rep2").off('click');
  123. $("#both").off('click');
  124. stopTimer();
  125. if(reponseUser == bonneReponse || againstLoser) {
  126. score += secRestantes+1;
  127. againstLoser = false;
  128. }
  129. if(score > 1) {
  130. $("#score").html("Score : "+score+" miams");
  131. $("#score-responsive").html(score+" miams");
  132. } else {
  133. $("#score").html("Score : "+score+" miam");
  134. $("#score-responsive").html(score+" miam");
  135. }
  136. switch(bonneReponse) {
  137. case 0: $("#rep1").addClass("wrong-answer");
  138. $("#rep2").addClass("wrong-answer");
  139. $("#both").addClass("good-answer");
  140. break;
  141. case 1: $("#rep1").addClass("good-answer");
  142. $("#rep2").addClass("wrong-answer");
  143. $("#both").addClass("wrong-answer");
  144. break;
  145. case 2: $("#rep1").addClass("wrong-answer");
  146. $("#rep2").addClass("good-answer");
  147. $("#both").addClass("wrong-answer");
  148. break;
  149. }
  150. window.setTimeout(nextQuestion, 2000);
  151. }
  152. function nextQuestion() {
  153. $("#rep1").removeClass();
  154. $("#rep2").removeClass();
  155. $("#both").removeClass();
  156. canClick = true;
  157. currentQuestion++;
  158. // Dernière question du thème en cours
  159. if((id_quest+1) == theme.questions.length) {
  160. // Dernier thème de la catégorie en cours
  161. if((id_theme+1) == category.themes.length) {
  162. // Dernière catégorie
  163. if((id_cat+1) == 2) {
  164. pauseGame();
  165. } else {
  166. id_quest = 0;
  167. id_theme = 0;
  168. id_cat++;
  169. loadCat(id_cat);
  170. }
  171. } else {
  172. id_quest = 0;
  173. id_theme++;
  174. loadTheme(id_theme);
  175. }
  176. } else {
  177. id_quest++;
  178. quest(id_quest);
  179. }
  180. }
  181. function play(questions) {
  182. json = questions;
  183. if(json.status != 1) {
  184. var message;
  185. switch(json.source) {
  186. case 'PDO':
  187. message = "Erreur lors de la connexion à la base de donnée : "+json.message;
  188. break;
  189. case 'Connector':
  190. message = "Erreur de requête SQL : "
  191. switch(json.message) {
  192. case 'wrong_arg_nmbr_where':
  193. message += "Mauvais nombre d'arguments dans la clause WHERE.";
  194. break;
  195. case 'wrong_arg_nmbr_order_by':
  196. message += "Mauvais nombre d'arguments dans la clause ORDER BY.";
  197. break;
  198. case 'wrong_arg_numbr_limit':
  199. message += "Mauvais nombre d'arguments dans la clause LIMIT.";
  200. break;
  201. case 'unknown_arg':
  202. message += "Argument inconnu détecté.";
  203. break;
  204. }
  205. break;
  206. case 'Questset':
  207. message = "Erreur dans le chargement du jeu de questions : "
  208. if(json.message == 'expected_questset_array') {
  209. message += "Un tableau de réponses est attendu."
  210. }
  211. break;
  212. case 'Categorie':
  213. if(json.message == 'cant_find_cat') {
  214. message = "Erreur dans le chargement de la catégorie : Impossible de trouver la catégorie.";
  215. }
  216. break;
  217. }
  218. $("#game").addClass("error");
  219. $("#game").html(message);
  220. } else {
  221. json.cat1.themes.forEach(function(theme) {
  222. nbQuestions += theme.questions.length;
  223. });
  224. json.cat2.themes.forEach(function(theme) {
  225. nbQuestions += theme.questions.length;
  226. });
  227. $("#navbar .current").html("<div id=\"score\">Score : "+score+" miam</div>");
  228. $("#responsive-navbar .name a").css("display", "inline");
  229. $(".name").append("<div id=\"score-responsive\">"+score+" miam</div>");
  230. loadCat(id_cat);
  231. }
  232. }
  233. function startTimer() {
  234. $("#timer").removeClass();
  235. var elm = document.getElementById("timer"),
  236. newone = elm.cloneNode(true);
  237. elm.parentNode.replaceChild(newone, elm);
  238. $("#timer").addClass("timer");
  239. baseWidth = $("#timer").width();
  240. timer = window.setTimeout(checkAnswer, timing*1000);
  241. }
  242. function stopTimer() {
  243. window.clearTimeout(timer);
  244. $("#timer").addClass("pause");
  245. secRestantes = Math.round($("#timer").width()/baseWidth*timing);
  246. }
  247. function pauseGame() {
  248. $("#game").html("<h2 id=\"score\">Vous avez marqué "+score+" miams</h2>"
  249. +"<p id=\"registerScore\">En attente de l'adversaire...</p>");
  250. // On indique au serveur qu'on a fini
  251. var options = [gameInfos[1], score];
  252. socket.emit('findugame', options);
  253. }
  254. function endGame() {
  255. stopTimer();
  256. var str = "<h2 id=\"score\">Vous avez marqué "+score+" miams</h2>"
  257. +"<p id=\"registerScore\">";
  258. if(disconnect) {
  259. str += gameInfos[0]+" s'est déconnecté.";
  260. stopTimer();
  261. } else {
  262. str += "Votre adversaire a marqué "+scoreAdversaire+" miams.<br />Le gagnant est... ";
  263. if(score > scoreAdversaire) {
  264. str += pseudo+" (vous).";
  265. } else if(score < scoreAdversaire) {
  266. str += gameInfos[0]+".";
  267. } else {
  268. str += "personne (égalité).";
  269. }
  270. }
  271. $("#game").html(str+"</p>");
  272. }
  273. function addScore(userLogin, userScore) {
  274. $.ajax({
  275. async: false,
  276. url: "../../api/?page=palmares",
  277. type: "POST",
  278. dataType: 'json',
  279. data: {login: userLogin, score: userScore},
  280. success: function(data) {
  281. json = data;
  282. }
  283. });
  284. }
  285. function displayScores() {
  286. $.get("./api/?page=palmares", function(data) {
  287. var list = "<ol>";
  288. for(var i = 0; i < 10; i++) {
  289. list += "<li>"+data[i].login+" - "+data[i].score+"</li>";
  290. }
  291. list += "</ol>";
  292. $("#palmares").html(list);
  293. });
  294. }