Merge pull request #63 from ThomasRubini/client_game-fixes-and-improvements

[Client] Game fixes and improvements
This commit is contained in:
AudricV 2023-01-16 23:46:06 +01:00 committed by GitHub
commit 6f7edb3887
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 115 additions and 74 deletions

View File

@ -17,6 +17,8 @@ html {
background-size: cover; background-size: cover;
position: fixed; position: fixed;
height: 100%; height: 100%;
left: 0;
top: 0;
width: 100%; width: 100%;
/* Place the background behind everything */ /* Place the background behind everything */
z-index: -9999; z-index: -9999;

View File

@ -1,87 +1,111 @@
var npcs_ids = [] const intro_image_path = "/static/images/entrée-manoir.png";
var gamedata = {} const interrogation_image_path = "/static/images/salle-interrogation.png";
var currentNpc = null const results_image_path = "/static/images/salle-resultats.png";
var username = null
function show(className){ var npcs_ids = [];
var gamedata = {};
var currentNpc = null;
var username = null;
function show(className) {
document.getElementsByClassName(className)[0].classList.remove("hidden"); document.getElementsByClassName(className)[0].classList.remove("hidden");
} }
function hide(className){ function hide(className) {
document.getElementsByClassName(className)[0].classList.add("hidden"); document.getElementsByClassName(className)[0].classList.add("hidden");
} }
function setListenerToIntroductionNextBtn(){ function setGameBackground(backgroundPath) {
document.getElementsByClassName("current_background")[0].style.backgroundImage = 'url("' + backgroundPath +'")';
}
function setListenerToIntroductionNextBtn() {
document.getElementById("introduction_next_btn").addEventListener("click", showInterogationViewFromIntroduction); document.getElementById("introduction_next_btn").addEventListener("click", showInterogationViewFromIntroduction);
} }
function setListenerToInterrogationSuspectPreviousBtn(){ function setListenerToInterrogationSuspectPreviousBtn() {
document.getElementById("interrogation_suspect_previous_btn").addEventListener("click",goBackToInterogation) document.getElementById("interrogation_suspect_previous_btn").addEventListener("click", goBackToInterogation);
} }
function setListenerToInterrogationNextBtn(){ function setListenerToInterrogationNextBtn() {
document.getElementById("interrogation_next_btn").addEventListener("click", showEmotionAndCulpritChoicesView) document.getElementById("interrogation_next_btn").addEventListener("click", showEmotionAndCulpritChoicesView);
} }
function setQuestionButtonsListeners(){ function setQuestionButtonsListeners() {
document.getElementById("QA_0").addEventListener("click",askTypeZeroQuestion); document.getElementById("QA_0").addEventListener("click", askTypeZeroQuestion);
document.getElementById("QA_1").addEventListener("click",askTypeOneQuestion); document.getElementById("QA_1").addEventListener("click", askTypeOneQuestion);
} }
function removeQuestionButtonsListeners(){ function removeQuestionButtonsListeners() {
document.getElementById("QA_0").removeEventListener("click",askTypeZeroQuestion); document.getElementById("QA_0").removeEventListener("click", askTypeZeroQuestion);
document.getElementById("QA_1").removeEventListener("click",askTypeOneQuestion); document.getElementById("QA_1").removeEventListener("click", askTypeOneQuestion);
} }
function goBackToInterogation(){ function goBackToInterogation() {
hide("interrogation_suspect"); hide("interrogation_suspect");
show("interrogation"); show("interrogation");
} }
function showInterogationViewFromIntroduction() {
function showInterogationViewFromIntroduction(){
hide("introduction"); hide("introduction");
show("interrogation"); show("interrogation");
setGameBackground(interrogation_image_path);
} }
function showEmotionAndCulpritChoicesView(){ function showEmotionAndCulpritChoicesView() {
hide("interrogation"); hide("interrogation");
show("emotion_and_culprit_choices"); show("emotion_and_culprit_choices");
} }
function getNpcLocationAndPartner(npcid){ function getNpcLocationAndPartner(npcid) {
data = {} data = {};
npcid = parseInt(npcid) npcid = parseInt(npcid);
for(const room in gamedata["rooms"]){
if(gamedata["rooms"][room]["npcs"].includes(npcid)){ for (const room in gamedata["rooms"]) {
if (gamedata["rooms"][room]["npcs"].includes(npcid)) {
data["room"] = gamedata["rooms"][room]["name"]; data["room"] = gamedata["rooms"][room]["name"];
if(gamedata["rooms"][room]["npcs"].length === 1){
do{ if (gamedata["rooms"][room]["npcs"].length === 1) {
do {
const random = Math.floor(Math.random() * npcs_ids.length); const random = Math.floor(Math.random() * npcs_ids.length);
data["partner"] = npcs_ids[random] data["partner"] = npcs_ids[random];
}while(data["partner"] === npcid); } while (data["partner"] === npcid);
} } else {
else{ data["partner"] = gamedata["rooms"][room]["npcs"][gamedata["rooms"][room]["npcs"][1] === npcid ? 0 : 1];
data["partner"] = gamedata["rooms"][room]["npcs"][gamedata["rooms"][room]["npcs"][1] === npcid ?0:1];
} }
} }
} }
return data; return data;
} }
function disableCulpritButtons(culprit_choices_element, selected_suspect) {
let childrenCulpritChoicesElement = culprit_choices_element.children;
for (let index = 0; index < childrenCulpritChoicesElement.length; index++) {
let child = childrenCulpritChoicesElement[index];
if (selected_suspect != child) {
child.getElementsByClassName("culprit_btn")[0].classList.add("hidden");
} else {
child.getElementsByClassName("culprit_unchecked_icon")[0].classList.add("hidden");
child.getElementsByClassName("culprit_checked_icon")[0].classList.remove("hidden");
child.getElementsByClassName("culprit_btn")[0].classList.add("culprit_btn_checked");
}
}
}
function getCulprit(){ function getCulprit() {
culprit = null culprit = null;
Object.values(gamedata["rooms"]).forEach(element =>{ Object.values(gamedata["rooms"]).forEach(element => {
if (element['npcs'].length === 1){ if (element['npcs'].length === 1) {
culprit = element['npcs'][0]; culprit = element['npcs'][0];
return; return;
} }
}) });
return culprit
return culprit;
} }
async function askTypeOneQuestion(){ async function askTypeOneQuestion() {
removeQuestionButtonsListeners(); removeQuestionButtonsListeners();
partnerId = getNpcLocationAndPartner(currentNpc)["partner"]; partnerId = getNpcLocationAndPartner(currentNpc)["partner"];
anwser = gamedata["npcs"][currentNpc]["QA_1"]; anwser = gamedata["npcs"][currentNpc]["QA_1"];
@ -89,7 +113,7 @@ async function askTypeOneQuestion(){
document.getElementsByClassName("suspect_answer")[0].textContent = anwser; document.getElementsByClassName("suspect_answer")[0].textContent = anwser;
show("question_answer"); show("question_answer");
document.getElementById("currentNpcPicure").src = "/api/v1//getNpcReaction?npcid="+currentNpc; document.getElementById("currentNpcPicure").src = "/api/v1//getNpcReaction?npcid="+currentNpc;
//sleep for 5 sec // Sleep for 5 sec
await new Promise(r => setTimeout(r, 5000)); await new Promise(r => setTimeout(r, 5000));
document.getElementById("currentNpcPicure").src = "/api/v1/getNpcImage?npcid="+currentNpc; document.getElementById("currentNpcPicure").src = "/api/v1/getNpcImage?npcid="+currentNpc;
hide("question_answer"); hide("question_answer");
@ -98,16 +122,15 @@ async function askTypeOneQuestion(){
} }
async function askTypeZeroQuestion(){ async function askTypeZeroQuestion() {
removeQuestionButtonsListeners(); removeQuestionButtonsListeners();
document.getElementById("QA_0")
room = getNpcLocationAndPartner(currentNpc)["room"]; room = getNpcLocationAndPartner(currentNpc)["room"];
anwser = gamedata["npcs"][currentNpc]["QA_0"]; anwser = gamedata["npcs"][currentNpc]["QA_0"];
anwser = anwser.replace("{SALLE}",room); anwser = anwser.replace("{SALLE}",room);
document.getElementsByClassName("suspect_answer")[0].textContent = anwser; document.getElementsByClassName("suspect_answer")[0].textContent = anwser;
show("question_answer"); show("question_answer");
document.getElementById("currentNpcPicure").src = "/api/v1//getNpcReaction?npcid="+currentNpc; document.getElementById("currentNpcPicure").src = "/api/v1//getNpcReaction?npcid="+currentNpc;
//sleep for 5 sec // Sleep for 5 sec
await new Promise(r => setTimeout(r, 5000)); await new Promise(r => setTimeout(r, 5000));
document.getElementById("currentNpcPicure").src = "/api/v1/getNpcImage?npcid="+currentNpc; document.getElementById("currentNpcPicure").src = "/api/v1/getNpcImage?npcid="+currentNpc;
hide("question_answer"); hide("question_answer");
@ -115,17 +138,17 @@ async function askTypeZeroQuestion(){
setQuestionButtonsListeners(); setQuestionButtonsListeners();
} }
async function sendAnswers(){ async function sendAnswers() {
selects = document.getElementsByClassName("suspect_emotion_chooser"); selects = document.getElementsByClassName("suspect_emotion_chooser");
let playerResponses = {} let playerResponses = {};
for (let index = 0; index < selects.length; index++) { for (let index = 0; index < selects.length; index++) {
select = selects[index]; select = selects[index];
playerResponses[select.id] = select.value playerResponses[select.id] = select.value;
} }
data = {}; data = {};
data["responses"] = JSON.stringify(playerResponses); data["responses"] = JSON.stringify(playerResponses);
return await makeAPIRequest("submitAnswers",data); return await makeAPIRequest("submitAnswers", data);
//TODO Waiting screen until results shows
} }
function renderAnswerSelectionPanel() { function renderAnswerSelectionPanel() {
@ -135,33 +158,38 @@ function renderAnswerSelectionPanel() {
suspect_emotion_chooser = document.createElement("select"); suspect_emotion_chooser = document.createElement("select");
suspect_emotion_chooser.classList.add("suspect_emotion_chooser") suspect_emotion_chooser.classList.add("suspect_emotion_chooser")
suspect_emotion_chooser.setAttribute("id",element); suspect_emotion_chooser.setAttribute("id", element);
gamedata["traits"].forEach(trait =>{ gamedata["traits"].forEach(trait =>{
let option = document.createElement("option"); let option = document.createElement("option");
option.value = trait; option.value = trait;
option.text = trait; option.text = trait;
suspect_emotion_chooser.appendChild(option); suspect_emotion_chooser.appendChild(option);
}); });
suspect.appendChild(suspect_emotion_chooser); suspect.appendChild(suspect_emotion_chooser);
let data = {};
let img = document.createElement('img'); let img = document.createElement('img');
img.classList.add("suspect_picture"); img.classList.add("suspect_picture");
img.src = "/api/v1/getNpcImage?npcid="+element; img.src = "/api/v1/getNpcImage?npcid=" + element;
suspect.appendChild(img); suspect.appendChild(img);
let button = document.getElementById("culpritButton"); let button = document.getElementById("culpritButton");
let button_clone = button.cloneNode(true); let button_clone = button.cloneNode(true);
button_clone.addEventListener("click",()=>{ let culprit_choices = document.getElementById("culprits_choices");
button_clone.addEventListener("click", () => {
disableCulpritButtons(culprit_choices, suspect);
sendAnswers(); sendAnswers();
//TODO Make this button green when clicked, and reset all other green button if any
}); });
button_clone.removeAttribute("id"); button_clone.removeAttribute("id");
button_clone.classList.remove("hidden"); button_clone.classList.remove("hidden");
suspect.appendChild(button_clone); suspect.appendChild(button_clone);
document.getElementById("culprits_choices").appendChild(suspect); culprit_choices.appendChild(suspect);
}); });
} }
function renderInterogation(){ function renderInterogation() {
document.getElementById("QA_0").textContent = gamedata["questions"]["QA_0"], document.getElementById("QA_0").textContent = gamedata["questions"]["QA_0"],
document.getElementById("QA_1").textContent = gamedata["questions"]["QA_1"], document.getElementById("QA_1").textContent = gamedata["questions"]["QA_1"],
npcs_ids.forEach(element => { npcs_ids.forEach(element => {
@ -170,26 +198,28 @@ function renderInterogation(){
let img = document.createElement('img'); let img = document.createElement('img');
img.classList.add("suspect_picture"); img.classList.add("suspect_picture");
img.src = "/api/v1/getNpcImage?npcid="+element; img.src = "/api/v1/getNpcImage?npcid=" + element;
suspect.appendChild(img); suspect.appendChild(img);
let button = document.getElementById("interogationButton"); let button = document.getElementById("interogationButton");
let button_clone = button.cloneNode(true); let button_clone = button.cloneNode(true);
button_clone.classList.remove("hidden"); button_clone.classList.remove("hidden");
button_clone.addEventListener("click",()=>{ button_clone.addEventListener("click", () => {
// TODO remove this listener when we know the questions has already been asked; // TODO remove this listener when we know the questions has already been asked;
currentNpc = element currentNpc = element
document.getElementById("currentNpcPicure").src = "/api/v1/getNpcImage?npcid="+element; document.getElementById("currentNpcPicure").src = "/api/v1/getNpcImage?npcid="+element;
hide("interrogation"); hide("interrogation");
show("interrogation_suspect"); show("interrogation_suspect");
}) });
suspect.appendChild(button_clone)
suspect.appendChild(button_clone);
document.getElementById("interrogation_suspects").appendChild(suspect); document.getElementById("interrogation_suspects").appendChild(suspect);
}); });
} }
function initSock(){ function initSock(){
socket = io({ socket = io({
auth:{ auth : {
game_id: gamedata["game_id"] game_id: gamedata["game_id"]
} }
}); });
@ -205,21 +235,29 @@ function initSock(){
socket.on("gamefinished", (finalResults) => { socket.on("gamefinished", (finalResults) => {
hide("emotion_and_culprit_choices"); hide("emotion_and_culprit_choices");
console.log(finalResults); document.getElementsByClassName("reveal_score")[0].textContent = Object.values(finalResults["player"][username]).filter(x => x == true).length + "/5";
document.getElementsByClassName("reveal_score")[0].textContent = Object.values(finalResults["player"][username]).filter(x => x==true).length +"/5"
for (const player in finalResults["player"]){ for (const player in finalResults["player"]){
if(player === username){continue} if (player === username) {
let playerNode = document.createElement("h3") continue;
playerNode.classList.add("player_name_and_score") }
let playerResultArray = Object.values(finalResults["player"][player])
playerNode.textContent = "" + player + " : " + playerResultArray.filter(x => x==true).length let playerNode = document.createElement("h3");
playerNode.classList.add("player_name_and_score");
let playerResultArray = Object.values(finalResults["player"][player]);
playerNode.textContent = "" + player + " : " + playerResultArray.filter(x => x == true).length;
document.getElementsByClassName("players_list")[0].appendChild(playerNode); document.getElementsByClassName("players_list")[0].appendChild(playerNode);
} }
culprit = getCulprit(); culprit = getCulprit();
document.getElementsByClassName("reveal_culprit_title")[0].textContent += " " + gamedata["npcs"][culprit]["name"]; document.getElementsByClassName("reveal_culprit_title")[0].textContent += " " + gamedata["npcs"][culprit]["name"];
document.getElementById("culprit").src = "/api/v1/getNpcImage?npcid="+culprit; document.getElementById("culprit").src = "/api/v1/getNpcImage?npcid="+culprit;
show("results_game"); show("results_game");
npcs_ids.filter(x => x!=culprit).forEach(npcid =>{ setGameBackground(results_image_path);
npcs_ids.filter(x => x != culprit).forEach(npcid =>{
let suspect = document.createElement("div"); let suspect = document.createElement("div");
suspect.classList.add("summary_suspect"); suspect.classList.add("summary_suspect");
let img = document.createElement("img") let img = document.createElement("img")
@ -233,7 +271,6 @@ function initSock(){
let emotionDesc = document.createElement("p"); let emotionDesc = document.createElement("p");
emotionDesc.classList.add("explain_suspect_emotion_description"); emotionDesc.classList.add("explain_suspect_emotion_description");
//TODO fix typos on the database
emotionDesc.textContent = "Qui se caractérise par " + finalResults["npcs"][npcid]["description"]; emotionDesc.textContent = "Qui se caractérise par " + finalResults["npcs"][npcid]["description"];
suspect.appendChild(emotionDesc) suspect.appendChild(emotionDesc)
@ -242,15 +279,15 @@ function initSock(){
}); });
} }
async function setGameData(){ async function setGameData() {
data = {}; data = {};
response = await makeAPIRequest("getGameData"); response = await makeAPIRequest("getGameData");
gamedata = response["gamedata"]; gamedata = response["gamedata"];
username = response["username"] username = response["username"];
npcs_ids = Object.keys(gamedata["npcs"]).sort((a, b) => 0.5 - Math.random()) npcs_ids = Object.keys(gamedata["npcs"]).sort((a, b) => 0.5 - Math.random())
} }
async function initGame(){ async function initGame() {
await setGameData(); await setGameData();
initSock(); initSock();
renderAnswerSelectionPanel(); renderAnswerSelectionPanel();
@ -260,5 +297,7 @@ async function initGame(){
setListenerToIntroductionNextBtn() setListenerToIntroductionNextBtn()
setListenerToInterrogationNextBtn(); setListenerToInterrogationNextBtn();
show("introduction"); show("introduction");
setGameBackground(intro_image_path);
} }
initGame(); initGame();