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

multi.js 8.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  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. $(".current").html("<div id=\"score\">Score : "+score+" miam</div>");
  95. loadTheme(id_theme);
  96. }
  97. function loadTheme(id) {
  98. theme = category.themes[id];
  99. $("#theme").html("<p id=\"question\"></p>");
  100. $("#theme").append("<ul id=\"answers\"><li id=\"rep1\">"+theme.reponse1+"</li>"
  101. +"<li id=\"rep2\">"+theme.reponse2+"</li><li id=\"both\">Les deux</li></ul>"
  102. +"<p id=\"question-count\">Question 0/0</p>");
  103. quest(id_quest);
  104. }
  105. function quest(id) {
  106. $("#question").html(theme.questions[id].intitule);
  107. startTimer();
  108. bonneReponse = parseInt(theme.questions[id].bonneReponse);
  109. console.info('Question ' + currentQuestion + '/' + theme.questions.length + ' : '
  110. +theme.questions[id].intitule);
  111. $("#question-count").html("Question "+currentQuestion+"/"+nbQuestions);
  112. if(canClick) {
  113. $("#rep1").off('click');
  114. $("#rep1").one("click", function() { reponseUser = 1; checkAnswer(); socket.emit('nextQuestion', reponseUser == bonneReponse); });
  115. $("#rep2").off('click');
  116. $("#rep2").one("click", function() { reponseUser = 2; checkAnswer(); socket.emit('nextQuestion', reponseUser == bonneReponse); });
  117. $("#both").off('click');
  118. $("#both").one("click", function() { reponseUser = 0; checkAnswer(); socket.emit('nextQuestion', reponseUser == bonneReponse); });
  119. }
  120. }
  121. function checkAnswer() {
  122. canClick = false;
  123. $("#rep1").off('click');
  124. $("#rep2").off('click');
  125. $("#both").off('click');
  126. stopTimer();
  127. if(reponseUser == bonneReponse || againstLoser) {
  128. score += secRestantes+1;
  129. againstLoser = false;
  130. }
  131. if(score > 1) {
  132. $("#score").html("Score : "+score+" miams");
  133. } else {
  134. $("#score").html("Score : "+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. json.cat1.themes.forEach(function(theme) {
  184. nbQuestions += theme.questions.length;
  185. });
  186. json.cat2.themes.forEach(function(theme) {
  187. nbQuestions += theme.questions.length;
  188. });
  189. loadCat(id_cat);
  190. }
  191. function startTimer() {
  192. baseWidth = $("#timer").width();
  193. $("#timer").removeClass();
  194. var elm = document.getElementById("timer"),
  195. newone = elm.cloneNode(true);
  196. elm.parentNode.replaceChild(newone, elm);
  197. $("#timer").addClass("timer");
  198. timer = window.setTimeout(checkAnswer, timing*1000);
  199. }
  200. function stopTimer() {
  201. window.clearTimeout(timer);
  202. $("#timer").addClass("pause");
  203. secRestantes = Math.round($("#timer").width()/baseWidth*timing);
  204. }
  205. function pauseGame() {
  206. $("#game").html("<h2 id=\"score\">Vous avez marqué "+score+" miams</h2>"
  207. +"<p id=\"registerScore\">En attente de l'adversaire...</p>");
  208. // On indique au serveur qu'on a fini
  209. var options = [gameInfos[1], score];
  210. socket.emit('findugame', options);
  211. }
  212. function endGame() {
  213. stopTimer();
  214. var str = "<h2 id=\"score\">Vous avez marqué "+score+" miams</h2>"
  215. +"<p id=\"registerScore\">";
  216. if(disconnect) {
  217. str += gameInfos[0]+" s'est déconnecté.";
  218. stopTimer();
  219. } else {
  220. str += "Votre adversaire a marqué "+scoreAdversaire+" miams.<br />Le gagnant est... ";
  221. if(score > scoreAdversaire) {
  222. str += pseudo+" (vous).";
  223. } else if(score < scoreAdversaire) {
  224. str += gameInfos[0]+".";
  225. } else {
  226. str += "personne (égalité).";
  227. }
  228. }
  229. $("#game").html(str+"</p>");
  230. }
  231. function addScore(userLogin, userScore) {
  232. $.ajax({
  233. async: false,
  234. url: "../../api/?page=palmares",
  235. type: "POST",
  236. dataType: 'json',
  237. data: {login: userLogin, score: userScore},
  238. success: function(data) {
  239. json = data;
  240. }
  241. });
  242. }
  243. function displayScores() {
  244. $.get("./api/?page=palmares", function(data) {
  245. var list = "<ol>";
  246. for(var i = 0; i < 10; i++) {
  247. list += "<li>"+data[i].login+" - "+data[i].score+"</li>";
  248. }
  249. list += "</ol>";
  250. $("#palmares").html(list);
  251. });
  252. }