Logica_Equipo.js

import Soldado from "./Piezas/Soldado.js";
import Caballeria from "./Piezas/Caballeria.js";
import Comandante from "./Piezas/Comandante.js";
import Artilleria from "./Piezas/Artilleria.js";
import Tablero from "./Tablero.js";
import Pieza from "./Pieza.js";

/**
 * Clase que representa un equipo en el juego.
 * @class Equipo
 * @memberof Logica
 */
class Equipo {
    /**
     * Constructor del equipo.
     * @param {string} equipo - nombre del equipo ('J1' o 'J2')
     * @param {Tablero} tablero - tablero de juego
     * @param {boolean} generate - indica si se deben generar las piezas automáticamente
     * @constructor
     */
    constructor(equipo, tablero, generate = false) {
        this.equipo = equipo;
        this.tablero = tablero;
        this.piezas = [];  // Aquí guardamos las piezas del equipo

        // El máximo de piezas de cada tipo 
        this.Soldados = 16;
        this.Caballeria = 6;
        this.Artilleria = 1;
        this.Comandante = 1;

        // Solamente se genera desde la lista si no se han colocado las piezas
        if (generate) {
            if (this.equipo === "J1") {
                this.crearPiezasJ1();
            } else this.crearPiezasJ2();
        }

    }

    /**
     * Crea las piezas para el equipo J1 y las coloca en el tablero.
     */
    crearPiezasJ1() {
        const posicionesSoldadosJ1 = [
            // Columna 0 (primera)
            { x: 0, y: 0 }, { x: 1, y: 0 }, { x: 2, y: 0 }, { x: 3, y: 2 },
            { x: 4, y: 0 }, { x: 5, y: 0 }, { x: 6, y: 0 }, { x: 7, y: 0 },
            // Columna 1 (segunda)
            { x: 0, y: 1 }, { x: 2, y: 1 }, { x: 3, y: 1 }, { x: 5, y: 1 },
            { x: 6, y: 1 }, { x: 7, y: 1 },
            // Columna 2 (tercera)
            { x: 1, y: 2 }, { x: 6, y: 2 }
        ];

        const posicionesCaballeriasJ1 = [
            { x: 1, y: 1 }, { x: 4, y: 2 }, // Caballería reemplaza donde estaba comandante
            { x: 0, y: 2 }, { x: 2, y: 2 }, { x: 5, y: 2 }, { x: 7, y: 2 } // Columna 2
        ];
        
        const posicionComandanteJ1 = { x: 3, y: 0 }; // Columna 2 (más atrás) - reemplaza artillería
        const posicionArtilleria = { x: 4, y: 1 }; // Columna 1 (medio) - reemplaza caballería

        // Generamos las piezas para el equipo "J1" 
        for (let pos of posicionesSoldadosJ1) {
            let soldado = new Soldado(this.tablero, pos.x, pos.y, "J1");
            this.tablero.getCelda(pos.x, pos.y).setContenido(soldado);
            this.piezas.push(soldado);
        }

        for (let pos of posicionesCaballeriasJ1) {
            let caballeria = new Caballeria(this.tablero, pos.x, pos.y, "J1");
            this.tablero.getCelda(pos.x, pos.y).setContenido(caballeria)
            this.piezas.push(caballeria);
        }

        // Crear comandante
        let comandante = new Comandante(this.tablero, posicionComandanteJ1.x, posicionComandanteJ1.y, "J1");
        this.tablero.getCelda(posicionComandanteJ1.x, posicionComandanteJ1.y).setContenido(comandante);
        this.piezas.push(comandante);

        // Crear artilleria
        let artilleria = new Artilleria(this.tablero, posicionArtilleria.x, posicionArtilleria.y, "J1");
        this.tablero.getCelda(posicionArtilleria.x, posicionArtilleria.y).setContenido(artilleria);
        this.piezas.push(artilleria);
    }

