Torna alla pagina Introduttiva del codice

Luogo


 
//______________________________________________________________________________
// Classe Luogo     (Contenitore di oggetti)
 
#include "dichiarazioni.h"
 
int luogo::luogocod = 0;
 
// *** Costruttore della classe Luogo ***
 
luogo::luogo(string n, string sopran, string d, bool i, bool st, string sugg){
     nome=n; sopranome=sopran;
     descrizione=d; stato=st;
     idluogo=luogocod++;
     illuminazione=i;
     est=NULL;   ostr_est="";
     sud=NULL;   ostr_sud="";
     nord=NULL;  ostr_nord="";
     alto=NULL;  ostr_alto="";
     basso=NULL; ostr_basso="";
     ovest=NULL; ostr_ovest="";
     suggest=sugg;
}
 
// *** Ridefinizione dell'operatore += della classe Luogo ***
 
luogo& luogo::operator+=(oggetto &ogg){
     string desc = ogg.nome();
     pair<string,oggetto*> a(desc,&ogg);
     oggetti.insert(a);
     return *this;
}
 
// *** Distruttore della classe Luogo ***
 
luogo::~luogo(){
    for(map<string,oggetto*>::iterator i=oggetti.begin(); i!=oggetti.end(); i++)
       delete(i->second);
}
 
// *** Salva della classe Luogo ***
 
int luogo::salva(fstream& uscita){
    uscita<<"[Luogo]\nNOMELUOGO="<<nome<<"\nSOPRANOME="<<sopranome;
    uscita<<"\nILLUMINAZIONE="; if(illuminazione) uscita<<"trUE"; else uscita<<"FALSE";
    uscita<<"\nSTATO="; if(stato) uscita<<"trUE"; else uscita<<"FALSE";
    uscita<<"\n[Descrizione]\n"<<descrizione<<"[EndDescrizione]";
    uscita<<"\n[Suggerimento]\n"<<suggest;
    uscita<<"[EndSuggerimento]\n[EndLuogo]\n";
    uscita<<"\n[OggInLuogo]\nNOMELUOGO="<<nome<<'\n';
    for (map<string,oggetto*>::iterator i=oggetti.begin(); i!=oggetti.end(); i++)
        (i->second)->salva(uscita);
    uscita<<"[EndOggInLuogo]\n\n";
    return 0;
}
 
// *** Salvapuntatori della classe Luogo ***
 
int luogo::salvap(fstream& uscita){
    uscita<<"\n[PuntatoriALuogo]\n";
    uscita<<"NOMELUOGO="<<nome<<"\nNORD=";
    if (nord!=NULL) uscita<<nord->name(); else uscita<<"NULL";
    uscita<<"\nSUD=";
    if (sud!=NULL) uscita<<sud->name(); else uscita<<"NULL";
    uscita<<"\nEST=";
    if (est!=NULL) uscita<<est->name(); else uscita<<"NULL";
    uscita<<"\nOVEST=";
    if (ovest!=NULL) uscita<<ovest->name(); else uscita<<"NULL";
    uscita<<"\nALTO=";
    if (alto!=NULL) uscita<<alto->name(); else uscita<<"NULL";
    uscita<<"\nBASSO=";
    if (basso!=NULL) uscita<<basso->name(); else uscita<<"NULL";
    uscita<<"\nOStrUZIONENORD="<<ostr_nord;
    uscita<<"\nOStrUZIONESUD="<<ostr_sud;
    uscita<<"\nOStrUZIONEEST="<<ostr_est;
    uscita<<"\nOStrUZIONEOVEST="<<ostr_ovest;
    uscita<<"\nOStrUZIONEALTO="<<ostr_alto;
    uscita<<"\nOStrUZIONEBASSO="<<ostr_basso;
    uscita<<"\n[EndPuntatoriALuogo]\n";
    return 0;
}
 
// *** Lascia della classe Luogo ***
 
luogo* luogo::lascia(luogo* &utente, string& ogg, oggcont& zaino){
     string tipo = "zaino";
     oggetto * p = zaino.estrai(ogg,tipo);
     if (p!=NULL){
        *utente+=(*p);
         cout<<"\n - Hai lasciato "<<ogg<<" nel luogo\n";
     }
     return utente;
}
 
