package spiel;

import java.io.Serializable;
import java.util.Vector;

/** Repräsentation eines Spielbretts mit einer bestimmten Aufstellungen 
 *  von Würmern für eine feste Anzahl von Spielern. Wird vom Spiel-Server
 *  an die Spiel-Clients übergeben.
 *
 *  Erklärungen siehe {@link SpielVarianten}.
 *  Änderungen gegenüber 1.0 wie SpielVarianten, zusätzlich wird die Wurmaufstellung
 *  im Konstruktor zur Belegung der Felder benutzt. Für n Spieler wird die Aufstellung
 *  mit Index n-1 genommen.
 *  
 *  @version 1.3
 *  @author ProgPrak-Team
 */
public final class SpielVariante implements Serializable {

    // für Serialisierung
    private static final long serialVersionUID = 13L;

    public String name;
    public String beschreibung;

    public Feld[][] spielbrett;
    public Vector<Vector<Wurm>> aufstellung;
 
    /** Erzeugt eine konkrete Spielvariante aus einer Menge von
     *  möglichen Aufstellungen.
     *  @param spielerzahl die Anzahl der Spieler
     */
    public SpielVariante(SpielVarianten s, int spielerzahl) {
	name = s.name;
	beschreibung = s.beschreibung;
	int maxX = s.spielbrett.length;
	int maxY = s.spielbrett[0].length;
	spielbrett = s.spielbrett;
	aufstellung = s.aufstellungen.get(spielerzahl-1); // Achtung: anders als in 1.0

	// Würmer werden aufgestellt:
	Feld inhalt = Feld.Loch;
	for (Vector<Wurm> wuermerEinesSpieler : aufstellung) {
	    for (Wurm wurm : wuermerEinesSpieler) {
		for (Koordinaten koordinaten : wurm) {
		    if ((inhalt = spielbrett[koordinaten.koordinateX()]
			[koordinaten.koordinateY()]) == Feld.Frei) {
			spielbrett[koordinaten.koordinateX()]
			    [koordinaten.koordinateY()] = Feld.Belegt;
		    } else throw new FeldWarNichtFreiException("Feld mit Koordinaten " +
			   koordinaten.koordinateX() + " und " +
			   koordinaten.koordinateY() + " war mit " + inhalt +
			   " belegt und soll nun durch ein Wurmsegment besetzt werden.");
		}
	    }
	}	
    }

    // zur XMLisierung
    public SpielVariante() {}

    public String getName() {
	return name;
    }
    public void setName(String name) {
	this.name = name;
    }
    public String getBeschreibung() {
	return beschreibung;
    }
    public void setBeschreibung(String beschreibung) {
	this.beschreibung = beschreibung;
    }
    public Feld[][] getSpielbrett() {
	return spielbrett;
    }
    public void setSpielbrett(Feld[][] spielbrett) {
	this.spielbrett = spielbrett;
    }
    public Vector<Vector<Wurm>> getAufstellung() {
	return aufstellung;
    }
    public void setAufstellung(Vector<Vector<Wurm>> aufstellung) {
	this.aufstellung = aufstellung;
    }
}

