/* MODUL PLANSZA - zawiera deklaracje klasy plansza */
/* Klasa Plansza jest odpowiedzialna za przechowywanie informacji na temat
swiata gry. Do niej odwoluja sie inne obiekty aby dowiedziec sie
co w danym polu planszy znajduje sie.
.
Autor: Michal Wiktor Zmijewski (grupa nr 5)
*/
#ifndef __PLANSZA_H
#define __PLANSZA_H
#include <stl.h>
#include "typy.h"
#include "stale_ElementySwiata.h"
#include "parametry.h"
#ifdef TYP_TEREN_INT
#define MNOZNIK_TLA 256 /* przesuniecia w bita dla zapisu tla terenu */
#endif
/* definicje struktur pomocniczych i typow */
typedef struct daneORodzaju
{
int licznik; // okresla ile jest elementow rodzaju rodzaj
};//daneORodzaju
enum _typ_stan { _pobor,_nic,_aktualizacja };
class InfoZmian
{
public:
Para wsp; // wspolrzedne pola ktore uleglo zmianie
int zmiana_tla; // 1 jesli byla zmiana tla terenu, 0 wpp.
InfoZmian():wsp(),zmiana_tla(0){};
InfoZmian(Para w):wsp(w),zmiana_tla(0){};
InfoZmian(Para w,int z):wsp(w),zmiana_tla(z){};
~InfoZmian(){};
};//InfoZmian
class PoleZmian
{
public:
InfoZmian zmiana; // informacje o polu ktore uleglo zmianie(wspolrzedne pola,czy byla zmiana tla)
_typ_stan stan; // okresla w jakim celu bylo ogladane pole
PoleZmian():zmiana(),stan(_nic){}
PoleZmian(Para x):zmiana(x),stan(_nic){};
PoleZmian(Para x,int z):zmiana(x,z),stan(_nic){};
PoleZmian(InfoZmian x):zmiana(x),stan(_nic){};
PoleZmian(InfoZmian x,_typ_stan y):zmiana(x),stan(y){};
~PoleZmian(){};
};//PoleZmian
/* definicje typow */
typedef map<typ_rodzaj,daneORodzaju> typ_sl_rodzajow;
typedef list<InfoZmian> typ_lista_zmian;
typedef list<PoleZmian> typ_lista_polZmian;
class PolePlanszy {
public:
#ifndef TYP_TEREN_INT
typ_teren tlo; // informacja o rodzaju tla terenu
#endif
typ_teren teren; // informacja o rodzaju terenu
typ_sl_rodzajow sl_rodzajow; // slownik informacji o el. roznych rodz.
};//PolePlanszy
/* ***************************** */
class Plansza {
protected:
Para wejscie; // wspolrzedne wejscia
Para wyjscie; // wspolrzedne wyjscia
Para rozmiar; // rozmiar planszy - swiata
PolePlanszy **swiatAktualny; // plansza z ktorej pobiera sie informacje
// o aktualnym swiecie gry
typ_teren **swiatNowy; // plansza na ktore nanoszone sa zmiany terenu
int robic_zmiany; // gdy jest rowna 1 bedzie dokonywana aktualizacja
// planszy dopiero po odbiorze impulsu wpp. na bierzaco
typ_lista_polZmian lista_zmian; // lista z informacja o zmienionych polach
typ_lista_polZmian::iterator iter_zmian; // iterator naniesionych zmian
public:
// konstruktor i destruktor
Plansza(const Param_plansza&,int zmiana=1,typ_teren tlo=0);
~Plansza();
class PozaPlansza{}; // wyjatek odwolania sie poza obszar planszy
class Brak_pamieci{}; // wyjatek braku pamieci
typ_teren jakiTeren(const Para x);
void ustawTeren(const Para x,const typ_teren z);
typ_teren jakieTlo(const Para x);
void ustawTlo(const Para x,const typ_teren z);
int ileJestElementowRodzaju(const Para x,const typ_rodzaj z);
void wstawElementRodzaju(const Para x,const typ_rodzaj z);
int usunElementRodzaju(const Para x,const typ_rodzaj z);
Para wspolrzedneWejscia() { return wejscie; }
Para wspolrzedneWyjscia() { return wyjscie; }
void wspolrzedneWejscia(Para x) { wejscie=x; }
void wspolrzedneWyjscia(Para x) { wyjscie=x; }
Para rozmiarPlanszy() { return rozmiar; }
int listaZmian(typ_lista_zmian &l);
int czyAktualizacjaCykliczna() { return (robic_zmiany==1); }
int odbierzImpuls();
private:
int zla_alokacja;
inline int czyDobreWspolrzedne(const Para wsp) // sprawdza poprawnosc wsp
{ return !((wsp.x<0)||(wsp.x>=rozmiar.x)||(wsp.y<0)||(wsp.y>=rozmiar.y)); };
};//Plansza
#endif /* __PLANSZA_H */