/* Glowna czasc modulu Interfejs - zawiera deklaracje klasy Interfejs,
   ktorej obiekty sa odpowiedzialne za przebieg i wyglad zewnetrzny gry
   autor      :        Anna Doros         
                                                            GRUPA 5
*/


#ifndef __INTERFEJS_H
#define __INTERFEJS_H

#include <qwidget.h>
#include <qtimer.h>
#include <qimage.h>
#include <qlist.h>
#include <qaccel.h>


#include "ElementySwiata.h"
#include "StatystykaGry.h"
#include "StatystykaEtapu.h"
#include "Informacje.h"
#include "WejscieWyjscie.h"
#include "parametry.h"
#include "Guzik.h"
#include "OknoGry.h"
#include "stale_Interfejs.h"
#include "ObrazPlanszy.h"
#include "sciezki.h"

class Interfejs: public QWidget {
    Q_OBJECT
protected:
    ObrazPlanszy * obraz_planszy;
    Plansza * plansza;
    WejscieWyjscie * wejscie_wyjscie;
    
    QTimer * timer;              /* do sterowania gra */
    QTimer * timer_czas;         /* do odmierzania czasu */
    QTimer * timer_wypusc;       /* do wypuszczania lemingow */
    
    QAccel * skrot;              /* skrot klawiszowy do zdjecia */
    
    int ile_wypuscic;            /* ile lemingow nalezy wypuscic z wejscia */
    int ile_na_planszy;          /* ile lemingow znajduje sie na planszy */
    int czy_pauza;               /* opisuje stan pauzy ( aktywna lub nie ) */
    int czy_zaglada;             /* czy etap jeszcze trwa (nie jest konczony) */
    int odstep;                  /* jaki jest odstep miedzy wychodzacymi 
                                    z wejscia lemingami - aby zachowac 
				    jednolity odstep mimo uzywania pauzy */
    int odstep_czas;             /* aby zachowac prawidlowe odmierzanie czasu 
                                    mimo uzywania pauzy */
    int nowy_element;            /* typ nowego elementu */
    int parametry_wczytane;      /* czy wczytane parametry kolejnego etapu */
    Param_etap parametry_etapu;  /* parametry aktualnego etapu */
    StatystykaEtapu * stat_etap; /* statystyka etapu */
    StatystykaGry * stat_gra;    /* statystyka gry */
    
    OknoGry * okno_gry;          /* okno gry = guziki + pasek informacyjny */
    Guzik * guziki[ILE_GUZIKOW]; /* guziki innych okien */
    char * sloty[ILE_DODATKOW];  /* tablica sloty(do dodawania lemingow specjalnych) */
    
    QList<ElementSwiata> lista_elem; /* lista elementow swiata */

    int czas;   /* czas trwania etapu */
    int do_przeprowadzenia; /* liczba lemingow do przeprowadzenia */
    int dodatkowi[ILE_DODATKOW]; /* liczba dodatkowych komandosow, bomb */


public:
    Interfejs(QWidget *parent=0,const char *name=0);
    ~Interfejs();
    
public slots:    
    
    void nowyBloker(Para,int);
    void nowaBomba(Para,int);
    void nowyKopaczDolny(Para,int);
    void nowyKopaczPoziomy(Para,int);
    void nowyKopaczPionowy(Para,int);
    void nowyKopaczGorny(Para,int);
    void nowySchodkarzGorny(Para,int);
    void nowySchodkarzDolny(Para,int);
    void nowySchodkarzPoziomy(Para,int);
    void nowyPijus(Para,int);

    void dodajBlokera();
    void dodajBombe();
    void dodajKopaczaDolnego();
    void dodajKopaczaPoziomego();
    void dodajKopaczaPionowego();
    void dodajKopaczaGornego();
    void dodajSchodkarzaGornego();
    void dodajSchodkarzaDolnego();
    void dodajSchodkarzaPoziomego();
    void dodajPijusa();

    void obsluzGre();
    void wypuscLeminga();
    void pauza();
    void aktualizujCzas();
    void jakiOdstep();

    void mouseMoveEvent(QMouseEvent* m){ emit jestMysz(); };
    
    void nowaGra();
    void gramyOdPoczatku();
    void kolejnyEtap();
    void przygotuj();
    
    void pokazZasadyGry();
    void pokazInformacje();
    
    void zaglada();
    void zakonczenie();
    
protected:
    void pokazOknoPoczatkowe();
    void pokazOknoWejsciaDoEtapu();
    void pokazOknoWyjsciaZEtapu();
    void rozpocznijKolejnyEtap();
    void dodaj(int);
    void podsumujEtap();
    void zakonczEtap();
    
signals:
/* do przesylania informacji do obrazu planszy o nowym elemencie: */
    void nowy(Wejscie*);
    void nowy(Wyjscie*);
    void nowy(Leming*);
    void nowy(Bloker*);
    void nowy(Bomba*);
    void nowy(SchodkarzGorny*);
    void nowy(SchodkarzPoziomy*);
    void nowy(SchodkarzDolny*);
    void nowy(KopaczSkosnyWGore*);
    void nowy(KopaczPoziomy*);
    void nowy(KopaczPionowy*);
    void nowy(KopaczSkosnyWDol*);
    void nowy(Pijus*);
    void usun(ElementSwiata*);

    void kursor(typ_rodzaj);

/* do przesylania informacji do obrazu planszy o polozeniu myszy: */
    void jestMysz();

/* aktywowanie odswiezania obrazu planszy: */
    void rusz();
    void ruszPauza();
    };    

#endif