package ingsw.proj.cluedo.logica;
import ingsw.proj.cluedo.componenti.ArmiEnum;
import ingsw.proj.cluedo.componenti.Carta;
import ingsw.proj.cluedo.componenti.CartaArma;
import ingsw.proj.cluedo.componenti.CartaSospetto;
import ingsw.proj.cluedo.componenti.CartaStanza;
import ingsw.proj.cluedo.componenti.Casella;
import ingsw.proj.cluedo.componenti.CasellaPassaggioSegreto;
import ingsw.proj.cluedo.componenti.CasellaPorta;
import ingsw.proj.cluedo.componenti.Giocatore;
import ingsw.proj.cluedo.componenti.HaDestinazione;
import ingsw.proj.cluedo.componenti.Pedina;
import ingsw.proj.cluedo.componenti.Soluzione;
import ingsw.proj.cluedo.componenti.Stanza;
import ingsw.proj.cluedo.componenti.StanzeEnum;
import ingsw.proj.cluedo.componenti.Tabellone;
import java.awt.Point;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Random;
class InitGioco {
private List<CartaArma> carteArmi;
private List<CartaSospetto> carteSospetti;
private List<CartaStanza> carteStanza;
private Casella[][] caselle;
private List<Giocatore> giocatori;
private HashMap<Integer, ArrayList<Carta>> mazzi;
private List<String> nomiGiocatori;
private int numGioc;
private List<Pedina> pedineArmi;
private Soluzione soluzione;
private List<Stanza> stanze;
public InitGioco(String[] nomiGiocatori) throws NullPointerException {
if (nomiGiocatori != null) {
stanze = new ArrayList<Stanza>();
this.nomiGiocatori = new ArrayList<String>();
for (String string : nomiGiocatori) {
this.nomiGiocatori.add(string);
}
generaCarteArmi();
generaCarteStanze();
generaCarteSospetti(this.nomiGiocatori);
numGioc = this.nomiGiocatori.size();
generaTabellone();
creaSoluzione();
daiCarte();
generaPedineArmi();
generaGiocatori();
} else
throw new NullPointerException("Nessun riferimento ai nomi giocatori passato.");
}
private void creaSoluzione() {
int arma_delitto = (new Random()).nextInt(carteArmi.size());
CartaArma arma = carteArmi.get(arma_delitto);
carteArmi.remove(arma_delitto);
int stanza_delitto = (new Random()).nextInt(carteStanza.size());
CartaStanza stanza = carteStanza.get(stanza_delitto);
carteStanza.remove(stanza_delitto);
int colpevole = (new Random()).nextInt(carteSospetti.size());
CartaSospetto sospetto = carteSospetti.get(colpevole);
carteSospetti.remove(colpevole);
soluzione = new Soluzione(arma, sospetto, stanza);
}
private void daiCarte() {
mazzi = new HashMap<Integer, ArrayList<Carta>>();
ArrayList<Carta> mazzoGlobale = new ArrayList<Carta>();
int rand = 0;
int i = 0;
mazzoGlobale.addAll(carteArmi);
mazzoGlobale.addAll(carteStanza);
mazzoGlobale.addAll(carteSospetti);
while (mazzoGlobale.size() > 0) {
for (i = 0; i < numGioc; i++) {
if (mazzoGlobale.size() > 0) {
rand = (new Random()).nextInt(mazzoGlobale.size());
if (mazzi.get(i) == null)
mazzi.put(i, new ArrayList<Carta>());
mazzi.get(i).add(mazzoGlobale.get(rand));
mazzoGlobale.remove(rand);
}
}
}
}
private void generaCarteArmi() {
carteArmi = new ArrayList<CartaArma>();
for (int i = 0; i < ArmiEnum.values().length; i++) {
carteArmi.add(new CartaArma(ArmiEnum.values()[i]));
}
}
private void generaCarteSospetti(List<String> nomiGiocatori) {
carteSospetti = new ArrayList<CartaSospetto>();
for (String string : nomiGiocatori) {
carteSospetti.add(new CartaSospetto(string));
}
}
private void generaCarteStanze() {
carteStanza = new ArrayList<CartaStanza>();
for (int i = 0; i < StanzeEnum.values().length; i++) {
carteStanza.add(new CartaStanza(StanzeEnum.values()[i]));
}
}
private void generaGiocatori() {
giocatori = new ArrayList<Giocatore>();
ArrayList<Stanza> copia = new ArrayList<Stanza>();
for (int i = 0; i < stanze.size(); i++)
if (stanze.get(i).getNome() != StanzeEnum.CORRIDOIO)
copia.add(stanze.get(i));
Collections.shuffle(copia);
for (int i = 0; i < numGioc; i++) {
String nome = nomiGiocatori.get(i);
Casella posizione = copia.get(i).getCasellaVuotaRandom();
giocatori.add(new Giocatore(nome, posizione, mazzi.get(i)));
giocatori.get(i).cambiaPosizione(posizione);
}
}
private void generaPedineArmi() {
pedineArmi = new ArrayList<Pedina>();
ArrayList<Stanza> copia = new ArrayList<Stanza>();
for (int i = 0; i < stanze.size(); i++)
if (stanze.get(i).getNome() != StanzeEnum.CORRIDOIO)
copia.add(stanze.get(i));
Collections.shuffle(copia);
for (int i = 0; i < ArmiEnum.values().length; i++) {
Casella posizione = copia.get(i).getCasellaVuotaRandom();
pedineArmi.add(new Pedina(posizione, ArmiEnum.values()[i].toString()));
pedineArmi.get(i).cambiaPosizione(posizione);
}
}
private void generaStanza(int xMin, int xMax, int yMin, int yMax, StanzeEnum nomeStanza) {
ArrayList<Casella> tempStanza = new ArrayList<Casella>();
for (int i = yMin; i <= yMax; i++)
for (int j = xMin; j <= xMax; j++) {
if (!(caselle[i][j] instanceof HaDestinazione))
caselle[i][j] = new Casella(nomeStanza, new Point(j, i));
tempStanza.add(caselle[i][j]);
}
stanze.add(new Stanza(nomeStanza, tempStanza));
}
private void generaTabellone() {
caselle = new Casella[24][24];
// Le Stanze
for (int i = 0; i < caselle.length; i++)
for (int j = 0; j < caselle[0].length; j++) {
caselle[i][j] = new Casella(StanzeEnum.CORRIDOIO, new Point(j, i));
}
// Le Porte
caselle[2][4] = new CasellaPorta(StanzeEnum.CAMERA_LETTO, new Point(4, 2), new Point(5,2));
caselle[2][5] = new CasellaPorta(StanzeEnum.CORRIDOIO, new Point(5, 2), new Point(4,2));
caselle[5][9] = new CasellaPorta(StanzeEnum.SALA_GIOCHI, new Point(9, 5), new Point(9,6));
caselle[6][9] = new CasellaPorta(StanzeEnum.CORRIDOIO, new Point(9, 6), new Point(9,5));
caselle[6][15] = new CasellaPorta(StanzeEnum.BIBLIOTECA, new Point(15, 6), new Point(15,7));
caselle[7][15] = new CasellaPorta(StanzeEnum.CORRIDOIO, new Point(15, 7), new Point(15,6));
caselle[3][20] = new CasellaPorta(StanzeEnum.STUDIO, new Point(20, 3), new Point(19,3));
caselle[3][19] = new CasellaPorta(StanzeEnum.CORRIDOIO, new Point(19, 3), new Point(20,3));
caselle[12][6] = new CasellaPorta(StanzeEnum.SALA, new Point(6, 12), new Point(7,12));
caselle[12][7] = new CasellaPorta(StanzeEnum.CORRIDOIO, new Point(7, 12), new Point(6,12));
caselle[11][17] = new CasellaPorta(StanzeEnum.INGRESSO, new Point(17, 11), new Point(16,11));
caselle[11][16] = new CasellaPorta(StanzeEnum.CORRIDOIO, new Point(16, 11), new Point(17,11));
caselle[19][5] = new CasellaPorta(StanzeEnum.CUCINA, new Point(5, 19), new Point(6,19));
caselle[19][6] = new CasellaPorta(StanzeEnum.CORRIDOIO, new Point(6, 19), new Point(5,19));
caselle[16][11] = new CasellaPorta(StanzeEnum.BAGNO, new Point(11, 16), new Point(11,15));
caselle[15][11] = new CasellaPorta(StanzeEnum.CORRIDOIO, new Point(11, 15), new Point(11,16));
caselle[20][19] = new CasellaPorta(StanzeEnum.CANTINA, new Point(19, 20), new Point(18,20));
caselle[20][18] = new CasellaPorta(StanzeEnum.CORRIDOIO, new Point(18, 20), new Point(19,20));
// I Passaggi Segreti
// TODO AGGIUNGERE I PASSAGGI SEGRETI
caselle[0][0] = new CasellaPassaggioSegreto(StanzeEnum.CAMERA_LETTO, new Point(0, 0), new Point(23, 23));
caselle[23][23] = new CasellaPassaggioSegreto(StanzeEnum.CANTINA, new Point(23, 23), new Point(0, 0));
caselle[0][23] = new CasellaPassaggioSegreto(StanzeEnum.STUDIO, new Point(23, 0), new Point(0, 23));
caselle[23][0] = new CasellaPassaggioSegreto(StanzeEnum.CUCINA, new Point(0, 23), new Point(23, 0));
generaStanza(0, 4, 0, 5, StanzeEnum.CAMERA_LETTO);
generaStanza(7, 11, 0, 5, StanzeEnum.SALA_GIOCHI);
generaStanza(13, 17, 0, 6, StanzeEnum.BIBLIOTECA);
generaStanza(20, 23, 0, 6, StanzeEnum.STUDIO);
generaStanza(0, 6, 8, 15, StanzeEnum.SALA);
generaStanza(17, 23, 9, 14, StanzeEnum.INGRESSO);
generaStanza(0, 5, 18, 23, StanzeEnum.CUCINA);
generaStanza(8, 14, 16, 23, StanzeEnum.BAGNO);
generaStanza(19, 23, 17, 23, StanzeEnum.CANTINA);
}
public ControlloreDiGioco getControllore() {
return new ControlloreDiGioco(giocatori, soluzione, new Tabellone(caselle, stanze), pedineArmi);
}
}