// *** Prendi della classe Luogo ***
 
luogo& luogo::prendi(string& ogg, oggcont& zaino){
     if(oggetti.begin()==oggetti.end()) cout<<"\n ! ERRORE: Non vi sono oggetti in questo luogo\n";
     else{
        bool trovato = false;
        for(map<string,oggetto*>::iterator i=oggetti.begin(); i!=oggetti.end(); i++)
          if (i->first==ogg){
             trovato = true;
             string domanda;
             cout<<"\n - Vuoi prendere l'oggetto "<<ogg<<" presente nel luogo si/no\n";
             cout<<"\nRisposta => ";
             getline(cin,domanda);
             if (domanda=="si"){
                if ((i->second)->prendi()){
                   if ((i->second)->lux()){
                      cout<<"\n - Hai spento l'oggetto "<<i->first<<".\n";
                      (i->second)->spegni();
                   }
                   zaino+=(*(i->second));
                   cout<<"\n - Hai messo l'oggetto "<<ogg<<" nello zaino.\n";
                   if ((i->second)->sugg()){cout<<'\n'<<(i->second)->prntsugg()<<'\n'; (i->second)->deletesugg();}
                   oggetti.erase(i);
                   return *this;
                }else cout<<"\n - Questo oggetto "<<ogg<<" non pu"<<o<<" essere preso: troppo pesante da
                trasportare.\n";
            }
            if ((i->second)->contenitore()){
               string tipo = i->first;
               oggetto* obj = (i->second)->estrai(ogg,tipo);
               if (obj!=NULL){
                  zaino+=*obj;
                  return *this;
               }
            }
          }  
          else if ((i->second)->contenitore()){
               string tipo = i->first;
               oggetto* obj = (i->second)->estrai(ogg,tipo);
               if (obj!=NULL){
                  zaino+=*obj; 
                  return *this;
               }
         }
        if(!trovato) cout<<"\n - Oggetto "<<ogg<<" non trovato.\n";
     }
     return *this;
}
 
// *** Apri della classe Luogo ***
 
luogo* luogo::apri(luogo* &utente, oggcont& zaino, string& ogg1, string& ogg2){
     if (oggetti.begin()!=oggetti.end()){
        map<string,oggetto*>::iterator i = oggetti.find(ogg1);
        if (i!=oggetti.end()){
           if (ogg2!="")
              if (zaino.search(ogg2)) (i->second)->apri(utente, ogg2);
              else cout<<"\n ! ERRORE: L'oggetto "<<ogg2<<" non "<<e<<" presente nello zaino.\n";
           else (i->second)->apri(utente, ogg2);
        }
        else cout<<"\n ! ERRORE: L'oggetto "<<ogg1<<" non "<<e<<" presente nel luogo\n";
     }
     else cout<<"\n ! ERRORE: Non ci sono oggetti in questo luogo.\n";
     return utente;
}
 
// *** Accendi della classe Luogo ***
 
void luogo::accendi(oggcont& zaino, string& ogg1, string& ogg2){
     if (oggetti.begin()!=oggetti.end()){
        map<string,oggetto*>::iterator i = oggetti.find(ogg1);
        if (i!=oggetti.end()){
           if (ogg2=="") (i->second)->accendi(ogg2);
           else{
               if (zaino.search(ogg2)) (i->second)->accendi(ogg2);
               else cout<<"\n ! ERRORE: L'oggetto "<<ogg2<<" non "<<e<<" presente nello zaino.\n";
           }
        }
        else if (zaino.search(ogg1)) cout<<"\n - Forse "<<e<<" opportuno che lasci l'oggetto "<<ogg1<<" nel
        luogo prima!\n";
        else cout<<"\n ! ERRORE: L'oggetto "<<ogg1<<" non "<<e<<" n"<<e<<" nel luogo n"<<e<<" nel tuo
        zaino!\n";
     }
     else cout<<"\n ! ERRORE: Non ci sono oggetti in questo luogo.\n";
}
 
// *** Usa della classe Luogo ***
 
