#ifndef Spiel_H
#define Spiel_H

#include "SpielKlasse.h"
#include <Datei.h>
#include "STS.h"
#include "Spieler.h"
#include "Karte.h"
#include "SpielObjekt.h"
#include <Welt2D.h>

class Statistik;
class StatistikV;

class Spiel : public SpielKlasse
{
private:
	Statistik *stat;
	RCArray< Team > *teams;
	int teamAnzahl;
	Array< int > *zAccounts;
	RCArray< SSKlientV > *zKlients;
	RCArray< Spieler > *spieler;
	RCArray< Laser > *shots;
	RCArray< SpielObjekt > *objekte;
    Welt2D *welt;
	SSDatenbankV *psqldb;
	int spielId;
	int karteId;
	int spielerAnzahl;
	Karte *karte;
	CRITICAL_SECTION cs;
	SpielerTeamStruktur *sts;
	Datei *log;
    Text mapPfad;
	bool isRunning;
	int spielZeit;
	bool ende;
	int nextSchussId;
	int ref;
	// privat
	int getTeamVonSpieler( int sNum );

public:
	// Konstruktor
	Spiel();
	// Destruktor
	~Spiel();
	// nicht constant
	virtual void setPSQLK( SSDatenbankV *psqldb ); // call 1
	virtual void setSpielId( int id ); // call 2
	virtual void setKarteId( int karteId ); // call 3
    virtual void setTempPfad( char *pfad ); // call 3.5
	virtual void setAccounts( int anzahl, Array< int > *zAccounts ); // call 4
	virtual void setKlients( int anzahl, RCArray< SSKlientV > *zKlients ); // call 5
	virtual void setSpielerNummern( int anzahl, Array< int > *spielerNummern ); // call 6
	virtual void klientOffline( int accountId );
	virtual void klientOnline( int accountId, SSKlientV *zKlient );
	virtual void nachricht( int accountId, int len, char *bytes );
	void tick( double zeit );
	virtual void run(); // call 7
	// constant
	virtual StatistikV *getStatistik() const;
	// Reference Counting 
	virtual SpielKlasse *getThis();
	virtual SpielKlasse *release();
};

#endif