Index.php

Page d'accueil, selection des vaisseau

2. Communication Serveur (AJAX)

updateRadar()
Polling Radar
🎯 Utilité Met à jour la liste des autres joueurs en attente.
⚙️ Fonctionnement Envoie une requête POST vers action_game.php (action: 'get_radar'). Reçoit un tableau JSON. Si le tableau contient des joueurs, met à jour la liste HTML #ready-players-list. Sinon, affiche un message "Aucun signal".
function updateRadar() {
    $.ajax({
        url: 'api/action_game.php',
        type: 'POST',
        data: { action: 'get_radar' },
        dataType: 'json',
        success: function(res) {
            if(res.success && res.players) {
                const list = $('#ready-players-list');
                const countSpan = $('#player-count');
                const msg = $('#no-players-msg');
                list.empty();
                countSpan.text(res.players.length);

                if (res.players.length === 0) msg.show().text("Aucun signal détecté...");
                else {
                    msg.hide();
                    res.players.forEach(p => {
                        let nameStyle = p.is_me ? 'color: #63b3ed; font-weight: bold;' : 'color: #e2e8f0;';
                        let suffix = p.is_me ? ' (Vous)' : '';
                        list.append(`
  • ${p.login_user}${suffix}
  • `); }); } } } }); }
    checkLobbyStatus()
    Polling Statut
    🎯 Utilité Vérifie si je suis "Prêt" et surtout si un adversaire m'a été attribué (Matchmaking).
    ⚙️ Fonctionnement Interroge le serveur. Si un opponent_id est renvoyé, redirige immédiatement vers univers.php. Sinon, met à jour l'état local (lobbyState) et rafraîchit l'apparence des boutons.
    function checkLobbyStatus() {
        $.ajax({
            url: 'api/action_game.php',
            type: 'POST',
            data: { action: 'check_lobby_status' },
            dataType: 'json',
            success: function(data) {
                if (data.opponent_id) window.location.href = 'univers.php';
                lobbyState = data.am_i_ready; 
                updateActionBar();
            }
        });
    }
    $('#mainActionBtn').click()
    Action Principale
    🎯 Utilité Gère le clic sur le bouton "JOUER" ou "ANNULER". C'est l'envoi de la flotte.
    ⚙️ Fonctionnement Détermine l'action (join ou cancel) selon l'état actuel. Si on rejoint, transforme la flotte locale (myFleet) en un tableau simple d'IDs pour le PHP. Envoie la requête AJAX et gère les erreurs.
    $('#mainActionBtn').click(function() {
        let currentAction = (lobbyState === 1) ? 'cancel_lobby' : 'join_lobby';
        let requestData = { action: currentAction };
    
        if (currentAction === 'join_lobby') {
            // On formate la flotte en un tableau d'objets simple pour PHP
            requestData.fleet = myFleet.map(s => ({ ship_id: s.shipId }));
        }
    
        $.ajax({
            url: 'api/action_game.php',
            type: 'POST',
            data: requestData,
            dataType: 'json',
            success: function(resp) {
                if(!resp.success && resp.msg) {
                    alert("Erreur: " + resp.msg);
                }
                checkLobbyStatus();
            },
            error: function() {
                alert("Erreur de connexion au QG.");
            }
        });
    });

    3. Gestion de la Flotte

    fillFleetRandomly()
    Feature "Auto-Fill"
    🎯 Utilité Permet au joueur de remplir sa flotte instantanément avec 5 vaisseaux aléatoires (parmi ceux débloqués).
    ⚙️ Fonctionnement 1. Filtre DB_SHIPS pour ne garder que les vaisseaux débloqués.
    2. Utilise sort(0.5 - Math.random()) pour mélanger.
    3. Sélectionne les 5 premiers et met à jour myFleet.
    function fillFleetRandomly() {
        myFleet = [];
        let unlockedShips = DB_SHIPS.filter(s => USER_VICTORIES >= s.victoires_necessaire);
        if (unlockedShips.length < 5) {
            alert("Pas assez de vaisseaux débloqués (min 5).");
            return;
        }
        let shuffled = [...unlockedShips].sort(() => 0.5 - Math.random());
        shuffled.slice(0, 5).forEach(s => {
            myFleet.push({ shipId: s.id, shipName: s.nom, type: s.type, hp: s.points_vie });
        });
        renderFleet();
    }
    renderFleet()
    Rendu Visuel
    🎯 Utilité Met à jour l'affichage des 5 slots de vaisseaux à l'écran.
    ⚙️ Fonctionnement Vide le conteneur HTML. Boucle sur le tableau myFleet et injecte le HTML de chaque carte vaisseau. Si la flotte n'est pas pleine, ajoute une carte "Slot Vide" cliquable.
    function renderFleet() {
        const container = $('#fleet-container');
        container.empty();
        myFleet.forEach((slot, index) => {
            container.append(`
                
    ${slot.shipName} ${slot.type.toUpperCase()} PV: ${slot.hp}
    `); }); if (myFleet.length < 5) { container.append(`
    +
    AJOUTER
    ${myFleet.length + 1} / 5
    `); } updateActionBar(); }
    addShipToFleet(id) / removeShip(index)
    Manipulation Données
    🎯 Utilité Ajoute ou retire un vaisseau du tableau local myFleet.
    ⚙️ Fonctionnement add : Vérifie les conditions de victoire. Push dans le tableau et ferme la modale.
    remove : Utilise splice pour supprimer l'élément à l'index donné.
    window.addShipToFleet = function(id) {
        let s = DB_SHIPS.find(x => x.id == id);
        if (USER_VICTORIES < s.victoires_necessaire) return;
        myFleet.push({ shipId: s.id, shipName: s.nom, type: s.type, hp: s.points_vie });
        closeModals();
        renderFleet();
    };
    
    window.removeShip = function(index) { 
        myFleet.splice(index, 1); 
        renderFleet(); 
    };

    4. Interface & Modale

    renderShipTable()
    Liste de Sélection
    🎯 Utilité Génère et affiche la liste des vaisseaux dans la fenêtre modale (Pop-up) pour que le joueur puisse choisir.
    ⚙️ Fonctionnement Boucle sur DB_SHIPS. Applique les filtres de recherche. Vérifie si le vaisseau est verrouillé (pas assez de victoires). Génère le tableau HTML avec boutons "Choisir" ou "Verrouillé".
    function renderShipTable() {
        const tbody = $('#shipTableBody');
        tbody.empty();
        let filter = $('#searchShip').val().toLowerCase();
        let takenIds = myFleet.map(s => s.shipId);
    
        DB_SHIPS.forEach(ship => {
            if (filter && !ship.nom.toLowerCase().includes(filter) && !ship.type.toLowerCase().includes(filter)) return;
            if (takenIds.includes(ship.id)) return;
    
            let isLocked = USER_VICTORIES < ship.victoires_necessaire;
            let btn = isLocked 
                ? ``
                : ``;
    
            tbody.append(`
                
                    ${ship.nom}
                    ${ship.type}
                    ${ship.points_vie}
                    ${btn}
                
            `);
        });
    }
    updateActionBar()
    Barre d'État
    🎯 Utilité Met à jour l'apparence et le texte du bouton principal en bas de page.
    ⚙️ Fonctionnement Change les classes CSS du bouton.
    Si "En recherche" : Bouton rouge (Annuler).
    Si Flotte pleine : Bouton vert (Jouer).
    Sinon : Bouton gris (Désactivé).
    function updateActionBar() {
        let btn = $('#mainActionBtn');
        let txt = $('#status-text');
        btn.removeClass('btn-play btn-cancel btn-disabled').prop('disabled', false);
    
        if (lobbyState === 1) {
            btn.text("ANNULER RECHERCHE").addClass('btn-cancel');
            txt.text("RECHERCHE D'ADVERSAIRE...");
            $('.btn-remove, .slot-empty').css('pointer-events', 'none').css('opacity', '0.5');
            return;
        }
        $('.btn-remove, .slot-empty').css('pointer-events', 'auto').css('opacity', '1');
        
        if (myFleet.length === 5) {
            btn.text("LANCER LE COMBAT").addClass('btn-play');
            txt.text("FLOTTE OPÉRATIONNELLE");
        } else {
            btn.text(`EN ATTENTE (${myFleet.length}/5)`).addClass('btn-disabled').prop('disabled', true);
            txt.text(`Sélectionnez 5 vaisseaux.`);
        }
    }
    sortTable(tableId, n)
    Utilitaire UI
    🎯 Utilité Permet de trier les colonnes du tableau par ordre alphabétique ou numérique.
    ⚙️ Fonctionnement Algorithme de "Tri à Bulles" appliqué directement au DOM. Compare les valeurs des cellules (TD) et les réordonne. Gère l'inversion de l'ordre au second clic.
    window.sortTable = function(tableId, n) {
        var table, rows, switching, i, x, y, shouldSwitch, dir, switchcount = 0;
        table = document.getElementById(tableId);
        switching = true; dir = "asc";
        while (switching) {
            switching = false; rows = table.rows;
            for (i = 1; i < (rows.length - 1); i++) {
                shouldSwitch = false;
                x = rows[i].getElementsByTagName("TD")[n];
                y = rows[i + 1].getElementsByTagName("TD")[n];
                let xVal = isNaN(x.innerHTML) ? x.innerHTML.toLowerCase() : parseFloat(x.innerHTML);
                let yVal = isNaN(y.innerHTML) ? y.innerHTML.toLowerCase() : parseFloat(y.innerHTML);
                if (dir == "asc") { if (xVal > yVal) { shouldSwitch = true; break; } } 
                else if (dir == "desc") { if (xVal < yVal) { shouldSwitch = true; break; } }
            }
            if (shouldSwitch) {
                rows[i].parentNode.insertBefore(rows[i + 1], rows[i]);
                switching = true; switchcount++;
            } else {
                if (switchcount == 0 && dir == "asc") { dir = "desc"; switching = true; }
            }
        }
    };