import React, { useState, useEffect } from 'react'; import Switch from "react-switch"; import {saveAs} from "file-saver" /* Style */ import "./InGame.css" import {useTheme} from '../Style/ThemeContext' /* Component */ import GraphContainer from '../Components/GraphContainer'; import PlayerList from '../Components/PlayerList'; import TurnBar from '../Components/TurnBar'; /* Icon */ import Param from "../res/icon/param.png"; import Info from "../res/icon/infoGreen.png"; import Check from "../res/icon/checkboxGreen.png"; import MGlass from "../res/icon/magnifying-glass.png"; import Reset from "../res/icon/reset.png"; import Oeye from "../res/icon/eye.png"; import Ceye from "../res/icon/hidden.png"; import ImgBot from "../res/img/bot.png"; import ava from "../res/img/tuto/tuto-ava.png"; import joueurs from "../res/img/tuto/tuto-joueurs.png"; import tada from "../res/img/tuto/tuto-tada.png"; import step1 from "../res/img/tuto/tuto2-1.png"; import step2 from "../res/img/tuto/tuto2-2.png"; import step3 from "../res/img/tuto/tuto2-3.png"; import step4 from "../res/img/tuto/tuto2-4.png"; import step5 from "../res/img/tuto/tuto2-5.png"; import step6 from "../res/img/tuto/tuto2-6.png"; /* nav */ import { Link, Navigate, useNavigate, useNavigationType } from 'react-router-dom'; /* Boostrap */ import Offcanvas from 'react-bootstrap/Offcanvas'; import Modal from 'react-bootstrap/Modal'; import Card from 'react-bootstrap/Card'; import Button from 'react-bootstrap/Button'; /* Model */ import Stub from '../model/Stub'; import { useGame } from '../Contexts/GameContext'; import { socket } from '../SocketConfig'; import { Network } from 'vis-network'; import {generateLatexCode, generateLatexCodeEnigme} from '../Script/LatexScript'; import Pair from '../model/Pair'; import Indice from '../model/Indices/Indice'; import {basePath} from "../AdressSetup" import TutorialGraph from '../Components/TutorialGraph'; import { useAuth } from '../Contexts/AuthContext'; import EasyBot from '../model/EasyBot'; import { set } from 'lodash'; let cptNavigation = 0 //@ts-ignore const Tutorial = ({locale, changeLocale}) => { const {personNetwork, person, indices, players, setPlayersData, indice, actualPlayerIndex} = useGame() const {user} = useAuth() const theme = useTheme(); const navigate = useNavigate() const [greyForEveryone, setGreyForEveryone] = useState<() => void>(() => {}); const setGreyForEveryoneData = (func: () => void) => { setGreyForEveryone(func) } const navigationType = useNavigationType() cptNavigation++ if (cptNavigation % 2 == 0){ if (navigationType.toString() == "POP"){ socket.emit("player quit") navigate(`${basePath}/`) } } //* Historique const [history, setHistory] = useState([]); const [showLast, setShowLast] = useState(false) const [askedWrong, setAskedWrong] = useState(false) const [importToPdf, setImportToPdf] = useState(false) const [importToJSON, setImportToJSON] = useState(false) const [tutoStep, setTutoStep] = useState(0) const setTutoStepData = (step: number) => { setTutoStep(step) } const setImportToJSONData = (imp: boolean) => { setImportToJSON(imp) } const setImportToPdfData = (imp: boolean) => { setImportToPdf(imp) } // Fonction pour ajouter un élément à l'historique const addToHistory = (message: string) => { setHistory(prevHistory => [...prevHistory, message]); }; const setShowLastData = () =>{ setLastVisible(!showLast); setShowLast(!showLast); } const setAskedWrongData = (askedWrong: boolean) => { setAskedWrong(askedWrong) } useEffect(() => { const historyContainer = document.getElementById('history-container'); if (historyContainer) { historyContainer.scrollTop = historyContainer.scrollHeight; } }, [history]); useEffect(() => { if (user == null){ return } setPlayersData([user, new EasyBot("Bot1", "Bot1", ImgBot), new EasyBot("Bot2", "Bot2", ImgBot)]) }, []) const [showChoiceBar, setShowChoiceBar] = useState(false); const [showTurnBar, setShowTurnBar] = useState(false); const [turnBarText, setTurnBarText] = useState(""); const [playerTouched, setPlayerTouched] = useState(-2) const [playerIndex, setPlayerIndex] = useState(-2) const [network, setNetwork] = useState(null) const [networkEnigme, setNetworkEnigme] = useState[]> | null>(null) const setNetworkData = (network: Network) => { setNetwork(network) } const setNetworkEnigmeData = (networkEnigme: Map[]>) => { setNetworkEnigme(networkEnigme) } const handleNodeClick = (shouldShowChoiceBar: boolean) => { setShowChoiceBar(shouldShowChoiceBar); }; const handleSetPlayerTouched = (newPlayerTouched: number) => { setPlayerTouched(newPlayerTouched); }; const handleShowTurnBar = (shouldShowTurnBar: boolean) => { setShowTurnBar(shouldShowTurnBar); }; const handleTurnBarTextChange = (newTurnBarText: string) =>{ setTurnBarText(newTurnBarText) } const setPlayerIndexData = (playerIndex: number) => { setPlayerIndex(playerIndex) } const resetGraph = () => { setisLoading(true); socket.emit("reset graph", socket.id) setTimeout(() => { setisLoading(false); }, 2000); } /* offcanvas */ //? faire une fonction pour close et show en fonction de l'etat du canva ? //? comment faire pour eviter la recopie de tout le code a chaque canvas boostrap ? const [show, setShow] = useState(false); const handleClose = () => setShow(false); const handleShow = () => setShow(true); const [showP, setShowP] = useState(false); const handleCloseP = () => setShowP(false); const handleShowP = () => setShowP(true); const [showS, setShowS] = useState(false); const handleCloseS = () => setShowS(false); const handleShowS = () => setShowS(true); const [cptTour, setcptTour] = useState(0); const [LastVisible, setLastVisible] = useState(false); const [isLoading, setisLoading] = useState(false); //@ts-ignore const changecptTour = (newcptTour) => { setcptTour(newcptTour); }; const handleChange = () => { if (show){ handleClose() } else { handleShow() } }; const handleChangeS = () => { if (showS){ handleCloseS() } else { handleShowS() } }; const eye = LastVisible ? Oeye : Ceye; //icon que l'on affiche pour l'oeil : fermé ou ouvert. /* Windows open */ //@ts-ignore const openInNewTab = (url) => { //! avec url ==> dangereux window.open(url); }; const [SwitchEnabled, setSwitchEnabled] = useState(false) const allIndices = Stub.GenerateIndice() const nbPlayer = players.length; const navdeduc = 'deduc?actualId=' + actualPlayerIndex + '&nbPlayer=' + nbPlayer; //* gestion demo */ const [showM, setShowM] = useState(false); const [showTuto2, setShowTuto2] = useState(false); const [showTuto21, setShowTuto21] = useState(false); const [showTuto22, setShowTuto22] = useState(false); const [showTuto3, setShowTuto3] = useState(false); const handleCloseM = () => { setShowM(false); setTuto1disable(false); } const handleShowM = () => setShowM(true); const handleCloseTuto2 = () => setShowTuto2(false); const handleShowTuto2 = () => setShowTuto2(true); const handleCloseTuto21 = () => setShowTuto21(false); const handleShowTuto21 = () => setShowTuto21(true); const handleCloseTuto22 = () => setShowTuto22(false); const handleShowTuto22 = () => setShowTuto22(true); const handleCloseTuto3 = () => setShowTuto3(false); const handleShowTuto3 = () => setShowTuto3(true); const [step, setStep] = useState(0); const [tuto1disable, setTuto1disable] = useState(true); //? mauvaise idée ? //@ts-ignore const displayModalstep = (step: number) => { //* for step 2 setStep(0); // remise a 0 de step switch(step) { case 1: setShowTuto21(true); break; case 2: setShowTuto22(true); break; case 3: setShowTuto3(true); break; } } return (
{showTurnBar && }
{history.map((item, index) => (
{item}
))}
Indice {indice?.ToString(locale)} Tutoriel {step === 0 && ( Les Personnes Les sommets du graphes représentent les personnes, chaque personne possède différentes caractéristiques, que ce soit leur nom, âge, sport et leur couleur de cheveux.
Par exemple, ici, Nous avons Ava, qui a 40 ans, qui pratique du Basket et du Tennis, qui a les cheveux Roux et qui possède 2 voisins
)} {step === 1 && ( Les Joueurs Il est possible de voir les joueurs sur le côté gauche de l'écran, ils sont représentés par des cercles de couleurs différentes. Le Joueur avec un contour carré est le joueur qui joue actuellement.
Il est possible de cliquer sur l'image d'un joueur pour le séléctionné, afin de pouvoir lui demander des informations à propos de quelqu'un sur le graphe.
)} {step === 2 && ( L'historique ? parler des carré et des rond a la place de l'historque ? Les sommets du graphes représentent les personnes, chaque personne possède différentes caractéristiques, que ce soit leur nom, âge, sport et leur couleur de cheveux.
Par exemple, ici, Nous avons Ava, qui a 40 ans, qui pratique du Basket et du Tennis, qui a les cheveux Roux et qui possède 2 voisins
)} {step === 3 && ( Les règle du jeu Ce bouton vous mène a la page d'information du jeu, avec toutes les règles du jeu, que ce soit les objectifs, les indices, le déroulement, etc... )} {step === 4 && ( L'indice Ce boutons vous permet d'afficher votre indice personnel, gradez le secret ! Il s'agit de votre meilleur atout pour gagner. )} {step === 5 && ( Étape finale Bien joué ! vous avez effectué la première étape du tutoriel, maintenant, place à la pratique ! Vous pouvez maintenant fermer cette fenêtre et commencer à jouer !
Vous avez maintenant accès au Tuto 2
)}
{/* */} { step != 0 && ()} { step === 5 ? () : }
Tutoriel Premier pas Bienvenue dans cette seconde partie, ou nous allons apprendre le déroulé d'une partie.
Dans un premier temps, Séléctionnez le joueur Bot1 et questionnez le à propos de Violet en cliquant sur cette dernière.
Tutoriel {step === 0 && ( votre premier tour Super, Violet a été identifié par l'indice de Bot1, c'est une information essentiel ! Cependant, cela ne signigie pas forcément qu'elle est coupable.
C'est à présent le tour aux autres joueurs de jouer, regardons ce qu'ils ont fait.
)} {step === 1 && ( Premier tour des autres joueurs Il semblerai que Bot1 ait intérrogé Bot2 à propos de Violet, et que ce dernier ait répondu non par un carré. Cela signifie que Violet n'est pas coupable, et qu'elle est donc innocente !
Bot1 a donc fait une erreur, en questionnant quelqu'un pouvant innocenter Violet. En guise de punition, il dois lui aussi poser un carré sur un autre joueur, révélant aussi plus d'information sur son indice. Nous savons donc maintenant que l'indice de Bot1 ne permet pas d'identifier sebastian.
Ensuite, Bot2 a questionné Bot1 à propos de Charlotte, qui est identifié par l'indice de Bot1.
)} {step === 2 && ( Second tour Vous remarquez que votre indice identifie lui aussi Charlotte, et si nous demandions à Bot2, si ce dernier pense que Charlotte est le coupable ?
Cela nous permettrais donc de mettre fin à la partie !
)}
{ step != 0 && ()} { step === 2 ? () : }
Tutoriel La punition Mince, il semblerai que l'indice de Bot2 innocente Charlotte, et que ce dernier ait donc une erreur, la punition s'applique !
Vous devez donc poser un carré sur un autre joueur, révélant ainsi plus d'information sur votre indice.
Afin de revéler le moins d'informations, posons notre carré sur Liam, il s'agit de la seul personne qui à moins de 20 ans encore suspecte.
End Game La fin du jeu Ce tour est lui aussi riche en informations !
Vous avez a présent assez d'information pour deviner les indices des autre :
  • Bot1 semble avoir {indices[1]?.ToString(locale)}
  • Bot2 semble avoir {indices[2]?.ToString(locale)}
  • Et votre indice est {indices[0]?.ToString(locale)}

Vous avec à présent toutes les cartes en main pour deviner qui est le coupable, cliquer sur le bouton Ask Everyone pour deviner, bonne chance !
); }; export default Tutorial;