public Nemico(string n, string d, int s, int dif, int a, int p, int l, int de, Oggetto[] di, int[] dip)
			: base(n, d, s, dif, a, p, l)
		{
			DropExp = de;
			DropItems = (Oggetto[])di.Clone();
			DropItemsPercentage = dip;
		}
 public string Lascia(Oggetto obj, Inventario inv)
 {
     Oggetti.Remove(obj);
     inv.Aggiungi(obj);
     return "Hai lasciato " + obj.Nome + "\n";
 }
		public string Prendi(Oggetto obj, Inventario inv)
		{
			inv.Elimina(obj);
			Oggetti.Add(obj);
			return "Hai preso " + obj.Nome + "\n";
		}
 public string Aggiungi(Oggetto obj)
 {
     Oggetti.Add(obj);
     return "Hai aggiunto " + obj.Nome + "\n";
 }
 public string Elimina(Oggetto obj)
 {
     Oggetti.Remove(obj);
     return "Hai eliminato " + obj.Nome + "\n";
 }
        public string Equipaggia(Oggetto obj)
        {
			string s = "";
			if (obj is Arma)
			{
				Arma a = (Arma)obj;
				s = _giocatore.EquipaggiaArma(a);
				CaricaArmi();
				CaricaInventarioGiocatore();
			}
			else if(obj is Indumento)
			{
				Indumento i = (Indumento)obj;
				s = _giocatore.EquipaggiaIndumento(i);
				CaricaIndumenti();
				CaricaInventarioGiocatore();
			}
			else
			{
				if (obj != null)
					return "Oggetto selezionato non equipaggiabile!\n";
				else
					return "Nessun oggetto selezionato!\n";
			}
			return s;
        }
		public string EliminaOggetto(Oggetto obj)
		{
			if (_invGiocatore.SelectedIndex != -1)
			{
				string s = _giocatore.Inv.Elimina(obj);
				CaricaInventarioGiocatore();
				CaricaInventarioAmbiente();
				return s;
			}
			else
				return "Nessun oggetto selezionato!\n";
		}
		public string LasciaOggetto(Oggetto obj)
		{
			if (_invGiocatore.SelectedIndex != -1)
			{
				string s = _giocatore.Inv.Lascia(obj, Mappa[IndiceStanza].Inv);
				CaricaInventarioGiocatore();
				CaricaInventarioAmbiente();
				return s;
			}
			else
				return "Nessun oggetto selezionato!\n";
		}
		public string PrendiOggetto(Oggetto obj)
		{
			if (_oggettiCoinvolti.SelectedIndex != -1)
			{
				string s = _giocatore.Inv.Prendi(obj, Mappa[IndiceStanza].Inv);
				CaricaInventarioGiocatore();
				CaricaInventarioAmbiente();
				return s;
			}
			else
				return "Nessun oggetto selezionato!\n";
		}
		/// <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);
			}
		}