Sotilas.java

package datastructureproject.luokat.nappulat;

import chess.model.Side;
import datastructureproject.luokat.Pelilauta;
import datastructureproject.luokat.tietorakenteet.*;

public class Sotilas extends Nappula {
    public Sotilas(Side puoli, Ruutu ruutu) {
        super('p', puoli, ruutu);
    }

    public Nappula kopioi() {
        return new Sotilas(getPuoli(), getRuutu().kopioi());
    }

    @Override
    public Lista<Siirto> generoiSiirrot(Pelilauta lauta) {
        Lista<Siirto> siirrot = new Lista<>();

        //Liiku yksi eteen
        Ruutu yksiEteen = new Ruutu(getX(), getEteenpainY(1));
        if (yksiEteen.olenLaudalla(lauta) && lauta.getNappula(yksiEteen) == null) {
            boolean ylennys = yksiEteen.getY() == (getPuoli() == Side.WHITE ? lauta.getKoko() - 1 : 0);
            if (ylennys) {
                //Lisätään listaan kuningattareksi sekä ratsuksi ylennys, 
                //torni ja lähetti olisivat turhia kuningattareen verrattuna.
                siirrot.add(new Siirto(getX(), getY(), yksiEteen.getX(), yksiEteen.getY(), 'q'));
                siirrot.add(new Siirto(getX(), getY(), yksiEteen.getX(), yksiEteen.getY(), 'n'));
            } else {
                siirrot.add(new Siirto(getX(), getY(), yksiEteen.getX(), yksiEteen.getY()));
            }

            //Liiku kaksi eteen (yksiEteen pitää olla myös validi kohta liikkua)
            Ruutu kaksiEteen = new Ruutu(getX(), getEteenpainY(2));
            if (kaksiEteen.olenLaudalla(lauta) && lauta.getNappula(kaksiEteen) == null 
                    && getY() == (getPuoli() == Side.WHITE ? 1 : lauta.getKoko() - 2)) {
                siirrot.add(new Siirto(getX(), getY(), kaksiEteen.getX(), kaksiEteen.getY()));
            }
        }

        //Syö viistoon
        int[] viistot = new int[] {1, -1};
        for (int x: viistot) {
            Ruutu vRuutu = new Ruutu(getX() + x, getEteenpainY(1));
            if (!vRuutu.olenLaudalla(lauta)) {
                continue;
            }
            Nappula vNappula = lauta.lauta[vRuutu.getY()][vRuutu.getX()];
            if (vNappula != null && vNappula.getPuoli() != this.getPuoli()) {

                boolean ylennys = vRuutu.getY() == (getPuoli() == Side.WHITE ? lauta.getKoko() - 1 : 0);
                if (ylennys) {
                    //Lisätään listaan kuningattareksi sekä ratsuksi ylennys, 
                    //torni ja lähetti olisivat turhia kuningattareen verrattuna.
                    siirrot.add(new Siirto(getRuutu().kopioi(), vRuutu.kopioi(), 'q'));
                    siirrot.add(new Siirto(getRuutu().kopioi(), vRuutu.kopioi(), 'n'));
                } else {
                    siirrot.add(new Siirto(getRuutu().kopioi(), vRuutu.kopioi()));
                }
            }
        }

        return siirrot;
    }

    @Override
    public String toString() {
        return "p";
    }

}