#ifndef Spieler_H
#define Spieler_H

#include <Bild.h>
#include <Model2D.h>
#include "Strukturen.h"

class Team;
class Laser;
class Karte;
class Klient;
class SSKlientV;

using namespace Framework;

enum TastaturStatus
{
	T_GAS,
	T_ROT_L,
	T_ROT_R,
	T_FEUER,
	T_MAX
};

class Spieler : public Model2DObject
{
private:
    // antrieb
    Vertex stL;
    Vertex kL;
    Vertex stR;
    Vertex kR;
    Vertex stM;
    Vertex kM;
    WeltInfo wInfo;

	int accountId;
	int sNum;
	int farbe;
	Team *team;
	Klient *klient;
	bool tastatur[ T_MAX ];
	bool amLeben;
	double schussAbk;
    double energieAbk;
	double repAbk;
	double reinkAbk;
	int maxReinkAbk;
	// Raumschiff Eigenschaftend
	Vertex startPos;
	double beschleunigung;
	double energie;
	double stability;
	double reparatur;
	double laserIntensity;
	double laserEffizienz;
	double akkuLeistung;
	double maxEnergie;
	double maxStability;
	double laserTempo;
	double netzwerk;
	double wendigkeit;
    double antriebEffizienz;
    double energieSchild;
    double energieSchildEffizienz;
	int skillPunkte;
	// Statistik Werte
	double schadenBekommen;
	double schadenGemacht;
	double treibstoffVerbraucht;
	int shots;
	int treffer;
	int punkte;
	int kills;
	int tode;
	double zeitAmLeben;
	double zeitTod;
    float ep;
    float nextSkillEp;
    bool needWiederbelebung;

public:
	// Konstruktor
	Spieler( SpielerStr *zStr );
	// Destruktor
	~Spieler();
	// nicht constant
	void offline();
	void online( SSKlientV *zKlient );
	void setModelData( Model2DData *data );
	void setAccountId( int id );
	void setTeam( Team *team );
	void setSpielerFarbe( int farbe );
	void setKlient( Klient *klient );
	bool setTastataturStatus( TastaturStatus ts, bool aktiv );
	bool tick( const WeltInfo &info, double zeit ) override;
	bool setSkill( int art );
	Laser *getLaser( int sId );
	bool nimmSchaden( double &intensity );
	void machSchaden( double intensity, bool kill );
    void addTreffer( float intensity );
    void wiederbeleben();
    void addEp( float ep );
	// constant
	int getAccountId() const;
	bool istOnline() const;
	Klient *zKlient() const;
	bool istTreffer( Vec2< float > pos ) const;
	// Raumschiff Eigenschaften
	double getTeamMaxEnergieBonus() const;
	double getTeamMaxStabilityBonus() const;
	double getTeamReparaturBonus() const;
	double getTeamLaserIntensityBonus() const;
	double getTeamLaserEffizienzBonus() const;
	double getTeamAkkuLeistungBonus() const;
	double getTeamLaserTempoBonus() const;
	double getTeamBeschleunigungBonus() const;
	double getTeamWendigkeitBonus() const;
    double getTeamAntriebEffizienzBonus() const;
    double getTeamEnergieSchildBonus() const;
    double getTeamEnergieSchildEffizienzBonus() const;
	bool istAmLeben() const;
	// Statistik Werte
	int getSpielerNummer() const;
	Team *zTeam() const;
	int getSpielerFarbe() const;
	int getSchadenBekommen() const;
	int getSchadenGemacht() const;
	int getTreibstoffVerbraucht() const;
	int getShots() const;
	int getTreffer() const;
	int getPunkte() const;
	int getKills() const;
	int getTode() const;
	int getZeitAmLeben() const;
	int getZeitTod() const;
    bool doNeedWiederbelebung() const;
	// Reference Counting
	Spieler *getThis();
	Spieler *release();
};

#endif