    /**
     * Crea las piezas para el equipo J2 y las coloca en el tablero.
     */
    crearPiezasJ2() {
        const posicionesSoldadosJ2 = [
            // Columna 9 (última)
            { x: 0, y: 9 }, { x: 1, y: 9 }, { x: 2, y: 9 }, { x: 3, y: 7 },
            { x: 4, y: 9 }, { x: 5, y: 9 }, { x: 6, y: 9 }, { x: 7, y: 9 },
            // Columna 8 (antepenúltima)
            { x: 0, y: 8 }, { x: 2, y: 8 }, { x: 3, y: 8 }, { x: 5, y: 8 },
            { x: 6, y: 8 }, { x: 7, y: 8 },
            // Columna 7 (penúltima)
            { x: 1, y: 7 }, { x: 6, y: 7 }
        ];

        const posicionesCaballeriasJ2 = [
            { x: 1, y: 8 }, { x: 4, y: 7 }, // Caballería reemplaza donde estaba comandante
            { x: 0, y: 7 }, { x: 2, y: 7 }, { x: 5, y: 7 }, { x: 7, y: 7 } // Columna 7
        ];

        const posicionComandanteJ2 = { x: 3, y: 9 }; // Columna 7 (más atrás) - reemplaza artillería
        const posicionArtilleria = { x: 4, y: 8 }; // Columna 8 (medio) - reemplaza caballería

        // Generamos las piezas para el equipo "J2" 
        for (let pos of posicionesSoldadosJ2) {
            let soldado = new Soldado(this.tablero, pos.x, pos.y, "J2");
            this.tablero.getCelda(pos.x, pos.y).setContenido(soldado);
            this.piezas.push(soldado);
        }

        for (let pos of posicionesCaballeriasJ2) {
            let caballeria = new Caballeria(this.tablero, pos.x, pos.y, "J2");
            this.tablero.getCelda(pos.x, pos.y).setContenido(caballeria)
            this.piezas.push(caballeria);
        }

        // Crear comandante
        let comandante = new Comandante(this.tablero, posicionComandanteJ2.x, posicionComandanteJ2.y, "J2");
        this.tablero.getCelda(posicionComandanteJ2.x, posicionComandanteJ2.y).setContenido(comandante);
        this.piezas.push(comandante);

        // Crear artilleria
        let artilleria = new Artilleria(this.tablero, posicionArtilleria.x, posicionArtilleria.y, "J2");
        this.tablero.getCelda(posicionArtilleria.x, posicionArtilleria.y).setContenido(artilleria);
        this.piezas.push(artilleria);
    }

    /**
     * Elimina una pieza del equipo.
     * @param {Pieza} p - pieza a eliminar
     */
    eliminarPieza(p) {
        for (let i = 0; i < this.piezas.length; i++) {
            if (this.piezas[i] === p) {
                this.setPiezas(p.getTipo());
                this.piezas.splice(i, 1);  // elimina 1 elemento en la posición i
            }
        }
    }

    /**
     * Settea el tablero del equipo.
     * @param {Tablero} tab - tablero a settear
     */
    setTablero(tab) {
        this.tablero = tab;
    }

    /**
     * Aumenta el contador de piezas del tipo especificado.
     * @param {string} tipo - tipo de pieza ('Soldado', 'Caballeria', 'Artilleria', 'Comandante')
     */
    setPiezas(tipo) {
        if (tipo == 'Soldado') ++this.Soldados;
        if (tipo == 'Caballeria') ++this.Caballeria;
        if (tipo == 'Artilleria') ++this.Artilleria;
        if (tipo == 'Comandante') ++this.Comandante;
    }

    /**
     * Devuelve el nombre del equipo.
     * @returns {string} - nombre del equipo
     */
    getNombre() {
        return this.equipo;
    }

    // GET Y SET - del numero de piezas maximo de cada tipo
    /**
     * Devuelve el número de soldados restantes.
     * @returns {number} - número de soldados restantes
     */
    /**
     * Devuelve el número de soldados restantes disponibles.
     * @returns {number} - número de soldados restantes
     */
    getSoldados() {
        return this.Soldados;
    }
    
    /**
     * Agrega un soldado al equipo y decrementa el contador de soldados disponibles.
     * @param {Soldado} pieza - soldado a agregar al equipo
     */
    setSoldado(pieza) {
        --this.Soldados;
        this.piezas.push(pieza);
    }
    /**
     * Devuelve el número de caballerías restantes disponibles.
     * @returns {number} - número de caballerías restantes
     */
    getCaballeria() {
        return this.Caballeria;
    }
    
    /**
     * Agrega una caballería al equipo y decrementa el contador de caballerías disponibles.
     * @param {Caballeria} pieza - caballería a agregar al equipo
     */
    setCaballeria(pieza) {
        --this.Caballeria;
        this.piezas.push(pieza);
    }
    /**
     * Devuelve el número de piezas de artillería restantes disponibles.
     * @returns {number} - número de artillerías restantes
     */
    getArtilleria() {
        return this.Artilleria;
    }
    
    /**
     * Agrega una artillería al equipo y decrementa el contador de artillerías disponibles.
     * @param {Artilleria} pieza - artillería a agregar al equipo
     */
    setArtilleria(pieza) {
        --this.Artilleria;
        this.piezas.push(pieza);
    }
    /**
     * Devuelve el número de comandantes restantes disponibles.
     * @returns {number} - número de comandantes restantes
     */
    getComandante() {
        return this.Comandante;
    }
    
    /**
     * Agrega un comandante al equipo y decrementa el contador de comandantes disponibles.
     * @param {Comandante} pieza - comandante a agregar al equipo
     */
    setComandante(pieza) {
        --this.Comandante;
        this.piezas.push(pieza);
    }
}

export default Equipo;