package worldoffri;

/**
 * Trieda Hra je hlavna trieda aplikacie "World of FRI".
 * "World of FRI" je velmi jednoducha textova hra - adventura. Hrac sa moze 
 * prechadzat po niektorych priestoroch - miestnostiach fakulty. 
 * To je v tejto verzii vsetko. Hru treba skutocne zancne rozsirit,
 * aby bola zaujimava.
 * 
 * Ak chcete hrat "World of FRI", vytvorte instanciu triedy Hra (hra) 
 * a poslite jej spravu hraj.
 * 
 * Hra vytvori a inicializuje vsetky potebne objekty:
 * vytvori vsetky miestnosti, vytvori parser a zacne hru. Hra tiez vyhodnocuje
 * a vykonava prikazy, ktore vrati parser.
 * 
 * @author  Michael Kolling and David J. Barnes
 * @version 2006.03.30
 */

public class Hra 
{
    private Parser aParser;
    private Miestnost aAktualnaMiestnost;
    private Hrac aHrac;
    
    
    
        
    /**
     * Vytvori hru a inicializuje miestnosti - mapu hry.
     */
    public Hra() 
    {   
        aParser = new Parser();
        aHrac= new Hrac("Ing. Ján Janech, PhD.");
        aAktualnaMiestnost = aHrac.kdeZacinas();
        vytvorMiestnosti();
       
        
        
    }

    private void vypisInfoOMiestnosti() {
        System.out.println("Teraz si v miestnosti " + aAktualnaMiestnost.dajPopis());
        aAktualnaMiestnost.vypisVychody();
    }

    /**
     * Vytvori vsetky miestnosti a pospaja ich vychodmi.
     */
    private void vytvorMiestnosti()
    {
        Mapa.dajInstanciu().nastavVychody(this);
    }
    
    // vrati hraca ktori aktualne hra hru
    public Hrac vratHraca(){
    return aHrac;
    
    }

    /**
     *  Hlavna metoda hry.
     *  Cyklicky opakuje kroky hry, kym hrac hru neukonci.
     */
    public void hraj() 
    {            
        vypisPrivitanie();

        // Vstupny bod hlavneho cyklu.
        // Opakovane nacitava prikazy hraca
        // vykonava ich kym hrac nezada prikaz na ukoncenie hry.
                
        boolean jeKoniec = false;
        while (! jeKoniec) {
            Prikaz prikaz = aParser.dajPrikaz();
            jeKoniec = vykonajPrikaz(prikaz);
        }
        System.out.println("Maj sa fajn!");
    }

    /**
     * Vypise privitanie hraca do terminaloveho okna.
     */
    private void vypisPrivitanie()
    {
        System.out.println();
        System.out.println("Milý "+aHrac.dajMeno());
        System.out.println("Vitaj v hre World of FRI! ");
        System.out.println("World of FRI je nova, neuveritelne nudna adventura.");
        System.out.println("Zadaj prikaz 'pomoc', ak potrebujes poradit.");
        System.out.println();
        vypisInfoOMiestnosti();
    }

    /**
     * Prevezne prikaz a vykona ho.
     * 
     * @param paPrikaz prikaz, ktory ma byt vykonany.
     * @return true ak prikaz ukonci hru, inak vrati false.
     */
    private boolean vykonajPrikaz(Prikaz paPrikaz) 
    {
        boolean jeKoniec = false;

        if(paPrikaz.jeNeznamy()) {
            System.out.println("Nerozumiem, co mas na mysli...");
            return false;
        }

        String nazovPrikazu = paPrikaz.dajNazov();
        if (nazovPrikazu.equals("pomoc")) {
            vypisNapovedu();
        } else if ((aHrac.dajZivot() > 0)&&(nazovPrikazu.equals("chod"))) {
            
            chodDoMiestnosti(paPrikaz);
            aHrac.prechod();
        } else if (nazovPrikazu.equals("ukonci")) {
            jeKoniec = ukonciHru(paPrikaz);
        } else if (nazovPrikazu.equals("zodvihni")) {
            aHrac.vlozDoInventara(aAktualnaMiestnost.zdvihniPredmet(paPrikaz.dajParameter()));
        } else if (nazovPrikazu.equals("poloz")){
            aAktualnaMiestnost.polozPredmet(aHrac.vyberZInventara(paPrikaz.dajParameter()));
        } else if (nazovPrikazu.equals("profil")){
            aHrac.vypisInventar();}

        return jeKoniec;
    }

    // implementacie prikazov:

    /**
     * Vypise text pomocnika do terminaloveho okna.
     * Text obsahuje zoznam moznych prikazov.
     */
    private void vypisNapovedu() 
    {
        System.out.println("Zabludil si. Si sam. Tulas sa po fakulte.");
        System.out.println();
        System.out.println("Mozes pouzit tieto prikazy:");
        System.out.println("   chod ukonci pomoc zodvihni poloz");
    }

    /** 
     * Vykona pokus o prechod do miestnosti urcenej danym smerom.
     * Ak je tym smerom vychod, hrac prejde do novej miestnosti.
     * Inak sa vypise chybova sprava do terminaloveho okna.
     */
    private void chodDoMiestnosti(Prikaz paPrikaz) 
    {
        if(!paPrikaz.maParameter()) {
            // ak prikaz nema parameter - druhe slovo - nevedno kam ist
            System.out.println("Chod kam?");
            return;
        }

        String smer = paPrikaz.dajParameter();

        // Pokus o opustenie aktualnej miestnosti danym vychodom.
        Miestnost novaMiestnost = null;
        novaMiestnost = aAktualnaMiestnost.dajVychod(smer);
        

        if (novaMiestnost == null) {
            System.out.println("Tam nie je vychod!");
        }
        else {
            aAktualnaMiestnost = novaMiestnost;
            vypisInfoOMiestnosti();
        }
    }

    /** 
     * Ukonci hru.
     * Skotroluje cely prikaz a zisti, ci je naozaj koniec hry.
     * Prikaz ukoncenia nema parameter.
     * 
     * @return true, if this command quits the game, false otherwise.
     * @return true, ak prikaz konci hru, inak false.
     */
    private boolean ukonciHru(Prikaz paPrikaz) 
    {
        if(paPrikaz.maParameter()) {
            System.out.println("Ukonci, co?");
            return false;
        } else {
            return true; 
        }
    }
}