luogo* luogo::usa(luogo* &utente, oggcont& zaino, string& ogg1, string& ogg2){
     if (oggetti.begin()!=oggetti.end()){
        map<string,oggetto*>::iterator i = oggetti.find(ogg2);
        if (i!=oggetti.end()){
           if (zaino.search(ogg1)) (i->second)->usa(utente,ogg1);
           else cout<<"\n ! ERRORE: L'oggetto "<<ogg1<<" non "<<e<<" presente nello zaino.\n";
        }
        else cout<<"\n ! ERRORE: L'oggetto "<<ogg2<<" non "<<e<<" presente nel luogo\n";
     }
     else cout<<"\n ! ERRORE: Non ci sono oggetti in questo luogo.\n";
     return utente;
}
 
// *** Ricerca della classe Luogo ***
 
void luogo::ricerca(string nomeobj, unsigned int &trovato){
   for (map<string,oggetto*>::iterator i=oggetti.begin(); i!=oggetti.end(); i++)
       if (nomeobj==(i->second)->nome()) trovato++;
}
 
// *** Sposta della classe Luogo ***
 
luogo* luogo::sposta(luogo* &utente, string& ogg1, string& ogg2){
    if (oggetti.begin()!=oggetti.end()){
        map<string,oggetto*>::iterator i = oggetti.find(ogg1);
        if (i!=oggetti.end()) (i->second)->sposta(utente, ogg2);
        else cout<<"\n ! ERRORE: L'oggetto "<<ogg1<<" che si vuole spostare non "<<e<<" presente nel
        luogo\n";
    }
    else cout<<"\n ! ERRORE: Non ci sono oggetti in questo luogo.\n";
    return utente;  
}
 
// *** Guarda della classe Luogo (anche guarda oggetto) ***
 
void luogo::guarda(string ogg){
    bool lucis = false;
    if ((!illuminazione) && (oggetti.begin()!=oggetti.end()))
       for (map<string,oggetto*>::iterator k = oggetti.begin(); k!=oggetti.end(); k++)
           if ((k->second)->lux()) lucis = true;
    if (ogg==""){
       cout<<"\n* "<<sopranome<<"\n";
       if(suggest!=""){cout<<'\n'<<suggest; suggest="";}
    }           
    if (illuminazione || lucis){
      if (ogg==""){
         if (!stato) stato=true;
         if (oggetti.begin()!=oggetti.end()){
             cout<<"\n  Questa "<<e<<" la lista degli oggetti presenti in questo luogo.\n";
            for (map<string,oggetto*>::iterator i = oggetti.begin(); i!=oggetti.end(); i++)
                cout<<"  - "<<(i->second)->nome()<<'\n';
         }else cout<<"\n - Non ci sono oggetti in questo luogo.";
         cout<<"\n"<<descrizione;
      }
      else{
         map<string,oggetto*>::iterator i = oggetti.find(ogg);
         if (i!=oggetti.end()) (i->second)->guarda();
         else cout<<"\n ! ERRORE: L'oggetto "<<ogg<<" non "<<e<<" presente nel luogo.\n";
      }  
   }else cout<<"\n - Spiacente: il luogo non "<<e<<" illuminato.\n";
}
 
// *** Vai della classe Luogo ***
 
