Merge remote-tracking branch 'origin' into Server

pull/74/head
Thomas Chazot 2 years ago
commit 9fe7c8373d

@ -33,17 +33,22 @@ io.on('connection', (socket) => {
socket.join(room) socket.join(room)
} }
if (map.get(room) == undefined){ if (map.get(room) == undefined){
map.set(room, [{type: player.type, id: player.id, name: player.name}]) map.set(room, [{type: player.type, id: socket.id, name: player.name}])
} }
else{ else{
const tab = map.get(room) const tab = map.get(room)
for(let i = 0; i<tab.length; i++){ for(let i = 0; i<tab.length; i++){
if (tab[i].id === player.id){ if (tab[i].id === socket.id && player.type==="Human"){
tab.splice(i, 1) tab.splice(i, 1)
} }
} }
map.get(room).push({type: player.type, id: player.id, name: player.name}) if (player.type!=="Human"){
map.get(room).push({type: player.type, id: player.id, name: player.name})
}
else{
map.get(room).push({type: player.type, id: socket.id, name: player.name})
}
} }
io.to(room).emit("new player", map.get(room)) io.to(room).emit("new player", map.get(room))

@ -33,6 +33,7 @@ import 'bootstrap/dist/css/bootstrap.min.css';
/* Internationnalisation */ /* Internationnalisation */
import messagesFr from './Translations/fr.json'; import messagesFr from './Translations/fr.json';
import messagesEn from './Translations/en.json'; import messagesEn from './Translations/en.json';
import SoloGame from './Pages/SoloGame';
const messages = { const messages = {
fr: messagesFr, fr: messagesFr,
@ -76,8 +77,9 @@ function App() {
<Route path="/play" element={<Play/>} /> <Route path="/play" element={<Play/>} />
<Route path="/lobby" element={<Lobby/>} /> <Route path="/lobby" element={<Lobby/>} />
<Route path="/endgame" element={<EndGame/>} /> <Route path="/endgame" element={<EndGame/>} />
<Route path="/game" element={<InGame locale={locale} changeLocale={changeLocale}/>} /> <Route path="/game" element={<InGame locale={locale} changeLocale={changeLocale}/>}/>
<Route path="/info" element={<InfoPage/>} /> <Route path="/info" element={<InfoPage/>} />
{/* <Route path="/solo" element={<SoloGame locale={locale} changeLocale={changeLocale} />}/> */}
</Routes> </Routes>
</BrowserRouter> </BrowserRouter>
</ThemeProvider> </ThemeProvider>

@ -0,0 +1,24 @@
import React from 'react';
import { Link } from 'react-router-dom';
import '../Style/Global.css';
import { FormattedMessage } from 'react-intl';
import { useTheme } from '../Style/ThemeContext';
//@ts-ignore
function ColoredIndices({ letter, color}) {
const theme = useTheme();
// const mystyle = {
// backgroundColor: "#0064E0",
// };
return (
<div className='centerDivH' style={{ backgroundColor: theme.colors.primary }}>
<img src={letter} alt="Indice Letter"/>
</div>
);
}
export default ColoredIndices;

@ -21,6 +21,7 @@ import { useGame } from "../Contexts/GameContext";
import { socket } from "../SocketConfig" import { socket } from "../SocketConfig"
import { colorToEmoji, positionToColor } from "../ColorHelper"; import { colorToEmoji, positionToColor } from "../ColorHelper";
import { ColorToHexa } from "../model/EnumExtender"; import { ColorToHexa } from "../model/EnumExtender";
import Bot from "../model/Bot";
interface MyGraphComponentProps { interface MyGraphComponentProps {
@ -29,6 +30,8 @@ interface MyGraphComponentProps {
handleTurnBarTextChange: (newTurnBarText: string) => void handleTurnBarTextChange: (newTurnBarText: string) => void
setPlayerTouched: (newPlayerTouch: number) => void; setPlayerTouched: (newPlayerTouch: number) => void;
playerTouched: number playerTouched: number
changecptTour: (newcptTour : number) => void
solo : boolean
} }
let lastAskingPlayer = 0 let lastAskingPlayer = 0
@ -40,14 +43,14 @@ let mapIndexPersons: Map<number, Person[]> = new Map<number, Person[]>()
let touchedPlayer = -1 let touchedPlayer = -1
const MyGraphComponent: React.FC<MyGraphComponentProps> = ({onNodeClick, handleShowTurnBar, handleTurnBarTextChange, playerTouched, setPlayerTouched}) => { const MyGraphComponent: React.FC<MyGraphComponentProps> = ({onNodeClick, handleShowTurnBar, handleTurnBarTextChange, playerTouched, setPlayerTouched, changecptTour, solo}) => {
let cptTour: number = 0
const { indices, indice, person, personNetwork, setNodeIdData, players, askedPersons, setActualPlayerIndexData, room, actualPlayerIndex, turnPlayerIndex, setWinnerData } = useGame(); const { indices, indice, person, personNetwork, setNodeIdData, players, askedPersons, setActualPlayerIndexData, room, actualPlayerIndex, turnPlayerIndex, setWinnerData } = useGame();
const params = new URLSearchParams(window.location.search); const params = new URLSearchParams(window.location.search);
const solotmp = params.get('solo');
const navigate = useNavigate(); const navigate = useNavigate();
console.log(person)
useEffect(() =>{ useEffect(() =>{
touchedPlayer=playerTouched touchedPlayer=playerTouched
@ -78,12 +81,9 @@ const MyGraphComponent: React.FC<MyGraphComponentProps> = ({onNodeClick, handleS
} }
let thisPlayerIndex = index let thisPlayerIndex = index
if (first){ if (first){
first = false first = false
if (solotmp == "false"){
solo=false
}
if (!solo){ if (!solo){
for(let i = 0; i<indices.length; i++){ for(let i = 0; i<indices.length; i++){
mapIndexPersons.set(i, []) mapIndexPersons.set(i, [])
@ -259,7 +259,6 @@ const MyGraphComponent: React.FC<MyGraphComponentProps> = ({onNodeClick, handleS
if (node != undefined){ if (node != undefined){
for(let i=0; i<players.length; i++){ for(let i=0; i<players.length; i++){
if (node.label.includes(colorToEmoji(positionToColor(i), false)) || !tester.Works(pers)){ if (node.label.includes(colorToEmoji(positionToColor(i), false)) || !tester.Works(pers)){
console.log(tester.Works(pers))
tabNodes.push(node) tabNodes.push(node)
break break
} }
@ -279,31 +278,31 @@ const MyGraphComponent: React.FC<MyGraphComponentProps> = ({onNodeClick, handleS
}) })
personNetwork.getPersons().forEach(p => { personNetwork.getPersons().forEach(p => {
let a = 0 let a = 0
for (let i of indices){ for (let i of indices){
let tester = IndiceTesterFactory.Create(i) let tester = IndiceTesterFactory.Create(i)
if (tester.Works(p)){ if (tester.Works(p)){
a++ a++
}
} }
} if (a==indices.length){
if (a==indices.length){ //networkData.nodes.update({id: p.getId(), label: p.getName() + "\n🔵"})
//networkData.nodes.update({id: p.getId(), label: p.getName() + "\n🔵"}) console.log(p)
console.log(p) }
}
});
});
// Gérer le changement entre la physique et le déplacement manuel // Gérer le changement entre la physique et le déplacement manuel
network.on("dragging", (params) => { network.on("dragging", (params) => {
if (params.nodes.length > 0) { if (params.nodes.length > 0) {
// Un nœud a été cliqué // Un nœud a été cliqué
initialOptions.physics.enabled = false; initialOptions.physics.enabled = false;
network.setOptions(initialOptions); network.setOptions(initialOptions);
} }
}); });
network.on("click", async (params) => { network.on("click", async (params) => {
@ -327,10 +326,15 @@ const MyGraphComponent: React.FC<MyGraphComponentProps> = ({onNodeClick, handleS
} }
} }
} }
else if(touchedPlayer != - 1 && playerIndex == actualPlayerIndex && touchedPlayer<players.length){ else if(touchedPlayer != -1 && playerIndex == actualPlayerIndex && touchedPlayer<players.length){
socket.emit("ask player", params.nodes[0], players[touchedPlayer].id, players.find((p) => p.id === socket.id, actualPlayerIndex)) if (players[touchedPlayer] instanceof Bot){
socket.emit("put correct background", socket.id) console.log("BOT")
touchedPlayer=-1 }
else{
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)
touchedPlayer=-1
}
} }
else if(playerIndex == actualPlayerIndex && touchedPlayer==players.length){ else if(playerIndex == actualPlayerIndex && touchedPlayer==players.length){
const person = personNetwork?.getPersons().find((p) => p.getId() == params.nodes[0]) const person = personNetwork?.getPersons().find((p) => p.getId() == params.nodes[0])
@ -392,6 +396,8 @@ const MyGraphComponent: React.FC<MyGraphComponentProps> = ({onNodeClick, handleS
} }
index++ index++
} }
cptTour ++; // On Incrémente le nombre de tour du joueur
changecptTour(cptTour); // On le transmet a la page précédente avec la fonction
} }
} }
} }

@ -16,6 +16,6 @@ const TurnBar: React.FC<TurnBarProps> = ({text})=> {
<p>{text}</p> <p>{text}</p>
</div> </div>
); );
}; };
export default TurnBar; export default TurnBar;

@ -60,6 +60,22 @@
top :50px; top :50px;
} }
.nbLaps{ /*nombre de tour*/
position: absolute;
z-index: 1;
left: 10px;
top :50px;
margin: 10px 20px;
padding: 20px;
border-radius: 15px;
border: solid 2px;
font-size: 30px;
color: #fff;
}
#endgamebutton{ #endgamebutton{
position: absolute; position: absolute;
z-index: 1; z-index: 1;

@ -10,6 +10,7 @@ import ChoiceBar from '../Components/ChoiceBar';
import ButtonImgNav from '../Components/ButtonImgNav'; import ButtonImgNav from '../Components/ButtonImgNav';
import PersonStatus from '../Components/PersonStatus'; import PersonStatus from '../Components/PersonStatus';
import PlayerList from '../Components/PlayerList'; import PlayerList from '../Components/PlayerList';
import TurnBar from '../Components/TurnBar';
/* Icon */ /* Icon */
import Leave from "../res/icon/leave.png"; import Leave from "../res/icon/leave.png";
@ -32,50 +33,67 @@ import { HiLanguage } from 'react-icons/hi2';
import { Nav, NavDropdown } from 'react-bootstrap'; import { Nav, NavDropdown } from 'react-bootstrap';
import { FormattedMessage } from 'react-intl'; import { FormattedMessage } from 'react-intl';
import Color from '../model/Color'; import Color from '../model/Color';
import TurnBar from '../Components/TurnBar';
import { useGame } from '../Contexts/GameContext'; import { useGame } from '../Contexts/GameContext';
//@ts-ignore //@ts-ignore
const InGame = ({locale, changeLocale}) => { const InGame = ({locale, changeLocale}) => {
const theme = useTheme(); const theme = useTheme();
const [showChoiceBar, setShowChoiceBar] = useState(false);
const [showTurnBar, setShowTurnBar] = useState(false);
const [turnBarText, setTurnBarText] = useState("");
const [playerTouched, setPlayerTouched] = useState(-2)
const handleNodeClick = (shouldShowChoiceBar: boolean) => {
setShowChoiceBar(shouldShowChoiceBar); const params = new URLSearchParams(window.location.search);
};
//* Gestion solo
let IsSolo: boolean = true
const solotmp = params.get('solo');
if (solotmp == "false"){
IsSolo=false
}
const [showChoiceBar, setShowChoiceBar] = useState(false);
const [showTurnBar, setShowTurnBar] = useState(false);
const [turnBarText, setTurnBarText] = useState("");
const [playerTouched, setPlayerTouched] = useState(-2)
const handleNodeClick = (shouldShowChoiceBar: boolean) => {
setShowChoiceBar(shouldShowChoiceBar);
};
const handleSetPlayerTouched = (newPlayerTouched: number) => { const handleSetPlayerTouched = (newPlayerTouched: number) => {
setPlayerTouched(newPlayerTouched); setPlayerTouched(newPlayerTouched);
}; };
const handleShowTurnBar = (shouldShowTurnBar: boolean) => { const handleShowTurnBar = (shouldShowTurnBar: boolean) => {
setShowTurnBar(shouldShowTurnBar); setShowTurnBar(shouldShowTurnBar);
}; };
const handleTurnBarTextChange = (newTurnBarText: string) =>{
setTurnBarText(newTurnBarText)
}
/* 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 handleTurnBarTextChange = (newTurnBarText: string) =>{
const handleCloseS = () => setShowS(false); setTurnBarText(newTurnBarText)
const handleShowS = () => setShowS(true); }
/* 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);
//@ts-ignore
const changecptTour = (newcptTour) => {
setcptTour(newcptTour);
};
const handleChange = () => { const handleChange = () => {
if (show){ if (show){
@ -119,9 +137,20 @@ const InGame = ({locale, changeLocale}) => {
<div id="mainDiv"> <div id="mainDiv">
{showTurnBar && <TurnBar text={turnBarText}/>} {showTurnBar && <TurnBar text={turnBarText}/>}
<div id='graphDiv'> <div id='graphDiv'>
<GraphContainer onNodeClick={handleNodeClick} handleShowTurnBar={handleShowTurnBar} handleTurnBarTextChange={handleTurnBarTextChange} playerTouched={playerTouched} setPlayerTouched={handleSetPlayerTouched}/> <GraphContainer onNodeClick={handleNodeClick} handleShowTurnBar={handleShowTurnBar} handleTurnBarTextChange={handleTurnBarTextChange} changecptTour={changecptTour} solo={IsSolo} setPlayerTouched={handleSetPlayerTouched} playerTouched={playerTouched} />
</div> </div>
{IsSolo &&
<div className='nbLaps' style={{
backgroundColor: theme.colors.primary,
borderColor: theme.colors.secondary
}}>
Tour : {cptTour}
</div>
}
<div className='paramDiv'> <div className='paramDiv'>
<button className='button' <button className='button'
style={{ style={{

@ -46,15 +46,15 @@ function Lobby() {
useEffect(() => { useEffect(() => {
if (first){ if (first){
first = false first=false
socket.emit("lobby joined", room, new Human(socket.id, "Test" + Math.floor(Math.random() * 100)).toJson()) socket.emit("lobby joined", room, new Human("test", "Test" + Math.floor(Math.random() * 100)).toJson())
return () => { return () => {
socket.off('game created'); socket.off('game created');
}; };
} }
}, []); }, [socket.id]);
socket.on("game created", (jsonNetwork, jsonPersonString, jsonIndicesString, playerIndex)=> { socket.on("game created", (jsonNetwork, jsonPersonString, jsonIndicesString, playerIndex)=> {
const jsonPerson = JSON.parse(jsonPersonString) const jsonPerson = JSON.parse(jsonPersonString)

@ -0,0 +1,107 @@
.upperInfo{
display: flex;
justify-content: center;
flex-direction: column;
align-items: center;
width: 30%;
border-radius: 0px 0px 30px 30px;
border: solid;
border-width: 2px 5px;
background-color: white;
font-size: 30px;
top: 20px;;
}
#mainDiv{
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
}
.paramDiv{
z-index: 1;
position: absolute;
top: 10px;
right: 10px;
}
#graphDiv{
display: flex;
flex-direction: row;
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
}
#bottom-container{
bottom: 0;
background-color: white;
padding:20px;
border-radius: 20px 20px 0px 0px;
}
.nbLaps{
position: absolute;
z-index: 1;
left: 10px;
top :50px;
margin: 10px 20px;
padding: 20px;
border-radius: 15px;
border: solid 2px;
font-size: 30px;
color: #fff;
}
#endgamebutton{
position: absolute;
z-index: 1;
bottom: 0;
right: 25%;
}
.upperInfo,
#bottom-container,
.menuGame {
position: absolute;
z-index: 1;
}
.menuGame{
display: flex;
align-items: space-between;
justify-content: end;
flex-direction: column;
top:30%;
right: 0;
}
.menuGame Button {
margin: 10px;
}
.button{
/*background-color: #85C9C2;*/
border: solid 2px #85C9C2;
border-radius: 10px;
width: 100px;
height: 60px;
}

@ -0,0 +1,236 @@
import React, { useState } from 'react';
import Switch from "react-switch";
/* Style */
import "./SoloGame.css"
import {useTheme} from '../Style/ThemeContext'
/* Component */
import GraphContainer from '../Components/GraphContainer';
import ChoiceBar from '../Components/ChoiceBar';
import ButtonImgNav from '../Components/ButtonImgNav';
import PersonStatus from '../Components/PersonStatus';
import PlayerList from '../Components/PlayerList';
/* Icon */
import Leave from "../res/icon/leave.png";
import Param from "../res/icon/param.png";
import Replay from "../res/icon/replay.png";
import Info from "../res/icon/infoGreen.png";
import Check from "../res/icon/checkboxGreen.png";
import Alpha from "../res/GreekLetters/alphaW.png";
/* nav */
import { Link } from 'react-router-dom';
/* Boostrap */
import Button from 'react-bootstrap/Button';
import Offcanvas from 'react-bootstrap/Offcanvas';
/* Model */
import Stub from '../model/Stub';
import { HiLanguage } from 'react-icons/hi2';
import { Nav, NavDropdown } from 'react-bootstrap';
import { FormattedMessage } from 'react-intl';
import Color from '../model/Color';
import TurnBar from '../Components/TurnBar';
import { useGame } from '../Contexts/GameContext';
//@ts-ignore
const SoloGame = ({locale, changeLocale}) => {
const theme = useTheme();
const [showChoiceBar, setShowChoiceBar] = useState(false);
const [showTurnBar, setShowTurnBar] = useState(false);
const handleNodeClick = (shouldShowChoiceBar: boolean) => {
setShowChoiceBar(shouldShowChoiceBar);
};
const handleShowTurnBar = (shouldShowTurnBar: boolean) => {
setShowTurnBar(shouldShowTurnBar);
};
/* 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 handleChange = () => {
if (show){
handleClose()
}
else {
handleShow()
}
};
// const handleChangeP = () => {
// if (showP){
// handleCloseP()
// }
// else {
// handleShowP()
// }
// };
const handleChangeS = () => {
if (showS){
handleCloseS()
}
else {
handleShowS()
}
};
/* Windows open */
//@ts-ignore
const openInNewTab = (url) => { //! avec url ==> dangereux
window.open(url);
};
const [SwitchEnabled, setSwitchEnabled] = useState(false)
const indices = Stub.GenerateIndice()
const { indice, players } = useGame();
return (
<div id="mainDiv">
<TurnBar text="je suis dans la page solo"/>
<div id='graphDiv'>
{/* <GraphContainer onNodeClick={handleNodeClick} handleShowTurnBar={handleShowTurnBar} FromSolo={true}/> */}
</div>
<div className='nbLaps' style={{
backgroundColor: theme.colors.primary,
borderColor: theme.colors.secondary
}}>
Tour : 5
</div>
<div className='paramDiv'>
<button className='button'
style={{
backgroundColor: theme.colors.primary,
borderColor: theme.colors.secondary
}}
onClick={handleChangeS}>
<img src={Param} alt="paramètres" height='40'/>
</button>
</div>
<div className='menuGame'>
<Link to='/info' target='_blank'>
<button className='button'
style={{
backgroundColor: theme.colors.primary,
borderColor: theme.colors.secondary
}}>
<img src={Info} alt="info" height="40"/>
</button>
</Link>
{/* <button className='button' onClick={() => openInNewTab('http://localhost:3000/play')}> //! avec url =={'>'} dangereux
<img src={Check} alt="check" height="40"/>
</button> */}
<Link to='/info' target='_blank'>
<button className='button'
style={{
backgroundColor: theme.colors.primary,
borderColor: theme.colors.secondary
}}>
<img src={Check} alt="check" height="40"/>
</button>
</Link>
<button className='button' onClick={handleChange}
style={{
backgroundColor: theme.colors.primary,
borderColor: theme.colors.secondary
}}>
<img src={Alpha} alt="indice" height="40"/>
</button>
</div>
{/* <Offcanvas show={showP}
onHide={handleCloseP}>
<Offcanvas.Header closeButton>
<Offcanvas.Title>Joueurs</Offcanvas.Title>
<h3>Il y a {players.length} joueurs</h3>
</Offcanvas.Header>
<Offcanvas.Body>
<PlayerList players={players} />
</Offcanvas.Body>
</Offcanvas> */}
<Offcanvas show={show}
onHide={handleClose}
placement='end'
scroll={true}
backdrop={false}
style={{ height: '20%', width: '25%', top: '60vh' }}>
<Offcanvas.Header closeButton>
<Offcanvas.Title>Indice</Offcanvas.Title>
</Offcanvas.Header>
<Offcanvas.Body>
{/* Possède les cheveux noir <u>ou</u> joue au basket */}
{indice?.ToString(locale)}
</Offcanvas.Body>
</Offcanvas>
{
//* canva pour les paramètres
}
<Offcanvas show={showS}
onHide={handleCloseS}
placement='top'
style={{height: '30%', width: '30%', left: '70%' }}>
<Offcanvas.Header closeButton>
<Offcanvas.Title><img src={Param} alt='param'/> Paramètres</Offcanvas.Title>
</Offcanvas.Header>
<Offcanvas.Body>
<Nav className="me-auto">
<NavDropdown
title={<span><HiLanguage/> Language </span>}
className="navbar-title" id="basic-nav-dropdown">
<NavDropdown.Item onClick={() => changeLocale('fr')}>
<FormattedMessage id="languageSelector.french"/>
</NavDropdown.Item>
<NavDropdown.Item onClick={() => changeLocale('en')}>
<FormattedMessage id="languageSelector.english"/>
</NavDropdown.Item>
</NavDropdown>
</Nav>
<label>
<Switch checked={SwitchEnabled} onChange={setSwitchEnabled}/>
<p>Afficher les noeuds possibles</p>
</label>
</Offcanvas.Body>
</Offcanvas>
<div id="bottom-container">
{showChoiceBar && <ChoiceBar />}
</div>
{/*
<div id="endgamebutton" > {/* tmp
<ButtonImgNav dest="/endgame" img={Leave} text='endgame'/>
</div>
*/}
</div>
);
};
export default SoloGame;

6
package-lock.json generated

@ -0,0 +1,6 @@
{
"name": "Cryptid",
"lockfileVersion": 3,
"requires": true,
"packages": {}
}
Loading…
Cancel
Save