Files
main-website/poker-paf/old/game.js
T
2026-04-27 06:52:16 +00:00

313 lines
12 KiB
JavaScript

const mysql = require('mysql2');
const connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: '',
database: 'poker_paf'
});
let actualPlayerID = null; // Variable globale pour stocker l'ID du joueur actuel
let actualGameID = null; // Variable globale pour stocker l'ID de la partie actuelle
let playerChips = {}; // Objet pour stocker les jetons de chaque joueur
let playerNames = {}; // Objet pour stocker les noms de chaque joueur
let startBlind = 20; // Blinde de départ à prendre depuis la BDD
let blinds = {}; // Objet pour stocker les blinds de chaque joueur
// ############################################################################################################################
let current_blind = 0; // Initialisation de la blinde actuelle en variable globale, mis à jour automatiquement
function changePlayer() { // Uniquement pour les tests, à remplacer par une fonction qui change de joueur dans la Boucle de jeu
// Récupération du joueur actuel depuis la base de données
connection.connect(err => {
if (err) {
console.error('Erreur de connexion : ' + err.stack);
return;
}
console.log('Connecté à MySQL avec l\'ID ' + connection.threadId);
});
const sql = "SELECT current_player_id FROM games WHERE game_id = ?";
const values = [actualGameID];
connection.query(sql, values, (error, results) => {
if (error) {
console.error('Erreur lors de la récupération du joueur actuel : ' + error.stack);
return;
}
if (results.length > 0) {
actualPlayerID = results[0].current_player_id;
console.log('Joueur actuel : ' + actualPlayerID);
} else {
console.log('Aucun résultat trouvé pour le joueur actuel.');
}
});
// Changement du joueur actuel dans la base de données (pour les tests)
// On cherche le numéro d'ID du joueur suivant l'actuel qui a le même game_id
const sql2 = "SELECT player_id FROM players WHERE game_id = ? AND player_id > ? ORDER BY player_id ASC LIMIT 1";
const values2 = [actualGameID, actualPlayerID];
connection.query(sql2, values2, (error, results) => {
if (error) {
console.error('Erreur lors de la récupération du joueur suivant : ' + error.stack);
return;
}
if (results.length > 0) {
const nextPlayerID = results[0].player_id;
const sqlUpdate = "UPDATE games SET current_player_id = ? WHERE game_id = ?";
const valuesUpdate = [nextPlayerID, actualGameID];
connection.query(sqlUpdate, valuesUpdate, (error, results) => {
if (error) {
console.error('Erreur lors de la mise à jour du joueur actuel : ' + error.stack);
return;
}
console.log('Joueur actuel mis à jour avec succès.');
});
} else {
console.log('Aucun résultat trouvé pour le joueur suivant.');
}
});
console.log('Changement de joueur : ' + player);
}
function UpdateStatus() { // Fonction mettant à jour la blinde actuel en fonction des blinds de chaque joueur
current_blind = Math.max(...Object.values(blinds));
}
function UpdateLabels() { // Fonction pour mettre à jour les labels
let pot = Object.values(blinds).reduce((a, b) => a + b, 0);
let money_labels = {}
for (key of Object.keys(money)) {
money_labels[key] = money[key] - blinds[key];
}
for (const key of Object.keys(money_labels)) {
const label = document.getElementById(`label-${key}`);
if (label) {
label.innerText = money_labels[key] + " 🪙";
}
}
}
function SeCoucher() { // fonction pour se coucher, elle vérifie si le joueur est en jeu et si sa mise actuelle est inférieure a la blinde actuel, si c'est le cas, il se couche et est retiré de la liste des joueurs encore en jeu
UpdateStatus();
if (current_blind > blinds[current_player] && player_list.includes(current_player)) { // Si le joueur est en jeu et que sa mise actuelle est inférieure a la blinde actuel, il se couche
player_list.splice(player_list.indexOf(current_player), 1);
}
UpdateLabels();
}
function Suivre() {
if (player_list.includes(current_player)) { // Si le joueur est en jeu, il suit
UpdateStatus();
if (current_blind > blinds[current_player] && money[current_player] >= current_blind) { // Si la blinde actuelle est supérieur a la sienne et qu'il est en capacité de la payer
blinds[current_player] = current_blind;
} else {
Tapis();
}
UpdateLabels();
}
}
function Relancer() {
if (player_list.includes(current_player)) { // Si le joueur est en jeu
UpdateStatus();
if (+money_input.value >= Math.max(...Object.values(money))){
Tapis();
} else {
if (money[current_player] > (current_blind) && +money_input.value <= money[current_player] - current_blind && +money_input.value > 0 && +money_input.value % (start_blind / 2) == 0) { // Si le joueur a assez d'argent pour suivre la blinde actuelle et relancer
blinds[current_player] = current_blind + +money_input.value;
}
}
UpdateLabels();
}
}
function Tapis() {
if (player_list.includes(current_player)) { // Si le joueur est en jeu, il fait tapis
UpdateStatus();
if (money[current_player] < Math.max(...Object.values(money))) { // Si le joueur n'est pas le plus riche
blinds[current_player] = money[current_player];
} else { // Si le joueur est le plus riche
let temp_money = {...money};
temp_money[current_player] = 0;
let second_most_rich = Math.max(...Object.values(temp_money));
blinds[current_player] = second_most_rich;
}
UpdateLabels();
}
}
// Fonction pour mettre à jour les jetons (Chips)
function updateChips(playerId, amount, btnElement) {
// 1. MISE À JOUR VISUELLE IMMÉDIATE (Optimiste)
const playerCard = btnElement.closest('.player-card');
const chipsDisplay = playerCard.querySelector('.player-chips');
// On sauvegarde l'ancienne valeur au cas où le serveur plante
const oldChipsValue = chipsDisplay.innerText;
let currentChips = parseInt(oldChipsValue);
let newChips = currentChips + amount;
// On change l'affichage tout de suite
chipsDisplay.innerHTML = newChips + " 🪙";
// 2. ENVOI À LA BASE DE DONNÉES
const formData = new FormData();
formData.append('player_id', playerId);
formData.append('amount', amount);
fetch('update_chips.php', {
method: 'POST',
body: formData
})
.then(response => response.text()) // On récupère en texte pour débugger
.then(text => {
try {
const data = JSON.parse(text);
if (!data.success) {
throw new Error(data.message);
}
console.log("Sync DB OK pour joueur " + playerId);
} catch (e) {
// 3. ANNULATION SI ERREUR
console.error("Erreur serveur, retour à l'ancien solde. Réponse reçue :", text);
chipsDisplay.innerHTML = oldChipsValue;
alert("Erreur de synchronisation : " + text);
}
})
.catch(error => {
chipsDisplay.innerHTML = oldChipsValue;
console.error('Erreur réseau :', error);
});
}
let currentStep = 0;
const steps = [
{ text: "Mélangez et distribuez les cartes (2 par joueur)", btn: "C'est fait !" },
{ text: "Au tour de J1 : Posez la Petite Blind", btn: "OK" },
{ text: "Au tour de J2 : Posez la Grosse Blind", btn: "OK" },
{ text: "Place au jeu ! Suivez les tours en bas.", btn: "Masquer le guide" }
];
function nextStep() {
const guideBox = document.getElementById('game-guide');
const textZone = document.getElementById('guide-text');
const btnZone = document.getElementById('guide-btn');
if (currentStep < steps.length) {
textZone.innerText = steps[currentStep].text;
btnZone.innerText = steps[currentStep].btn;
currentStep++;
} else {
// Une fois fini, on cache le guide ou on le réduit
guideBox.style.display = 'none';
// Ici, on pourrait activer les boutons d'action (Suivre, Miser...)
enableActions(true);
}
}
function enableActions(status) {
const btns = document.querySelectorAll('.btn-action, .btn-gold, .btn-validate');
btns.forEach(b => b.disabled = !status);
if(!status) {
document.querySelector('.action-panel').style.opacity = "0.5";
} else {
document.querySelector('.action-panel').style.opacity = "1";
}
}
// Au chargement, on bloque les actions tant que le guide n'est pas fini
window.onload = () => enableActions(false);
// Ta fonction deleteGame déjà existante (rappel)
function deleteGame(idPartie) {
if (confirm("Supprimer la partie ?")) {
let formData = new FormData();
formData.append('game_id', idPartie);
fetch('delete_game.php', { method: 'POST', body: formData })
.then(() => window.location.href = 'index.php');
}
}
function playerAction(type) {
const raiseInput = document.getElementById('raise-amount');
let amount = (type === 'raise') ? raiseInput.value : 0;
const gameId = new URLSearchParams(window.location.search).get('game_id');
// On prépare les données pour le PHP
let fd = new FormData();
fd.append('action', type);
fd.append('amount', amount);
fd.append('game_id', gameId);
fetch('play_action.php', { method: 'POST', body: fd })
.then(r => r.json())
.then(data => {
if (data.success) {
// --- ÉTAPE 1 : Gérer le Halo (Tu m'as dit que ça c'est OK) ---
document.querySelectorAll('.player-info').forEach(p => p.classList.remove('active'));
// On trouve la "carte" du nouveau joueur grâce à son ID
const nextPlayerSlot = document.querySelector(`[data-id="${data.next_player_id}"]`);
const nextInfoBox = nextPlayerSlot.querySelector('.player-info');
nextInfoBox.classList.add('active');
// --- ÉTAPE 2 : Mettre à jour le NOM en bas (C'est ça qui te manque) ---
// On récupère le texte du nom à l'intérieur de la carte du nouveau joueur
const nextNameRaw = nextInfoBox.querySelector('.player-name').innerText;
// On nettoie un peu le texte (pour enlever le "J1 :" par exemple)
const cleanName = nextNameRaw.split(':').pop().trim();
// On l'injecte dans le texte "Au tour de : ..."
document.getElementById('active-player-name').innerText = cleanName;
// --- ÉTAPE 3 : Mettre à jour le POT et vider l'input ---
if(data.new_pot) document.getElementById('main-pot').innerText = data.new_pot;
if(raiseInput) raiseInput.value = "";
}
})
.catch(err => console.error("Erreur action:", err));
}
function startNewRound() {
// Récupère l'ID dans l'URL (?game_id=4)
const urlParams = new URLSearchParams(window.location.search);
const gId = urlParams.get('game_id');
if (!gId) return alert("ID de partie manquant dans l'URL !");
let fd = new FormData();
fd.append('game_id', gId);
fetch('next_round.php', {
method: 'POST',
body: fd
})
.then(r => r.json())
.then(data => {
if (data.success) {
location.reload(); // On recharge pour voir le nouveau Dealer
}
})
.catch(err => console.error("Erreur bouton :", err));
}
function closeTable() {
if (confirm("Fermer la table ?")) {
// Supprimer la partie et les joueurs associés à la partie dans la db
const gameId = new URLSearchParams(window.location.search).get('game_id');
fetch('delete_game.php', {
method: 'POST',
body: new URLSearchParams({'game_id': gameId})
})
.then(() => window.location.href = 'index.php');
}
}