#include "Team.h"

// Inhalt der Team Klasse aus Team.h
// Konstruktor
Team::Team( int f, char *n, TeamStr *zStr )
{
	id = zStr->id;
	farbe = f;
	name = n;
	spieler = new RCArray< Spieler >();
	punkte = zStr->punkte;
	maxPunkte = zStr->maxPunkte;
	maxEnergieS = zStr->maxEnergie;
	maxStabilityS = zStr->maxStability;
	reparaturS = zStr->reparatur;
	laserIntensityS = zStr->laserIntensity;
	laserEffizienzS = zStr->laserEffizienz;
	akkuLeistungS = zStr->akkuLeistung;
	laserTempoS = zStr->laserTempo;
	beschleunigungS = zStr->beschleunigung;
	wendigkeitS = zStr->wendigkeit;
    antriebEffizienzS = zStr->antriebEffizienz;
    energieSchildS = zStr->energieSchild;
    energieSchildEffizienzS = zStr->energieSchildEffizienz;
	reset();
	ref = 1;
}

// Destruktor
Team::~Team()
{
	spieler->release();
}

// nicht constant
void Team::reset()
{
	spieler->leeren();
	maxEnergie = maxEnergieS;
	maxStability = maxStabilityS;
	reparatur = reparaturS;
	laserIntensity = laserIntensityS;
	laserEffizienz = laserEffizienzS;
	akkuLeistung = akkuLeistungS;
	laserTempo = laserTempoS;
	beschleunigung = beschleunigungS;
	wendigkeit = wendigkeitS;
    antriebEffizienz = antriebEffizienzS;
    energieSchild = energieSchildS;
    energieSchildEffizienz = energieSchildEffizienzS;
}

// constant
double Team::getMaxEnergieBonus() const
{
	double ret = maxEnergieS;
	for( auto i = spieler->getIterator(); i; i++ )
		ret += i->getTeamMaxEnergieBonus();
	return ret;
}

double Team::getMaxStabilityBonus() const
{
	double ret = maxStabilityS;
    for( auto i = spieler->getIterator(); i; i++ )
		ret += i->getTeamMaxStabilityBonus();
	return ret;
}

double Team::getReperaturBonus() const
{
	double ret = reparaturS;
    for( auto i = spieler->getIterator(); i; i++ )
		ret += i->getTeamReparaturBonus();
	return ret;
}

double Team::getLaserIntensityBonus() const
{
	double ret = laserIntensityS;
    for( auto i = spieler->getIterator(); i; i++ )
		ret += i->getTeamLaserIntensityBonus();
	return ret;
}

double Team::getLaserEffizienzBonus() const
{
	double ret = laserEffizienzS;
    for( auto i = spieler->getIterator(); i; i++ )
		ret += i->getTeamLaserEffizienzBonus();
	return ret;
}

double Team::getAkkuLeistungBonus() const
{
	double ret = akkuLeistungS;
    for( auto i = spieler->getIterator(); i; i++ )
		ret += i->getTeamAkkuLeistungBonus();
	return ret;
}

double Team::getLaserTempoBonus() const
{
	double ret = laserTempoS;
    for( auto i = spieler->getIterator(); i; i++ )
		ret += i->getTeamLaserTempoBonus();
	return ret;
}

double Team::getBeschleunigungBonus() const
{
	double ret = beschleunigungS;
    for( auto i = spieler->getIterator(); i; i++ )
		ret += i->getTeamBeschleunigungBonus();
	return ret;
}

double Team::getWendigkeitBonus() const
{
	double ret = wendigkeitS;
    for( auto i = spieler->getIterator(); i; i++ )
		ret += i->getTeamWendigkeitBonus();
	return ret;
}

double Team::getAntriebEffizienzBonus() const
{
    double ret = antriebEffizienzS;
    for( auto i = spieler->getIterator(); i; i++ )
        ret += i->getTeamAntriebEffizienzBonus();
    return ret;
}

double Team::getEnergieSchildBonus() const
{
    double ret = energieSchildS;
    for( auto i = spieler->getIterator(); i; i++ )
        ret += i->getTeamEnergieSchildBonus();
    return ret;
}

double Team::getEnergieSchildEffizienzBonus() const
{
    double ret = energieSchildEffizienzS;
    for( auto i = spieler->getIterator(); i; i++ )
        ret += i->getTeamEnergieSchildEffizienzBonus();
    return ret;
}

// Reference Counting
Team *Team::getThis()
{
	ref++;
	return this;
}

Team *Team::release()
{
	ref--;
	if( !ref )
		delete this;
	return 0;
}