From c08223fbb5897f30997b8f2b49dda04885069ed9 Mon Sep 17 00:00:00 2001 From: Pierre Ferreira Date: Thu, 7 Dec 2023 10:37:32 +0100 Subject: [PATCH 01/20] mise de localhost pour les serv :tada: --- cryptide_project/server/api/server.js | 2 +- cryptide_project/src/AdressSetup.ts | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/cryptide_project/server/api/server.js b/cryptide_project/server/api/server.js index e035cff..f511624 100644 --- a/cryptide_project/server/api/server.js +++ b/cryptide_project/server/api/server.js @@ -14,7 +14,7 @@ const port = 3003; // Middleware app.use(cors( { - origin: ["http://172.20.10.4:3000", "http://172.20.10.4:3000"], + origin: ["http://localhost:3000", "http://172.20.10.4:3000"], credentials: true } )); // Autoriser les requêtes cross-origin diff --git a/cryptide_project/src/AdressSetup.ts b/cryptide_project/src/AdressSetup.ts index cbfa6bc..b1722ea 100644 --- a/cryptide_project/src/AdressSetup.ts +++ b/cryptide_project/src/AdressSetup.ts @@ -1,6 +1,8 @@ -const ADRESSE_WEBSERVER = "http://172.20.10.4:3002" +// const ADRESSE_WEBSERVER = "http://172.20.10.4:3002" +// const ADRESSE_DBSERVER = "http://172.20.10.4:3003" +const ADRESSE_WEBSERVER = "http://localhost:3002" +const ADRESSE_DBSERVER = "http://localhost:3003" -const ADRESSE_DBSERVER = "http://172.20.10.4:3003" const tmp = ADRESSE_DBSERVER const tmp2 = ADRESSE_WEBSERVER From abbcdef16567c0918cd8a3c843bbfb769ef6d72c Mon Sep 17 00:00:00 2001 From: Pierre Ferreira Date: Thu, 7 Dec 2023 11:28:44 +0100 Subject: [PATCH 02/20] fix de l'emoji qui s'affiche pour les pseudos trop courts --- cryptide_project/DB/socialgraph.db | Bin 28672 -> 28672 bytes .../src/Components/PersonStatus.tsx | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/cryptide_project/DB/socialgraph.db b/cryptide_project/DB/socialgraph.db index 223f093c6153da6b6aa51a456c2f657c1c2a9f41..a2e895095d402eece0797772bc7b21f84ed399ab 100644 GIT binary patch delta 260 zcmZp8z}WDBae_4C?1?hYjI%c;bon!KPJZn#Da6hj!N9+S-;wVbUn`#q?1WhIeGiADxS#=3?^ zx(4P7h6Ywf=2phW5ghCcf*>1Y diff --git a/cryptide_project/src/Components/PersonStatus.tsx b/cryptide_project/src/Components/PersonStatus.tsx index 54b2139..4b6c5d2 100644 --- a/cryptide_project/src/Components/PersonStatus.tsx +++ b/cryptide_project/src/Components/PersonStatus.tsx @@ -112,7 +112,7 @@ const PersonStatus: React.FC = ({img = Person, state= Person, {/* */}
-
{actualPlayerIndex !== index ? (name.substring(0, name.length - 2).length > 7 ? name.substring(0, name.length - 2).substring(0, 7) + '...' : name) : 'vous'}
+
{actualPlayerIndex !== index ? (name.substring(0, name.length - 2).length > 7 ? name.substring(0, name.length - 2).substring(0, 7) + '...' : name.substring(0, name.length - 2)) : 'vous'}
); From 355ef62f7fe8df26b141dc0adf3cce07297a9c94 Mon Sep 17 00:00:00 2001 From: Thomas Chazot Date: Thu, 7 Dec 2023 11:59:34 +0100 Subject: [PATCH 03/20] =?UTF-8?q?d=C3=A9but=20tuto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cryptide_project/src/App.tsx | 2 + cryptide_project/src/Components/ChoiceBar.tsx | 1 + .../src/Components/GraphContainer.tsx | 23 +- .../src/Components/TutorialGraph.tsx | 201 ++++++++ cryptide_project/src/Pages/InGame.tsx | 9 +- cryptide_project/src/Pages/Lobby.tsx | 2 +- cryptide_project/src/Pages/NewPlay.tsx | 5 + cryptide_project/src/Pages/Tutorial.tsx | 454 ++++++++++++++++++ cryptide_project/src/model/Graph/Edge.ts | 1 + cryptide_project/src/tuto/graph.json | 1 + cryptide_project/src/tuto/indices.json | 1 + 11 files changed, 697 insertions(+), 3 deletions(-) create mode 100644 cryptide_project/src/Components/TutorialGraph.tsx create mode 100644 cryptide_project/src/Pages/Tutorial.tsx create mode 100644 cryptide_project/src/tuto/graph.json create mode 100644 cryptide_project/src/tuto/indices.json diff --git a/cryptide_project/src/App.tsx b/cryptide_project/src/App.tsx index b3fb0a9..fc79611 100644 --- a/cryptide_project/src/App.tsx +++ b/cryptide_project/src/App.tsx @@ -43,6 +43,7 @@ import ErrorBoundary from './Error/ErrorBoundary'; import ErrorPage from './Error/ErrorPage'; import DeducCheck from './Pages/DeducCheck'; import {basePath} from "./AdressSetup" +import Tutorial from './Pages/Tutorial'; @@ -88,6 +89,7 @@ function App() { } /> }/> } /> + } /> } /> } /> } /> diff --git a/cryptide_project/src/Components/ChoiceBar.tsx b/cryptide_project/src/Components/ChoiceBar.tsx index c4bb3b6..7db97d6 100644 --- a/cryptide_project/src/Components/ChoiceBar.tsx +++ b/cryptide_project/src/Components/ChoiceBar.tsx @@ -19,6 +19,7 @@ const ChoiceBar = () => { async function askEveryone(){ if (nodeId !== null){ + //@ts-ignore const person = personNetwork?.getPersons().find((p) => p.getId() == nodeId) if (person != undefined){ const indiceTester = IndiceTesterFactory.Create(indices[actualPlayerIndex]) diff --git a/cryptide_project/src/Components/GraphContainer.tsx b/cryptide_project/src/Components/GraphContainer.tsx index 74997ab..fe8bf5b 100644 --- a/cryptide_project/src/Components/GraphContainer.tsx +++ b/cryptide_project/src/Components/GraphContainer.tsx @@ -41,6 +41,8 @@ interface MyGraphComponentProps { setPlayerIndex: (playerIndex: number) => void importToPdf: boolean setImportToPdf: (imp: boolean) => void + importToJSON: boolean + setImportToJSON: (imp: boolean) => void } let lastAskingPlayer = 0 @@ -70,7 +72,7 @@ let testPlayers: Player[] = [] -const MyGraphComponent: React.FC = ({onNodeClick, handleShowTurnBar, handleTurnBarTextChange, playerTouched, setPlayerTouched, changecptTour, solo, isDaily, isEasy, addToHistory, showLast, setNetwork, setNetworkEnigme, setPlayerIndex, askedWrong, setAskedWrong, importToPdf, setImportToPdf}) => { +const MyGraphComponent: React.FC = ({onNodeClick, handleShowTurnBar, handleTurnBarTextChange, playerTouched, setPlayerTouched, changecptTour, solo, isDaily, isEasy, addToHistory, showLast, setNetwork, setNetworkEnigme, setPlayerIndex, askedWrong, setAskedWrong, importToPdf, setImportToPdf, importToJSON, setImportToJSON}) => { let cptTour: number = 0 //* Gestion du temps : @@ -320,6 +322,25 @@ const MyGraphComponent: React.FC = ({onNodeClick, handleS } }, [importToPdf]) + function downloadToJSON(jsonData: any, filename: string) { + const jsonBlob = new Blob([JSON.stringify(jsonData)], {type: 'application/json'}); + const url = URL.createObjectURL(jsonBlob); + const link = document.createElement('a'); + link.download = filename; + link.href = url; + link.click(); + URL.revokeObjectURL(url); + } + + + useEffect(() => { + if (importToJSON){ + setImportToJSON(false) + downloadToJSON(personNetwork, "graph.json") + downloadToJSON(JSON.stringify(indices), "indices.json") + } + }, [importToJSON]) + useEffect(() => { if (personNetwork == null){ return diff --git a/cryptide_project/src/Components/TutorialGraph.tsx b/cryptide_project/src/Components/TutorialGraph.tsx new file mode 100644 index 0000000..d8de1b3 --- /dev/null +++ b/cryptide_project/src/Components/TutorialGraph.tsx @@ -0,0 +1,201 @@ +import React, { useEffect, useState } from "react"; +import { DataSet, Network} from "vis-network/standalone/esm/vis-network"; +import GraphCreator from "../model/Graph/GraphCreator"; +import "./GraphContainer.css"; +import IndiceTesterFactory from "../model/Factory/IndiceTesterFactory"; +import Person from "../model/Person"; +import { useNavigate } from "react-router-dom"; +import { useGame } from "../Contexts/GameContext"; +import { socket } from "../SocketConfig" +import { colorToEmoji, positionToColor, positionToEmoji } from "../ColorHelper"; +import { ColorToHexa } from "../model/EnumExtender"; +import Bot from "../model/Bot"; +import NodePerson from "../model/Graph/NodePerson"; +import { useAuth } from "../Contexts/AuthContext"; +import Indice from "../model/Indices/Indice"; +import Pair from "../model/Pair"; +import Player from "../model/Player"; +import JSONParser from "../JSONParser"; +import User from "../model/User"; +import { json } from "body-parser"; +import html2canvas from 'html2canvas'; +import jsPDF from 'jspdf'; +import {basePath} from "../AdressSetup" +import PersonNetwork from "../model/PersonsNetwork"; + +interface TutorialGraphProps { + onNodeClick: (shouldShowChoiceBar: boolean) => void; + handleShowTurnBar: (shouldShowTurnBar: boolean) => void + handleTurnBarTextChange: (newTurnBarText: string) => void + setPlayerTouched: (newPlayerTouch: number) => void; + playerTouched: number + changecptTour: (newcptTour : number) => void + addToHistory: (message : string) => void + solo : boolean + isDaily : boolean + isEasy: boolean + setNetwork: (network: Network) => void + showLast: boolean + setNetworkEnigme: (networkEnigme: Map[]>) => void + askedWrong: boolean + setAskedWrong: (askedWrong: boolean) => void + setPlayerIndex: (playerIndex: number) => void + importToPdf: boolean + setImportToPdf: (imp: boolean) => void + importToJSON: boolean + setImportToJSON: (imp: boolean) => void +} + +let lastNodes: NodePerson[] = [] +let firstIndex = true + + + +const TutorialGraph: React.FC = ({onNodeClick, handleShowTurnBar, handleTurnBarTextChange, playerTouched, setPlayerTouched, changecptTour, solo, isDaily, isEasy, addToHistory, showLast, setNetwork, setNetworkEnigme, setPlayerIndex, askedWrong, setAskedWrong, importToPdf, setImportToPdf, importToJSON, setImportToJSON}) => { + let cptTour: number = 0 + + //* Gestion du temps : + let initMtn = 0 + + const {isLoggedIn, user, manager} = useAuth(); + const {setIndiceData} = useGame(); + const params = new URLSearchParams(window.location.search); + + const navigate = useNavigate(); + const [lastIndex, setLastIndex] = useState(-1) + /* + + useEffect(() =>{ + touchedPlayer=playerTouched + console.log(playerTouched) + if (touchedPlayer == -1){ + if (!askedWrongLocal){ + socket.emit("put correct background", socket.id) + } + } + else if (touchedPlayer < players.length && touchedPlayer>=0){ + if(!askedWrongLocal){ + socket.emit("put correct background", socket.id) + socket.emit("put grey background", socket.id, touchedPlayer) + } + } + else if(touchedPlayer == players.length){ + socket.emit("put imossible grey", socket.id) + } + }, [playerTouched]) + + */ + + useEffect(() => { + const tab: NodePerson[] = [] + for(const n of lastNodes.reverse()){ + + } + lastNodes = tab + if (showLast){ + socket.emit("opacity activated", socket.id) + } + else{ + socket.emit("opacity deactivated", socket.id) + } + + }, [showLast]) + + let playerIndex: number = 0 + + if (firstIndex){ + firstIndex=false + setPlayerIndex(playerIndex) + } + let index = 0 + + useEffect(() => { + + + let jsonGraph = require("../tuto/graph.json") + let jsonIndice = require("../tuto/indices.json") + + const personNetwork = JSONParser.JSONToNetwork(JSON.stringify(jsonGraph)) + const indices = JSONParser.JSONToIndices(jsonIndice) + + setIndiceData(indices[0]) + if (personNetwork == null){ + return + } + const graph = GraphCreator.CreateGraph(personNetwork) + + const nodes = graph.nodesPerson; + + + let n = graph.nodesPerson; + let e = graph.edges; + const graphState = { n, e }; + + // Sauvegarder l'état dans localStorage + localStorage.setItem('graphState', JSON.stringify(graphState)); + + const container = document.getElementById('graph-container'); + if (!container) { + console.error("Container not found"); + return; + } + // Charger les données dans le graph + + // Configuration des options du Graphe + const initialOptions = { + + layout: { + improvedLayout: true, + hierarchical: { + enabled: false, + direction: 'LR', // LR (Left to Right) ou autre selon votre préférence + sortMethod: 'hubsize' + }, + randomSeed: 2 + }, + physics: { + enabled: true, + barnesHut: { + gravitationalConstant: -1000, + springConstant: 0.001, + springLength: 100 + }, + solver: "repulsion", + repulsion: { + nodeDistance: 100 // Put more distance between the nodes. + } + } + }; + + const networkData = { nodes: nodes, edges: graph.edges }; + const network = new Network(container, networkData, initialOptions); + network.stabilize(); + setNetwork(network) + + + network.on("dragging", (params) => { + if (params.nodes.length > 0) { + // Un nœud a été cliqué + initialOptions.physics.enabled = false; + network.setOptions(initialOptions); + setNetwork(network) + } + }); + + }, []); // Le tableau vide signifie que cela ne s'exécutera qu'une fois après le premier rendu + + return ( + <> +
+ + ); + + function delay(ms: number): Promise { + return new Promise(resolve => setTimeout(resolve, ms)); + } + +} + + + +export default TutorialGraph; \ No newline at end of file diff --git a/cryptide_project/src/Pages/InGame.tsx b/cryptide_project/src/Pages/InGame.tsx index 9a5b1d1..4acfc2f 100644 --- a/cryptide_project/src/Pages/InGame.tsx +++ b/cryptide_project/src/Pages/InGame.tsx @@ -97,6 +97,11 @@ const InGame = ({locale, changeLocale}) => { const [showLast, setShowLast] = useState(false) const [askedWrong, setAskedWrong] = useState(false) const [importToPdf, setImportToPdf] = useState(false) + const [importToJSON, setImportToJSON] = useState(false) + + const setImportToJSONData = (imp: boolean) => { + setImportToJSON(imp) + } const setImportToPdfData = (imp: boolean) => { setImportToPdf(imp) @@ -306,7 +311,9 @@ const InGame = ({locale, changeLocale}) => { askedWrong={askedWrong} setAskedWrong={setAskedWrongData} importToPdf={importToPdf} - setImportToPdf={setImportToPdfData}/> + setImportToPdf={setImportToPdfData} + importToJSON={importToJSON} + setImportToJSON={setImportToJSONData}/>
diff --git a/cryptide_project/src/Pages/Lobby.tsx b/cryptide_project/src/Pages/Lobby.tsx index c6f412b..64dc6c6 100644 --- a/cryptide_project/src/Pages/Lobby.tsx +++ b/cryptide_project/src/Pages/Lobby.tsx @@ -213,7 +213,7 @@ function Lobby() { function StartGame(){ - const [networkPerson, choosenPerson, choosenIndices] = GameCreator.CreateGame(players.length, enteredNumber) + const [networkPerson, choosenPerson, choosenIndices] = GameCreator.CreateGame(players.length, 10) setPersonData(choosenPerson) setPersonNetworkData(networkPerson) setIndicesData(choosenIndices) diff --git a/cryptide_project/src/Pages/NewPlay.tsx b/cryptide_project/src/Pages/NewPlay.tsx index c69c631..d10c53a 100644 --- a/cryptide_project/src/Pages/NewPlay.tsx +++ b/cryptide_project/src/Pages/NewPlay.tsx @@ -110,6 +110,10 @@ function NewPlay() { else setShowOverlay(true) } + + function launchTuto(){ + navigate(`${basePath}/tutorial`); + } useEffect(() => { @@ -226,6 +230,7 @@ function NewPlay() { + {/* */} {/* {goBackRoom != -1 && } */} diff --git a/cryptide_project/src/Pages/Tutorial.tsx b/cryptide_project/src/Pages/Tutorial.tsx new file mode 100644 index 0000000..34e6073 --- /dev/null +++ b/cryptide_project/src/Pages/Tutorial.tsx @@ -0,0 +1,454 @@ +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 JSZip from 'jszip'; + +/* nav */ +import { Link, Navigate, useNavigate, useNavigationType } from 'react-router-dom'; + +/* Boostrap */ +import Offcanvas from 'react-bootstrap/Offcanvas'; + +/* Model */ +import Stub from '../model/Stub'; +import { HiLanguage } from 'react-icons/hi2'; +import { Nav, NavDropdown, Spinner } from 'react-bootstrap'; +import { FormattedMessage } from 'react-intl'; +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'; + + +let cptNavigation = 0 + +//@ts-ignore +const Tutorial = ({locale, changeLocale}) => { + + const theme = useTheme(); + + const navigate = useNavigate() + + const params = new URLSearchParams(window.location.search); + + const navigationType = useNavigationType() + cptNavigation++ + if (cptNavigation % 2 == 0){ + if (navigationType.toString() == "POP"){ + socket.emit("player quit") + navigate(`${basePath}/`) + } + } + + //* Gestion solo + let IsSolo: boolean = true + const solotmp = params.get('solo'); + if (solotmp == "false"){ + IsSolo=false + } + + //* Gestion daily + let isDaily: boolean = true + const isDailytmp = params.get('daily'); + if (isDailytmp == "false"){ + isDaily=false + } + + + let isEasy: boolean = true + const isEasytmp = params.get('easy'); + if (isEasytmp == "false"){ + isEasy=false + } + //* 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 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]); + + + const {personNetwork, person, indices} = useGame() + + 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 generateTEX = async () => { + if (network != null && personNetwork != null && person != null){ + + const zip = new JSZip(); + + if (isDaily && networkEnigme != null){ + const tex = generateLatexCodeEnigme(personNetwork, person, indices, network, networkEnigme) + const blob = new Blob([tex], { type: 'application/x-latex;charset=utf-8' }); + zip.file('socialGraph.tex', tex); + } + else{ + const tex = generateLatexCode(personNetwork, person, indices, network) + const blob = new Blob([tex], { type: 'application/x-latex;charset=utf-8' }); + zip.file('socialGraph.tex', tex); + } + + const imageNames = ['ballon-de-basket.png', 'ballon-de-foot.png', "baseball.png", "bowling.png", "tennis.png"]; // Liste des noms de fichiers d'images + const imagesFolder = 'Script'; + + for (const imageName of imageNames) { + const imageUrl = process.env.PUBLIC_URL + `/${imagesFolder}/${imageName}`; + const response = await fetch(imageUrl); + + if (response.ok) { + const imageBlob = await response.blob(); + zip.file(`${imageName}`, imageBlob); + } else { + console.error(`Erreur de chargement de l'image ${imageName}`); + } + } + + const content = await zip.generateAsync({ type: 'blob' }); + + // Enregistre l'archive en tant que fichier + saveAs(content, 'social_graph.zip'); + + // Utiliser FileSaver pour télécharger le fichier + } + } + + 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 { indice, players, actualPlayerIndex} = useGame(); + + const nbPlayer = players.length; + const navdeduc = 'deduc?actualId=' + actualPlayerIndex + '&nbPlayer=' + nbPlayer; + + return ( +
+ {showTurnBar && } +
+ +
+ + + {(!isDaily || (isDaily && isEasy)) && +
+ {history.map((item, index) => ( +
{item}
+ ))} +
+ } + +
+ +
+ + + +
+
+ +
+ + + + + {/* + //? redirection impossible apparament (securité des navigateur + */} + + + + + + + + + + + {!IsSolo && } +
+ +{/* + + + Joueurs +

Il y a {players.length} joueurs

+
+ + + +
+ */} + + { !IsSolo && +
+ +
+ } + + + + Indice + + + {/* Possède les cheveux noir ou joue au basket */} + {indice?.ToString(locale)} + + + + { + //* canva pour les paramètres + } + + + param Paramètres + + + + + + + + +
+ ); + }; + + +export default Tutorial; diff --git a/cryptide_project/src/model/Graph/Edge.ts b/cryptide_project/src/model/Graph/Edge.ts index 92d0816..07f7311 100644 --- a/cryptide_project/src/model/Graph/Edge.ts +++ b/cryptide_project/src/model/Graph/Edge.ts @@ -2,6 +2,7 @@ class Edge{ public from: number public to: number + public color: string = "black" constructor(from: number, to: number){ this.from = from diff --git a/cryptide_project/src/tuto/graph.json b/cryptide_project/src/tuto/graph.json new file mode 100644 index 0000000..1690f7c --- /dev/null +++ b/cryptide_project/src/tuto/graph.json @@ -0,0 +1 @@ +{"persons":[{"id":0,"name":"Charlotte","age":25,"color":2,"sports":[4],"friends":[{"id":4,"name":"Sophia","age":20,"color":4,"sports":[1,3]},{"id":3,"name":"Aurora","age":19,"color":0,"sports":[4,2]},{"id":7,"name":"Violet","age":24,"color":2,"sports":[3]},{"id":5,"name":"Alice","age":68,"color":3,"sports":[0]}]},{"id":1,"name":"Carter","age":20,"color":1,"sports":[1,0],"friends":[{"id":4,"name":"Sophia","age":20,"color":4,"sports":[1,3]},{"id":2,"name":"Ava","age":40,"color":3,"sports":[2,3]}]},{"id":2,"name":"Ava","age":40,"color":3,"sports":[2,3],"friends":[{"id":1,"name":"Carter","age":20,"color":1,"sports":[1,0]},{"id":9,"name":"Liam","age":19,"color":4,"sports":[0]}]},{"id":3,"name":"Aurora","age":19,"color":0,"sports":[4,2],"friends":[{"id":4,"name":"Sophia","age":20,"color":4,"sports":[1,3]},{"id":0,"name":"Charlotte","age":25,"color":2,"sports":[4]},{"id":8,"name":"Sebastian","age":13,"color":0,"sports":[1]},{"id":9,"name":"Liam","age":19,"color":4,"sports":[0]},{"id":6,"name":"Benjamin","age":52,"color":1,"sports":[0,2,4]}]},{"id":4,"name":"Sophia","age":20,"color":4,"sports":[1,3],"friends":[{"id":3,"name":"Aurora","age":19,"color":0,"sports":[4,2]},{"id":0,"name":"Charlotte","age":25,"color":2,"sports":[4]},{"id":1,"name":"Carter","age":20,"color":1,"sports":[1,0]}]},{"id":5,"name":"Alice","age":68,"color":3,"sports":[0],"friends":[{"id":0,"name":"Charlotte","age":25,"color":2,"sports":[4]},{"id":6,"name":"Benjamin","age":52,"color":1,"sports":[0,2,4]}]},{"id":6,"name":"Benjamin","age":52,"color":1,"sports":[0,2,4],"friends":[{"id":3,"name":"Aurora","age":19,"color":0,"sports":[4,2]},{"id":5,"name":"Alice","age":68,"color":3,"sports":[0]}]},{"id":7,"name":"Violet","age":24,"color":2,"sports":[3],"friends":[{"id":0,"name":"Charlotte","age":25,"color":2,"sports":[4]}]},{"id":8,"name":"Sebastian","age":13,"color":0,"sports":[1],"friends":[{"id":3,"name":"Aurora","age":19,"color":0,"sports":[4,2]}]},{"id":9,"name":"Liam","age":19,"color":4,"sports":[0],"friends":[{"id":2,"name":"Ava","age":40,"color":3,"sports":[2,3]},{"id":3,"name":"Aurora","age":19,"color":0,"sports":[4,2]}]}]} \ No newline at end of file diff --git a/cryptide_project/src/tuto/indices.json b/cryptide_project/src/tuto/indices.json new file mode 100644 index 0000000..3e14a36 --- /dev/null +++ b/cryptide_project/src/tuto/indices.json @@ -0,0 +1 @@ +"[{\"type\":\"AgeIndice\",\"id\":5,\"minimum\":20,\"maximum\":29},{\"type\":\"SportIndice\",\"id\":24,\"sports\":[2,3]},{\"type\":\"ColorEdgesIndice\",\"id\":27,\"neighborsColors\":[0]}]" \ No newline at end of file From d97ed83ae4776690f9a293403382b907ca8c5982 Mon Sep 17 00:00:00 2001 From: Pierre Ferreira Date: Thu, 7 Dec 2023 12:01:52 +0100 Subject: [PATCH 04/20] changement de l'interface du joueur actuel :art: --- cryptide_project/server/api/server.js | 2 +- cryptide_project/src/AdressSetup.ts | 4 ++-- cryptide_project/src/Components/PersonStatus.tsx | 12 ++++++------ 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/cryptide_project/server/api/server.js b/cryptide_project/server/api/server.js index e035cff..f511624 100644 --- a/cryptide_project/server/api/server.js +++ b/cryptide_project/server/api/server.js @@ -14,7 +14,7 @@ const port = 3003; // Middleware app.use(cors( { - origin: ["http://172.20.10.4:3000", "http://172.20.10.4:3000"], + origin: ["http://localhost:3000", "http://172.20.10.4:3000"], credentials: true } )); // Autoriser les requêtes cross-origin diff --git a/cryptide_project/src/AdressSetup.ts b/cryptide_project/src/AdressSetup.ts index cbfa6bc..da5fce5 100644 --- a/cryptide_project/src/AdressSetup.ts +++ b/cryptide_project/src/AdressSetup.ts @@ -1,6 +1,6 @@ -const ADRESSE_WEBSERVER = "http://172.20.10.4:3002" +const ADRESSE_WEBSERVER = "http://localhost:3002" -const ADRESSE_DBSERVER = "http://172.20.10.4:3003" +const ADRESSE_DBSERVER = "http://localhost:3003" const tmp = ADRESSE_DBSERVER const tmp2 = ADRESSE_WEBSERVER diff --git a/cryptide_project/src/Components/PersonStatus.tsx b/cryptide_project/src/Components/PersonStatus.tsx index 4b6c5d2..e4ea131 100644 --- a/cryptide_project/src/Components/PersonStatus.tsx +++ b/cryptide_project/src/Components/PersonStatus.tsx @@ -37,7 +37,7 @@ const PersonStatus: React.FC = ({img = Person, state= Person, img = BotImg } - const [buffer, setBuffer] = useState("") + const [buffer, setBuffer] = useState('50%') const [touchedPlayer, setTouchedPlayer] = useState(-2) useEffect(() =>{ @@ -48,10 +48,10 @@ const PersonStatus: React.FC = ({img = Person, state= Person, useEffect(() => { if (playerIndex===index){ - setBuffer('solid 3px green') + setBuffer('5px') } else{ - setBuffer('') + setBuffer('50%') } }, [playerIndex]) @@ -71,7 +71,7 @@ const PersonStatus: React.FC = ({img = Person, state= Person, }; const circleStyle: React.CSSProperties = { backgroundColor: touchedPlayer == index && showCircle ? 'gold' : positionToColor(index), // Changement de la couleur en fonction de la condition - borderRadius: '50%', + borderRadius: buffer, width: '80px', height: '80px', display: 'flex', @@ -84,7 +84,7 @@ const PersonStatus: React.FC = ({img = Person, state= Person, const circleStyleInt: React.CSSProperties = { backgroundColor:'white', - borderRadius: '50%', + borderRadius: buffer, width: '70px', height: '70px', display: 'flex', @@ -111,7 +111,7 @@ const PersonStatus: React.FC = ({img = Person, state= Person, {/* */} -
+
{actualPlayerIndex !== index ? (name.substring(0, name.length - 2).length > 7 ? name.substring(0, name.length - 2).substring(0, 7) + '...' : name.substring(0, name.length - 2)) : 'vous'}
From 49f4beb2056ae4ff315c075bdd69bbad1e983b38 Mon Sep 17 00:00:00 2001 From: Thomas Chazot Date: Thu, 7 Dec 2023 12:57:58 +0100 Subject: [PATCH 05/20] =?UTF-8?q?d=C3=A9but=20tuto2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/Components/TutorialGraph.tsx | 26 ++-- cryptide_project/src/Pages/Tutorial.tsx | 127 +++++------------- 2 files changed, 44 insertions(+), 109 deletions(-) diff --git a/cryptide_project/src/Components/TutorialGraph.tsx b/cryptide_project/src/Components/TutorialGraph.tsx index d8de1b3..74cf44f 100644 --- a/cryptide_project/src/Components/TutorialGraph.tsx +++ b/cryptide_project/src/Components/TutorialGraph.tsx @@ -24,26 +24,16 @@ import {basePath} from "../AdressSetup" import PersonNetwork from "../model/PersonsNetwork"; interface TutorialGraphProps { - onNodeClick: (shouldShowChoiceBar: boolean) => void; - handleShowTurnBar: (shouldShowTurnBar: boolean) => void - handleTurnBarTextChange: (newTurnBarText: string) => void - setPlayerTouched: (newPlayerTouch: number) => void; - playerTouched: number - changecptTour: (newcptTour : number) => void - addToHistory: (message : string) => void - solo : boolean - isDaily : boolean - isEasy: boolean setNetwork: (network: Network) => void showLast: boolean - setNetworkEnigme: (networkEnigme: Map[]>) => void - askedWrong: boolean - setAskedWrong: (askedWrong: boolean) => void setPlayerIndex: (playerIndex: number) => void - importToPdf: boolean - setImportToPdf: (imp: boolean) => void - importToJSON: boolean - setImportToJSON: (imp: boolean) => void + handleShowTurnBar: (bool: boolean) => void + handleTurnBarTextChange: (text: string) => void + addToHistory: (text: string) => void + setPlayerTouched: (playerIndex: number) => void + playerTouched: number + tutoStep: number + setTutoStep: (step: number) => void } let lastNodes: NodePerson[] = [] @@ -51,7 +41,7 @@ let firstIndex = true -const TutorialGraph: React.FC = ({onNodeClick, handleShowTurnBar, handleTurnBarTextChange, playerTouched, setPlayerTouched, changecptTour, solo, isDaily, isEasy, addToHistory, showLast, setNetwork, setNetworkEnigme, setPlayerIndex, askedWrong, setAskedWrong, importToPdf, setImportToPdf, importToJSON, setImportToJSON}) => { +const TutorialGraph: React.FC = ({showLast, setNetwork, setPlayerIndex, handleShowTurnBar, handleTurnBarTextChange, addToHistory, setPlayerTouched, playerTouched, tutoStep, setTutoStep}) => { let cptTour: number = 0 //* Gestion du temps : diff --git a/cryptide_project/src/Pages/Tutorial.tsx b/cryptide_project/src/Pages/Tutorial.tsx index 34e6073..79e5eba 100644 --- a/cryptide_project/src/Pages/Tutorial.tsx +++ b/cryptide_project/src/Pages/Tutorial.tsx @@ -18,6 +18,8 @@ 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 JSZip from 'jszip'; /* nav */ @@ -39,18 +41,22 @@ 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'; 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 params = new URLSearchParams(window.location.search); const navigationType = useNavigationType() cptNavigation++ @@ -61,32 +67,17 @@ const Tutorial = ({locale, changeLocale}) => { } } - //* Gestion solo - let IsSolo: boolean = true - const solotmp = params.get('solo'); - if (solotmp == "false"){ - IsSolo=false - } - - //* Gestion daily - let isDaily: boolean = true - const isDailytmp = params.get('daily'); - if (isDailytmp == "false"){ - isDaily=false - } - - - let isEasy: boolean = true - const isEasytmp = params.get('easy'); - if (isEasytmp == "false"){ - isEasy=false - } //* 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) @@ -117,8 +108,14 @@ const Tutorial = ({locale, changeLocale}) => { } }, [history]); + useEffect(() => { + if (user == null){ + return + } + setPlayersData([user, new EasyBot("Bot1", "Bot1", ImgBot), new EasyBot("Bot2", "Bot2", ImgBot)]) + }, []) + - const {personNetwork, person, indices} = useGame() const [showChoiceBar, setShowChoiceBar] = useState(false); const [showTurnBar, setShowTurnBar] = useState(false); @@ -159,46 +156,7 @@ const Tutorial = ({locale, changeLocale}) => { setPlayerIndex(playerIndex) } - const generateTEX = async () => { - if (network != null && personNetwork != null && person != null){ - - const zip = new JSZip(); - - if (isDaily && networkEnigme != null){ - const tex = generateLatexCodeEnigme(personNetwork, person, indices, network, networkEnigme) - const blob = new Blob([tex], { type: 'application/x-latex;charset=utf-8' }); - zip.file('socialGraph.tex', tex); - } - else{ - const tex = generateLatexCode(personNetwork, person, indices, network) - const blob = new Blob([tex], { type: 'application/x-latex;charset=utf-8' }); - zip.file('socialGraph.tex', tex); - } - - const imageNames = ['ballon-de-basket.png', 'ballon-de-foot.png', "baseball.png", "bowling.png", "tennis.png"]; // Liste des noms de fichiers d'images - const imagesFolder = 'Script'; - - for (const imageName of imageNames) { - const imageUrl = process.env.PUBLIC_URL + `/${imagesFolder}/${imageName}`; - const response = await fetch(imageUrl); - - if (response.ok) { - const imageBlob = await response.blob(); - zip.file(`${imageName}`, imageBlob); - } else { - console.error(`Erreur de chargement de l'image ${imageName}`); - } - } - - const content = await zip.generateAsync({ type: 'blob' }); - - // Enregistre l'archive en tant que fichier - saveAs(content, 'social_graph.zip'); - - // Utiliser FileSaver pour télécharger le fichier - } - } - + const resetGraph = () => { setisLoading(true); socket.emit("reset graph", socket.id) @@ -263,7 +221,6 @@ const Tutorial = ({locale, changeLocale}) => { const [SwitchEnabled, setSwitchEnabled] = useState(false) const allIndices = Stub.GenerateIndice() - const { indice, players, actualPlayerIndex} = useGame(); const nbPlayer = players.length; const navdeduc = 'deduc?actualId=' + actualPlayerIndex + '&nbPlayer=' + nbPlayer; @@ -272,36 +229,24 @@ const Tutorial = ({locale, changeLocale}) => {
{showTurnBar && }
- + setPlayerIndex={setPlayerIndexData}/>
- - {(!isDaily || (isDaily && isEasy)) && -
- {history.map((item, index) => ( -
{item}
- ))} -
- } +
+ {history.map((item, index) => ( +
{item}
+ ))} +
+
- {!IsSolo && } +
{/* @@ -394,11 +339,11 @@ const Tutorial = ({locale, changeLocale}) => { */} - { !IsSolo && -
- -
- } + +
+ +
+ Date: Thu, 7 Dec 2023 13:45:30 +0100 Subject: [PATCH 06/20] step 1 --- .../src/Components/TutorialGraph.tsx | 51 ++++++++++++++++--- 1 file changed, 45 insertions(+), 6 deletions(-) diff --git a/cryptide_project/src/Components/TutorialGraph.tsx b/cryptide_project/src/Components/TutorialGraph.tsx index 74cf44f..e2602c3 100644 --- a/cryptide_project/src/Components/TutorialGraph.tsx +++ b/cryptide_project/src/Components/TutorialGraph.tsx @@ -38,6 +38,10 @@ interface TutorialGraphProps { let lastNodes: NodePerson[] = [] let firstIndex = true +let first = true +let touchedPlayer = -1 +let stepTuto = -1 + @@ -48,16 +52,23 @@ const TutorialGraph: React.FC = ({showLast, setNetwork, setP let initMtn = 0 const {isLoggedIn, user, manager} = useAuth(); - const {setIndiceData} = useGame(); + const {setIndiceData, setActualPlayerIndexData} = useGame(); const params = new URLSearchParams(window.location.search); const navigate = useNavigate(); const [lastIndex, setLastIndex] = useState(-1) - /* + + if (first){ + first = false + setActualPlayerIndexData(0) + handleTurnBarTextChange("C'est à vous de jouer !") + handleShowTurnBar(true) + } + useEffect(() =>{ touchedPlayer=playerTouched - console.log(playerTouched) + /* if (touchedPlayer == -1){ if (!askedWrongLocal){ socket.emit("put correct background", socket.id) @@ -72,9 +83,13 @@ const TutorialGraph: React.FC = ({showLast, setNetwork, setP else if(touchedPlayer == players.length){ socket.emit("put imossible grey", socket.id) } + */ }, [playerTouched]) - */ + useEffect(() => { + stepTuto = tutoStep + }, [tutoStep]) + useEffect(() => { const tab: NodePerson[] = [] @@ -108,13 +123,15 @@ const TutorialGraph: React.FC = ({showLast, setNetwork, setP const personNetwork = JSONParser.JSONToNetwork(JSON.stringify(jsonGraph)) const indices = JSONParser.JSONToIndices(jsonIndice) + console.log(indices) + setIndiceData(indices[0]) if (personNetwork == null){ return } const graph = GraphCreator.CreateGraph(personNetwork) - const nodes = graph.nodesPerson; + const nodes = new DataSet(graph.nodesPerson); let n = graph.nodesPerson; @@ -162,6 +179,11 @@ const TutorialGraph: React.FC = ({showLast, setNetwork, setP network.stabilize(); setNetwork(network) + network.on("click", async (params) => { + + if(params.nodes.length > 0){ + } + }); network.on("dragging", (params) => { if (params.nodes.length > 0) { @@ -170,7 +192,24 @@ const TutorialGraph: React.FC = ({showLast, setNetwork, setP network.setOptions(initialOptions); setNetwork(network) } - }); + }); + + network.on("click", async (params) => { + if(params.nodes.length > 0){ + if (stepTuto === 0 && touchedPlayer === 1){ + const node = nodes.get().find((n: NodePerson) => n.id === params.nodes[0]) + const pers = personNetwork.getPersons().find((p) => p.getId() === node?.id) + if (node !== undefined && pers !== undefined && pers.getName() === "Violet"){ + networkData.nodes.update({id: params.nodes[0], label: node.label + positionToEmoji(1, true)}) + setTutoStep(1) + } + } + } + else{ + setPlayerTouched(-1) + } + }); + }, []); // Le tableau vide signifie que cela ne s'exécutera qu'une fois après le premier rendu From 98338431b56a9c0ba65162d2cfaf5bbec5c64918 Mon Sep 17 00:00:00 2001 From: Pierre Ferreira Date: Thu, 7 Dec 2023 13:51:11 +0100 Subject: [PATCH 07/20] affichage de carte dans un modal pour le debut du tuto :zap: --- cryptide_project/src/Pages/Tutorial.tsx | 204 +++++++++--------- .../src/res/img/tuto/tuto-ava.png | Bin 0 -> 10668 bytes 2 files changed, 106 insertions(+), 98 deletions(-) create mode 100644 cryptide_project/src/res/img/tuto/tuto-ava.png diff --git a/cryptide_project/src/Pages/Tutorial.tsx b/cryptide_project/src/Pages/Tutorial.tsx index 34e6073..f25f4f9 100644 --- a/cryptide_project/src/Pages/Tutorial.tsx +++ b/cryptide_project/src/Pages/Tutorial.tsx @@ -18,19 +18,19 @@ 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 JSZip from 'jszip'; +import ava from "../res/img/tuto/tuto-ava.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 { HiLanguage } from 'react-icons/hi2'; -import { Nav, NavDropdown, Spinner } from 'react-bootstrap'; -import { FormattedMessage } from 'react-intl'; import { useGame } from '../Contexts/GameContext'; import { socket } from '../SocketConfig'; import { Network } from 'vis-network'; @@ -39,6 +39,7 @@ import Pair from '../model/Pair'; import Indice from '../model/Indices/Indice'; import {basePath} from "../AdressSetup" import TutorialGraph from '../Components/TutorialGraph'; +import JSZip from 'jszip'; let cptNavigation = 0 @@ -268,6 +269,15 @@ const Tutorial = ({locale, changeLocale}) => { const nbPlayer = players.length; const navdeduc = 'deduc?actualId=' + actualPlayerIndex + '&nbPlayer=' + nbPlayer; + + + //* gestion demo */ + const [showM, setShowM] = useState(false); + + const handleCloseM = () => setShowM(false); + const handleShowM = () => setShowM(true); + + const [step, setStep] = useState(0); return (
{showTurnBar && } @@ -303,47 +313,10 @@ const Tutorial = ({locale, changeLocale}) => {
} -
- -
- - -
-
- -
- - - - - {/* - //? redirection impossible apparament (securité des navigateur - */} + - - - - }
-{/* - - - Joueurs -

Il y a {players.length} joueurs

-
- - - -
- */} - { !IsSolo &&
@@ -410,42 +360,100 @@ const Tutorial = ({locale, changeLocale}) => { Indice - {/* Possède les cheveux noir ou joue au basket */} {indice?.ToString(locale)} + - { - //* canva pour les paramètres - } - - - param Paramètres - - - - - - - + + + + + Tutoriel 1 + + + + {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 + + 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 === 2 && ( + + + + L'historique + + 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 != 0 && ()} + + +
+
); }; diff --git a/cryptide_project/src/res/img/tuto/tuto-ava.png b/cryptide_project/src/res/img/tuto/tuto-ava.png new file mode 100644 index 0000000000000000000000000000000000000000..2ca4ec21f6b03cdf4b5488d1adc919c13cfaa53b GIT binary patch literal 10668 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 H0tfy-`Hi9& literal 0 HcmV?d00001 From 14b2bb398cb27188edff05a15eda609c176e8879 Mon Sep 17 00:00:00 2001 From: Thomas Chazot Date: Thu, 7 Dec 2023 14:54:42 +0100 Subject: [PATCH 08/20] fin code du tuto manque juste partie pif --- .../src/Components/GraphContainer.tsx | 24 +++++ .../src/Components/PlayerList.tsx | 4 +- .../src/Components/TutorialGraph.tsx | 90 ++++++++++++++++++- cryptide_project/src/Pages/InGame.tsx | 2 +- cryptide_project/src/Pages/Tutorial.tsx | 10 ++- 5 files changed, 122 insertions(+), 8 deletions(-) diff --git a/cryptide_project/src/Components/GraphContainer.tsx b/cryptide_project/src/Components/GraphContainer.tsx index fe8bf5b..8401c1d 100644 --- a/cryptide_project/src/Components/GraphContainer.tsx +++ b/cryptide_project/src/Components/GraphContainer.tsx @@ -709,6 +709,30 @@ const MyGraphComponent: React.FC = ({onNodeClick, handleS } } } + + + const putCorrectBackground = () => { + if (personNetwork != null){ + for(const person of personNetwork.getPersons()){ + networkData.nodes.update({id: person.getId(), color: ColorToHexa(person.getColor())}) + } + } + }; + +/* + const putGreyBackgroud = () => { + if (stepTuto === 3){ + const tabGrey = [0, 1, 2, 3, 5, 6, 7, 8, 9] + for (const i of tabGrey){ + nodes.update({id: i, color: "#808080"}) + } + console.log("CA MARCHE") + } + }; +*/ + + + //setGreyForEveryone(() => myFunctionInsideEffect); socket.on("put correct background", () =>{ diff --git a/cryptide_project/src/Components/PlayerList.tsx b/cryptide_project/src/Components/PlayerList.tsx index 856d73d..6b44f8f 100644 --- a/cryptide_project/src/Components/PlayerList.tsx +++ b/cryptide_project/src/Components/PlayerList.tsx @@ -16,13 +16,15 @@ interface PlayerListProps { setPlayerTouched: (newPlayerTouch: number) => void; playerIndex: number askedWrong: boolean + greyForEveryone: () => void } -const PlayerList: React.FC = ({ players, playerTouched, setPlayerTouched, playerIndex, askedWrong}) => { +const PlayerList: React.FC = ({ players, playerTouched, setPlayerTouched, playerIndex, askedWrong, greyForEveryone}) => { const theme = useTheme(); function askEveryone(){ if (!askedWrong){ + greyForEveryone() setPlayerTouched(players.length) } } diff --git a/cryptide_project/src/Components/TutorialGraph.tsx b/cryptide_project/src/Components/TutorialGraph.tsx index e2602c3..834cb94 100644 --- a/cryptide_project/src/Components/TutorialGraph.tsx +++ b/cryptide_project/src/Components/TutorialGraph.tsx @@ -34,6 +34,7 @@ interface TutorialGraphProps { playerTouched: number tutoStep: number setTutoStep: (step: number) => void + setGreyForEveryone: (func: () => void) => void } let lastNodes: NodePerson[] = [] @@ -45,7 +46,7 @@ let stepTuto = -1 -const TutorialGraph: React.FC = ({showLast, setNetwork, setPlayerIndex, handleShowTurnBar, handleTurnBarTextChange, addToHistory, setPlayerTouched, playerTouched, tutoStep, setTutoStep}) => { +const TutorialGraph: React.FC = ({showLast, setNetwork, setPlayerIndex, handleShowTurnBar, handleTurnBarTextChange, addToHistory, setPlayerTouched, playerTouched, tutoStep, setTutoStep, setGreyForEveryone}) => { let cptTour: number = 0 //* Gestion du temps : @@ -88,6 +89,9 @@ const TutorialGraph: React.FC = ({showLast, setNetwork, setP useEffect(() => { stepTuto = tutoStep + if(stepTuto===1){ + handleShowTurnBar(true) + } }, [tutoStep]) @@ -124,6 +128,7 @@ const TutorialGraph: React.FC = ({showLast, setNetwork, setP const indices = JSONParser.JSONToIndices(jsonIndice) console.log(indices) + console.log(personNetwork.getPersons()) setIndiceData(indices[0]) if (personNetwork == null){ @@ -134,6 +139,7 @@ const TutorialGraph: React.FC = ({showLast, setNetwork, setP const nodes = new DataSet(graph.nodesPerson); + let n = graph.nodesPerson; let e = graph.edges; const graphState = { n, e }; @@ -179,6 +185,19 @@ const TutorialGraph: React.FC = ({showLast, setNetwork, setP network.stabilize(); setNetwork(network) + const myFunctionInsideEffect = () => { + if (stepTuto === 3){ + const tabGrey = [0, 1, 2, 3, 5, 6, 7, 8, 9] + for (const i of tabGrey){ + nodes.update({id: i, color: "#808080"}) + } + console.log("CA MARCHE") + } + }; + + setGreyForEveryone(() => myFunctionInsideEffect); + + network.on("click", async (params) => { if(params.nodes.length > 0){ @@ -198,12 +217,75 @@ const TutorialGraph: React.FC = ({showLast, setNetwork, setP if(params.nodes.length > 0){ if (stepTuto === 0 && touchedPlayer === 1){ const node = nodes.get().find((n: NodePerson) => n.id === params.nodes[0]) - const pers = personNetwork.getPersons().find((p) => p.getId() === node?.id) - if (node !== undefined && pers !== undefined && pers.getName() === "Violet"){ - networkData.nodes.update({id: params.nodes[0], label: node.label + positionToEmoji(1, true)}) + if (node.id === 7){ + nodes.update({id: node.id, label: node.label + positionToEmoji(1, true)}) + handleShowTurnBar(false) + setPlayerIndex(1) + await delay(500) + const node2 = nodes.get().find((n: NodePerson) => n.id === params.nodes[0]) + nodes.update({id: node.id, label: node2.label + positionToEmoji(2, false)}) + await delay(500) + const node3 = nodes.get().find((n: NodePerson) => n.id === 8) + nodes.update({id: node3.id, label: node3.label + positionToEmoji(1, false)}) + setPlayerIndex(2) + await delay(500) + const node4 = nodes.get().find((n: NodePerson) => n.id === 0) + nodes.update({id: node4.id, label: node4.label + positionToEmoji(1, true)}) + setPlayerIndex(0) setTutoStep(1) } } + else if(stepTuto === 1 && touchedPlayer === 2){ + const node = nodes.get().find((n: NodePerson) => n.id === params.nodes[0]) + if (node.id === 0){ + nodes.update({id: node.id, label: node.label + positionToEmoji(2, false)}) + handleTurnBarTextChange("Mauvais choix, posez un carré !") + const tabGrey = [7, 0, 4, 1, 8] + for (const id of tabGrey){ + const node = nodes.get().find((n: NodePerson) => n.id === id) + nodes.update({id: node.id, color: "#808080"}) + } + setTutoStep(2) + } + } + else if(stepTuto === 2){ + const node = nodes.get().find((n: NodePerson) => n.id === params.nodes[0]) + if (node.id === 9){ + const tabColor = [7, 0, 4, 1, 8] + nodes.update({id: node.id, label: node.label + positionToEmoji(0, false)}) + for(const id of tabColor){ + const pers = personNetwork.getPersons().find((p: Person) => p.getId() === id) + if (pers !== undefined){ + nodes.update({id: id, color: ColorToHexa(pers.getColor())}) + } + } + handleShowTurnBar(false) + setPlayerIndex(1) + await delay(500) + const node2 = nodes.get().find((n: NodePerson) => n.id === 4) + nodes.update({id: node2.id, label: node2.label + positionToEmoji(2, true)}) + setPlayerIndex(2) + await delay(500) + const node3 = nodes.get().find((n: NodePerson) => n.id === 3) + nodes.update({id: node3.id, label: node3.label + positionToEmoji(0, false)}) + await delay(500) + const node4 = nodes.get().find((n: NodePerson) => n.id === 1) + nodes.update({id: node4.id, label: node4.label + positionToEmoji(2, false)}) + setPlayerIndex(0) + handleTurnBarTextChange("A vous de jouer !") + handleShowTurnBar(true) + setTutoStep(3) + } + } + else if(stepTuto === 3 && touchedPlayer === 3){ + const node = nodes.get().find((n: NodePerson) => n.id === params.nodes[0]) + if (node.id === 4){ + nodes.update({id: node.id, label: node.label + positionToEmoji(0, true)}) + await delay(500) + const node2 = nodes.get().find((n: NodePerson) => n.id === 4) + nodes.update({id: node2.id, label: node2.label + positionToEmoji(1, true)}) + } + } } else{ setPlayerTouched(-1) diff --git a/cryptide_project/src/Pages/InGame.tsx b/cryptide_project/src/Pages/InGame.tsx index 4acfc2f..d9c07a4 100644 --- a/cryptide_project/src/Pages/InGame.tsx +++ b/cryptide_project/src/Pages/InGame.tsx @@ -449,7 +449,7 @@ const InGame = ({locale, changeLocale}) => { { !IsSolo &&
- + {}}/>
} diff --git a/cryptide_project/src/Pages/Tutorial.tsx b/cryptide_project/src/Pages/Tutorial.tsx index 79e5eba..b7baaf0 100644 --- a/cryptide_project/src/Pages/Tutorial.tsx +++ b/cryptide_project/src/Pages/Tutorial.tsx @@ -57,6 +57,11 @@ const Tutorial = ({locale, changeLocale}) => { const navigate = useNavigate() + const [greyForEveryone, setGreyForEveryone] = useState<() => void>(() => {}); + + const setGreyForEveryoneData = (func: () => void) => { + setGreyForEveryone(func) + } const navigationType = useNavigationType() cptNavigation++ @@ -238,7 +243,8 @@ const Tutorial = ({locale, changeLocale}) => { playerTouched={playerTouched} setNetwork={setNetworkData} showLast={showLast} - setPlayerIndex={setPlayerIndexData}/> + setPlayerIndex={setPlayerIndexData} + setGreyForEveryone={setGreyForEveryoneData}/>
@@ -341,7 +347,7 @@ const Tutorial = ({locale, changeLocale}) => {
- +
From b258d84bff1fbc7e04c42dc40dbe90ec9f48ea8b Mon Sep 17 00:00:00 2001 From: Pierre Ferreira Date: Thu, 7 Dec 2023 14:55:36 +0100 Subject: [PATCH 09/20] =?UTF-8?q?impl=C3=A9mentation=20de=20la=20premi?= =?UTF-8?q?=C3=A8re=20partie=20du=20tuto=20:memo:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cryptide_project/src/Pages/Tutorial.tsx | 131 ++++++++++++------ .../src/res/img/tuto/tuto-indice.png | Bin 0 -> 3782 bytes .../src/res/img/tuto/tuto-info.png | Bin 0 -> 3737 bytes .../src/res/img/tuto/tuto-joueurs.png | Bin 0 -> 22082 bytes .../src/res/img/tuto/tuto-tada.png | Bin 0 -> 42501 bytes cryptide_project/src/res/img/tuto/tuto2-1.png | Bin 0 -> 15884 bytes 6 files changed, 92 insertions(+), 39 deletions(-) create mode 100644 cryptide_project/src/res/img/tuto/tuto-indice.png create mode 100644 cryptide_project/src/res/img/tuto/tuto-info.png create mode 100644 cryptide_project/src/res/img/tuto/tuto-joueurs.png create mode 100644 cryptide_project/src/res/img/tuto/tuto-tada.png create mode 100644 cryptide_project/src/res/img/tuto/tuto2-1.png diff --git a/cryptide_project/src/Pages/Tutorial.tsx b/cryptide_project/src/Pages/Tutorial.tsx index 308f6a6..64704d5 100644 --- a/cryptide_project/src/Pages/Tutorial.tsx +++ b/cryptide_project/src/Pages/Tutorial.tsx @@ -21,7 +21,10 @@ 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"; /* nav */ import { Link, Navigate, useNavigate, useNavigationType } from 'react-router-dom'; @@ -229,11 +232,20 @@ const Tutorial = ({locale, changeLocale}) => { //* gestion demo */ const [showM, setShowM] = useState(false); + const [showTuto2, setShowTuto2] = useState(false); - const handleCloseM = () => setShowM(false); + const handleCloseM = () => { + setShowM(false); + setTuto1disable(false); + } const handleShowM = () => setShowM(true); + const handleCloseTuto2 = () => setShowTuto2(false); + const handleShowTuto2 = () => setShowTuto2(true); + const [step, setStep] = useState(0); + + const [tuto1disable, setTuto1disable] = useState(true); return (
{showTurnBar && } @@ -255,24 +267,14 @@ const Tutorial = ({locale, changeLocale}) => {
{item}
))}
- - -
- -
-
+
-{/* - - - Joueurs -

Il y a {players.length} joueurs

-
- - - -
- */} -
@@ -342,10 +331,9 @@ const Tutorial = ({locale, changeLocale}) => { show={showM} onHide={handleCloseM} backdrop="static" - keyboard={false} - > - - Tutoriel 1 + keyboard={false}> + + Tutoriel @@ -365,13 +353,13 @@ const Tutorial = ({locale, changeLocale}) => { {step === 1 && ( - + Les Joueurs - 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. + 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.
- 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 + 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.
@@ -393,7 +381,15 @@ const Tutorial = ({locale, changeLocale}) => { {step === 3 && ( - + + + Les règle du jeu @@ -405,7 +401,15 @@ const Tutorial = ({locale, changeLocale}) => { {step === 4 && ( - + + + L'indice @@ -414,13 +418,62 @@ const Tutorial = ({locale, changeLocale}) => { )} + + {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. +
+
+
+ +
+ +
diff --git a/cryptide_project/src/res/img/tuto/tuto-indice.png b/cryptide_project/src/res/img/tuto/tuto-indice.png new file mode 100644 index 0000000000000000000000000000000000000000..60e93af06faa49f8a8bef896d8b3f65a053bea27 GIT binary patch literal 3782 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 Kc%|;WsQ&==xkGmV literal 0 HcmV?d00001 diff --git a/cryptide_project/src/res/img/tuto/tuto-info.png b/cryptide_project/src/res/img/tuto/tuto-info.png new file mode 100644 index 0000000000000000000000000000000000000000..5bee543b750ba4d07c29e75bd959494a935d2b95 GIT binary patch literal 3737 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 literal 0 HcmV?d00001 diff --git a/cryptide_project/src/res/img/tuto/tuto-joueurs.png b/cryptide_project/src/res/img/tuto/tuto-joueurs.png new file mode 100644 index 0000000000000000000000000000000000000000..74450df79c529dc4622241af0b69e726ba552bd2 GIT binary patch literal 22082 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 UC&O~U-d8epq_)aCWmMR|0C@JAMF0Q* literal 0 HcmV?d00001 diff --git a/cryptide_project/src/res/img/tuto/tuto-tada.png b/cryptide_project/src/res/img/tuto/tuto-tada.png new file mode 100644 index 0000000000000000000000000000000000000000..c9e2f9b87638f6090362aa751e1a98dd9232b57b GIT binary patch literal 42501 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 literal 0 HcmV?d00001 diff --git a/cryptide_project/src/res/img/tuto/tuto2-1.png b/cryptide_project/src/res/img/tuto/tuto2-1.png new file mode 100644 index 0000000000000000000000000000000000000000..e62f1855e8e93bfcfe42286500e2a9486f88133d GIT binary patch literal 15884 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 literal 0 HcmV?d00001 From 5bbb61080a4359f2830a1ab9de14727a5d7510cc Mon Sep 17 00:00:00 2001 From: Thomas Chazot Date: Thu, 7 Dec 2023 15:44:46 +0100 Subject: [PATCH 10/20] fin du code du tuto :) <3 --- .../src/Components/GraphContainer.tsx | 77 ++++++++----------- .../src/Components/TutorialGraph.tsx | 40 +++++----- cryptide_project/src/Pages/InGame.tsx | 25 +++++- cryptide_project/src/Pages/Lobby.tsx | 4 +- 4 files changed, 74 insertions(+), 72 deletions(-) diff --git a/cryptide_project/src/Components/GraphContainer.tsx b/cryptide_project/src/Components/GraphContainer.tsx index 8401c1d..2d02525 100644 --- a/cryptide_project/src/Components/GraphContainer.tsx +++ b/cryptide_project/src/Components/GraphContainer.tsx @@ -43,6 +43,13 @@ interface MyGraphComponentProps { setImportToPdf: (imp: boolean) => void importToJSON: boolean setImportToJSON: (imp: boolean) => void + + setPutCorrectBackground : (func: () => void) => void + setPutGreyBackground : (func: () => void) => void + setPutImposssibleGrey : (func: () => void) => void + putGreyBackground : () => void + putCorrectBackground : () => void + putImposssibleGrey : () => void } let lastAskingPlayer = 0 @@ -72,7 +79,7 @@ let testPlayers: Player[] = [] -const MyGraphComponent: React.FC = ({onNodeClick, handleShowTurnBar, handleTurnBarTextChange, playerTouched, setPlayerTouched, changecptTour, solo, isDaily, isEasy, addToHistory, showLast, setNetwork, setNetworkEnigme, setPlayerIndex, askedWrong, setAskedWrong, importToPdf, setImportToPdf, importToJSON, setImportToJSON}) => { +const MyGraphComponent: React.FC = ({onNodeClick, handleShowTurnBar, handleTurnBarTextChange, playerTouched, setPlayerTouched, changecptTour, solo, isDaily, isEasy, addToHistory, showLast, setNetwork, setNetworkEnigme, setPlayerIndex, askedWrong, setAskedWrong, importToPdf, setImportToPdf, importToJSON, setImportToJSON, setPutCorrectBackground, setPutGreyBackground, setPutImposssibleGrey, putCorrectBackground, putGreyBackground, putImposssibleGrey}) => { let cptTour: number = 0 //* Gestion du temps : @@ -121,17 +128,17 @@ const MyGraphComponent: React.FC = ({onNodeClick, handleS console.log(playerTouched) if (touchedPlayer == -1){ if (!askedWrongLocal){ - socket.emit("put correct background", socket.id) + putCorrectBackground() } } else if (touchedPlayer < players.length && touchedPlayer>=0){ if(!askedWrongLocal){ - socket.emit("put correct background", socket.id) - socket.emit("put grey background", socket.id, touchedPlayer) + putCorrectBackground() + putGreyBackground() } } else if(touchedPlayer == players.length){ - socket.emit("put imossible grey", socket.id) + putImposssibleGrey() } }, [playerTouched]) @@ -625,7 +632,8 @@ const MyGraphComponent: React.FC = ({onNodeClick, handleS askedWrongBot=true handleShowTurnBar(true) handleTurnBarTextChange("Mauvais choix, posez un carré !") - socket.emit("put grey background", socket.id, actualPlayerIndex) + touchedPlayer = actualPlayerIndex + putGreyBackgroud() } else{ socket.emit("can't put square", actualPlayerIndex, room) @@ -650,7 +658,7 @@ const MyGraphComponent: React.FC = ({onNodeClick, handleS } else{ handleShowTurnBar(false) - socket.emit("put correct background", socket.id) + putCorrectBackground() } } }) @@ -719,32 +727,12 @@ const MyGraphComponent: React.FC = ({onNodeClick, handleS } }; -/* - const putGreyBackgroud = () => { - if (stepTuto === 3){ - const tabGrey = [0, 1, 2, 3, 5, 6, 7, 8, 9] - for (const i of tabGrey){ - nodes.update({id: i, color: "#808080"}) - } - console.log("CA MARCHE") - } - }; -*/ - - - //setGreyForEveryone(() => myFunctionInsideEffect); - - socket.on("put correct background", () =>{ - if (personNetwork != null){ - for(const person of personNetwork.getPersons()){ - networkData.nodes.update({id: person.getId(), color: ColorToHexa(person.getColor())}) - } - } - }) + setPutCorrectBackground(() => putCorrectBackground) - socket.on("put grey background", (player) =>{ + const putGreyBackgroud = () => { if (personNetwork != null){ + const player = touchedPlayer const tab = mapIndexPersons.get(player) if (tab != undefined){ if (player != actualPlayerIndex){ @@ -772,9 +760,11 @@ const MyGraphComponent: React.FC = ({onNodeClick, handleS } } } - }) + }; + + setPutGreyBackground(() => putGreyBackgroud) - socket.on("put imossible grey", ()=>{ + const putGreyImpossible = () => { if (personNetwork != null && indice!=null){ const tabNodes: any = [] const tester = IndiceTesterFactory.Create(indice) @@ -795,7 +785,9 @@ const MyGraphComponent: React.FC = ({onNodeClick, handleS networkData.nodes.update({id: n.id, color: "#808080"}) } } - }) + } + + setPutImposssibleGrey(() => putGreyImpossible) socket.on("end game", (winnerIndex) =>{ if (cptEndgame % 2 == 0){ @@ -851,9 +843,6 @@ const MyGraphComponent: React.FC = ({onNodeClick, handleS socket.off("already asked") socket.off("asked wrong") socket.off("asked") - socket.off("put correct background") - socket.off("put grey background") - socket.off("put imossible grey") socket.off("who plays") navigate(`${basePath}/endgame`) @@ -915,7 +904,7 @@ const MyGraphComponent: React.FC = ({onNodeClick, handleS playerIndex = 0 } socket.emit("node checked", params.nodes[0], false, actualPlayerIndex, room, playerIndex) - socket.emit("put correct background", socket.id) + putCorrectBackground() touchedPlayer=-1 askedPersons.push(person) askedWrongLocal=false @@ -953,7 +942,7 @@ const MyGraphComponent: React.FC = ({onNodeClick, handleS console.log("CE N'EST PAS UN BOT") //@ts-ignore socket.emit("ask player", params.nodes[0], players[touchedPlayer].id, players.find((p) => p.id === socket.id, actualPlayerIndex)) - socket.emit("put correct background", socket.id) + putCorrectBackground() touchedPlayer=-1 setPlayerTouched(-1) } @@ -987,14 +976,14 @@ const MyGraphComponent: React.FC = ({onNodeClick, handleS } if(!works){ socket.emit("node checked", params.nodes[0], works, playerIndex, room, actualPlayerIndex) - socket.emit("put correct background", socket.id) + putCorrectBackground() socket.emit("asked wrong", players[actualPlayerIndex]) touchedPlayer=-1 setPlayerTouched(-1) return } if (i == players.length - 1){ - socket.emit("put correct background", socket.id) + putCorrectBackground() await delay(1000) socket.emit("end game", actualPlayerIndex, room) return @@ -1004,7 +993,7 @@ const MyGraphComponent: React.FC = ({onNodeClick, handleS } touchedPlayer=-1 setPlayerTouched(-1) - socket.emit("put correct background", socket.id) + putCorrectBackground() await delay(1000) socket.emit("end game", actualPlayerIndex, room) } @@ -1099,12 +1088,6 @@ const MyGraphComponent: React.FC = ({onNodeClick, handleS function delay(ms: number): Promise { return new Promise(resolve => setTimeout(resolve, ms)); } - - function putGreyBackgroud(index: number){ - /* - - */ - } } diff --git a/cryptide_project/src/Components/TutorialGraph.tsx b/cryptide_project/src/Components/TutorialGraph.tsx index 834cb94..f84f10e 100644 --- a/cryptide_project/src/Components/TutorialGraph.tsx +++ b/cryptide_project/src/Components/TutorialGraph.tsx @@ -53,7 +53,7 @@ const TutorialGraph: React.FC = ({showLast, setNetwork, setP let initMtn = 0 const {isLoggedIn, user, manager} = useAuth(); - const {setIndiceData, setActualPlayerIndexData} = useGame(); + const {setIndiceData, setIndicesData, setActualPlayerIndexData, setWinnerData, setPlayersData, setNetworkDataData, setPersonData} = useGame(); const params = new URLSearchParams(window.location.search); const navigate = useNavigate(); @@ -69,22 +69,6 @@ const TutorialGraph: React.FC = ({showLast, setNetwork, setP useEffect(() =>{ touchedPlayer=playerTouched - /* - if (touchedPlayer == -1){ - if (!askedWrongLocal){ - socket.emit("put correct background", socket.id) - } - } - else if (touchedPlayer < players.length && touchedPlayer>=0){ - if(!askedWrongLocal){ - socket.emit("put correct background", socket.id) - socket.emit("put grey background", socket.id, touchedPlayer) - } - } - else if(touchedPlayer == players.length){ - socket.emit("put imossible grey", socket.id) - } - */ }, [playerTouched]) useEffect(() => { @@ -127,9 +111,6 @@ const TutorialGraph: React.FC = ({showLast, setNetwork, setP const personNetwork = JSONParser.JSONToNetwork(JSON.stringify(jsonGraph)) const indices = JSONParser.JSONToIndices(jsonIndice) - console.log(indices) - console.log(personNetwork.getPersons()) - setIndiceData(indices[0]) if (personNetwork == null){ return @@ -138,7 +119,8 @@ const TutorialGraph: React.FC = ({showLast, setNetwork, setP const nodes = new DataSet(graph.nodesPerson); - + setIndicesData(indices) + setPersonData(personNetwork.getPersons()[4]) let n = graph.nodesPerson; let e = graph.edges; @@ -191,7 +173,6 @@ const TutorialGraph: React.FC = ({showLast, setNetwork, setP for (const i of tabGrey){ nodes.update({id: i, color: "#808080"}) } - console.log("CA MARCHE") } }; @@ -284,6 +265,21 @@ const TutorialGraph: React.FC = ({showLast, setNetwork, setP await delay(500) const node2 = nodes.get().find((n: NodePerson) => n.id === 4) nodes.update({id: node2.id, label: node2.label + positionToEmoji(1, true)}) + await delay(500) + + for(const person of personNetwork.getPersons()){ + nodes.update({id: person.getId(), color: ColorToHexa(person.getColor())}) + } + if (user != null){ + const winner = user; + setNetworkDataData(networkData) + setActualPlayerIndexData(-1) + setLastIndex(-1) + setPlayerTouched(-1) + setWinnerData(winner) + first = true + navigate(`${basePath}/endgame`) + } } } } diff --git a/cryptide_project/src/Pages/InGame.tsx b/cryptide_project/src/Pages/InGame.tsx index d9c07a4..65314a4 100644 --- a/cryptide_project/src/Pages/InGame.tsx +++ b/cryptide_project/src/Pages/InGame.tsx @@ -99,6 +99,23 @@ const InGame = ({locale, changeLocale}) => { const [importToPdf, setImportToPdf] = useState(false) const [importToJSON, setImportToJSON] = useState(false) + const [putCorrectBackground, setPutCorrectBackground] = useState<() => void>(() => {}); + const [putGreyBackgroud, setPutGreyBackground] = useState<() => void>(() => {}); + const [putImposssibleGrey, setPutImposssibleGrey] = useState<() => void>(() => {}); + + + const setPutCorrectBackgroundData = (func: () => void) => { + setPutCorrectBackground(func) + } + + const setPutGreyBackgroundData = (func: () => void) => { + setPutGreyBackground(func) + } + + const setPutImposssibleGreyData = (func: () => void) => { + setPutImposssibleGrey(func) + } + const setImportToJSONData = (imp: boolean) => { setImportToJSON(imp) } @@ -313,7 +330,13 @@ const InGame = ({locale, changeLocale}) => { importToPdf={importToPdf} setImportToPdf={setImportToPdfData} importToJSON={importToJSON} - setImportToJSON={setImportToJSONData}/> + setImportToJSON={setImportToJSONData} + setPutCorrectBackground={setPutCorrectBackgroundData} + setPutGreyBackground={setPutGreyBackgroundData} + setPutImposssibleGrey={setPutImposssibleGreyData} + putCorrectBackground={putCorrectBackground} + putGreyBackground={putGreyBackgroud} + putImposssibleGrey={putImposssibleGrey}/>

diff --git a/cryptide_project/src/Pages/Lobby.tsx b/cryptide_project/src/Pages/Lobby.tsx index 64dc6c6..3070545 100644 --- a/cryptide_project/src/Pages/Lobby.tsx +++ b/cryptide_project/src/Pages/Lobby.tsx @@ -70,7 +70,7 @@ function Lobby() { } //* nb Node - const [enteredNumber, setEnteredNumber] = useState(20); + const [enteredNumber, setEnteredNumber] = useState(25); //@ts-ignore const handleNumberChange = (event) => { @@ -213,7 +213,7 @@ function Lobby() { function StartGame(){ - const [networkPerson, choosenPerson, choosenIndices] = GameCreator.CreateGame(players.length, 10) + const [networkPerson, choosenPerson, choosenIndices] = GameCreator.CreateGame(players.length, enteredNumber) setPersonData(choosenPerson) setPersonNetworkData(networkPerson) setIndicesData(choosenIndices) From b6582c8d16cfbf25424aa0815c83bb82b1a7dd7d Mon Sep 17 00:00:00 2001 From: Thomas Chazot Date: Thu, 7 Dec 2023 15:49:21 +0100 Subject: [PATCH 11/20] Wouhou tuto fini --- cryptide_project/src/Components/TutorialGraph.tsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cryptide_project/src/Components/TutorialGraph.tsx b/cryptide_project/src/Components/TutorialGraph.tsx index f84f10e..79d68e9 100644 --- a/cryptide_project/src/Components/TutorialGraph.tsx +++ b/cryptide_project/src/Components/TutorialGraph.tsx @@ -202,6 +202,7 @@ const TutorialGraph: React.FC = ({showLast, setNetwork, setP nodes.update({id: node.id, label: node.label + positionToEmoji(1, true)}) handleShowTurnBar(false) setPlayerIndex(1) + setPlayerTouched(-1) await delay(500) const node2 = nodes.get().find((n: NodePerson) => n.id === params.nodes[0]) nodes.update({id: node.id, label: node2.label + positionToEmoji(2, false)}) @@ -220,6 +221,7 @@ const TutorialGraph: React.FC = ({showLast, setNetwork, setP const node = nodes.get().find((n: NodePerson) => n.id === params.nodes[0]) if (node.id === 0){ nodes.update({id: node.id, label: node.label + positionToEmoji(2, false)}) + setPlayerTouched(-1) handleTurnBarTextChange("Mauvais choix, posez un carré !") const tabGrey = [7, 0, 4, 1, 8] for (const id of tabGrey){ @@ -262,6 +264,7 @@ const TutorialGraph: React.FC = ({showLast, setNetwork, setP const node = nodes.get().find((n: NodePerson) => n.id === params.nodes[0]) if (node.id === 4){ nodes.update({id: node.id, label: node.label + positionToEmoji(0, true)}) + setPlayerTouched(-1) await delay(500) const node2 = nodes.get().find((n: NodePerson) => n.id === 4) nodes.update({id: node2.id, label: node2.label + positionToEmoji(1, true)}) From 2c574a5d72f452f3315f17d1773827c4c3198321 Mon Sep 17 00:00:00 2001 From: Thomas Chazot Date: Thu, 7 Dec 2023 16:10:25 +0100 Subject: [PATCH 12/20] fix du bug pour les modes solos --- .../src/Components/GraphContainer.tsx | 101 +++++++++--------- 1 file changed, 48 insertions(+), 53 deletions(-) diff --git a/cryptide_project/src/Components/GraphContainer.tsx b/cryptide_project/src/Components/GraphContainer.tsx index 2d02525..bedc14d 100644 --- a/cryptide_project/src/Components/GraphContainer.tsx +++ b/cryptide_project/src/Components/GraphContainer.tsx @@ -1002,71 +1002,66 @@ const MyGraphComponent: React.FC = ({onNodeClick, handleS } else{ //@ts-ignore - const person = personNetwork?.getPersons().find((p) => p.getId() == params.nodes[0]) //person sélectionnée - if (person != undefined){ + const personTest = personNetwork?.getPersons().find((p) => p.getId() == params.nodes[0]) //person sélectionnée + const node = nodes.get().find((n: any) => params.nodes[0] == n.id) + if (personTest != undefined && !node.label.includes(positionToEmoji(index, true)) && !node.label.includes(positionToEmoji(index, false))){ //si la personne existe et que le noeud n'a pas déjà été cliqué let index =0 - let works = true for (const i of indices){ const tester = IndiceTesterFactory.Create(i) - const test = tester.Works(person) - //@ts-ignore - const node = nodes.get().find((n) => params.nodes[0] == n.id) + const test = tester.Works(personTest) + //@ts-ignore if (node!=undefined){ - if (!node.label.includes(positionToEmoji(index, test))){ - networkData.nodes.update({id: params.nodes[0], label: node.label + positionToEmoji(index, test)}) - await delay(500) - if(!test){ - works = false - } - if (index == indices.length - 1 && works){ + const nodeNode = nodes.get().find((n: any) => params.nodes[0] == n.id) + networkData.nodes.update({id: params.nodes[0], label: nodeNode.label + positionToEmoji(index, test)}) + await delay(500); + } + index++ + } + if (person !== null && person.getId() === params.nodes[0]){ - if (user!=null){ - setWinnerData(user) - setNetworkDataData(networkData) - } - cptTour ++; - setNbCoupData(cptTour) - setElapsedTime(0) - endgame = true - - try{ - if(user && isLoggedIn){ - if(solo){ - if(isDaily){ - // TODO: verif difficulté et add les stats - // TODO: verif pour facile et difficile, si réussi en one shot ou non - if(isEasy){ - manager.userService.addEasyEnigmaStats(user.pseudo, 1, elapsedTime); - } - else{ - manager.userService.addHardEnigmaStats(user.pseudo, 1, elapsedTime); - } - } - else{ - // add stats mastermind - if(user && user.mastermindStats){ - manager.userService.addMastermindStats(user.pseudo, cptTour, elapsedTime); - } - } - } + if (user!=null){ + setWinnerData(user) + setNetworkDataData(networkData) + } + cptTour ++; + setNbCoupData(cptTour) + setElapsedTime(0) + endgame = true + + try{ + if(user && isLoggedIn){ + if(solo){ + if(isDaily){ + // TODO: verif difficulté et add les stats + // TODO: verif pour facile et difficile, si réussi en one shot ou non + if(isEasy){ + manager.userService.addEasyEnigmaStats(user.pseudo, 1, elapsedTime); + } + else{ + manager.userService.addHardEnigmaStats(user.pseudo, 1, elapsedTime); } } - catch(error){ - console.log(error); + else{ + // add stats mastermind + if(user && user.mastermindStats){ + manager.userService.addMastermindStats(user.pseudo, cptTour, elapsedTime); + } } - navigate(`${basePath}/endgame?solo=true&daily=${isDaily}`) } - } } - index++ + catch(error){ + console.log(error); + } + navigate(`${basePath}/endgame?solo=true&daily=${isDaily}`) + } + else{ + addToHistory(personTest.getName() + " n'est pas le coupable !"); //TODO préciser le nombre d'indice qu'il a de juste + cptTour ++; // On Incrémente le nombre de tour du joueur + const tour = cptTour+1; + addToHistory("<----- [Tour " + tour +"/"+networkData.nodes.length + "] ----->"); + changecptTour(cptTour); // On le transmet a la page précédente avec la fonction } - addToHistory(person.getName() + " n'est pas le coupable !"); //TODO préciser le nombre d'indice qu'il a de juste - - cptTour ++; // On Incrémente le nombre de tour du joueur - const tour = cptTour+1; - addToHistory("<----- [Tour " + tour +"/"+networkData.nodes.length + "] ----->"); - changecptTour(cptTour); // On le transmet a la page précédente avec la fonction } } } From c7ecd20501c5bd8057dd473ddfcf35f3a29f51c0 Mon Sep 17 00:00:00 2001 From: Pierre Ferreira Date: Thu, 7 Dec 2023 16:30:09 +0100 Subject: [PATCH 13/20] =?UTF-8?q?impl=C3=A9mentation=20de=20la=20plupart?= =?UTF-8?q?=20du=20tutoriel=20pour=20le=20joueur=20novice=20:boom:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/Components/TutorialGraph.tsx | 23 ++- cryptide_project/src/Pages/Tutorial.tsx | 184 +++++++++++++++++- cryptide_project/src/res/img/tuto/tuto2-2.png | Bin 0 -> 7050 bytes cryptide_project/src/res/img/tuto/tuto2-3.png | Bin 0 -> 26011 bytes cryptide_project/src/res/img/tuto/tuto2-4.png | Bin 0 -> 16578 bytes cryptide_project/src/res/img/tuto/tuto2-5.png | Bin 0 -> 9377 bytes cryptide_project/src/res/img/tuto/tuto2-6.png | Bin 0 -> 65856 bytes 7 files changed, 201 insertions(+), 6 deletions(-) create mode 100644 cryptide_project/src/res/img/tuto/tuto2-2.png create mode 100644 cryptide_project/src/res/img/tuto/tuto2-3.png create mode 100644 cryptide_project/src/res/img/tuto/tuto2-4.png create mode 100644 cryptide_project/src/res/img/tuto/tuto2-5.png create mode 100644 cryptide_project/src/res/img/tuto/tuto2-6.png diff --git a/cryptide_project/src/Components/TutorialGraph.tsx b/cryptide_project/src/Components/TutorialGraph.tsx index 834cb94..1256bf4 100644 --- a/cryptide_project/src/Components/TutorialGraph.tsx +++ b/cryptide_project/src/Components/TutorialGraph.tsx @@ -35,6 +35,7 @@ interface TutorialGraphProps { tutoStep: number setTutoStep: (step: number) => void setGreyForEveryone: (func: () => void) => void + displayModalstep: (step: number) => void; } let lastNodes: NodePerson[] = [] @@ -46,7 +47,7 @@ let stepTuto = -1 -const TutorialGraph: React.FC = ({showLast, setNetwork, setPlayerIndex, handleShowTurnBar, handleTurnBarTextChange, addToHistory, setPlayerTouched, playerTouched, tutoStep, setTutoStep, setGreyForEveryone}) => { +const TutorialGraph: React.FC = ({showLast, setNetwork, setPlayerIndex, handleShowTurnBar, handleTurnBarTextChange, addToHistory, setPlayerTouched, playerTouched, tutoStep, setTutoStep, setGreyForEveryone, displayModalstep}) => { let cptTour: number = 0 //* Gestion du temps : @@ -217,32 +218,45 @@ const TutorialGraph: React.FC = ({showLast, setNetwork, setP if(params.nodes.length > 0){ if (stepTuto === 0 && touchedPlayer === 1){ const node = nodes.get().find((n: NodePerson) => n.id === params.nodes[0]) + + if (node === undefined)return; if (node.id === 7){ nodes.update({id: node.id, label: node.label + positionToEmoji(1, true)}) handleShowTurnBar(false) setPlayerIndex(1) await delay(500) const node2 = nodes.get().find((n: NodePerson) => n.id === params.nodes[0]) + if (node2 === undefined)return; nodes.update({id: node.id, label: node2.label + positionToEmoji(2, false)}) await delay(500) const node3 = nodes.get().find((n: NodePerson) => n.id === 8) + if (node3 === undefined)return; nodes.update({id: node3.id, label: node3.label + positionToEmoji(1, false)}) setPlayerIndex(2) await delay(500) const node4 = nodes.get().find((n: NodePerson) => n.id === 0) + if (node4 === undefined)return; nodes.update({id: node4.id, label: node4.label + positionToEmoji(1, true)}) setPlayerIndex(0) setTutoStep(1) + + displayModalstep(1); } } else if(stepTuto === 1 && touchedPlayer === 2){ const node = nodes.get().find((n: NodePerson) => n.id === params.nodes[0]) + if (node === undefined){ + return; + } if (node.id === 0){ nodes.update({id: node.id, label: node.label + positionToEmoji(2, false)}) + displayModalstep(2); + console.log("display liam") handleTurnBarTextChange("Mauvais choix, posez un carré !") const tabGrey = [7, 0, 4, 1, 8] for (const id of tabGrey){ const node = nodes.get().find((n: NodePerson) => n.id === id) + if (node === undefined)return; nodes.update({id: node.id, color: "#808080"}) } setTutoStep(2) @@ -250,6 +264,7 @@ const TutorialGraph: React.FC = ({showLast, setNetwork, setP } else if(stepTuto === 2){ const node = nodes.get().find((n: NodePerson) => n.id === params.nodes[0]) + if (node === undefined)return; if (node.id === 9){ const tabColor = [7, 0, 4, 1, 8] nodes.update({id: node.id, label: node.label + positionToEmoji(0, false)}) @@ -263,26 +278,32 @@ const TutorialGraph: React.FC = ({showLast, setNetwork, setP setPlayerIndex(1) await delay(500) const node2 = nodes.get().find((n: NodePerson) => n.id === 4) + if (node2 === undefined)return; nodes.update({id: node2.id, label: node2.label + positionToEmoji(2, true)}) setPlayerIndex(2) await delay(500) const node3 = nodes.get().find((n: NodePerson) => n.id === 3) + if (node3 === undefined)return; nodes.update({id: node3.id, label: node3.label + positionToEmoji(0, false)}) await delay(500) const node4 = nodes.get().find((n: NodePerson) => n.id === 1) + if (node4 === undefined)return; nodes.update({id: node4.id, label: node4.label + positionToEmoji(2, false)}) setPlayerIndex(0) handleTurnBarTextChange("A vous de jouer !") handleShowTurnBar(true) setTutoStep(3) + displayModalstep(3); } } else if(stepTuto === 3 && touchedPlayer === 3){ const node = nodes.get().find((n: NodePerson) => n.id === params.nodes[0]) + if (node === undefined)return; if (node.id === 4){ nodes.update({id: node.id, label: node.label + positionToEmoji(0, true)}) await delay(500) const node2 = nodes.get().find((n: NodePerson) => n.id === 4) + if (node2 === undefined)return; nodes.update({id: node2.id, label: node2.label + positionToEmoji(1, true)}) } } diff --git a/cryptide_project/src/Pages/Tutorial.tsx b/cryptide_project/src/Pages/Tutorial.tsx index 1c98a74..22d80e0 100644 --- a/cryptide_project/src/Pages/Tutorial.tsx +++ b/cryptide_project/src/Pages/Tutorial.tsx @@ -25,6 +25,12 @@ 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'; @@ -46,6 +52,7 @@ 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 @@ -209,7 +216,6 @@ const Tutorial = ({locale, changeLocale}) => { } }; - const handleChangeS = () => { if (showS){ handleCloseS() @@ -238,6 +244,9 @@ const Tutorial = ({locale, changeLocale}) => { //* 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); @@ -248,9 +257,39 @@ const Tutorial = ({locale, changeLocale}) => { 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); + 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 && } @@ -265,7 +304,8 @@ const Tutorial = ({locale, changeLocale}) => { setNetwork={setNetworkData} showLast={showLast} setPlayerIndex={setPlayerIndexData} - setGreyForEveryone={setGreyForEveryoneData}/> + setGreyForEveryone={setGreyForEveryoneData} + displayModalstep={displayModalstep}/>
@@ -331,8 +371,6 @@ const Tutorial = ({locale, changeLocale}) => { - - { 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 @@ -483,6 +522,141 @@ const Tutorial = ({locale, changeLocale}) => {
+ + + 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 ! +
+
+
+
+ + + +
); }; diff --git a/cryptide_project/src/res/img/tuto/tuto2-2.png b/cryptide_project/src/res/img/tuto/tuto2-2.png new file mode 100644 index 0000000000000000000000000000000000000000..5147f1a8a2fa795636578851714da35714e59d73 GIT binary patch literal 7050 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 W$w;9r+A#mmu)s>1z)A)4kpBm~Ji8kJ literal 0 HcmV?d00001 diff --git a/cryptide_project/src/res/img/tuto/tuto2-3.png b/cryptide_project/src/res/img/tuto/tuto2-3.png new file mode 100644 index 0000000000000000000000000000000000000000..77ebf30bf115ca659f3ed4bf442295628f3cee64 GIT binary patch literal 26011 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 z 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 C04<9E literal 0 HcmV?d00001 diff --git a/cryptide_project/src/res/img/tuto/tuto2-4.png b/cryptide_project/src/res/img/tuto/tuto2-4.png new file mode 100644 index 0000000000000000000000000000000000000000..73de8483d13b96e34a937200a2a8d2de85b1111c GIT binary patch literal 16578 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 -klN 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 SPvBY+g1oefRGFmlm;VAx=?Z!P literal 0 HcmV?d00001 diff --git a/cryptide_project/src/res/img/tuto/tuto2-6.png b/cryptide_project/src/res/img/tuto/tuto2-6.png new file mode 100644 index 0000000000000000000000000000000000000000..ad7c0a763bbcb63390c1674016452efae20ba0d1 GIT binary patch literal 65856 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 literal 0 HcmV?d00001 From e478ebd963d09c5515c8324d6a025af35323540d Mon Sep 17 00:00:00 2001 From: Pierre Ferreira Date: Thu, 7 Dec 2023 16:38:12 +0100 Subject: [PATCH 14/20] fix de petit probleme de compilation :ambuance: --- cryptide_project/src/Components/GraphContainer.tsx | 2 ++ cryptide_project/src/Pages/Tutorial.tsx | 8 ++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/cryptide_project/src/Components/GraphContainer.tsx b/cryptide_project/src/Components/GraphContainer.tsx index bedc14d..77e0d1b 100644 --- a/cryptide_project/src/Components/GraphContainer.tsx +++ b/cryptide_project/src/Components/GraphContainer.tsx @@ -1004,6 +1004,7 @@ const MyGraphComponent: React.FC = ({onNodeClick, handleS //@ts-ignore const personTest = personNetwork?.getPersons().find((p) => p.getId() == params.nodes[0]) //person sélectionnée const node = nodes.get().find((n: any) => params.nodes[0] == n.id) + if(node == undefined)return; if (personTest != undefined && !node.label.includes(positionToEmoji(index, true)) && !node.label.includes(positionToEmoji(index, false))){ //si la personne existe et que le noeud n'a pas déjà été cliqué let index =0 for (const i of indices){ @@ -1012,6 +1013,7 @@ const MyGraphComponent: React.FC = ({onNodeClick, handleS //@ts-ignore if (node!=undefined){ const nodeNode = nodes.get().find((n: any) => params.nodes[0] == n.id) + if(nodeNode == undefined)return; networkData.nodes.update({id: params.nodes[0], label: nodeNode.label + positionToEmoji(index, test)}) await delay(500); } diff --git a/cryptide_project/src/Pages/Tutorial.tsx b/cryptide_project/src/Pages/Tutorial.tsx index 22d80e0..24cc1f3 100644 --- a/cryptide_project/src/Pages/Tutorial.tsx +++ b/cryptide_project/src/Pages/Tutorial.tsx @@ -638,13 +638,13 @@ const Tutorial = ({locale, changeLocale}) => { Vous avez a présent assez d'information pour deviner les indices des autre :
  • - Bot1 semble avoir {indices[1].ToString(locale)} + Bot1 semble avoir {indices[1]?.ToString(locale)}
  • - Bot2 semble avoir {indices[2].ToString(locale)} + Bot2 semble avoir {indices[2]?.ToString(locale)}
  • - Et votre indice est {indices[0].ToString(locale)} + Et votre indice est {indices[0]?.ToString(locale)}

@@ -654,7 +654,7 @@ const Tutorial = ({locale, changeLocale}) => { - +
From 177a75d5edc85dbf58b80be2079ac3d63e6a68f8 Mon Sep 17 00:00:00 2001 From: Pierre Ferreira Date: Fri, 8 Dec 2023 09:56:54 +0100 Subject: [PATCH 15/20] finission du tuto et gestion du bouton d'aide. :bento: --- cryptide_project/src/Pages/Tutorial.tsx | 64 +++++++++++++++--- .../src/res/img/tuto/tuto-rep.png | Bin 0 -> 18189 bytes 2 files changed, 53 insertions(+), 11 deletions(-) create mode 100644 cryptide_project/src/res/img/tuto/tuto-rep.png diff --git a/cryptide_project/src/Pages/Tutorial.tsx b/cryptide_project/src/Pages/Tutorial.tsx index 24cc1f3..a82ab0c 100644 --- a/cryptide_project/src/Pages/Tutorial.tsx +++ b/cryptide_project/src/Pages/Tutorial.tsx @@ -21,6 +21,7 @@ import Ceye from "../res/icon/hidden.png"; import ImgBot from "../res/img/bot.png"; import ava from "../res/img/tuto/tuto-ava.png"; +import rep from "../res/img/tuto/tuto-rep.png"; import joueurs from "../res/img/tuto/tuto-joueurs.png"; import tada from "../res/img/tuto/tuto-tada.png"; @@ -250,10 +251,43 @@ const Tutorial = ({locale, changeLocale}) => { const handleCloseM = () => { setShowM(false); - setTuto1disable(false); } const handleShowM = () => setShowM(true); + const handleCloseHelp = () => { + switch(tutoStep){ + case 0: + setShowTuto2(false); + break; + case 1: + setShowTuto21(false); + break; + case 2: + setShowTuto22(false); + break; + case 3: + setShowTuto3(false); + break; + } + } + const handleShowHelp = () => { + switch(tutoStep){ + case 0: + setShowTuto2(true); + break; + case 1: + setShowTuto21(true); + break; + case 2: + setShowTuto22(true); + break; + case 3: + setShowTuto3(true); + break; + } + } + + const handleCloseTuto2 = () => setShowTuto2(false); const handleShowTuto2 = () => setShowTuto2(true); @@ -269,9 +303,6 @@ const Tutorial = ({locale, changeLocale}) => { const [step, setStep] = useState(0); - const [tuto1disable, setTuto1disable] = useState(true); //? mauvaise idée ? - - //@ts-ignore const displayModalstep = (step: number) => { //* for step 2 @@ -290,6 +321,10 @@ const Tutorial = ({locale, changeLocale}) => { } + useEffect(() => { + handleShowM(); + }, []) + return (
{showTurnBar && } @@ -316,11 +351,15 @@ const Tutorial = ({locale, changeLocale}) => {
- */} + + */} { step != 0 && ()} - { step === 5 ? () : + { step === 6 ? () : } @@ -553,7 +570,7 @@ const Tutorial = ({locale, changeLocale}) => { 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. + Dans un premier temps, sélectionnez le joueur Bot1 et questionnez le à propos de Violet en cliquant sur cette dernière.
@@ -577,9 +594,9 @@ const Tutorial = ({locale, changeLocale}) => { - votre premier tour + 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. + Super, Violet a été identifié par l'indice de Bot1, c'est une information essentielle ! Cependant, cela ne signifie pas forcément qu'elle est coupable.
C'est à présent le tour aux autres joueurs de jouer, regardons ce qu'ils ont fait.
@@ -593,11 +610,11 @@ const Tutorial = ({locale, changeLocale}) => { 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é. + Il semblerait que Bot1 ait interrogé 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. + Bot1 a donc fait une erreur, en questionnant quelqu'un pouvant innocenter Violet. En guise de punition, il doit 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.
@@ -611,9 +628,9 @@ const Tutorial = ({locale, changeLocale}) => { 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 ? + Vous remarquez que votre indice identifie lui aussi Charlotte, et si nous demandions à Bot2, si ce dernier pense que Charlotte est la coupable ?
- Cela nous permettrais donc de mettre fin à la partie ! + Cela nous permettrait donc de mettre fin à la partie !
@@ -646,11 +663,11 @@ const Tutorial = ({locale, changeLocale}) => { La punition - Mince, il semblerai que l'indice de Bot2 innocente Charlotte, et que ce dernier ait donc une erreur, la punition s'applique ! + Mince, il semblerait 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. + Afin de révéler le moins d'informations, posons notre carré sur Liam, il s'agit de la seule personne qui a moins de 20 ans encore suspecte.
@@ -677,16 +694,16 @@ const Tutorial = ({locale, changeLocale}) => { Ce tour est lui aussi riche en informations !
- Vous avez a présent assez d'information pour deviner les indices des autre : + Vous avez à présent assez d'information pour deviner les indices des autres :
  • - Bot1 semble avoir {indices[1]?.ToString(locale)} + Bot1 semble avoir : {indices[1]?.ToString(locale)}.
  • - Bot2 semble avoir {indices[2]?.ToString(locale)} + Bot2 semble avoir : {indices[2]?.ToString(locale)}.
  • - Et votre indice est {indices[0]?.ToString(locale)} + Et votre indice est : {indices[0]?.ToString(locale)}.

diff --git a/cryptide_project/src/res/img/tuto/tuto-indiceTxt.png b/cryptide_project/src/res/img/tuto/tuto-indiceTxt.png new file mode 100644 index 0000000000000000000000000000000000000000..de796165af5a12d510ab93d255b0c3ccb562daf5 GIT binary patch literal 7390 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 Date: Fri, 8 Dec 2023 15:02:37 +0100 Subject: [PATCH 17/20] =?UTF-8?q?changement=20du=20style=20suite=20=C3=A0?= =?UTF-8?q?=20la=20s=C3=A9lection=20d'un=20joueur=20:lipstick:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/Components/PersonStatus.tsx | 4 +- .../src/Components/TutorialGraph.tsx | 2 +- cryptide_project/src/Pages/Tutorial.tsx | 38 +++++++++++++------ 3 files changed, 30 insertions(+), 14 deletions(-) diff --git a/cryptide_project/src/Components/PersonStatus.tsx b/cryptide_project/src/Components/PersonStatus.tsx index e4ea131..f204c5e 100644 --- a/cryptide_project/src/Components/PersonStatus.tsx +++ b/cryptide_project/src/Components/PersonStatus.tsx @@ -70,7 +70,7 @@ const PersonStatus: React.FC = ({img = Person, state= Person, onTouch(); }; const circleStyle: React.CSSProperties = { - backgroundColor: touchedPlayer == index && showCircle ? 'gold' : positionToColor(index), // Changement de la couleur en fonction de la condition + backgroundColor: positionToColor(index), // Changement de la couleur en fonction de la condition borderRadius: buffer, width: '80px', height: '80px', @@ -83,7 +83,7 @@ const PersonStatus: React.FC = ({img = Person, state= Person, const circleStyleInt: React.CSSProperties = { - backgroundColor:'white', + backgroundColor: touchedPlayer == index && showCircle ? 'lightblue' : 'white', borderRadius: buffer, width: '70px', height: '70px', diff --git a/cryptide_project/src/Components/TutorialGraph.tsx b/cryptide_project/src/Components/TutorialGraph.tsx index 5b19079..c9190d1 100644 --- a/cryptide_project/src/Components/TutorialGraph.tsx +++ b/cryptide_project/src/Components/TutorialGraph.tsx @@ -147,7 +147,7 @@ const TutorialGraph: React.FC = ({showLast, setNetwork, setP direction: 'LR', // LR (Left to Right) ou autre selon votre préférence sortMethod: 'hubsize' }, - randomSeed: 2 + randomSeed: 3 }, physics: { enabled: true, diff --git a/cryptide_project/src/Pages/Tutorial.tsx b/cryptide_project/src/Pages/Tutorial.tsx index f779dd6..402c4f1 100644 --- a/cryptide_project/src/Pages/Tutorial.tsx +++ b/cryptide_project/src/Pages/Tutorial.tsx @@ -416,7 +416,9 @@ const Tutorial = ({locale, changeLocale}) => { show={showM} onHide={handleCloseM} backdrop="static" - keyboard={false}> + keyboard={false} + size="lg" + style={{ maxHeight: '100vh'}}> Tutoriel @@ -471,7 +473,14 @@ const Tutorial = ({locale, changeLocale}) => { Ici, les réponses sont représentées par des carrés et des ronds de couleurs différentes. Les couleurs permettent de différencier les joueurs.
- Un carré signifie un NON et un rond signifie un OUI (son indice permet d'identifier cette personne). +
    +
  • + Un carré signifie un NON. +
  • +
  • + Un rond signifie un OUI +
  • +

Par exemple, ici, l'indice du joueur Vert permet d'innocenter Logan.
Eleanor peut être suspectée par l'indice du joueur Jaune. @@ -557,14 +566,16 @@ const Tutorial = ({locale, changeLocale}) => { show={showTuto2} onHide={handleCloseTuto2} backdrop="static" - keyboard={false}> + keyboard={false} + size="lg" + style={{ maxHeight: '100vh'}}> Tutoriel - + Premier pas @@ -585,14 +596,16 @@ const Tutorial = ({locale, changeLocale}) => { show={showTuto21} onHide={handleCloseTuto21} backdrop="static" - keyboard={false}> + keyboard={false} + size="lg" + style={{ maxHeight: '100vh'}}> Tutoriel {step === 0 && ( - + Votre premier tour @@ -606,7 +619,7 @@ const Tutorial = ({locale, changeLocale}) => { {step === 1 && ( - + Premier tour des autres joueurs @@ -652,7 +665,9 @@ const Tutorial = ({locale, changeLocale}) => { show={showTuto22} onHide={handleCloseTuto22} backdrop="static" - keyboard={false}> + keyboard={false} + size="lg" + style={{ maxHeight: '100vh'}}> Tutoriel @@ -677,18 +692,19 @@ const Tutorial = ({locale, changeLocale}) => { - + keyboard={false} + size="lg" + style={{ maxHeight: '100vh'}}> End Game - + La fin du jeu From faa5408f179d94616fc10e9fa143b7c6f6702920 Mon Sep 17 00:00:00 2001 From: Thomas Chazot Date: Fri, 8 Dec 2023 15:10:14 +0100 Subject: [PATCH 18/20] new seed pour tuto + nom pour les bots pour l'immersion + autres fix --- cryptide_project/server/socket_io/server.js | 51 ++++++++++++------- .../src/Components/GraphContainer.tsx | 3 +- .../src/Components/PersonStatus.tsx | 2 +- .../src/Components/PlayerList.tsx | 4 +- .../src/Components/TutorialGraph.tsx | 2 +- cryptide_project/src/Pages/EndGame.tsx | 16 +++--- cryptide_project/src/Pages/Lobby.tsx | 36 ++++++++----- cryptide_project/src/Pages/Tutorial.tsx | 2 +- cryptide_project/src/res/botNames.json | 22 ++++++++ 9 files changed, 90 insertions(+), 48 deletions(-) create mode 100644 cryptide_project/src/res/botNames.json diff --git a/cryptide_project/server/socket_io/server.js b/cryptide_project/server/socket_io/server.js index ae793dc..1bf3a75 100644 --- a/cryptide_project/server/socket_io/server.js +++ b/cryptide_project/server/socket_io/server.js @@ -25,12 +25,18 @@ io.on('connection', (socket) => { console.log(socket.id); socket.on('network created', (network, person, indices, room, start) =>{ - io.to(room).emit("game created", network, person, indices, start) - map.get(room).started = true - map.get(room).actualPlayer=start - const playerArray = Array.from(map.entries()).map(([key, value]) => ({ key, value })) - const playerJson = JSON.stringify(playerArray); - io.emit("request lobbies", playerJson) + try{ + io.to(room).emit("game created", network, person, indices, start) + map.get(room).started = true + map.get(room).actualPlayer=start + const playerArray = Array.from(map.entries()).map(([key, value]) => ({ key, value })) + const playerJson = JSON.stringify(playerArray); + io.emit("request lobbies", playerJson) + } + catch{ + console.log("error") + } + }); socket.on("give network", (networkPerson, person, indices, start, room, nodes, playerId) => { @@ -145,17 +151,23 @@ io.on('connection', (socket) => { }) socket.on("who plays", (room) => { - if (map.get(room) !== undefined){ - let player = map.get(room).actualPlayer - if (map.get(room).tab[player].type != "User"){ - player = player + 1 - if (player == map.get(room).tab.length){ - player=0 + try{ + if (map.get(room) !== undefined){ + let player = map.get(room).actualPlayer + if (map.get(room).tab[player].type != "User"){ + player = player + 1 + if (player == map.get(room).tab.length){ + player=0 + } } + // console.log(player) + io.to(room).emit("who plays", player, map.get(room).lastWorks) } - // console.log(player) - io.to(room).emit("who plays", player, map.get(room).lastWorks) } + catch{ + + } + }) socket.on("disconnect", () =>{ @@ -216,9 +228,14 @@ io.on('connection', (socket) => { }) socket.on("node checked", (id, works, color, room, playerIndex) =>{ - map.get(room).actualPlayer=playerIndex - map.get(room).lastWorks=works - io.to(room).emit("node checked", id, works, color, playerIndex, socket.id) + try{ + map.get(room).actualPlayer=playerIndex + map.get(room).lastWorks=works + io.to(room).emit("node checked", id, works, color, playerIndex, socket.id) + } + catch{ + console.log("error") + } }) socket.on("put correct background", (id) =>{ diff --git a/cryptide_project/src/Components/GraphContainer.tsx b/cryptide_project/src/Components/GraphContainer.tsx index 77e0d1b..e83fe26 100644 --- a/cryptide_project/src/Components/GraphContainer.tsx +++ b/cryptide_project/src/Components/GraphContainer.tsx @@ -477,7 +477,6 @@ const MyGraphComponent: React.FC = ({onNodeClick, handleS p.indice=indices[index] p.index=index p.initiateMap(personNetwork) - console.log(p.indice.ToString("fr")) } }) } @@ -488,7 +487,6 @@ const MyGraphComponent: React.FC = ({onNodeClick, handleS bot.indice=indices[i] bot.index=index bot.initiateMap(personNetwork) - console.log(bot.indice.ToString("fr")) } } if (i==playerIndex){ @@ -520,6 +518,7 @@ const MyGraphComponent: React.FC = ({onNodeClick, handleS setPlayerIndex(index) setLastIndex(index) if (actualPlayerIndex==index){ + handleTurnBarTextChange("À vous de jouer") handleShowTurnBar(true) } }) diff --git a/cryptide_project/src/Components/PersonStatus.tsx b/cryptide_project/src/Components/PersonStatus.tsx index e4ea131..f313e63 100644 --- a/cryptide_project/src/Components/PersonStatus.tsx +++ b/cryptide_project/src/Components/PersonStatus.tsx @@ -112,7 +112,7 @@ const PersonStatus: React.FC = ({img = Person, state= Person, {/*
*/}
-
{actualPlayerIndex !== index ? (name.substring(0, name.length - 2).length > 7 ? name.substring(0, name.length - 2).substring(0, 7) + '...' : name.substring(0, name.length - 2)) : 'vous'}
+
{actualPlayerIndex !== index ? (name.length > 18 ? name.substring(0, 15) + '...' : name) : 'vous'}
); diff --git a/cryptide_project/src/Components/PlayerList.tsx b/cryptide_project/src/Components/PlayerList.tsx index 6b44f8f..ed26e9c 100644 --- a/cryptide_project/src/Components/PlayerList.tsx +++ b/cryptide_project/src/Components/PlayerList.tsx @@ -39,9 +39,7 @@ const PlayerList: React.FC = ({ players, playerTouched, setPlay = ({showLast, setNetwork, setP direction: 'LR', // LR (Left to Right) ou autre selon votre préférence sortMethod: 'hubsize' }, - randomSeed: 2 + randomSeed: 3 }, physics: { enabled: true, diff --git a/cryptide_project/src/Pages/EndGame.tsx b/cryptide_project/src/Pages/EndGame.tsx index 2f5c76b..3e72f2c 100644 --- a/cryptide_project/src/Pages/EndGame.tsx +++ b/cryptide_project/src/Pages/EndGame.tsx @@ -146,15 +146,13 @@ function EndGame() { */}
- {losingPlayers.map((player, index) => ( -
- {player.id !== winner?.id && ( -
- {}} index={index} playerIndex={-2} showCircle={false} askedWrong={false}/> - {!indicenull && (
{indices[players.findIndex((p) => p.id == player?.id)].ToString("fr")}
)} -
- )} -
+ {players.map((player, index) => ( + player.id !== winner?.id && ( +
+ {}} index={index} playerIndex={-2} showCircle={false} askedWrong={false}/> + {!indicenull && (
{indices[players.findIndex((p) => p.id == player?.id)].ToString("fr")}
)} +
+ ) ))}
diff --git a/cryptide_project/src/Pages/Lobby.tsx b/cryptide_project/src/Pages/Lobby.tsx index 3070545..df747cd 100644 --- a/cryptide_project/src/Pages/Lobby.tsx +++ b/cryptide_project/src/Pages/Lobby.tsx @@ -66,7 +66,13 @@ function Lobby() { const room = params.get('room'); function addBot(){ - socket.emit("lobby joined", room, new EasyBot("botId" + Math.floor(Math.random() * 1000), "Bot" + Math.floor(Math.random() * 100), "").toJson()) + let json = require("../res/botNames.json") + const tabNames = [...json.names] + let name = tabNames[Math.floor(Math.random() * tabNames.length)] + while (players.find((p) => p.pseudo === name) != undefined){ + name = tabNames[Math.floor(Math.random() * tabNames.length)] + } + socket.emit("lobby joined", room, new EasyBot(name, name, "").toJson()) } //* nb Node @@ -213,23 +219,25 @@ function Lobby() { function StartGame(){ - const [networkPerson, choosenPerson, choosenIndices] = GameCreator.CreateGame(players.length, enteredNumber) - setPersonData(choosenPerson) - setPersonNetworkData(networkPerson) - setIndicesData(choosenIndices) - let users = players.filter((p) => p instanceof User) - let u = users[Math.floor(Math.random() * users.length)] - let start = players.findIndex((p) => p.id == u.id) - if (start == -1){ - start = 0 + if (players.length > 2){ + const [networkPerson, choosenPerson, choosenIndices] = GameCreator.CreateGame(players.length, enteredNumber) + setPersonData(choosenPerson) + setPersonNetworkData(networkPerson) + setIndicesData(choosenIndices) + let users = players.filter((p) => p instanceof User) + let u = users[Math.floor(Math.random() * users.length)] + let start = players.findIndex((p) => p.id == u.id) + if (start == -1){ + start = 0 + } + socket.emit('network created', JSON.stringify(networkPerson, null, 2), JSON.stringify(choosenPerson), JSON.stringify(choosenIndices), room, start); } - socket.emit('network created', JSON.stringify(networkPerson, null, 2), JSON.stringify(choosenPerson), JSON.stringify(choosenIndices), room, start); } const copyGameLink = () => { setShow(!show) - const gameLink = "http://172.20.10.4:3000/lobby?room="+ room; + const gameLink = basePath + "/lobby?room="+ room; navigator.clipboard.writeText(gameLink) .then(() => { console.log('Lien copié avec succès !'); @@ -240,7 +248,7 @@ function Lobby() { }; const textAreaRef = useRef(null); - const linkToCopy = "http://172.20.10.4:3000/lobby?room="+ room + const linkToCopy = basePath + "/lobby?room="+ room const handleCopyClick = () => { setShow(!show) if(textAreaRef.current != null){ @@ -345,7 +353,7 @@ function Lobby() { onChange={handleNumberChange} min={20} max={60}/> - diff --git a/cryptide_project/src/Pages/Tutorial.tsx b/cryptide_project/src/Pages/Tutorial.tsx index a82ab0c..6be1ff2 100644 --- a/cryptide_project/src/Pages/Tutorial.tsx +++ b/cryptide_project/src/Pages/Tutorial.tsx @@ -128,7 +128,7 @@ const Tutorial = ({locale, changeLocale}) => { if (user == null){ return } - setPlayersData([user, new EasyBot("Bot1", "Bot1", ImgBot), new EasyBot("Bot2", "Bot2", ImgBot)]) + setPlayersData([user, new EasyBot("Scooby-Doo", "Scooby-Doo", ImgBot), new EasyBot("Batman", "Batman", ImgBot)]) }, []) diff --git a/cryptide_project/src/res/botNames.json b/cryptide_project/src/res/botNames.json new file mode 100644 index 0000000..e7f7b11 --- /dev/null +++ b/cryptide_project/src/res/botNames.json @@ -0,0 +1,22 @@ +{ + "names": [ + "Sherlock Holmes", + "Inspecteur Gadget", + "Scooby-Doo", + "Marple", + "Spocky", + "Phoenix", + "Batman", + "James Bond", + "Sherlockio", + "Verra", + "Hercule Poirot", + "Colombo", + "MacGyver", + "Lupin", + "D. Conan", + "Pr. Layton", + "Dr. Watson" + ] + } + \ No newline at end of file From 6fe508e0946f74a7abc9938f11c1bd84427c6c85 Mon Sep 17 00:00:00 2001 From: Thomas Chazot Date: Fri, 8 Dec 2023 16:42:01 +0100 Subject: [PATCH 19/20] pp en ligne --- cryptide_project/src/Components/PlayerList.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cryptide_project/src/Components/PlayerList.tsx b/cryptide_project/src/Components/PlayerList.tsx index ed26e9c..ef2f5dc 100644 --- a/cryptide_project/src/Components/PlayerList.tsx +++ b/cryptide_project/src/Components/PlayerList.tsx @@ -5,6 +5,8 @@ import Player from '../model/Player'; import { useTheme } from '../Style/ThemeContext'; import PersonStatus from './PersonStatus'; import Person from '../res/img/Person.png' +import BotImg from '../res/img/bot.png' + import { socket } from '../SocketConfig'; @@ -36,7 +38,7 @@ const PlayerList: React.FC = ({ players, playerTouched, setPlay //@ts-ignore players.map((player, index) => ( //player.id!=socket.id && - Date: Fri, 8 Dec 2023 16:43:13 +0100 Subject: [PATCH 20/20] fin du tutorial :boom: --- cryptide_project/src/App.tsx | 1 + cryptide_project/src/Pages/Tutorial.tsx | 93 +++++++++++------- .../src/res/img/tuto/tuto-graph.png | Bin 0 -> 67336 bytes 3 files changed, 56 insertions(+), 38 deletions(-) create mode 100644 cryptide_project/src/res/img/tuto/tuto-graph.png diff --git a/cryptide_project/src/App.tsx b/cryptide_project/src/App.tsx index fc79611..886c900 100644 --- a/cryptide_project/src/App.tsx +++ b/cryptide_project/src/App.tsx @@ -69,6 +69,7 @@ function App() { //const location = useLocation(); const hasNavbarVisible = [basePath + "/", basePath + "/login", basePath + "/signup", basePath + "/lobby", basePath + "/endgame", basePath + "/deduc"]//.includes(window.location.pathname); + document.title = "Social Graph"; return ( }> diff --git a/cryptide_project/src/Pages/Tutorial.tsx b/cryptide_project/src/Pages/Tutorial.tsx index 402c4f1..679bd38 100644 --- a/cryptide_project/src/Pages/Tutorial.tsx +++ b/cryptide_project/src/Pages/Tutorial.tsx @@ -24,7 +24,7 @@ import ava from "../res/img/tuto/tuto-ava.png"; import indicetxt from "../res/img/tuto/tuto-indiceTxt.png" import rep from "../res/img/tuto/tuto-rep.png"; import joueurs from "../res/img/tuto/tuto-joueurs.png"; -import tada from "../res/img/tuto/tuto-tada.png"; +import graph from "../res/img/tuto/tuto-graph.png"; import step1 from "../res/img/tuto/tuto2-1.png"; import step2 from "../res/img/tuto/tuto2-2.png"; @@ -303,7 +303,7 @@ const Tutorial = ({locale, changeLocale}) => { const handleShowTuto3 = () => setShowTuto3(true); - const [step, setStep] = useState(0); + const [step, setStep] = useState(-1); //@ts-ignore const displayModalstep = (step: number) => { @@ -424,15 +424,31 @@ const Tutorial = ({locale, changeLocale}) => { + {step === -1 && ( + + + + Bienvenue dans SocialGraph + + Vous incarnez un détective assoiffé de gloire, confronté à un crime.
+ Cependant, d'autres enquêteurs sont également sur le coup, tous cherchant à décrocher le titre de meilleur détective du monde.
+ Chacun possède un indice crucial pour identifier le coupable, il va falloir déduire l'indice de vos concurrents si vous souhaitez l'emporter !
+ Interrogez vos concurrents pour obtenir des réponses par oui ou non, mais méfiez-vous, un refus a des conséquences.
+ Soyez le premier à déduire les indices des autres et à trouver le coupable pour remporter la reconnaissance tant convoitée.
+ Si vous avez le moindre doute, cliquer sur le bouton "aide" pour afficher l'étape actuel du tuto +
+
+
+ )} {step === 0 && ( - Les Personnes + Les Suspects - Voici comment est représentés une personne, chaque personne possède différentes caractéristiques, que ce soit leur nom, âge, sport et leur couleur de cheveux. + Voici comment est représenté un suspect, chaque suspect 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. + 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 amis.
@@ -444,7 +460,7 @@ const Tutorial = ({locale, changeLocale}) => { Les indices - Dans ce jeu, chaque joueur possède un indice, qui permet d'identifier une personne, votre indice est le suivant : + Dans ce jeu, chaque détective possède un indice, qui permet d'identifier une caractéristique du coupable, votre indice est le suivant :
"Le suspect a entre 20 et 29 ans".
@@ -456,35 +472,36 @@ const Tutorial = ({locale, changeLocale}) => { - Les Joueurs + Les Détectives - 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 voir les détectives sur le côté gauche de l'écran, ils sont représentés par des cercles de couleurs différentes. Le contour carré signifie que ce détective est en pleine réflexion.
- Il est possible de cliquer sur l'image d'un joueur pour le sélectionner, afin de pouvoir lui demander des informations à propos de quelqu'un sur le graphe. + Pour interroger un détective à propos d'un suspect, il suffit de le sélectionner, puis de cliquer sur le suspect que vous souhaitez. Il vous répondra donc ce qu'il pense de ce suspect selon son indice.
)} + {step === 4 && ( Les réponses - Ici, les réponses sont représentées par des carrés et des ronds de couleurs différentes. Les couleurs permettent de différencier les joueurs. + Les détéctives vous répondrons que par des ronds ou des carrés de leur couleur.
  • - Un carré signifie un NON. + Un carré signifie que son indice innocente le suspect.
  • - Un rond signifie un OUI + Un rond signifie que son indice peut incréminer le suspect.
-
- Par exemple, ici, l'indice du joueur Vert permet d'innocenter Logan. -
Eleanor peut être suspectée par l'indice du joueur Jaune. -
Evelyn est innocentée par l'indice de 3 joueurs différents. + Par exemple, ici :
+ l'indice du détéctive Scooby-Doo (Vert) permet d'innocenter Logan. +
Eleanor peut être suspectée par l'indice du détective Batman (Jaune). +
Evelyn est innocentée par l'indice de 3 détéctive différents.
@@ -502,9 +519,9 @@ const Tutorial = ({locale, changeLocale}) => { - Les règle du jeu + Les règles du jeu - Ce bouton vous mène à la page d'information du jeu, avec toutes les règles du jeu, que ce soit les objectifs, les indices, le déroulement, etc. + Ce bouton vous mène à la page d'information du jeu, avec toutes les règles du jeu, que ce soit les objectifs, les indices, le déroulement, etc. @@ -532,13 +549,15 @@ const Tutorial = ({locale, changeLocale}) => { {step === 6 && ( - + - Étape finale + Place à la pratique ! - 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 ! + Bien joué ! Vous avez maintenanttoutes les bases d'un veritable détéctive. +
+ Vous allez à présent avoir un exercice pratique pour la résolution d'une enquête, au côté de ces très chère Batman et Scooby-Doo.
- Le bouton aide est là pour vous, il vous permet de suivre le tutoriel si jamais vous êtes perdu, cliquez dessus ! + Cliquer sur "Poursuivre" pour commencer votre première partie.
@@ -561,7 +580,6 @@ const Tutorial = ({locale, changeLocale}) => { - { Premier pas - Bienvenue dans cette seconde partie, ou nous allons apprendre le déroulé d'une partie. + Bienvenue dans cette seconde partie, où nous allons apprendre le déroulé d'une veritable enquête.
- Dans un premier temps, sélectionnez le joueur Bot1 et questionnez le à propos de Violet en cliquant sur cette dernière. + Dans un premier temps, sélectionnez le joueur Scooby-Doo et questionnez le à propos du suspect nommé Violet en cliquant sur cette dernière.
@@ -609,7 +627,7 @@ const Tutorial = ({locale, changeLocale}) => { Votre premier tour - Super, Violet a été identifié par l'indice de Bot1, c'est une information essentielle ! Cependant, cela ne signifie pas forcément qu'elle est coupable. + Super, Violet a été identifié par l'indice de Scooby-Doo, c'est une information essentielle ! Cependant, cela ne signifie pas forcément qu'elle est coupable.
C'est à présent le tour aux autres joueurs de jouer, regardons ce qu'ils ont fait.
@@ -623,13 +641,13 @@ const Tutorial = ({locale, changeLocale}) => { Premier tour des autres joueurs - Il semblerait que Bot1 ait interrogé Bot2 à propos de Violet, et que ce dernier ait répondu non par un carré. + Il semblerait que Scooby-Doo ait lui aussi interrogé Batman à 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 doit 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. + Scooby-Doo a donc fait une erreur, en questionnant quelqu'un pouvant innocenter Violet. En guise de punition, il doit, 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 Scooby-Doo ne permet pas d'identifier Sebastian.
- Ensuite, Bot2 a questionné Bot1 à propos de Charlotte, qui est identifié par l'indice de Bot1. + Ensuite, Batman a questionné Scooby-Doo à propos de Charlotte, qui est identifié par l'indice de Scooby-Doo.
@@ -641,7 +659,7 @@ const Tutorial = ({locale, changeLocale}) => { Second tour - Vous remarquez que votre indice identifie lui aussi Charlotte, et si nous demandions à Bot2, si ce dernier pense que Charlotte est la coupable ? + Vous remarquez que votre indice identifie lui aussi Charlotte, et si nous demandions à Batman, si ce dernier pense que Charlotte est la coupable ?
Cela nous permettrait donc de mettre fin à la partie !
@@ -678,11 +696,11 @@ const Tutorial = ({locale, changeLocale}) => { La punition - Mince, il semblerait que l'indice de Bot2 innocente Charlotte, et que ce dernier ait donc une erreur, la punition s'applique ! + Mince, il semblerait que l'indice de Batman innocente Charlotte, et que vous avez donc commit 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. + Vous devez donc poser un carré sur un autre joueur, révélant ainsi plus d'information sur votre indice.
- Afin de révéler le moins d'informations, posons notre carré sur Liam, il s'agit de la seule personne qui a moins de 20 ans encore suspecte. + Mais rien n'est joué ! Posons notre carré sur Liam pour cela, sélectionnez directement le suspect désiré.
@@ -713,17 +731,16 @@ const Tutorial = ({locale, changeLocale}) => { Vous avez à présent assez d'information pour deviner les indices des autres :
  • - Bot1 semble avoir : {indices[1]?.ToString(locale)}. + Scooby-Doo semble avoir : {indices[1]?.ToString(locale)}.
  • - Bot2 semble avoir : {indices[2]?.ToString(locale)}. + Batman 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 ! + Vous avez à présent toutes les cartes en main pour deviner qui est le coupable, cliquer sur le bouton Ask Everyone, puis séléctionné un suspect pour émettre une accusation pour deviner, bonne chance !
diff --git a/cryptide_project/src/res/img/tuto/tuto-graph.png b/cryptide_project/src/res/img/tuto/tuto-graph.png new file mode 100644 index 0000000000000000000000000000000000000000..f9e04d7954538a1cf2817067958402cfcfabcb11 GIT binary patch literal 67336 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