/// <summary>
		/// Costruttore principale
		/// </summary>
		/// <param name="m">Vettore di Ambiente</param>
		/// <param name="cs">Vettore di Button</param>
		public GestoreMappa(Giocatore g, Ambiente[] m, Button[] cs, Azione[] az, ComboBox i, ComboBox f, Button p, ListBox a, ComboBox oggs, ListBox ig, ListBox ar, ListBox ind, Button comb, Button fugg, ComboBox avv)
		{
			if (m != null)
				Mappa = (Ambiente[])m.Clone();
			else
				Mappa = null;
			_pulsantiSpostamento = (Button[])cs.Clone();

			_giocatore = g;
            _interlocutore = i;
            _frase = f;
            _parla = p;
			_invAmbiente = a;
			_invGiocatore = ig;
			_armi = ar;
			_indumenti = ind;
			_oggettiCoinvolti = oggs;
			_profonditàScelta = -1;
			_combatti = comb;
			_fuggi = fugg;
			_avversariCoinvolti = avv;
		}
		/// <summary>
		/// Metodo che permette di caricare una mappa da file
		/// </summary>
		/// <param name="percorsoFile">Percorso del file in cui è presente la mappa</param>
		public void CaricaMappa(string percorsoFile)
		{
			try
			{
				using (StreamReader sr = new StreamReader(percorsoFile))
				{
					//Lettura numero degli ambienti
					int n = int.Parse(sr.ReadLine());
					Mappa = new Ambiente[n];
					int count = 0;						//Variabile per il conteggio dell'ambiente

					//Lettura file completo
					while (sr.Peek() != -1)
					{
						//Creazione ambiente
						Mappa[count] = new Ambiente("", null, null, null, null);
						string[] st = sr.ReadLine().Split(',');

						//Aggiunta della descrizione dell'ambiente
						Mappa[count].Descrizione = st[1].Trim().Replace("\\n", "\n");

						//Controlla se sono presenti cose nell'ambiente
						if (st.Length > 2)
						{
							int nCose = int.Parse(st[2]);
                            Mappa[int.Parse(st[0].Trim())].Azioni = new List<Azione>();
                            for (int i = 0; i < nCose; i++)
							{
								string[] act = sr.ReadLine().Split(':');
                                string nomeCosa = act[0];
                                string effettoCosa = act[1];

                                switch (nomeCosa)
                                {
                                    case "Open":
                                        string indicePartenza = effettoCosa.Split('-')[0];
                                        string indiceArrivo = effettoCosa.Split('-')[1];
                                        Mappa[int.Parse(st[0].Trim())].Azioni.Add(new ApriPassaggio(int.Parse(indicePartenza), int.Parse(indiceArrivo)));
                                        break;
                                    case "Persona":
                                        Dialogo dial = new Dialogo();
                                        string[] infos = effettoCosa.Split(',');
                                        string nome = infos[0];
                                        string descrizione = infos[1];
                                        int vita = int.Parse(infos[2]);
                                        if(infos[3] != "null")
                                        {
                                            try
                                            {
                                                using (StreamReader sr2 = new StreamReader("Dialoghi\\Dialoghi.txt"))
                                                {
													string[] ss = sr2.ReadLine().Split(',');
													string nomeAttuale;
													if (ss.Length > 1)
														nomeAttuale = ss[1].Trim();
													else
														nomeAttuale = "";
													bool arrivato = nomeAttuale == nome;
													while (!arrivato)
													{
														ss = sr2.ReadLine().Split(',');
														if (ss.Length > 1)
															nomeAttuale = ss[1].Trim();
														else
															nomeAttuale = "";
														arrivato = nomeAttuale == nome;
													}
                                                    string[] inf = ss;
                                                    if (infos[3] == inf[0])
                                                    {
                                                        dial.Scelte = new List<Scelta>();
                                                        for (int k = 0; k < int.Parse(inf[2]); k++)
                                                        {
                                                            string[] dialogo = sr2.ReadLine().Split(';');
                                                            List<Tuple<string,int>> scelte = new List<Tuple<string,int>>();
                                                            for(int l = 1; l < dialogo.Length; l++)
                                                                scelte.Add(new Tuple<string,int>(dialogo[l].Split(':')[0], dialogo[l].Split(':').Length > 1 ? int.Parse(dialogo[l].Split(':')[1]) : -1));
                                                            dial.Scelte.Add(new Scelta(dialogo[0], scelte));
                                                        }
                                                    }
                                                }
                                            }
                                            catch (IOException ex)
                                            {
                                                MessageBox.Show("Eccezione in fase di carimento file : " + ex.Message);
                                            }
                                            catch (Exception ex)
                                            {
                                                MessageBox.Show("Eccezione non gestita : " + ex.Message);
                                            }
                                        }
                                        else
                                        {
                                            dial = null;
                                        }
                                        Mappa[int.Parse(st[0].Trim())].Cose.Add(new Persona(nome, descrizione, vita, dial));
                                        break;
                                    case "Oggetto":
										Mappa[int.Parse(st[0].Trim())].Inv.Aggiungi(ReadOggetto(effettoCosa));
                                        break;
									case "Nemico":
										infos = effettoCosa.Split(',');
										nome = infos[0].Trim();
										descrizione = infos[1].Trim();
										vita = int.Parse(infos[2].Trim());
										int difesa = int.Parse(infos[3].Trim());
										int attacco = int.Parse(infos[4].Trim());
										int precisione = int.Parse(infos[5].Trim());
										int livello = int.Parse(infos[6].Trim());
										int dropExp = int.Parse(infos[7].Trim());
										Oggetto[] drops = new Oggetto[int.Parse(infos[8].Trim())];
										int[] dropsP = new int[int.Parse(infos[8].Trim())];
										for (int k = 0; k < int.Parse(infos[8].Trim()); k++)
										{
											string s = sr.ReadLine();
											s = s.Substring(3);
											string[] inf = s.Split(':');
											switch (inf[0])
											{
												case "Oggetto":
													drops[k] = ReadOggetto(inf[1].Split(',')[0].Trim());
													dropsP[k] = int.Parse(inf[1].Split(',')[1].Trim());
													break;
												default:
													break;
											}
										}
										Mappa[int.Parse(st[0].Trim())].Cose.Add(new Nemico(nome, descrizione, vita, difesa, attacco, precisione, livello, dropExp, drops, dropsP));
										break;
                                    default:
                                        throw new NotImplementedException();   
                                }
							}
						}

						//Creazione passaggi
						for (int i = 0; i < 4; i++)
						{
							string s = sr.ReadLine().Trim();
							if (s != "null")
							{
								string[] ss = s.Trim().Split(',');
								Mappa[count].Passaggi[i] = new Passaggio(ss[0], bool.Parse(ss[1]), int.Parse(ss[2]));
							}
							else
								Mappa[count].Passaggi[i] = null;
						}
						count++;
					}
				}
			}
			catch (IOException ex)
			{
				MessageBox.Show("Eccezione in fase di carimento file : " + ex.Message);
			}
			catch (Exception ex)
			{
				MessageBox.Show("Eccezione non gestita : " + ex.Message);
			}
		}