luogo* luogo::vai(luogo* &utente, string& s){
    if (s == "nord"){
       if (nord == NULL) cout<<"\n - Verso Nord non vi "<<e<<" alcun luogo\n";
       else if (ostr_nord!="") cout<<"\n - "<<ostr_nord<<'\n';
       else{
           utente = nord;
           if (!utente->stato) utente->guarda("");
           else utente->prnt_des();   
       }
    }
    else if (s == "sud"){
       if (sud == NULL) cout<<"\n - Verso Sud non vi "<<e<<" alcun luogo\n";
       else if (ostr_sud!="") cout<<"\n - "<<ostr_sud<<'\n';
       else{
           utente = sud;
           if (!utente->stato) utente->guarda("");
           else utente->prnt_des();           
       }
    }
    else if (s == "est"){
       if (est == NULL) cout<<"\n - Verso Est non vi "<<e<<" alcun luogo\n";
       else if (ostr_est!="") cout<<"\n - "<<ostr_est<<'\n';
       else{
           utente = est;
           if (!utente->stato) utente->guarda("");
           else utente->prnt_des();
       }
    }
    else if (s=="ovest"){
       if (ovest==NULL) cout<<"\n - Verso Ovest non vi "<<e<<" alcun luogo\n";
       else if (ostr_ovest!="") cout<<"\n - "<<ostr_ovest<<'\n';
       else{
           utente = ovest;
           if (!utente->stato) utente->guarda("");
           else utente->prnt_des();
       }
    }
    else if (s=="basso"){
       if (basso==NULL) cout<<"\n - Verso gi"<<u<<" non vi "<<e<<" alcun luogo.\n";
       else if (ostr_basso!="") cout<<"\n - "<<ostr_basso<<'\n';
       else{
           utente = basso;
           if (!utente->stato) utente->guarda("");
           else utente->prnt_des();
       }
    }
    else if (s=="alto"){
       if (alto==NULL) cout<<"\n - Verso su non vi "<<e<<" alcun luogo.\n";
       else if (ostr_alto!="") cout<<"\n - "<<ostr_alto<<'\n';
       else{
           utente = alto;
           if (!utente->stato) utente->guarda("");
           else utente->prnt_des();
       }
    }
    else cout<<"\n ! ERRORE: Direzione non riconosciuta\n";
    return utente; 
}
 
// *** Delostr della classe Luogo ***
 
void luogo::delostr(string& direzione){
     if (direzione=="nord") ostr_nord="";
     else if (direzione=="sud") ostr_sud="";
     else if (direzione=="est") ostr_est="";
     else if (direzione=="ovest") ostr_ovest="";
     else if (direzione=="alto") ostr_alto="";
     else if (direzione=="basso") ostr_basso="";
     else cout<<"\n ! ERRORE: direzione (dell'ostruzione) non riconosciuta: "<<direzione<<".\n";
};
 
// *** Prnt_des della classe Luogo ***
 
void luogo::prnt_des(){
     bool lucis = false;
     if ((!illuminazione) && (oggetti.begin()!=oggetti.end()))
        for (map<string,oggetto*>::iterator k = oggetti.begin(); k!=oggetti.end(); k++)
            if ((k->second)->lux()) lucis = true;
     cout<<"\n* "<<sopranome;
     if ((!illuminazione) && (!lucis)) cout<<"\n - Questo luogo non "<<e<<" illuminato.";
     cout<<"\n\n"<<descrizione;
}
 
// *** Ridefinizione dell'operatore >> della classe Luogo ***
 
fstream& operator>>(fstream& s, luogo* &a){
    string linea, nome, sopranome, suggerimento, descrizione;
    bool stato = false;
    bool illuminazione = true;
    getline(s,linea);
    while (linea!="[EndLuogo]" && !s.eof()){
          string right, left;
          bool cerca = research(linea,right,left);
          if (cerca){
             if (left!="" && right!=""){
                if (left=="NOMELUOGO") nome=right;
                else if (left=="SOPRANOME") sopranome=right;
                else if (left=="ILLUMINAZIONE"){maiuscolizza(right); if(right=="FALSE") illuminazione=false;}
                else if (left=="STATO"){maiuscolizza(right); if(right=="trUE") stato=true;}
                else cout<<"\n ! ERRORE: comando left "<<left<<" non riconosciuto.\n";
             }
          }
          else if(linea=="[Descrizione]"){
               getline(s,linea);
               while(linea!="[EndDescrizione]" && !s.eof()){
                  descrizione+=linea+'\n';
                  getline(s,linea);
               }
          }
          else if(linea=="[Suggerimento]"){
               getline(s,linea);
               while(linea!="[EndSuggerimento]" && !s.eof()){
                  suggerimento+=linea+'\n';
                  getline(s,linea);
               }
          }
          else{
             cout<<"\n ! ERRORE: Comando "<<linea<<" non riconosciuto (luogo).\n";
             system("pause");
             exit(1);
         }
         getline(s,linea);
    }
    if (nome!="") a = new luogo(nome,sopranome,descrizione,illuminazione,stato,suggerimento);
    else cout<<" ! ERRORE: Non "<<e<<" stoto trovato il nome del luogo.\n - Il luogo non "<<e<<" stato creato.";
    return s;
}