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".

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  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, 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. console.log(category);
  91. $("#game").html("<div id=\"timer\" style=\"width:100%;height:20px;background:green\"></div>");
  92. $("#game").append("<div id=\"category\">Catégorie : "+category.nom_cat+"</div>");
  93. $("#game").append("<div id=\"theme\"></div>");
  94. loadTheme(id_theme);
  95. }
  96. function loadTheme(id) {
  97. theme = category.themes[id];
  98. $("#theme").html("<p id=\"question\"></p>");
  99. $("#theme").append("<ul id=\"answers\"><li id=\"rep1\">"+theme.reponse1+"</li>"
  100. +"<li id=\"rep2\">"+theme.reponse2+"</li><li id=\"both\">Les deux</li></ul>"
  101. +"<p id=\"question-count\">Question 0/0</p>");
  102. quest(id_quest);
  103. }
  104. function quest(id) {
  105. $("#question").html(theme.questions[id].intitule);
  106. startTimer();
  107. bonneReponse = parseInt(theme.questions[id].bonneReponse);
  108. console.info('Question ' + currentQuestion + '/' + theme.questions.length + ' : '
  109. +theme.questions[id].intitule);
  110. $("#question-count").html("Question "+currentQuestion+"/"+nbQuestions);
  111. if(canClick) {
  112. $("#rep1").off('click');
  113. $("#rep1").one("click", function() { reponseUser = 1; checkAnswer(); socket.emit('nextQuestion', reponseUser == bonneReponse); });
  114. $("#rep2").off('click');
  115. $("#rep2").one("click", function() { reponseUser = 2; checkAnswer(); socket.emit('nextQuestion', reponseUser == bonneReponse); });
  116. $("#both").off('click');
  117. $("#both").one("click", function() { reponseUser = 0; checkAnswer(); socket.emit('nextQuestion', reponseUser == bonneReponse); });
  118. }
  119. }
  120. function checkAnswer() {
  121. canClick = false;
  122. $("#rep1").off('click');
  123. $("#rep2").off('click');
  124. $("#both").off('click');
  125. stopTimer();
  126. if(reponseUser == bonneReponse || againstLoser) {
  127. score += secRestantes+1;
  128. againstLoser = false;
  129. }
  130. if(score > 1) {
  131. $("#score").html("Score : "+score+" miams");
  132. $("#score-responsive").html(score+" miams");
  133. } else {
  134. $("#score").html("Score : "+score+" miam");
  135. $("#score-responsive").html(score+" miam");
  136. }
  137. switch(bonneReponse) {
  138. case 0: $("#rep1").addClass("wrong-answer");
  139. $("#rep2").addClass("wrong-answer");
  140. $("#both").addClass("good-answer");
  141. break;
  142. case 1: $("#rep1").addClass("good-answer");
  143. $("#rep2").addClass("wrong-answer");
  144. $("#both").addClass("wrong-answer");
  145. break;
  146. case 2: $("#rep1").addClass("wrong-answer");
  147. $("#rep2").addClass("good-answer");
  148. $("#both").addClass("wrong-answer");
  149. break;
  150. }
  151. window.setTimeout(nextQuestion, 2000);
  152. }
  153. function nextQuestion() {
  154. $("#rep1").removeClass();
  155. $("#rep2").removeClass();
  156. $("#both").removeClass();
  157. canClick = true;
  158. currentQuestion++;
  159. // Dernière question du thème en cours
  160. if((id_quest+1) == theme.questions.length) {
  161. // Dernier thème de la catégorie en cours
  162. if((id_theme+1) == category.themes.length) {
  163. // Dernière catégorie
  164. if((id_cat+1) == 2) {
  165. pauseGame();
  166. } else {
  167. id_quest = 0;
  168. id_theme = 0;
  169. id_cat++;
  170. loadCat(id_cat);
  171. }
  172. } else {
  173. id_quest = 0;
  174. id_theme++;
  175. loadTheme(id_theme);
  176. }
  177. } else {
  178. id_quest++;
  179. quest(id_quest);
  180. }
  181. }
  182. function play(questions) {
  183. json = questions;
  184. if(json.status != 1) {
  185. var message;
  186. switch(json.source) {
  187. case 'PDO':
  188. message = "Erreur lors de la connexion à la base de donnée : "+json.message;
  189. break;
  190. case 'Connector':
  191. message = "Erreur de requête SQL : "
  192. switch(json.message) {
  193. case 'wrong_arg_nmbr_where':
  194. message += "Mauvais nombre d'arguments dans la clause WHERE.";
  195. break;
  196. case 'wrong_arg_nmbr_order_by':
  197. message += "Mauvais nombre d'arguments dans la clause ORDER BY.";
  198. break;
  199. case 'wrong_arg_numbr_limit':
  200. message += "Mauvais nombre d'arguments dans la clause LIMIT.";
  201. break;
  202. case 'unknown_arg':
  203. message += "Argument inconnu détecté.";
  204. break;
  205. }
  206. break;
  207. case 'Questset':
  208. message = "Erreur dans le chargement du jeu de questions : "
  209. if(json.message == 'expected_questset_array') {
  210. message += "Un tableau de réponses est attendu."
  211. }
  212. break;
  213. case 'Categorie':
  214. if(json.message == 'cant_find_cat') {
  215. message = "Erreur dans le chargement de la catégorie : Impossible de trouver la catégorie.";
  216. }
  217. break;
  218. }
  219. $("#game").addClass("error");
  220. $("#game").html(message);
  221. } else {
  222. json.cat1.themes.forEach(function(theme) {
  223. nbQuestions += theme.questions.length;
  224. });
  225. json.cat2.themes.forEach(function(theme) {
  226. nbQuestions += theme.questions.length;
  227. });
  228. $("#navbar .current").html("<div id=\"score\">Score : "+score+" miam</div>");
  229. $("#responsive-navbar .name a").css("display", "inline");
  230. $(".name").append("<div id=\"score-responsive\">"+score+" miam</div>");
  231. loadCat(id_cat);
  232. }
  233. }
  234. function startTimer() {
  235. baseWidth = $("#timer").width();
  236. $("#timer").removeClass();
  237. var elm = document.getElementById("timer"),
  238. newone = elm.cloneNode(true);
  239. elm.parentNode.replaceChild(newone, elm);
  240. $("#timer").addClass("timer");
  241. timer = window.setTimeout(checkAnswer, timing*1000);
  242. }
  243. function stopTimer() {
  244. window.clearTimeout(timer);
  245. $("#timer").addClass("pause");
  246. secRestantes = Math.round($("#timer").width()/baseWidth*timing);
  247. }
  248. function pauseGame() {
  249. $("#game").html("<h2 id=\"score\">Vous avez marqué "+score+" miams</h2>"
  250. +"<p id=\"registerScore\">En attente de l'adversaire...</p>");
  251. // On indique au serveur qu'on a fini
  252. var options = [gameInfos[1], score];
  253. socket.emit('findugame', options);
  254. }
  255. function endGame() {
  256. stopTimer();
  257. var str = "<h2 id=\"score\">Vous avez marqué "+score+" miams</h2>"
  258. +"<p id=\"registerScore\">";
  259. if(disconnect) {
  260. str += gameInfos[0]+" s'est déconnecté.";
  261. stopTimer();
  262. } else {
  263. str += "Votre adversaire a marqué "+scoreAdversaire+" miams.<br />Le gagnant est... ";
  264. if(score > scoreAdversaire) {
  265. str += pseudo+" (vous).";
  266. } else if(score < scoreAdversaire) {
  267. str += gameInfos[0]+".";
  268. } else {
  269. str += "personne (égalité).";
  270. }
  271. }
  272. $("#game").html(str+"</p>");
  273. }
  274. function addScore(userLogin, userScore) {
  275. $.ajax({
  276. async: false,
  277. url: "../../api/?page=palmares",
  278. type: "POST",
  279. dataType: 'json',
  280. data: {login: userLogin, score: userScore},
  281. success: function(data) {
  282. json = data;
  283. }
  284. });
  285. }
  286. function displayScores() {
  287. $.get("./api/?page=palmares", function(data) {
  288. var list = "<ol>";
  289. for(var i = 0; i < 10; i++) {
  290. list += "<li>"+data[i].login+" - "+data[i].score+"</li>";
  291. }
  292. list += "</ol>";
  293. $("#palmares").html(list);
  294. });
  295. }